Merge remote-tracking branch 'upstream/master'

This commit is contained in:
BongaTheProto
2023-01-22 01:06:28 -05:00
16 changed files with 159 additions and 113 deletions

View File

@@ -0,0 +1,23 @@
/*
* List of clothes with possible peeking under,
* It is prefilled with clothes that cannot be caught
* by the automatic system (has no skirt in path)
*/
GLOBAL_LIST_INIT(skirt_peekable, list(
/obj/item/clothing/under/rank/civilian/janitor/maid = TRUE,
/obj/item/clothing/under/costume/loincloth = TRUE,
/obj/item/clothing/under/costume/loincloth/cloth = TRUE,
/obj/item/clothing/under/costume/loincloth/cloth/sensor = TRUE,
))
/*
* List of clothes you can't say a pair of.
* Ex:
* A pair of jockstrap?
*/
GLOBAL_LIST_INIT(pairless_panties, list(
/obj/item/clothing/underwear/briefs/jockstrap = TRUE,
/obj/item/clothing/underwear/briefs/panties/thong = TRUE,
/obj/item/clothing/underwear/briefs/panties/thong/babydoll = TRUE,
/obj/item/clothing/underwear/briefs/mankini = TRUE
))

View File

@@ -0,0 +1,100 @@
/datum/element/skirt_peeking
element_flags = ELEMENT_DETACH
/datum/element/skirt_peeking/Attach(datum/peeked)
. = ..()
if(!ishuman(peeked))
return ELEMENT_INCOMPATIBLE
RegisterSignal(peeked, COMSIG_PARENT_EXAMINE, .proc/on_examine)
RegisterSignal(peeked, COMSIG_PARENT_EXAMINE_MORE, .proc/on_closer_look)
/datum/element/skirt_peeking/proc/can_skirt_peek(mob/living/carbon/human/peeked, mob/peeker)
var/mob/living/living = peeker
var/obj/item/clothing/under/worn_uniform = peeked.get_item_by_slot(ITEM_SLOT_ICLOTHING)
// Unfortunately, you can't see it
// Going to be honest, i wanted to do something like a groin check, but that would
// Block EVERYTHING, and well, most of the others won't even cover it right?
// Should maybe consider using this for groin genitals.
if(istype(peeked.get_item_by_slot(ITEM_SLOT_OCLOTHING), /obj/item/clothing/suit/space))
return FALSE
//
// Valid clothing section
if(worn_uniform && is_type_in_typecache(worn_uniform.type, GLOB.skirt_peekable) \
// We are being peeked by a spooky ghost who sees all?
&& (isobserver(peeker) \
// Are you a living creature (and not us)?
|| (istype(living) && (peeker != peeked) \
// And are you under us while we're standing up?
&& (!(CHECK_BITFIELD(living.mobility_flags, MOBILITY_STAND)) && (CHECK_BITFIELD(peeked.mobility_flags, MOBILITY_STAND)) && (peeked.loc == living.loc)))) \
// Or are you nearby and we are up high
|| ((locate(/obj/structure/table) in get_turf(peeked)) && CHECK_BITFIELD(peeked.mobility_flags, MOBILITY_STAND)) && \
peeked.Adjacent(peeker))
return TRUE
return FALSE
/datum/element/skirt_peeking/proc/on_examine(mob/living/carbon/human/peeked, mob/peeker, list/examine_list)
if(can_skirt_peek(peeked, peeker))
examine_list += span_purple("[peeked.p_theyre(TRUE)] wearing a skirt! I can probably give it a little peek <b>looking closer</b>.")
/datum/element/skirt_peeking/proc/on_closer_look(mob/living/carbon/human/peeked, mob/peeker, list/examine_content)
if(can_skirt_peek(peeked, peeker))
var/obj/item/clothing/under/worn_uniform = peeked.get_item_by_slot(ITEM_SLOT_ICLOTHING)
var/string = "Peeking under [peeked]'s [worn_uniform.name], you can see "
var/obj/item/clothing/underwear/worn_underwear = peeked.get_item_by_slot(ITEM_SLOT_UNDERWEAR)
if(worn_underwear)
string += "a "
if(!is_type_in_typecache(worn_underwear.type, GLOB.pairless_panties)) //a pair of thong
string += "pair of "
if(worn_underwear.color)
string += "<font color='[worn_underwear.color]'>[worn_underwear.name]</font>."
else
string += "[worn_underwear.name]."
var/obj/item/organ/genital/penis/penis = peeked.getorganslot(ORGAN_SLOT_PENIS)
var/obj/item/organ/genital/vagina/vagina = peeked.getorganslot(ORGAN_SLOT_VAGINA)
if(penis?.aroused_state)
string += span_love(" There's a visible bulge on [peeked.p_their()] front.")
else if(vagina?.aroused_state)
string += span_love(" [peeked.p_theyre(TRUE)] wet with arousal.")
else
string += "[peeked.p_theyre()] not wearing anything!\n[peeked.p_their(TRUE)]"
var/list/genitals = list()
for(var/obj/item/organ/genital/genital in peeked.internal_organs)
if(CHECK_BITFIELD(genital.genital_flags, (GENITAL_INTERNAL|GENITAL_HIDDEN)))
continue
var/appended
switch(genital.type)
if(/obj/item/organ/genital/vagina)
if(genital.aroused_state)
appended += " wet"
if(lowertext(genital.shape) != "human")
appended += " [lowertext(genital.shape)]"
if(lowertext(genital.shape) != "cloaca") //their wet cloaca vagina
appended += " [lowertext(genital.name)]" // goodbye pussy
if(/obj/item/organ/genital/testicles)
var/obj/item/organ/genital/testicles/nuts = genital
appended += " [lowertext(nuts.size_name)] [lowertext(nuts.name)]"
if(/obj/item/organ/genital/penis)
if(genital.aroused_state)
appended += " fully erect"
if(lowertext(genital.shape) != "human")
appended += " [lowertext(genital.shape)]"
appended += " [lowertext(genital.name)]" // Name it something funny, i dare you.
if(/obj/item/organ/genital/butt)
var/obj/item/organ/genital/butt/booty = genital
appended += " [booty.size_name] [lowertext(booty.name)]" // Maybe " average butt pair" isn't the best for now
else
continue
genitals += appended
string += english_list(genitals, " featureless groin", " and", ",")
string += " on full display."
examine_content += span_purple(string)

