diff --git a/code/__DEFINES/voreconstants.dm b/code/__DEFINES/voreconstants.dm
index d165be2d09..bb5d808bf9 100644
--- a/code/__DEFINES/voreconstants.dm
+++ b/code/__DEFINES/voreconstants.dm
@@ -144,6 +144,7 @@ GLOBAL_LIST_INIT(pred_release_sounds, list(
"Fart 5" = 'modular_splurt/sound/voice/farts/fart5.ogg',
"Fart 6" = 'modular_splurt/sound/voice/farts/fart6.ogg',
"Fart 7" = 'modular_splurt/sound/voice/farts/fart7.ogg',
+ "Fart 8" = 'modular_splurt/sound/voice/farts/fart8.ogg',
"Burp 1" = 'modular_splurt/sound/voice/burps/belch1.ogg',
"Burp 2" = 'modular_splurt/sound/voice/burps/belch2.ogg',
"Burp 3" = 'modular_splurt/sound/voice/burps/belch3.ogg',
@@ -180,6 +181,7 @@ GLOBAL_LIST_INIT(prey_release_sounds, list(
"Fart 5" = 'modular_splurt/sound/voice/farts/fart5.ogg',
"Fart 6" = 'modular_splurt/sound/voice/farts/fart6.ogg',
"Fart 7" = 'modular_splurt/sound/voice/farts/fart7.ogg',
+ "Fart 8" = 'modular_splurt/sound/voice/farts/fart8.ogg',
"Burp 1" = 'modular_splurt/sound/voice/burps/belch1.ogg',
"Burp 2" = 'modular_splurt/sound/voice/burps/belch2.ogg',
"Burp 3" = 'modular_splurt/sound/voice/burps/belch3.ogg',
diff --git a/modular_splurt/code/_globalvars/lists/global_lewd.dm b/modular_splurt/code/_globalvars/lists/global_lewd.dm
index f142875a6a..fa72484032 100644
--- a/modular_splurt/code/_globalvars/lists/global_lewd.dm
+++ b/modular_splurt/code/_globalvars/lists/global_lewd.dm
@@ -6,5 +6,6 @@ GLOBAL_LIST_INIT(brap_noises, list(
'modular_splurt/sound/voice/farts/fart4.ogg',
'modular_splurt/sound/voice/farts/fart5.ogg',
'modular_splurt/sound/voice/farts/fart6.ogg',
- 'modular_splurt/sound/voice/farts/fart7.ogg'
+ 'modular_splurt/sound/voice/farts/fart7.ogg',
+ 'modular_splurt/sound/voice/farts/fart8.ogg'
))
diff --git a/modular_splurt/code/datums/interactions/lewd/_lewd.dm b/modular_splurt/code/datums/interactions/lewd/_lewd.dm
index ee37590ff6..09408e42cb 100644
--- a/modular_splurt/code/datums/interactions/lewd/_lewd.dm
+++ b/modular_splurt/code/datums/interactions/lewd/_lewd.dm
@@ -1,3 +1,65 @@
+/mob/living/proc/do_breastsmother(mob/living/target)
+ var/message
+ var/u_His = p_their()
+ var/titties = list("breasts", "boobs", "milkers", "milktanks", "boobers", "titties", "tits", "tatas", "mammaries")
+ var/list/lines = list(
+ "squishes [target]'s face [pick(list("in between", "with"))] [u_His] [pick(titties)]",
+ "presses [u_His] [pick(titties)] into \the [target]'s face",
+ "shoves \the [target]'s whole head into [u_His] cleavage"
+ )
+
+ message = "\The [src] [pick(lines)]"
+ visible_message(message, ignored_mobs = get_unconsenting())
+ playlewdinteractionsound(loc, pick('modular_sand/sound/interactions/bang1.ogg',
+ 'modular_sand/sound/interactions/bang2.ogg',
+ 'modular_sand/sound/interactions/bang3.ogg'), 70, 1, -1)
+
+/mob/living/proc/lick_sweat(mob/living/target)
+ var/message
+ var/t_His = target.p_their()
+ var/list/lines = list("licks \the [target]'s sweat off [t_His] body",
+ "slurps the salty sweat running through [target]'s skin",
+ "has a nice taste of \the [target]'s drenched body",
+ "takes a whiff of \the [target]'s musk and drinks [t_His] warm sweat")
+
+ message = "\The [src] [pick(lines)]"
+ visible_message(message, ignored_mobs = get_unconsenting())
+ playlewdinteractionsound(loc, 'modular_sand/sound/interactions/champ_fingering.ogg', 50, 1, -1)
+
+/mob/living/proc/smother_armpit(mob/living/target)
+ var/message
+ var/u_His = p_their()
+ var/list/musk = list("musky ", "sweaty ", "damp ", "smelly ", "")
+ var/list/lines = list(
+ "shoves \the [target]'s face in [u_His] [pick(musk)] armpit",
+ "squeezes \the [target]'s nose under [u_His] [pick(musk)] pit",
+ "makes sure to squeeze \the [target]'s face well under [u_His] [pick(musk)] armpit and let them take a whiff"
+ )
+
+ message = "\The [src] [pick(lines)]"
+ visible_message(message, ignored_mobs = get_unconsenting())
+ playlewdinteractionsound(loc, pick(
+ 'modular_sand/sound/interactions/squelch1.ogg',
+ 'modular_sand/sound/interactions/squelch2.ogg',
+ 'modular_sand/sound/interactions/squelch3.ogg'), 50, 1, -1)
+
+/mob/living/proc/lick_armpit(mob/living/target)
+ var/message
+ var/u_His = p_their()
+ var/list/musk = list("musky ", "sweaty ", "damp ", "smelly ", "")
+ var/list/lines = list(
+ "shoves [u_His] nose deep into \the [target]'s armpit, giving it a big [pick(list("whiff", "lick", "nuzzle"))].",
+ "presses [u_His] face under \the [target]'s [pick(musk)] pit, [pick(list("tasting and lapping it all over", "sniffing its scent"))]",
+ "goes face deep into \the [target] [pick(musk)] armpit, worshipping it with [u_His] tongue and nose"
+ )
+
+ message = "\The [src] [pick(lines)]"
+ visible_message(message, ignored_mobs = get_unconsenting())
+ playlewdinteractionsound(loc, pick(
+ 'modular_sand/sound/interactions/squelch1.ogg',
+ 'modular_sand/sound/interactions/squelch2.ogg',
+ 'modular_sand/sound/interactions/squelch3.ogg'), 50, 1, -1)
+
////////////////////////////////////////////////////////////////////////////////////////////////////////
///////// U N H O L Y /////////
////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -180,6 +242,43 @@
message = "\The [src] [pick(hell)]"
visible_message(message, ignored_mobs = get_unconsenting(unholy = TRUE))
- playlewdinteractionsound(loc, pick(GLOB.brap_noises), 50, 1, -1)
+ playlewdinteractionsound(loc, pick(GLOB.brap_noises), 70, 1, -1)
+ playlewdinteractionsound(loc, pick('modular_sand/sound/interactions/bang1.ogg',
+ 'modular_sand/sound/interactions/bang2.ogg',
+ 'modular_sand/sound/interactions/bang3.ogg',
+ 'modular_sand/sound/interactions/bang4.ogg',
+ 'modular_sand/sound/interactions/bang5.ogg',
+ 'modular_sand/sound/interactions/bang6.ogg'), 70, 1, -1)
handle_post_sex(NORMAL_LUST, CUM_TARGET_ANUS, target)
target.handle_post_sex(NORMAL_LUST, null, src)
+
+/mob/living/proc/piss_over(mob/living/target)
+ var/message
+ var/u_His = p_their()
+ var/list/hell = list(
+ "relieves [u_His] bladder all over \the [target][pick(list("", "'s body"))]",
+ "starts coating all of \the [target]'s body in warm piss",
+ "lets out a moan of relief as yellow rain starts pouring over \the [target]"
+ )
+
+ message = "\The [src] [pick(hell)]"
+ visible_message(message, ignored_mobs = get_unconsenting(unholy = TRUE))
+ if(get_lust() < 10)
+ add_lust(10)
+
+/mob/living/carbon/proc/piss_mouth(mob/living/target)
+ var/message
+ var/pee_pee = (has_penis(REQUIRE_EXPOSED) ? getorganslot(ORGAN_SLOT_PENIS) : (has_vagina(REQUIRE_EXPOSED) ? getorganslot(ORGAN_SLOT_VAGINA) : null))
+ var/u_His = p_their()
+ var/t_Him = target.p_them()
+ var/list/hell = list(
+ "relieves [u_His] bladder inside \the [target]'s mouth [pick(list("filling it with [pick(list("warm", "salty"))] yellow goodness", "making [t_Him] taste all of that piss"))]",
+ "coats the back of \the [target]'s throat with [u_His] golden treat",
+ "lets out a moan of relief as yellow rain starts pouring in between \the [target]'s lips"
+ )
+
+ message = "\The [src] [pick(hell)]"
+ visible_message(message, ignored_mobs = get_unconsenting(unholy = TRUE))
+ if(!is_fucking(target, CUM_TARGET_MOUTH))
+ set_is_fucking(target, CUM_TARGET_MOUTH, pee_pee)
+ handle_post_sex(NORMAL_LUST, CUM_TARGET_MOUTH, target)
diff --git a/modular_splurt/code/datums/interactions/lewd/lewd_datums.dm b/modular_splurt/code/datums/interactions/lewd/lewd_datums.dm
index 446dac5169..e5ebf29687 100644
--- a/modular_splurt/code/datums/interactions/lewd/lewd_datums.dm
+++ b/modular_splurt/code/datums/interactions/lewd/lewd_datums.dm
@@ -1,4 +1,3 @@
-/* TODO: Finish these tomorrow
/datum/interaction/lewd/do_breastsmother
command = "do_breastsmother"
description = "Smother them in your breasts"
@@ -8,6 +7,9 @@
write_log_target = "got breast smothered by"
write_log_user = null
+/datum/interaction/lewd/do_breastsmother/display_interaction(mob/living/user, mob/living/target)
+ user.do_breastsmother(target)
+
/datum/interaction/lewd/lick_sweat
command = "lick_sweat"
description = "Lick their sweat"
@@ -17,14 +19,19 @@
write_log_target = "got their sweat licked by"
write_log_user = "licked sweat"
+/datum/interaction/lewd/lick_sweat/display_interaction(mob/living/user, mob/living/target)
+ user.lick_sweat(target)
+
/datum/interaction/lewd/smother_armpit
command = "smother_armpit"
description = "Press your armpit against their face"
- require_target_mouth = TRUE
max_distance = 1
interaction_sound = null
write_log_target = "Got armpit smothered by"
- wtrite_log_user = "Smothered someone in their armpit"
+ write_log_user = "Smothered someone in their armpit"
+
+/datum/interaction/lewd/smother_armpit/display_interaction(mob/living/user, mob/living/target)
+ user.smother_armpit(target)
/datum/interaction/lewd/lick_armpit
command = "lick_armpit"
@@ -32,9 +39,11 @@
require_user_mouth = TRUE
max_distance = 1
interaction_sound = null
- write_log_target = "Got their armpit licked by"
+ write_log_target = "Got dem armpit ate by"
write_log_user = "ate some armpit"
-*/
+
+/datum/interaction/lewd/lick_armpit/display_interaction(mob/living/user, mob/living/target)
+ user.lick_armpit(target)
////////////////////////////////////////////////////////////////////////////////////////////////////////
///////// U N H O L Y /////////
@@ -115,3 +124,30 @@
/datum/interaction/lewd/unholy/do_shitfuck/display_interaction(mob/living/user, mob/living/target)
user.do_shitfuck(target)
+
+/datum/interaction/lewd/unholy/piss_over
+ command = "piss_over"
+ description = "Piss all over them"
+ require_user_bottomless = TRUE
+ max_distance = 1
+ interaction_sound = null
+ write_log_target = "got pissed all over by"
+
+/datum/interaction/lewd/unholy/piss_over/display_interaction(mob/living/user, mob/living/target)
+ user.piss_over(target)
+
+/datum/interaction/lewd/unholy/piss_mouth
+ command = "piss_mouth"
+ description = "Piss inside their mouth"
+ max_distance = 1
+ interaction_sound = null
+ require_user_bottomless = TRUE
+ require_target_mouth = TRUE
+ write_log_user = "pissed in someone's mouth"
+ write_log_target = "got their mouth filled with piss by"
+
+/datum/interaction/lewd/unholy/piss_mouth/display_interaction(mob/living/carbon/user, mob/living/target)
+ if(!istype(user))
+ to_chat(user, "Erm, you may wanna be a carbon entity fo dat")
+ return
+ user.piss_mouth(target)
diff --git a/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/tails.dm b/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/tails.dm
index 009be3d670..568a1add91 100644
--- a/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/tails.dm
+++ b/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/tails.dm
@@ -1,4 +1,134 @@
//Hyper tails
+
+//Mam tails
+/datum/sprite_accessory/tails/mam_tails/deer
+ name = "Deer"
+ icon_state = "deer"
+ color_src = MATRIXED
+ icon = 'modular_splurt/icons/mob/mam_tails.dmi'
+ matrixed_sections = MATRIX_RED
+
+/datum/sprite_accessory/tails_animated/mam_tails_animated/deer
+ name = "Deer"
+ icon_state = "deer"
+ color_src = MATRIXED
+ icon = 'modular_splurt/icons/mob/mam_tails.dmi'
+ matrixed_sections = MATRIX_RED
+
+/datum/sprite_accessory/tails/mam_tails/spade
+ name = "Demon spade"
+ icon_state = "spade"
+ color_src = MATRIXED
+ icon = 'modular_splurt/icons/mob/mam_tails.dmi'
+ matrixed_sections = MATRIX_RED
+
+/datum/sprite_accessory/tails_animated/mam_tails_animated/spade
+ name = "Demon spade"
+ icon_state = "spade"
+ color_src = MATRIXED
+ icon = 'modular_splurt/icons/mob/mam_tails.dmi'
+ matrixed_sections = MATRIX_RED
+
+/datum/sprite_accessory/tails/mam_tails/tailmaw
+ name = "Tailmaw"
+ icon_state = "tailmaw"
+ color_src = MATRIXED
+ icon = 'modular_splurt/icons/mob/mam_tails.dmi'
+ matrixed_sections = MATRIX_RED
+
+/datum/sprite_accessory/tails_animated/mam_tails_animated/tailmaw
+ name = "Tailmaw"
+ icon_state = "tailmaw"
+ color_src = MATRIXED
+ icon = 'modular_splurt/icons/mob/mam_tails.dmi'
+ matrixed_sections = MATRIX_RED
+
+/datum/sprite_accessory/tails/mam_tails/snaketail
+ name = "Snake tail"
+ icon_state = "snaketail"
+ color_src = MATRIXED
+ icon = 'modular_splurt/icons/mob/mam_tails.dmi'
+ matrixed_sections = MATRIX_RED
+
+/datum/sprite_accessory/tails_animated/mam_tails_animated/snaketail
+ name = "Snake tail"
+ icon_state = "snaketail"
+ color_src = MATRIXED
+ icon = 'modular_splurt/icons/mob/mam_tails.dmi'
+ matrixed_sections = MATRIX_RED
+
+/datum/sprite_accessory/tails/mam_tails/chemlight
+ name = "Chemlight"
+ icon_state = "chemlight"
+ color_src = MATRIXED
+ icon = 'modular_splurt/icons/mob/mam_tails.dmi'
+ matrixed_sections = MATRIX_ALL
+
+/datum/sprite_accessory/tails_animated/mam_tails_animated/chemlight
+ name = "Chemlight"
+ icon_state = "chemlight"
+ color_src = MATRIXED
+ icon = 'modular_splurt/icons/mob/mam_tails.dmi'
+ matrixed_sections = MATRIX_ALL
+
+/datum/sprite_accessory/tails/mam_tails/gecko
+ name = "Gecko"
+ icon_state = "gecko"
+ color_src = MATRIXED
+ icon = 'modular_splurt/icons/mob/mam_tails.dmi'
+ matrixed_sections = MATRIX_ALL
+
+/datum/sprite_accessory/tails_animated/mam_tails_animated/gecko
+ name = "Gecko"
+ icon_state = "gecko"
+ color_src = MATRIXED
+ icon = 'modular_splurt/icons/mob/mam_tails.dmi'
+ matrixed_sections = MATRIX_ALL
+
+//Lizard tails
+/datum/sprite_accessory/tails/lizard/tailmaw
+ name = "Tailmaw"
+ icon_state = "tailmaw"
+ color_src = MATRIXED
+ icon = 'modular_splurt/icons/mob/mam_tails.dmi'
+ matrixed_sections = MATRIX_RED
+
+/datum/sprite_accessory/tails_animated/lizard/tailmaw
+ name = "Tailmaw"
+ icon_state = "tailmaw"
+ color_src = MATRIXED
+ icon = 'modular_splurt/icons/mob/mam_tails.dmi'
+ matrixed_sections = MATRIX_RED
+
+/datum/sprite_accessory/tails/lizard/snaketail
+ name = "Snake tail"
+ icon_state = "snaketail"
+ color_src = MATRIXED
+ icon = 'modular_splurt/icons/mob/mam_tails.dmi'
+ matrixed_sections = MATRIX_RED
+
+/datum/sprite_accessory/tails_animated/lizard/snaketail
+ name = "Snake tail"
+ icon_state = "snaketail"
+ color_src = MATRIXED
+ icon = 'modular_splurt/icons/mob/mam_tails.dmi'
+ matrixed_sections = MATRIX_RED
+
+/datum/sprite_accessory/tails/lizard/gecko
+ name = "Gecko"
+ icon_state = "gecko"
+ color_src = MATRIXED
+ icon = 'modular_splurt/icons/mob/mam_tails.dmi'
+ matrixed_sections = MATRIX_ALL
+
+/datum/sprite_accessory/tails_animated/lizard/gecko
+ name = "Gecko"
+ icon_state = "gecko"
+ color_src = MATRIXED
+ icon = 'modular_splurt/icons/mob/mam_tails.dmi'
+ matrixed_sections = MATRIX_ALL
+
+//Human tails
/datum/sprite_accessory/tails/human/deer
name = "Deer"
icon_state = "deer"
@@ -13,16 +143,30 @@
icon = 'modular_splurt/icons/mob/mam_tails.dmi'
matrixed_sections = MATRIX_RED
-/datum/sprite_accessory/tails/mam_tails/deer
- name = "Deer"
- icon_state = "deer"
+/datum/sprite_accessory/tails/human/tailmaw
+ name = "Tailmaw"
+ icon_state = "tailmaw"
color_src = MATRIXED
icon = 'modular_splurt/icons/mob/mam_tails.dmi'
matrixed_sections = MATRIX_RED
-/datum/sprite_accessory/tails_animated/mam_tails_animated/deer
- name = "Deer"
- icon_state = "deer"
+/datum/sprite_accessory/tails_animated/human/tailmaw
+ name = "Tailmaw"
+ icon_state = "tailmaw"
+ color_src = MATRIXED
+ icon = 'modular_splurt/icons/mob/mam_tails.dmi'
+ matrixed_sections = MATRIX_RED
+
+/datum/sprite_accessory/tails/human/snaketail
+ name = "Snake tail"
+ icon_state = "snaketail"
+ color_src = MATRIXED
+ icon = 'modular_splurt/icons/mob/mam_tails.dmi'
+ matrixed_sections = MATRIX_RED
+
+/datum/sprite_accessory/tails_animated/human/snaketail
+ name = "Snake tail"
+ icon_state = "snaketail"
color_src = MATRIXED
icon = 'modular_splurt/icons/mob/mam_tails.dmi'
matrixed_sections = MATRIX_RED
diff --git a/modular_splurt/icons/mob/mam_tails.dmi b/modular_splurt/icons/mob/mam_tails.dmi
index 54f793aaac..d33e3fcf98 100644
Binary files a/modular_splurt/icons/mob/mam_tails.dmi and b/modular_splurt/icons/mob/mam_tails.dmi differ
diff --git a/modular_splurt/sound/voice/farts/fart8.ogg b/modular_splurt/sound/voice/farts/fart8.ogg
new file mode 100644
index 0000000000..8809ff9bb8
Binary files /dev/null and b/modular_splurt/sound/voice/farts/fart8.ogg differ