#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" //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 /*-------------------------------------------------- -------------------MOB STUFF---------------------- -------------------------------------------------- */ //I'm sorry, lewd should not have mob procs such as life() and such in it. //NO SHIT IT SHOULDNT I REMOVED THEM // Lewd interactions have a blacklist for certain mobs. When we evalute the user and target, both of // their requirements must be satisfied, and the mob must not be of a blacklisted type. // This should not be too weighty on the server, as the check is only run to generate the menu options. /datum/interaction/lewd/evaluate_user(mob/living/user, silent) . = ..() if(.) if((user.stat == DEAD)) return FALSE for(var/check in blacklisted_mobs) if(istype(user, check)) return FALSE /datum/interaction/lewd/evaluate_target(mob/living/user, mob/living/target, silent = TRUE) . = ..() if(.) if((target.stat == DEAD)) return FALSE for(var/check in blacklisted_mobs) if(istype(target, check)) return FALSE /proc/playlewdinteractionsound(turf/turf_source, soundin, vol as num, vary, extrarange as num ,frequency, falloff, channel = 0, pressure_affected = TRUE, sound/S, envwet = -10000, envdry = 0, manual_x, manual_y) var/list/hearing_mobs for(var/mob/H in get_hearers_in_view(4, turf_source)) if(!H.client || (H.client.prefs.toggles & LEWD_VERB_SOUNDS)) continue LAZYADD(hearing_mobs, H) for(var/mob/H in hearing_mobs) H.playsound_local(turf_source, soundin, vol, vary, frequency, falloff) /mob/living var/has_penis = FALSE var/has_vagina = FALSE var/has_breasts = FALSE var/last_partner var/last_orifice var/obj/item/organ/last_genital var/lastmoan var/sexual_potency = 15 var/lust_tolerance = 100 var/lastlusttime = 0 var/lust = 0 var/multiorgasms = 1 var/refractory_period = 0 var/last_interaction_time = 0 var/datum/interaction/lewd/last_lewd_datum //Recording our last lewd datum allows us to do stuff like custom cum messages. //Yes i feel like an idiot writing this. var/cleartimer //Timer for clearing the "last_lewd_datum". This prevents some oddities. /mob/living/proc/clear_lewd_datum() last_lewd_datum = null last_genital = null /mob/living/Initialize() . = ..() sexual_potency = rand(10,25) lust_tolerance = rand(75,200) /mob/living/proc/get_refraction_dif() var/dif = (refractory_period - world.time) if(dif < 0) return 0 else return dif /mob/living/proc/add_lust(add) var/cur = src.get_lust() //GetLust handles per-time lust loss if((cur + add) < 0) //in case we retract lust lust = 0 else lust = cur + add /mob/living/proc/get_lust() var/curtime = world.time var/dif = (curtime - lastlusttime)/10 //how much lust would we lose over time if((lust - dif) < 0) lust = 0 else lust = lust - dif lastlusttime = world.time return lust /mob/living/proc/set_lust(num) lust = num lastlusttime = world.time /mob/living/proc/has_penis(var/nintendo = REQUIRE_ANY) var/mob/living/carbon/C = src if(issilicon(src) && C.has_penis) return TRUE if(istype(C)) var/obj/item/organ/genital/peepee = C.getorganslot(ORGAN_SLOT_PENIS) if(peepee) switch(nintendo) if(REQUIRE_ANY) return TRUE if(REQUIRE_EXPOSED) if(peepee.is_exposed()) return TRUE else return FALSE if(REQUIRE_UNEXPOSED) if(!peepee.is_exposed()) return TRUE else return FALSE else return TRUE return FALSE /mob/living/proc/has_balls(var/nintendo = REQUIRE_ANY) var/mob/living/carbon/C = src if(istype(C)) var/obj/item/organ/genital/peepee = C.getorganslot(ORGAN_SLOT_TESTICLES) if(peepee) switch(nintendo) if(REQUIRE_ANY) return TRUE if(REQUIRE_EXPOSED) if(peepee.is_exposed()) return TRUE else return FALSE if(REQUIRE_UNEXPOSED) if(!peepee.is_exposed()) return TRUE else return FALSE else return TRUE return FALSE /mob/living/proc/has_vagina(var/nintendo = REQUIRE_ANY) var/mob/living/carbon/C = src if(issilicon(src) && C.has_vagina) return TRUE if(istype(C)) var/obj/item/organ/genital/peepee = C.getorganslot(ORGAN_SLOT_VAGINA) if(peepee) switch(nintendo) if(REQUIRE_ANY) return TRUE if(REQUIRE_EXPOSED) if(peepee.is_exposed()) return TRUE else return FALSE if(REQUIRE_UNEXPOSED) if(!peepee.is_exposed()) return TRUE else return FALSE else return TRUE return FALSE /mob/living/proc/has_breasts(var/nintendo = REQUIRE_ANY) var/mob/living/carbon/C = src if(istype(C)) var/obj/item/organ/genital/peepee = C.getorganslot(ORGAN_SLOT_BREASTS) if(peepee) switch(nintendo) if(REQUIRE_ANY) return TRUE if(REQUIRE_EXPOSED) if(peepee.is_exposed()) return TRUE else return FALSE if(REQUIRE_UNEXPOSED) if(!peepee.is_exposed()) return TRUE else return FALSE else return TRUE return FALSE /mob/living/proc/has_anus(var/nintendo = REQUIRE_ANY) if(issilicon(src)) return TRUE switch(nintendo) if(REQUIRE_EXPOSED) if(is_bottomless()) return TRUE else return FALSE if(REQUIRE_ANY) return TRUE if(REQUIRE_UNEXPOSED) if(!is_bottomless()) return TRUE else return FALSE else return TRUE /mob/living/proc/has_hand(var/nintendo = REQUIRE_ANY) if(iscarbon(src)) var/mob/living/carbon/C = src var/handcount = 0 var/covered = 0 var/iscovered = FALSE for(var/obj/item/bodypart/l_arm/L in C.bodyparts) handcount++ for(var/obj/item/bodypart/r_arm/R in C.bodyparts) handcount++ if(C.get_item_by_slot(ITEM_SLOT_HANDS)) var/obj/item/clothing/gloves/G = C.get_item_by_slot(ITEM_SLOT_HANDS) covered = G.body_parts_covered if(covered & HANDS) iscovered = TRUE switch(nintendo) if(REQUIRE_ANY) return handcount if(REQUIRE_EXPOSED) if(iscovered) return FALSE else return handcount if(REQUIRE_UNEXPOSED) if(!iscovered) return FALSE else return handcount else return handcount return FALSE /mob/living/proc/has_feet(var/nintendo = REQUIRE_ANY) if(iscarbon(src)) var/mob/living/carbon/C = src var/feetcount = 0 var/covered = 0 var/iscovered = FALSE for(var/obj/item/bodypart/l_leg/L in C.bodyparts) feetcount++ for(var/obj/item/bodypart/r_leg/R in C.bodyparts) feetcount++ if(C.get_item_by_slot(SLOT_SHOES)) var/obj/item/clothing/shoes/S = C.get_item_by_slot(SLOT_SHOES) covered = S.body_parts_covered if(covered & FEET) iscovered = TRUE switch(nintendo) if(REQUIRE_ANY) return feetcount if(REQUIRE_EXPOSED) if(iscovered) return FALSE else return feetcount if(REQUIRE_UNEXPOSED) if(!iscovered) return FALSE else return feetcount else return feetcount return FALSE /mob/living/proc/get_num_feet() return has_feet(REQUIRE_ANY) //weird procs go here /mob/living/proc/has_ears(var/nintendo = REQUIRE_ANY) var/mob/living/carbon/C = src if(istype(C)) var/obj/item/organ/peepee = C.getorganslot(ORGAN_SLOT_EARS) if(peepee) switch(nintendo) if(REQUIRE_ANY) return TRUE if(REQUIRE_EXPOSED) if(C.get_item_by_slot(ITEM_SLOT_EARS)) return FALSE else return TRUE if(REQUIRE_UNEXPOSED) if(!C.get_item_by_slot(ITEM_SLOT_EARS)) return FALSE else return TRUE else return TRUE return FALSE /mob/living/proc/has_earsockets(var/nintendo = REQUIRE_ANY) var/mob/living/carbon/C = src if(istype(C)) var/obj/item/organ/peepee = C.getorganslot(ORGAN_SLOT_EARS) if(!peepee) switch(nintendo) if(REQUIRE_ANY) return TRUE if(REQUIRE_EXPOSED) if(C.get_item_by_slot(ITEM_SLOT_EARS)) return FALSE else return TRUE if(REQUIRE_UNEXPOSED) if(!C.get_item_by_slot(ITEM_SLOT_EARS)) return FALSE else return TRUE else return TRUE return FALSE /mob/living/proc/has_eyes(var/nintendo = REQUIRE_ANY) var/mob/living/carbon/C = src if(istype(C)) var/obj/item/organ/peepee = C.getorganslot(ORGAN_SLOT_EYES) if(peepee) switch(nintendo) if(REQUIRE_ANY) return TRUE if(REQUIRE_EXPOSED) if(C.get_item_by_slot(ITEM_SLOT_EYES)) return FALSE else return TRUE if(REQUIRE_UNEXPOSED) if(!C.get_item_by_slot(ITEM_SLOT_EYES)) return FALSE else return TRUE else return TRUE return FALSE /mob/living/proc/has_eyesockets(var/nintendo = REQUIRE_ANY) var/mob/living/carbon/C = src if(istype(C)) var/obj/item/organ/peepee = C.getorganslot(ORGAN_SLOT_EYES) if(!peepee) switch(nintendo) if(REQUIRE_ANY) return TRUE if(REQUIRE_EXPOSED) if(get_item_by_slot(ITEM_SLOT_EYES)) return FALSE else return TRUE if(REQUIRE_UNEXPOSED) if(!get_item_by_slot(ITEM_SLOT_EYES)) return FALSE else return TRUE else return TRUE return FALSE // /mob/living/proc/is_topless() if(istype(src, /mob/living/carbon/human)) var/mob/living/carbon/human/H = src if((!(H.wear_suit) || !(H.wear_suit.body_parts_covered & CHEST)) && (!(H.w_uniform) || !(H.w_uniform.body_parts_covered & CHEST))) return TRUE else return TRUE /mob/living/proc/is_bottomless() if(istype(src, /mob/living/carbon/human)) var/mob/living/carbon/human/H = src if((!(H.wear_suit) || !(H.wear_suit.body_parts_covered & GROIN)) && (!(H.w_uniform) || !(H.w_uniform.body_parts_covered & GROIN))) return TRUE else return TRUE /* /proc/cum_splatter(target, var/mob/living/user) // Like blood_splatter(), but much more questionable on a resume. if(user.has_penis() && !user.has_vagina()) new /obj/effect/decal/cleanable/semen(get_turf(target)) else if(user.has_vagina() && !user.has_penis()) new /obj/effect/decal/cleanable/femcum(get_turf(target)) else if(user.has_vagina() && user.has_penis()) new /obj/effect/decal/cleanable/femcum(get_turf(target)) new /obj/effect/decal/cleanable/semen(get_turf(target)) //var/obj/effect/decal/cleanable/cum/C = (get_turf(target)) //C.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"])) */ /mob/living/proc/moan() if(!(prob(get_lust() / lust_tolerance * 65))) return var/moan = rand(1, 7) if(moan == lastmoan) moan-- if(!is_muzzled()) visible_message(message = "\The [src] [pick("moans", "moans in pleasure")].", ignored_mobs = get_unconsenting()) //playsound(get_turf(src), "code/game/lewd/sound/interactions/moan_[gender == FEMALE ? "f" : "m"][rand(1, 7)].ogg", 70, 1, 0) if(is_muzzled())//immursion visible_message("[src] [pick("mimes a pleasured moan","moans in silence")].") lastmoan = moan /mob/living/proc/cum(mob/living/partner, target_orifice) var/message var/cumin = FALSE if(src != partner) if(!last_genital) if(has_penis()) if(!istype(partner)) target_orifice = null switch(target_orifice) if(CUM_TARGET_MOUTH) if(partner.has_mouth() && partner.mouth_is_free()) message = "cums right in \the [partner]'s mouth." cumin = TRUE else message = "cums on \the [partner]'s face." if(CUM_TARGET_THROAT) if(partner.has_mouth() && partner.mouth_is_free()) message = "shoves deep into \the [partner]'s throat and cums." cumin = TRUE else message = "cums on \the [partner]'s face." if(CUM_TARGET_VAGINA) if(partner.has_vagina(REQUIRE_EXPOSED)) message = "cums in \the [partner]'s pussy." cumin = TRUE else message = "cums on \the [partner]'s belly." if(CUM_TARGET_ANUS) if(partner.has_anus(REQUIRE_EXPOSED)) message = "cums in \the [partner]'s asshole." cumin = TRUE else message = "cums on \the [partner]'s backside." if(CUM_TARGET_HAND) if(partner.has_hand(REQUIRE_ANY)) message = "cums in \the [partner]'s hand." else message = "cums on \the [partner]." if(CUM_TARGET_BREASTS) if(partner.has_breasts(REQUIRE_EXPOSED)) message = "cums onto \the [partner]'s breasts." else message = "cums on \the [partner]'s chest and neck." if(NUTS_TO_FACE) if(partner.has_mouth() && partner.mouth_is_free()) message = "vigorously ruts their nutsack into \the [partner]'s mouth before shooting their thick, sticky jizz all over their eyes and hair." if(THIGH_SMOTHERING) if(src.has_penis(REQUIRE_EXPOSED)) //it already checks for the cock before, why the hell would you do this redundant shit message = "keeps \the [partner] locked in their thighs as their cock throbs, dumping its heavy load all over their face." else message = "reaches their peak, locking their legs around \the [partner]'s head extra hard as they cum straight onto the head stuck between their thighs" cumin = TRUE if(CUM_TARGET_FEET) if(!last_lewd_datum.require_target_num_feet) if(partner.has_feet()) message = "cums on \the [partner]'s [partner.has_feet() == 1 ? pick("foot", "sole") : pick("feet", "soles")]." else message = "cums on the floor!" else if(partner.has_feet()) message = "cums on \the [partner]'s [last_lewd_datum.require_target_feet == 1 ? pick("foot", "sole") : pick("feet", "soles")]." else message = "cums on the floor!" //weird shit goes here if(CUM_TARGET_EARS) if(partner.has_ears()) message = "cums inside \the [partner]'s ear." else message = "cums inside \the [partner]'s earsocket." cumin = TRUE if(CUM_TARGET_EYES) if(partner.has_eyes()) message = "cums on \the [partner]'s eyeball." else message = "cums inside \the [partner]'s eyesocket." cumin = TRUE // else message = "cums on the floor!" else if(has_vagina()) if(!istype(partner)) target_orifice = null switch(target_orifice) if(CUM_TARGET_MOUTH) if(partner.has_mouth() && partner.mouth_is_free()) message = "squirts right in \the [partner]'s mouth." cumin = TRUE else message = "squirts on \the [partner]'s face." if(CUM_TARGET_THROAT) if(partner.has_mouth() && partner.mouth_is_free()) message = "rubs their vagina against \the [partner]'s mouth and cums." cumin = TRUE else message = "squirts on \the [partner]'s face." if(CUM_TARGET_VAGINA) if(partner.has_vagina(REQUIRE_EXPOSED)) message = "squirts on \the [partner]'s pussy." cumin = TRUE else message = "squirts on \the [partner]'s belly." if(CUM_TARGET_ANUS) if(partner.has_anus(REQUIRE_EXPOSED)) message = "squirts on \the [partner]'s asshole." cumin = TRUE else message = "squirts on \the [partner]'s backside." if(CUM_TARGET_HAND) if(partner.has_hand(REQUIRE_ANY)) message = "squirts on \the [partner]'s hand." else message = "squirts on \the [partner]." if(CUM_TARGET_BREASTS) if(partner.has_breasts(REQUIRE_EXPOSED)) message = "squirts onto \the [partner]'s breasts." else message = "squirts on \the [partner]'s chest and neck." if(NUTS_TO_FACE) if(partner.has_mouth() && partner.mouth_is_free()) message = "vigorously ruts their clit into \the [partner]'s mouth before shooting their femcum all over their eyes and hair." if(THIGH_SMOTHERING) message = "keeps \the [partner] locked in their thighs as they orgasm, squirting over their face." cumin = TRUE if(CUM_TARGET_FEET) if(!last_lewd_datum.require_target_num_feet) if(partner.has_feet()) message = "squirts on \the [partner]'s [partner.has_feet() == 1 ? pick("foot", "sole") : pick("feet", "soles")]." else message = "squirts on the floor!" else if(partner.has_feet()) message = "squirts on \the [partner]'s [last_lewd_datum.require_target_feet == 1 ? pick("foot", "sole") : pick("feet", "soles")]." else message = "squirts on the floor!" //weird shit goes here if(CUM_TARGET_EARS) if(partner.has_ears()) message = "squirts on \the [partner]'s ear." else message = "squirts on \the [partner]'s earsocket." cumin = TRUE if(CUM_TARGET_EYES) if(partner.has_eyes()) message = "squirts on \the [partner]'s eyeball." else message = "squirts on \the [partner]'s eyesocket." cumin = TRUE // else message = "squirts on the floor!" else message = pick("orgasms violently!", "twists in orgasm.") else switch(last_genital.type) if(/obj/item/organ/genital/penis) if(!istype(partner)) target_orifice = null switch(target_orifice) if(CUM_TARGET_MOUTH) if(partner.has_mouth() && partner.mouth_is_free()) message = "cums right in \the [partner]'s mouth." cumin = TRUE else message = "cums on \the [partner]'s face." if(CUM_TARGET_THROAT) if(partner.has_mouth() && partner.mouth_is_free()) message = "shoves deep into \the [partner]'s throat and cums." cumin = TRUE else message = "cums on \the [partner]'s face." if(CUM_TARGET_VAGINA) if(partner.has_vagina(REQUIRE_EXPOSED)) message = "cums in \the [partner]'s pussy." cumin = TRUE else message = "cums on \the [partner]'s belly." if(CUM_TARGET_ANUS) if(partner.has_anus(REQUIRE_EXPOSED)) message = "cums in \the [partner]'s asshole." cumin = TRUE else message = "cums on \the [partner]'s backside." if(CUM_TARGET_HAND) if(partner.has_hand()) message = "cums in \the [partner]'s hand." else message = "cums on \the [partner]." if(CUM_TARGET_BREASTS) if(partner.is_topless() && partner.has_breasts()) message = "cums onto \the [partner]'s breasts." else message = "cums on \the [partner]'s chest and neck." if(NUTS_TO_FACE) if(partner.has_mouth() && partner.mouth_is_free()) message = "vigorously ruts their nutsack into \the [partner]'s mouth before shooting their thick, sticky jizz all over their eyes and hair." if(THIGH_SMOTHERING) if(src.has_penis()) //it already checks for the cock before, why the hell would you do this redundant shit message = "keeps \the [partner] locked in their thighs as their cock throbs, dumping its heavy load all over their face." else message = "reaches their peak, locking their legs around \the [partner]'s head extra hard as they cum straight onto the head stuck between their thighs" cumin = TRUE if(CUM_TARGET_FEET) if(!last_lewd_datum || !last_lewd_datum.require_target_num_feet) if(partner.has_feet()) message = "cums on \the [partner]'s [partner.has_feet() == 1 ? pick("foot", "sole") : pick("feet", "soles")]." else message = "cums on the floor!" else if(partner.has_feet()) message = "cums on \the [partner]'s [last_lewd_datum.require_target_feet == 1 ? pick("foot", "sole") : pick("feet", "soles")]." else message = "cums on the floor!" //weird shit goes here if(CUM_TARGET_EARS) if(partner.has_ears()) message = "cums inside \the [partner]'s ear." else message = "cums inside \the [partner]'s earsocket." cumin = TRUE if(CUM_TARGET_EYES) if(partner.has_eyes()) message = "cums on \the [partner]'s eyeball." else message = "cums inside \the [partner]'s eyesocket." cumin = TRUE // else message = "cums on the floor!" if(/obj/item/organ/genital/vagina) if(!istype(partner)) target_orifice = null switch(target_orifice) if(CUM_TARGET_MOUTH) if(partner.has_mouth() && partner.mouth_is_free()) message = "squirts right in \the [partner]'s mouth." cumin = TRUE else message = "squirts on \the [partner]'s face." if(CUM_TARGET_THROAT) if(partner.has_mouth() && partner.mouth_is_free()) message = "rubs their vagina against \the [partner]'s mouth and cums." cumin = TRUE else message = "squirts on \the [partner]'s face." if(CUM_TARGET_VAGINA) if(partner.has_vagina(REQUIRE_EXPOSED)) message = "squirts on \the [partner]'s pussy." cumin = TRUE else message = "squirts on \the [partner]'s belly." if(CUM_TARGET_ANUS) if(partner.has_anus(REQUIRE_EXPOSED)) message = "squirts on \the [partner]'s asshole." cumin = TRUE else message = "squirts on \the [partner]'s backside." if(CUM_TARGET_HAND) if(partner.has_hand()) message = "squirts on \the [partner]'s hand." else message = "squirts on \the [partner]." if(CUM_TARGET_BREASTS) if(partner.has_breasts(REQUIRE_EXPOSED)) message = "squirts onto \the [partner]'s breasts." else message = "squirts on \the [partner]'s chest and neck." if(NUTS_TO_FACE) if(partner.has_mouth() && partner.mouth_is_free()) message = "vigorously ruts their clit into \the [partner]'s mouth before shooting their femcum all over their eyes and hair." if(THIGH_SMOTHERING) message = "keeps \the [partner] locked in their thighs as they orgasm, squirting over their face." if(CUM_TARGET_FEET) if(!last_lewd_datum || !last_lewd_datum.require_target_num_feet) if(partner.has_feet()) message = "squirts on \the [partner]'s [partner.has_feet() == 1 ? pick("foot", "sole") : pick("feet", "soles")]." else message = "squirts on the floor!" else if(partner.has_feet()) message = "squirts on \the [partner]'s [last_lewd_datum.require_target_feet == 1 ? pick("foot", "sole") : pick("feet", "soles")]." else message = "squirts on the floor!" //weird shit goes here if(CUM_TARGET_EARS) if(partner.has_ears()) message = "squirts on \the [partner]'s ear." else message = "squirts on \the [partner]'s earsocket." cumin = TRUE if(CUM_TARGET_EYES) if(partner.has_eyes()) message = "squirts on \the [partner]'s eyeball." else message = "squirts on \the [partner]'s eyesocket." cumin = TRUE // else message = "squirts on the floor!" else message = pick("orgasms violently!", "twists in orgasm.") else //todo: better self cum messages message = "cums all over themselves!" if(gender == MALE) playlewdinteractionsound(loc, pick('sandcode/sound/interactions/final_m1.ogg', 'sandcode/sound/interactions/final_m2.ogg', 'sandcode/sound/interactions/final_m3.ogg', 'sandcode/sound/interactions/final_m4.ogg', 'sandcode/sound/interactions/final_m5.ogg'), 90, 1, 0)//, pitch = get_age_pitch()) else if(gender == FEMALE) playlewdinteractionsound(loc, pick('sandcode/sound/interactions/final_f1.ogg', 'sandcode/sound/interactions/final_f2.ogg', 'sandcode/sound/interactions/final_f3.ogg'), 70, 1, 0)//, pitch = get_age_pitch()) else playlewdinteractionsound(loc, pick('sandcode/sound/interactions/final_f1.ogg', 'sandcode/sound/interactions/final_f2.ogg', 'sandcode/sound/interactions/final_f3.ogg'), 70, 1, 0)//, pitch = get_age_pitch()) visible_message(message = "\The [src] [message]", ignored_mobs = get_unconsenting()) multiorgasms += 1 /*if(multiorgasms == 1) add_logs(partner, src, "came on")*/ if(multiorgasms > (sexual_potency * 0.34)) //AAAAA, WE DONT WANT NEGATIVES HERE, RE refractory_period = world.time + rand(300, 900) - sexual_potency//sex cooldown src.set_drugginess(rand(20, 30)) else refractory_period = world.time + rand(300, 900) - sexual_potency src.set_drugginess(rand(5, 10)) if(multiorgasms < sexual_potency) if(ishuman(src)) var/mob/living/carbon/human/H = src if(!partner) H.mob_climax(TRUE, "none") else H.mob_climax(TRUE, partner, !cumin) set_lust(0) /* /mob/living/cum(mob/living/partner, target_orifice) . = ..() if(multiorgasms < sexual_potency) cum_splatter((partner ? partner : src), src) */ /mob/living/proc/is_fucking(mob/living/partner, orifice) if(partner == last_partner && orifice == last_orifice) return TRUE return FALSE /mob/living/proc/set_is_fucking(mob/living/partner, orifice, var/obj/item/organ/genital/genepool) last_partner = partner last_orifice = orifice last_genital = genepool /mob/living/proc/do_fucking_animation(fuckdir) // Today I wrote 'var/fuckdir' with a straight face. Not a milestone I ever expected to pass. dont worry, we dont use heretic proc/name(var/dir) if(!fuckdir) return dir = fuckdir var/pixel_x_diff = 0 var/pixel_y_diff = 0 var/final_pixel_y = initial(pixel_y) if(fuckdir & NORTH) pixel_y_diff = 8 else if(fuckdir & SOUTH) pixel_y_diff = -8 if(fuckdir & EAST) pixel_x_diff = 8 else if(fuckdir & WEST) pixel_x_diff = -8 if(pixel_x_diff == 0 && pixel_y_diff == 0) pixel_x_diff = rand(-3,3) pixel_y_diff = rand(-3,3) animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff, time = 2) animate(pixel_x = initial(pixel_x), pixel_y = initial(pixel_y), time = 2) return animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff, time = 2) animate(pixel_x = initial(pixel_x), pixel_y = final_pixel_y, time = 2) /*-------------------------------------------------- ---------------LEWD PROCESS DATUM----------------- -------------------------------------------------- */ /mob/living/proc/do_oral(mob/living/partner, var/fucktarget = "penis") var/message var/obj/item/organ/genital/peepee = null var/lust_increase = NORMAL_LUST if(partner.is_fucking(src, CUM_TARGET_MOUTH)) if(prob(partner.sexual_potency)) if(istype(src, /mob/living)) // Argh. var/mob/living/H = src H.adjustOxyLoss(3) message = "goes in deep on \the [partner]." lust_increase += 5 else var/improv = FALSE switch(fucktarget) if("vagina") if(partner.has_vagina()) message = pick( "licks \the [partner]'s pussy.", "runs their tongue up the shape of \the [partner]'s pussy.", "traces \the [partner]'s slit with their tongue.", "darts the tip of their tongue around \the [partner]'s clit.", "laps slowly at \the [partner].", "kisses \the [partner]'s delicate folds.", "tastes \the [partner].", ) else improv = TRUE if("penis") if(partner.has_penis()) message = pick( "sucks \the [partner]'s off.", "runs their tongue up the shape of \the [partner]'s cock.", "traces \the [partner]'s cock with their tongue.", "darts the tip of their tongue around tip of \the [partner]'s cock.", "laps slowly at \the [partner]'s shaft.", "kisses the base of \the [partner]'s shaft.", "takes \the [partner] deeper into their mouth.", ) else improv = TRUE if(improv) // get confused about how to do the sex message = pick( "licks \the [partner].", "looks a little unsure of where to lick \the [partner].", "runs their tongue between \the [partner]'s legs.", "kisses \the [partner]'s thigh.", "tries their best with \the [partner].", ) else var/improv = FALSE switch(fucktarget) if("vagina") if(partner.has_vagina()) message = pick( "buries their face in \the [partner]'s pussy.", "nuzzles \the [partner]'s wet sex.", "finds their face caught between \the [partner]'s thighs.", "kneels down between \the [partner]'s legs.", "grips \the [partner]'s legs, pushing them apart.", "sinks their face in between \the [partner]'s thighs.", ) else improv = TRUE if("penis") if(partner.has_penis()) message = pick( "takes \the [partner]'s cock into their mouth.", "wraps their lips around \the [partner]'s cock.", "finds their face between \the [partner]'s thighs.", "kneels down between \the [partner]'s legs.", "grips \the [partner]'s legs, kissing at the tip of their cock.", "goes down on \the [partner].", ) else improv = TRUE if(improv) message = pick( "begins to lick \the [partner].", "starts kissing \the [partner]'s thigh.", "sinks down between \the [partner]'s thighs.", "briefly flashes a puzzled look from between \the [partner]'s legs.", "looks unsure of how to handle \the [partner]'s lack of genitalia.", "seems like they were expecting \the [partner] to have a cock or a pussy or ... something.", ) peepee = null else if(ishuman(partner)) var/mob/living/carbon/human/pardner = partner switch(fucktarget) if("vagina") peepee = pardner.getorganslot(ORGAN_SLOT_VAGINA) if("penis") peepee = pardner.getorganslot(ORGAN_SLOT_PENIS) partner.set_is_fucking(src, CUM_TARGET_MOUTH, peepee) playlewdinteractionsound(get_turf(src), pick( 'sandcode/sound/interactions/bj1.ogg', 'sandcode/sound/interactions/bj2.ogg', 'sandcode/sound/interactions/bj3.ogg', 'sandcode/sound/interactions/bj4.ogg', 'sandcode/sound/interactions/bj5.ogg', 'sandcode/sound/interactions/bj6.ogg', 'sandcode/sound/interactions/bj7.ogg', 'sandcode/sound/interactions/bj8.ogg', 'sandcode/sound/interactions/bj9.ogg', 'sandcode/sound/interactions/bj10.ogg', 'sandcode/sound/interactions/bj11.ogg'), 50, 1, -1) visible_message(message = "\The [src] [message]", ignored_mobs = get_unconsenting()) partner.handle_post_sex(lust_increase, CUM_TARGET_MOUTH, src) partner.dir = get_dir(partner,src) do_fucking_animation(get_dir(src, partner)) lust_increase = NORMAL_LUST //RESET IT REE /mob/living/proc/do_facefuck(mob/living/partner, var/fucktarget = "penis") var/message var/obj/item/organ/genital/peepee = null var/retaliation_message = FALSE if(is_fucking(partner, CUM_TARGET_MOUTH)) var/improv = FALSE switch(fucktarget) if("vagina") if(has_vagina()) message = pick( "grinds their pussy into \the [partner]'s face.", "grips the back of \the [partner]'s head, forcing them onto their pussy.", "rolls their pussy against \the [partner]'s tongue.", "slides \the [partner]'s mouth between their legs.", "looks \the [partner]'s in the eyes as their pussy presses into a waiting tongue.", "sways their hips, pushing their sex into \the [partner]'s face.", ) if(partner.a_intent == INTENT_HARM) // src.adjustBruteLoss(5) retaliation_message = pick( "looks deeply displeased to be there.", "struggles to escape from between \the [src]'s thighs.", ) else improv = TRUE if("penis") if(has_penis()) message = pick( "roughly fucks \the [partner]'s mouth.", "forces their cock down \the [partner]'s throat.", "pushes in against \the [partner]'s tongue until a tight gagging sound comes.", "grips \the [partner]'s hair and draws them to the base of the cock.", "looks \the [partner]'s in the eyes as their cock presses into a waiting tongue.", "rolls their hips hard, sinking into \the [partner]'s mouth.", ) if(partner.a_intent == INTENT_HARM) // src.adjustBruteLoss(5) retaliation_message = pick( "stares up from between \the [src]'s knees, trying to squirm away.", "struggles to escape from between \the [src]'s legs.", ) else improv = TRUE if(improv) message = pick( "grinds against \the [partner]'s face.", "feels \the [partner]'s face between bare legs.", "pushes in against \the [partner]'s tongue.", "grips \the [partner]'s hair, drawing them into the strangely sexless spot between their legs.", "looks \the [partner]'s in the eyes as they're caught beneath two thighs.", "rolls their hips hard against \the [partner]'s face.", ) if(partner.a_intent == INTENT_HARM) // src.adjustBruteLoss(5) retaliation_message = pick( "stares up from between \the [src]'s knees, trying to squirm away.", "struggles to escape from between \the [src]'s legs.", ) else var/improv = FALSE switch(fucktarget) if("vagina") if(has_vagina()) message = "forces \the [partner]'s face into their pussy." else improv = TRUE if("penis") if(has_penis()) if(is_fucking(partner, CUM_TARGET_THROAT)) message = "retracts their cock from \the [partner]'s throat" else message = "shoves their cock into \the [partner]'s mouth" else improv = TRUE if(improv) message = "shoves their crotch into \the [partner]'s face." else if(ishuman(partner)) var/mob/living/carbon/human/pardner = partner switch(fucktarget) if("vagina") peepee = pardner.getorganslot(ORGAN_SLOT_VAGINA) if("penis") peepee = pardner.getorganslot(ORGAN_SLOT_PENIS) set_is_fucking(partner , CUM_TARGET_MOUTH, peepee) playlewdinteractionsound(loc, pick('sandcode/sound/interactions/oral1.ogg', 'sandcode/sound/interactions/oral2.ogg'), 70, 1, -1) visible_message(message = "\The [src] [message]", ignored_mobs = get_unconsenting()) if(retaliation_message) visible_message(message = "\The [partner] [retaliation_message]", ignored_mobs = get_unconsenting()) handle_post_sex(NORMAL_LUST, CUM_TARGET_MOUTH, partner) partner.dir = get_dir(partner,src) do_fucking_animation(get_dir(src, partner)) /mob/living/proc/thigh_smother(mob/living/partner, var/fucktarget = "penis") var/message var/obj/item/organ/genital/peepee = null var/lust_increase = 1 if(is_fucking(partner, THIGH_SMOTHERING)) var/improv = FALSE switch(fucktarget) if("vagina") if(has_vagina()) message = pick(list( "presses their weight down onto \the [partner]'s face, blocking their vision completely.", "rides \the [partner]'s face, grinding their wet pussy all over it.")) else improv = TRUE if("penis") if(has_penis()) message = pick(list("presses their weight down onto \the [partner]'s face, blocking their vision completely.", "forces their dick and nutsack into \the [partner]'s face as they're stuck locked in between their thighs.", "slips their cock into \the [partner]'s helpless mouth, keeping their shaft pressed hard into their face.")) else improv = TRUE if(improv) message = "rubs their groin up and down \the [partner]'s face." else var/improv = FALSE switch(fucktarget) if("vagina") if(has_vagina()) message = pick(list( "clambers over \the [partner]'s face and pins them down with their thighs, their moist slit rubbing all over \the [partner]'s mouth and nose.", "locks their legs around \the [partner]'s head before pulling it into their mound.")) else improv = TRUE if("penis") if(has_penis()) message = pick(list( "clambers over \the [partner]'s face and pins them down with their thighs, then slowly inching closer and covering their eyes and nose with their leaking erection.", "locks their legs around \the [partner]'s head before pulling it into their fat package, smothering them.")) else improv = TRUE if(improv) message = "deviously locks their legs around \the [partner]'s head and smothers it in their thighs." else if(ishuman(partner)) var/mob/living/carbon/human/pardner = partner switch(fucktarget) if("vagina") peepee = pardner.getorganslot(ORGAN_SLOT_VAGINA) if("penis") peepee = pardner.getorganslot(ORGAN_SLOT_PENIS) set_is_fucking(partner , THIGH_SMOTHERING, peepee) var file = pick('sandcode/sound/interactions/bj10.ogg', 'sandcode/sound/interactions/bj3.ogg', 'sandcode/sound/interactions/foot_wet1.ogg', 'sandcode/sound/interactions/foot_dry3.ogg') playlewdinteractionsound(loc, file, 70, 1, -1) visible_message(message = "\The [src] [message]", ignored_mobs = get_unconsenting()) handle_post_sex(lust_increase, THIGH_SMOTHERING, partner) partner.dir = get_dir(partner,src) do_fucking_animation(get_dir(src, partner)) playlewdinteractionsound(loc, pick('sandcode/sound/interactions/oral1.ogg', 'sandcode/sound/interactions/oral2.ogg'), 70, 1, -1) handle_post_sex(NORMAL_LUST, CUM_TARGET_MOUTH, partner) partner.dir = get_dir(partner,src) do_fucking_animation(get_dir(src, partner)) /mob/living/proc/do_throatfuck(mob/living/partner) var/message var/obj/item/organ/genital/peepee = null var/retaliation_message = FALSE if(is_fucking(partner, CUM_TARGET_THROAT)) message = "[pick( "brutally shoves their cock into \the [partner]'s throat to make them gag.", "chokes \the [partner] on their dick, going in balls deep.", "slams in and out of \the [partner]'s mouth, their balls slapping off their face.")]" if(rand(3)) partner.emote("chokes on \The [src]") if(prob(1) && istype(partner, /mob/living)) var/mob/living/H = partner H.adjustOxyLoss(5) //add_logs(src, partner, "attacked", src) //cmon, it's 1 in 100. how can it spam logs if(partner.a_intent == INTENT_HARM) // src.adjustBruteLoss(5) retaliation_message = pick( "stares up from between \the [src]'s knees, trying to squirm away.", "struggles to escape from between \the [src]'s legs.", ) else if(is_fucking(partner, CUM_TARGET_MOUTH)) message = "thrusts deeper into \the [partner]'s mouth and down their throat." if(ishuman(src)) var/mob/living/carbon/human/coomer = partner peepee = coomer.getorganslot(ORGAN_SLOT_PENIS) set_is_fucking(partner , CUM_TARGET_THROAT, peepee) else message = "forces their dick deep down \the [partner]'s throat" if(ishuman(src)) var/mob/living/carbon/human/coomer = partner peepee = coomer.getorganslot(ORGAN_SLOT_PENIS) set_is_fucking(partner , CUM_TARGET_THROAT, peepee) playlewdinteractionsound(loc, pick('sandcode/sound/interactions/oral1.ogg', 'sandcode/sound/interactions/oral2.ogg'), 70, 1, -1) visible_message(message = "\The [src] [message]", ignored_mobs = get_unconsenting()) if(retaliation_message) visible_message(message = "\The [partner] [retaliation_message]", ignored_mobs = get_unconsenting()) handle_post_sex(NORMAL_LUST, CUM_TARGET_THROAT, partner) partner.dir = get_dir(partner,src) do_fucking_animation(get_dir(src, partner)) /mob/living/proc/nut_face(var/mob/living/partner) var/message var/lust_increase = 1 if(is_fucking(partner, NUTS_TO_FACE)) message = pick(list( "grabs the back of [partner]'s head and pulls it into their crotch.", "jams their nutsack right into [partner]'s face.", "roughly grinds their fat nutsack into [partner]'s mouth.", "pulls out their saliva-covered nuts from [partner]'s violated mouth and then wipes off the slime onto their face.")) else message = pick(list("wedges a digit into the side of [partner]'s jaw and pries it open before using their other hand to shove their whole nutsack inside!", "stands with their groin inches away from [partner]'s face, then thrusting their hips forward and smothering [partner]'s whole face with their heavy ballsack.")) set_is_fucking(partner , NUTS_TO_FACE, getorganslot(ORGAN_SLOT_PENIS) ? getorganslot(ORGAN_SLOT_PENIS) : null) /*playlewdinteractionsound(loc, pick('sandcode/sound/interactions/nuts1.ogg', 'sandcode/sound/interactions/nuts2.ogg', 'sandcode/sound/interactions/nuts3.ogg', 'sandcode/sound/interactions/nuts4.ogg'), 70, 1, -1)*/ //These files don't even exist but nobody noticed because double-quotes were used instead of single. visible_message(message = "\The [src] [message]", ignored_mobs = get_unconsenting()) handle_post_sex(lust_increase, CUM_TARGET_MOUTH, partner) partner.dir = get_dir(partner,src) do_fucking_animation(get_dir(src, partner)) /mob/living/proc/do_anal(mob/living/partner) var/message if(is_fucking(partner, CUM_TARGET_ANUS)) message = "[pick( "thrusts in and out of \the [partner]'s ass.", "pounds \the [partner]'s ass.", "slams their hips up against \the [partner]'s ass hard.", "goes balls deep into \the [partner]'s ass over and over again.")]" else message = "[pick( "works their cock into \the [partner]'s asshole.", "grabs the base of their twitching cock and presses the tip into \the [partner]'s asshole.", "shoves their dick deep inside of \the [partner]'s ass, making their rear jiggle.")]" set_is_fucking(partner, CUM_TARGET_ANUS, getorganslot(ORGAN_SLOT_PENIS) ? getorganslot(ORGAN_SLOT_PENIS) : null) playlewdinteractionsound(loc, pick('sandcode/sound/interactions/bang1.ogg', 'sandcode/sound/interactions/bang2.ogg', 'sandcode/sound/interactions/bang3.ogg'), 70, 1, -1) visible_message(message = "\The [src] [message]", ignored_mobs = get_unconsenting()) handle_post_sex(NORMAL_LUST, CUM_TARGET_ANUS, partner) partner.handle_post_sex(NORMAL_LUST, null, src) partner.dir = get_dir(src, partner) do_fucking_animation(get_dir(src, partner)) /mob/living/proc/do_vaginal(mob/living/partner) var/message if(is_fucking(partner, CUM_TARGET_VAGINA)) message = "[pick( "pounds \the [partner]'s pussy.", "shoves their dick deep into \the [partner]'s pussy", "thrusts in and out of \the [partner]'s cunt.", "goes balls deep into \the [partner]'s pussy over and over again.")]" else message = "slides their cock into \the [partner]'s pussy." set_is_fucking(partner, CUM_TARGET_VAGINA, getorganslot(ORGAN_SLOT_PENIS) ? getorganslot(ORGAN_SLOT_PENIS) : null) playlewdinteractionsound(loc, pick('sandcode/sound/interactions/champ1.ogg', 'sandcode/sound/interactions/champ2.ogg'), 50, 1, -1) visible_message(message = "\The [src] [message]", ignored_mobs = get_unconsenting()) handle_post_sex(NORMAL_LUST, CUM_TARGET_VAGINA, partner) partner.handle_post_sex(NORMAL_LUST, null, src) partner.dir = get_dir(partner,src) do_fucking_animation(get_dir(src, partner)) /mob/living/proc/do_mount(mob/living/partner) var/message if(partner.is_fucking(src, CUM_TARGET_VAGINA)) message = "[pick("rides \the [partner]'s dick.", "forces [partner]'s cock on their pussy")]" else message = "slides their pussy onto \the [partner]'s cock." partner.set_is_fucking(src, CUM_TARGET_VAGINA, partner.getorganslot(ORGAN_SLOT_PENIS) ? partner.getorganslot(ORGAN_SLOT_PENIS) : null) playlewdinteractionsound(loc, pick('sandcode/sound/interactions/bang1.ogg', 'sandcode/sound/interactions/bang2.ogg', 'sandcode/sound/interactions/bang3.ogg'), 70, 1, -1) visible_message(message = "\The [src] [message]", ignored_mobs = get_unconsenting()) partner.handle_post_sex(NORMAL_LUST, CUM_TARGET_VAGINA, src) handle_post_sex(NORMAL_LUST, null, partner) partner.dir = get_dir(partner,src) do_fucking_animation(get_dir(src, partner)) /mob/living/proc/do_mountass(mob/living/partner) var/message if(partner.is_fucking(src, CUM_TARGET_ANUS)) message = "[pick("rides \the [partner]'s dick.", "forces [partner]'s cock on their ass")]" else message = "lowers their ass onto \the [partner]'s cock." partner.set_is_fucking(src, CUM_TARGET_ANUS, partner.getorganslot(ORGAN_SLOT_PENIS) ? partner.getorganslot(ORGAN_SLOT_PENIS) : null) playlewdinteractionsound(loc, pick('sandcode/sound/interactions/bang1.ogg', 'sandcode/sound/interactions/bang2.ogg', 'sandcode/sound/interactions/bang3.ogg'), 70, 1, -1) visible_message(message = "\The [src] [message]", ignored_mobs = get_unconsenting()) partner.handle_post_sex(NORMAL_LUST, CUM_TARGET_ANUS, src) handle_post_sex(NORMAL_LUST, null, partner) partner.dir = get_dir(partner,src) do_fucking_animation(get_dir(src, partner)) /mob/living/proc/do_tribadism(mob/living/partner) var/message if(partner.is_fucking(src, CUM_TARGET_VAGINA)) message = "[pick("grinds their pussy against \the [partner]'s cunt.", "rubs their cunt against \the [partner]'s pussy.", "thrusts against \the [partner]'s pussy.", "humps \the [partner], their pussies grinding against each other.")]" else message = "presses their pussy into \the [partner]'s own." partner.set_is_fucking(src, CUM_TARGET_VAGINA, partner.getorganslot(ORGAN_SLOT_VAGINA) ? partner.getorganslot(ORGAN_SLOT_VAGINA) : null) playlewdinteractionsound(loc, pick('sandcode/sound/interactions/squelch1.ogg', 'sandcode/sound/interactions/squelch2.ogg', 'sandcode/sound/interactions/squelch3.ogg'), 70, 1, -1) visible_message(message = "\The [src] [message]", ignored_mobs = get_unconsenting()) partner.handle_post_sex(NORMAL_LUST, CUM_TARGET_VAGINA, src) handle_post_sex(NORMAL_LUST, null, partner) partner.dir = get_dir(partner,src) do_fucking_animation(get_dir(src, partner)) /mob/living/proc/do_fingering(mob/living/partner) visible_message(message = "\The [src] [pick("fingers \the [partner].", "fingers \the [partner]'s pussy.", "fingers \the [partner] hard.")]", ignored_mobs = get_unconsenting()) playlewdinteractionsound(loc, 'sandcode/sound/interactions/champ_fingering.ogg', 50, 1, -1) partner.handle_post_sex(NORMAL_LUST, null, src) partner.dir = get_dir(partner, src) do_fucking_animation(get_dir(src, partner)) /mob/living/proc/do_fingerass(mob/living/partner) visible_message(message = "\The [src] [pick("fingers \the [partner].", "fingers \the [partner]'s asshole.", "fingers \the [partner] hard.")]", ignored_mobs = get_unconsenting()) playlewdinteractionsound(loc, 'sandcode/sound/interactions/champ_fingering.ogg', 50, 1, -1) partner.handle_post_sex(NORMAL_LUST, null, src) partner.dir = get_dir(partner, src) do_fucking_animation(get_dir(src, partner)) /mob/living/proc/do_rimjob(mob/living/partner) visible_message(message = "\The [src] licks \the [partner]'s asshole.", ignored_mobs = get_unconsenting()) playlewdinteractionsound(loc, 'sandcode/sound/interactions/champ_fingering.ogg', 50, 1, -1) partner.handle_post_sex(NORMAL_LUST, null, src) partner.dir = get_dir(src, partner) do_fucking_animation(get_dir(src, partner)) /mob/living/proc/do_handjob(mob/living/partner) var/message if(partner.is_fucking(src, CUM_TARGET_HAND)) message = "[pick("jerks \the [partner] off.", "works \the [partner]'s shaft.", "wanks \the [partner]'s cock hard.")]" else message = "[pick("wraps their hand around \the [partner]'s cock.", "starts playing with \the [partner]'s cock")]" partner.set_is_fucking(src, CUM_TARGET_HAND, partner.getorganslot(ORGAN_SLOT_PENIS) ? partner.getorganslot(ORGAN_SLOT_PENIS) : null) playlewdinteractionsound(src, pick('sandcode/sound/interactions/bang1.ogg', 'sandcode/sound/interactions/bang2.ogg', 'sandcode/sound/interactions/bang3.ogg'), 70, 1, -1) visible_message(message = "\The [src] [message]", ignored_mobs = get_unconsenting()) partner.handle_post_sex(NORMAL_LUST, CUM_TARGET_HAND, src) partner.dir = get_dir(partner,src) do_fucking_animation(get_dir(src, partner)) /mob/living/proc/do_breastfuck(mob/living/partner) var/message if(is_fucking(partner, CUM_TARGET_BREASTS)) message = "[pick("fucks \the [partner]'s' breasts.", "grinds their cock between \the [partner]'s boobs.", "thrusts into \the [partner]'s tits.", "grabs \the [partner]'s breasts together and presses their dick between them.")]" else message = "pushes \the [partner]'s breasts together and presses their dick between them." set_is_fucking(partner , CUM_TARGET_BREASTS, getorganslot(ORGAN_SLOT_PENIS) ? getorganslot(ORGAN_SLOT_PENIS) : null) playlewdinteractionsound(loc, pick('sandcode/sound/interactions/bang1.ogg', 'sandcode/sound/interactions/bang2.ogg', 'sandcode/sound/interactions/bang3.ogg'), 70, 1, -1) visible_message(message = "\The [src] [message]", ignored_mobs = get_unconsenting()) handle_post_sex(NORMAL_LUST, CUM_TARGET_BREASTS, partner) partner.dir = get_dir(partner,src) do_fucking_animation(get_dir(src, partner)) /mob/living/proc/do_mountface(mob/living/partner) var/message if(is_fucking(partner, GRINDING_FACE_WITH_ANUS)) message = "[pick("grinds their ass into \the [partner]'s face.", "shoves their ass into \the [partner]'s face.")]" else message = "[pick( "grabs the back of \the [partner]'s head and forces it into their asscheeks.", "squats down and plants their ass right on \the [partner]'s face")]" set_is_fucking(partner , GRINDING_FACE_WITH_ANUS, null) playlewdinteractionsound(loc, pick('sandcode/sound/interactions/squelch1.ogg', 'sandcode/sound/interactions/squelch2.ogg', 'sandcode/sound/interactions/squelch3.ogg'), 70, 1, -1) visible_message(message = "\The [src] [message]", ignored_mobs = get_unconsenting()) handle_post_sex(LOW_LUST, null, src) partner.dir = get_dir(src, partner) do_fucking_animation(get_dir(src, partner)) /mob/living/proc/do_lickfeet(mob/living/partner) var/message if(partner.get_item_by_slot(SLOT_SHOES) != null) message = "licks \the [partner]'s [partner.get_shoes()]." else message = "licks \the [partner]'s [partner.has_feet() == 1 ? "foot" : "feet"]." playlewdinteractionsound(loc, 'sandcode/sound/interactions/champ_fingering.ogg', 50, 1, -1) visible_message(message = "\The [src] [message]", ignored_mobs = get_unconsenting()) handle_post_sex(LOW_LUST, null, src) partner.dir = get_dir(src, partner) do_fucking_animation(get_dir(src, partner)) /*Grinding YOUR feet in TARGET's face*/ /mob/living/proc/do_grindface(mob/living/partner) var/message if(is_fucking(partner, GRINDING_FACE_WITH_FEET)) if(src.get_item_by_slot(SLOT_SHOES) != null) message = "[pick(list("grinds their [get_shoes()] into [partner]'s face.", "presses their footwear down hard on [partner]'s face.", "rubs off the dirt from their [get_shoes()] onto [partner]'s face."))]" else message = "[pick(list("grinds their bare feet into [partner]'s face.", "deviously covers [partner]'s mouth and nose with their bare feet.", "runs the soles of their bare feet against [partner]'s lips."))]" else if(is_fucking(partner, GRINDING_MOUTH_WITH_FEET)) if(src.get_item_by_slot(SLOT_SHOES) != null) message = "[pick(list("pulls their [get_shoes()] out of [partner]'s mouth and puts them on their face.", "slowly retracts their [get_shoes()] from [partner]'s mouth, putting them on their face instead."))]" else message = "[pick(list("pulls their bare feet out of [partner]'s mouth and rests them on their face instead.", "retracts their bare feet from [partner]'s mouth and grinds them into their face instead."))]" set_is_fucking(partner , GRINDING_FACE_WITH_FEET, null) else if(src.get_item_by_slot(SLOT_SHOES) != null) message = "[pick(list("plants their [get_shoes()] ontop of [partner]'s face.", "rests their [get_shoes()] on [partner]'s face and presses down hard.", "harshly places their [get_shoes()] atop [partner]'s face."))]" else message = "[pick(list("plants their bare feet ontop of [partner]'s face.", "rests their feet on [partner]'s face, smothering them.", "positions their bare feet atop [partner]'s face."))]" set_is_fucking(partner, GRINDING_FACE_WITH_FEET, null) playlewdinteractionsound(loc, pick('sandcode/sound/interactions/foot_dry1.ogg', 'sandcode/sound/interactions/foot_dry2.ogg', 'sandcode/sound/interactions/foot_dry3.ogg', 'sandcode/sound/interactions/foot_dry4.ogg'), 70, 1, -1) visible_message(message = "\The [src] [message]", ignored_mobs = get_unconsenting()) partner.handle_post_sex(LOW_LUST, null, src) partner.dir = get_dir(src, partner) do_fucking_animation(get_dir(src, partner)) /*Grinding YOUR feet in TARGET's mouth*/ /mob/living/proc/do_grindmouth(mob/living/partner) var/message if(is_fucking(partner, GRINDING_MOUTH_WITH_FEET)) if(src.get_item_by_slot(SLOT_SHOES) != null) message = "[pick(list("roughly shoves their [get_shoes()] deeper into [partner]'s mouth.", "harshly forces another inch of their [get_shoes()] into [partner]'s mouth.", "presses their weight down, their [get_shoes()] prying deeper into [partner]'s mouth."))]" else message = "[pick(list("wiggles their toes deep inside [partner]'s mouth.", "crams their barefeet down deeper into [partner]'s mouth, making them gag.", "roughly grinds their feet on [partner]'s tongue."))]" else if(is_fucking(partner, GRINDING_FACE_WITH_FEET)) if(src.get_item_by_slot(SLOT_SHOES) != null) message = "[pick(list("decides to force their [get_shoes()] deep into [partner]'s mouth.", "pressed the tip of their [get_shoes()] against [partner]'s lips and shoves inwards."))]" else message = "[pick(list("pries open [partner]'s mouth with their toes and shoves their bare foot in.", "presses down their foot even harder, cramming their foot into [partner]'s mouth."))]" set_is_fucking(partner , GRINDING_MOUTH_WITH_FEET, null) else if(src.get_item_by_slot(SLOT_SHOES) != null) message = "[pick(list("readies themselves and in one swift motion, shoves their [get_shoes()] into [partner]'s mouth.", "grinds the tip of their [get_shoes()] against [partner]'s mouth before pushing themselves in."))]" else message = "[pick(list("rubs their dirty bare feet across [partner]'s face before prying them into their muzzle.", "forces their barefeet into [partner]'s mouth.", "covers [partner]'s mouth and nose with their foot until they gasp for breath, then shoves both feet inside before they can react."))]" set_is_fucking(partner , GRINDING_MOUTH_WITH_FEET, null) playlewdinteractionsound(loc, pick('sandcode/sound/interactions/foot_wet1.ogg', 'sandcode/sound/interactions/foot_wet2.ogg', 'sandcode/sound/interactions/foot_wet3.ogg'), 70, 1, -1) visible_message(message = "\The [src] [message]", ignored_mobs = get_unconsenting()) partner.handle_post_sex(LOW_LUST, null, src) partner.dir = get_dir(src, partner) do_fucking_animation(get_dir(src, partner)) /mob/living/proc/do_footfuck(mob/living/partner) var/message if(is_fucking(src, CUM_TARGET_FEET)) message = "[pick("fucks \the [partner]'s [partner.get_shoes() ? partner.get_shoes(TRUE) : pick("foot", "sole")].", "rubs their dick on \the [partner]'s [partner.get_shoes() ? partner.get_shoes(TRUE) : pick("foot", "sole")].", "grinds their cock on \the [partner]'s [partner.get_shoes() ? partner.get_shoes(TRUE) : pick("foot", "sole")].")]" else message = "[pick("positions their cock on \the [partner]'s [partner.get_shoes() ? partner.get_shoes(TRUE) : pick("foot", "sole")].", "positions their cock on \the [partner]'s [partner.get_shoes() ? partner.get_shoes(TRUE) : pick("foot","sole")].", "starts grinding their cock against \the [partner]'s [partner.get_shoes() ? partner.get_shoes(TRUE) : pick("foot", "sole")].")]" set_is_fucking(src, CUM_TARGET_FEET, getorganslot(ORGAN_SLOT_PENIS) ? getorganslot(ORGAN_SLOT_PENIS) : null) playlewdinteractionsound(loc, pick('sandcode/sound/interactions/foot_dry1.ogg', 'sandcode/sound/interactions/foot_dry3.ogg', 'sandcode/sound/interactions/foot_wet1.ogg', 'sandcode/sound/interactions/foot_wet2.ogg'), 70, 1, -1) visible_message(message = "\The [src] [message]", ignored_mobs = get_unconsenting()) handle_post_sex(NORMAL_LUST, CUM_TARGET_FEET, src) partner.dir = get_dir(partner,src) do_fucking_animation(get_dir(src, partner)) /mob/living/proc/do_dfootfuck(mob/living/partner) var/message if(is_fucking(src, CUM_TARGET_FEET)) message = "[pick("fucks \the [partner]'s [partner.get_shoes() ? partner.get_shoes() : pick("feet", "soles")].", "rubs their dick between \the [partner]'s [partner.get_shoes() ? partner.get_shoes() : pick("feet", "soles")].", "thrusts their cock between \the [partner]'s [partner.get_shoes() ? partner.get_shoes() : pick("feet", "soles")].")]" else message = "[pick("positions their cock between \the [partner]'s [partner.get_shoes() ? partner.get_shoes() : pick("feet", "soles")].", "starts grinding their cock against \the [partner]'s [partner.get_shoes() ? partner.get_shoes() : pick("feet", "soles")].", "starts grinding their cock between \the [partner]'s [partner.get_shoes() ? partner.get_shoes() : pick("feet", "soles")].")]" set_is_fucking(src, CUM_TARGET_FEET, getorganslot(ORGAN_SLOT_PENIS) ? getorganslot(ORGAN_SLOT_PENIS) : null) playlewdinteractionsound(loc, pick('sandcode/sound/interactions/foot_dry1.ogg', 'sandcode/sound/interactions/foot_dry3.ogg', 'sandcode/sound/interactions/foot_wet1.ogg', 'sandcode/sound/interactions/foot_wet2.ogg'), 70, 1, -1) visible_message(message = "\The [src] [message]", ignored_mobs = get_unconsenting()) handle_post_sex(NORMAL_LUST, CUM_TARGET_FEET, src) partner.dir = get_dir(partner,src) do_fucking_animation(get_dir(src, partner)) /mob/living/proc/do_vfootfuck(mob/living/partner) var/message if(is_fucking(src, CUM_TARGET_FEET)) message = "[pick("grinds their pussy against \the [partner]'s [partner.get_shoes() ? partner.get_shoes(TRUE) : pick("foot", "sole")].", "rubs their clit on \the [partner]'s [partner.get_shoes() ? partner.get_shoes(TRUE) : pick("foot", "sole")].", "ruts on \the [partner]'s [partner.get_shoes() ? partner.get_shoes(TRUE) : pick("foot", "sole")].")]" else message = "[pick("positions their vagina on \the [partner]'s [partner.get_shoes() ? partner.get_shoes(TRUE) : pick("foot", "sole")].", "positions their clit on \the [partner]'s [partner.get_shoes() ? partner.get_shoes(TRUE) : pick("foot","sole")].", "starts grinding their pussy against \the [partner]'s [partner.get_shoes() ? partner.get_shoes(TRUE) : pick("foot", "sole")].")]" set_is_fucking(src, CUM_TARGET_FEET, getorganslot(ORGAN_SLOT_VAGINA) ? getorganslot(ORGAN_SLOT_VAGINA) : null) playlewdinteractionsound(loc, pick('sandcode/sound/interactions/foot_dry1.ogg', 'sandcode/sound/interactions/foot_dry3.ogg', 'sandcode/sound/interactions/foot_wet1.ogg', 'sandcode/sound/interactions/foot_wet2.ogg'), 70, 1, -1) visible_message(message = "\The [src] [message]", ignored_mobs = get_unconsenting()) handle_post_sex(NORMAL_LUST, CUM_TARGET_FEET, src) partner.dir = get_dir(partner,src) do_fucking_animation(get_dir(src, partner)) /mob/living/proc/do_footjob(mob/living/partner) var/message if(partner.is_fucking(src, CUM_TARGET_FEET)) message = "[pick("jerks \the [partner] off with their [get_shoes() ? get_shoes(TRUE) : pick("foot", "sole")].", "rubs their [get_shoes() ? get_shoes(TRUE) : pick("foot", "sole", "toes")] on \the [partner]'s shaft.", "works their [get_shoes() ? get_shoes(TRUE) : pick("foot", "sole")] up and down on \the [partner]'s cock.")]" else message = "[pick("[get_shoes() ? "positions their [get_shoes(TRUE)] on" :"positions their foot on"] \the [partner]'s cock.", "starts playing around with \the [partner]'s cock, using their [get_shoes() ? get_shoes(TRUE) :"foot"].")]" partner.set_is_fucking(src, CUM_TARGET_FEET, partner.getorganslot(ORGAN_SLOT_PENIS) ? partner.getorganslot(ORGAN_SLOT_PENIS) : null) playlewdinteractionsound(loc, pick('sandcode/sound/interactions/foot_dry1.ogg', 'sandcode/sound/interactions/foot_dry3.ogg', 'sandcode/sound/interactions/foot_wet1.ogg', 'sandcode/sound/interactions/foot_wet2.ogg'), 70, 1, -1) visible_message(message = "\The [src] [message]", ignored_mobs = get_unconsenting()) partner.handle_post_sex(NORMAL_LUST, CUM_TARGET_FEET, src) partner.dir = get_dir(partner,src) do_fucking_animation(get_dir(src, partner)) /mob/living/proc/do_dfootjob(mob/living/partner) var/message if(partner.is_fucking(src, CUM_TARGET_FEET)) message = "[pick("jerks \the [partner] off with their [get_shoes() ? get_shoes() : pick("feet", "soles")].", "rubs their [get_shoes() ? get_shoes() : pick("feet", "soles")] on \the [partner]'s shaft.", "rubs [get_shoes() ? "their [get_shoes()]" : "all of their toes"] on \the [partner]'s cock.", "works their [get_shoes() ? get_shoes() : pick("feet", "soles")] up and down on \the [partner]'s cock.")]" else message = "[pick("[get_shoes() ? "wraps their [get_shoes()] around" : "wraps their [pick("feet", "soles")] around"] \the [partner]'s cock.", "starts playing around with \the [partner]'s cock, using their [get_shoes() ? get_shoes() : "feet"].")]" partner.set_is_fucking(src, CUM_TARGET_FEET, partner.getorganslot(ORGAN_SLOT_PENIS) ? partner.getorganslot(ORGAN_SLOT_PENIS) : null) playlewdinteractionsound(loc, pick('sandcode/sound/interactions/foot_dry1.ogg', 'sandcode/sound/interactions/foot_dry3.ogg', 'sandcode/sound/interactions/foot_wet1.ogg', 'sandcode/sound/interactions/foot_wet2.ogg'), 70, 1, -1) visible_message(message = "\The [src] [message]", ignored_mobs = get_unconsenting()) partner.handle_post_sex(NORMAL_LUST, CUM_TARGET_FEET, src) partner.dir = get_dir(partner,src) do_fucking_animation(get_dir(src, partner)) /mob/living/proc/do_footjob_v(mob/living/partner) var/message if(partner.is_fucking(src, CUM_TARGET_FEET)) message = "[pick("rubs \the [partner] clit with their [get_shoes() ? get_shoes(TRUE) : pick("foot", "sole")].", "rubs their [get_shoes() ? get_shoes(TRUE) : pick("foot", "sole", "toes")] on \the [partner]'s coochie.", "rubs their [get_shoes() ? get_shoes(TRUE) : pick("foot", "sole", "toes")] on \the [partner]'s vagina.", "rubs their foot up and down on \the [partner]'s pussy.")]" else message = "[pick("[get_shoes() ? "positions their [get_shoes(TRUE)] on" : "positions their foot on"] \the [partner]'s pussy.", "starts playing around with \the [partner]'s pussy, using their [get_shoes() ? get_shoes(TRUE) : "foot"].")]" partner.set_is_fucking(src, CUM_TARGET_FEET, partner.getorganslot(ORGAN_SLOT_VAGINA) ? partner.getorganslot(ORGAN_SLOT_VAGINA) : null) playlewdinteractionsound(loc, pick('sandcode/sound/interactions/foot_dry1.ogg', 'sandcode/sound/interactions/foot_dry3.ogg', 'sandcode/sound/interactions/foot_wet1.ogg', 'sandcode/sound/interactions/foot_wet2.ogg'), 70, 1, -1) visible_message(message = "\The [src] [message]", ignored_mobs = get_unconsenting()) partner.handle_post_sex(NORMAL_LUST, CUM_TARGET_FEET, src) partner.dir = get_dir(partner,src) do_fucking_animation(get_dir(src, partner)) /mob/living/proc/get_shoes(var/singular = FALSE) var/obj/A = get_item_by_slot(SLOT_SHOES) if(A) var/txt = A.name if(findtext (A.name,"the")) txt = copytext(A.name, 5, length(A.name)+1) if(singular) txt = copytext(A.name, 5, length(A.name)) return txt else if(singular) txt = copytext(A.name, 1, length(A.name)) return txt /mob/living/proc/handle_post_sex(amount, orifice, mob/living/partner) if(stat != CONSCIOUS) return if(amount) add_lust(amount) if(get_lust() >= lust_tolerance) if(prob(10)) to_chat(src, "You struggle to not orgasm!") return if(lust >= lust_tolerance*3) cum(partner, orifice) else moan() /mob/living/proc/get_unconsenting(var/extreme = FALSE, var/list/ignored_mobs) var/list/nope = list() nope += ignored_mobs for(var/mob/M in range(7, src)) if(M.client) var/client/cli = M.client if(!(cli.prefs.toggles & VERB_CONSENT)) //Note: This probably could do with a specific preference nope += M else if(extreme && (cli.prefs.extremepref == "No")) nope += M else nope += M return nope //Yep, weird shit goes down here. /mob/living/proc/do_eyefuck(mob/living/partner) var/message if(is_fucking(partner, CUM_TARGET_EYES)) message = "[pick( "pounds into \the [partner]'s [has_eyes() ? "eye":"eyesocket"].", "shoves their dick deep into \the [partner]'s skull", "thrusts in and out of \the [partner]'s [has_eyes() ? "eye":"eyesocket"].", "goes balls deep into \the [partner]'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 their cock inbetween \the [partner]'s [has_eyes() ? "eyelid":"eyesocket"]." set_is_fucking(partner, CUM_TARGET_EYES, getorganslot(ORGAN_SLOT_PENIS) ? getorganslot(ORGAN_SLOT_PENIS) : null) playlewdinteractionsound(loc, pick('sandcode/sound/interactions/champ1.ogg', 'sandcode/sound/interactions/champ2.ogg'), 50, 1, -1) visible_message(message = "\The [src] [message]", ignored_mobs = get_unconsenting(TRUE)) handle_post_sex(NORMAL_LUST, CUM_TARGET_EYES, partner) partner.handle_post_sex(LOW_LUST, null, src) partner.dir = get_dir(partner,src) do_fucking_animation(get_dir(src, partner)) /mob/living/proc/do_earfuck(mob/living/partner) var/message if(is_fucking(partner, CUM_TARGET_EARS)) message = "[pick( "pounds into \the [partner]'s [has_eyes() ? "ear":"earsocker"].", "shoves their dick deep into \the [partner]'s skull", "thrusts in and out of \the [partner]'s [has_eyes() ? "ear":"eyesocket"].", "goes balls deep into \the [partner]'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 their cock inside \the [partner]'s [has_ears() ? "ear":"earsocket"]." set_is_fucking(partner, CUM_TARGET_EARS, getorganslot(ORGAN_SLOT_PENIS) ? getorganslot(ORGAN_SLOT_PENIS) : null) playlewdinteractionsound(loc, pick('sandcode/sound/interactions/champ1.ogg', 'sandcode/sound/interactions/champ2.ogg'), 50, 1, -1) visible_message(message = "\The [src] [message]", ignored_mobs = get_unconsenting(TRUE)) handle_post_sex(NORMAL_LUST, CUM_TARGET_EARS, partner) partner.handle_post_sex(LOW_LUST, null, src) partner.dir = get_dir(partner,src) do_fucking_animation(get_dir(src, partner)) //