View File

@@ -1,7 +1,3 @@
GLOBAL_LIST_INIT(skirt_peekable, list(
/obj/item/clothing/under/rank/civilian/janitor/maid = TRUE /* This one hangs about because no skirt in path */
))
/obj/item/clothing/under/Initialize(mapload)
. = ..()
if(!is_type_in_typecache(type, GLOB.skirt_peekable) && findlasttext("[type]", "skirt"))

View File

@@ -1,2 +0,0 @@
/obj/item/clothing/under/color/jumpskirt
is_skirt = TRUE

View File

@@ -1,8 +0,0 @@
/obj/item/clothing/under/rank/prisoner/skirt
is_skirt = TRUE
/obj/item/clothing/under/misc/durathread/skirt
is_skirt = TRUE
/obj/item/clothing/under/misc/cog/jumpskirt
is_skirt = TRUE

View File

@@ -1,2 +0,0 @@
/obj/item/clothing/under/dress/skirt //inb4 this breaks something
is_skirt = TRUE

View File

@@ -1,5 +0,0 @@
/obj/item/clothing/under/suit/white_on_white/skirt
is_skirt = TRUE
/obj/item/clothing/under/suit/black/skirt
is_skirt = TRUE

View File

@@ -1,8 +0,0 @@
/obj/item/clothing/under/syndicate/skirt
is_skirt = TRUE
/obj/item/clothing/under/syndicate/tacticool/skirt
is_skirt = TRUE
/obj/item/clothing/under/syndicate/cosmetic/skirt
is_skirt = TRUE

View File

