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