mirror of
https://github.com/Sandstorm-Station/Sandstorm-Station-13.git
synced 2026-08-27 15:18:33 +01:00
@@ -9,3 +9,29 @@ GLOBAL_LIST_INIT(lewd_prefs_choices, list(
|
||||
"Ask",
|
||||
"No"
|
||||
))
|
||||
|
||||
#define CUM_TARGET_MOUTH "mouth"
|
||||
#define CUM_TARGET_THROAT "throat"
|
||||
#define CUM_TARGET_VAGINA "vagina"
|
||||
#define CUM_TARGET_ANUS "anus"
|
||||
#define CUM_TARGET_HAND "hand"
|
||||
#define CUM_TARGET_BREASTS "breasts"
|
||||
#define CUM_TARGET_FEET "feet"
|
||||
#define CUM_TARGET_PENIS "penis"
|
||||
//Weird defines go here
|
||||
#define CUM_TARGET_EARS "ears"
|
||||
#define CUM_TARGET_EYES "eyes"
|
||||
//
|
||||
#define GRINDING_FACE_WITH_ANUS "faceanus"
|
||||
#define GRINDING_FACE_WITH_FEET "facefeet"
|
||||
#define GRINDING_MOUTH_WITH_FEET "mouthfeet"
|
||||
#define THIGH_SMOTHERING "thigh_smother"
|
||||
#define NUTS_TO_FACE "nut_face"
|
||||
|
||||
#define NORMAL_LUST 10
|
||||
#define LOW_LUST 1
|
||||
|
||||
#define REQUIRE_NONE 0
|
||||
#define REQUIRE_EXPOSED 1
|
||||
#define REQUIRE_UNEXPOSED 2
|
||||
#define REQUIRE_ANY 3
|
||||
|
||||
@@ -1,36 +1,14 @@
|
||||
/mob/living/proc/has_hands()
|
||||
return FALSE
|
||||
|
||||
/mob/living/has_hands()
|
||||
return TRUE
|
||||
|
||||
/mob/living/proc/has_mouth()
|
||||
return TRUE
|
||||
|
||||
/mob/living/proc/mouth_is_free()
|
||||
return TRUE
|
||||
return !is_mouth_covered()
|
||||
|
||||
/mob/living/proc/foot_is_free()
|
||||
return TRUE
|
||||
return is_barefoot()
|
||||
|
||||
/mob/living/carbon/human/has_mouth()
|
||||
var/obj/item/bodypart/head/headass
|
||||
for(var/obj/item/bodypart/head/shoeonhead in bodyparts)
|
||||
headass = shoeonhead
|
||||
if(headass)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/mob/living/mouth_is_free()
|
||||
if(istype(src, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = src
|
||||
return !H.wear_mask
|
||||
else
|
||||
return TRUE
|
||||
|
||||
/mob/living/foot_is_free()
|
||||
if(istype(src, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = src
|
||||
return !H.shoes
|
||||
else
|
||||
return TRUE
|
||||
return get_bodypart(BODY_ZONE_HEAD)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,123 +0,0 @@
|
||||
/mob/living/proc/do_frot(mob/living/target)
|
||||
var/message
|
||||
var/t_His = p_their()
|
||||
|
||||
message = "rubs [t_His] penis against [target]'s."
|
||||
set_is_fucking(target, CUM_TARGET_PENIS, getorganslot(ORGAN_SLOT_PENIS))
|
||||
visible_message("<span class='lewd'><b>\The [src]</b> [message]</span>", ignored_mobs = get_unconsenting())
|
||||
handle_post_sex(NORMAL_LUST, CUM_TARGET_PENIS, target)
|
||||
target.handle_post_sex(NORMAL_LUST, CUM_TARGET_PENIS, src)
|
||||
|
||||
/mob/living/proc/do_breastfeed(mob/living/target)
|
||||
var/message
|
||||
var/u_His = p_their()
|
||||
var/u_He = p_they()
|
||||
var/t_His = target.p_their()
|
||||
var/obj/item/organ/genital/breasts/milkers = getorganslot(ORGAN_SLOT_BREASTS)
|
||||
var/milktype = milkers?.fluid_id
|
||||
var/modifier
|
||||
var/list/lines
|
||||
|
||||
if(!milkers || !milktype)
|
||||
return
|
||||
var/datum/reagent/b_fluid = new milktype
|
||||
|
||||
if(target == src)
|
||||
lines = list(
|
||||
"brings [u_His] own milktanks to [u_His] mouth and sucks deeply into them",
|
||||
"takes a big sip of [u_His] own fresh [b_fluid.name]",
|
||||
"fills [u_His] own mouth with a big gulp of [u_His] warm [b_fluid.name]"
|
||||
)
|
||||
else
|
||||
lines = list(
|
||||
"pushes [u_His] breasts against \the <b>[target]</b>'s mouth, squirting [u_His] warm [b_fluid.name] into [t_His] mouth",
|
||||
"fills \the <b>[target]</b>'s mouth with warm, sweet [b_fluid.name] as [u_He] squeezes [u_His] boobs, panting",
|
||||
"lets a large stream of [u_His] own abundant [b_fluid.name] coat the back of \the <b>[target]</b>'s throat"
|
||||
)
|
||||
|
||||
message = "<span class='lewd'>\The <b>[src]</b> [pick(lines)]</span>"
|
||||
visible_message(message, ignored_mobs = get_unconsenting())
|
||||
playlewdinteractionsound(src, pick('modular_sand/sound/interactions/oral1.ogg',
|
||||
'modular_sand/sound/interactions/oral2.ogg'), 70, 1, -1)
|
||||
|
||||
switch(milkers.size)
|
||||
if("c", "d", "e")
|
||||
modifier = 2
|
||||
if("f", "g", "h")
|
||||
modifier = 3
|
||||
else
|
||||
if(milkers.size in milkers.breast_values)
|
||||
modifier = clamp(milkers.breast_values[milkers.size] - 5, 0, INFINITY)
|
||||
else
|
||||
modifier = 1
|
||||
target.reagents.add_reagent(milktype, rand(1,3 * modifier))
|
||||
|
||||
/mob/living/proc/do_jackoff(mob/living/user)
|
||||
var/message
|
||||
var/t_His = p_their()
|
||||
var/t_Him = p_them()
|
||||
|
||||
if(user.is_fucking(src, CUM_TARGET_HAND))
|
||||
message = "[pick("jerks [t_Him]self off.",
|
||||
"works [t_His] shaft.",
|
||||
"strokes [t_His] penis.",
|
||||
"wanks [t_His] cock hard.")]"
|
||||
else
|
||||
message = "[pick("wraps [t_His] hand around [t_His] cock.",
|
||||
"starts to stroke [t_His] cock.",
|
||||
"starts playing with [t_His] cock.")]"
|
||||
user.set_is_fucking(src, CUM_TARGET_HAND, user.getorganslot(ORGAN_SLOT_PENIS) ? user.getorganslot(ORGAN_SLOT_PENIS) : null)
|
||||
|
||||
playlewdinteractionsound(src, pick('modular_sand/sound/interactions/bang1.ogg',
|
||||
'modular_sand/sound/interactions/bang2.ogg',
|
||||
'modular_sand/sound/interactions/bang3.ogg'), 70, 1, -1)
|
||||
visible_message(message = "<span class='lewd'><b>\The [src]</b> [message]</span>", ignored_mobs = get_unconsenting())
|
||||
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_HAND, src)
|
||||
|
||||
/mob/living/proc/do_fingerass_self(mob/living/user)
|
||||
var/t_His = p_their()
|
||||
var/t_Him = p_them()
|
||||
|
||||
visible_message(message = "<span class='lewd'><b>\The [src]</b> [pick("fingers [t_Him]self.",
|
||||
"fingers [t_His] asshole.",
|
||||
"fingers [t_Him]self hard.")]</span>", ignored_mobs = get_unconsenting())
|
||||
playlewdinteractionsound(loc, 'modular_sand/sound/interactions/champ_fingering.ogg', 50, 1, -1)
|
||||
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_HAND, src)
|
||||
|
||||
/mob/living/proc/do_fingering_self(mob/living/user)
|
||||
var/t_His = p_their()
|
||||
|
||||
visible_message(message = "<span class='lewd'><b>\The [src]</b> [pick("fingers [t_His] pussy deep.",
|
||||
"fingers [t_His] pussy.",
|
||||
"plays with [t_His] pussy.",
|
||||
"fingers [t_His] own pussy hard.")]</span>", ignored_mobs = get_unconsenting())
|
||||
playlewdinteractionsound(loc, 'modular_sand/sound/interactions/champ_fingering.ogg', 50, 1, -1)
|
||||
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_HAND, src)
|
||||
|
||||
/mob/living/proc/do_titgrope_self(mob/living/user)
|
||||
var/message
|
||||
var/t_His = p_their()
|
||||
|
||||
if(user.a_intent == INTENT_HARM)
|
||||
message = "[pick("aggressively gropes [t_His] breast.",
|
||||
"grabs [t_His] breasts.",
|
||||
"tightly squeezes [t_His] breasts.",
|
||||
"slaps at [t_His] breasts.",
|
||||
"gropes [t_His] breasts roughly.")]"
|
||||
else
|
||||
message = "[pick("gently gropes [t_His] breast.",
|
||||
"softly squeezes [t_His] breasts.",
|
||||
"grips [t_His] breasts.",
|
||||
"runs a few fingers over [t_His] breast.",
|
||||
"delicately teases [t_His] nipple.",
|
||||
"traces a touch across [t_His] breast.")]"
|
||||
if(prob(5 + user.get_lust()))
|
||||
visible_message(message = "<span class='lewd'><b>\The [src]</b> [pick("shivers in arousal.",
|
||||
"moans quietly.",
|
||||
"breathes out a soft moan.",
|
||||
"gasps.",
|
||||
"shudders softly.",
|
||||
"trembles as [t_His] hands run across bare skin.")]</span>")
|
||||
visible_message(message = "<span class='lewd'><b>\The [src]</b> [message]</span>", ignored_mobs = get_unconsenting())
|
||||
playlewdinteractionsound(loc, 'modular_sand/sound/interactions/squelch1.ogg', 50, 1, -1)
|
||||
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_HAND, src)
|
||||
@@ -0,0 +1,114 @@
|
||||
/datum/interaction/lewd/do_breastfeed
|
||||
command = "do_breastfeed"
|
||||
description = "Breastfeed them"
|
||||
require_user_breasts = REQUIRE_EXPOSED
|
||||
require_target_mouth = TRUE
|
||||
max_distance = 1
|
||||
write_log_user = "breastfed"
|
||||
write_log_target = "was breastfed by"
|
||||
interaction_sound = null
|
||||
|
||||
/datum/interaction/lewd/do_breastfeed/display_interaction(mob/living/user, mob/living/target)
|
||||
var/message
|
||||
var/u_His = user.p_their()
|
||||
var/u_He = user.p_they()
|
||||
var/t_His = target.p_their()
|
||||
var/obj/item/organ/genital/breasts/milkers = user.getorganslot(ORGAN_SLOT_BREASTS)
|
||||
var/milktype = milkers?.fluid_id
|
||||
var/modifier
|
||||
var/list/lines
|
||||
|
||||
if(!milkers || !milktype)
|
||||
return
|
||||
|
||||
var/milktext = initial(milktype)
|
||||
|
||||
lines = list(
|
||||
"pushes [u_His] breasts against \the <b>[target]</b>'s mouth, squirting [u_His] warm [lowertext(milktext)] into [t_His] mouth",
|
||||
"fills \the <b>[target]</b>'s mouth with warm, sweet [lowertext(milktext)] as [u_He] squeezes [u_His] boobs, panting",
|
||||
"lets a large stream of [u_His] own abundant [lowertext(milktext)] coat the back of \the <b>[target]</b>'s throat"
|
||||
)
|
||||
|
||||
message = "<span class='lewd'>\The <b>[user]</b> [pick(lines)]</span>"
|
||||
user.visible_message(message, ignored_mobs = user.get_unconsenting())
|
||||
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/oral1.ogg',
|
||||
'modular_sand/sound/interactions/oral2.ogg'), 70, 1, -1)
|
||||
|
||||
switch(milkers.size)
|
||||
if("c", "d", "e")
|
||||
modifier = 2
|
||||
if("f", "g", "h")
|
||||
modifier = 3
|
||||
else
|
||||
if(milkers.size in milkers.breast_values)
|
||||
modifier = clamp(milkers.breast_values[milkers.size] - 5, 0, INFINITY)
|
||||
else
|
||||
modifier = 1
|
||||
target.reagents.add_reagent(milktype, rand(1,3 * modifier))
|
||||
|
||||
/datum/interaction/lewd/titgrope
|
||||
command = "titgrope"
|
||||
description = "Grope their breasts."
|
||||
require_user_hands = TRUE
|
||||
require_target_breasts = REQUIRE_ANY
|
||||
write_log_user = "groped"
|
||||
write_log_target = "was groped by"
|
||||
interaction_sound = null
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/titgrope/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
|
||||
if(user.a_intent == INTENT_HELP)
|
||||
user.visible_message(
|
||||
pick("<span class='lewd'>\The <b>[user]</b> gently gropes \the <b>[target]</b>'s breast.</span>",
|
||||
"<span class='lewd'>\The <b>[user]</b> softly squeezes \the <b>[target]</b>'s breasts.</span>",
|
||||
"<span class='lewd'>\The <b>[user]</b> grips \the <b>[target]</b>'s breasts.</span>",
|
||||
"<span class='lewd'>\The <b>[user]</b> runs a few fingers over \the <b>[target]</b>'s breast.</span>",
|
||||
"<span class='lewd'>\The <b>[user]</b> delicately teases \the <b>[target]</b>'s nipple.</span>",
|
||||
"<span class='lewd'>\The <b>[user]</b> traces a touch across \the <b>[target]</b>'s breast.</span>"))
|
||||
if(user.a_intent == INTENT_HARM)
|
||||
user.visible_message(
|
||||
pick("<span class='lewd'>\The <b>[user]</b> aggressively gropes \the <b>[target]</b>'s breast.</span>",
|
||||
"<span class='lewd'>\The <b>[user]</b> grabs \the <b>[target]</b>'s breasts.</span>",
|
||||
"<span class='lewd'>\The <b>[user]</b> tightly squeezes \the <b>[target]</b>'s breasts.</span>",
|
||||
"<span class='lewd'>\The <b>[user]</b> slaps at \the <b>[target]</b>'s breasts.</span>",
|
||||
"<span class='lewd'>\The <b>[user]</b> gropes \the <b>[target]</b>'s breasts roughly.</span>"))
|
||||
if(prob(5 + target.get_lust()))
|
||||
if(target.a_intent == INTENT_HELP)
|
||||
user.visible_message(
|
||||
pick("<span class='lewd'>\The <b>[target]</b> shivers in arousal.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> moans quietly.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> breathes out a soft moan.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> gasps.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> shudders softly.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> trembles as hands run across bare skin.</span>"))
|
||||
if(target.get_lust() < 5)
|
||||
target.set_lust(5)
|
||||
if(target.a_intent == INTENT_DISARM)
|
||||
if (target.restrained())
|
||||
user.visible_message(
|
||||
pick("<span class='lewd'>\The <b>[target]</b> twists playfully against the restraints.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> squirms away from <b>[user]</b>'s hand.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> slides back from <b>[user]</b>'s roaming hand.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> thrusts bare breasts forward into <b>[user]</b>'s hands.</span>"))
|
||||
else
|
||||
user.visible_message(
|
||||
pick("<span class='lewd'>\The <b>[target]</b> playfully bats at <b>[user]</b>'s hand.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> squirms away from <b>[user]</b>'s hand.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> guides <b>[user]</b>'s hand across bare breasts.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> teasingly laces a few fingers over <b>[user]</b>'s knuckles.</span>"))
|
||||
if(target.get_lust() < 10)
|
||||
target.add_lust(1)
|
||||
if(target.a_intent == INTENT_GRAB)
|
||||
user.visible_message(
|
||||
pick("<span class='lewd'>\The <b>[target]</b> grips <b>[user]</b>'s wrist tight.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> digs nails into <b>[user]</b>'s arm.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> grabs <b>[user]</b>'s wrist for a second.</span>"))
|
||||
if(target.a_intent == INTENT_HARM)
|
||||
user.adjustBruteLoss(1)
|
||||
user.visible_message(
|
||||
pick("<span class='lewd'>\The <b>[target]</b> pushes <b>[user]</b> roughly away.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> digs nails angrily into <b>[user]</b>'s arm.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> fiercely struggles against <b>[user]</b>.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> claws <b>[user]</b>'s forearm, drawing blood.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> slaps <b>[user]</b>'s hand away.</span>"))
|
||||
return
|
||||
@@ -0,0 +1,48 @@
|
||||
/datum/interaction/lewd/earfuck
|
||||
command = "earfuck"
|
||||
description = "Fuck their ear."
|
||||
interaction_sound = null
|
||||
require_user_penis = REQUIRE_EXPOSED
|
||||
require_target_ears = REQUIRE_EXPOSED
|
||||
max_distance = 1
|
||||
write_log_user = "earfucked"
|
||||
write_log_target = "had their ear fucked by"
|
||||
extreme = TRUE
|
||||
|
||||
/datum/interaction/lewd/earfuck/earsocketfuck
|
||||
command = "earsocketfuck"
|
||||
description = "Fuck their earsocket."
|
||||
require_target_ears = null
|
||||
require_target_earsockets = REQUIRE_EXPOSED
|
||||
write_log_user = "earsocket fucked"
|
||||
write_log_target = "had their earsocket fucked by"
|
||||
|
||||
/datum/interaction/lewd/earfuck/display_interaction(mob/living/user, mob/living/partner)
|
||||
var/message
|
||||
|
||||
var/u_His = user.p_their()
|
||||
|
||||
if(user.is_fucking(partner, CUM_TARGET_EARS))
|
||||
message = "[pick(
|
||||
"pounds into \the <b>[partner]</b>'s [partner.has_ears() ? "ear":"earsocker"].",
|
||||
"shoves [u_His] dick deep into \the <b>[partner]</b>'s skull",
|
||||
"thrusts in and out of \the <b>[partner]</b>'s [partner.has_ears() ? "ear":"eyesocket"].",
|
||||
"goes balls deep into \the <b>[partner]</b>'s cranium over and over again.")]"
|
||||
var/client/cli = partner.client
|
||||
var/mob/living/carbon/C = partner
|
||||
if(cli && istype(C))
|
||||
if(cli.prefs.extremeharm != "No")
|
||||
if(prob(15))
|
||||
C.bleed(2)
|
||||
if(prob(25))
|
||||
C.adjustOrganLoss(ORGAN_SLOT_EARS, rand(3,7))
|
||||
C.adjustOrganLoss(ORGAN_SLOT_BRAIN, rand(3,7))
|
||||
else
|
||||
message = "forcefully slides [u_His] cock inside \the <b>[partner]</b>'s [partner.has_ears() ? "ear":"earsocket"]."
|
||||
user.set_is_fucking(partner, CUM_TARGET_EARS, user.getorganslot(ORGAN_SLOT_PENIS))
|
||||
|
||||
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/champ1.ogg',
|
||||
'modular_sand/sound/interactions/champ2.ogg'), 50, 1, -1)
|
||||
user.visible_message(message = "<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting(TRUE))
|
||||
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_EARS, partner)
|
||||
partner.handle_post_sex(LOW_LUST, null, user)
|
||||
@@ -0,0 +1,48 @@
|
||||
/datum/interaction/lewd/eyefuck
|
||||
command = "eyefuck"
|
||||
description = "Fuck their eye."
|
||||
interaction_sound = null
|
||||
require_user_penis = REQUIRE_EXPOSED
|
||||
require_target_eyes = REQUIRE_EXPOSED
|
||||
max_distance = 1
|
||||
write_log_user = "eyefucked"
|
||||
write_log_target = "had their eye fucked by"
|
||||
extreme = TRUE
|
||||
|
||||
/datum/interaction/lewd/eyefuck/eyesocketfuck
|
||||
command = "eyesocketfuck"
|
||||
description = "Fuck their eyesocket."
|
||||
require_target_eyes = null
|
||||
require_target_eyesockets = REQUIRE_EXPOSED
|
||||
write_log_user = "eyesocketfucked"
|
||||
write_log_target = "had their eyesocket fucked by"
|
||||
|
||||
/datum/interaction/lewd/eyefuck/display_interaction(mob/living/user, mob/living/partner)
|
||||
var/message
|
||||
|
||||
var/u_His = user.p_their()
|
||||
|
||||
if(user.is_fucking(partner, CUM_TARGET_EYES))
|
||||
message = "[pick(
|
||||
"pounds into \the <b>[partner]</b>'s [partner.has_eyes() ? "eye":"eyesocket"].",
|
||||
"shoves [u_His] dick deep into \the <b>[partner]</b>'s skull",
|
||||
"thrusts in and out of \the <b>[partner]</b>'s [partner.has_eyes() ? "eye":"eyesocket"].",
|
||||
"goes balls deep into \the <b>[partner]</b>'s cranium over and over again.")]"
|
||||
var/client/cli = partner.client
|
||||
var/mob/living/carbon/C = partner
|
||||
if(cli && istype(C))
|
||||
if(cli.prefs.extremeharm != "No")
|
||||
if(prob(15))
|
||||
C.bleed(2)
|
||||
if(prob(25))
|
||||
C.adjustOrganLoss(ORGAN_SLOT_EYES,rand(3,7))
|
||||
C.adjustOrganLoss(ORGAN_SLOT_BRAIN, rand(3,7))
|
||||
else
|
||||
message = "forcefully slides [u_His] cock inbetween \the <b>[partner]</b>'s [partner.has_eyes() ? "eyelid":"eyesocket"]."
|
||||
user.set_is_fucking(partner, CUM_TARGET_EYES, user.getorganslot(ORGAN_SLOT_PENIS))
|
||||
|
||||
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/champ1.ogg',
|
||||
'modular_sand/sound/interactions/champ2.ogg'), 50, 1, -1)
|
||||
user.visible_message("<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting(TRUE))
|
||||
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_EYES, partner)
|
||||
partner.handle_post_sex(LOW_LUST, null, user)
|
||||
@@ -0,0 +1,163 @@
|
||||
/datum/interaction/lewd/facefuck
|
||||
command = "facefuck"
|
||||
description = "Fuck their mouth using your penis"
|
||||
interaction_sound = null
|
||||
require_target_mouth = TRUE
|
||||
require_user_penis = REQUIRE_EXPOSED
|
||||
max_distance = 1
|
||||
var/fucktarget = "penis"
|
||||
|
||||
/datum/interaction/lewd/facefuck/vag
|
||||
command = "facefuckvag"
|
||||
description = "Fuck their mouth using your vagina"
|
||||
require_user_penis = null
|
||||
require_user_vagina = REQUIRE_EXPOSED
|
||||
fucktarget = "vagina"
|
||||
|
||||
/datum/interaction/lewd/facefuck/display_interaction(mob/living/user, mob/living/partner)
|
||||
var/message
|
||||
var/obj/item/organ/genital/genital = null
|
||||
var/retaliation_message = FALSE
|
||||
|
||||
var/u_His = user.p_their()
|
||||
var/t_Him = partner.p_them()
|
||||
var/t_Hes = partner.p_theyre()
|
||||
|
||||
if(user.is_fucking(partner, CUM_TARGET_MOUTH))
|
||||
var/improv = FALSE
|
||||
switch(fucktarget)
|
||||
if("vagina")
|
||||
if(user.has_vagina())
|
||||
message = pick(
|
||||
"grinds [u_His] pussy into \the <b>[partner]</b>'s face.",
|
||||
"grips the back of \the <b>[partner]</b>'s head, forcing [t_Him] onto [u_His] pussy.",
|
||||
"rolls [u_His] pussy against \the <b>[partner]</b>'s tongue.",
|
||||
"slides \the <b>[partner]</b>'s mouth between [u_His] legs.",
|
||||
"looks \the <b>[partner]</b>'s in the eyes as [u_His] pussy presses into a waiting tongue.",
|
||||
"sways [u_His] hips, pushing [u_His] sex into \the <b>[partner]</b>'s face.",
|
||||
)
|
||||
if(partner.a_intent == INTENT_HARM)
|
||||
// adjustBruteLoss(5)
|
||||
retaliation_message = pick(
|
||||
"looks deeply displeased to be there.",
|
||||
"struggles to escape from between \the [user]'s thighs.",
|
||||
)
|
||||
else
|
||||
improv = TRUE
|
||||
if("penis")
|
||||
if(user.has_penis())
|
||||
message = pick(
|
||||
"roughly fucks \the <b>[partner]</b>'s mouth.",
|
||||
"forces [u_His] cock down \the <b>[partner]</b>'s throat.",
|
||||
"pushes in against \the <b>[partner]</b>'s tongue until a tight gagging sound comes.",
|
||||
"grips \the <b>[partner]</b>'s hair and draws [t_Him] to the base of the cock.",
|
||||
"looks \the <b>[partner]</b>'s in the eyes as [u_His] cock presses into a waiting tongue.",
|
||||
"rolls [u_His] hips hard, sinking into \the <b>[partner]</b>'s mouth.",
|
||||
)
|
||||
if(partner.a_intent == INTENT_HARM)
|
||||
// adjustBruteLoss(5)
|
||||
retaliation_message = pick(
|
||||
"stares up from between \the [user]'s knees, trying to squirm away.",
|
||||
"struggles to escape from between \the [user]'s legs.",
|
||||
)
|
||||
else
|
||||
improv = TRUE
|
||||
if(improv)
|
||||
message = pick(
|
||||
"grinds against \the <b>[partner]</b>'s face.",
|
||||
"feels \the <b>[partner]</b>'s face between bare legs.",
|
||||
"pushes in against \the <b>[partner]</b>'s tongue.",
|
||||
"grips \the <b>[partner]</b>'s hair, drawing [t_Him] into the strangely sexless spot between [u_His] legs.",
|
||||
"looks \the <b>[partner]</b>'s in the eyes as [t_Hes] caught beneath two thighs.",
|
||||
"rolls [u_His] hips hard against \the <b>[partner]</b>'s face.",
|
||||
)
|
||||
if(partner.a_intent == INTENT_HARM)
|
||||
// adjustBruteLoss(5)
|
||||
retaliation_message = pick(
|
||||
"stares up from between \the [user]'s knees, trying to squirm away.",
|
||||
"struggles to escape from between \the [user]'s legs.",
|
||||
)
|
||||
else
|
||||
var/improv = FALSE
|
||||
switch(fucktarget)
|
||||
if("vagina")
|
||||
if(user.has_vagina())
|
||||
message = "forces \the <b>[partner]</b>'s face into [u_His] pussy."
|
||||
else
|
||||
improv = TRUE
|
||||
if("penis")
|
||||
if(user.has_penis())
|
||||
if(user.is_fucking(partner, CUM_TARGET_THROAT))
|
||||
message = "retracts [u_His] cock from \the <b>[partner]</b>'s throat"
|
||||
else
|
||||
message = "shoves [u_His] cock into \the <b>[partner]</b>'s mouth"
|
||||
else
|
||||
improv = TRUE
|
||||
if(improv)
|
||||
message = "shoves [u_His] crotch into \the <b>[partner]</b>'s face."
|
||||
else
|
||||
switch(fucktarget)
|
||||
if("vagina")
|
||||
genital = partner.getorganslot(ORGAN_SLOT_VAGINA)
|
||||
if("penis")
|
||||
genital = partner.getorganslot(ORGAN_SLOT_PENIS)
|
||||
user.set_is_fucking(partner, CUM_TARGET_MOUTH, genital)
|
||||
|
||||
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/oral1.ogg',
|
||||
'modular_sand/sound/interactions/oral2.ogg'), 70, 1, -1)
|
||||
user.visible_message("<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
|
||||
if(retaliation_message)
|
||||
user.visible_message("<font color=red><b>\The <b>[partner]</b></b> [retaliation_message]</span>", ignored_mobs = user.get_unconsenting())
|
||||
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_MOUTH, partner)
|
||||
|
||||
/datum/interaction/lewd/throatfuck
|
||||
command = "throatfuck"
|
||||
description = "Fuck their throat. | Does oxy damage."
|
||||
interaction_sound = null
|
||||
require_user_penis = REQUIRE_EXPOSED
|
||||
require_target_mouth = TRUE
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/throatfuck/display_interaction(mob/living/user, mob/living/partner)
|
||||
var/message
|
||||
var/obj/item/organ/genital/genital = null
|
||||
var/retaliation_message = FALSE
|
||||
|
||||
var/u_His = user.p_their()
|
||||
var/t_His = partner.p_their()
|
||||
var/t_Him = partner.p_them()
|
||||
|
||||
if(user.is_fucking(partner, CUM_TARGET_THROAT))
|
||||
message = "[pick(
|
||||
"brutally shoves [u_His] cock into \the <b>[partner]</b>'s throat to make [t_Him] gag.",
|
||||
"chokes \the <b>[partner]</b> on [u_His] dick, going in balls deep.",
|
||||
"slams in and out of \the <b>[partner]</b>'s mouth, [u_His] balls slapping off [t_His] face.")]"
|
||||
if(rand(3))
|
||||
partner.emote("chokes on \the [user]")
|
||||
if(prob(1) && istype(partner))
|
||||
partner.adjustOxyLoss(5)
|
||||
if(partner.a_intent == INTENT_HARM)
|
||||
// adjustBruteLoss(5)
|
||||
retaliation_message = pick(
|
||||
"stares up from between \the [user]'s knees, trying to squirm away.",
|
||||
"struggles to escape from between \the [user]'s legs.",
|
||||
)
|
||||
else if(user.is_fucking(partner, CUM_TARGET_MOUTH))
|
||||
message = "thrusts deeper into \the <b>[partner]</b>'s mouth and down [t_His] throat."
|
||||
var/check = user.getorganslot(ORGAN_SLOT_PENIS)
|
||||
if(check)
|
||||
genital = check
|
||||
user.set_is_fucking(partner, CUM_TARGET_THROAT, genital)
|
||||
else
|
||||
message = "forces [u_His] dick deep down \the <b>[partner]</b>'s throat"
|
||||
var/check = user.getorganslot(ORGAN_SLOT_PENIS)
|
||||
if(check)
|
||||
genital = check
|
||||
user.set_is_fucking(partner, CUM_TARGET_THROAT, genital)
|
||||
|
||||
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/oral1.ogg',
|
||||
'modular_sand/sound/interactions/oral2.ogg'), 70, 1, -1)
|
||||
user.visible_message(message = "<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
|
||||
if(retaliation_message)
|
||||
user.visible_message(message = "<font color=red><b>\The <b>[partner]</b></b> [retaliation_message]</span>", ignored_mobs = user.get_unconsenting())
|
||||
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_THROAT, partner)
|
||||
@@ -0,0 +1,202 @@
|
||||
/datum/interaction/lewd/grindface
|
||||
command = "grindface"
|
||||
description = "Feet grind their face."
|
||||
interaction_sound = null
|
||||
require_target_mouth = TRUE
|
||||
require_user_num_feet = 1
|
||||
require_user_feet = REQUIRE_ANY
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/grindface/display_interaction(mob/living/user, mob/living/partner)
|
||||
var/message
|
||||
|
||||
var/u_His = user.p_their()
|
||||
var/t_His = partner.p_their()
|
||||
|
||||
var/shoes = user.get_shoes()
|
||||
|
||||
if(user.is_fucking(partner, GRINDING_FACE_WITH_FEET))
|
||||
if(shoes)
|
||||
message = "[pick(list("grinds [u_His] [shoes] into <b>[partner]</b>'s face.",
|
||||
"presses [u_His] footwear down hard on <b>[partner]</b>'s face.",
|
||||
"rubs off the dirt from [u_His] [shoes] onto <b>[partner]</b>'s face."))]</span>"
|
||||
else
|
||||
message = "[pick(list("grinds [u_His] bare feet into <b>[partner]</b>'s face.",
|
||||
"deviously covers <b>[partner]</b>'s mouth and nose with [u_His] bare feet.",
|
||||
"runs the soles of [u_His] bare feet against <b>[partner]</b>'s lips."))]</span>"
|
||||
|
||||
else if(user.is_fucking(partner, GRINDING_MOUTH_WITH_FEET))
|
||||
if(shoes)
|
||||
message = "[pick(list("pulls [u_His] [shoes] out of <b>[partner]</b>'s mouth and puts them on [t_His] face.",
|
||||
"slowly retracts [u_His] [shoes] from <b>[partner]</b>'s mouth, putting them on [t_His] face instead."))]</span>"
|
||||
else
|
||||
message = "[pick(list("pulls [u_His] bare feet out of <b>[partner]</b>'s mouth and rests them on [t_His] face instead.",
|
||||
"retracts [u_His] bare feet from <b>[partner]</b>'s mouth and grinds them into [t_His] face instead."))]</span>"
|
||||
|
||||
user.set_is_fucking(partner, GRINDING_FACE_WITH_FEET, null)
|
||||
|
||||
else
|
||||
if(shoes)
|
||||
message = "[pick(list("plants [u_His] [shoes] ontop of <b>[partner]</b>'s face.",
|
||||
"rests [u_His] [shoes] on <b>[partner]</b>'s face and presses down hard.",
|
||||
"harshly places [u_His] [shoes] atop <b>[partner]</b>'s face."))]</span>"
|
||||
else
|
||||
message = "[pick(list("plants [u_His] bare feet ontop of <b>[partner]</b>'s face.",
|
||||
"rests [u_His] feet on <b>[partner]</b>'s face, smothering them.",
|
||||
"positions [u_His] bare feet atop <b>[partner]</b>'s face."))]</span>"
|
||||
|
||||
user.set_is_fucking(partner, GRINDING_FACE_WITH_FEET, null)
|
||||
|
||||
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/foot_dry1.ogg',
|
||||
'modular_sand/sound/interactions/foot_dry2.ogg',
|
||||
'modular_sand/sound/interactions/foot_dry3.ogg',
|
||||
'modular_sand/sound/interactions/foot_dry4.ogg'), 70, 1, -1)
|
||||
user.visible_message(message = "<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
|
||||
partner.handle_post_sex(LOW_LUST, null, user)
|
||||
|
||||
/datum/interaction/lewd/grindmouth
|
||||
command = "grindmouth"
|
||||
description = "Feet grind their mouth."
|
||||
interaction_sound = null
|
||||
require_target_mouth = TRUE
|
||||
require_user_num_feet = 1
|
||||
require_user_feet = REQUIRE_ANY
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/grindmouth/display_interaction(mob/living/user, mob/living/partner)
|
||||
var/message
|
||||
|
||||
var/u_His = user.p_their()
|
||||
var/t_His = partner.p_their()
|
||||
var/t_Him = partner.p_them()
|
||||
var/t_He = partner.p_they()
|
||||
var/t_S = partner.p_s()
|
||||
|
||||
var/shoes = user.get_shoes()
|
||||
|
||||
if(user.is_fucking(partner, GRINDING_MOUTH_WITH_FEET))
|
||||
if(shoes)
|
||||
message = "[pick(list("roughly shoves [u_His] [shoes] deeper into <b>[partner]</b>'s mouth.",
|
||||
"harshly forces another inch of [u_His] [shoes] into <b>[partner]</b>'s mouth.",
|
||||
"presses [u_His] weight down, [u_His] [shoes] prying deeper into <b>[partner]</b>'s mouth."))]</span>"
|
||||
else
|
||||
message = "[pick(list("wiggles [u_His] toes deep inside <b>[partner]</b>'s mouth.",
|
||||
"crams [u_His] barefeet down deeper into <b>[partner]</b>'s mouth, making [t_Him] gag.",
|
||||
"roughly grinds [u_His] feet on <b>[partner]</b>'s tongue."))]</span>"
|
||||
|
||||
else if(user.is_fucking(partner, GRINDING_FACE_WITH_FEET))
|
||||
if(shoes)
|
||||
message = "[pick(list("decides to force [u_His] [shoes] deep into <b>[partner]</b>'s mouth.",
|
||||
"pressed the tip of [u_His] [shoes] against <b>[partner]</b>'s lips and shoves inwards."))]</span>"
|
||||
else
|
||||
message = "[pick(list("pries open <b>[partner]</b>'s mouth with [u_His] toes and shoves [u_His] bare foot in.",
|
||||
"presses down [u_His] foot even harder, cramming [u_His] foot into <b>[partner]</b>'s mouth."))]</span>"
|
||||
|
||||
user.set_is_fucking(partner, GRINDING_MOUTH_WITH_FEET, null)
|
||||
|
||||
else
|
||||
if(shoes)
|
||||
message = "[pick(list("readies themselves and in one swift motion, shoves [u_His] [shoes] into <b>[partner]</b>'s mouth.",
|
||||
"grinds the tip of [u_His] [shoes] against <b>[partner]</b>'s mouth before pushing themselves in."))]</span>"
|
||||
else
|
||||
message = "[pick(list("rubs [u_His] dirty bare feet across <b>[partner]</b>'s face before prying them into [t_His] muzzle.",
|
||||
"forces [u_His] barefeet into <b>[partner]</b>'s mouth.",
|
||||
"covers <b>[partner]</b>'s mouth and nose with [u_His] foot until [t_He] gasp[t_S] for breath, then shoves both feet inside before [t_He] can react."))]</span>"
|
||||
user.set_is_fucking(partner, GRINDING_MOUTH_WITH_FEET, null)
|
||||
|
||||
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/foot_wet1.ogg',
|
||||
'modular_sand/sound/interactions/foot_wet2.ogg',
|
||||
'modular_sand/sound/interactions/foot_wet3.ogg'), 70, 1, -1)
|
||||
user.visible_message(message = "<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
|
||||
partner.handle_post_sex(LOW_LUST, null, user)
|
||||
|
||||
/datum/interaction/lewd/footjob
|
||||
command = "footjob"
|
||||
description = "Jerk them off with your foot."
|
||||
interaction_sound = null
|
||||
require_user_num_feet = 1
|
||||
require_user_feet = REQUIRE_ANY
|
||||
require_target_penis = REQUIRE_EXPOSED
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/footjob/display_interaction(mob/living/user, mob/living/partner)
|
||||
var/message
|
||||
|
||||
var/u_His = user.p_their()
|
||||
|
||||
var/shoes = user.get_shoes(TRUE)
|
||||
|
||||
if(partner.is_fucking(src, CUM_TARGET_FEET))
|
||||
message = "[pick("jerks \the <b>[partner]</b> off with [u_His] [shoes ? shoes : pick("foot", "sole")].",
|
||||
"rubs [u_His] [shoes ? shoes : pick("foot", "sole", "toes")] on \the <b>[partner]</b>'s shaft.",
|
||||
"works [u_His] [shoes ? shoes : pick("foot", "sole")] up and down on \the <b>[partner]</b>'s cock.")]"
|
||||
else
|
||||
message = "[pick("[shoes ? "positions [u_His] [shoes] on" :"positions [u_His] foot on"] \the <b>[partner]</b>'s cock.",
|
||||
"starts playing around with \the <b>[partner]</b>'s cock, using [u_His] [shoes ? shoes :"foot"].")]"
|
||||
partner.set_is_fucking(user, CUM_TARGET_FEET, partner.getorganslot(ORGAN_SLOT_PENIS))
|
||||
|
||||
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/foot_dry1.ogg',
|
||||
'modular_sand/sound/interactions/foot_dry3.ogg',
|
||||
'modular_sand/sound/interactions/foot_wet1.ogg',
|
||||
'modular_sand/sound/interactions/foot_wet2.ogg'), 70, 1, -1)
|
||||
user.visible_message(message = "<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
|
||||
partner.handle_post_sex(NORMAL_LUST, CUM_TARGET_FEET, user)
|
||||
|
||||
/datum/interaction/lewd/footjob/double
|
||||
command = "footjob_double"
|
||||
description = "Jerk them off with both of your feet."
|
||||
require_user_num_feet = 2
|
||||
|
||||
/datum/interaction/lewd/footjob/double/display_interaction(mob/living/user, mob/living/partner)
|
||||
var/message
|
||||
|
||||
var/u_His = user.p_their()
|
||||
|
||||
var/shoes = user.get_shoes()
|
||||
|
||||
if(partner.is_fucking(user, CUM_TARGET_FEET))
|
||||
message = "[pick("jerks \the <b>[partner]</b> off with [u_His] [shoes ? shoes : pick("feet", "soles")].",
|
||||
"rubs [u_His] [shoes ? shoes : pick("feet", "soles")] on \the <b>[partner]</b>'s shaft.",
|
||||
"rubs [shoes ? "[u_His] [shoes]" : "all of [u_His] toes"] on \the <b>[partner]</b>'s cock.",
|
||||
"works [u_His] [shoes ? shoes : pick("feet", "soles")] up and down on \the <b>[partner]</b>'s cock.")]"
|
||||
else
|
||||
message = "[pick("[shoes ? "wraps [u_His] [shoes] around" : "wraps [u_His] [pick("feet", "soles")] around"] \the <b>[partner]</b>'s cock.",
|
||||
"starts playing around with \the <b>[partner]</b>'s cock, using [u_His] [shoes ? shoes : "feet"].")]"
|
||||
partner.set_is_fucking(user, CUM_TARGET_FEET, partner.getorganslot(ORGAN_SLOT_PENIS))
|
||||
|
||||
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/foot_dry1.ogg',
|
||||
'modular_sand/sound/interactions/foot_dry3.ogg',
|
||||
'modular_sand/sound/interactions/foot_wet1.ogg',
|
||||
'modular_sand/sound/interactions/foot_wet2.ogg'), 70, 1, -1)
|
||||
user.visible_message(message = "<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
|
||||
partner.handle_post_sex(NORMAL_LUST, CUM_TARGET_FEET, user)
|
||||
|
||||
/datum/interaction/lewd/footjob/vagina
|
||||
command = "footjob_vaginal"
|
||||
description = "Rub their vagina with your foot."
|
||||
require_target_vagina = REQUIRE_EXPOSED
|
||||
require_target_penis = null
|
||||
|
||||
/datum/interaction/lewd/footjob/vagina/display_interaction(mob/living/user, mob/living/partner)
|
||||
var/message
|
||||
|
||||
var/u_His = user.p_their()
|
||||
|
||||
var/shoes = partner.get_shoes(TRUE)
|
||||
|
||||
if(partner.is_fucking(user, CUM_TARGET_FEET))
|
||||
message = "[pick("rubs \the <b>[partner]</b> clit with [u_His] [shoes ? shoes : pick("foot", "sole")].",
|
||||
"rubs [u_His] [shoes ? shoes : pick("foot", "sole", "toes")] on \the <b>[partner]</b>'s coochie.",
|
||||
"rubs [u_His] [shoes ? shoes : pick("foot", "sole", "toes")] on \the <b>[partner]</b>'s vagina.",
|
||||
"rubs [u_His] foot up and down on \the <b>[partner]</b>'s pussy.")]"
|
||||
else
|
||||
message = "[pick("[shoes ? "positions [u_His] [shoes] on" : "positions [u_His] foot on"] \the <b>[partner]</b>'s pussy.",
|
||||
"starts playing around with \the <b>[partner]</b>'s pussy, using [u_His] [shoes ? shoes : "foot"].")]"
|
||||
partner.set_is_fucking(user, CUM_TARGET_FEET, partner.getorganslot(ORGAN_SLOT_VAGINA))
|
||||
|
||||
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/foot_dry1.ogg',
|
||||
'modular_sand/sound/interactions/foot_dry3.ogg',
|
||||
'modular_sand/sound/interactions/foot_wet1.ogg',
|
||||
'modular_sand/sound/interactions/foot_wet2.ogg'), 70, 1, -1)
|
||||
user.visible_message(message = "<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
|
||||
partner.handle_post_sex(NORMAL_LUST, CUM_TARGET_FEET, user)
|
||||
@@ -0,0 +1,29 @@
|
||||
/datum/interaction/lewd/finger
|
||||
command = "finger"
|
||||
description = "Finger their pussy."
|
||||
require_user_hands = TRUE
|
||||
require_target_vagina = REQUIRE_EXPOSED
|
||||
interaction_sound = null
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/finger/display_interaction(mob/living/user, mob/living/partner)
|
||||
user.visible_message(message = "<span class='lewd'><b>\The [user]</b> [pick("fingers \the <b>[partner]</b>.",
|
||||
"fingers \the <b>[partner]</b>'s pussy.",
|
||||
"fingers \the <b>[partner]</b> hard.")]</span>", ignored_mobs = user.get_unconsenting())
|
||||
playlewdinteractionsound(get_turf(user), 'modular_sand/sound/interactions/champ_fingering.ogg', 50, 1, -1)
|
||||
partner.handle_post_sex(NORMAL_LUST, null, user)
|
||||
|
||||
/datum/interaction/lewd/fingerass
|
||||
command = "fingerm"
|
||||
description = "Finger their ass."
|
||||
interaction_sound = null
|
||||
require_user_hands = TRUE
|
||||
require_target_anus = REQUIRE_EXPOSED
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/fingerass/display_interaction(mob/living/user, mob/living/partner)
|
||||
user.visible_message("<span class='lewd'><b>\The [user]</b> [pick("fingers \the <b>[partner]</b>.",
|
||||
"fingers \the <b>[partner]</b>'s asshole.",
|
||||
"fingers \the <b>[partner]</b> hard.")]</span>", ignored_mobs = user.get_unconsenting())
|
||||
playlewdinteractionsound(get_turf(user), 'modular_sand/sound/interactions/champ_fingering.ogg', 50, 1, -1)
|
||||
partner.handle_post_sex(NORMAL_LUST, null, user)
|
||||
@@ -0,0 +1,47 @@
|
||||
/datum/interaction/lewd/frotting
|
||||
command = "frotting"
|
||||
description = "Rub your penis against theirs"
|
||||
require_user_penis = REQUIRE_EXPOSED
|
||||
require_target_penis = REQUIRE_EXPOSED
|
||||
max_distance = 1
|
||||
write_log_user = "frotted"
|
||||
write_log_target = "was frotted by"
|
||||
interaction_sound = null
|
||||
|
||||
/datum/interaction/lewd/frotting/display_interaction(mob/living/user, mob/living/partner)
|
||||
var/message
|
||||
var/t_His = user.p_their()
|
||||
|
||||
message = "rubs [t_His] penis against [partner]'s."
|
||||
user.set_is_fucking(partner, CUM_TARGET_PENIS, user.getorganslot(ORGAN_SLOT_PENIS))
|
||||
user.visible_message("<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
|
||||
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_PENIS, partner)
|
||||
partner.handle_post_sex(NORMAL_LUST, CUM_TARGET_PENIS, user)
|
||||
|
||||
/datum/interaction/lewd/tribadism
|
||||
command = "tribadism"
|
||||
description = "Grind your pussy against theirs."
|
||||
interaction_sound = null
|
||||
require_target_vagina = REQUIRE_EXPOSED
|
||||
require_user_vagina = REQUIRE_EXPOSED
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/tribadism/display_interaction(mob/living/user, mob/living/partner)
|
||||
var/message
|
||||
|
||||
var/u_His = user.p_their()
|
||||
|
||||
if(partner.is_fucking(user, CUM_TARGET_VAGINA))
|
||||
message = "[pick("grinds [u_His] pussy against \the <b>[partner]</b>'s cunt.",
|
||||
"rubs [u_His] cunt against \the <b>[partner]</b>'s pussy.",
|
||||
"thrusts against \the <b>[partner]</b>'s pussy.",
|
||||
"humps \the <b>[partner]</b>, [u_His] pussies grinding against each other.")]"
|
||||
else
|
||||
message = "presses [u_His] pussy into \the <b>[partner]</b>'s own."
|
||||
partner.set_is_fucking(user, CUM_TARGET_VAGINA, partner.getorganslot(ORGAN_SLOT_VAGINA))
|
||||
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/squelch1.ogg',
|
||||
'modular_sand/sound/interactions/squelch2.ogg',
|
||||
'modular_sand/sound/interactions/squelch3.ogg'), 70, 1, -1)
|
||||
user.visible_message("<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
|
||||
partner.handle_post_sex(NORMAL_LUST, CUM_TARGET_VAGINA, user)
|
||||
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_VAGINA, partner)
|
||||
@@ -0,0 +1,187 @@
|
||||
/datum/interaction/lewd/fuck
|
||||
command = "fuckvag"
|
||||
description = "Fuck their pussy."
|
||||
require_user_penis = REQUIRE_EXPOSED
|
||||
require_target_vagina = REQUIRE_EXPOSED
|
||||
write_log_user = "fucked"
|
||||
write_log_target = "was fucked by"
|
||||
interaction_sound = null
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/fuck/display_interaction(mob/living/user, mob/living/partner)
|
||||
var/message
|
||||
|
||||
var/u_His = user.p_their()
|
||||
|
||||
if(user.is_fucking(partner, CUM_TARGET_VAGINA))
|
||||
message = "[pick(
|
||||
"pounds \the <b>[partner]</b>'s pussy.",
|
||||
"shoves [u_His] dick deep into \the <b>[partner]</b>'s pussy",
|
||||
"thrusts in and out of \the <b>[partner]</b>'s cunt.",
|
||||
"goes balls deep into \the <b>[partner]</b>'s pussy over and over again.")]"
|
||||
else
|
||||
message = "slides [u_His] cock into \the <b>[partner]</b>'s pussy."
|
||||
user.set_is_fucking(partner, CUM_TARGET_VAGINA, user.getorganslot(ORGAN_SLOT_PENIS))
|
||||
|
||||
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/champ1.ogg',
|
||||
'modular_sand/sound/interactions/champ2.ogg'), 50, 1, -1)
|
||||
user.visible_message("<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
|
||||
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_VAGINA, partner)
|
||||
partner.handle_post_sex(NORMAL_LUST, CUM_TARGET_PENIS, user)
|
||||
|
||||
/datum/interaction/lewd/fuck/anal
|
||||
command = "fuckass"
|
||||
description = "Fuck their ass."
|
||||
require_target_vagina = null
|
||||
require_target_anus = REQUIRE_EXPOSED
|
||||
|
||||
/datum/interaction/lewd/fuck/anal/display_interaction(mob/living/user, mob/living/partner)
|
||||
var/message
|
||||
|
||||
var/u_His = user.p_their()
|
||||
var/t_His = partner.p_their()
|
||||
|
||||
if(user.is_fucking(partner, CUM_TARGET_ANUS))
|
||||
message = "[pick(
|
||||
"thrusts in and out of \the <b>[partner]</b>'s ass.",
|
||||
"pounds \the <b>[partner]</b>'s ass.",
|
||||
"slams [u_His] hips up against \the <b>[partner]</b>'s ass hard.",
|
||||
"goes balls deep into \the <b>[partner]</b>'s ass over and over again.")]"
|
||||
else
|
||||
message = "[pick(
|
||||
"works [u_His] cock into \the <b>[partner]</b>'s asshole.",
|
||||
"grabs the base of [u_His] twitching cock and presses the tip into \the <b>[partner]</b>'s asshole.",
|
||||
"shoves [u_His] dick deep inside of \the <b>[partner]</b>'s ass, making [t_His] rear jiggle.")]"
|
||||
user.set_is_fucking(partner, CUM_TARGET_ANUS, user.getorganslot(ORGAN_SLOT_PENIS))
|
||||
|
||||
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/bang1.ogg',
|
||||
'modular_sand/sound/interactions/bang2.ogg',
|
||||
'modular_sand/sound/interactions/bang3.ogg'), 70, 1, -1)
|
||||
user.visible_message("<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
|
||||
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_ANUS, partner)
|
||||
partner.handle_post_sex(NORMAL_LUST, null, user)
|
||||
|
||||
/datum/interaction/lewd/breastfuck
|
||||
command = "breastfuck"
|
||||
description = "Fuck their breasts."
|
||||
interaction_sound = null
|
||||
require_user_penis = REQUIRE_EXPOSED
|
||||
require_target_breasts = REQUIRE_EXPOSED
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/breastfuck/display_interaction(mob/living/user, mob/living/partner)
|
||||
var/message
|
||||
|
||||
var/u_His = user.p_their()
|
||||
|
||||
if(user.is_fucking(partner, CUM_TARGET_BREASTS))
|
||||
message = "[pick("fucks \the <b>[partner]</b>'s' breasts.",
|
||||
"grinds [u_His] cock between \the <b>[partner]</b>'s boobs.",
|
||||
"thrusts into \the <b>[partner]</b>'s tits.",
|
||||
"grabs \the <b>[partner]</b>'s breasts together and presses [u_His] dick between them.")]"
|
||||
else
|
||||
message = "pushes \the <b>[partner]</b>'s breasts together and presses [u_His] dick between them."
|
||||
user.set_is_fucking(partner, CUM_TARGET_BREASTS, user.getorganslot(ORGAN_SLOT_PENIS))
|
||||
|
||||
|
||||
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/bang1.ogg',
|
||||
'modular_sand/sound/interactions/bang2.ogg',
|
||||
'modular_sand/sound/interactions/bang3.ogg'), 70, 1, -1)
|
||||
user.visible_message("<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
|
||||
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_BREASTS, partner)
|
||||
|
||||
/datum/interaction/lewd/footfuck
|
||||
command = "footfuck"
|
||||
description = "Rub your cock on their foot."
|
||||
interaction_sound = null
|
||||
require_target_num_feet = 1
|
||||
require_target_feet = REQUIRE_ANY
|
||||
require_user_penis = REQUIRE_EXPOSED
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/footfuck/display_interaction(mob/living/user, mob/living/partner)
|
||||
var/message
|
||||
|
||||
var/u_His = user.p_their()
|
||||
|
||||
var/shoes = partner.get_shoes(TRUE)
|
||||
|
||||
if(user.is_fucking(partner, CUM_TARGET_FEET))
|
||||
message = "[pick("fucks \the <b>[partner]</b>'s [shoes ? shoes : pick("foot", "sole")].",
|
||||
"rubs [u_His] dick on \the <b>[partner]</b>'s [shoes ? shoes : pick("foot", "sole")].",
|
||||
"grinds [u_His] cock on \the <b>[partner]</b>'s [shoes ? shoes : pick("foot", "sole")].")]"
|
||||
else
|
||||
message = "[pick("positions [u_His] cock on \the <b>[partner]</b>'s [shoes ? shoes : pick("foot", "sole")].",
|
||||
"positions [u_His] cock on \the <b>[partner]</b>'s [shoes ? shoes : pick("foot","sole")].",
|
||||
"starts grinding [u_His] cock against \the <b>[partner]</b>'s [shoes ? shoes : pick("foot", "sole")].")]"
|
||||
user.set_is_fucking(partner, CUM_TARGET_FEET, user.getorganslot(ORGAN_SLOT_PENIS))
|
||||
|
||||
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/foot_dry1.ogg',
|
||||
'modular_sand/sound/interactions/foot_dry3.ogg',
|
||||
'modular_sand/sound/interactions/foot_wet1.ogg',
|
||||
'modular_sand/sound/interactions/foot_wet2.ogg'), 70, 1, -1)
|
||||
user.visible_message("<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
|
||||
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_FEET, partner)
|
||||
|
||||
/datum/interaction/lewd/footfuck/double
|
||||
command = "footfuckdouble"
|
||||
description = "Rub your cock between their feet."
|
||||
require_target_num_feet = 2
|
||||
|
||||
/datum/interaction/lewd/footfuck/double/display_interaction(mob/living/user, mob/living/partner)
|
||||
var/message
|
||||
|
||||
var/u_His = user.p_their()
|
||||
|
||||
var/shoes = partner.get_shoes()
|
||||
|
||||
if(user.is_fucking(partner, CUM_TARGET_FEET))
|
||||
message = "[pick("fucks \the <b>[partner]</b>'s [shoes ? shoes : pick("feet", "soles")].",
|
||||
"rubs [u_His] dick between \the <b>[partner]</b>'s [shoes ? shoes : pick("feet", "soles")].",
|
||||
"thrusts [u_His] cock between \the <b>[partner]</b>'s [shoes ? shoes : pick("feet", "soles")].")]"
|
||||
else
|
||||
message = "[pick("positions [u_His] cock between \the <b>[partner]</b>'s [shoes ? shoes : pick("feet", "soles")].",
|
||||
"starts grinding [u_His] cock against \the <b>[partner]</b>'s [shoes ? shoes : pick("feet", "soles")].",
|
||||
"starts grinding [u_His] cock between \the <b>[partner]</b>'s [shoes ? shoes : pick("feet", "soles")].")]"
|
||||
user.set_is_fucking(partner, CUM_TARGET_FEET, user.getorganslot(ORGAN_SLOT_PENIS))
|
||||
|
||||
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/foot_dry1.ogg',
|
||||
'modular_sand/sound/interactions/foot_dry3.ogg',
|
||||
'modular_sand/sound/interactions/foot_wet1.ogg',
|
||||
'modular_sand/sound/interactions/foot_wet2.ogg'), 70, 1, -1)
|
||||
user.visible_message("<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
|
||||
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_FEET, partner)
|
||||
|
||||
/datum/interaction/lewd/footfuck/vag
|
||||
command = "footfuckvag"
|
||||
description = "Rub your vagina on their foot."
|
||||
interaction_sound = null
|
||||
require_target_num_feet = 1
|
||||
require_target_feet = REQUIRE_ANY
|
||||
require_user_vagina = REQUIRE_EXPOSED
|
||||
require_user_penis = REQUIRE_NONE
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/footfuck/vag/display_interaction(mob/living/user, mob/living/partner)
|
||||
var/message
|
||||
|
||||
var/u_His = user.p_their()
|
||||
|
||||
var/shoes = partner.get_shoes(TRUE)
|
||||
|
||||
if(user.is_fucking(partner, CUM_TARGET_FEET))
|
||||
message = "[pick("grinds [u_His] pussy against \the <b>[partner]</b>'s [shoes ? shoes : pick("foot", "sole")].",
|
||||
"rubs [u_His] clit on \the <b>[partner]</b>'s [shoes ? shoes : pick("foot", "sole")].",
|
||||
"ruts on \the <b>[partner]</b>'s [shoes ? shoes : pick("foot", "sole")].")]"
|
||||
else
|
||||
message = "[pick("positions [u_His] vagina on \the <b>[partner]</b>'s [shoes ? shoes : pick("foot", "sole")].",
|
||||
"positions [u_His] clit on \the <b>[partner]</b>'s [shoes ? shoes : pick("foot","sole")].",
|
||||
"starts grinding [u_His] pussy against \the <b>[partner]</b>'s [shoes ? shoes : pick("foot", "sole")].")]"
|
||||
user.set_is_fucking(partner, CUM_TARGET_FEET, user.getorganslot(ORGAN_SLOT_VAGINA))
|
||||
|
||||
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/foot_dry1.ogg',
|
||||
'modular_sand/sound/interactions/foot_dry3.ogg',
|
||||
'modular_sand/sound/interactions/foot_wet1.ogg',
|
||||
'modular_sand/sound/interactions/foot_wet2.ogg'), 70, 1, -1)
|
||||
user.visible_message("<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
|
||||
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_FEET, partner)
|
||||
@@ -0,0 +1,27 @@
|
||||
/datum/interaction/lewd/handjob
|
||||
command = "handjob"
|
||||
description = "Jerk them off."
|
||||
interaction_sound = null
|
||||
require_user_hands = TRUE
|
||||
require_target_penis = REQUIRE_EXPOSED
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/handjob/display_interaction(mob/living/user, mob/living/partner)
|
||||
var/message
|
||||
|
||||
var/u_His = user.p_their()
|
||||
|
||||
if(partner.is_fucking(user, CUM_TARGET_HAND))
|
||||
message = "[pick("jerks \the <b>[partner]</b> off.",
|
||||
"works \the <b>[partner]</b>'s shaft.",
|
||||
"wanks \the <b>[partner]</b>'s cock hard.")]"
|
||||
else
|
||||
message = "[pick("wraps [u_His] hand around \the <b>[partner]</b>'s cock.",
|
||||
"starts playing with \the <b>[partner]</b>'s cock")]"
|
||||
partner.set_is_fucking(user, CUM_TARGET_HAND, partner.getorganslot(ORGAN_SLOT_PENIS))
|
||||
|
||||
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/bang1.ogg',
|
||||
'modular_sand/sound/interactions/bang2.ogg',
|
||||
'modular_sand/sound/interactions/bang3.ogg'), 70, 1, -1)
|
||||
user.visible_message("<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
|
||||
partner.handle_post_sex(NORMAL_LUST, CUM_TARGET_HAND, user)
|
||||
@@ -0,0 +1,22 @@
|
||||
/datum/interaction/lewd/kiss
|
||||
command = "deepkiss"
|
||||
description = "Kiss them deeply."
|
||||
require_user_mouth = TRUE
|
||||
require_target_mouth = TRUE
|
||||
write_log_user = "kissed"
|
||||
write_log_target = "was kissed by"
|
||||
interaction_sound = null
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/kiss/post_interaction(mob/living/user, mob/living/partner)
|
||||
. = ..()
|
||||
if(user.get_lust() < 5)
|
||||
user.set_lust(5)
|
||||
if(partner.get_lust() < 5)
|
||||
partner.set_lust(5)
|
||||
|
||||
/datum/interaction/lewd/kiss/display_interaction(mob/living/user, mob/living/partner)
|
||||
if(user.get_lust() >= 3)
|
||||
user.visible_message("<span class='lewd'>\The <b>[user]</b> gives an intense, lingering kiss to \the <b>[partner]</b>.</span>")
|
||||
else
|
||||
user.visible_message("<span class='lewd'>\The <b>[user]</b> kisses \the <b>[partner]</b> deeply.</span>")
|
||||
@@ -0,0 +1,35 @@
|
||||
/datum/interaction/lewd/rimjob
|
||||
command = "rimjob"
|
||||
description = "Lick their ass."
|
||||
interaction_sound = null
|
||||
require_user_mouth = TRUE
|
||||
require_target_anus = REQUIRE_EXPOSED
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/rimjob/display_interaction(mob/living/user, mob/living/partner)
|
||||
user.visible_message("<span class='lewd'><b>\The [user]</b> licks \the <b>[partner]</b>'s asshole.</span>", ignored_mobs = user.get_unconsenting())
|
||||
playlewdinteractionsound(get_turf(user), 'modular_sand/sound/interactions/champ_fingering.ogg', 50, 1, -1)
|
||||
partner.handle_post_sex(NORMAL_LUST, null, user)
|
||||
|
||||
/datum/interaction/lewd/lickfeet
|
||||
command = "lickfeet"
|
||||
description = "Lick their feet."
|
||||
interaction_sound = null
|
||||
require_user_mouth = TRUE
|
||||
require_target_feet = REQUIRE_ANY
|
||||
require_target_num_feet = 1
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/lickfeet/display_interaction(mob/living/user, mob/living/partner)
|
||||
var/message
|
||||
|
||||
var/shoes = partner.get_shoes()
|
||||
|
||||
if(shoes)
|
||||
message = "licks \the <b>[partner]</b>'s [shoes]."
|
||||
else
|
||||
message = "licks \the <b>[partner]</b>'s [partner.has_feet() == 1 ? "foot" : "feet"]."
|
||||
|
||||
playlewdinteractionsound(get_turf(user), 'modular_sand/sound/interactions/champ_fingering.ogg', 50, 1, -1)
|
||||
user.visible_message("<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
|
||||
user.handle_post_sex(LOW_LUST, null, user)
|
||||
@@ -0,0 +1,166 @@
|
||||
/datum/interaction/lewd/mount
|
||||
command = "mount"
|
||||
description = "Mount with your pussy."
|
||||
interaction_sound = null
|
||||
require_user_vagina = REQUIRE_EXPOSED
|
||||
require_target_penis = REQUIRE_EXPOSED
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/mount/display_interaction(mob/living/user, mob/living/partner)
|
||||
var/message
|
||||
|
||||
var/u_His = user.p_their()
|
||||
|
||||
if(partner.is_fucking(user, CUM_TARGET_VAGINA))
|
||||
message = "[pick("rides \the <b>[partner]</b>'s dick.",
|
||||
"forces <b>[partner]</b>'s cock on [u_His] pussy")]"
|
||||
else
|
||||
message = "slides [u_His] pussy onto \the <b>[partner]</b>'s cock."
|
||||
partner.set_is_fucking(user, CUM_TARGET_VAGINA, partner.getorganslot(ORGAN_SLOT_PENIS))
|
||||
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/bang1.ogg',
|
||||
'modular_sand/sound/interactions/bang2.ogg',
|
||||
'modular_sand/sound/interactions/bang3.ogg'), 70, 1, -1)
|
||||
user.visible_message("<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
|
||||
partner.handle_post_sex(NORMAL_LUST, CUM_TARGET_VAGINA, user)
|
||||
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_PENIS, partner)
|
||||
|
||||
/datum/interaction/lewd/mountass
|
||||
command = "mountm"
|
||||
description = "Mount with your ass."
|
||||
interaction_sound = null
|
||||
require_user_anus = REQUIRE_EXPOSED
|
||||
require_target_penis = REQUIRE_EXPOSED
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/mountass/display_interaction(mob/living/user, mob/living/partner)
|
||||
var/message
|
||||
|
||||
var/u_His = user.p_their()
|
||||
|
||||
if(partner.is_fucking(user, CUM_TARGET_ANUS))
|
||||
message = "[pick("rides \the <b>[partner]</b>'s dick.",
|
||||
"forces <b>[partner]</b>'s cock on [u_His] ass")]"
|
||||
else
|
||||
message = "lowers [u_His] ass onto \the <b>[partner]</b>'s cock."
|
||||
partner.set_is_fucking(user, CUM_TARGET_ANUS, partner.getorganslot(ORGAN_SLOT_PENIS))
|
||||
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/bang1.ogg',
|
||||
'modular_sand/sound/interactions/bang2.ogg',
|
||||
'modular_sand/sound/interactions/bang3.ogg'), 70, 1, -1)
|
||||
user.visible_message("<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
|
||||
partner.handle_post_sex(NORMAL_LUST, CUM_TARGET_ANUS, user)
|
||||
user.handle_post_sex(NORMAL_LUST, null, partner)
|
||||
|
||||
/datum/interaction/lewd/mountface
|
||||
command = "mountface"
|
||||
description = "Ass to face."
|
||||
interaction_sound = null
|
||||
require_target_mouth = TRUE
|
||||
require_user_anus = REQUIRE_EXPOSED
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/mountface/display_interaction(mob/living/user, mob/living/partner)
|
||||
var/message
|
||||
|
||||
var/u_His = user.p_their()
|
||||
|
||||
if(user.is_fucking(partner, GRINDING_FACE_WITH_ANUS))
|
||||
message = "[pick("grinds [u_His] ass into \the <b>[partner]</b>'s face.",
|
||||
"shoves [u_His] ass into \the <b>[partner]</b>'s face.")]"
|
||||
else
|
||||
message = "[pick(
|
||||
"grabs the back of \the <b>[partner]</b>'s head and forces it into [u_His] asscheeks.",
|
||||
"squats down and plants [u_His] ass right on \the <b>[partner]</b>'s face")]"
|
||||
user.set_is_fucking(partner, GRINDING_FACE_WITH_ANUS, null)
|
||||
|
||||
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/squelch1.ogg',
|
||||
'modular_sand/sound/interactions/squelch2.ogg',
|
||||
'modular_sand/sound/interactions/squelch3.ogg'), 70, 1, -1)
|
||||
user.visible_message("<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
|
||||
user.handle_post_sex(LOW_LUST, null, partner)
|
||||
|
||||
/datum/interaction/lewd/thighs
|
||||
command = "thigh_smother"
|
||||
description = "Smother them using your penis."
|
||||
max_distance = 1
|
||||
require_user_penis = REQUIRE_EXPOSED
|
||||
require_target_mouth = TRUE
|
||||
interaction_sound = null
|
||||
write_log_user = "thigh-trapped (penis)"
|
||||
write_log_target = "was smothered (penis) by"
|
||||
var/fucktarget = "penis"
|
||||
|
||||
/datum/interaction/lewd/thighs/vagina
|
||||
command = "thigh_smother_vag"
|
||||
description = "Smother them using your vagina."
|
||||
require_user_penis = REQUIRE_NONE
|
||||
require_user_vagina = REQUIRE_EXPOSED
|
||||
write_log_user = "thigh-trapped (vagina)"
|
||||
write_log_target = "was smothered (vagina) by"
|
||||
fucktarget = "vagina"
|
||||
|
||||
/datum/interaction/lewd/thighs/display_interaction(mob/living/user, mob/living/partner)
|
||||
var/message
|
||||
var/obj/item/organ/genital/genital = null
|
||||
var/lust_increase = 1
|
||||
|
||||
var/u_His = user.p_their()
|
||||
var/t_His = partner.p_their()
|
||||
var/t_Him = partner.p_them()
|
||||
var/t_Hes = partner.p_theyre()
|
||||
|
||||
if(user.is_fucking(partner, THIGH_SMOTHERING))
|
||||
var/improv = FALSE
|
||||
switch(fucktarget)
|
||||
if("vagina")
|
||||
if(user.has_vagina())
|
||||
message = pick(list(
|
||||
"presses [u_His] weight down onto \the <b>[partner]</b>'s face, blocking [t_His] vision completely.",
|
||||
"rides \the <b>[partner]</b>'s face, grinding [u_His] wet pussy all over it."))
|
||||
else
|
||||
improv = TRUE
|
||||
if("penis")
|
||||
if(user.has_penis())
|
||||
message = pick(list("presses [u_His] weight down onto \the <b>[partner]</b>'s face, blocking [t_His] vision completely.",
|
||||
"forces [u_His] dick and nutsack into \the <b>[partner]</b>'s face as [t_Hes] stuck locked in between [u_His] thighs.",
|
||||
"slips [u_His] cock into \the <b>[partner]</b>'s helpless mouth, keeping [u_His] shaft pressed hard into [t_His] face."))
|
||||
else
|
||||
improv = TRUE
|
||||
if(improv)
|
||||
message = "rubs [u_His] groin up and down \the <b>[partner]</b>'s face."
|
||||
else
|
||||
var/improv = FALSE
|
||||
switch(fucktarget)
|
||||
if("vagina")
|
||||
if(user.has_vagina())
|
||||
message = pick(list(
|
||||
"clambers over \the <b>[partner]</b>'s face and pins [t_Him] down with [u_His] thighs, [u_His] moist slit rubbing all over \the <b>[partner]</b>'s mouth and nose.",
|
||||
"locks [u_His] legs around \the <b>[partner]</b>'s head before pulling it into [u_His] mound."))
|
||||
else
|
||||
improv = TRUE
|
||||
if("penis")
|
||||
if(user.has_penis())
|
||||
message = pick(list(
|
||||
"clambers over \the <b>[partner]</b>'s face and pins [t_Him] down with [u_His] thighs, then slowly inching closer and covering [t_His] eyes and nose with [u_His] leaking erection.",
|
||||
"locks [u_His] legs around \the <b>[partner]</b>'s head before pulling it into [u_His] fat package, smothering [t_Him]."))
|
||||
else
|
||||
improv = TRUE
|
||||
if(improv)
|
||||
message = "deviously locks [u_His] legs around \the <b>[partner]</b>'s head and smothers it in [u_His] thighs."
|
||||
else
|
||||
switch(fucktarget)
|
||||
if("vagina")
|
||||
genital = partner.getorganslot(ORGAN_SLOT_VAGINA)
|
||||
if("penis")
|
||||
genital = partner.getorganslot(ORGAN_SLOT_PENIS)
|
||||
user.set_is_fucking(partner, THIGH_SMOTHERING, genital)
|
||||
|
||||
var/file = pick('modular_sand/sound/interactions/bj10.ogg',
|
||||
'modular_sand/sound/interactions/bj3.ogg',
|
||||
'modular_sand/sound/interactions/foot_wet1.ogg',
|
||||
'modular_sand/sound/interactions/foot_dry3.ogg')
|
||||
playlewdinteractionsound(get_turf(user), file, 70, 1, -1)
|
||||
user.visible_message("<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
|
||||
user.handle_post_sex(lust_increase, THIGH_SMOTHERING, partner)
|
||||
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/oral1.ogg',
|
||||
'modular_sand/sound/interactions/oral2.ogg'), 70, 1, -1)
|
||||
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_MOUTH, partner)
|
||||
@@ -0,0 +1,142 @@
|
||||
/datum/interaction/lewd/nipsuck
|
||||
command = "nipsuck"
|
||||
description = "Suck their nipples."
|
||||
require_target_topless = TRUE
|
||||
require_user_mouth = TRUE
|
||||
write_log_user = "sucked nipples"
|
||||
write_log_target = "had their nipples sucked by"
|
||||
interaction_sound = null
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/nipsuck/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
|
||||
if((user.a_intent == INTENT_HELP) || (user.a_intent == INTENT_DISARM))
|
||||
user.visible_message(
|
||||
pick("<span class='lewd'>\The <b>[user]</b> gently sucks on \the <b>[target]</b>'s [pick("nipple", "nipples")].</span>",
|
||||
"<span class='lewd'>\The <b>[user]</b> gently nibs \the <b>[target]</b>'s [pick("nipple", "nipples")].</span>",
|
||||
"<span class='lewd'>\The <b>[user]</b> licks \the <b>[target]</b>'s [pick("nipple", "nipples")].</span>"))
|
||||
if(target.has_breasts(REQUIRE_EXPOSED))
|
||||
var/modifier = 1
|
||||
var/obj/item/organ/genital/breasts/B = target.getorganslot(ORGAN_SLOT_BREASTS)
|
||||
switch(B.size)
|
||||
if("c", "d", "e")
|
||||
modifier = 2
|
||||
if("f", "g", "h")
|
||||
modifier = 3
|
||||
else
|
||||
if(B.size in B.breast_values)
|
||||
modifier = clamp(B.breast_values[B.size] - 5, 0, INFINITY)
|
||||
else
|
||||
modifier = 1
|
||||
if(B.fluid_id)
|
||||
user.reagents.add_reagent(B.fluid_id, rand(1,2 * modifier))
|
||||
|
||||
if(user.a_intent == INTENT_HARM)
|
||||
user.visible_message(
|
||||
pick("<span class='lewd'>\The <b>[user]</b> bites \the <b>[target]</b>'s [pick("nipple", "nipples")].</span>",
|
||||
"<span class='lewd'>\The <b>[user]</b> aggressively sucks \the <b>[target]</b>'s [pick("nipple", "nipples")].</span>"))
|
||||
if(target.has_breasts(REQUIRE_EXPOSED))
|
||||
var/modifier = 1
|
||||
var/obj/item/organ/genital/breasts/B = target.getorganslot(ORGAN_SLOT_BREASTS)
|
||||
switch(B.size)
|
||||
if("c", "d", "e")
|
||||
modifier = 2
|
||||
if("f", "g", "h")
|
||||
modifier = 3
|
||||
else
|
||||
if(B.size in B.breast_values)
|
||||
modifier = clamp(B.breast_values[B.size] - 5, 0, INFINITY)
|
||||
else
|
||||
modifier = 1
|
||||
if(B.fluid_id)
|
||||
user.reagents.add_reagent(B.fluid_id, rand(1,3 * modifier)) //aggressive sucking leads to high rewards
|
||||
|
||||
if(user.a_intent == INTENT_GRAB)
|
||||
user.visible_message(
|
||||
pick("<span class='lewd'>\The <b>[user]</b> sucks \the <b>[target]</b>'s [pick("nipple", "nipples")] intently.</span>",
|
||||
"<span class='lewd'>\The <b>[user]</b> feasts \the <b>[target]</b>'s [pick("nipple", "nipples")].</span>",
|
||||
"<span class='lewd'>\The <b>[user]</b> glomps \the <b>[target]</b>'s [pick("nipple", "nipples")].</span>"))
|
||||
if(target.has_breasts(REQUIRE_EXPOSED))
|
||||
var/modifier = 1
|
||||
var/obj/item/organ/genital/breasts/B = target.getorganslot(ORGAN_SLOT_BREASTS)
|
||||
switch(B.size)
|
||||
if("c", "d", "e")
|
||||
modifier = 2
|
||||
if("f", "g", "h")
|
||||
modifier = 3
|
||||
else
|
||||
if(B.size in B.breast_values)
|
||||
modifier = clamp(B.breast_values[B.size] - 5, 0, INFINITY)
|
||||
else
|
||||
modifier = 1
|
||||
if(B.fluid_id)
|
||||
user.reagents.add_reagent(B.fluid_id, rand(1,3 * modifier)) //aggressive sucking leads to high rewards
|
||||
|
||||
if(prob(5 + target.get_lust()))
|
||||
if(target.a_intent == INTENT_HELP)
|
||||
if(!target.has_breasts())
|
||||
user.visible_message(
|
||||
pick("<span class='lewd'>\The <b>[target]</b> shivers in arousal.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> moans quietly.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> breathes out a soft moan.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> gasps.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> shudders softly.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> trembles as their chest gets molested.</span>"))
|
||||
else
|
||||
user.visible_message(
|
||||
pick("<span class='lewd'>\The <b>[target]</b> shivers in arousal.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> moans quietly.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> breathes out a soft moan.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> gasps.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> shudders softly.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> trembles as their breasts get molested.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> quivers in arousal as \the <b>[user]</b> delights themselves on their milk.</span>"))
|
||||
if(target.get_lust() < 5)
|
||||
target.set_lust(5)
|
||||
if(target.a_intent == INTENT_DISARM)
|
||||
if (target.restrained())
|
||||
if(!target.has_breasts())
|
||||
user.visible_message(
|
||||
pick("<span class='lewd'>\The <b>[target]</b> twists playfully against the restraints.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> squirms away from \the <b>[user]</b>'s mouth.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> slides back from \the <b>[user]</b>'s mouth.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> thrusts their bare chest forward into \the <b>[user]</b>'s mouth.</span>"))
|
||||
else
|
||||
user.visible_message(
|
||||
pick("<span class='lewd'>\The <b>[target]</b> twists playfully against the restraints.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> squirms away from \the <b>[user]</b>'s mouth.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> slides back from \the <b>[user]</b>'s mouth.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> thrust their bare breasts forward into \the <b>[user]</b>'s mouth.</span>"))
|
||||
else
|
||||
if(!target.has_breasts())
|
||||
user.visible_message(
|
||||
pick("<span class='lewd'>\The <b>[target]</b> playfully shoos away \the <b>[user]</b>'s head.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> squirms away from \the <b>[user]</b>'s mouth.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> holds \the <b>[user]</b>'s head against their chest.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> teasingly caresses \the <b>[user]</b>'s neck.</span>"))
|
||||
else
|
||||
user.visible_message(
|
||||
pick("<span class='lewd'>\The <b>[target]</b> playfully shoos away \the <b>[user]</b>'s head.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> squirms away from \the <b>[user]</b>'s mouth.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> holds \the <b>[user]</b>'s head against their breast.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> teasingly caresses \the <b>[user]</b>'s neck.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> rubs their breasts against \the <b>[user]</b>'s head.</span>"))
|
||||
if(target.get_lust() < 10)
|
||||
target.add_lust(1)
|
||||
if(target.a_intent == INTENT_GRAB)
|
||||
user.visible_message(
|
||||
pick("<span class='lewd'>\The <b>[target]</b> grips \the <b>[user]</b>'s head tight.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> digs nails into \the <b>[user]</b>'s scalp.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> grabs and shoves \the <b>[user]</b>'s head away.</span>"))
|
||||
if(target.a_intent == INTENT_HARM)
|
||||
user.adjustBruteLoss(1)
|
||||
user.visible_message(
|
||||
pick("<span class='lewd'>\The <b>[target]</b> slaps \the <b>[user]</b> away.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> scratches <b>[user]</b>'s face.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> fiercely struggles against <b>[user]</b>.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> claws <b>[user]</b>'s face, drawing blood.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> elbows <b>[user]</b>'s mouth away.</span>"))
|
||||
target.dir = get_dir(target, user)
|
||||
user.dir = get_dir(user, target)
|
||||
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/oral1.ogg',
|
||||
'modular_sand/sound/interactions/oral2.ogg'), 70, 1, -1)
|
||||
return
|
||||
@@ -0,0 +1,45 @@
|
||||
/datum/interaction/lewd/nuts
|
||||
command = "nut_face"
|
||||
description = "Nuts to face."
|
||||
interaction_sound = null
|
||||
require_user_balls = REQUIRE_EXPOSED
|
||||
require_target_mouth = TRUE
|
||||
max_distance = 1
|
||||
write_log_user = "make-them-suck-their-nuts"
|
||||
write_log_target = "was made to suck nuts by"
|
||||
|
||||
/datum/interaction/lewd/nuts/display_interaction(mob/living/user, mob/living/partner)
|
||||
var/message
|
||||
|
||||
var/u_His = user.p_their()
|
||||
var/t_His = partner.p_their()
|
||||
|
||||
var/lust_increase = 1
|
||||
|
||||
if(user.is_fucking(partner, NUTS_TO_FACE))
|
||||
message = pick(list(
|
||||
"grabs the back of <b>[partner]</b>'s head and pulls it into [u_His] crotch.",
|
||||
"jams [u_His] nutsack right into <b>[partner]</b>'s face.",
|
||||
"roughly grinds [u_His] fat nutsack into <b>[partner]</b>'s mouth.",
|
||||
"pulls out [u_His] saliva-covered nuts from <b>[partner]</b>'s violated mouth and then wipes off the slime onto [t_His] face."))
|
||||
else
|
||||
message = pick(list("wedges a digit into the side of <b>[partner]</b>'s jaw and pries it open before using [u_His] other hand to shove [u_His] whole nutsack inside!", "stands with [u_His] groin inches away from [partner]'s face, then thrusting [u_His] hips forward and smothering [partner]'s whole face with [u_His] heavy ballsack."))
|
||||
user.set_is_fucking(partner, NUTS_TO_FACE, user.getorganslot(ORGAN_SLOT_PENIS))
|
||||
|
||||
/*playlewdinteractionsound(loc, pick('modular_sand/sound/interactions/nuts1.ogg',
|
||||
'modular_sand/sound/interactions/nuts2.ogg',
|
||||
'modular_sand/sound/interactions/nuts3.ogg',
|
||||
'modular_sand/sound/interactions/nuts4.ogg'), 70, 1, -1)*/ //These files don't even exist but nobody noticed because double-quotes were used instead of single.
|
||||
user.visible_message("<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
|
||||
user.handle_post_sex(lust_increase, CUM_TARGET_MOUTH, partner)
|
||||
|
||||
/datum/interaction/lewd/nut_smack
|
||||
command = "smack_nuts"
|
||||
description = "Smack their nuts."
|
||||
interaction_sound = 'modular_sand/sound/interactions/slap.ogg'
|
||||
simple_message = "USER slaps TARGET's nuts!"
|
||||
require_target_balls = REQUIRE_EXPOSED
|
||||
needs_physical_contact = TRUE
|
||||
max_distance = 1
|
||||
write_log_user = "slapped-nuts"
|
||||
write_log_target = "had their nuts slapped by"
|
||||
@@ -0,0 +1,127 @@
|
||||
/datum/interaction/lewd/oral
|
||||
command = "suckvag"
|
||||
description = "Go down on them."
|
||||
require_user_mouth = TRUE
|
||||
require_target_vagina = REQUIRE_EXPOSED
|
||||
write_log_user = "gave head to"
|
||||
write_log_target = "was given head by"
|
||||
interaction_sound = null
|
||||
max_distance = 1
|
||||
var/fucktarget = "vagina"
|
||||
|
||||
/datum/interaction/lewd/oral/blowjob
|
||||
command = "suckcock"
|
||||
description = "Suck them off."
|
||||
require_target_vagina = null
|
||||
require_target_penis = REQUIRE_EXPOSED
|
||||
fucktarget = "penis"
|
||||
|
||||
/datum/interaction/lewd/oral/display_interaction(mob/living/user, mob/living/partner)
|
||||
var/message
|
||||
var/obj/item/organ/genital/genital = null
|
||||
var/lust_increase = NORMAL_LUST
|
||||
var/u_His = user.p_their()
|
||||
var/u_He = user.p_they()
|
||||
var/u_Were = user.p_theyre()
|
||||
|
||||
if(partner.is_fucking(user, CUM_TARGET_MOUTH))
|
||||
if(prob(partner.get_sexual_potency()))
|
||||
user.adjustOxyLoss(3)
|
||||
message = "goes in deep on \the <b>[partner]</b>."
|
||||
lust_increase += 5
|
||||
else
|
||||
var/improv = FALSE
|
||||
switch(fucktarget)
|
||||
if("vagina")
|
||||
if(partner.has_vagina())
|
||||
message = pick(
|
||||
"licks \the <b>[partner]</b>'s pussy.",
|
||||
"runs [u_His] tongue up the shape of \the <b>[partner]</b>'s pussy.",
|
||||
"traces \the <b>[partner]</b>'s slit with [u_His] tongue.",
|
||||
"darts the tip of [u_His] tongue around \the <b>[partner]</b>'s clit.",
|
||||
"laps slowly at \the <b>[partner]</b>.",
|
||||
"kisses \the <b>[partner]</b>'s delicate folds.",
|
||||
"tastes \the <b>[partner]</b>.",
|
||||
)
|
||||
else
|
||||
improv = TRUE
|
||||
if("penis")
|
||||
if(partner.has_penis())
|
||||
message = pick(
|
||||
"sucks \the <b>[partner]</b>'s off.",
|
||||
"runs [u_His] tongue up the shape of \the <b>[partner]</b>'s cock.",
|
||||
"traces \the <b>[partner]</b>'s cock with [u_His] tongue.",
|
||||
"darts the tip of [u_His] tongue around tip of \the <b>[partner]</b>'s cock.",
|
||||
"laps slowly at \the <b>[partner]</b>'s shaft.",
|
||||
"kisses the base of \the <b>[partner]</b>'s shaft.",
|
||||
"takes \the <b>[partner]</b> deeper into [u_His] mouth.",
|
||||
)
|
||||
else
|
||||
improv = TRUE
|
||||
if(improv)
|
||||
// get confused about how to do the sex
|
||||
message = pick(
|
||||
"licks \the <b>[partner]</b>.",
|
||||
"looks a little unsure of where to lick \the <b>[partner]</b>.",
|
||||
"runs [u_His] tongue between \the <b>[partner]</b>'s legs.",
|
||||
"kisses \the <b>[partner]</b>'s thigh.",
|
||||
"tries [u_His] best with \the <b>[partner]</b>.",
|
||||
)
|
||||
else
|
||||
var/improv = FALSE
|
||||
switch(fucktarget)
|
||||
if("vagina")
|
||||
if(partner.has_vagina())
|
||||
message = pick(
|
||||
"buries [u_His] face in \the <b>[partner]</b>'s pussy.",
|
||||
"nuzzles \the <b>[partner]</b>'s wet sex.",
|
||||
"finds [u_His] face caught between \the <b>[partner]</b>'s thighs.",
|
||||
"kneels down between \the <b>[partner]</b>'s legs.",
|
||||
"grips \the <b>[partner]</b>'s legs, pushing them apart.",
|
||||
"sinks [u_His] face in between \the <b>[partner]</b>'s thighs.",
|
||||
)
|
||||
else
|
||||
improv = TRUE
|
||||
if("penis")
|
||||
if(partner.has_penis())
|
||||
message = pick(
|
||||
"takes \the <b>[partner]</b>'s cock into [u_His] mouth.",
|
||||
"wraps [u_His] lips around \the <b>[partner]</b>'s cock.",
|
||||
"finds [u_His] face between \the <b>[partner]</b>'s thighs.",
|
||||
"kneels down between \the <b>[partner]</b>'s legs.",
|
||||
"grips \the <b>[partner]</b>'s legs, kissing at the tip of [u_His] cock.",
|
||||
"goes down on \the <b>[partner]</b>.",
|
||||
)
|
||||
else
|
||||
improv = TRUE
|
||||
if(improv)
|
||||
message = pick(
|
||||
"begins to lick \the <b>[partner]</b>.",
|
||||
"starts kissing \the <b>[partner]</b>'s thigh.",
|
||||
"sinks down between \the <b>[partner]</b>'s thighs.",
|
||||
"briefly flashes a puzzled look from between \the <b>[partner]</b>'s legs.",
|
||||
"looks unsure of how to handle \the <b>[partner]</b>'s lack of genitalia.",
|
||||
"seems like [u_He] [u_Were] expecting \the <b>[partner]</b> to have a cock or a pussy or ... something.",
|
||||
)
|
||||
genital = null
|
||||
else
|
||||
switch(fucktarget)
|
||||
if("vagina")
|
||||
genital = partner.getorganslot(ORGAN_SLOT_VAGINA)
|
||||
if("penis")
|
||||
genital = partner.getorganslot(ORGAN_SLOT_PENIS)
|
||||
partner.set_is_fucking(user, CUM_TARGET_MOUTH, genital)
|
||||
|
||||
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/bj1.ogg',
|
||||
'modular_sand/sound/interactions/bj2.ogg',
|
||||
'modular_sand/sound/interactions/bj3.ogg',
|
||||
'modular_sand/sound/interactions/bj4.ogg',
|
||||
'modular_sand/sound/interactions/bj5.ogg',
|
||||
'modular_sand/sound/interactions/bj6.ogg',
|
||||
'modular_sand/sound/interactions/bj7.ogg',
|
||||
'modular_sand/sound/interactions/bj8.ogg',
|
||||
'modular_sand/sound/interactions/bj9.ogg',
|
||||
'modular_sand/sound/interactions/bj10.ogg',
|
||||
'modular_sand/sound/interactions/bj11.ogg'), 50, 1, -1)
|
||||
user.visible_message("<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
|
||||
partner.handle_post_sex(lust_increase, CUM_TARGET_MOUTH, user)
|
||||
@@ -0,0 +1,86 @@
|
||||
/datum/interaction/lewd/titgrope_self
|
||||
command = "titgrope_self"
|
||||
description = "Grope your own breasts."
|
||||
require_user_hands = TRUE
|
||||
require_user_breasts = REQUIRE_ANY
|
||||
user_is_target = TRUE
|
||||
interaction_sound = null
|
||||
max_distance = 0
|
||||
write_log_user = "groped own breasts"
|
||||
write_log_target = null
|
||||
|
||||
/datum/interaction/lewd/titgrope_self/display_interaction(mob/living/user)
|
||||
var/message
|
||||
var/t_His = user.p_their()
|
||||
|
||||
if(user.a_intent == INTENT_HARM)
|
||||
message = "[pick("aggressively gropes [t_His] breast.",
|
||||
"grabs [t_His] breasts.",
|
||||
"tightly squeezes [t_His] breasts.",
|
||||
"slaps at [t_His] breasts.",
|
||||
"gropes [t_His] breasts roughly.")]"
|
||||
else
|
||||
message = "[pick("gently gropes [t_His] breast.",
|
||||
"softly squeezes [t_His] breasts.",
|
||||
"grips [t_His] breasts.",
|
||||
"runs a few fingers over [t_His] breast.",
|
||||
"delicately teases [t_His] nipple.",
|
||||
"traces a touch across [t_His] breast.")]"
|
||||
if(prob(5 + user.get_lust()))
|
||||
user.visible_message("<span class='lewd'><b>\The [user]</b> [pick("shivers in arousal.",
|
||||
"moans quietly.",
|
||||
"breathes out a soft moan.",
|
||||
"gasps.",
|
||||
"shudders softly.",
|
||||
"trembles as [t_His] hands run across bare skin.")]</span>")
|
||||
user.visible_message(message = "<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
|
||||
playlewdinteractionsound(get_turf(user), 'modular_sand/sound/interactions/squelch1.ogg', 50, 1, -1)
|
||||
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_HAND, user)
|
||||
|
||||
|
||||
/datum/interaction/lewd/self_nipsuck
|
||||
command = "self_nipsuck"
|
||||
description = "Suck your own nips."
|
||||
require_user_breasts = REQUIRE_EXPOSED
|
||||
require_user_mouth = TRUE
|
||||
user_is_target = TRUE
|
||||
interaction_sound = null
|
||||
max_distance = 0
|
||||
write_log_user = "sucked their own nips"
|
||||
write_log_target = null
|
||||
|
||||
/datum/interaction/lewd/self_nipsuck/display_interaction(mob/living/user, mob/living/target)
|
||||
var/message
|
||||
var/u_His = user.p_their()
|
||||
var/obj/item/organ/genital/breasts/milkers = user.getorganslot(ORGAN_SLOT_BREASTS)
|
||||
var/milktype = milkers?.fluid_id
|
||||
var/modifier
|
||||
var/list/lines
|
||||
|
||||
if(!milkers || !milktype)
|
||||
return
|
||||
|
||||
var/milktext = initial(milktype)
|
||||
|
||||
lines = list(
|
||||
"brings [u_His] own milk tanks to [u_His] mouth and sucks deeply into them",
|
||||
"takes a big sip of [u_His] own fresh [lowertext(milktext)]",
|
||||
"fills [u_His] own mouth with a big gulp of [u_His] warm [lowertext(milktext)]"
|
||||
)
|
||||
|
||||
message = "<span class='lewd'>\The <b>[user]</b> [pick(lines)]</span>"
|
||||
user.visible_message(message, ignored_mobs = user.get_unconsenting())
|
||||
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/oral1.ogg',
|
||||
'modular_sand/sound/interactions/oral2.ogg'), 70, 1, -1)
|
||||
|
||||
switch(milkers.size)
|
||||
if("c", "d", "e")
|
||||
modifier = 2
|
||||
if("f", "g", "h")
|
||||
modifier = 3
|
||||
else
|
||||
if(milkers.size in milkers.breast_values)
|
||||
modifier = clamp(milkers.breast_values[milkers.size] - 5, 0, INFINITY)
|
||||
else
|
||||
modifier = 1
|
||||
user.reagents.add_reagent(milktype, rand(1,3 * modifier))
|
||||
@@ -0,0 +1,41 @@
|
||||
/datum/interaction/lewd/fingerass_self
|
||||
command = "fingerm_self"
|
||||
description = "Finger yourself."
|
||||
interaction_sound = null
|
||||
require_user_hands = TRUE
|
||||
require_user_anus = REQUIRE_EXPOSED
|
||||
user_is_target = TRUE
|
||||
max_distance = 0
|
||||
write_log_user = "fingered self"
|
||||
write_log_target = null
|
||||
|
||||
/datum/interaction/lewd/fingerass_self/display_interaction(mob/living/user)
|
||||
var/t_His = user.p_their()
|
||||
var/t_Him = user.p_them()
|
||||
|
||||
user.visible_message("<span class='lewd'><b>\The [user]</b> [pick("fingers [t_Him]self.",
|
||||
"fingers [t_His] asshole.",
|
||||
"fingers [t_Him]self hard.")]</span>", ignored_mobs = user.get_unconsenting())
|
||||
playlewdinteractionsound(get_turf(user), 'modular_sand/sound/interactions/champ_fingering.ogg', 50, 1, -1)
|
||||
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_HAND, user)
|
||||
|
||||
/datum/interaction/lewd/finger_self
|
||||
command = "finger_self"
|
||||
description = "Finger your own pussy."
|
||||
require_user_hands = TRUE
|
||||
require_user_vagina = REQUIRE_EXPOSED
|
||||
interaction_sound = null
|
||||
user_is_target = TRUE
|
||||
max_distance = 0
|
||||
write_log_user = "fingered own pussy"
|
||||
write_log_target = null
|
||||
|
||||
/datum/interaction/lewd/finger_self/display_interaction(mob/living/user)
|
||||
var/t_His = user.p_their()
|
||||
|
||||
user.visible_message("<span class='lewd'><b>\The [user]</b> [pick("fingers [t_His] pussy deep.",
|
||||
"fingers [t_His] pussy.",
|
||||
"plays with [t_His] pussy.",
|
||||
"fingers [t_His] own pussy hard.")]</span>", ignored_mobs = user.get_unconsenting())
|
||||
playlewdinteractionsound(get_turf(user), 'modular_sand/sound/interactions/champ_fingering.ogg', 50, 1, -1)
|
||||
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_HAND, user)
|
||||
@@ -0,0 +1,32 @@
|
||||
/datum/interaction/lewd/jack
|
||||
command = "jack"
|
||||
description = "Jerk yourself off."
|
||||
interaction_sound = null
|
||||
require_user_hands = TRUE
|
||||
require_user_penis = REQUIRE_EXPOSED
|
||||
user_is_target = TRUE
|
||||
max_distance = 0
|
||||
write_log_user = "jerked off"
|
||||
write_log_target = null
|
||||
|
||||
/datum/interaction/lewd/jack/display_interaction(mob/living/user)
|
||||
var/message
|
||||
var/t_His = user.p_their()
|
||||
var/t_Him = user.p_them()
|
||||
|
||||
if(user.is_fucking(user, CUM_TARGET_HAND))
|
||||
message = "[pick("jerks [t_Him]self off.",
|
||||
"works [t_His] shaft.",
|
||||
"strokes [t_His] penis.",
|
||||
"wanks [t_His] cock hard.")]"
|
||||
else
|
||||
message = "[pick("wraps [t_His] hand around [t_His] cock.",
|
||||
"starts to stroke [t_His] cock.",
|
||||
"starts playing with [t_His] cock.")]"
|
||||
user.set_is_fucking(user, CUM_TARGET_HAND, user.getorganslot(ORGAN_SLOT_PENIS))
|
||||
|
||||
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/bang1.ogg',
|
||||
'modular_sand/sound/interactions/bang2.ogg',
|
||||
'modular_sand/sound/interactions/bang3.ogg'), 70, 1, -1)
|
||||
user.visible_message(message = "<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
|
||||
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_HAND, user)
|
||||
@@ -1,594 +0,0 @@
|
||||
/datum/interaction/lewd
|
||||
var/list/blacklisted_mobs = list(/mob/living/simple_animal/pet,
|
||||
/mob/living/simple_animal/cockroach,
|
||||
/mob/living/simple_animal/babyKiwi,
|
||||
/mob/living/simple_animal/butterfly,
|
||||
/mob/living/simple_animal/chick,
|
||||
/mob/living/simple_animal/chicken,
|
||||
/mob/living/simple_animal/cow,
|
||||
/mob/living/simple_animal/crab,
|
||||
/mob/living/simple_animal/kiwi,
|
||||
/mob/living/simple_animal/parrot,
|
||||
/mob/living/simple_animal/sloth,
|
||||
/mob/living/simple_animal/pickle,
|
||||
/mob/living/simple_animal/hostile/retaliate/goat)
|
||||
|
||||
/datum/interaction/lewd/kiss
|
||||
command = "deepkiss"
|
||||
description = "Kiss them deeply."
|
||||
require_user_mouth = TRUE
|
||||
require_target_mouth = TRUE
|
||||
write_log_user = "kissed"
|
||||
write_log_target = "was kissed by"
|
||||
interaction_sound = null
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/kiss/post_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
|
||||
. = ..()
|
||||
if(user.get_lust() < 5)
|
||||
user.set_lust(5)
|
||||
if(target.get_lust() < 5)
|
||||
target.set_lust(5)
|
||||
|
||||
/datum/interaction/lewd/kiss/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
|
||||
if(user.get_lust() >= 3)
|
||||
user.visible_message("<span class='lewd'>\The <b>[user]</b> gives an intense, lingering kiss to \the <b>[target]</b>.</span>")
|
||||
else
|
||||
user.visible_message("<span class='lewd'>\The <b>[user]</b> kisses \the <b>[target]</b> deeply.</span>")
|
||||
|
||||
/datum/interaction/lewd/titgrope
|
||||
command = "titgrope"
|
||||
description = "Grope their breasts."
|
||||
require_user_hands = TRUE
|
||||
require_target_breasts = REQUIRE_ANY
|
||||
write_log_user = "groped"
|
||||
write_log_target = "was groped by"
|
||||
interaction_sound = null
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/titgrope/post_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
|
||||
. = ..()
|
||||
|
||||
/datum/interaction/lewd/titgrope/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
|
||||
if(user.a_intent == INTENT_HELP)
|
||||
user.visible_message(
|
||||
pick("<span class='lewd'>\The <b>[user]</b> gently gropes \the <b>[target]</b>'s breast.</span>",
|
||||
"<span class='lewd'>\The <b>[user]</b> softly squeezes \the <b>[target]</b>'s breasts.</span>",
|
||||
"<span class='lewd'>\The <b>[user]</b> grips \the <b>[target]</b>'s breasts.</span>",
|
||||
"<span class='lewd'>\The <b>[user]</b> runs a few fingers over \the <b>[target]</b>'s breast.</span>",
|
||||
"<span class='lewd'>\The <b>[user]</b> delicately teases \the <b>[target]</b>'s nipple.</span>",
|
||||
"<span class='lewd'>\The <b>[user]</b> traces a touch across \the <b>[target]</b>'s breast.</span>"))
|
||||
if(user.a_intent == INTENT_HARM)
|
||||
user.visible_message(
|
||||
pick("<span class='lewd'>\The <b>[user]</b> aggressively gropes \the <b>[target]</b>'s breast.</span>",
|
||||
"<span class='lewd'>\The <b>[user]</b> grabs \the <b>[target]</b>'s breasts.</span>",
|
||||
"<span class='lewd'>\The <b>[user]</b> tightly squeezes \the <b>[target]</b>'s breasts.</span>",
|
||||
"<span class='lewd'>\The <b>[user]</b> slaps at \the <b>[target]</b>'s breasts.</span>",
|
||||
"<span class='lewd'>\The <b>[user]</b> gropes \the <b>[target]</b>'s breasts roughly.</span>"))
|
||||
if(prob(5 + target.get_lust()))
|
||||
if(target.a_intent == INTENT_HELP)
|
||||
user.visible_message(
|
||||
pick("<span class='lewd'>\The <b>[target]</b> shivers in arousal.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> moans quietly.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> breathes out a soft moan.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> gasps.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> shudders softly.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> trembles as hands run across bare skin.</span>"))
|
||||
if(target.get_lust() < 5)
|
||||
target.set_lust(5)
|
||||
if(target.a_intent == INTENT_DISARM)
|
||||
if (target.restrained())
|
||||
user.visible_message(
|
||||
pick("<span class='lewd'>\The <b>[target]</b> twists playfully against the restraints.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> squirms away from <b>[user]</b>'s hand.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> slides back from <b>[user]</b>'s roaming hand.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> thrusts bare breasts forward into <b>[user]</b>'s hands.</span>"))
|
||||
else
|
||||
user.visible_message(
|
||||
pick("<span class='lewd'>\The <b>[target]</b> playfully bats at <b>[user]</b>'s hand.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> squirms away from <b>[user]</b>'s hand.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> guides <b>[user]</b>'s hand across bare breasts.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> teasingly laces a few fingers over <b>[user]</b>'s knuckles.</span>"))
|
||||
if(target.get_lust() < 10)
|
||||
target.add_lust(1)
|
||||
if(target.a_intent == INTENT_GRAB)
|
||||
user.visible_message(
|
||||
pick("<span class='lewd'>\The <b>[target]</b> grips <b>[user]</b>'s wrist tight.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> digs nails into <b>[user]</b>'s arm.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> grabs <b>[user]</b>'s wrist for a second.</span>"))
|
||||
if(target.a_intent == INTENT_HARM)
|
||||
user.adjustBruteLoss(1)
|
||||
user.visible_message(
|
||||
pick("<span class='lewd'>\The <b>[target]</b> pushes <b>[user]</b> roughly away.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> digs nails angrily into <b>[user]</b>'s arm.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> fiercely struggles against <b>[user]</b>.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> claws <b>[user]</b>'s forearm, drawing blood.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> slaps <b>[user]</b>'s hand away.</span>"))
|
||||
return
|
||||
|
||||
/datum/interaction/lewd/nipsuck
|
||||
command = "nipsuck"
|
||||
description = "Suck their nipples."
|
||||
require_target_topless = TRUE
|
||||
require_user_mouth = TRUE
|
||||
write_log_user = "sucked nipples"
|
||||
write_log_target = "had their nipples sucked by"
|
||||
interaction_sound = null
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/nipsuck/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
|
||||
if((user.a_intent == INTENT_HELP) || (user.a_intent == INTENT_DISARM))
|
||||
user.visible_message(
|
||||
pick("<span class='lewd'>\The <b>[user]</b> gently sucks on \the <b>[target]</b>'s [pick("nipple", "nipples")].</span>",
|
||||
"<span class='lewd'>\The <b>[user]</b> gently nibs \the <b>[target]</b>'s [pick("nipple", "nipples")].</span>",
|
||||
"<span class='lewd'>\The <b>[user]</b> licks \the <b>[target]</b>'s [pick("nipple", "nipples")].</span>"))
|
||||
if(target.has_breasts(REQUIRE_EXPOSED))
|
||||
var/modifier = 1
|
||||
var/obj/item/organ/genital/breasts/B = target.getorganslot(ORGAN_SLOT_BREASTS)
|
||||
switch(B.size)
|
||||
if("c", "d", "e")
|
||||
modifier = 2
|
||||
if("f", "g", "h")
|
||||
modifier = 3
|
||||
else
|
||||
if(B.size in B.breast_values)
|
||||
modifier = clamp(B.breast_values[B.size] - 5, 0, INFINITY)
|
||||
else
|
||||
modifier = 1
|
||||
if(B.fluid_id)
|
||||
user.reagents.add_reagent(B.fluid_id, rand(1,2 * modifier))
|
||||
|
||||
if(user.a_intent == INTENT_HARM)
|
||||
user.visible_message(
|
||||
pick("<span class='lewd'>\The <b>[user]</b> bites \the <b>[target]</b>'s [pick("nipple", "nipples")].</span>",
|
||||
"<span class='lewd'>\The <b>[user]</b> aggressively sucks \the <b>[target]</b>'s [pick("nipple", "nipples")].</span>"))
|
||||
if(target.has_breasts(REQUIRE_EXPOSED))
|
||||
var/modifier = 1
|
||||
var/obj/item/organ/genital/breasts/B = target.getorganslot(ORGAN_SLOT_BREASTS)
|
||||
switch(B.size)
|
||||
if("c", "d", "e")
|
||||
modifier = 2
|
||||
if("f", "g", "h")
|
||||
modifier = 3
|
||||
else
|
||||
if(B.size in B.breast_values)
|
||||
modifier = clamp(B.breast_values[B.size] - 5, 0, INFINITY)
|
||||
else
|
||||
modifier = 1
|
||||
if(B.fluid_id)
|
||||
user.reagents.add_reagent(B.fluid_id, rand(1,3 * modifier)) //aggressive sucking leads to high rewards
|
||||
|
||||
if(user.a_intent == INTENT_GRAB)
|
||||
user.visible_message(
|
||||
pick("<span class='lewd'>\The <b>[user]</b> sucks \the <b>[target]</b>'s [pick("nipple", "nipples")] intently.</span>",
|
||||
"<span class='lewd'>\The <b>[user]</b> feasts \the <b>[target]</b>'s [pick("nipple", "nipples")].</span>",
|
||||
"<span class='lewd'>\The <b>[user]</b> glomps \the <b>[target]</b>'s [pick("nipple", "nipples")].</span>"))
|
||||
if(target.has_breasts(REQUIRE_EXPOSED))
|
||||
var/modifier = 1
|
||||
var/obj/item/organ/genital/breasts/B = target.getorganslot(ORGAN_SLOT_BREASTS)
|
||||
switch(B.size)
|
||||
if("c", "d", "e")
|
||||
modifier = 2
|
||||
if("f", "g", "h")
|
||||
modifier = 3
|
||||
else
|
||||
if(B.size in B.breast_values)
|
||||
modifier = clamp(B.breast_values[B.size] - 5, 0, INFINITY)
|
||||
else
|
||||
modifier = 1
|
||||
if(B.fluid_id)
|
||||
user.reagents.add_reagent(B.fluid_id, rand(1,3 * modifier)) //aggressive sucking leads to high rewards
|
||||
|
||||
if(prob(5 + target.get_lust()))
|
||||
if(target.a_intent == INTENT_HELP)
|
||||
if(!target.has_breasts())
|
||||
user.visible_message(
|
||||
pick("<span class='lewd'>\The <b>[target]</b> shivers in arousal.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> moans quietly.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> breathes out a soft moan.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> gasps.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> shudders softly.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> trembles as their chest gets molested.</span>"))
|
||||
else
|
||||
user.visible_message(
|
||||
pick("<span class='lewd'>\The <b>[target]</b> shivers in arousal.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> moans quietly.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> breathes out a soft moan.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> gasps.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> shudders softly.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> trembles as their breasts get molested.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> quivers in arousal as \the <b>[user]</b> delights themselves on their milk.</span>"))
|
||||
if(target.get_lust() < 5)
|
||||
target.set_lust(5)
|
||||
if(target.a_intent == INTENT_DISARM)
|
||||
if (target.restrained())
|
||||
if(!target.has_breasts())
|
||||
user.visible_message(
|
||||
pick("<span class='lewd'>\The <b>[target]</b> twists playfully against the restraints.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> squirms away from \the <b>[user]</b>'s mouth.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> slides back from \the <b>[user]</b>'s mouth.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> thrusts their bare chest forward into \the <b>[user]</b>'s mouth.</span>"))
|
||||
else
|
||||
user.visible_message(
|
||||
pick("<span class='lewd'>\The <b>[target]</b> twists playfully against the restraints.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> squirms away from \the <b>[user]</b>'s mouth.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> slides back from \the <b>[user]</b>'s mouth.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> thrust their bare breasts forward into \the <b>[user]</b>'s mouth.</span>"))
|
||||
else
|
||||
if(!target.has_breasts())
|
||||
user.visible_message(
|
||||
pick("<span class='lewd'>\The <b>[target]</b> playfully shoos away \the <b>[user]</b>'s head.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> squirms away from \the <b>[user]</b>'s mouth.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> holds \the <b>[user]</b>'s head against their chest.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> teasingly caresses \the <b>[user]</b>'s neck.</span>"))
|
||||
else
|
||||
user.visible_message(
|
||||
pick("<span class='lewd'>\The <b>[target]</b> playfully shoos away \the <b>[user]</b>'s head.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> squirms away from \the <b>[user]</b>'s mouth.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> holds \the <b>[user]</b>'s head against their breast.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> teasingly caresses \the <b>[user]</b>'s neck.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> rubs their breasts against \the <b>[user]</b>'s head.</span>"))
|
||||
if(target.get_lust() < 10)
|
||||
target.add_lust(1)
|
||||
if(target.a_intent == INTENT_GRAB)
|
||||
user.visible_message(
|
||||
pick("<span class='lewd'>\The <b>[target]</b> grips \the <b>[user]</b>'s head tight.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> digs nails into \the <b>[user]</b>'s scalp.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> grabs and shoves \the <b>[user]</b>'s head away.</span>"))
|
||||
if(target.a_intent == INTENT_HARM)
|
||||
user.adjustBruteLoss(1)
|
||||
user.visible_message(
|
||||
pick("<span class='lewd'>\The <b>[target]</b> slaps \the <b>[user]</b> away.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> scratches <b>[user]</b>'s face.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> fiercely struggles against <b>[user]</b>.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> claws <b>[user]</b>'s face, drawing blood.</span>",
|
||||
"<span class='lewd'>\The <b>[target]</b> elbows <b>[user]</b>'s mouth away.</span>"))
|
||||
target.dir = get_dir(target, user)
|
||||
user.dir = get_dir(user, target)
|
||||
playlewdinteractionsound(user.loc, pick('modular_sand/sound/interactions/oral1.ogg',
|
||||
'modular_sand/sound/interactions/oral2.ogg'), 70, 1, -1)
|
||||
return
|
||||
|
||||
/datum/interaction/lewd/oral
|
||||
command = "suckvag"
|
||||
description = "Go down on them."
|
||||
require_user_mouth = TRUE
|
||||
require_target_vagina = REQUIRE_EXPOSED
|
||||
write_log_user = "gave head to"
|
||||
write_log_target = "was given head by"
|
||||
interaction_sound = null
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/oral/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
|
||||
user.do_oral(target, "vagina")
|
||||
|
||||
/datum/interaction/lewd/oral/blowjob
|
||||
command = "suckcock"
|
||||
description = "Suck them off."
|
||||
require_target_vagina = REQUIRE_NONE
|
||||
require_target_penis = REQUIRE_EXPOSED
|
||||
|
||||
/datum/interaction/lewd/oral/blowjob/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
|
||||
user.do_oral(target, "penis")
|
||||
|
||||
/datum/interaction/lewd/fuck
|
||||
command = "fuckvag"
|
||||
description = "Fuck their pussy."
|
||||
require_user_penis = REQUIRE_EXPOSED
|
||||
require_target_vagina = REQUIRE_EXPOSED
|
||||
write_log_user = "fucked"
|
||||
write_log_target = "was fucked by"
|
||||
interaction_sound = null
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/fuck/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
|
||||
user.do_vaginal(target)
|
||||
|
||||
/datum/interaction/lewd/fuck/anal
|
||||
command = "fuckass"
|
||||
description = "Fuck their ass."
|
||||
require_target_vagina = REQUIRE_NONE
|
||||
require_target_anus = REQUIRE_EXPOSED
|
||||
|
||||
/datum/interaction/lewd/fuck/anal/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
|
||||
user.do_anal(target)
|
||||
|
||||
/datum/interaction/lewd/finger
|
||||
command = "finger"
|
||||
description = "Finger their pussy."
|
||||
require_user_hands = TRUE
|
||||
require_target_vagina = REQUIRE_EXPOSED
|
||||
interaction_sound = null
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/finger/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
|
||||
user.do_fingering(target)
|
||||
|
||||
/datum/interaction/lewd/fingerass
|
||||
command = "fingerm"
|
||||
description = "Finger their ass."
|
||||
interaction_sound = null
|
||||
require_user_hands = TRUE
|
||||
require_target_anus = REQUIRE_EXPOSED
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/fingerass/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
|
||||
user.do_fingerass(target)
|
||||
|
||||
|
||||
/datum/interaction/lewd/facefuck
|
||||
command = "facefuck"
|
||||
description = "Fuck their mouth."
|
||||
interaction_sound = null
|
||||
require_target_mouth = TRUE
|
||||
require_user_penis = REQUIRE_EXPOSED
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/facefuck/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
|
||||
user.do_facefuck(target)
|
||||
|
||||
/datum/interaction/lewd/throatfuck
|
||||
command = "throatfuck"
|
||||
description = "Fuck their throat. | Does oxy damage."
|
||||
interaction_sound = null
|
||||
require_user_penis = REQUIRE_EXPOSED
|
||||
require_target_mouth = TRUE
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/throatfuck/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
|
||||
user.do_throatfuck(target)
|
||||
|
||||
/datum/interaction/lewd/handjob
|
||||
command = "handjob"
|
||||
description = "Jerk them off."
|
||||
interaction_sound = null
|
||||
require_user_hands = TRUE
|
||||
require_target_penis = REQUIRE_EXPOSED
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/handjob/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
|
||||
user.do_handjob(target)
|
||||
|
||||
/datum/interaction/lewd/breastfuck
|
||||
command = "breastfuck"
|
||||
description = "Fuck their breasts."
|
||||
interaction_sound = null
|
||||
require_user_penis = REQUIRE_EXPOSED
|
||||
require_target_breasts = REQUIRE_EXPOSED
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/breastfuck/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
|
||||
user.do_breastfuck(target)
|
||||
|
||||
/datum/interaction/lewd/mount
|
||||
command = "mount"
|
||||
description = "Mount with your pussy."
|
||||
interaction_sound = null
|
||||
require_user_vagina = REQUIRE_EXPOSED
|
||||
require_target_penis = REQUIRE_EXPOSED
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/mount/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
|
||||
user.do_mount(target)
|
||||
|
||||
/datum/interaction/lewd/mountass
|
||||
command = "mountm"
|
||||
description = "Mount with your ass."
|
||||
interaction_sound = null
|
||||
require_user_anus = REQUIRE_EXPOSED
|
||||
require_target_penis = REQUIRE_EXPOSED
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/mountass/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
|
||||
user.do_mountass(target)
|
||||
|
||||
/datum/interaction/lewd/tribadism
|
||||
command = "tribadism"
|
||||
description = "Grind your pussy against theirs."
|
||||
interaction_sound = null
|
||||
require_target_vagina = REQUIRE_EXPOSED
|
||||
require_user_vagina = REQUIRE_EXPOSED
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/tribadism/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
|
||||
user.do_tribadism(target)
|
||||
|
||||
/datum/interaction/lewd/rimjob
|
||||
command = "rimjob"
|
||||
description = "Lick their ass."
|
||||
interaction_sound = null
|
||||
require_user_mouth = TRUE
|
||||
require_target_anus = REQUIRE_EXPOSED
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/rimjob/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
|
||||
user.do_rimjob(target)
|
||||
|
||||
/datum/interaction/lewd/mountface
|
||||
command = "mountface"
|
||||
description = "Ass to face."
|
||||
interaction_sound = null
|
||||
require_target_mouth = TRUE
|
||||
require_user_anus = REQUIRE_EXPOSED
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/mountface/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
|
||||
user.do_mountface(target)
|
||||
|
||||
/datum/interaction/lewd/lickfeet
|
||||
command = "lickfeet"
|
||||
description = "Lick their feet."
|
||||
interaction_sound = null
|
||||
require_user_mouth = TRUE
|
||||
require_target_feet = REQUIRE_ANY
|
||||
require_target_num_feet = 1
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/lickfeet/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
|
||||
user.do_lickfeet(target)
|
||||
|
||||
/datum/interaction/lewd/grindface
|
||||
command = "grindface"
|
||||
description = "Feet grind their face."
|
||||
interaction_sound = null
|
||||
require_target_mouth = TRUE
|
||||
require_user_num_feet = 1
|
||||
require_user_feet = REQUIRE_ANY
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/grindface/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
|
||||
user.do_grindface(target)
|
||||
|
||||
/datum/interaction/lewd/grindmouth
|
||||
command = "grindmouth"
|
||||
description = "Feet grind their mouth."
|
||||
interaction_sound = null
|
||||
require_target_mouth = TRUE
|
||||
require_user_num_feet = 1
|
||||
require_user_feet = REQUIRE_ANY
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/grindmouth/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
|
||||
user.do_grindmouth(target)
|
||||
|
||||
/datum/interaction/lewd/footfuck
|
||||
command = "footfuck"
|
||||
description = "Rub your cock on their foot."
|
||||
interaction_sound = null
|
||||
require_target_num_feet = 1
|
||||
require_target_feet = REQUIRE_ANY
|
||||
require_user_penis = REQUIRE_EXPOSED
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/footfuck/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
|
||||
user.do_footfuck(target)
|
||||
|
||||
/datum/interaction/lewd/footfuck/double
|
||||
command = "footfuckdouble"
|
||||
description = "Rub your cock between their feet."
|
||||
require_target_num_feet = 2
|
||||
|
||||
/datum/interaction/lewd/footfuck/double/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
|
||||
user.do_dfootfuck(target)
|
||||
|
||||
/datum/interaction/lewd/footjob
|
||||
command = "footjob"
|
||||
description = "Jerk them off with your foot."
|
||||
interaction_sound = null
|
||||
require_user_num_feet = 1
|
||||
require_user_feet = REQUIRE_ANY
|
||||
require_target_penis = REQUIRE_EXPOSED
|
||||
max_distance = 1
|
||||
|
||||
/datum/interaction/lewd/footjob/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
|
||||
user.do_footjob(target)
|
||||
|
||||
/datum/interaction/lewd/footjob/double
|
||||
command = "footjob_double"
|
||||
description = "Jerk them off with both of your feet."
|
||||
require_user_num_feet = 2
|
||||
|
||||
/datum/interaction/lewd/footjob/double/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
|
||||
user.do_dfootjob(target)
|
||||
|
||||
/datum/interaction/lewd/footjob/vagina
|
||||
command = "footjob_vaginal"
|
||||
description = "Rub their vagina with your foot."
|
||||
require_target_vagina = REQUIRE_EXPOSED
|
||||
require_target_penis = REQUIRE_NONE
|
||||
|
||||
/datum/interaction/lewd/footjob/vagina/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
|
||||
user.do_footjob_v(target)
|
||||
|
||||
/datum/interaction/lewd/thighs
|
||||
command = "thigh_smother"
|
||||
description = "Smother them."
|
||||
max_distance = 1
|
||||
require_user_bottomless = TRUE
|
||||
require_target_mouth = TRUE
|
||||
interaction_sound = null
|
||||
write_log_user = "thigh-trapped"
|
||||
write_log_target = "was smothered by"
|
||||
|
||||
/datum/interaction/lewd/thighs/display_interaction(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target)
|
||||
user.thigh_smother(target)
|
||||
|
||||
/datum/interaction/lewd/nuts
|
||||
command = "nut_face"
|
||||
description = "Nuts to face."
|
||||
interaction_sound = null
|
||||
require_user_balls = REQUIRE_EXPOSED
|
||||
require_target_mouth = TRUE
|
||||
max_distance = 1
|
||||
write_log_user = "make-them-suck-their-nuts"
|
||||
write_log_target = "was made to suck nuts by"
|
||||
|
||||
/datum/interaction/lewd/nuts/display_interaction(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target)
|
||||
user.nut_face(target)
|
||||
|
||||
/datum/interaction/lewd/nut_smack
|
||||
command = "smack_nuts"
|
||||
description = "Smack their nuts."
|
||||
interaction_sound = 'modular_sand/sound/interactions/slap.ogg'
|
||||
simple_message = "USER slaps TARGET's nuts!"
|
||||
require_target_balls = REQUIRE_EXPOSED
|
||||
needs_physical_contact = TRUE
|
||||
max_distance = 1
|
||||
write_log_user = "slapped-nuts"
|
||||
write_log_target = "had their nuts slapped by"
|
||||
|
||||
//Weird shit section
|
||||
/datum/interaction/lewd/earfuck
|
||||
command = "earfuck"
|
||||
description = "Fuck their ear."
|
||||
interaction_sound = null
|
||||
simple_message = "USER penetrates TARGET's ear!"
|
||||
require_user_penis = REQUIRE_EXPOSED
|
||||
require_target_ears = REQUIRE_EXPOSED
|
||||
max_distance = 1
|
||||
write_log_user = "earfucked"
|
||||
write_log_target = "had their ear fucked by"
|
||||
extreme = TRUE
|
||||
|
||||
/datum/interaction/lewd/earfuck/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
|
||||
user.do_earfuck(target)
|
||||
|
||||
/datum/interaction/lewd/earfuck/earsocketfuck
|
||||
command = "earsocketfuck"
|
||||
description = "Fuck their earsocket."
|
||||
interaction_sound = null
|
||||
simple_message = "USER penetrates TARGET's earsocket!"
|
||||
require_user_penis = REQUIRE_EXPOSED
|
||||
require_target_earsockets = REQUIRE_EXPOSED
|
||||
max_distance = 1
|
||||
write_log_user = "earsocket fucked"
|
||||
write_log_target = "had their earsocket fucked by"
|
||||
extreme = TRUE
|
||||
|
||||
/datum/interaction/lewd/eyefuck
|
||||
command = "eyefuck"
|
||||
description = "Fuck their eye."
|
||||
interaction_sound = null
|
||||
simple_message = "USER penetrates TARGET's eye!"
|
||||
require_user_penis = REQUIRE_EXPOSED
|
||||
require_target_eyes = REQUIRE_EXPOSED
|
||||
max_distance = 1
|
||||
write_log_user = "eyefucked"
|
||||
write_log_target = "had their eye fucked by"
|
||||
extreme = TRUE
|
||||
|
||||
/datum/interaction/lewd/eyefuck/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
|
||||
user.do_eyefuck(target)
|
||||
|
||||
/datum/interaction/lewd/eyefuck/eyesocketfuck
|
||||
command = "eyesocketfuck"
|
||||
description = "Fuck their eyesocket."
|
||||
interaction_sound = null
|
||||
simple_message = "USER penetrates TARGET's eyesocket!"
|
||||
require_user_penis = REQUIRE_EXPOSED
|
||||
require_target_eyesockets = REQUIRE_EXPOSED
|
||||
max_distance = 1
|
||||
write_log_user = "eyesocketfucked"
|
||||
write_log_target = "had their eyesocket fucked by"
|
||||
extreme = TRUE
|
||||
//
|
||||
@@ -1,99 +0,0 @@
|
||||
/datum/interaction/lewd/frotting
|
||||
command = "frotting"
|
||||
description = "Rub your penis against theirs"
|
||||
require_user_penis = REQUIRE_EXPOSED
|
||||
require_target_penis = REQUIRE_EXPOSED
|
||||
max_distance = 1
|
||||
write_log_user = "frotted"
|
||||
write_log_target = "was frotted by"
|
||||
interaction_sound = null
|
||||
|
||||
/datum/interaction/lewd/frotting/display_interaction(mob/living/user, mob/living/target)
|
||||
user.do_frot(target)
|
||||
|
||||
/datum/interaction/lewd/do_breastfeed
|
||||
command = "do_breastfeed"
|
||||
description = "Breastfeed them"
|
||||
require_user_breasts = REQUIRE_EXPOSED
|
||||
require_target_mouth = TRUE
|
||||
max_distance = 1
|
||||
write_log_user = "breastfed"
|
||||
write_log_target = "was breastfed by"
|
||||
interaction_sound = null
|
||||
|
||||
/datum/interaction/lewd/do_breastfeed/display_interaction(mob/living/user, mob/living/target)
|
||||
user.do_breastfeed(target)
|
||||
|
||||
/**
|
||||
* Self Interactions!
|
||||
*/
|
||||
|
||||
/datum/interaction/lewd/jack
|
||||
command = "jack"
|
||||
description = "Jerk yourself off."
|
||||
interaction_sound = null
|
||||
require_user_hands = TRUE
|
||||
require_user_penis = REQUIRE_EXPOSED
|
||||
user_is_target = TRUE
|
||||
max_distance = 0
|
||||
write_log_user = "jerked off"
|
||||
write_log_target = null
|
||||
|
||||
/datum/interaction/lewd/jack/display_interaction(mob/living/carbon/human/user)
|
||||
user.do_jackoff(user)
|
||||
|
||||
/datum/interaction/lewd/fingerass_self
|
||||
command = "fingerm_self"
|
||||
description = "Finger yourself."
|
||||
interaction_sound = null
|
||||
require_user_hands = TRUE
|
||||
require_user_anus = REQUIRE_EXPOSED
|
||||
user_is_target = TRUE
|
||||
max_distance = 0
|
||||
write_log_user = "fingered self"
|
||||
write_log_target = null
|
||||
|
||||
/datum/interaction/lewd/fingerass_self/display_interaction(mob/living/carbon/human/user)
|
||||
user.do_fingerass_self(user)
|
||||
|
||||
/datum/interaction/lewd/finger_self
|
||||
command = "finger_self"
|
||||
description = "Finger your own pussy."
|
||||
require_user_hands = TRUE
|
||||
require_user_vagina = REQUIRE_EXPOSED
|
||||
interaction_sound = null
|
||||
user_is_target = TRUE
|
||||
max_distance = 0
|
||||
write_log_user = "fingered own pussy"
|
||||
write_log_target = null
|
||||
|
||||
/datum/interaction/lewd/finger_self/display_interaction(mob/living/carbon/human/user)
|
||||
user.do_fingering_self(user)
|
||||
|
||||
/datum/interaction/lewd/titgrope_self
|
||||
command = "titgrope_self"
|
||||
description = "Grope your own breasts."
|
||||
require_user_hands = TRUE
|
||||
require_user_breasts = REQUIRE_ANY
|
||||
user_is_target = TRUE
|
||||
interaction_sound = null
|
||||
max_distance = 0
|
||||
write_log_user = "groped own breasts"
|
||||
write_log_target = null
|
||||
|
||||
/datum/interaction/lewd/titgrope_self/display_interaction(mob/living/carbon/human/user)
|
||||
user.do_titgrope_self(user)
|
||||
|
||||
/datum/interaction/lewd/self_nipsuck
|
||||
command = "self_nipsuck"
|
||||
description = "Suck your own nips."
|
||||
require_user_breasts = REQUIRE_EXPOSED
|
||||
require_user_mouth = TRUE
|
||||
user_is_target = TRUE
|
||||
interaction_sound = null
|
||||
max_distance = 0
|
||||
write_log_user = "sucked their own nips"
|
||||
write_log_target = null
|
||||
|
||||
/datum/interaction/lewd/self_nipsuck/display_interaction(mob/living/user, mob/living/target)
|
||||
user.do_breastfeed(user)
|
||||
@@ -514,7 +514,7 @@
|
||||
user.cleartimer = addtimer(CALLBACK(user, /mob/living/proc/clear_lewd_datum), 300, TIMER_STOPPABLE)
|
||||
return ..()
|
||||
|
||||
/mob/living/list_interaction_attributes(var/mob/living/LM)
|
||||
/mob/living/list_interaction_attributes(mob/living/LM)
|
||||
var/dat = ..()
|
||||
if(get_refraction_dif())
|
||||
dat += "...are sexually exhausted for the time being."
|
||||
@@ -548,10 +548,13 @@
|
||||
else
|
||||
dat += "...have covered eyes."
|
||||
//
|
||||
if(is_topless() && is_bottomless())
|
||||
// check those loops only once, thanks
|
||||
var/is_topless = is_topless()
|
||||
var/is_bottomless = is_bottomless()
|
||||
if(is_topless && is_bottomless)
|
||||
dat += "...are naked."
|
||||
else
|
||||
if((is_topless() && !is_bottomless()) || (!is_topless() && is_bottomless()))
|
||||
if((is_topless && !is_bottomless) || (!is_topless && is_bottomless))
|
||||
dat += "...are partially clothed."
|
||||
else
|
||||
dat += "...are clothed."
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
/**
|
||||
* Seriously this is the worst way to do this,
|
||||
* warn me if there's ANY reason i would ever
|
||||
* use this. Humans have GENITALS, ACTUAL ORGANS,
|
||||
* we don't need to check booleans!
|
||||
* If this does not get an use sometime,
|
||||
* i want this file gone.
|
||||
*/
|
||||
|
||||
/*
|
||||
/datum/species
|
||||
var/has_genitals = TRUE //if this goes to 2, blame coders
|
||||
var/has_anus = TRUE //same with this
|
||||
var/has_breasts = FALSE
|
||||
|
||||
/datum/species/proc/has_penis(mob/living/carbon/human/H)
|
||||
return has_genitals && H.has_penis
|
||||
|
||||
/datum/species/proc/has_vagina(mob/living/carbon/human/H)
|
||||
return has_genitals && H.has_vagina
|
||||
|
||||
/datum/species/proc/has_anus(mob/living/carbon/human/H)
|
||||
return has_anus
|
||||
|
||||
/datum/species/proc/has_breasts(mob/living/carbon/human/H)
|
||||
return has_breasts
|
||||
*/
|
||||
+18
-4
@@ -3879,12 +3879,26 @@
|
||||
#include "modular_sand\code\datums\interactions\interaction_interface.dm"
|
||||
#include "modular_sand\code\datums\interactions\interaction_mob.dm"
|
||||
#include "modular_sand\code\datums\interactions\lewd\_lewd.dm"
|
||||
#include "modular_sand\code\datums\interactions\lewd\_lewd_extra.dm"
|
||||
#include "modular_sand\code\datums\interactions\lewd\lewd_datums.dm"
|
||||
#include "modular_sand\code\datums\interactions\lewd\lewd_datums_extra.dm"
|
||||
#include "modular_sand\code\datums\interactions\lewd\lewd_interactions.dm"
|
||||
#include "modular_sand\code\datums\interactions\lewd\lewd_species.dm"
|
||||
#include "modular_sand\code\datums\interactions\lewd\objects.dm"
|
||||
#include "modular_sand\code\datums\interactions\lewd\interactions\breasts.dm"
|
||||
#include "modular_sand\code\datums\interactions\lewd\interactions\facefuck.dm"
|
||||
#include "modular_sand\code\datums\interactions\lewd\interactions\feet.dm"
|
||||
#include "modular_sand\code\datums\interactions\lewd\interactions\finger.dm"
|
||||
#include "modular_sand\code\datums\interactions\lewd\interactions\frotting.dm"
|
||||
#include "modular_sand\code\datums\interactions\lewd\interactions\fuck.dm"
|
||||
#include "modular_sand\code\datums\interactions\lewd\interactions\handjob.dm"
|
||||
#include "modular_sand\code\datums\interactions\lewd\interactions\kiss.dm"
|
||||
#include "modular_sand\code\datums\interactions\lewd\interactions\lick.dm"
|
||||
#include "modular_sand\code\datums\interactions\lewd\interactions\mount.dm"
|
||||
#include "modular_sand\code\datums\interactions\lewd\interactions\nipsuck.dm"
|
||||
#include "modular_sand\code\datums\interactions\lewd\interactions\nuts.dm"
|
||||
#include "modular_sand\code\datums\interactions\lewd\interactions\oral.dm"
|
||||
#include "modular_sand\code\datums\interactions\lewd\interactions\cursed\earfuck.dm"
|
||||
#include "modular_sand\code\datums\interactions\lewd\interactions\cursed\eyefuck.dm"
|
||||
#include "modular_sand\code\datums\interactions\lewd\interactions\self\breasts.dm"
|
||||
#include "modular_sand\code\datums\interactions\lewd\interactions\self\finger.dm"
|
||||
#include "modular_sand\code\datums\interactions\lewd\interactions\self\jack.dm"
|
||||
#include "modular_sand\code\datums\mood_events\generic_negative_events.dm"
|
||||
#include "modular_sand\code\datums\mood_events\needs_events.dm"
|
||||
#include "modular_sand\code\datums\mutations\combined.dm"
|
||||
|
||||
Reference in New Issue
Block a user