@@ -1,77 +0,0 @@
GLOBAL_LIST_INIT(pairless_panties, list(
/obj/item/clothing/underwear/briefs/jockstrap = TRUE,
/obj/item/clothing/underwear/briefs/panties/thong = TRUE,
/obj/item/clothing/underwear/briefs/panties/thong/babydoll = TRUE,
/obj/item/clothing/underwear/briefs/mankini = TRUE
))
/mob/living/carbon/human/examine(mob/user)
. = ..()
var/mob/living/living = user
var/obj/item/clothing/under/worn_uniform = get_item_by_slot(ITEM_SLOT_ICLOTHING)
if(worn_uniform && is_type_in_typecache(worn_uniform.type, GLOB.skirt_peekable) && (isobserver(user) || (isliving(user) && (user != src) && !(living.mobility_flags & MOBILITY_STAND) && (mobility_flags & MOBILITY_STAND) && (loc == living.loc) && (istype(worn_uniform)))))
. += span_purple("[p_theyre(TRUE)] wearing a [worn_uniform.name]! You can probably give it a little peek by <b>looking closer</b>.")
/mob/living/carbon/human/Initialize(mapload)
. = ..()
RegisterSignal(src, COMSIG_PARENT_EXAMINE_MORE, .proc/peek_skirt)
/mob/living/carbon/human/proc/peek_skirt(mob/examined, mob/examiner, list/examine_content)
var/mob/living/living = examiner
var/obj/item/clothing/under/worn_uniform = get_item_by_slot(ITEM_SLOT_ICLOTHING)
if(worn_uniform && is_type_in_typecache(worn_uniform.type, GLOB.skirt_peekable) && (isobserver(examiner) || (isliving(examiner) && (examiner != src) && !(living.mobility_flags & MOBILITY_STAND) && (mobility_flags & MOBILITY_STAND) && (loc == living.loc) && (istype(worn_uniform)))))
var/string = "Peeking under [src]'s [worn_uniform.name], you can see "
var/obj/item/clothing/underwear/worn_underwear = get_item_by_slot(ITEM_SLOT_UNDERWEAR)
if(worn_underwear)
string += "a "
if(!is_type_in_typecache(worn_underwear.type, GLOB.pairless_panties)) //a pair of thong
string += "pair of "
if(worn_underwear.color)
string += "<font color='[worn_underwear.color]'>[worn_underwear.name]</font>."
else
string += "[worn_underwear.name]."
var/obj/item/organ/genital/penis/penis = getorganslot(ORGAN_SLOT_PENIS)
var/obj/item/organ/genital/vagina/vagina = getorganslot(ORGAN_SLOT_VAGINA)
if(penis?.aroused_state)
string += span_love(" There's a visible bulge on [p_their()] front.")
else if(vagina?.aroused_state)
string += span_love(" [p_theyre(TRUE)] wet with arousal.")
else
string += "[p_theyre()] not wearing anything!\n[p_their(TRUE)]"
var/list/genitals = list()
for(var/obj/item/organ/genital/genital in internal_organs)
if(genital.genital_flags & (GENITAL_INTERNAL|GENITAL_HIDDEN))
continue
var/appended
switch(genital.type)
if(/obj/item/organ/genital/vagina)
if(genital.aroused_state)
appended += " wet"
if(lowertext(genital.shape) != "human")
appended += " [lowertext(genital.shape)]"
if(lowertext(genital.shape) != "cloaca") //their wet cloaca vagina
appended += " [lowertext(genital.name)]" // goodbye pussy
if(/obj/item/organ/genital/testicles)
var/obj/item/organ/genital/testicles/nuts = genital
appended += " [lowertext(nuts.size_name)] [lowertext(nuts.name)]"
if(/obj/item/organ/genital/penis)
if(genital.aroused_state)
appended += " fully erect"
if(lowertext(genital.shape) != "human")
appended += " [lowertext(genital.shape)]"
appended += " [lowertext(genital.name)]" // Name it something funny, i dare you.
if(/obj/item/organ/genital/butt)
var/obj/item/organ/genital/butt/booty = genital
appended += " [booty.size_name] [lowertext(booty.name)]" // Maybe " average butt pair" isn't the best for now
else
continue
genitals += appended
string += english_list(genitals, " featureless groin", " and", ",")
string += " on full display."
examine_content += span_purple(string)

View File

@@ -1,3 +1,4 @@
/mob/living/carbon/human/ComponentInitialize()
. = ..()
AddElement(/datum/element/mob_holder/micro, "micro")
AddElement(/datum/element/skirt_peeking)

View File

@@ -0,0 +1,8 @@
/datum/species/mammal/synthetic/New()
. = ..()
// Define inherent traits to add
var/modular_inherent_traits = list(TRAIT_NOTHIRST)
// Add new traits to list
LAZYADD(inherent_traits, modular_inherent_traits)

View File

@@ -0,0 +1,8 @@
/datum/species/ipc/New()
. = ..()
// Define inherent traits to add
var/modular_inherent_traits = list(TRAIT_NOTHIRST)
// Add new traits to list
LAZYADD(inherent_traits, modular_inherent_traits)

View File

@@ -0,0 +1,8 @@
/datum/species/synthliz/New()
. = ..()
// Define inherent traits to add
var/modular_inherent_traits = list(TRAIT_NOTHIRST)
// Add new traits to list
LAZYADD(inherent_traits, modular_inherent_traits)