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

Adds portal panties (and more improvements) #108

Merged
merged 20 commits into from
Feb 1, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions code/__DEFINES/~skyrat_defines/DNA.dm
Original file line number Diff line number Diff line change
Expand Up @@ -72,11 +72,11 @@
#define PENIS_MAX_GIRTH 20
#define PENIS_DEFAULT_GIRTH 5 // a lil big but not by much
#define PENIS_MIN_LENGTH 1
#define PENIS_MAX_LENGTH 128 //SPLURT EDIT
#define PENIS_MAX_LENGTH 36
#define PENIS_DEFAULT_LENGTH 6 //still a lil long but not insane

#define TESTICLES_MIN_SIZE 0
#define TESTICLES_MAX_SIZE 8 //SPLURT EDIT
#define TESTICLES_MAX_SIZE 6

#define SHEATH_NONE "None"
#define SHEATH_NORMAL "Sheath"
Expand Down
13 changes: 13 additions & 0 deletions code/__DEFINES/~~~splurt_defines/DNA.dm
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,13 @@
#define BODY_SIZE_MAX 2.0
#define BODY_SIZE_MIN 0.1

//genitals
#undef TESTICLES_MAX_SIZE
#define TESTICLES_MAX_SIZE 8

#undef PENIS_MAX_LENGTH
#define PENIS_MAX_LENGTH 128

//sex
#define ORGAN_SLOT_BUTT "butt"
#define ORGAN_SLOT_BELLY "belly"
Expand All @@ -18,3 +25,9 @@

#define BUTT_MIN_SIZE 1
#define BUTT_MAX_SIZE 8

#define BREASTS_MIN_SIZE 0
#define BREASTS_MAX_SIZE 19

#define BELLY_MIN_SIZE 1
#define BELLY_MAX_SIZE 10
31 changes: 18 additions & 13 deletions code/__DEFINES/~~~splurt_defines/interactions.dm
Original file line number Diff line number Diff line change
Expand Up @@ -25,20 +25,10 @@
#define INTERACTION_REQUIRE_SELF_HUMAN "self_human"
#define INTERACTION_REQUIRE_TARGET_HUMAN "target_human"

/// Climax definitions

//Climaxing genitals
#define CLIMAX_VAGINA "vagina"
#define CLIMAX_PENIS "penis"
#define CLIMAX_BOTH "both"

//Climaxing positions
#define CLIMAX_POSITION_USER "climax_user"
#define CLIMAX_POSITION_TARGET "climax_target"
// Interaction configs

//Climaxing targets (use these if you're not using organ slots)
#define CLIMAX_TARGET_MOUTH "mouth"
#define CLIMAX_TARGET_SHEATH "sheath"
// Interaction Types: Do we do it to ourself or someone else
#define INTERACTION_BOTH "both"

// Extreme types
#define INTERACTION_EXTREME (1<<0)
Expand All @@ -60,3 +50,18 @@

// Interaction flags (used for logic but normally not sent to the interaction menu)
#define INTERACTION_OVERRIDE_FLUID_TRANSFER (1<<0)

/// Climax definitions

//Climaxing genitals
#define CLIMAX_VAGINA "vagina"
#define CLIMAX_PENIS "penis"
#define CLIMAX_BOTH "both"

//Climaxing positions
#define CLIMAX_POSITION_USER "climax_user"
#define CLIMAX_POSITION_TARGET "climax_target"

//Climaxing targets (use these if you're not using organ slots)
#define CLIMAX_TARGET_MOUTH "mouth"
#define CLIMAX_TARGET_SHEATH "sheath"
2 changes: 1 addition & 1 deletion code/datums/components/caltrop.dm
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@
if(HAS_TRAIT(digitigrade_fan, TRAIT_LIGHT_STEP))
damage *= 0.75
// SPLURT EDIT - Extra inventory
if(digitigrade_fan.socks)
if(digitigrade_fan.w_socks)
if(digitigrade_fan.w_socks.body_parts_covered & FEET)
damage *= 0.75
//
Expand Down
1 change: 1 addition & 0 deletions code/modules/unit_tests/worn_icons.dm
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
/datum/unit_test/worn_icons/Run()
generate_possible_icon_states_list()
generate_possible_icon_states_list("modular_zubbers/icons/mob/clothing/")
generate_possible_icon_states_list("modular_zzplurt/icons/mob/clothing/") // SPLURT EDIT
if(additional_icon_location)
generate_possible_icon_states_list(additional_icon_location)

