diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm
index f6b206d307..0e4010aff0 100644
--- a/code/__HELPERS/icon_smoothing.dm
+++ b/code/__HELPERS/icon_smoothing.dm
@@ -400,4 +400,3 @@
icon_state = "smooth"
smooth = SMOOTH_TRUE|SMOOTH_DIAGONAL|SMOOTH_BORDER
canSmoothWith = null
-
diff --git a/code/controllers/subsystem/icon_smooth.dm b/code/controllers/subsystem/icon_smooth.dm
index 7e143b5aec..6f4040299a 100644
--- a/code/controllers/subsystem/icon_smooth.dm
+++ b/code/controllers/subsystem/icon_smooth.dm
@@ -40,4 +40,3 @@ SUBSYSTEM_DEF(icon_smooth)
CHECK_TICK
return ..()
-
diff --git a/config/entries/general.txt b/config/entries/general.txt
index e348ab78ba..6e59f227c6 100644
--- a/config/entries/general.txt
+++ b/config/entries/general.txt
@@ -139,14 +139,14 @@ ALLOW_AI_MULTICAM
## AWAY MISSIONS ###
## Uncomment to load one of the missions from awaymissionconfig.txt at roundstart.
-ROUNDSTART_AWAY
+#ROUNDSTART_AWAY
## Uncomment to load one of the virtual reality levels from vr_config at roundstart.
#ROUNDSTART_VR
## How long the delay is before the Away Mission gate opens. Default is half an hour.
## 600 is one minute.
-GATEWAY_DELAY 600
+GATEWAY_DELAY 18000
## ACCESS ###
diff --git a/modular_splurt/code/datums/interactions/lewd/_lewd.dm b/modular_splurt/code/datums/interactions/lewd/_lewd.dm
index 5caef1a568..a162270c7f 100644
--- a/modular_splurt/code/datums/interactions/lewd/_lewd.dm
+++ b/modular_splurt/code/datums/interactions/lewd/_lewd.dm
@@ -20,20 +20,20 @@
return donut.toggle_accessibility(accessibility)
. = ..()
-// /mob/living/moan()
-// var/moaned = lastmoan
-// var/miming = mind ? mind?.miming : FALSE
-// . = ..()
-// if((moaned == lastmoan) || is_muzzled() || miming || !prob(50))
-// return
-// var/list/moans
-// if(isalien(src))
-// moans = list('sound/voice/hiss6.ogg')
-// else if(gender == FEMALE)
-// moans = list('modular_splurt/sound/voice/moan_f1.ogg', 'modular_splurt/sound/voice/moan_f2.ogg', 'modular_splurt/sound/voice/moan_f3.ogg', 'modular_splurt/sound/voice/moan_f4.ogg', 'modular_splurt/sound/voice/moan_f5.ogg', 'modular_splurt/sound/voice/moan_f6.ogg', 'modular_splurt/sound/voice/moan_f7.ogg')
-// else
-// moans = list('modular_splurt/sound/voice/moan_m1.ogg', 'modular_splurt/sound/voice/moan_m2.ogg', 'modular_splurt/sound/voice/moan_m3.ogg')
-// playlewdinteractionsound(src, pick(moans), 50, 1, 4, 1.2, ignored_mobs = get_unconsenting())
+/mob/living/moan()
+ var/moaned = lastmoan
+ var/miming = mind ? mind?.miming : FALSE
+ . = ..()
+ if((moaned == lastmoan) || is_muzzled() || miming || !prob(50))
+ return
+ var/list/moans
+ if(isalien(src))
+ moans = list('sound/voice/hiss6.ogg')
+ else if(gender == FEMALE)
+ moans = list('modular_splurt/sound/voice/moan_f1.ogg', 'modular_splurt/sound/voice/moan_f2.ogg', 'modular_splurt/sound/voice/moan_f3.ogg', 'modular_splurt/sound/voice/moan_f4.ogg', 'modular_splurt/sound/voice/moan_f5.ogg', 'modular_splurt/sound/voice/moan_f6.ogg', 'modular_splurt/sound/voice/moan_f7.ogg')
+ else
+ moans = list('modular_splurt/sound/voice/moan_m1.ogg', 'modular_splurt/sound/voice/moan_m2.ogg', 'modular_splurt/sound/voice/moan_m3.ogg')
+ playlewdinteractionsound(src, pick(moans), 50, 1, 4, 1.2, ignored_mobs = get_unconsenting())
/mob/living/proc/get_refraction_dif() //Got snapped in upstream, may delete later when I figure something out
var/dif = (refractory_period - world.time)
@@ -762,6 +762,280 @@
if(target.can_penetrating_genital_cum())
target.handle_post_sex(NORMAL_LUST, CUM_TARGET_THIGHS, src, ORGAN_SLOT_PENIS)
+////////////////////////////////////////////////////////////////////////////////////////////////////////
+///////// U N H O L Y /////////
+////////////////////////////////////////////////////////////////////////////////////////////////////////
+/mob/living/proc/do_facefart(mob/living/carbon/target)
+ var/message
+ var/t_His = target.p_their()
+ var/u_His = p_their()
+ var/u_He = p_they()
+
+ var/list/asscheeks = list("asscheeks", "buttcheeks", "ass buns", "booty pillows", "dumptruck spheres", "[pick(list("jiggly", "bouncy", "wobbly"))] buttocks")
+ var/list/ass = list("ass", "butt", "dumptruck", "tush", "badonk", "booty", "rump")
+ var/jiggle = "[u_His] [pick(asscheeks)] [pick(list("jiggle", "bounce", "bounce around", "wobble"))] like crazy!"
+ var/list/stank = list("greasy", "rancid", "pungent", "rotten", "boiling hot", "wet", "nose-burning", "heavy", "dense", "thick", "stinky", "stenchy", "warm")
+ var/list/braps = list(
+ "rips a [pick(list("massive", "fat", "engulfing", "breathtaking"))][pick(list(", [pick(stank)]", ""))] one",
+ "[pick(list("", "wetly", "loudly"))] [pick(list("braps", "farts", "rips ass"))]",
+ "lets out some of that [pick(stank)] [pick(list("gas", "flatulence", "anal hurricane"))]",
+ "lets [u_His] shitter drop a [pick(list("large", "fat", "greasy"))] gas bomb",
+ "allows [u_His] [pick(ass)] to rip an enormous, greasy gas cloud"
+ )
+ var/list/hell = list(
+ "'s asshole squints as she shoves \the [target]'s face in between [u_His] sweaty [pick(asscheeks)], letting hell go loose!",
+ " pushes [u_His] [pick(ass)] into \the [target]'s face, [pick(list("[t_His] nose shoved deep in [src]'s musky butthole", "[u_His] asshole squints"))] as [u_He] [pick(braps)][pick(list("", ", [jiggle]"))]",
+ " smothers \the [target]'s whole head in between [u_His][pick(list(" sweaty", "", " musky"))] [pick(asscheeks)], pushing out gallons of pure braps. [pick(list("", "[jiggle]"))]",
+ "'s [pick(ass)] claps against \the [target]'s nose, right before [u_He] [pick(braps)]"
+ )
+
+ message = span_lewd("\The [src][pick(hell)]")
+ visible_message(message, ignored_mobs = get_unconsenting(unholy = TRUE))
+ playlewdinteractionsound(loc, pick(GLOB.brap_noises), 50, 1, -1, ignored_mobs = get_unconsenting(unholy = TRUE))
+ if(!is_fucking(target, GRINDING_FACE_WITH_ANUS))
+ set_is_fucking(target, GRINDING_FACE_WITH_ANUS, null)
+ handle_post_sex(LOW_LUST, null, src)
+
+/mob/living/proc/do_crotchfart(mob/living/carbon/target)
+ var/message
+ var/u_His = p_their()
+ var/genital_name = "crotch"
+ if(target.has_penis() == HAS_EXPOSED_GENITAL || target.has_strapon() == HAS_EXPOSED_GENITAL)
+ genital_name = target.get_penetrating_genital_name()
+ else if(target.has_vagina() == HAS_EXPOSED_GENITAL)
+ var/obj/item/organ/genital/vagina/genital = target.getorganslot(ORGAN_SLOT_VAGINA)
+ genital_name = genital.name
+
+ var/list/asscheeks = list("asscheeks", "buttcheeks", "ass buns", "booty pillows", "dumptruck spheres", "[pick(list("jiggly", "bouncy", "wobbly"))] buttocks")
+ var/list/ass = list("ass", "butt", "dumptruck", "tush", "badonk", "booty", "rump")
+ var/jiggle = "[u_His] [pick(asscheeks)] [pick(list("jiggle", "bounce", "bounce around", "wobble"))] like crazy!"
+ var/list/stank = list("greasy", "rancid", "pungent", "rotten", "boiling hot", "wet", "nose-burning", "heavy", "dense", "thick", "stinky", "stenchy", "warm")
+ var/list/braps = list(
+ "rips a [pick(list("massive", "fat", "engulfing", "breathtaking"))][pick(list(", [pick(stank)]", ""))] one",
+ "[pick(list("", "wetly", "loudly"))] [pick(list("braps", "farts", "rips ass"))]",
+ "lets out some of that [pick(stank)] [pick(list("gas", "flatulence", "anal hurricane"))]",
+ "lets [u_His] shitter drop a [pick(list("large", "fat", "greasy"))] gas bomb",
+ "allows [u_His] [pick(ass)] to rip an enormous, greasy gas cloud."
+ )
+ var/list/hell = list(
+ " pushes [u_His] [pick(ass)] into \the [target]'s crotch, [pick(list("ripping a fat[pick(list("", " and [pick(stank)]"))] one", " and subsequently [pick(braps)]"))][pick(list("", ". [jiggle]"))]",
+ " and \the [target] can smell the [prob(50) ? pick(stank) : "flatulent"] gas fill the room ass it seeps in between \the [target]'s thighs!",
+ " [pick(braps)] into \the [target]'s [genital_name]"
+ )
+
+ message = span_lewd("\The [src][pick(hell)]")
+ visible_message(message, ignored_mobs = get_unconsenting(unholy = TRUE))
+ playlewdinteractionsound(loc, pick(GLOB.brap_noises), 50, 1, -1, ignored_mobs = get_unconsenting(unholy = TRUE))
+ if(!target.is_fucking(src, CUM_TARGET_ANUS))
+ var/obj/item/organ/genital/genital = target.has_penis() == HAS_EXPOSED_GENITAL ? target.getorganslot(ORGAN_SLOT_PENIS) : (target.has_vagina() == HAS_EXPOSED_GENITAL ? target.getorganslot(ORGAN_SLOT_VAGINA) : null)
+ target.set_is_fucking(src, CUM_TARGET_ANUS, genital)
+ if(!target.has_strapon() == HAS_EXPOSED_GENITAL)
+ target.handle_post_sex(NORMAL_LUST, CUM_TARGET_ANUS, src)
+ handle_post_sex(NORMAL_LUST, null, target)
+
+/mob/living/proc/do_fartfuck(mob/living/target)
+ var/message
+ var/list/hell
+ var/t_He = target.p_they()
+ var/t_His = target.p_their()
+ var/u_His = p_their()
+ var/u_He = p_they()
+ var/genital_name = get_penetrating_genital_name()
+
+ var/list/asscheeks = list("asscheeks", "buttcheeks", "ass buns", "booty pillows", "dumptruck spheres", "[pick(list("jiggly", "bouncy", "wobbly"))] buttocks")
+ var/list/ass = list("ass", "butt", "dumptruck", "tush", "badonk", "booty", "rump")
+ var/jiggle = "[t_His] [pick(asscheeks)] [pick(list("jiggle", "bounce", "bounce around", "wobble"))] like crazy!"
+ var/list/stank = list("greasy", "rancid", "pungent", "rotten", "boiling hot", "wet", "nose-burning", "heavy", "dense", "thick", "stinky", "stenchy", "warm")
+ var/list/stankhole = list("greasy", "stinky", "dirty", "gassy", "brapping", "noisy", "quaking", "musky")
+ var/list/braps = list(
+ "rips a [pick(list("massive", "fat", "engulfing", "breathtaking"))][pick(list(", [pick(stank)]", ""))] one",
+ "[pick(list("", "wetly", "loudly"))] [pick(list("braps", "farts", "rips ass"))]",
+ "lets out some of that [pick(stank)] [pick(list("gas", "flatulence", "anal hurricane"))]",
+ "lets [u_His] shitter drop a [pick(list("large", "fat", "greasy"))] gas bomb",
+ "allows [u_His] [pick(ass)] to rip an enormous, greasy gas cloud."
+ )
+ if(is_fucking(target, CUM_TARGET_ANUS))
+ hell = list(
+ "thrusts in and out of \the [target]'s [pick(stankhole)] pucker, making it [pick("fumigate [src]'s [genital_name] with farts", "push out an unholy amount of ass gas")].",
+ "pounds \the [target]'s ass. [t_He] [pick(braps)]",
+ "slams [u_His] hips up against \the [target]'s [pick(stankhole)] [pick(ass)] hard, causing a massive surge of [pick(list("farts", "butt methane", "brap", "ass gas", "shit winds", "thick flatulence"))] from [t_His] [pick(list("crack", "canyon"))][prob(50) ? ". [jiggle]" : ""]",
+ "goes balls deep into \the [target]'s [pick(ass)] over and over again. [t_He] can't stop pumping out [pick("", "[pick(stank)] ")] [pick(list("farts", "butt methane", "brap", "ass gas", "shit winds", "thick flatulence"))] from his wobbling [pick(asscheeks)]")
+ else
+ hell = list(
+ "can already smell the stench as [u_He] works [u_His] [genital_name] into \the [target]'s brap hole, being received by a long and warm backblast.",
+ "grabs the base of [u_His] twitching [genital_name] and presses the tip into \the [target]'s asshole, acting like a valve that unearths impossible amounts of pure, [pick(stank)] flatulence.",
+ "shoves [u_His] [genital_name] deep inside of \the [target]'s [pick(ass)], [t_He] [pick(braps)][pick("", ". [jiggle]")]")
+ set_is_fucking(target, CUM_TARGET_ANUS, getorganslot(ORGAN_SLOT_PENIS))
+
+ message = span_lewd("\The [src] [pick(hell)]")
+ visible_message(message, ignored_mobs = get_unconsenting(unholy = TRUE))
+ playlewdinteractionsound(target.loc, pick(GLOB.brap_noises), 50, 1, -1, ignored_mobs = get_unconsenting(unholy = TRUE))
+ playlewdinteractionsound(target.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)
+ if(can_penetrating_genital_cum())
+ handle_post_sex(NORMAL_LUST, CUM_TARGET_ANUS, target, ORGAN_SLOT_PENIS)
+ target.handle_post_sex(NORMAL_LUST, null, src)
+
+/mob/living/proc/suck_fart(mob/living/target)
+ var/message
+ var/list/hell
+ var/t_His = target.p_their()
+ var/u_His = p_their()
+
+ var/list/stank = list("greasy", "rancid", "pungent", "rotten", "boiling hot", "wet", "nose-burning", "heavy", "dense", "thick", "stinky", "stenchy", "warm")
+ var/list/stankhole = list("greasy", "stinky", "dirty", "gassy", "brapping", "noisy", "quaking", "musky")
+
+ if(is_fucking(target, GRINDING_FACE_WITH_ANUS))
+ hell = list(
+ "smooches and sucks \the [target]'s [pick(pick(stankhole) + " ", "")] pucker, gulping down a whole barrage of [pick(stank)] flatulence!",
+ "pierces \the [target]'s [pick(pick(stankhole) + " ", "")] butthole with [u_His] tongue, making a [pick(stank)] burst out!",
+ "sucks into \the [target]'s [pick(pick(stankhole) + " ", "")] asshole, gulping down [t_His] [pick(stank)] gas!"
+ )
+ else
+ hell = list(
+ "presses [u_His] face right into \the [target]'s [pick(list("musky ", "sweaty ", ""))] backside, spreading [t_His] butthole open to begin harvesting [t_His] [pick(stank) + " "] farts!",
+ "uses [u_His] lips to spread \the [target]'s [pick(stankhole) + " "] butthole, starting to suck the flatulence out of it!"
+ )
+ set_is_fucking(target, GRINDING_FACE_WITH_ANUS, null)
+
+ message = span_lewd("\The [src] [pick(hell)]")
+ visible_message(message, ignored_mobs = get_unconsenting(unholy = TRUE))
+ playlewdinteractionsound(target.loc, pick(GLOB.brap_noises), 50, 1, -1, ignored_mobs = get_unconsenting(unholy = TRUE))
+ playlewdinteractionsound(target.loc, 'modular_sand/sound/interactions/champ_fingering.ogg', 50, 1, -1, ignored_mobs = get_unconsenting(unholy = TRUE))
+ target.handle_post_sex(NORMAL_LUST, null, src)
+
+/mob/living/proc/do_faceshit(mob/living/carbon/target)
+ var/message
+ var/u_His = p_their()
+ var/t_His = target.p_their()
+
+ var/list/asscheeks = list("asscheeks", "buttcheeks", "ass buns", "booty pillows", "dumptruck spheres", "[pick(list("jiggly", "bouncy", "wobbly"))] buttocks")
+ var/list/ass = list("ass", "butt", "dumptruck", "tush", "badonk", "booty", "rump")
+ var/jiggle = "[u_His] [pick(asscheeks)] [pick(list("jiggle", "bounce", "bounce around", "wobble"))] like crazy!"
+ var/list/stank = list("greasy", "rancid", "pungent", "rotten", "boiling hot", "wet", "nose-burning", "heavy", "dense", "thick", "stinky", "stenchy", "warm")
+ var/list/stankhole = list("greasy", "stinky", "dirty", "gassy", "shitting", "noisy", "quaking", "musky", "messy", "shitcaked", "nasty")
+
+ var/list/hell = list(
+ "presses [u_His] [pick(stankhole)] [pick(ass)] into \the [target]'s face, coating it in a [pick(stank)] layer of brown",
+ "makes sure \the [target]'s mouth is wide open, letting out a greasy, [pick(stank)] log of manure right into it. [jiggle]",
+ "smothers \the [target]'s face in between [u_His] musky, dirty asscheeks, [pick(list("", "letting out a [pick(stank)] fart and"))] sliding a monster turd right into [t_His] mouth"
+ )
+
+ message = span_lewd("\The [src] [pick(hell)]")
+ visible_message(message, ignored_mobs = get_unconsenting(unholy = TRUE))
+ playlewdinteractionsound(loc, pick(GLOB.brap_noises), 50, 1, -1, ignored_mobs = get_unconsenting(unholy = TRUE))
+ if(!is_fucking(target, GRINDING_FACE_WITH_ANUS))
+ set_is_fucking(target, GRINDING_FACE_WITH_ANUS, null)
+ handle_post_sex(LOW_LUST, null, src)
+
+/mob/living/proc/do_crotchshit(mob/living/carbon/target)
+ var/message
+ var/t_His = target.p_their()
+ var/u_His = p_their()
+
+ var/genital_name = "crotch"
+ if(target.has_penis() == HAS_EXPOSED_GENITAL || target.has_strapon() == HAS_EXPOSED_GENITAL)
+ genital_name = target.get_penetrating_genital_name()
+ else if(target.has_vagina() == HAS_EXPOSED_GENITAL)
+ var/obj/item/organ/genital/vagina/genital = target.getorganslot(ORGAN_SLOT_VAGINA)
+ genital_name = genital.name
+
+ var/list/asscheeks = list("asscheeks", "buttcheeks", "ass buns", "booty pillows", "dumptruck spheres", "[pick(list("jiggly", "bouncy", "wobbly"))] buttocks")
+ var/list/ass = list("ass", "butt", "dumptruck", "tush", "badonk", "booty", "rump")
+ var/jiggle = "[u_His] [pick(asscheeks)] [pick(list("jiggle", "bounce", "bounce around", "wobble"))] like crazy!"
+ var/list/stank = list("greasy", "rancid", "pungent", "rotten", "boiling hot", "wet", "nose-burning", "heavy", "dense", "thick", "stinky", "stenchy", "warm")
+ var/list/stankhole = list("greasy", "stinky", "dirty", "gassy", "shitting", "noisy", "quaking", "musky", "messy", "shitcaked", "nasty")
+
+ var/list/hell = list(
+ "presses [u_His] [pick(stankhole)] [pick(asscheeks)] right against \the [target]'s crotch, unleashing pounds of warm crap all over [t_His] [genital_name] [prob(50) ? ". [jiggle]" : ""]",
+ "shoves [u_His][pick(list("", " [pick(stank)],"))] shitting [pick(ass)] into \the [target]'s thighs and coats everything in between them with [pick("", "gas and ")] slick slop",
+ "shits uncontrollably all over \the [target]'s [genital_name][prob(50) ? "" : ". [jiggle]"]"
+ )
+
+ message = span_lewd("\The [src] [pick(hell)]")
+ visible_message(message, ignored_mobs = get_unconsenting(unholy = TRUE))
+ playlewdinteractionsound(loc, pick(GLOB.brap_noises), 50, 1, -1, ignored_mobs = get_unconsenting(unholy = TRUE))
+
+ var/obj/item/organ/genital/G = target.has_penis() == HAS_EXPOSED_GENITAL ? target.getorganslot(ORGAN_SLOT_PENIS) : (target.has_vagina() == HAS_EXPOSED_GENITAL ? target.getorganslot(ORGAN_SLOT_VAGINA) : null)
+ if(!target.is_fucking(src, CUM_TARGET_ANUS))
+ target.set_is_fucking(src, CUM_TARGET_ANUS, G)
+ if(!target.has_strapon() == HAS_EXPOSED_GENITAL)
+ target.handle_post_sex(NORMAL_LUST, CUM_TARGET_ANUS, src, G)
+ handle_post_sex(NORMAL_LUST, null, target)
+
+/mob/living/proc/do_shitfuck(mob/living/carbon/target)
+ var/message
+ var/t_He = target.p_they()
+ var/t_His = target.p_their()
+ var/u_His = p_their()
+ var/u_He = p_they()
+ var/genital_name = get_penetrating_genital_name()
+
+ var/list/hell
+ var/list/asscheeks = list("asscheeks", "buttcheeks", "ass buns", "booty pillows", "dumptruck spheres", "[pick(list("jiggly", "bouncy", "wobbly"))] buttocks")
+ var/list/ass = list("ass", "butt", "dumptruck", "tush", "badonk", "booty", "rump")
+ var/jiggle = "[t_His] [pick(asscheeks)] [pick(list("jiggle", "bounce", "bounce around", "wobble"))] like crazy!"
+ var/list/stank = list("greasy", "rancid", "pungent", "rotten", "boiling hot", "wet", "nose-burning", "heavy", "dense", "thick", "stinky", "stenchy", "warm")
+ var/list/stankhole = list("greasy", "stinky", "dirty", "gassy", "shitting", "noisy", "quaking", "musky", "messy", "shitcaked", "nasty")
+
+ if(is_fucking(target, CUM_TARGET_ANUS))
+ hell = list(
+ "thrusts in and out of \the [target]'s [pick(stank)] shit-lubed pucker, making it squeak and expulse heavy gases and waste.",
+ "pounds \the [target]'s ass. [t_He] just can't stop pumping out slop!",
+ "slams [u_His] hips up against \the [target]'s [pick(stankhole)] [pick(ass)] hard, causing a massive surge of manure from [t_His] [pick(list("crack", "canyon"))][prob(50) ? ". [jiggle]" : ""]",
+ "goes balls deep into \the [target]'s dirty [pick(ass)] over and over again. [u_His] [genital_name] comes completely coated brown from in between the bouncing [pick(asscheeks)]")
+ else
+ hell = list(
+ "can already smell the stench as [u_He] works [u_His] [genital_name] into \the [target]'s dung hole, being received by warm, wet and nasty feeling all over it.",
+ "grabs the base of [u_His] twitching [genital_name] and presses the tip into \the [target]'s asshole, immediately shoving it right into a fat and moist log",
+ "shoves [genital_name] deep inside of \the [target]'s [pick(ass)], [t_He] releases a massive amount of mush to greet the rod[pick("", ". [jiggle]")]")
+ set_is_fucking(target, CUM_TARGET_ANUS, getorganslot(ORGAN_SLOT_PENIS))
+
+ message = span_lewd("\The [src] [pick(hell)]")
+ visible_message(message, ignored_mobs = get_unconsenting(unholy = TRUE), ignored_mobs = get_unconsenting(unholy = TRUE))
+ playlewdinteractionsound(target.loc, pick(GLOB.brap_noises), 70, 1, -1)
+ playlewdinteractionsound(target.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)
+ if(can_penetrating_genital_cum())
+ handle_post_sex(NORMAL_LUST, CUM_TARGET_ANUS, target, ORGAN_SLOT_PENIS)
+ target.handle_post_sex(NORMAL_LUST, null, src)
+
+/mob/living/proc/suck_shit(mob/living/target)
+ var/message
+ var/list/hell
+ var/t_His = target.p_their()
+ var/u_His = p_their()
+
+ var/list/stank = list("greasy", "rancid", "pungent", "rotten", "boiling hot", "wet", "nose-burning", "heavy", "dense", "thick", "stinky", "stenchy", "warm")
+ var/list/stankhole = list("greasy", "stinky", "dirty", "gassy", "brapping", "noisy", "quaking", "musky")
+
+ if(is_fucking(target, GRINDING_FACE_WITH_ANUS))
+ hell = list(
+ "smooches and sucks \the [target]'s [pick(pick(stankhole) + " ", "")] pucker, gulping down a whole log of [pick(stank)] shit!",
+ "pierces \the [target]'s [pick(pick(stankhole) + " ", "")] butthole with [u_His] tongue, forcing them to evacuate a [pick(stank)] right down [u_His] throat!",
+ "sucks into \the [target]'s [pick(pick(stankhole) + " ", "")] asshole, gulping down [t_His] [pick(stank)] scat!"
+ )
+ else
+ hell = list(
+ "presses [u_His] face right into \the [target]'s [pick(list("musky ", "sweaty ", ""))] backside, spreading [t_His] shithole open to begin harvesting [t_His] [pick(stank) + " "] manure!",
+ "uses [u_His] lips to spread \the [target]'s [pick(stankhole) + " "] butthole, forcing him to take a massive dump on [u_His] mouth!"
+ )
+ set_is_fucking(target, GRINDING_FACE_WITH_ANUS, null)
+
+ message = span_lewd("\The [src] [pick(hell)]")
+ visible_message(message, ignored_mobs = get_unconsenting(unholy = TRUE))
+ playlewdinteractionsound(target.loc, pick(GLOB.brap_noises), 50, 1, -1, ignored_mobs = get_unconsenting(unholy = TRUE))
+ playlewdinteractionsound(target.loc, 'modular_sand/sound/interactions/champ_fingering.ogg', 50, 1, -1, ignored_mobs = get_unconsenting(unholy = TRUE))
+ target.handle_post_sex(NORMAL_LUST, null, src, ORGAN_SLOT_ANUS)
+
/mob/living/proc/piss_over(mob/living/target)
var/message
var/u_His = p_their()
diff --git a/modular_splurt/code/datums/interactions/lewd/lewd_datums.dm b/modular_splurt/code/datums/interactions/lewd/lewd_datums.dm
index fd47b0bf4b..764b5a4ecf 100644
--- a/modular_splurt/code/datums/interactions/lewd/lewd_datums.dm
+++ b/modular_splurt/code/datums/interactions/lewd/lewd_datums.dm
@@ -793,6 +793,134 @@
. = ..()
interaction_flags |= INTERACTION_FLAG_UNHOLY_CONTENT
+/datum/interaction/lewd/unholy/do_facefart
+ description = "Fart on their face."
+ required_from_target_exposed = NONE
+ required_from_target_unexposed = NONE
+ required_from_user_exposed = INTERACTION_REQUIRE_ANUS
+ required_from_user_unexposed = NONE
+ max_distance = 1
+ interaction_sound = null
+ write_log_target = "got facefarted by"
+ write_log_user = "farted on the face of"
+
+/datum/interaction/lewd/unholy/do_facefart/display_interaction(mob/living/user, mob/living/target)
+ user.do_facefart(target)
+
+/datum/interaction/lewd/unholy/do_crotchfart
+ description = "Fart on their crotch."
+ required_from_target_exposed = NONE
+ required_from_target_unexposed = NONE
+ required_from_user_exposed = INTERACTION_REQUIRE_ANUS
+ required_from_user_unexposed = NONE
+ max_distance = 1
+ interaction_sound = null
+ write_log_target = "got crotchfarted by"
+ write_log_user = "farted on the crotch of"
+
+/datum/interaction/lewd/unholy/do_crotchfart/display_interaction(mob/living/user, mob/living/target)
+ user.do_crotchfart(target)
+
+/datum/interaction/lewd/unholy/do_fartfuck
+ description = "Fuck their ass + fart."
+ required_from_target_exposed = INTERACTION_REQUIRE_ANUS
+ required_from_target_unexposed = NONE
+ required_from_user_exposed = INTERACTION_REQUIRE_PENIS
+ required_from_user_unexposed = NONE
+ max_distance = 1
+ interaction_sound = null
+ write_log_target = "got fartfucked by"
+ write_log_user = "fartfucked"
+
+/datum/interaction/lewd/unholy/do_fartfuck/display_interaction(mob/living/user, mob/living/target)
+ user.do_fartfuck(target)
+
+ if(!(isclownjob(target) || isclownjob(user)))
+ return
+
+ if(prob(50) && isclownjob(target))
+ target.visible_message(span_lewd("\The [target]'s fun hole honks[pick(" loudly", "")]!"))
+
+ playlewdinteractionsound(target, 'sound/items/bikehorn.ogg', 40, 1, -1)
+
+/datum/interaction/lewd/unholy/suck_fart
+ description = "Suck the farts out of their asshole."
+ required_from_target_exposed = INTERACTION_REQUIRE_ANUS
+ required_from_target_unexposed = NONE
+ required_from_user_exposed = INTERACTION_REQUIRE_MOUTH
+ required_from_user_unexposed = NONE
+ max_distance = 1
+ interaction_sound = null
+ write_log_target = "got their farts sucked out by"
+ write_log_user = "sucked farts"
+
+/datum/interaction/lewd/unholy/suck_fart/display_interaction(mob/living/user, mob/living/target)
+ user.suck_fart(target)
+
+/datum/interaction/lewd/unholy/do_faceshit
+ description = "Shit on their face."
+ required_from_target_exposed = NONE
+ required_from_target_unexposed = NONE
+ required_from_user_exposed = INTERACTION_REQUIRE_ANUS
+ required_from_user_unexposed = NONE
+ max_distance = 1
+ interaction_sound = null
+ write_log_target = "got shat in the face by"
+ write_log_user = "shat in the face of"
+
+/datum/interaction/lewd/unholy/do_faceshit/display_interaction(mob/living/user, mob/living/target)
+ user.do_faceshit(target)
+
+/datum/interaction/lewd/unholy/do_crotchshit/
+ description = "Shit on their crotch."
+ required_from_target_exposed = NONE
+ required_from_target_unexposed = NONE
+ required_from_user_exposed = INTERACTION_REQUIRE_ANUS
+ required_from_user_unexposed = NONE
+ max_distance = 1
+ interaction_sound = null
+ write_log_target = "got shat on the croch by"
+ write_log_user = "shat on the crotch of"
+
+/datum/interaction/lewd/unholy/do_crotchshit/display_interaction(mob/living/user, mob/living/target)
+ user.do_crotchshit(target)
+
+/datum/interaction/lewd/unholy/do_shitfuck
+ description = "Fuck their ass + shit."
+ required_from_target_exposed = INTERACTION_REQUIRE_ANUS
+ required_from_target_unexposed = NONE
+ required_from_user_exposed = INTERACTION_REQUIRE_PENIS
+ required_from_user_unexposed = NONE
+ max_distance = 1
+ interaction_sound = null
+ write_log_target = "got shitfucked by"
+ write_log_user = "shitfucked"
+
+/datum/interaction/lewd/unholy/do_shitfuck/display_interaction(mob/living/user, mob/living/target)
+ user.do_shitfuck(target)
+
+ if(!(isclownjob(target) || isclownjob(user)))
+ return
+
+ if(prob(50) && isclownjob(target))
+ target.visible_message(span_lewd("\The [target]'s fun hole honks[pick(" loudly", "")]!"))
+
+ playlewdinteractionsound(target, 'sound/items/bikehorn.ogg', 40, 1, -1)
+
+/datum/interaction/lewd/unholy/suck_shit
+ description = "Suck the shit out of their asshole."
+ required_from_target_exposed = INTERACTION_REQUIRE_ANUS
+ required_from_target_unexposed = NONE
+ required_from_user_exposed = INTERACTION_REQUIRE_MOUTH
+ required_from_user_unexposed = NONE
+ max_distance = 1
+ interaction_sound = null
+ write_log_target = "got their shit sucked out by"
+ write_log_user = "sucked shit"
+
+/datum/interaction/lewd/unholy/suck_shit/display_interaction(mob/living/user, mob/living/target)
+ user.suck_shit(target)
+
/datum/interaction/lewd/unholy/piss_over
description = "Piss all over them."
required_from_user = INTERACTION_REQUIRE_BOTTOMLESS
diff --git a/modular_splurt/code/modules/mob/living/simple_animal/hostile/deathclaw/funclaw.dm b/modular_splurt/code/modules/mob/living/simple_animal/hostile/deathclaw/funclaw.dm
index cfc9f50ad8..68c0fce202 100644
--- a/modular_splurt/code/modules/mob/living/simple_animal/hostile/deathclaw/funclaw.dm
+++ b/modular_splurt/code/modules/mob/living/simple_animal/hostile/deathclaw/funclaw.dm
@@ -129,8 +129,17 @@
if(tearSlot(M, ITEM_SLOT_MASK))
return
- I = SSinteractions.interactions["/datum/interaction/lewd/throatfuck"]
- I.display_interaction(src, M)
+ // Abomination deathclaws do other stuff instead
+ if(deathclaw_mode == "abomination" && M.client?.prefs.unholypref == "Yes")
+ if(prob(1))
+ do_faceshit(M)
+ else
+ do_facefart(M)
+ handle_post_sex(25, null, M)
+ shake_camera(M, 6, 1)
+ else
+ I = SSinteractions.interactions["/datum/interaction/lewd/throatfuck"]
+ I.display_interaction(src, M)
/mob/living/simple_animal/hostile/deathclaw/funclaw/cum(mob/living/M)
diff --git a/modular_splurt/code/modules/mob/living/simple_animal/hostile/werewolves/funwolf.dm b/modular_splurt/code/modules/mob/living/simple_animal/hostile/werewolves/funwolf.dm
index de355bb441..3886b2fcf7 100644
--- a/modular_splurt/code/modules/mob/living/simple_animal/hostile/werewolves/funwolf.dm
+++ b/modular_splurt/code/modules/mob/living/simple_animal/hostile/werewolves/funwolf.dm
@@ -138,8 +138,17 @@
if(tearSlot(M, ITEM_SLOT_MASK))
return
- I = SSinteractions.interactions["/datum/interaction/lewd/throatfuck"]
- I.display_interaction(src, M)
+ // Abomination deathclaws do other stuff instead
+ if(werewolf_mode == "abomination" && M.client?.prefs.unholypref == "Yes")
+ if(prob(1))
+ do_faceshit(M)
+ else
+ do_facefart(M)
+ handle_post_sex(25, null, M)
+ shake_camera(M, 6, 1)
+ else
+ I = SSinteractions.interactions["/datum/interaction/lewd/throatfuck"]
+ I.display_interaction(src, M)
/mob/living/simple_animal/hostile/werewolf/funwolf/cum(mob/living/M)
@@ -342,8 +351,17 @@
if(tearSlot(M, ITEM_SLOT_MASK))
return
- I = SSinteractions.interactions["/datum/interaction/lewd/throatfuck"]
- I.display_interaction(src, M)
+ // Abomination deathclaws do other stuff instead
+ if(werewolf_mode == "abomination" && M.client?.prefs.unholypref == "Yes")
+ if(prob(1))
+ do_faceshit(M)
+ else
+ do_facefart(M)
+ handle_post_sex(25, null, M)
+ shake_camera(M, 6, 1)
+ else
+ I = SSinteractions.interactions["/datum/interaction/lewd/throatfuck"]
+ I.display_interaction(src, M)
/mob/living/simple_animal/hostile/ice_wolf/funwolf/cum(mob/living/M)
@@ -547,8 +565,17 @@
if(tearSlot(M, ITEM_SLOT_MASK))
return
- I = SSinteractions.interactions["/datum/interaction/lewd/throatfuck"]
- I.display_interaction(src, M)
+ // Abomination deathclaws do other stuff instead
+ if(werewolf_mode == "abomination" && M.client?.prefs.unholypref == "Yes")
+ if(prob(1))
+ do_faceshit(M)
+ else
+ do_facefart(M)
+ handle_post_sex(25, null, M)
+ shake_camera(M, 6, 1)
+ else
+ I = SSinteractions.interactions["/datum/interaction/lewd/throatfuck"]
+ I.display_interaction(src, M)
/mob/living/simple_animal/hostile/hellhound/funwolf/cum(mob/living/M)
@@ -612,3 +639,218 @@
span_userdanger("\The [src] tears off \the [M]'s clothes!"), null, COMBAT_MESSAGE_RANGE)
return TRUE
return FALSE
+
+
+//////////////////
+// //
+// The Mosley //
+// //
+//////////////////
+
+/mob/living/simple_animal/hostile/the_mosley/funwolf
+ name = "Fun Mosley"
+ desc = "A massive, unknown creature with powerful muscles, glittering-purple claws, and aggression to match. This one seems to have a strange look in its eyes.."
+ var/change_target_hole_cooldown = 0
+ var/chosen_hole
+ var/voremode = FALSE // Fixes runtime when grabbing victim
+ gold_core_spawnable = NO_SPAWN // Admin only
+ werewolf_mode = "rape"
+
+/mob/living/simple_animal/hostile/the_mosley/funwolf/gentle
+ name = "Gentle Mosley"
+ desc = "A massive, unknown creature with powerful muscles, glittering-purple claws, and aggression to match. This one has the bedroom eyes.."
+ werewolf_mode = "gentle"
+
+/mob/living/simple_animal/hostile/the_mosley/funwolf/abomination
+ name = "Exiled Mosley"
+ desc = "A massive, unknown creature with powerful muscles, glittering-purple claws, and aggression to match. This one has a strange smell for some reason.."
+ werewolf_mode = "abomination"
+
+/mob/living/simple_animal/hostile/the_mosley/funwolf/AttackingTarget()
+ var/mob/living/M = target
+
+ var/onLewdCooldown = FALSE
+ var/wantsNoncon = FALSE
+
+ if(get_refraction_dif() > 0)
+ onLewdCooldown = TRUE
+
+ if(M.client && M.client?.prefs.erppref == "Yes" && CHECK_BITFIELD(M.client?.prefs.toggles, VERB_CONSENT) && M.client?.prefs.nonconpref == "Yes")
+ wantsNoncon = TRUE
+
+ switch(werewolf_mode)
+ if("gentle")
+ if(onLewdCooldown || !wantsNoncon)
+ return // Do nothing
+ if("abomination")
+ if(onLewdCooldown || !wantsNoncon)
+ return // Do nothing
+ if("rape")
+ if(onLewdCooldown || !wantsNoncon || M.health > 60)
+ ..() // Attack target
+ return
+
+ if(!M.pulledby)
+ if(!M.buckled && !M.density)
+ M.forceMove(src.loc)
+
+ start_pulling(M, supress_message = TRUE)
+ log_combat(src, M, "grabbed")
+ M.visible_message(span_warning("[src] violently grabs [M]!"), \
+ span_userdanger("[src] violently grabs you!"))
+ setGrabState(GRAB_NECK) //Instant neck grab
+
+ return
+
+ if(get_refraction_dif() > 0)
+ ..()
+ return
+
+ if(change_target_hole_cooldown < world.time)
+ chosen_hole = null
+ while (chosen_hole == null)
+ pickNewHole(M)
+ change_target_hole_cooldown = world.time + 100
+
+
+ do_lewd_action(M)
+ addtimer(CALLBACK(src, PROC_REF(do_lewd_action), M), rand(8, 12))
+
+ // Regular sex has an extra action per tick to seem less slow and robotic
+ if(werewolf_mode != "abomination" || M.client?.prefs.unholypref != "Yes")
+ addtimer(CALLBACK(src, PROC_REF(do_lewd_action), M), rand(12, 16))
+
+
+/mob/living/simple_animal/hostile/the_mosley/funwolf/proc/pickNewHole(mob/living/M)
+ switch(rand(2))
+ if(0)
+ chosen_hole = CUM_TARGET_ANUS
+ if(1)
+ if(M.has_vagina())
+ chosen_hole = CUM_TARGET_VAGINA
+ else
+ chosen_hole = CUM_TARGET_ANUS
+ if(2)
+ chosen_hole = CUM_TARGET_THROAT
+
+/mob/living/simple_animal/hostile/the_mosley/funwolf/proc/do_lewd_action(mob/living/M)
+ if(get_refraction_dif() > 0)
+ return
+
+ if(rand(1,7) == 7)
+ playlewdinteractionsound(loc, "modular_splurt/sound/lewd/deathclaw_grunt[rand(1, 5)].ogg", 30, 1, -1)
+
+ var/datum/interaction/I
+ switch(chosen_hole)
+ if(CUM_TARGET_ANUS)
+ if(tearSlot(M, ITEM_SLOT_OCLOTHING))
+ return
+ if(tearSlot(M, ITEM_SLOT_ICLOTHING))
+ return
+
+ // Abomination deathclaws do other stuff instead
+ if(werewolf_mode == "abomination" && M.client?.prefs.unholypref == "Yes")
+ if(prob(1))
+ I = SSinteractions.interactions["/datum/interaction/lewd/grindmouth"]
+ else
+ I = SSinteractions.interactions["/datum/interaction/lewd/grindface"]
+ handle_post_sex(25, null, M)
+ else
+ I = SSinteractions.interactions["/datum/interaction/lewd/fuck/anal"]
+ I.display_interaction(src, M)
+
+ if(CUM_TARGET_VAGINA)
+ if(tearSlot(M, ITEM_SLOT_OCLOTHING))
+ return
+ if(tearSlot(M, ITEM_SLOT_ICLOTHING))
+ return
+
+ // Abomination deathclaws do other stuff instead
+ if(werewolf_mode == "abomination" && M.client?.prefs.unholypref == "Yes")
+ I = SSinteractions.interactions["/datum/interaction/lewd/footjob/vagina"]
+ handle_post_sex(10, null, M)
+ else
+ I = SSinteractions.interactions["/datum/interaction/lewd/fuck"]
+ I.display_interaction(src, M)
+
+ if(CUM_TARGET_THROAT)
+ if(tearSlot(M, ITEM_SLOT_HEAD))
+ return
+ if(tearSlot(M, ITEM_SLOT_MASK))
+ return
+
+ // Abomination deathclaws do other stuff instead
+ if(werewolf_mode == "abomination" && M.client?.prefs.unholypref == "Yes")
+ if(prob(1))
+ do_faceshit(M)
+ else
+ do_facefart(M)
+ handle_post_sex(25, null, M)
+ shake_camera(M, 6, 1)
+ else
+ I = SSinteractions.interactions["/datum/interaction/lewd/throatfuck"]
+ I.display_interaction(src, M)
+
+/mob/living/simple_animal/hostile/the_mosley/funwolf/cum(mob/living/M)
+
+ if(get_refraction_dif() > 0)
+ return
+
+ var/message
+
+ if(!istype(M))
+ chosen_hole = null
+
+ switch(chosen_hole)
+ if(CUM_TARGET_THROAT)
+ if(M.has_mouth() && M.mouth_is_free())
+ message = "shoves their fat canine cock deep down \the [M]'s throat and cums."
+ else
+ message = "cums on \the [M]'s face."
+ if(CUM_TARGET_VAGINA)
+ if(M.is_bottomless() && M.has_vagina())
+ message = "rams its meaty cock into \the [M]'s pussy and fills it with sperm."
+ M.impregnate(src, M.getorganslot(ORGAN_SLOT_WOMB), src.type)
+ else
+ message = "cums on \the [M]'s belly."
+ if(CUM_TARGET_ANUS)
+ if(M.is_bottomless() && M.has_anus())
+ message = "hilts its knot into \the [M]'s ass and floods it with Werewolf jizz."
+ else
+ message = "cums on \the [M]'s backside."
+ else
+ message = "cums on the floor!"
+
+ if(werewolf_mode == "abomination" && M.client?.prefs.unholypref == "Yes")
+ message = "cums all over [M]'s body"
+
+ if(istype(M, /mob/living/carbon))
+ M.reagents.add_reagent(/datum/reagent/consumable/semen, 30)
+ new /obj/effect/decal/cleanable/semen(loc)
+
+ playlewdinteractionsound(loc, "modular_splurt/sound/lewd/deathclaw[rand(1, 2)].ogg", 30, 1, -1)
+ visible_message("\The [src] [message]")
+ shake_camera(M, 6, 1)
+ set_is_fucking(null ,null)
+
+ refractory_period = world.time + rand(100, 150) // Sex cooldown
+ set_lust(0) // Nuts at 400
+
+ addtimer(CALLBACK(src, PROC_REF(slap), M), 15)
+
+
+/mob/living/simple_animal/hostile/the_mosley/funwolf/proc/slap(mob/living/M)
+ playlewdinteractionsound(loc, "modular_sand/sound/interactions/slap.ogg", 30, 1, -1)
+ visible_message(span_danger("\The [src] slaps \the [M] right on the ass!"), \
+ span_userdanger("\The [src] slaps \the [M] right on the ass!"), null, COMBAT_MESSAGE_RANGE)
+
+/mob/living/simple_animal/hostile/the_mosley/funwolf/proc/tearSlot(mob/living/M, slot)
+ var/obj/item/W = M.get_item_by_slot(slot)
+ if(W)
+ M.dropItemToGround(W)
+ playlewdinteractionsound(loc, "sound/items/poster_ripped.ogg", 30, 1, -1)
+ visible_message(span_danger("\The [src] tears off \the [M]'s clothes!"), \
+ span_userdanger("\The [src] tears off \the [M]'s clothes!"), null, COMBAT_MESSAGE_RANGE)
+ return TRUE
+ return FALSE
+
diff --git a/modular_splurt/code/modules/mob/living/simple_animal/hostile/werewolves/themosley.dm b/modular_splurt/code/modules/mob/living/simple_animal/hostile/werewolves/themosley.dm
new file mode 100644
index 0000000000..1b3e23db6c
--- /dev/null
+++ b/modular_splurt/code/modules/mob/living/simple_animal/hostile/werewolves/themosley.dm
@@ -0,0 +1,134 @@
+/mob/living/simple_animal/hostile/the_mosley
+ name = "The Mosley"
+ desc = "A massive, unknown creature with powerful muscles, glittering-purple claws, and aggression to match."
+ icon = 'modular_splurt/icons/mobs/werewolf.dmi'
+ icon_state = "The_Mosley_idle"
+ icon_living = "The_Mosley_idle"
+ icon_dead = "The_Mosley_dead"
+ icon_gib = "syndicate_gib"
+ pixel_x = -16
+ gender = MALE
+ mob_biotypes = list(MOB_ORGANIC, MOB_BEAST)
+ stat_attack = UNCONSCIOUS
+ speak = list("ROAR!","Rawr!","GRRAAGH!","Growl!")
+ speak_emote = list("growls", "snarls")
+ emote_hear = list("grumbles.","snarls.")
+ emote_taunt = list("bares its teeth", "stomps")
+ speak_chance = 10
+ taunt_chance = 25
+ speed = 0
+ see_in_dark = 8
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab= 4,
+ /obj/item/stack/sheet/animalhide = 2,
+ /obj/item/stack/sheet/bone = 4)
+ attack_verb_continuous = "claws"
+ attack_verb_simple = "claw"
+ maxHealth = 500
+ health = 500
+ obj_damage = 60
+ armour_penetration = 30
+ melee_damage_lower = 56
+ melee_damage_upper = 56
+ attack_sound = 'modular_splurt/sound/misc/claw_rend.ogg'
+ faction = list("werewolf")
+ atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
+ unsuitable_atmos_damage = 5
+ gold_core_spawnable = FALSE
+ var/charging = FALSE
+ has_penis = TRUE
+ has_butt = TRUE
+
+ footstep_type = FOOTSTEP_MOB_HEAVY
+
+ //**werewolf_mode**
+ // Hostile: Normal deathclaw murder machine
+ // Friendly: Does not attack
+ // Rape: Hurts and lewds people
+ // Gentle: lewds people
+ // Abomination: Hurts and does unspeakable lewd things to people
+ var/werewolf_mode = "hostile"
+
+/mob/living/simple_animal/hostile/the_mosley/pacifist
+ name = "Friendly Mosley"
+ desc = "A massive, unknown creature with powerful muscles, glittering-purple claws, and aggression to match."
+ werewolf_mode = "friendly"
+ friendly_verb_continuous = "howls at"
+ friendly_verb_simple = "howl at"
+
+/mob/living/simple_animal/hostile/the_mosley/bullet_act(obj/item/projectile/Proj)
+ if(!Proj)
+ return
+ if(prob(10))
+ visible_message(span_danger("\The [src] growls, enraged!"))
+ sleep(3)
+ Charge()
+ if(prob(85) || Proj.damage > 26) //prob(x) = chance for proj to actually do something, adjust depending on how OP you want deathclaws to be
+ return ..()
+ else
+ visible_message(span_danger("\The [Proj] bounces off \the [src]'s thick hide!"))
+ return 0
+
+/mob/living/simple_animal/hostile/the_mosley/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect)
+ if(!charging)
+ ..()
+
+/mob/living/simple_animal/hostile/the_mosley/AttackingTarget()
+ if (werewolf_mode == "friendly")
+ return // Do not attack
+
+ if(!charging)
+ return ..()
+
+/mob/living/simple_animal/hostile/the_mosley/Goto(target, delay, minimum_distance)
+ if(!charging)
+ ..()
+
+/mob/living/simple_animal/hostile/the_mosley/Move()
+ if(charging)
+ new /obj/effect/temp_visual/decoy/fading(loc,src)
+ DestroySurroundings()
+ . = ..()
+ if(charging)
+ DestroySurroundings()
+
+/mob/living/simple_animal/hostile/the_mosley/proc/Charge()
+ var/turf/T = get_turf(target)
+ if(!T || T == loc)
+ return
+ charging = TRUE
+ visible_message(span_danger("[src] charges!"))
+ DestroySurroundings()
+ walk(src, 0)
+ setDir(get_dir(src, T))
+ var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(loc,src)
+ animate(D, alpha = 0, color = "#FF0000", transform = matrix()*2, time = 1)
+ sleep(3)
+ throw_at(T, get_dist(src, T), 1, src, 0, callback = CALLBACK(src, PROC_REF(charge_end)))
+
+/mob/living/simple_animal/hostile/the_mosley/charge_end(list/effects_to_destroy)
+ charging = FALSE
+ if(target)
+ Goto(target, move_to_delay, minimum_distance)
+
+/mob/living/simple_animal/hostile/the_mosley/Bump(atom/A)
+ if(charging)
+ if(isturf(A) || isobj(A) && A.density)
+ A.ex_act(EXPLODE_HEAVY)
+ DestroySurroundings()
+ ..()
+
+/mob/living/simple_animal/hostile/the_mosley/throw_impact(atom/A)
+ if(!charging)
+ return ..()
+
+ else if(isliving(A))
+ var/mob/living/L = A
+ L.visible_message(span_danger("[src] slams into [L]!"), span_userdanger("[src] slams into you!"))
+ L.apply_damage(melee_damage_lower/2, BRUTE)
+ playsound(get_turf(L), 'sound/effects/meteorimpact.ogg', 100, 1)
+ shake_camera(L, 4, 3)
+ shake_camera(src, 2, 3)
+ var/throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(L, src)))
+ L.throw_at(throwtarget, 3)
+
+ charging = FALSE
diff --git a/modular_splurt/icons/mobs/werewolf.dmi b/modular_splurt/icons/mobs/werewolf.dmi
index b2cbb4de7e..b7051253a8 100644
Binary files a/modular_splurt/icons/mobs/werewolf.dmi and b/modular_splurt/icons/mobs/werewolf.dmi differ