Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Lewd] [Semi-Modular] - Human Erect Penis and Balls Sprites-Fix & More! #981

Merged
merged 12 commits into from
Nov 6, 2023
2 changes: 1 addition & 1 deletion code/datums/mood_events/generic_positive_events.dm
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@
/datum/mood_event/orgasm
description = "<span class='userlove'>I came!</span>\n" //funny meme haha
mood_change = 3
timeout = 100 SECONDS
timeout = 3 MINUTES

/datum/mood_event/fedpred
description = "<span class='nicegreen'>I've devoured someone!</span>\n"
Expand Down
12 changes: 12 additions & 0 deletions code/modules/arousal/genitals_sprite_accessories.dm
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,18 @@
var/taur_dimension_y = 32
var/taur_dimension_x = 32

/*
* This is an example of a penis object in the code.
* The icon_state of the penis is structured as follows:
* "penis_human_4_1_FRONT"
* Where "human" is the type of the penis, "4" is the size stage of the penis, and "1" means it's the erect sprite, while "0" would be the soft one.
* If the sprite is like this: "penis_human_4_s_1_FRONT", the extra "_s" means it's used by the default skintones (the list of default skin tones that "Albino, Caucasian, etc.").
* Those "_s" sprites use a more pink-ish tone instead of white, to match the different default skin tones automatically,
* while the icon states without the "_s" are used by the custom skin tone.
* In the future, it would be best to solve this, as it creates useless duplicated icon states, and therefore heavier file sizes.
* It would be best to just have 1 set of icon states that apply themselves normally to both custom skin tone users and match default skin tone users,
* effectively removing the need of using the extra "_s". - Goku
*/

//DICKS,COCKS,PENISES,WHATEVER YOU WANT TO CALL THEM
/datum/sprite_accessory/penis
Expand Down
32 changes: 24 additions & 8 deletions code/modules/clothing/masks/miscellaneous.dm
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,31 @@
w_class = WEIGHT_CLASS_SMALL
gas_transfer_coefficient = 0.9
equip_delay_other = 20
equip_delay_self = 20
mutantrace_variation = STYLE_MUZZLE

/obj/item/clothing/mask/muzzle/attack_paw(mob/user)
if(iscarbon(user))
var/mob/living/carbon/C = user
if(src == C.wear_mask)
to_chat(user, "<span class='warning'>You need help taking this off!</span>")
return
..()
var/seamless = FALSE

/obj/item/clothing/mask/muzzle/attack_paw(mob/user, act_intent, attackchain_flags)
if(iscarbon(user))
var/mob/living/carbon/C = user
if(src == C.wear_mask)
if(seamless)
to_chat(user, span_warning("You need help taking this off!"))
return
else
if(!do_after(C, 60, target = src))
return
..()

/obj/item/clothing/mask/muzzle/attackby(obj/item/K, mob/user, params)
if(istype(K, /obj/item/key/latex))
if(seamless != FALSE)
to_chat(user, span_notice("The latches suddenly loosen!"))
seamless = FALSE
else
to_chat(user, span_warning("The latches suddenly tighten!"))
seamless = TRUE
return

/obj/item/clothing/mask/surgical
name = "sterile mask"
Expand Down
Binary file modified icons/obj/genitals/penis_onmob.dmi
Binary file not shown.
Binary file modified icons/obj/genitals/testicles_onmob.dmi
Binary file not shown.
2 changes: 1 addition & 1 deletion modular_sand/code/datums/interactions/_interaction.dm
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@

/// After the interaction, the base only plays the sound and only if it has one
/datum/interaction/proc/post_interaction(mob/living/user, mob/living/target)
COOLDOWN_START(user, last_interaction_time, 0.6 SECONDS)
COOLDOWN_START(user, last_interaction_time, 0.55 SECONDS)
if(interaction_sound)
playsound(get_turf(user), interaction_sound, 50, 1, -1)
return
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@
var/milktext = milk.name

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"
"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_lewd("\The <b>[user]</b> [pick(lines)]")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,9 +88,9 @@
if(user.has_penis() || user.has_strapon())
var/genital_name = user.get_penetrating_genital_name()
if(user.is_fucking(partner, CUM_TARGET_THROAT))
message = "retracts [u_His] [genital_name] from \the <b>[partner]</b>'s throat"
message = "retracts [u_His] [genital_name] from \the <b>[partner]</b>'s throat."
else
message = "shoves [u_His] [genital_name] into \the <b>[partner]</b>'s mouth"
message = "shoves [u_His] [genital_name] into \the <b>[partner]</b>'s mouth."
else
improv = TRUE
if(improv)
Expand Down Expand Up @@ -150,7 +150,7 @@
genital = check
user.set_is_fucking(partner, CUM_TARGET_THROAT, genital)
else
message = "forces [u_His] [genital_name] deep down \the <b>[partner]</b>'s throat"
message = "forces [u_His] [genital_name] deep down \the <b>[partner]</b>'s throat."
var/check = user.getorganslot(ORGAN_SLOT_PENIS)
if(check)
genital = check
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,15 @@
if(user.is_fucking(partner, CUM_TARGET_VAGINA))
message = "[pick(
"pounds \the <b>[partner]</b>'s pussy.",
"shoves [u_His] [genital_name] deep into \the <b>[partner]</b>'s pussy",
"shoves [u_His] [genital_name] 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] [genital_name] 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)
'modular_sand/sound/interactions/champ2.ogg'), 70, 1, -1)
user.visible_message(span_lewd("<b>\The [user]</b> [message]"), ignored_mobs = user.get_unconsenting())
if(user.can_penetrating_genital_cum())
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_VAGINA, partner, ORGAN_SLOT_PENIS) //SPLURT edit
Expand Down Expand Up @@ -74,7 +74,7 @@
var/genital_name = user.get_penetrating_genital_name()

if(user.is_fucking(partner, CUM_TARGET_BREASTS))
message = "[pick("fucks \the <b>[partner]</b>'s' breasts.",
message = "[pick("fucks \the <b>[partner]</b>'s breasts.",
"grinds [u_His] [genital_name] 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] [genital_name] between them.")]"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

if(partner.is_fucking(user, CUM_TARGET_VAGINA))
message = "[pick("rides \the <b>[partner]</b>'s [genital_name].",
"forces <b>[partner]</b>'s [genital_name] on [u_His] pussy")]"
"forces <b>[partner]</b>'s [genital_name] on [u_His] pussy.")]"
else
message = "slides [u_His] pussy onto \the <b>[partner]</b>'s [genital_name]."
partner.set_is_fucking(user, CUM_TARGET_VAGINA, partner.getorganslot(ORGAN_SLOT_PENIS))
Expand All @@ -38,7 +38,7 @@

if(partner.is_fucking(user, CUM_TARGET_ANUS))
message = "[pick("rides \the <b>[partner]</b>'s [genital_name].",
"forces <b>[partner]</b>'s [genital_name] on [u_His] ass")]"
"forces <b>[partner]</b>'s [genital_name] on [u_His] ass.")]"
else
message = "lowers [u_His] ass onto \the <b>[partner]</b>'s [genital_name]."
partner.set_is_fucking(user, CUM_TARGET_ANUS, partner.getorganslot(ORGAN_SLOT_PENIS))
Expand Down Expand Up @@ -68,7 +68,7 @@
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")]"
"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',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,9 +102,9 @@
var/milktext = milk.name

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)]"
"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_lewd("\The <b>[user]</b> [pick(lines)]")
Expand Down
Loading
Loading