From 04ac289ad1be26ca182634c3982a11eb595c9662 Mon Sep 17 00:00:00 2001
From: GremlingSS <68038883+GremlingSS@users.noreply.github.com>
Date: Fri, 6 May 2022 11:56:19 +0100
Subject: [PATCH 1/5] initial files
---
code/__defines/dna_arfs.dm | 20 +++++++++++++++++++
content_arfs/code/lewd/preference/09_lewd.dm | 0
.../code/lewd/preference/preferences.dm | 2 ++
content_arfs/code/lewd/readme.md | 3 +++
vorestation.dme | 3 +++
5 files changed, 28 insertions(+)
create mode 100644 code/__defines/dna_arfs.dm
create mode 100644 content_arfs/code/lewd/preference/09_lewd.dm
create mode 100644 content_arfs/code/lewd/preference/preferences.dm
create mode 100644 content_arfs/code/lewd/readme.md
diff --git a/code/__defines/dna_arfs.dm b/code/__defines/dna_arfs.dm
new file mode 100644
index 00000000000..0e75c0e3485
--- /dev/null
+++ b/code/__defines/dna_arfs.dm
@@ -0,0 +1,20 @@
+// Skyrat port
+
+// file contains macros for sheathes, seething sheaths, very angry things, I'll tell you that. Infact, so angry, I'm trembling.
+
+//In inches
+#define PENIS_MAX_GIRTH 15
+#define PENIS_MIN_LENGTH 1
+#define PENIS_MAX_LENGTH 20
+
+#define SHEATH_NONE "None"
+#define SHEATH_NORMAL "Sheath"
+#define SHEATH_SLIT "Slit"
+#define SHEATH_MODES list(SHEATH_NONE, SHEATH_NORMAL, SHEATH_SLIT)
+
+#define MANDATORY_FEATURE_LIST list("mcolor" = "#FFFFBB","mcolor2" = "#FFFFBB","mcolor3" = "#FFFFBB","ethcolor" = "#FFCCCC","skin_color" = "#FFEEDD","flavor_text" = "","breasts_size" = 1,"breasts_lactation" = FALSE,"penis_size" = 13,"penis_girth" = 9,"penis_taur_mode" = TRUE,"penis_sheath" = SHEATH_NONE ,"balls_size" = 1, "body_size" = BODY_SIZE_NORMAL, "custom_species" = null, penis_uses_skintones = TRUE, penis_uses_skincolor = TRUE, testicles_uses_skintones = TRUE, testicles_uses_skincolor = TRUE, vagina_uses_skintones = TRUE, vagina_uses_skincolor = TRUE, breasts_uses_skintones = TRUE, breasts_uses_skincolor = TRUE)
+
+#define AROUSAL_CANT 0
+#define AROUSAL_NONE 1
+#define AROUSAL_PARTIAL 2
+#define AROUSAL_FULL 3
\ No newline at end of file
diff --git a/content_arfs/code/lewd/preference/09_lewd.dm b/content_arfs/code/lewd/preference/09_lewd.dm
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/content_arfs/code/lewd/preference/preferences.dm b/content_arfs/code/lewd/preference/preferences.dm
new file mode 100644
index 00000000000..41ceba44529
--- /dev/null
+++ b/content_arfs/code/lewd/preference/preferences.dm
@@ -0,0 +1,2 @@
+/datum/preferences
+
\ No newline at end of file
diff --git a/content_arfs/code/lewd/readme.md b/content_arfs/code/lewd/readme.md
new file mode 100644
index 00000000000..c5548e2fe4e
--- /dev/null
+++ b/content_arfs/code/lewd/readme.md
@@ -0,0 +1,3 @@
+Most of the skyrat sex mechanics port is here. Other locations include:
+
+dna_arfs.dm located in __defines.
diff --git a/vorestation.dme b/vorestation.dme
index 86e94acc953..9b00ddba26c 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -45,6 +45,7 @@
#include "code\__defines\crafting.dm"
#include "code\__defines\damage_organs.dm"
#include "code\__defines\dna.dm"
+#include "code\__defines\dna_arfs.dm"
#include "code\__defines\exosuit_fab.dm"
#include "code\__defines\flags.dm"
#include "code\__defines\gamemode.dm"
@@ -4142,6 +4143,8 @@
#include "content_arfs\code\donater\suits.dm"
#include "content_arfs\code\donater\ties.dm"
#include "content_arfs\code\donater\under.dm"
+#include "content_arfs\code\lewd\preference\09_lewd.dm"
+#include "content_arfs\code\lewd\preference\preferences.dm"
#include "content_arfs\code\loadout\cagse.dm"
#include "content_arfs\code\loadout\custom_items.dm"
#include "content_arfs\code\loadout\loadout_accessories.dm"
From de26a352afa639995cab1d9bb55ce27a53997194 Mon Sep 17 00:00:00 2001
From: GremlingSS <68038883+GremlingSS@users.noreply.github.com>
Date: Fri, 6 May 2022 13:02:59 +0100
Subject: [PATCH 2/5] preference options added
---
.../code/lewd/preference/preferences.dm | 82 ++++++++++++++++++-
1 file changed, 81 insertions(+), 1 deletion(-)
diff --git a/content_arfs/code/lewd/preference/preferences.dm b/content_arfs/code/lewd/preference/preferences.dm
index 41ceba44529..35d6736ba2d 100644
--- a/content_arfs/code/lewd/preference/preferences.dm
+++ b/content_arfs/code/lewd/preference/preferences.dm
@@ -1,2 +1,82 @@
/datum/preferences
-
\ No newline at end of file
+ // The weiner part.
+ var/penis // penis ref // var/datum/sprite_accessory/genital/penis/none/default = /datum/sprite_accessory/genital/penis/none
+ var/r_penis = 179 // Genital color
+ var/g_penis = 148 // Genital color
+ var/b_penis = 116 // Genital color
+
+ var/emissive_penis = 0 // bool
+
+ var/r_penis_emissive = 0 // int 0 - 255
+ var/g_penis_emissive = 0 // int 0 - 255
+ var/b_penis_emissive = 0 // int 0 - 255
+
+ var/penis_uses_skincolor = 0 // bool
+ var/penis_size = round((PENIS_MIN_LENGTH + PENIS_MAX_LENGTH) / 2)
+ var/penis_girth = round((PENIS_MIN_LENGTH + PENIS_MAX_GIRTH) / 2)
+
+ var/penis_taur = 0 // bool
+
+ // The place to hide the weiner.
+ var/penis_sheath = SHEATH_NONE // SHEATH_ Macro
+ var/r_penis_sheath = 0 // int 0 - 255
+ var/g_penis_sheath = 0 // int 0 - 255
+ var/b_penis_sheath = 0 // int 0 - 255
+
+ // it it spelt like testicles, or testicals 🤔
+ var/testicles
+ var/r_testicles = 179 // int 0 - 255
+ var/g_testicles = 148 // int 0 - 255
+ var/b_testicles = 116 // int 0 - 255
+
+ var/testicles_uses_skincolor = 0 // bool
+
+ var/emissive_testicles = 0 // bool
+
+ var/r_testicles_emissive = 0 // int 0 - 255
+ var/g_testicles_emissive = 0 // int 0 - 255
+ var/b_testicles_emissive = 0 // int 0 - 255
+
+ var/balls_size = 2 // int, idk why it aint a macro, what the fuck does 2 mean, 2 miles? 2 kilometers? yeah, huge difference bud.
+
+ // gimme da poosy b0ss
+ var/vagina
+ var/r_vagina = 179 // int 0 - 255
+ var/g_vagina = 148 // int 0 - 255
+ var/b_vagina = 116 // int 0 - 255
+
+ var/vagina_uses_skincolor = 0 // bool
+
+ var/emissive_vagina = 0 // bool
+
+ var/r_vagina_emissive = 0 // int 0 - 255
+ var/g_vagina_emissive = 0 // int 0 - 255
+ var/b_vagina_emissive = 0 // int 0 - 255
+
+ var/womb // ..if you thought vagina was enough, wait till you see there's a womb included too!
+
+ // succulent, moist, wait- moist? wtf? no???
+ var/breasts
+ var/r_breasts = 179 // int 0 - 255
+ var/g_breasts = 148 // int 0 - 255
+ var/b_breasts = 116 // int 0 - 255
+
+ var/breasts_uses_skincolor = 0 // bool
+
+ var/emissive_breasts = 0 // bool
+
+ var/r_breasts_emissive = 0 // int 0 - 255
+ var/g_breasts_emissive = 0 // int 0 - 255
+ var/b_breasts_emissive = 0 // int 0 - 255
+
+
+ // oh that's why it's moist, huh.
+ var/breasts_lactation
+
+ var/breasts_size = 4 // int
+
+ // The forbidden gay 🍑, if you eat it you become gay. Or straight, whatever rocks your boat.
+ var/anus
+
+
+ // :fuckingdead:
\ No newline at end of file
From 47e966c35239c107fcfd8723c51976f544923cd0 Mon Sep 17 00:00:00 2001
From: GremlingSS <68038883+GremlingSS@users.noreply.github.com>
Date: Fri, 6 May 2022 19:55:06 +0100
Subject: [PATCH 3/5] milestone point 1, 250 errors, poggers!
---
code/__defines/items_clothing.dm | 6 +
.../mob/living/carbon/human/examine.dm | 2 +
content_arfs/code/lewd/examine.dm | 11 +
content_arfs/code/lewd/human.dm | 85 +++
content_arfs/code/lewd/obj_flags.dm | 4 +
content_arfs/code/lewd/organs.dm | 493 ++++++++++++++++++
.../code/lewd/preference/preferences.dm | 10 +-
content_arfs/code/lewd/readme.md | 3 +-
content_arfs/code/lewd/sprite_accessories.dm | 294 +++++++++++
vorestation.dme | 5 +
10 files changed, 910 insertions(+), 3 deletions(-)
create mode 100644 content_arfs/code/lewd/examine.dm
create mode 100644 content_arfs/code/lewd/human.dm
create mode 100644 content_arfs/code/lewd/obj_flags.dm
create mode 100644 content_arfs/code/lewd/organs.dm
create mode 100644 content_arfs/code/lewd/sprite_accessories.dm
diff --git a/code/__defines/items_clothing.dm b/code/__defines/items_clothing.dm
index a7dba8be88c..49244e99cde 100644
--- a/code/__defines/items_clothing.dm
+++ b/code/__defines/items_clothing.dm
@@ -129,6 +129,12 @@
#define HAND_LEFT 0x800
#define HAND_RIGHT 0x1000
#define HANDS 0x1800 // HAND_LEFT | HAND_RIGHT
+#define PENIS 0x2000 // ARFS ADD: ERP MECHANICS
+#define WOMB 0x2200 // ARFS ADD: ERP MECHANICS
+#define VAGINA 0x2400 // ARFS ADD: ERP MECHANICS
+#define TESTICLES 0x2600 // ARFS ADD: ERP MECHANICS
+#define BREASTS 0x2800 // ARFS ADD: ERP MECHANICS
+#define ANUS 0x2800 // ARFS ADD: ERP MECHANICS
#define FULL_BODY 0xFFFF
// Bitflags for the percentual amount of protection a piece of clothing which covers the body part offers.
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index fa75fb5e912..e9ce877c405 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -307,6 +307,8 @@
msg += vorestrings
//VOREStation Add End
+ msg += GetGenitalExamine(T) // ARFS ADD: Genital examination message.
+
if(mSmallsize in mutations)
msg += "[T.He] [T.is] very short!"
diff --git a/content_arfs/code/lewd/examine.dm b/content_arfs/code/lewd/examine.dm
new file mode 100644
index 00000000000..b695689005b
--- /dev/null
+++ b/content_arfs/code/lewd/examine.dm
@@ -0,0 +1,11 @@
+/mob/living/carbon/human/proc/GetGenitalExamine(var/datum/gender/T)
+ var/list/msg
+ for(var/genital in list("penis", "testicles", "vagina", "breasts", "anus"))
+ if(dna.species.mutant_bodyparts[genital])
+ var/datum/sprite_accessory/genital/G = GLOB.sprite_accessories[genital][dna.species.mutant_bodyparts[genital][MUTANT_INDEX_NAME]]
+ if(G)
+ if(!(G.is_hidden(src)))
+ msg += "[T.he] has exposed genitals... Look closer..."
+ break
+
+ return msg
\ No newline at end of file
diff --git a/content_arfs/code/lewd/human.dm b/content_arfs/code/lewd/human.dm
new file mode 100644
index 00000000000..13c1d38d36a
--- /dev/null
+++ b/content_arfs/code/lewd/human.dm
@@ -0,0 +1,85 @@
+/mob/living/carbon/human
+ var/disable_erp_preferences = 0 // the almighty toggle.
+
+ // The weiner part.
+ var/datum/sprite_accessory/genital/penis/penis
+ var/r_penis = 179 // Genital color
+ var/g_penis = 148 // Genital color
+ var/b_penis = 116 // Genital color
+
+ var/emissive_penis = 0 // bool
+
+ var/r_penis_emissive = 0 // int 0 - 255
+ var/g_penis_emissive = 0 // int 0 - 255
+ var/b_penis_emissive = 0 // int 0 - 255
+
+ var/penis_uses_skintones = 0 // bool
+ var/penis_uses_skincolor = 0 // bool
+ var/penis_size = 11
+ var/penis_girth = 6
+
+ var/penis_taur = 0 // bool
+
+ // The place to hide the weiner.
+ var/penis_sheath = SHEATH_NONE // SHEATH_ Macro
+ var/r_penis_sheath = 0 // int 0 - 255
+ var/g_penis_sheath = 0 // int 0 - 255
+ var/b_penis_sheath = 0 // int 0 - 255
+
+ // is it spelt like testicles, or testicals 🤔
+ var/datum/sprite_accessory/genital/testicles/testicles
+ var/r_testicles = 179 // int 0 - 255
+ var/g_testicles = 148 // int 0 - 255
+ var/b_testicles = 116 // int 0 - 255
+
+ var/testicles_uses_skintones = 0 // bool
+ var/testicles_uses_skincolor = 0 // bool
+
+ var/emissive_testicles = 0 // bool
+
+ var/r_testicles_emissive = 0 // int 0 - 255
+ var/g_testicles_emissive = 0 // int 0 - 255
+ var/b_testicles_emissive = 0 // int 0 - 255
+
+ var/balls_size = 2 // int, idk why it aint a macro, what the fuck does 2 mean, 2 miles? 2 kilometers? yeah, huge difference bud.
+
+ // gimme da poosy b0ss
+ var/datum/sprite_accessory/genital/vagina/vagina
+ var/r_vagina = 179 // int 0 - 255
+ var/g_vagina = 148 // int 0 - 255
+ var/b_vagina = 116 // int 0 - 255
+
+ var/vagina_uses_skintones = 0 // bool
+ var/vagina_uses_skincolor = 0 // bool
+
+ var/emissive_vagina = 0 // bool
+
+ var/r_vagina_emissive = 0 // int 0 - 255
+ var/g_vagina_emissive = 0 // int 0 - 255
+ var/b_vagina_emissive = 0 // int 0 - 255
+
+ var/sprite_accessory/genital/womb/womb // ..if you thought vagina was enough, wait till you see there's a womb included too!
+
+ // succulent, moist, wait- moist? wtf? no???
+ var/sprite_accessory/genital/breasts/breasts
+ var/r_breasts = 179 // int 0 - 255
+ var/g_breasts = 148 // int 0 - 255
+ var/b_breasts = 116 // int 0 - 255
+
+ var/breasts_uses_skintones = 0 // bool
+ var/breasts_uses_skincolor = 0 // bool
+
+ var/emissive_breasts = 0 // bool
+
+ var/r_breasts_emissive = 0 // int 0 - 255
+ var/g_breasts_emissive = 0 // int 0 - 255
+ var/b_breasts_emissive = 0 // int 0 - 255
+
+
+ // oh that's why it's moist, huh.
+ var/breasts_lactation
+
+ var/breasts_size = 4 // int
+
+ // The forbidden gay 🍑, if you eat it you become gay. Or straight, whatever rocks your boat.
+ var/anus
diff --git a/content_arfs/code/lewd/obj_flags.dm b/content_arfs/code/lewd/obj_flags.dm
new file mode 100644
index 00000000000..f6405038553
--- /dev/null
+++ b/content_arfs/code/lewd/obj_flags.dm
@@ -0,0 +1,4 @@
+#define GENITAL_SKIP_VISIBILITY 0
+#define GENITAL_NEVER_SHOW 1
+#define GENITAL_HIDDEN_BY_CLOTHES 2
+#define GENITAL_ALWAYS_SHOW 3
\ No newline at end of file
diff --git a/content_arfs/code/lewd/organs.dm b/content_arfs/code/lewd/organs.dm
new file mode 100644
index 00000000000..4c32c041d0e
--- /dev/null
+++ b/content_arfs/code/lewd/organs.dm
@@ -0,0 +1,493 @@
+#define O_PENIS "penis"
+#define O_WOMB "womb"
+#define O_VAGINA "vagina"
+#define O_TESTICLES "testicles"
+#define O_BREASTS "breasts"
+#define O_ANUS "anus"
+
+/obj/item/organ/external/genital
+ parent_organ = BP_GROIN
+
+ var/genital_size = 1 // Size to be translated.
+ var/genital_name = "Human" // Sprite
+ var/genital_type = SPECIES_HUMAN // Type like tapered, human, etc.
+ var/sprite_suffix // suffix for which sprite is used [sprite]_suffix
+ var/visibility_preference = GENITAL_HIDDEN_BY_CLOTHES // used to determine if it should be shown through clothing.
+ var/aroused = AROUSAL_NONE // You can very much guess what this does B)
+ var/uses_skintones = FALSE // be the color of the skin _tone_ the player has.
+ var/uses_skin_color = FALSE // be the color of the skin the player has.
+ var/genital_location = LOWER_TORSO // location, for clothing..?
+
+//This translates the float size into a sprite string
+/obj/item/organ/external/genital/proc/get_sprite_size_string()
+ return 0
+
+//This translates the float size into a sprite string
+/obj/item/organ/external/genital/proc/update_sprite_suffix()
+ sprite_suffix = "[get_sprite_size_string()]"
+
+/obj/item/organ/external/genital/proc/get_description_string(datum/sprite_accessory/genital/gas)
+ return "You see genitals"
+
+/obj/item/organ/external/genital/proc/update_genital_icon_state()
+ return
+
+/obj/item/organ/external/genital/proc/set_size(size)
+ genital_size = size
+ update_sprite_suffix()
+
+/obj/item/organ/external/genital/Initialize()
+ . = ..()
+ update_sprite_suffix()
+
+/obj/item/organ/external/genital/replaced(var/mob/living/carbon/human/target,var/obj/item/organ/external/affected)
+ if(target.client.prefs.disable_erp_preferences)
+ return
+ . = ..()
+
+/obj/item/organ/external/genital/handle_organ_mod_special(var/removed = FALSE)
+ . = ..()
+ update_genital_icon_state()
+
+/obj/item/organ/external/genital/proc/build_from_dna(datum/dna/DNA, associated_key)
+ //var/datum/sprite_accessory/genital/accessory = GLOB.sprite_accessories[associated_key][DNA.mutant_bodyparts[associated_key][MUTANT_INDEX_NAME]]
+ //genital_name = accessory.name
+ //genital_type = accessory.icon_state
+ //build_from_accessory(accessory, DNA)
+ update_sprite_suffix()
+
+/// for specific build_from_dna behavior that also checks the genital accessory.
+/obj/item/organ/external/genital/proc/build_from_accessory(datum/sprite_accessory/genital/accessory, datum/dna/DNA)
+ return
+
+/obj/item/organ/external/genital/proc/is_exposed()
+ if(!owner)
+ return TRUE
+
+ if(!ishuman(owner))
+ return TRUE
+
+ var/mob/living/carbon/human/human = owner
+
+ switch(visibility_preference)
+ if(GENITAL_ALWAYS_SHOW)
+ return TRUE
+ if(GENITAL_HIDDEN_BY_CLOTHES)
+ if((human.w_uniform && human.w_uniform.body_parts_covered & genital_location) || (human.wear_suit && human.wear_suit.body_parts_covered & genital_location))
+ return FALSE
+ else
+ return TRUE
+ else
+ return FALSE
+
+// Penoos
+/obj/item/organ/external/genital/penis
+ name = "penis"
+ desc = "A male reproductive organ."
+ icon_state = "penis"
+ icon = 'modular_skyrat/master_files/icons/obj/genitals/penis.dmi'
+
+ genital_location = LOWER_TORSO
+ parent_organ = BP_GROIN
+
+ organ_tag = O_PENIS
+ body_part = LOWER_TORSO
+
+ cannot_break = 1
+
+ var/girth = 9
+ var/sheath = SHEATH_NONE
+
+/obj/item/organ/external/genital/penis/get_description_string(datum/sprite_accessory/genital/gas)
+ var/returned_string = ""
+ var/pname = lowertext(genital_name) == "nondescript" ? "" : lowertext(genital_name) + " "
+ if(sheath != SHEATH_NONE && aroused != AROUSAL_FULL) //Hidden in sheath
+ switch(sheath)
+ if(SHEATH_NORMAL)
+ returned_string = "You see a sheath."
+ if(SHEATH_SLIT)
+ returned_string = "You see a slit." ///Typo fix.
+ if(aroused == AROUSAL_PARTIAL)
+ returned_string += " There's a [pname]penis poking out of it."
+ else
+ returned_string = "You see a [pname]penis. You estimate it's [genital_size] inches long, and [girth] inches in circumference."
+ switch(aroused)
+ if(AROUSAL_NONE)
+ returned_string += " It seems flaccid."
+ if(AROUSAL_PARTIAL)
+ returned_string += " It's partically erect."
+ if(AROUSAL_FULL)
+ returned_string += " It's fully erect."
+ return returned_string
+
+/obj/item/organ/external/genital/penis/update_genital_icon_state()
+ var/size_affix
+ var/measured_size = FLOOR(genital_size,1)
+ if(measured_size < 1)
+ measured_size = 1
+ switch(measured_size)
+ if(1 to 10)
+ size_affix = "1"
+ if(11 to 15)
+ size_affix = "2"
+ if(16 to 24)
+ size_affix = "3"
+ else
+ size_affix = "4"
+ var/passed_string = "penis_[genital_type]_[size_affix]"
+ if(uses_skintones)
+ passed_string += "_s"
+ icon_state = passed_string
+
+/obj/item/organ/external/genital/penis/get_sprite_size_string()
+ if(aroused != AROUSAL_FULL && sheath != SHEATH_NONE) //Sheath time!
+ var/poking_out = 0
+ if(aroused == AROUSAL_PARTIAL)
+ poking_out = 1
+ return "[lowertext(sheath)]_[poking_out]"
+
+ var/size_affix
+ var/measured_size = FLOOR(genital_size,1)
+ var/is_erect = 0
+ if(aroused == AROUSAL_FULL)
+ is_erect = 1
+ if(measured_size < 1)
+ measured_size = 1
+ switch(measured_size)
+ if(1 to 10)
+ size_affix = "1"
+ if(11 to 15)
+ size_affix = "2"
+ if(16 to 24)
+ size_affix = "3"
+ else
+ size_affix = "4"
+ var/passed_string = "[genital_type]_[size_affix]_[is_erect]"
+ if(uses_skintones)
+ passed_string += "_s"
+ return passed_string
+
+/obj/item/organ/external/genital/penis/build_from_dna(datum/dna/DNA, associated_key)
+ ..()
+ girth = owner.penis_girth
+ uses_skin_color = owner.penis_uses_skincolor
+ set_size(owner.penis_size)
+
+/obj/item/organ/external/genital/penis/build_from_accessory(datum/sprite_accessory/genital/accessory, datum/dna/DNA)
+ var/datum/sprite_accessory/genital/penis/snake = accessory
+ if(snake.can_have_sheath)
+ sheath = owner.penis_sheath
+ if(owner.penis_uses_skintones)
+ uses_skintones = accessory.has_skintone_shading
+
+/obj/item/organ/external/genital/testicles
+ name = "testicles"
+ desc = "A male reproductive organ."
+ icon_state = "testicles"
+ icon = 'modular_skyrat/master_files/icons/obj/genitals/testicles.dmi'
+
+ parent_organ = BP_GROIN
+ genital_location = LOWER_TORSO
+
+ organ_tag = O_TESTICLES
+ body_part = LOWER_TORSO
+
+ cannot_break = 1
+
+ aroused = AROUSAL_CANT
+
+/obj/item/organ/external/genital/testicles/update_genital_icon_state()
+ var/measured_size = clamp(genital_size, 1, 3)
+ var/passed_string = "testicles_[genital_type]_[measured_size]"
+ if(uses_skintones)
+ passed_string += "_s"
+ icon_state = passed_string
+
+/obj/item/organ/external/genital/testicles/get_description_string(datum/sprite_accessory/genital/gas)
+ if(genital_name == "Internal") //Checks if Testicles are of Internal Variety
+ visibility_preference = GENITAL_SKIP_VISIBILITY //Removes visibility if yes.
+ else
+ return "You see a pair of testicles, they look [lowertext(balls_size_to_description(genital_size))]."
+
+/obj/item/organ/external/genital/testicles/build_from_dna(datum/dna/DNA, associated_key)
+ ..()
+ uses_skin_color = owner.testicles_uses_skincolor
+ set_size(owner.balls_size)
+
+/obj/item/organ/external/genital/testicles/build_from_accessory(datum/sprite_accessory/genital/accessory, datum/dna/DNA)
+ if(owner.testicles_uses_skintones)
+ uses_skintones = accessory.has_skintone_shading
+
+/obj/item/organ/external/genital/testicles/get_sprite_size_string()
+ var/measured_size = FLOOR(genital_size,1)
+ measured_size = clamp(measured_size, 0, 3)
+ var/passed_string = "[genital_type]_[measured_size]"
+ if(uses_skintones)
+ passed_string += "_s"
+ return passed_string
+
+/obj/item/organ/external/genital/vagina
+ name = "vagina"
+ icon = 'modular_skyrat/master_files/icons/obj/genitals/vagina.dmi'
+ icon_state = "vagina"
+
+ parent_organ = BP_GROIN
+ genital_location = LOWER_TORSO
+
+ organ_tag = O_VAGINA
+ body_part = LOWER_TORSO
+
+ cannot_break = 1
+
+/obj/item/organ/external/genital/vagina/get_description_string(datum/sprite_accessory/genital/gas)
+ var/returned_string = "You see a [lowertext(genital_name)] vagina."
+ if(lowertext(genital_name) == "cloaca")
+ returned_string = "You see a cloaca." //i deserve a pipebomb for this
+ switch(aroused)
+ if(AROUSAL_NONE)
+ returned_string += " It seems dry."
+ if(AROUSAL_PARTIAL)
+ returned_string += " It's glistening with arousal."
+ if(AROUSAL_FULL)
+ returned_string += " It's bright and dripping with arousal."
+ return returned_string
+
+/obj/item/organ/external/genital/vagina/get_sprite_size_string()
+ var/is_dripping = 0
+ if(aroused == AROUSAL_FULL)
+ is_dripping = 1
+ return "[genital_type]_[is_dripping]"
+
+/obj/item/organ/external/genital/vagina/build_from_dna(datum/dna/DNA, associated_key)
+ uses_skin_color = owner.vagina_uses_skincolor
+ return ..() // will update the sprite suffix
+
+/obj/item/organ/external/genital/vagina/build_from_accessory(datum/sprite_accessory/genital/accessory, datum/dna/DNA)
+ if(owner.vagina_uses_skintones)
+ uses_skintones = accessory.has_skintone_shading
+
+/obj/item/organ/external/genital/womb
+ name = "womb"
+ desc = "A female reproductive organ."
+ icon = 'modular_skyrat/master_files/icons/obj/genitals/vagina.dmi'
+ icon_state = "womb"
+
+ parent_organ = BP_GROIN
+ genital_location = LOWER_TORSO
+
+ organ_tag = O_WOMB
+ body_part = LOWER_TORSO
+
+ cannot_break = 1
+
+ aroused = AROUSAL_CANT
+
+ visibility_preference = GENITAL_SKIP_VISIBILITY
+
+/obj/item/organ/external/genital/anus
+ name = "anus"
+ desc = "What do you want me to tell you?"
+ icon = 'modular_skyrat/master_files/icons/obj/genitals/anus.dmi'
+ icon_state = "anus"
+ mutantpart_key = "anus"
+
+ genital_location = LOWER_TORSO
+ parent_organ = BP_GROIN
+
+ organ_tag = O_ANUS
+ body_part = LOWER_TORSO
+
+ cannot_break = 1
+ mutantpart_info = list(MUTANT_INDEX_NAME = "Normal", MUTANT_INDEX_COLOR_LIST = list("FEB"))
+ zone = BODY_ZONE_PRECISE_GROIN
+ slot = ORGAN_SLOT_ANUS
+ genital_location = GROIN
+ drop_when_organ_spilling = FALSE
+
+/obj/item/organ/external/genital/anus/get_description_string(datum/sprite_accessory/genital/gas)
+ var/returned_string = "You see an [lowertext(genital_name)]."
+ if(aroused == AROUSAL_PARTIAL)
+ returned_string += " It looks tight."
+ if(aroused == AROUSAL_FULL)
+ returned_string += " It looks very tight."
+ return returned_string
+
+/obj/item/organ/external/genital/breasts
+ name = "breasts"
+ desc = "Female milk producing organs."
+ icon_state = "breasts"
+ icon = 'modular_skyrat/master_files/icons/obj/genitals/breasts.dmi'
+
+ genital_location = LOWER_TORSO
+ parent_organ = BP_GROIN
+
+ organ_tag = O_PENIS
+ body_part = LOWER_TORSO
+
+ cannot_break = 1
+ genital_type = "pair"
+
+ mutantpart_key = "breasts"
+ mutantpart_info = list(MUTANT_INDEX_NAME = "Pair", MUTANT_INDEX_COLOR_LIST = list("#FFEEBB"))
+ zone = BODY_ZONE_CHEST
+ slot = ORGAN_SLOT_BREASTS
+ genital_location = CHEST
+ drop_when_organ_spilling = FALSE
+ var/lactates = FALSE
+
+/obj/item/organ/external/genital/breasts/get_description_string(datum/sprite_accessory/genital/gas)
+ var/returned_string = "You see a [lowertext(genital_name)] of breasts."
+ var/size_description
+ var/translation = breasts_size_to_cup(genital_size)
+ switch(translation)
+ if("Flatchested")
+ size_description = " They are small and flat, however."
+ if("beyond measurement")
+ size_description = " Their size is enormous, you estimate they're around [genital_size] inches in diameter."
+ else
+ size_description = " You estimate they are [translation]-cups."
+ returned_string += size_description
+ if(aroused == AROUSAL_FULL)
+ if(lactates)
+ returned_string += " The nipples seem hard, perky and are leaking milk."
+ else
+ returned_string += " Their nipples look hard and perky."
+ return returned_string
+
+/obj/item/organ/external/genital/breasts/update_genital_icon_state()
+ var/max_size = 5
+ var/current_size = FLOOR(genital_size, 1)
+ if(current_size < 0)
+ current_size = 0
+ else if (current_size > max_size)
+ current_size = max_size
+ var/passed_string = "breasts_pair_[current_size]"
+ if(uses_skintones)
+ passed_string += "_s"
+ icon_state = passed_string
+
+/obj/item/organ/external/genital/breasts/get_sprite_size_string()
+ var/max_size = 5
+ if(genital_type == "pair")
+ max_size = 16
+ var/current_size = FLOOR(genital_size, 1)
+ if(current_size < 0)
+ current_size = 0
+ else if (current_size > max_size)
+ current_size = max_size
+ var/passed_string = "[genital_type]_[current_size]"
+ if(uses_skintones)
+ passed_string += "_s"
+ return passed_string
+
+/obj/item/organ/external/genital/breasts/build_from_dna(datum/dna/DNA, associated_key)
+ ..()
+ lactates = DNA.features["breasts_lactation"]
+ uses_skin_color = DNA.features["breasts_uses_skincolor"]
+ set_size(DNA.features["breasts_size"])
+
+/obj/item/organ/external/genital/breasts/build_from_accessory(datum/sprite_accessory/genital/accessory, datum/dna/DNA)
+ if(DNA.features["breasts_uses_skintones"])
+ uses_skintones = accessory.has_skintone_shading
+
+/proc/breasts_size_to_cup(number)
+ if(number < 0)
+ number = 0
+ var/returned = GLOB.breasts_size_translation["[number]"]
+ if(!returned)
+ returned = "beyond measurement"
+ return returned
+
+/proc/breasts_cup_to_size(cup)
+ for(var/key in GLOB.breasts_size_translation)
+ if(GLOB.breasts_size_translation[key] == cup)
+ return text2num(key)
+ return 0
+
+/proc/balls_size_to_description(number)
+ if(number < 0)
+ number = 0
+ var/returned = GLOB.balls_size_translation["[number]"]
+ if(!returned)
+ returned = "beyond measurement"
+ return returned
+
+/proc/balls_description_to_size(cup)
+ for(var/key in GLOB.balls_size_translation)
+ if(GLOB.balls_size_translation[key] == cup)
+ return text2num(key)
+ return 0
+
+/mob/living/carbon/human/verb/toggle_genitals()
+ set category = "IC"
+ set name = "Expose/Hide genitals"
+ set desc = "Allows you to toggle which genitals should show through clothes or not."
+
+ if(stat != CONSCIOUS)
+ to_chat(usr, span_warning("You can't toggle genitals visibility right now..."))
+ return
+
+ var/list/genital_list = list()
+ for(var/obj/item/organ/external/genital/G in internal_organs)
+ if(!G.visibility_preference == GENITAL_SKIP_VISIBILITY)
+ genital_list += G
+ if(!genital_list.len) //There is nothing to expose
+ return
+ //Full list of exposable genitals created
+ var/obj/item/organ/external/genital/picked_organ
+ picked_organ = input(src, "Choose which genitalia to expose/hide", "Expose/Hide genitals") as null|anything in genital_list
+ if(picked_organ && (picked_organ in internal_organs))
+ var/list/gen_vis_trans = list("Never show" = GENITAL_NEVER_SHOW,
+ "Hidden by clothes" = GENITAL_HIDDEN_BY_CLOTHES,
+ "Always show" = GENITAL_ALWAYS_SHOW
+ )
+ var/picked_visibility = input(src, "Choose visibility setting", "Expose/Hide genitals") as null|anything in gen_vis_trans
+ if(picked_visibility && picked_organ && (picked_organ in internal_organs))
+ picked_organ.visibility_preference = gen_vis_trans[picked_visibility]
+ update_body()
+ return
+
+//Removing ERP IC verb depending on config
+/mob/living/carbon/human/Initialize()
+ . = ..()
+ if(CONFIG_GET(flag/disable_erp_preferences))
+ verbs -= /mob/living/carbon/human/verb/toggle_genitals
+
+/mob/living/carbon/human/verb/toggle_arousal()
+ set category = "IC"
+ set name = "Toggle Arousal"
+ set desc = "Allows you to toggle how aroused your private parts are."
+
+ if(stat != CONSCIOUS)
+ to_chat(usr, span_warning("You can't toggle arousal right now..."))
+ return
+
+ var/list/genital_list = list()
+ for(var/obj/item/organ/external/genital/G in internal_organs)
+ if(!G.aroused == AROUSAL_CANT)
+ genital_list += G
+ if(!genital_list.len) //There is nothing to expose
+ return
+ //Full list of exposable genitals created
+ var/obj/item/organ/external/genital/picked_organ
+ picked_organ = input(src, "Choose which genitalia to change arousal", "Expose/Hide genitals") as null|anything in genital_list
+ if(picked_organ && (picked_organ in internal_organs))
+ var/list/gen_arous_trans = list("Not aroused" = AROUSAL_NONE,
+ "Partly aroused" = AROUSAL_PARTIAL,
+ "Very aroused" = AROUSAL_FULL
+ )
+ var/picked_arousal = input(src, "Choose arousal", "Toggle Arousal") as null|anything in gen_arous_trans
+ if(picked_arousal && picked_organ && (picked_organ in internal_organs))
+ picked_organ.aroused = gen_arous_trans[picked_arousal]
+ picked_organ.update_sprite_suffix()
+ update_body()
+ return
+
+//Removing ERP IC verb depending on config
+/mob/living/carbon/human/Initialize()
+ . = ..()
+ if(CONFIG_GET(flag/disable_erp_preferences))
+ verbs -= /mob/living/carbon/human/verb/toggle_arousal
+
+
+
diff --git a/content_arfs/code/lewd/preference/preferences.dm b/content_arfs/code/lewd/preference/preferences.dm
index 35d6736ba2d..dbf9c381b13 100644
--- a/content_arfs/code/lewd/preference/preferences.dm
+++ b/content_arfs/code/lewd/preference/preferences.dm
@@ -1,4 +1,6 @@
/datum/preferences
+ var/disable_erp_preferences = 0 // the almighty toggle.
+
// The weiner part.
var/penis // penis ref // var/datum/sprite_accessory/genital/penis/none/default = /datum/sprite_accessory/genital/penis/none
var/r_penis = 179 // Genital color
@@ -11,9 +13,10 @@
var/g_penis_emissive = 0 // int 0 - 255
var/b_penis_emissive = 0 // int 0 - 255
+ var/penis_uses_skintones = 0 // bool
var/penis_uses_skincolor = 0 // bool
- var/penis_size = round((PENIS_MIN_LENGTH + PENIS_MAX_LENGTH) / 2)
- var/penis_girth = round((PENIS_MIN_LENGTH + PENIS_MAX_GIRTH) / 2)
+ var/penis_size = 11
+ var/penis_girth = 6
var/penis_taur = 0 // bool
@@ -29,6 +32,7 @@
var/g_testicles = 148 // int 0 - 255
var/b_testicles = 116 // int 0 - 255
+ var/testicles_uses_skintones = 0 // bool
var/testicles_uses_skincolor = 0 // bool
var/emissive_testicles = 0 // bool
@@ -45,6 +49,7 @@
var/g_vagina = 148 // int 0 - 255
var/b_vagina = 116 // int 0 - 255
+ var/vagina_uses_skintones = 0 // bool
var/vagina_uses_skincolor = 0 // bool
var/emissive_vagina = 0 // bool
@@ -61,6 +66,7 @@
var/g_breasts = 148 // int 0 - 255
var/b_breasts = 116 // int 0 - 255
+ var/breasts_uses_skintones = 0 // bool
var/breasts_uses_skincolor = 0 // bool
var/emissive_breasts = 0 // bool
diff --git a/content_arfs/code/lewd/readme.md b/content_arfs/code/lewd/readme.md
index c5548e2fe4e..fc5054f9738 100644
--- a/content_arfs/code/lewd/readme.md
+++ b/content_arfs/code/lewd/readme.md
@@ -1,3 +1,4 @@
Most of the skyrat sex mechanics port is here. Other locations include:
-dna_arfs.dm located in __defines.
+dna_arfs.dm located in __defines.
+items_clothing.dm located in __defines.
\ No newline at end of file
diff --git a/content_arfs/code/lewd/sprite_accessories.dm b/content_arfs/code/lewd/sprite_accessories.dm
new file mode 100644
index 00000000000..a456c457b2e
--- /dev/null
+++ b/content_arfs/code/lewd/sprite_accessories.dm
@@ -0,0 +1,294 @@
+/datum/sprite_accessory/genital
+ var/associated_organ_slot
+ /// If true, then there should be a variant in the icon file that's slightly pinkier to match human base colors.
+ var/has_skintone_shading = FALSE
+ ///Where the genital is on the body. If clothing doesn't cover it, it shows up!
+ var/genital_location = LOWER_TORSO
+
+/datum/sprite_accessory/genital/is_hidden(mob/living/carbon/human/H, obj/item/bodypart/HD)
+ var/obj/item/organ/external/genital/badonkers = H.getorganslot(associated_organ_slot)
+ if(!badonkers)
+ return TRUE
+ switch(badonkers.visibility_preference)
+ if(GENITAL_ALWAYS_SHOW)
+ return FALSE
+ if(GENITAL_HIDDEN_BY_CLOTHES)
+ if((H.w_uniform && H.w_uniform.body_parts_covered & genital_location) || (H.wear_suit && H.wear_suit.body_parts_covered & genital_location))
+ return TRUE
+ else
+ return FALSE
+ else
+ return TRUE
+
+/datum/sprite_accessory/genital/get_special_render_state(mob/living/carbon/human/human)
+ var/obj/item/organ/external/genital/genital = human.getorganslot(associated_organ_slot)
+ return "[genital?.sprite_suffix]"
+
+/datum/sprite_accessory/genital/get_special_render_colour(mob/living/carbon/human/human, render_state)
+ var/obj/item/organ/external/genital/genital = human.getorganslot(associated_organ_slot)
+ if(genital?.uses_skin_color && (species.appearance_flags & HAS_SKIN_TONE))
+ return human.s_tone
+
+/datum/sprite_accessory/genital/penis
+ icon = 'modular_skyrat/master_files/icons/mob/sprite_accessory/genitals/penis_onmob.dmi'
+ organ_type = /obj/item/organ/external/genital/penis
+ associated_organ_slot = O_PENIS
+ key = "penis"
+ color_src = USE_MATRIXED_COLORS
+ always_color_customizable = TRUE
+ center = TRUE
+ special_icon_case = TRUE
+ special_x_dimension = TRUE
+ //default_color = DEFAULT_SKIN_OR_PRIMARY //This is the price we're paying for sheaths
+ relevent_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER)
+ genetic = TRUE
+ var/can_have_sheath = TRUE
+
+/datum/sprite_accessory/genital/penis/is_hidden(mob/living/carbon/human/H, obj/item/bodypart/HD)
+ if(H.underwear != "Nude" && !(H.underwear_visibility & UNDERWEAR_HIDE_UNDIES))
+ return TRUE
+ . = ..()
+
+/datum/sprite_accessory/genital/penis/get_special_icon(mob/living/carbon/human/H)
+ var/returned = icon
+ if(H.dna.species.mutant_bodyparts["taur"] && H.dna.features["penis_taur_mode"])
+ var/datum/sprite_accessory/taur/SP = GLOB.sprite_accessories["taur"][H.dna.mutant_bodyparts["taur"][MUTANT_INDEX_NAME]]
+ if(!(SP.taur_mode & STYLE_TAUR_SNAKE))
+ returned = 'modular_skyrat/master_files/icons/mob/sprite_accessory/genitals/taur_penis_onmob.dmi'
+ return returned
+
+/datum/sprite_accessory/genital/penis/get_special_x_dimension(mob/living/carbon/human/H)
+ var/returned = dimension_x
+ if(H.dna.species.mutant_bodyparts["taur"] && H.dna.features["penis_taur_mode"])
+ var/datum/sprite_accessory/taur/SP = GLOB.sprite_accessories["taur"][H.dna.mutant_bodyparts["taur"][MUTANT_INDEX_NAME]]
+ if(!(SP.taur_mode & STYLE_TAUR_SNAKE))
+ returned = 64
+ return returned
+
+/datum/sprite_accessory/genital/penis/none
+ icon_state = "none"
+ name = "None"
+ factual = FALSE
+ color_src = null
+
+/datum/sprite_accessory/genital/penis/human
+ icon_state = "human"
+ name = "Human"
+ color_src = USE_ONE_COLOR
+ default_color = DEFAULT_SKIN_OR_PRIMARY
+ has_skintone_shading = TRUE
+ can_have_sheath = FALSE
+
+/datum/sprite_accessory/genital/penis/nondescript
+ icon_state = "nondescript"
+ name = "Nondescript"
+
+/datum/sprite_accessory/genital/penis/knotted
+ icon_state = "knotted"
+ name = "Knotted"
+
+/datum/sprite_accessory/genital/penis/flared
+ icon_state = "flared"
+ name = "Flared"
+
+/datum/sprite_accessory/genital/penis/barbknot
+ icon_state = "barbknot"
+ name = "Barbed, Knotted"
+
+/datum/sprite_accessory/genital/penis/tapered
+ icon_state = "tapered"
+ name = "Tapered"
+
+/datum/sprite_accessory/genital/penis/tentacle
+ icon_state = "tentacle"
+ name = "Tentacled"
+
+/datum/sprite_accessory/genital/penis/hemi
+ icon_state = "hemi"
+ name = "Hemi"
+
+/datum/sprite_accessory/genital/penis/hemiknot
+ icon_state = "hemiknot"
+ name = "Knotted Hemi"
+
+/datum/sprite_accessory/genital/testicles
+ icon = 'modular_skyrat/master_files/icons/mob/sprite_accessory/genitals/testicles_onmob.dmi'
+ organ_type = /obj/item/organ/external/genital/testicles
+ associated_organ_slot = O_TESTICLES
+ key = "testicles"
+ always_color_customizable = TRUE
+ special_icon_case = TRUE
+ special_x_dimension = TRUE
+ default_color = DEFAULT_SKIN_OR_PRIMARY
+ relevent_layers = list(BODY_ADJ_LAYER, BODY_BEHIND_LAYER)
+ genetic = TRUE
+ var/has_size = TRUE
+
+/datum/sprite_accessory/genital/testicles/is_hidden(mob/living/carbon/human/H, obj/item/bodypart/HD)
+ if(H.underwear != "Nude" && !(H.underwear_visibility & UNDERWEAR_HIDE_UNDIES))
+ return TRUE
+ . = ..()
+
+/datum/sprite_accessory/genital/testicles/get_special_icon(mob/living/carbon/human/H)
+ var/returned = icon
+ if(H.dna.species.mutant_bodyparts["taur"] && H.dna.features["penis_taur_mode"])
+ var/datum/sprite_accessory/taur/SP = GLOB.sprite_accessories["taur"][H.dna.mutant_bodyparts["taur"][MUTANT_INDEX_NAME]]
+ if(!(SP.taur_mode & STYLE_TAUR_SNAKE))
+ returned = 'modular_skyrat/master_files/icons/mob/sprite_accessory/genitals/taur_testicles_onmob.dmi'
+ return returned
+
+/datum/sprite_accessory/genital/testicles/get_special_x_dimension(mob/living/carbon/human/H)
+ var/returned = dimension_x
+ if(H.dna.species.mutant_bodyparts["taur"] && H.dna.features["penis_taur_mode"])
+ var/datum/sprite_accessory/taur/SP = GLOB.sprite_accessories["taur"][H.dna.mutant_bodyparts["taur"][MUTANT_INDEX_NAME]]
+ if(!(SP.taur_mode & STYLE_TAUR_SNAKE))
+ returned = 64
+ return returned
+
+/datum/sprite_accessory/genital/testicles/none
+ icon_state = "none"
+ name = "None"
+ factual = FALSE
+ color_src = null
+
+/datum/sprite_accessory/genital/testicles/pair
+ name = "Pair"
+ icon_state = "pair"
+ has_skintone_shading = TRUE
+
+/datum/sprite_accessory/genital/testicles/internal
+ name = "Internal"
+ icon_state = "none"
+ color_src = null
+ has_size = FALSE
+
+/datum/sprite_accessory/genital/vagina
+ icon = 'content_arfs/icons/mob/sprite_accessory/genitals/vagina_onmob.dmi'
+ organ_type = /obj/item/organ/external/genital/vagina
+ associated_organ_slot = O_VAGINA
+ key = "vagina"
+ always_color_customizable = TRUE
+ default_color = "#FFCCCC"
+ relevent_layers = list(BODY_FRONT_LAYER)
+ genetic = TRUE
+ var/alt_aroused = TRUE
+
+/datum/sprite_accessory/genital/vagina/is_hidden(mob/living/carbon/human/H, obj/item/bodypart/HD)
+ if(H.underwear != "Nude" && !(H.underwear_visibility & UNDERWEAR_HIDE_UNDIES))
+ return TRUE
+ . = ..()
+
+/datum/sprite_accessory/genital/vagina/none
+ icon_state = "none"
+ name = "None"
+ factual = FALSE
+ color_src = null
+
+/datum/sprite_accessory/genital/vagina/human
+ icon_state = "human"
+ name = "Human"
+
+/datum/sprite_accessory/genital/vagina/tentacles
+ icon_state = "tentacle"
+ name = "Tentacle"
+
+/datum/sprite_accessory/genital/vagina/dentata
+ icon_state = "dentata"
+ name = "Dentata"
+
+/datum/sprite_accessory/genital/vagina/hairy
+ icon_state = "hairy"
+ name = "Hairy"
+ alt_aroused = FALSE
+
+/datum/sprite_accessory/genital/vagina/spade
+ icon_state = "spade"
+ name = "Spade"
+ alt_aroused = FALSE
+
+/datum/sprite_accessory/genital/vagina/furred
+ icon_state = "furred"
+ name = "Furred"
+ alt_aroused = FALSE
+
+/datum/sprite_accessory/genital/vagina/gaping
+ icon_state = "gaping"
+ name = "Gaping"
+
+/datum/sprite_accessory/genital/vagina/cloaca
+ icon_state = "cloaca"
+ name = "Cloaca"
+
+/datum/sprite_accessory/genital/womb
+ organ_type = /obj/item/organ/external/genital/womb
+ associated_organ_slot = O_WOMB
+ key = "womb"
+ genetic = TRUE
+
+/datum/sprite_accessory/genital/womb/none
+ icon_state = "none"
+ name = "None"
+ factual = FALSE
+ color_src = null
+
+/datum/sprite_accessory/genital/womb/normal
+ icon_state = "none"
+ name = "Normal"
+ color_src = null
+
+/datum/sprite_accessory/genital/anus
+ organ_type = /obj/item/organ/external/genital/anus
+ associated_organ_slot = O_ANUS
+ key = "anus"
+ genetic = TRUE
+
+/datum/sprite_accessory/genital/anus/is_hidden(mob/living/carbon/human/owner, obj/item/bodypart/bodypart)
+ if(owner.underwear != "Nude" && !(owner.underwear_visibility & UNDERWEAR_HIDE_UNDIES))
+ return TRUE
+ . = ..()
+
+/datum/sprite_accessory/genital/anus/none
+ icon_state = "none"
+ name = "None"
+ factual = FALSE
+ color_src = null
+
+/datum/sprite_accessory/genital/anus/normal
+ icon_state = "anus"
+ name = "Anus"
+ color_src = null
+
+/datum/sprite_accessory/genital/breasts
+ icon = 'content_arfs/icons/mob/sprite_accessory/genitals/breasts_onmob.dmi'
+ organ_type = /obj/item/organ/external/genital/breasts
+ associated_organ_slot = O_BREASTS
+ key = "breasts"
+ always_color_customizable = TRUE
+ default_color = DEFAULT_SKIN_OR_PRIMARY
+ relevent_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER)
+ has_skintone_shading = TRUE
+ genital_location = CHEST
+ genetic = TRUE
+
+/datum/sprite_accessory/genital/breasts/is_hidden(mob/living/carbon/human/H, obj/item/bodypart/HD)
+ if(H.undershirt != "Nude" && !(H.underwear_visibility & UNDERWEAR_HIDE_SHIRT))
+ return TRUE
+ . = ..()
+
+/datum/sprite_accessory/genital/breasts/none
+ icon_state = "none"
+ name = "None"
+ factual = FALSE
+ color_src = null
+
+/datum/sprite_accessory/genital/breasts/pair
+ icon_state = "pair"
+ name = "Pair"
+
+/datum/sprite_accessory/genital/breasts/quad
+ icon_state = "quad"
+ name = "Quad"
+
+/datum/sprite_accessory/genital/breasts/sextuple
+ icon_state = "sextuple"
+ name = "Sextuple"
diff --git a/vorestation.dme b/vorestation.dme
index 9b00ddba26c..777694a27bd 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -4143,6 +4143,11 @@
#include "content_arfs\code\donater\suits.dm"
#include "content_arfs\code\donater\ties.dm"
#include "content_arfs\code\donater\under.dm"
+#include "content_arfs\code\lewd\examine.dm"
+#include "content_arfs\code\lewd\human.dm"
+#include "content_arfs\code\lewd\obj_flags.dm"
+#include "content_arfs\code\lewd\organs.dm"
+#include "content_arfs\code\lewd\sprite_accessories.dm"
#include "content_arfs\code\lewd\preference\09_lewd.dm"
#include "content_arfs\code\lewd\preference\preferences.dm"
#include "content_arfs\code\loadout\cagse.dm"
From 11923f6617c9ff6f8445be0779332fac66bfdd26 Mon Sep 17 00:00:00 2001
From: GremlingSS <68038883+GremlingSS@users.noreply.github.com>
Date: Sat, 7 May 2022 00:33:12 +0100
Subject: [PATCH 4/5] fixed all the f u n errors in orgams.dm
---
content_arfs/code/lewd/lists.dm | 32 ++++++++++++++++++++
content_arfs/code/lewd/organs.dm | 52 +++++++++++---------------------
vorestation.dme | 1 +
3 files changed, 50 insertions(+), 35 deletions(-)
create mode 100644 content_arfs/code/lewd/lists.dm
diff --git a/content_arfs/code/lewd/lists.dm b/content_arfs/code/lewd/lists.dm
new file mode 100644
index 00000000000..8a91a3a0f22
--- /dev/null
+++ b/content_arfs/code/lewd/lists.dm
@@ -0,0 +1,32 @@
+//DO NOT CHANGE THOSE LISTS UNLESS YOU KNOW WHAT YOURE DOING (will mess savefiles)
+
+
+GLOBAL_LIST_INIT(breasts_size_translation, list("0" = "Flatchested",
+ "1" = "A",
+ "2" = "B",
+ "3" = "C",
+ "4" = "D",
+ "5" = "E",
+ "6" = "F",
+ "7" = "G",
+ "8" = "H",
+ "9" = "I",
+ "10" = "J",
+ "11" = "K",
+ "12" = "L",
+ "13" = "M",
+ "14" = "N",
+ "15" = "O",
+ "16" = "P",
+ ))
+
+GLOBAL_LIST_INIT(balls_size_translation, list("0" = "Small",
+ "1" = "Average",
+ "2" = "Big",
+ "3" = "Enormous"
+ ))
+
+///Those are the values available from prefs
+GLOBAL_LIST_INIT(preference_breast_sizes, list("Flatchested","A","B","C","D","E","F","G","H","I","J"))
+
+GLOBAL_LIST_INIT(preference_balls_sizes, list("Small","Average","Big","Enormous"))
diff --git a/content_arfs/code/lewd/organs.dm b/content_arfs/code/lewd/organs.dm
index 4c32c041d0e..6fc3c7ef1a1 100644
--- a/content_arfs/code/lewd/organs.dm
+++ b/content_arfs/code/lewd/organs.dm
@@ -91,7 +91,7 @@
parent_organ = BP_GROIN
organ_tag = O_PENIS
- body_part = LOWER_TORSO
+ body_part = PENIS
cannot_break = 1
@@ -190,7 +190,7 @@
genital_location = LOWER_TORSO
organ_tag = O_TESTICLES
- body_part = LOWER_TORSO
+ body_part = TESTICLES
cannot_break = 1
@@ -235,7 +235,7 @@
genital_location = LOWER_TORSO
organ_tag = O_VAGINA
- body_part = LOWER_TORSO
+ body_part = VAGINA
cannot_break = 1
@@ -276,7 +276,7 @@
genital_location = LOWER_TORSO
organ_tag = O_WOMB
- body_part = LOWER_TORSO
+ body_part = WOMB
cannot_break = 1
@@ -289,20 +289,14 @@
desc = "What do you want me to tell you?"
icon = 'modular_skyrat/master_files/icons/obj/genitals/anus.dmi'
icon_state = "anus"
- mutantpart_key = "anus"
genital_location = LOWER_TORSO
parent_organ = BP_GROIN
organ_tag = O_ANUS
- body_part = LOWER_TORSO
+ body_part = ANUS
cannot_break = 1
- mutantpart_info = list(MUTANT_INDEX_NAME = "Normal", MUTANT_INDEX_COLOR_LIST = list("FEB"))
- zone = BODY_ZONE_PRECISE_GROIN
- slot = ORGAN_SLOT_ANUS
- genital_location = GROIN
- drop_when_organ_spilling = FALSE
/obj/item/organ/external/genital/anus/get_description_string(datum/sprite_accessory/genital/gas)
var/returned_string = "You see an [lowertext(genital_name)]."
@@ -318,21 +312,15 @@
icon_state = "breasts"
icon = 'modular_skyrat/master_files/icons/obj/genitals/breasts.dmi'
- genital_location = LOWER_TORSO
- parent_organ = BP_GROIN
+ genital_location = UPPER_TORSO
+ parent_organ = BP_TORSO
- organ_tag = O_PENIS
- body_part = LOWER_TORSO
+ organ_tag = O_BREASTS
+ body_part = BREASTS
cannot_break = 1
genital_type = "pair"
- mutantpart_key = "breasts"
- mutantpart_info = list(MUTANT_INDEX_NAME = "Pair", MUTANT_INDEX_COLOR_LIST = list("#FFEEBB"))
- zone = BODY_ZONE_CHEST
- slot = ORGAN_SLOT_BREASTS
- genital_location = CHEST
- drop_when_organ_spilling = FALSE
var/lactates = FALSE
/obj/item/organ/external/genital/breasts/get_description_string(datum/sprite_accessory/genital/gas)
@@ -382,12 +370,12 @@
/obj/item/organ/external/genital/breasts/build_from_dna(datum/dna/DNA, associated_key)
..()
- lactates = DNA.features["breasts_lactation"]
- uses_skin_color = DNA.features["breasts_uses_skincolor"]
- set_size(DNA.features["breasts_size"])
+ lactates = owner.breasts_lactation
+ uses_skin_color = owner.breasts_uses_skincolor
+ set_size(owner.breasts_size)
/obj/item/organ/external/genital/breasts/build_from_accessory(datum/sprite_accessory/genital/accessory, datum/dna/DNA)
- if(DNA.features["breasts_uses_skintones"])
+ if(owner.breasts_uses_skintones)
uses_skintones = accessory.has_skintone_shading
/proc/breasts_size_to_cup(number)
@@ -444,14 +432,15 @@
var/picked_visibility = input(src, "Choose visibility setting", "Expose/Hide genitals") as null|anything in gen_vis_trans
if(picked_visibility && picked_organ && (picked_organ in internal_organs))
picked_organ.visibility_preference = gen_vis_trans[picked_visibility]
- update_body()
+ update_icons_body()
return
//Removing ERP IC verb depending on config
/mob/living/carbon/human/Initialize()
. = ..()
- if(CONFIG_GET(flag/disable_erp_preferences))
+ if(client?.prefs.disable_erp_preferences)
verbs -= /mob/living/carbon/human/verb/toggle_genitals
+ verbs -= /mob/living/carbon/human/verb/toggle_arousal
/mob/living/carbon/human/verb/toggle_arousal()
set category = "IC"
@@ -480,14 +469,7 @@
if(picked_arousal && picked_organ && (picked_organ in internal_organs))
picked_organ.aroused = gen_arous_trans[picked_arousal]
picked_organ.update_sprite_suffix()
- update_body()
+ update_icons_body()
return
-//Removing ERP IC verb depending on config
-/mob/living/carbon/human/Initialize()
- . = ..()
- if(CONFIG_GET(flag/disable_erp_preferences))
- verbs -= /mob/living/carbon/human/verb/toggle_arousal
-
-
diff --git a/vorestation.dme b/vorestation.dme
index 777694a27bd..303bc5e9d9f 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -4145,6 +4145,7 @@
#include "content_arfs\code\donater\under.dm"
#include "content_arfs\code\lewd\examine.dm"
#include "content_arfs\code\lewd\human.dm"
+#include "content_arfs\code\lewd\lists.dm"
#include "content_arfs\code\lewd\obj_flags.dm"
#include "content_arfs\code\lewd\organs.dm"
#include "content_arfs\code\lewd\sprite_accessories.dm"
From 9782a17c4dac3d861d1571678f53d95a9b0b69bc Mon Sep 17 00:00:00 2001
From: GremlingSS <68038883+GremlingSS@users.noreply.github.com>
Date: Mon, 9 May 2022 15:24:43 +0100
Subject: [PATCH 5/5] changes idk
---
content_arfs/code/lewd/examine.dm | 14 +++++++-------
content_arfs/code/lewd/human.dm | 4 ++--
2 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/content_arfs/code/lewd/examine.dm b/content_arfs/code/lewd/examine.dm
index b695689005b..5b429bc4e81 100644
--- a/content_arfs/code/lewd/examine.dm
+++ b/content_arfs/code/lewd/examine.dm
@@ -1,11 +1,11 @@
+var/global/list/genitals_styles_list = list() // Stores /datum/sprite_accessory/genitals indexed by type
+
/mob/living/carbon/human/proc/GetGenitalExamine(var/datum/gender/T)
var/list/msg
- for(var/genital in list("penis", "testicles", "vagina", "breasts", "anus"))
- if(dna.species.mutant_bodyparts[genital])
- var/datum/sprite_accessory/genital/G = GLOB.sprite_accessories[genital][dna.species.mutant_bodyparts[genital][MUTANT_INDEX_NAME]]
- if(G)
- if(!(G.is_hidden(src)))
- msg += "[T.he] has exposed genitals... Look closer..."
- break
+ for(var/genital in list(penis, testicles, vagina, breasts, anus))
+ if(genital)
+ if(!(genital.is_hidden(src)))
+ msg += "[T.he] has exposed genitals... Look closer..."
+ break
return msg
\ No newline at end of file
diff --git a/content_arfs/code/lewd/human.dm b/content_arfs/code/lewd/human.dm
index 13c1d38d36a..6a27aab761b 100644
--- a/content_arfs/code/lewd/human.dm
+++ b/content_arfs/code/lewd/human.dm
@@ -58,10 +58,10 @@
var/g_vagina_emissive = 0 // int 0 - 255
var/b_vagina_emissive = 0 // int 0 - 255
- var/sprite_accessory/genital/womb/womb // ..if you thought vagina was enough, wait till you see there's a womb included too!
+ var/datum/sprite_accessory/genital/womb/womb // ..if you thought vagina was enough, wait till you see there's a womb included too!
// succulent, moist, wait- moist? wtf? no???
- var/sprite_accessory/genital/breasts/breasts
+ var/datum/sprite_accessory/genital/breasts/breasts
var/r_breasts = 179 // int 0 - 255
var/g_breasts = 148 // int 0 - 255
var/b_breasts = 116 // int 0 - 255