mirror of
https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13.git
synced 2025-12-11 10:22:13 +00:00
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
@@ -26,7 +26,6 @@
|
||||
var/max_accessories = 3
|
||||
var/list/obj/item/clothing/accessory/attached_accessories = list()
|
||||
var/list/mutable_appearance/accessory_overlays = list()
|
||||
var/is_skirt = FALSE
|
||||
//SANDSTORM EDIT END
|
||||
|
||||
/obj/item/clothing/under/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE)
|
||||
|
||||
@@ -116,6 +116,12 @@
|
||||
2023-01-21:
|
||||
zeroisthebiggay:
|
||||
- spellcheck: the meme emotes
|
||||
LeDrascol:
|
||||
- balance: Synthetic Lizardperson, Synthetic Anthropomorph, and IPC no longer experience
|
||||
thirst
|
||||
SandPoot:
|
||||
- rscadd: Added a reskin to the premium kinetic accelerator.
|
||||
- bugfix: Fixed some possible graphical glitches with the mining hardsuit reskin.
|
||||
- tweak: Tweaked skirt peeking into allowing peeking under people that are on top
|
||||
of tables.
|
||||
- refactor: Refactored skirt peeking into element.
|
||||
|
||||
23
modular_sand/code/_globalvars/lists/lewd_content.dm
Normal file
23
modular_sand/code/_globalvars/lists/lewd_content.dm
Normal 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
|
||||
))
|
||||
100
modular_sand/code/datums/elements/skirt_peeking.dm
Normal file
100
modular_sand/code/datums/elements/skirt_peeking.dm
Normal 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)
|
||||
@@ -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"))
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
/obj/item/clothing/under/color/jumpskirt
|
||||
is_skirt = TRUE
|
||||
@@ -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
|
||||
@@ -1,2 +0,0 @@
|
||||
/obj/item/clothing/under/dress/skirt //inb4 this breaks something
|
||||
is_skirt = TRUE
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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)
|
||||
@@ -1,3 +1,4 @@
|
||||
/mob/living/carbon/human/ComponentInitialize()
|
||||
. = ..()
|
||||
AddElement(/datum/element/mob_holder/micro, "micro")
|
||||
AddElement(/datum/element/skirt_peeking)
|
||||
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -3927,6 +3927,7 @@
|
||||
#include "modular_citadel\code\modules\vectorcrafts\vectortruck.dm"
|
||||
#include "modular_citadel\code\modules\vectorcrafts\vectorvariants.dm"
|
||||
#include "modular_sand\code\_globalvars\bitfields.dm"
|
||||
#include "modular_sand\code\_globalvars\lists\lewd_content.dm"
|
||||
#include "modular_sand\code\_globalvars\lists\misc.dm"
|
||||
#include "modular_sand\code\_globalvars\lists\objects.dm"
|
||||
#include "modular_sand\code\_onclick\hud\hud.dm"
|
||||
@@ -3946,6 +3947,7 @@
|
||||
#include "modular_sand\code\datums\components\storage\concrete\dresser.dm"
|
||||
#include "modular_sand\code\datums\diseases\advance\symptoms\species.dm"
|
||||
#include "modular_sand\code\datums\elements\holder_micro.dm"
|
||||
#include "modular_sand\code\datums\elements\skirt_peeking.dm"
|
||||
#include "modular_sand\code\datums\interactions\_interaction.dm"
|
||||
#include "modular_sand\code\datums\interactions\interaction_interface.dm"
|
||||
#include "modular_sand\code\datums\interactions\interaction_mob.dm"
|
||||
@@ -4100,12 +4102,7 @@
|
||||
#include "modular_sand\code\modules\clothing\spacesuits\hardsuit.dm"
|
||||
#include "modular_sand\code\modules\clothing\suits\miscellaneous.dm"
|
||||
#include "modular_sand\code\modules\clothing\under\_under.dm"
|
||||
#include "modular_sand\code\modules\clothing\under\color.dm"
|
||||
#include "modular_sand\code\modules\clothing\under\costumes.dm"
|
||||
#include "modular_sand\code\modules\clothing\under\misc.dm"
|
||||
#include "modular_sand\code\modules\clothing\under\skirt_dress.dm"
|
||||
#include "modular_sand\code\modules\clothing\under\suits.dm"
|
||||
#include "modular_sand\code\modules\clothing\under\syndicate.dm"
|
||||
#include "modular_sand\code\modules\clothing\under\uniform.dm"
|
||||
#include "modular_sand\code\modules\clothing\underwear\_underwear.dm"
|
||||
#include "modular_sand\code\modules\clothing\underwear\boxers.dm"
|
||||
@@ -4149,13 +4146,15 @@
|
||||
#include "modular_sand\code\modules\mob\living\carbon\carbon.dm"
|
||||
#include "modular_sand\code\modules\mob\living\carbon\life.dm"
|
||||
#include "modular_sand\code\modules\mob\living\carbon\show.dm"
|
||||
#include "modular_sand\code\modules\mob\living\carbon\human\examine.dm"
|
||||
#include "modular_sand\code\modules\mob\living\carbon\human\human.dm"
|
||||
#include "modular_sand\code\modules\mob\living\carbon\human\human_defines.dm"
|
||||
#include "modular_sand\code\modules\mob\living\carbon\human\human_stripping.dm"
|
||||
#include "modular_sand\code\modules\mob\living\carbon\human\life.dm"
|
||||
#include "modular_sand\code\modules\mob\living\carbon\human\species.dm"
|
||||
#include "modular_sand\code\modules\mob\living\carbon\human\species_types\anthropomorph.dm"
|
||||
#include "modular_sand\code\modules\mob\living\carbon\human\species_types\ipc.dm"
|
||||
#include "modular_sand\code\modules\mob\living\carbon\human\species_types\lizardpeople.dm"
|
||||
#include "modular_sand\code\modules\mob\living\carbon\human\species_types\synthliz.dm"
|
||||
#include "modular_sand\code\modules\mob\living\silicon\silicon.dm"
|
||||
#include "modular_sand\code\modules\mob\living\silicon\ai\ai.dm"
|
||||
#include "modular_sand\code\modules\mob\living\silicon\ai\vox_sounds.dm"
|
||||
|
||||
Reference in New Issue
Block a user