Expand Down
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -565,6 +565,7 @@ GLOBAL_LIST_INIT(interaction_menu_preferences, typecacheof(list(
if(existing_item)
source.visible_message(span_purple("[source.name] removes [existing_item.name] from [target.name]'s [item_index]."), span_purple("You remove [existing_item.name] from [target.name]'s [item_index]."), span_purple("You hear someone remove something from someone nearby."), vision_distance = 1)
target.dropItemToGround(existing_item, force = TRUE) // Force is true, cause nodrop shouldn't affect lewd items.
source.put_in_hands(existing_item, forced = TRUE) // SPLURT EDIT - puts it in the source's hands, it still needs to be dropped for specific sextoy behavior
target.vars[item_index] = null
else if (new_item)
source.visible_message(span_purple("[source.name] [internal ? "inserts" : "attaches"] the [new_item.name] [into_or_onto] [target.name]'s [item_index]."), span_purple("You [insert_or_attach] the [new_item.name] [into_or_onto] [target.name]'s [item_index]."), span_purple("You hear someone [insert_or_attach] something [into_or_onto] someone nearby."), vision_distance = 1)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ GLOBAL_LIST_EMPTY_TYPED(interaction_instances, /datum/interaction)
user.adjust_pleasure(user_pleasure * (istype(human_user) ? human_user.dna.features["sexual_potency"] || 1 : 1), target, src, CLIMAX_POSITION_USER) //SPLURT EDIT - Interactions
user.adjust_arousal(user_arousal)
user.adjust_pain(user_pain, target, src, CLIMAX_POSITION_USER) //SPLURT EDIT - Interactions
if(usage == INTERACTION_OTHER) //SPLURT EDIT - Interactions
if(user != target) //SPLURT EDIT - Interactions
target.adjust_pleasure(target_pleasure * (istype(human_target) ? human_target.dna.features["sexual_potency"] || 1 : 1), user, src, CLIMAX_POSITION_TARGET) //SPLURT EDIT - Interactions
target.adjust_arousal(target_arousal)
target.adjust_pain(target_pain, user, src, CLIMAX_POSITION_TARGET) //SPLURT EDIT - Interactions
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@
qdel(R)
else
testicles.transfer_internal_fluid(null, testicles.internal_fluid_count * 0.6)
add_cum_splatter_floor(get_turf(src))
add_cum_splatter_floor(get_turf(src), cum_reagent = testicles.internal_fluid_datum)
else if(partner || interactable_inrange_mobs[target_choice])
// Transfer reagents directly to partner
var/mob/living/target_mob = partner || interactable_inrange_mobs[target_choice]
Expand Down Expand Up @@ -309,7 +309,7 @@
qdel(R)
else
vagina.transfer_internal_fluid(null, vagina.internal_fluid_count)
add_cum_splatter_floor(get_turf(src), female = TRUE)
add_cum_splatter_floor(get_turf(src), female = TRUE, cum_reagent = vagina.internal_fluid_datum)
else if(partner || interactable_inrange_mobs[target_choice])
var/mob/living/target_mob = partner || interactable_inrange_mobs[target_choice]

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,16 @@
pixel_z = pseudo_z_axis

/// Used to add a cum decal to the floor while transferring viruses and DNA to it
/mob/living/proc/add_cum_splatter_floor(turf/the_turf, female = FALSE)
/mob/living/proc/add_cum_splatter_floor(turf/the_turf, female = FALSE, datum/reagent/cum_reagent) //SPLURT EDIT CHANGE - Cum Splatter - Original: /mob/living/proc/add_cum_splatter_floor(turf/the_turf, female = FALSE)
if(!the_turf)
the_turf = get_turf(src)

var/selected_type = female ? /obj/effect/decal/cleanable/cum/femcum : /obj/effect/decal/cleanable/cum
var/atom/stain = new selected_type(the_turf, get_static_viruses())

stain.transfer_mob_blood_dna(src) //I'm not adding a new forensics category for cumstains

//SPLURT EDIT ADDITION BEGIN - Cum Splatter
if(cum_reagent && !ispath(cum_reagent, /datum/reagent/consumable/cum) && !ispath(cum_reagent, /datum/reagent/consumable/femcum))
stain.color = initial(cum_reagent.color)
//SPLURT EDIT ADDITION END
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@

var/message = (user == target) ? pick("moans in ecstasy as [target.p_they()] fuck the [src]",
"slowly moves [src] up and down on [target]'s penis, causing [target.p_them()] to bend in pleasure",
"shivers in pleasure as [target.p_they()] move [src] on their penis") \
"shivers in pleasure as [target.p_they()] move[target.p_s()] [src] on [target.p_their()] penis") \
: pick("uses [src] on [target]'s penis",
"fucks [target] with [src]",
"masturbates [target] with [src], causing [target.p_them()] to moan in ecstasy")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@

//Misc

// /datum/loadout_item/inhand/donator/portallight
// name = "Portal Fleshlight and Underwear"
// item_path = /obj/item/storage/box/portallight
/datum/loadout_item/inhand/donator/portal_fleshlight
name = "Portal Fleshlight and Underwear"
item_path = /obj/item/storage/box/portal_fleshlight

//Backpack
/datum/loadout_item/inhand/donator/backpack/crocinpen
Expand Down
19 changes: 7 additions & 12 deletions modular_zzplurt/code/modules/client/preferences/genitals.dm
Original file line number Diff line number Diff line change
Expand Up @@ -59,13 +59,10 @@


//butthole
/datum/preference/choiced/genital/anus
savefile_key = "feature_anus"
relevant_mutant_bodypart = ORGAN_SLOT_ANUS
default_accessory_type = /datum/sprite_accessory/genital/anus/none

/datum/preference/choiced/genital/anus/is_accessible(datum/preferences/preferences)
return ..() && preferences.read_preference(/datum/preference/choiced/genital/butt) != "None"
/datum/preference/choiced/genital/anus/deserialize(input, datum/preferences/preferences)
if(preferences.read_preference(/datum/preference/choiced/genital/butt) == SPRITE_ACCESSORY_NONE && input != SPRITE_ACCESSORY_NONE)
return /datum/sprite_accessory/genital/anus/normal::name
. = ..()

/datum/preference/toggle/genital_skin_tone/anus
savefile_key = "anus_skin_tone"
Expand Down Expand Up @@ -99,8 +96,7 @@
type_to_check = /datum/preference/choiced/genital/anus
skin_color_type = /datum/preference/toggle/genital_skin_color/anus

//SPLURT EDIT START
// BELLY (yes it HAS to be here)
// BELLY
/datum/preference/choiced/genital/belly
savefile_key = "feature_belly"
relevant_mutant_bodypart = ORGAN_SLOT_BELLY
Expand All @@ -111,8 +107,8 @@
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "belly_size"
relevant_mutant_bodypart = ORGAN_SLOT_BELLY
minimum = 1
maximum = 10
minimum = BELLY_MIN_SIZE
maximum = BELLY_MAX_SIZE

/datum/preference/numeric/belly_size/create_default_value()
return 1
Expand Down Expand Up @@ -159,7 +155,6 @@
relevant_mutant_bodypart = ORGAN_SLOT_BELLY
type_to_check = /datum/preference/choiced/genital/belly
skin_color_type = /datum/preference/toggle/genital_skin_color/belly
//SPLURT EDIT END

// Genital fluid preferences base type
/datum/preference/choiced/genital_fluid
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,18 @@
WRITE_FILE(file, json_encode(json))
return TRUE

/datum/interaction/act(mob/living/user, mob/living/target)
if(user == target && usage == INTERACTION_BOTH)
user_pleasure += target_pleasure
user_arousal += target_arousal
user_pain += target_pain

. = ..()

if(user == target && usage == INTERACTION_BOTH)
user_pleasure -= target_pleasure
user_arousal -= target_arousal
user_pain -= target_pain

/datum/interaction/proc/allow_act(mob/living/carbon/human/user, mob/living/carbon/human/target)
if(target == user && usage == INTERACTION_OTHER)
Expand Down Expand Up @@ -231,7 +243,7 @@

// Called when either the user or target is cumming from the interaction, makes the interaction text
/datum/interaction/proc/show_climax(mob/living/cumming, mob/living/came_in, position)
var/override_check = length(cum_message_text_overrides[position]) && length(cum_self_text_overrides[position]) && (length(cum_partner_text_overrides[position]) || usage == INTERACTION_SELF)
var/override_check = length(cum_message_text_overrides[position]) && length(cum_self_text_overrides[position]) && (length(cum_partner_text_overrides[position]) || cumming == came_in)
if(!override_check)
return FALSE

Expand Down Expand Up @@ -265,7 +277,7 @@

cumming.visible_message(span_userlove(message), span_userlove(self_message))

if(usage == INTERACTION_OTHER)
if(cumming != came_in)
var/partner_message = pick(cum_partner_text_overrides[position])
partner_message = replacetext(partner_message, "%CUMMING%", "[cumming]")
partner_message = replacetext(partner_message, "%CUMMING_THEIR%", "[cumming_their]")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
/datum/interaction/lewd/portal
category = INTERACTION_CAT_HIDE
distance_allowed = TRUE
usage = INTERACTION_BOTH

/// Messages used when the interaction is anonymous
var/list/hidden_message = list()
/// User messages used when the portal panties are anonymous
var/list/hidden_user_messages = list()
/// Target messages used when the portal fleshlight is anonymous
var/list/hidden_target_messages = list()

/// Hidden climax message overrides for anonymous interactions
var/list/hidden_cum_message_text_overrides = list(CLIMAX_POSITION_USER = list(), CLIMAX_POSITION_TARGET = list())
/// Hidden climax self message overrides for anonymous interactions
var/list/hidden_cum_self_text_overrides = list(CLIMAX_POSITION_USER = list(), CLIMAX_POSITION_TARGET = list())
/// Hidden climax partner message overrides for anonymous interactions
var/list/hidden_cum_partner_text_overrides = list(CLIMAX_POSITION_USER = list(), CLIMAX_POSITION_TARGET = list())

/datum/interaction/lewd/portal/allow_act(mob/living/carbon/human/user, mob/living/carbon/human/target)
var/obj/item/clothing/sextoy/portal_fleshlight/fleshlight = user.get_active_held_item()
var/obj/item/clothing/sextoy/portal_panties/panties = istype(fleshlight) ? fleshlight.linked_panties : null

if(!istype(fleshlight) || !istype(panties))
return FALSE

. = ..()

/datum/interaction/lewd/portal/act(mob/living/user, mob/living/target)
var/list/original_message = message.Copy()
var/list/original_user_messages = user_messages?.Copy()
var/list/original_target_messages = target_messages?.Copy()

var/obj/item/clothing/sextoy/portal_fleshlight/fleshlight = user.get_active_held_item()
var/obj/item/clothing/sextoy/portal_panties/panties = istype(fleshlight) ? fleshlight.linked_panties : null

if(fleshlight.anonymous && length(hidden_target_messages))
target_messages = hidden_target_messages.Copy()

if(panties.anonymous && length(hidden_user_messages))
user_messages = hidden_user_messages.Copy()

if((fleshlight.anonymous || panties.anonymous) && length(hidden_message))
message = hidden_message.Copy()

. = ..()

// Restore original messages
message = original_message
if(length(original_user_messages))
user_messages = original_user_messages
if(length(original_target_messages))
target_messages = original_target_messages

/datum/interaction/lewd/portal/show_climax(mob/living/cumming, mob/living/came_in, position)
// Store original climax messages
var/list/original_cum_message = cum_message_text_overrides.Copy()
var/list/original_cum_self = cum_self_text_overrides.Copy()
var/list/original_cum_partner = cum_partner_text_overrides.Copy()

var/obj/item/clothing/sextoy/portal_fleshlight/fleshlight = cumming.get_active_held_item()
var/obj/item/clothing/sextoy/portal_panties/panties = istype(fleshlight) ? fleshlight.linked_panties : null

// Replace with anonymous messages if needed
if((fleshlight.anonymous && position == CLIMAX_POSITION_TARGET) || (panties.anonymous && position == CLIMAX_POSITION_USER))
if(length(hidden_cum_message_text_overrides[position]))
cum_message_text_overrides[position] = hidden_cum_message_text_overrides[position]
cum_self_text_overrides[position] = hidden_cum_self_text_overrides[position]
cum_partner_text_overrides[position] = hidden_cum_partner_text_overrides[position]

. = ..()

// Restore original climax messages
cum_message_text_overrides[position] = original_cum_message[position]
cum_self_text_overrides[position] = original_cum_self[position]
cum_partner_text_overrides[position] = original_cum_partner[position]
Loading
Loading