Privates Visibility Preferences. Also Undergarments having a purpose.

This commit is contained in:
Ghommie
2020-03-25 02:47:16 +01:00
parent 613c66d88e
commit c9f02d97a1
27 changed files with 148 additions and 113 deletions

View File

@@ -35,6 +35,8 @@
#define MASTURBATE_LINKED_ORGAN (1<<6) //used to pass our mission to the linked organ #define MASTURBATE_LINKED_ORGAN (1<<6) //used to pass our mission to the linked organ
#define CAN_CLIMAX_WITH (1<<7) #define CAN_CLIMAX_WITH (1<<7)
#define GENITAL_CAN_AROUSE (1<<8) #define GENITAL_CAN_AROUSE (1<<8)
#define GENITAL_UNDIES_HIDDEN (1<<9)
#define UPDATE_OWNER_APPEARANCE (1<<10)
#define DEF_VAGINA_SHAPE "Human" #define DEF_VAGINA_SHAPE "Human"
@@ -71,6 +73,12 @@
#define MILK_RATE_MULT 1 #define MILK_RATE_MULT 1
#define MILK_EFFICIENCY 1 #define MILK_EFFICIENCY 1
//visibility toggles defines to avoid errors typos code errors.
#define GEN_VISIBLE_ALWAYS "Always visible"
#define GEN_VISIBLE_NO_CLOTHES "Hidden by clothes"
#define GEN_VISIBLE_NO_UNDIES "Hidden by underwear"
#define GEN_VISIBLE_NEVER "Always hidden"
//Individual logging define //Individual logging define
#define INDIVIDUAL_LOOC_LOG "LOOC log" #define INDIVIDUAL_LOOC_LOG "LOOC log"

View File

@@ -27,14 +27,15 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s
//Human Overlays Indexes///////// //Human Overlays Indexes/////////
//LOTS OF CIT CHANGES HERE. BE CAREFUL WHEN UPSTREAM ADDS MORE LAYERS //LOTS OF CIT CHANGES HERE. BE CAREFUL WHEN UPSTREAM ADDS MORE LAYERS
#define MUTATIONS_LAYER 32 //mutations. Tk headglows, cold resistance glow, etc #define MUTATIONS_LAYER 33 //mutations. Tk headglows, cold resistance glow, etc
#define GENITALS_BEHIND_LAYER 31 //Some genitalia needs to be behind everything, such as with taurs (Taurs use body_behind_layer #define GENITALS_BEHIND_LAYER 32 //Some genitalia needs to be behind everything, such as with taurs (Taurs use body_behind_layer
#define BODY_BEHIND_LAYER 30 //certain mutantrace features (tail when looking south) that must appear behind the body parts #define BODY_BEHIND_LAYER 31 //certain mutantrace features (tail when looking south) that must appear behind the body parts
#define BODYPARTS_LAYER 29 //Initially "AUGMENTS", this was repurposed to be a catch-all bodyparts flag #define BODYPARTS_LAYER 30 //Initially "AUGMENTS", this was repurposed to be a catch-all bodyparts flag
#define MARKING_LAYER 28 //Matrixed body markings because clashing with snouts? #define MARKING_LAYER 29 //Matrixed body markings because clashing with snouts?
#define BODY_ADJ_LAYER 27 //certain mutantrace features (snout, body markings) that must appear above the body parts #define BODY_ADJ_LAYER 28 //certain mutantrace features (snout, body markings) that must appear above the body parts
#define GENITALS_FRONT_LAYER 26 //Draws some genitalia above clothes and the TAUR body if need be. #define GENITALS_FRONT_LAYER 27 //Draws some genitalia above clothes and the TAUR body if need be.
#define BODY_LAYER 25 //underwear, undershirts, socks, eyes, lips(makeup) #define BODY_LAYER 26 //underwear, undershirts, socks, eyes, lips(makeup)
#define GENITALS_NO_UNDIE_LAYER 25 //found above undergarments.
#define FRONT_MUTATIONS_LAYER 24 //mutations that should appear above body, body_adj and bodyparts layer (e.g. laser eyes) #define FRONT_MUTATIONS_LAYER 24 //mutations that should appear above body, body_adj and bodyparts layer (e.g. laser eyes)
#define DAMAGE_LAYER 23 //damage indicators (cuts and burns) #define DAMAGE_LAYER 23 //damage indicators (cuts and burns)
#define UNIFORM_LAYER 22 #define UNIFORM_LAYER 22
@@ -59,7 +60,7 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s
#define HANDS_LAYER 3 #define HANDS_LAYER 3
#define BODY_FRONT_LAYER 2 #define BODY_FRONT_LAYER 2
#define FIRE_LAYER 1 //If you're on fire #define FIRE_LAYER 1 //If you're on fire
#define TOTAL_LAYERS 32 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_; #define TOTAL_LAYERS 33 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_;
//Human Overlay Index Shortcuts for alternate_worn_layer, layers //Human Overlay Index Shortcuts for alternate_worn_layer, layers
//Because I *KNOW* somebody will think layer+1 means "above" //Because I *KNOW* somebody will think layer+1 means "above"

View File

@@ -58,14 +58,13 @@ GLOBAL_LIST_EMPTY(ipc_antennas_list)
//Genitals and Arousal Lists //Genitals and Arousal Lists
GLOBAL_LIST_EMPTY(genitals_list) GLOBAL_LIST_EMPTY(genitals_list)
GLOBAL_LIST_EMPTY(cock_shapes_list) GLOBAL_LIST_EMPTY(cock_shapes_list)
GLOBAL_LIST_EMPTY(gentlemans_organ_names)
GLOBAL_LIST_EMPTY(balls_shapes_list) GLOBAL_LIST_EMPTY(balls_shapes_list)
GLOBAL_LIST_EMPTY(breasts_shapes_list) GLOBAL_LIST_EMPTY(breasts_shapes_list)
GLOBAL_LIST_EMPTY(vagina_shapes_list) GLOBAL_LIST_EMPTY(vagina_shapes_list)
GLOBAL_LIST_INIT(cum_into_containers_list, list(/obj/item/reagent_containers/food/snacks/pie)) //Yer fuggin snowflake name list jfc //longcat memes.
GLOBAL_LIST_INIT(dick_nouns, list("dick","cock","member","shaft")) GLOBAL_LIST_INIT(dick_nouns, list("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "weenie", "tadger", "schlong", "thirsty ferret", "One eyed trouser trout", "Ding dong", "ankle spanker", "Pork sword", "engine cranker", "Harry hot dog", "Davy Crockett", "Kidney cracker", "Heat seeking moisture missile", "Giggle stick", "love whistle", "Tube steak", "Uncle Dick", "Purple helmet warrior"))
GLOBAL_LIST_INIT(cum_id_list,"semen")
GLOBAL_LIST_INIT(milk_id_list,"milk") GLOBAL_LIST_INIT(genitals_visibility_toggles, list(GEN_VISIBLE_ALWAYS, GEN_VISIBLE_NO_CLOTHES, GEN_VISIBLE_NO_UNDIES, GEN_VISIBLE_NEVER))
GLOBAL_LIST_INIT(dildo_shapes, list( GLOBAL_LIST_INIT(dildo_shapes, list(
"Human" = "human", "Human" = "human",

View File

@@ -54,11 +54,6 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/vagina, GLOB.vagina_shapes_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/vagina, GLOB.vagina_shapes_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/breasts, GLOB.breasts_shapes_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/breasts, GLOB.breasts_shapes_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/testicles, GLOB.balls_shapes_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/testicles, GLOB.balls_shapes_list)
GLOB.gentlemans_organ_names = list("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ",
"cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "weenie", "tadger", "schlong", "thirsty ferret",
"baloney pony", "schlanger", "Mutton dagger", "old blind bob","Hanging Johnny", "fishing rod", "Tally whacker", "polly rocket",
"One eyed trouser trout", "Ding dong", "ankle spanker", "Pork sword", "engine cranker", "Harry hot dog", "Davy Crockett",
"Kidney cracker", "Heat seeking moisture missile", "Giggle stick", "love whistle", "Tube steak", "Uncle Dick", "Purple helmet warrior")
for(var/gpath in subtypesof(/obj/item/organ/genital)) for(var/gpath in subtypesof(/obj/item/organ/genital))
var/obj/item/organ/genital/G = gpath var/obj/item/organ/genital/G = gpath

View File

@@ -185,7 +185,6 @@
"cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF,
"cock_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "cock_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
"has_balls" = FALSE, "has_balls" = FALSE,
"balls_internal" = FALSE,
"balls_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "balls_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
"balls_size" = BALLS_SIZE_DEF, "balls_size" = BALLS_SIZE_DEF,
"balls_shape" = DEF_BALLS_SHAPE, "balls_shape" = DEF_BALLS_SHAPE,
@@ -200,13 +199,11 @@
"has_vag" = FALSE, "has_vag" = FALSE,
"vag_shape" = pick(GLOB.vagina_shapes_list), "vag_shape" = pick(GLOB.vagina_shapes_list),
"vag_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "vag_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
"vag_clits" = 1,
"vag_clit_diam" = 0.25,
"vag_clit_len" = 0.25,
"has_womb" = FALSE, "has_womb" = FALSE,
"womb_cum_rate" = CUM_RATE, "balls_visibility" = GEN_VISIBLE_NO_UNDIES,
"womb_cum_mult" = CUM_RATE_MULT, "breasts_visibility"= GEN_VISIBLE_NO_UNDIES,
"womb_efficiency" = CUM_EFFICIENCY, "cock_visibility" = GEN_VISIBLE_NO_UNDIES,
"vag_visibility" = GEN_VISIBLE_NO_UNDIES,
"ipc_screen" = snowflake_ipc_antenna_list ? pick(snowflake_ipc_antenna_list) : "None", "ipc_screen" = snowflake_ipc_antenna_list ? pick(snowflake_ipc_antenna_list) : "None",
"ipc_antenna" = "None", "ipc_antenna" = "None",
"flavor_text" = "", "flavor_text" = "",

View File

@@ -436,3 +436,8 @@
/datum/config_entry/number/penis_max_inches_prefs /datum/config_entry/number/penis_max_inches_prefs
config_entry_value = 20 config_entry_value = 20
min_val = 0 min_val = 0
/datum/config_entry/keyed_list/safe_visibility_toggles
key_mode = KEY_MODE_TEXT
value_mode = VALUE_MODE_FLAG
config_entry_value = list(GEN_VISIBLE_NO_CLOTHES, GEN_VISIBLE_NO_UNDIES, GEN_VISIBLE_NEVER) //refer to cit_helpers for all toggles.

View File

@@ -88,13 +88,13 @@ GLOBAL_VAR(changeling_team_objective_type) //If this is not null, we hand our th
user.underwear = chosen_prof.underwear user.underwear = chosen_prof.underwear
user.undie_color = chosen_prof.undie_color user.undie_color = chosen_prof.undie_color
user.undershirt = chosen_prof.undershirt user.undershirt = chosen_prof.undershirt
user.shirt_color =chosen_prof.shirt_color user.shirt_color = chosen_prof.shirt_color
user.socks = chosen_prof.socks user.socks = chosen_prof.socks
user.socks_color =chosen_prof.socks_color user.socks_color =chosen_prof.socks_color
chosen_dna.transfer_identity(user, 1) chosen_dna.transfer_identity(user, 1)
user.updateappearance(mutcolor_update=1) user.updateappearance(mutcolor_update=1)
user.update_body() user.update_body(TRUE)
user.domutcheck() user.domutcheck()
//vars hackery. not pretty, but better than the alternative. //vars hackery. not pretty, but better than the alternative.

View File

@@ -73,7 +73,7 @@
H.socks_color = recolor_undergarment(H, "socks", H.socks_color) H.socks_color = recolor_undergarment(H, "socks", H.socks_color)
add_fingerprint(H) add_fingerprint(H)
H.update_body() H.update_body(TRUE)
/obj/structure/dresser/proc/recolor_undergarment(mob/living/carbon/human/H, garment_type = "underwear", default_color) /obj/structure/dresser/proc/recolor_undergarment(mob/living/carbon/human/H, garment_type = "underwear", default_color)
var/n_color = input(H, "Choose your [garment_type]'\s color.", "Character Preference", default_color) as color|null var/n_color = input(H, "Choose your [garment_type]'\s color.", "Character Preference", default_color) as color|null

View File

@@ -31,7 +31,7 @@
new_spawn.underwear = "Nude" //You're a plant, partner new_spawn.underwear = "Nude" //You're a plant, partner
new_spawn.undershirt = "Nude" //changing underwear/shirt/socks doesn't seem to function correctly right now because of some bug elsewhere? new_spawn.undershirt = "Nude" //changing underwear/shirt/socks doesn't seem to function correctly right now because of some bug elsewhere?
new_spawn.socks = "Nude" new_spawn.socks = "Nude"
new_spawn.update_body() new_spawn.update_body(TRUE)
//Ash walker eggs: Spawns in ash walker dens in lavaland. Ghosts become unbreathing lizards that worship the Necropolis and are advised to retrieve corpses to create more ash walkers. //Ash walker eggs: Spawns in ash walker dens in lavaland. Ghosts become unbreathing lizards that worship the Necropolis and are advised to retrieve corpses to create more ash walkers.

View File

@@ -45,6 +45,6 @@
SEND_SIGNAL(H, COMSIG_HUMAN_ON_RANDOMIZE) SEND_SIGNAL(H, COMSIG_HUMAN_ON_RANDOMIZE)
H.update_body() H.update_body(TRUE)
H.update_hair() H.update_hair()
H.update_body_parts() H.update_body_parts()

View File

@@ -95,7 +95,7 @@
H.dna.features = random_features(H.dna.species?.id) H.dna.features = random_features(H.dna.species?.id)
// Apply Appearance // Apply Appearance
H.update_body() // Outfit and underware, also body. H.update_body(TRUE) // Outfit and underwear, also body and privates.
//H.update_mutant_bodyparts() // Lizard tails etc //H.update_mutant_bodyparts() // Lizard tails etc
H.update_hair() H.update_hair()
H.update_body_parts() H.update_body_parts()
@@ -140,7 +140,7 @@
ADD_TRAIT(H, TRAIT_DISFIGURED, "husk") // NOTE: We are ASSUMING husk. // H.status_flags |= DISFIGURED // Restore "Unknown" disfigurement ADD_TRAIT(H, TRAIT_DISFIGURED, "husk") // NOTE: We are ASSUMING husk. // H.status_flags |= DISFIGURED // Restore "Unknown" disfigurement
H.dna.features = prev_features H.dna.features = prev_features
// Apply Appearance // Apply Appearance
H.update_body() // Outfit and underware, also body. H.update_body(TRUE) // Outfit and underwear, also body and privates.
H.update_hair() H.update_hair()
H.update_body_parts() // Body itself, maybe skin color? H.update_body_parts() // Body itself, maybe skin color?
cast_effect() // POOF cast_effect() // POOF

View File

@@ -244,7 +244,7 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master",
H.undershirt = "Nude" H.undershirt = "Nude"
H.socks = "Nude" H.socks = "Nude"
H.dna.features["mcolor"] = "511" //A deep red H.dna.features["mcolor"] = "511" //A deep red
H.regenerate_icons() H.update_body(TRUE)
else //Did the devil get hit by a staff of transmutation? else //Did the devil get hit by a staff of transmutation?
owner.current.color = "#501010" owner.current.color = "#501010"
give_appropriate_spells() give_appropriate_spells()
@@ -466,7 +466,7 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master",
H.undershirt = "Nude" H.undershirt = "Nude"
H.socks = "Nude" H.socks = "Nude"
H.dna.features["mcolor"] = "511" H.dna.features["mcolor"] = "511"
H.regenerate_icons() H.update_body(TRUE)
if(SOULVALUE >= TRUE_THRESHOLD) //Yes, BOTH this and the above if statement are to run if soulpower is high enough. if(SOULVALUE >= TRUE_THRESHOLD) //Yes, BOTH this and the above if statement are to run if soulpower is high enough.
var/mob/living/carbon/true_devil/A = new /mob/living/carbon/true_devil(targetturf) var/mob/living/carbon/true_devil/A = new /mob/living/carbon/true_devil(targetturf)
A.faction |= "hell" A.faction |= "hell"

View File

@@ -208,7 +208,7 @@
else else
H.skin_tone = random_skin_tone() H.skin_tone = random_skin_tone()
H.update_hair() H.update_hair()
H.update_body() H.update_body() //update_genitals arg FALSE because these don't quite require/have them most times.
if(outfit) if(outfit)
var/static/list/slots = list("uniform", "r_hand", "l_hand", "suit", "shoes", "gloves", "ears", "glasses", "mask", "head", "belt", "r_pocket", "l_pocket", "back", "id", "neck", "backpack_contents", "suit_store") var/static/list/slots = list("uniform", "r_hand", "l_hand", "suit", "shoes", "gloves", "ears", "glasses", "mask", "head", "belt", "r_pocket", "l_pocket", "back", "id", "neck", "backpack_contents", "suit_store")
for(var/slot in slots) for(var/slot in slots)

View File

@@ -126,7 +126,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
"cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF,
"cock_color" = "fff", "cock_color" = "fff",
"has_balls" = FALSE, "has_balls" = FALSE,
"balls_internal" = FALSE,
"balls_color" = "fff", "balls_color" = "fff",
"balls_shape" = DEF_BALLS_SHAPE, "balls_shape" = DEF_BALLS_SHAPE,
"balls_size" = BALLS_SIZE_DEF, "balls_size" = BALLS_SIZE_DEF,
@@ -141,12 +140,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
"has_vag" = FALSE, "has_vag" = FALSE,
"vag_shape" = DEF_VAGINA_SHAPE, "vag_shape" = DEF_VAGINA_SHAPE,
"vag_color" = "fff", "vag_color" = "fff",
"vag_clits" = 1,
"vag_clit_diam" = 0.25,
"has_womb" = FALSE, "has_womb" = FALSE,
"womb_cum_rate" = CUM_RATE, "balls_visibility" = GEN_VISIBLE_NO_UNDIES,
"womb_cum_mult" = CUM_RATE_MULT, "breasts_visibility"= GEN_VISIBLE_NO_UNDIES,
"womb_efficiency" = CUM_EFFICIENCY, "cock_visibility" = GEN_VISIBLE_NO_UNDIES,
"vag_visibility" = GEN_VISIBLE_NO_UNDIES,
"ipc_screen" = "Sunburst", "ipc_screen" = "Sunburst",
"ipc_antenna" = "None", "ipc_antenna" = "None",
"flavor_text" = "", "flavor_text" = "",
@@ -763,6 +761,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "<span style='border: 1px solid #161616; background-color: #[features["cock_color"]];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=cock_color;task=input'>Change</a><br>" dat += "<span style='border: 1px solid #161616; background-color: #[features["cock_color"]];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=cock_color;task=input'>Change</a><br>"
dat += "<b>Penis Shape:</b> <a style='display:block;width:120px' href='?_src_=prefs;preference=cock_shape;task=input'>[features["cock_shape"]]</a>" dat += "<b>Penis Shape:</b> <a style='display:block;width:120px' href='?_src_=prefs;preference=cock_shape;task=input'>[features["cock_shape"]]</a>"
dat += "<b>Penis Length:</b> <a style='display:block;width:120px' href='?_src_=prefs;preference=cock_length;task=input'>[features["cock_length"]] inch(es)</a>" dat += "<b>Penis Length:</b> <a style='display:block;width:120px' href='?_src_=prefs;preference=cock_length;task=input'>[features["cock_length"]] inch(es)</a>"
dat += "<b>Penis Visibility:</b><a style='display:block;width:50px' href='?_src_=prefs;preference=cock_visibility;task=input'>[features["cock_visibility"]]</a>"
dat += "<b>Has Testicles:</b><a style='display:block;width:50px' href='?_src_=prefs;preference=has_balls'>[features["has_balls"] == TRUE ? "Yes" : "No"]</a>" dat += "<b>Has Testicles:</b><a style='display:block;width:50px' href='?_src_=prefs;preference=has_balls'>[features["has_balls"] == TRUE ? "Yes" : "No"]</a>"
if(features["has_balls"]) if(features["has_balls"])
if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE) if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE)
@@ -771,7 +770,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
else else
dat += "<b>Testicles Color:</b></a><BR>" dat += "<b>Testicles Color:</b></a><BR>"
dat += "<span style='border: 1px solid #161616; background-color: #[features["balls_color"]];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=balls_color;task=input'>Change</a><br>" dat += "<span style='border: 1px solid #161616; background-color: #[features["balls_color"]];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=balls_color;task=input'>Change</a><br>"
dat += "<b>Testicles showing:</b><a style='display:block;width:50px' href='?_src_=prefs;preference=balls_shape;task=input'>[features["balls_shape"]]</a>" dat += "<b>Testicles Visibility:</b><a style='display:block;width:50px' href='?_src_=prefs;preference=balls_visibility;task=input'>[features["balls_visibility"]]</a>"
dat += APPEARANCE_CATEGORY_COLUMN dat += APPEARANCE_CATEGORY_COLUMN
dat += "<h3>Vagina</h3>" dat += "<h3>Vagina</h3>"
dat += "<a style='display:block;width:50px' href='?_src_=prefs;preference=has_vag'>[features["has_vag"] == TRUE ? "Yes" : "No"]</a>" dat += "<a style='display:block;width:50px' href='?_src_=prefs;preference=has_vag'>[features["has_vag"] == TRUE ? "Yes" : "No"]</a>"
@@ -783,6 +782,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
else else
dat += "<b>Vagina Color:</b></a><BR>" dat += "<b>Vagina Color:</b></a><BR>"
dat += "<span style='border: 1px solid #161616; background-color: #[features["vag_color"]];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=vag_color;task=input'>Change</a><br>" dat += "<span style='border: 1px solid #161616; background-color: #[features["vag_color"]];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=vag_color;task=input'>Change</a><br>"
dat += "<b>Vagina Visibility:</b><a style='display:block;width:50px' href='?_src_=prefs;preference=vag_visibility;task=input'>[features["vag_visibility"]]</a>"
dat += "<b>Has Womb:</b><a style='display:block;width:50px' href='?_src_=prefs;preference=has_womb'>[features["has_womb"] == TRUE ? "Yes" : "No"]</a>" dat += "<b>Has Womb:</b><a style='display:block;width:50px' href='?_src_=prefs;preference=has_womb'>[features["has_womb"] == TRUE ? "Yes" : "No"]</a>"
dat += "</td>" dat += "</td>"
dat += APPEARANCE_CATEGORY_COLUMN dat += APPEARANCE_CATEGORY_COLUMN
@@ -796,7 +796,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "<b>Color:</b></a><BR>" dat += "<b>Color:</b></a><BR>"
dat += "<span style='border: 1px solid #161616; background-color: #[features["breasts_color"]];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=breasts_color;task=input'>Change</a><br>" dat += "<span style='border: 1px solid #161616; background-color: #[features["breasts_color"]];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=breasts_color;task=input'>Change</a><br>"
dat += "<b>Cup Size:</b><a style='display:block;width:50px' href='?_src_=prefs;preference=breasts_size;task=input'>[features["breasts_size"]]</a>" dat += "<b>Cup Size:</b><a style='display:block;width:50px' href='?_src_=prefs;preference=breasts_size;task=input'>[features["breasts_size"]]</a>"
dat += "<b>Breast Shape:</b><a style='display:block;width:50px' href='?_src_=prefs;preference=breasts_shape;task=input'>[features["breasts_shape"]]</a>" dat += "<b>Breasts Shape:</b><a style='display:block;width:50px' href='?_src_=prefs;preference=breasts_shape;task=input'>[features["breasts_shape"]]</a>"
dat += "<b>Breasts Visibility:</b><a style='display:block;width:50px' href='?_src_=prefs;preference=breasts_visibility;task=input'>[features["breasts_visibility"]]</a>"
dat += "<b>Lactates:</b><a style='display:block;width:50px' href='?_src_=prefs;preference=breasts_producing'>[features["breasts_producing"] == TRUE ? "Yes" : "No"]</a>" dat += "<b>Lactates:</b><a style='display:block;width:50px' href='?_src_=prefs;preference=breasts_producing'>[features["breasts_producing"] == TRUE ? "Yes" : "No"]</a>"
dat += "</td>" dat += "</td>"
dat += "</td>" dat += "</td>"
@@ -1939,8 +1940,13 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(new_shape) if(new_shape)
features["cock_shape"] = new_shape features["cock_shape"] = new_shape
if("cock_visibility")
var/n_vis = input(user, "Penis Visibility", "Character Preference") as null|anything in CONFIG_GET(keyed_list/safe_visibility_toggles)
if(n_vis)
features["cock_visibility"] = n_vis
if("balls_color") if("balls_color")
var/new_ballscolor = input(user, "Testicle Color:", "Character Preference") as color|null var/new_ballscolor = input(user, "Testicles Color:", "Character Preference") as color|null
if(new_ballscolor) if(new_ballscolor)
var/temp_hsv = RGBtoHSV(new_ballscolor) var/temp_hsv = RGBtoHSV(new_ballscolor)
if(new_ballscolor == "#000000") if(new_ballscolor == "#000000")
@@ -1950,11 +1956,10 @@ GLOBAL_LIST_EMPTY(preferences_datums)
else else
to_chat(user,"<span class='danger'>Invalid color. Your color is not bright enough.</span>") to_chat(user,"<span class='danger'>Invalid color. Your color is not bright enough.</span>")
if("balls_shape") if("balls_visibility")
var/new_shape var/n_vis = input(user, "Testicles Visibility", "Character Preference") as null|anything in CONFIG_GET(keyed_list/safe_visibility_toggles)
new_shape = input(user, "Testicle Type:", "Character Preference") as null|anything in GLOB.balls_shapes_list if(n_vis)
if(new_shape) features["balls_visibility"] = n_vis
features["balls_shape"] = new_shape
if("breasts_size") if("breasts_size")
var/new_size = input(user, "Breast Size", "Character Preference") as null|anything in CONFIG_GET(keyed_list/breasts_cups_prefs) var/new_size = input(user, "Breast Size", "Character Preference") as null|anything in CONFIG_GET(keyed_list/breasts_cups_prefs)
@@ -1978,6 +1983,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
else else
to_chat(user,"<span class='danger'>Invalid color. Your color is not bright enough.</span>") to_chat(user,"<span class='danger'>Invalid color. Your color is not bright enough.</span>")
if("breasts_visibility")
var/n_vis = input(user, "Breasts Visibility", "Character Preference") as null|anything in CONFIG_GET(keyed_list/safe_visibility_toggles)
if(n_vis)
features["breasts_visibility"] = n_vis
if("vag_shape") if("vag_shape")
var/new_shape var/new_shape
new_shape = input(user, "Vagina Type", "Character Preference") as null|anything in GLOB.vagina_shapes_list new_shape = input(user, "Vagina Type", "Character Preference") as null|anything in GLOB.vagina_shapes_list
@@ -1995,6 +2005,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
else else
to_chat(user,"<span class='danger'>Invalid color. Your color is not bright enough.</span>") to_chat(user,"<span class='danger'>Invalid color. Your color is not bright enough.</span>")
if("vag_visibility")
var/n_vis = input(user, "Vagina Visibility", "Character Preference") as null|anything in CONFIG_GET(keyed_list/safe_visibility_toggles)
if(n_vis)
features["vag_visibility"] = n_vis
if("ooccolor") if("ooccolor")
var/new_ooccolor = input(user, "Choose your OOC colour:", "Game Preference",ooccolor) as color|null var/new_ooccolor = input(user, "Choose your OOC colour:", "Game Preference",ooccolor) as color|null
if(new_ooccolor) if(new_ooccolor)
@@ -2088,8 +2103,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
features["has_balls"] = FALSE features["has_balls"] = FALSE
if("has_balls") if("has_balls")
features["has_balls"] = !features["has_balls"] features["has_balls"] = !features["has_balls"]
if("balls_internal")
features["balls_internal"] = !features["balls_internal"]
if("has_breasts") if("has_breasts")
features["has_breasts"] = !features["has_breasts"] features["has_breasts"] = !features["has_breasts"]
if(features["has_breasts"] == FALSE) if(features["has_breasts"] == FALSE)
@@ -2409,6 +2422,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
else else
character.Digitigrade_Leg_Swap(TRUE) character.Digitigrade_Leg_Swap(TRUE)
character.give_genitals(TRUE) //character.update_genitals() is already called on genital.update_appearance()
SEND_SIGNAL(character, COMSIG_HUMAN_PREFS_COPIED_TO, src, icon_updates, roundstart_checks) SEND_SIGNAL(character, COMSIG_HUMAN_PREFS_COPIED_TO, src, icon_updates, roundstart_checks)
//let's be sure the character updates //let's be sure the character updates

View File

@@ -71,11 +71,13 @@
//for snowflake/donor specific sprites //for snowflake/donor specific sprites
var/list/ckeys_allowed var/list/ckeys_allowed
//For soft-restricting markings to species IDs //For soft-restricting markings to species IDs
var/list/recommended_species var/list/recommended_species
/datum/sprite_accessory/underwear /datum/sprite_accessory/underwear
icon = 'icons/mob/underwear.dmi' icon = 'icons/mob/underwear.dmi'
var/has_color = FALSE var/has_color = FALSE
var/has_digitigrade = FALSE var/has_digitigrade = FALSE
var/covers_groin = FALSE
var/covers_chest = FALSE

View File

@@ -2,9 +2,13 @@
// Undershirt Definitions // // Undershirt Definitions //
//////////////////////////// ////////////////////////////
/datum/sprite_accessory/underwear/top
covers_chest = TRUE
/datum/sprite_accessory/underwear/top/nude /datum/sprite_accessory/underwear/top/nude
name = "Nude" name = "Nude"
icon_state = null icon_state = null
covers_chest = FALSE
// please make sure they're sorted alphabetically and categorized // please make sure they're sorted alphabetically and categorized

View File

@@ -2,9 +2,13 @@
// Underwear Definitions // // Underwear Definitions //
/////////////////////////// ///////////////////////////
/datum/sprite_accessory/underwear/bottom
covers_groin = TRUE
/datum/sprite_accessory/underwear/bottom/nude /datum/sprite_accessory/underwear/bottom/nude
name = "Nude" name = "Nude"
icon_state = null icon_state = null
covers_groin = FALSE
/datum/sprite_accessory/underwear/bottom/mankini /datum/sprite_accessory/underwear/bottom/mankini
name = "Mankini" name = "Mankini"
@@ -155,16 +159,19 @@
name = "Swimsuit, One Piece - Red" name = "Swimsuit, One Piece - Red"
icon_state = "swimming_red" icon_state = "swimming_red"
gender = FEMALE gender = FEMALE
covers_chest = TRUE
/datum/sprite_accessory/underwear/bottom/swimsuit /datum/sprite_accessory/underwear/bottom/swimsuit
name = "Swimsuit, One Piece - Black" name = "Swimsuit, One Piece - Black"
icon_state = "swimming_black" icon_state = "swimming_black"
gender = FEMALE gender = FEMALE
covers_chest = TRUE
/datum/sprite_accessory/underwear/bottom/swimsuit_blue /datum/sprite_accessory/underwear/bottom/swimsuit_blue
name = "Swimsuit, One Piece - Striped Blue" name = "Swimsuit, One Piece - Striped Blue"
icon_state = "swimming_blue" icon_state = "swimming_blue"
gender = FEMALE gender = FEMALE
covers_chest = TRUE
/datum/sprite_accessory/underwear/bottom/thong /datum/sprite_accessory/underwear/bottom/thong
name = "Thong" name = "Thong"

View File

@@ -629,9 +629,8 @@
underwear = "Nude" underwear = "Nude"
undershirt = "Nude" undershirt = "Nude"
socks = "Nude" socks = "Nude"
update_body() update_body(TRUE)
update_hair() update_hair()
update_genitals()
/mob/living/carbon/human/singularity_pull(S, current_size) /mob/living/carbon/human/singularity_pull(S, current_size)
..() ..()

View File

@@ -57,10 +57,12 @@ There are several things that need to be remembered:
dna.species.handle_mutant_bodyparts(src) dna.species.handle_mutant_bodyparts(src)
/mob/living/carbon/human/update_body() /mob/living/carbon/human/update_body(update_genitals = FALSE)
remove_overlay(BODY_LAYER) remove_overlay(BODY_LAYER)
dna.species.handle_body(src) dna.species.handle_body(src)
..() ..()
if(update_genitals)
update_genitals()
/mob/living/carbon/human/update_fire() /mob/living/carbon/human/update_fire()
..((fire_stacks > 3) ? "Standing" : "Generic_mob_burning") ..((fire_stacks > 3) ? "Standing" : "Generic_mob_burning")
@@ -72,7 +74,7 @@ There are several things that need to be remembered:
if(!..()) if(!..())
icon_render_key = null //invalidate bodyparts cache icon_render_key = null //invalidate bodyparts cache
update_body() update_body(TRUE)
update_hair() update_hair()
update_inv_w_uniform() update_inv_w_uniform()
update_inv_wear_id() update_inv_wear_id()

View File

@@ -33,7 +33,7 @@
hidden_underwear = on_off hidden_underwear = on_off
hidden_socks = on_off hidden_socks = on_off
update_body() update_body(TRUE)
/mob/living/carbon/human/proc/adjust_arousal(strength,aphro = FALSE,maso = FALSE) // returns all genitals that were adjust /mob/living/carbon/human/proc/adjust_arousal(strength,aphro = FALSE,maso = FALSE) // returns all genitals that were adjust

View File

@@ -41,6 +41,9 @@
return return
update_size() update_size()
update_appearance() update_appearance()
if(genital_flags & UPDATE_OWNER_APPEARANCE && owner && ishuman(owner))
var/mob/living/carbon/human/H = owner
H.update_genitals()
if(linked_organ_slot || (linked_organ && !owner)) if(linked_organ_slot || (linked_organ && !owner))
update_link() update_link()
@@ -49,9 +52,16 @@
var/list/exposed_genitals = list() //Keeping track of them so we don't have to iterate through every genitalia and see if exposed var/list/exposed_genitals = list() //Keeping track of them so we don't have to iterate through every genitalia and see if exposed
/obj/item/organ/genital/proc/is_exposed() /obj/item/organ/genital/proc/is_exposed()
if(!owner || CHECK_BITFIELD(genital_flags, GENITAL_INTERNAL) || CHECK_BITFIELD(genital_flags, GENITAL_HIDDEN)) if(!owner || genital_flags & (GENITAL_INTERNAL|GENITAL_HIDDEN))
return FALSE return FALSE
if(CHECK_BITFIELD(genital_flags, GENITAL_THROUGH_CLOTHES)) if(genital_flags & GENITAL_UNDIES_HIDDEN && ishuman(owner))
var/mob/living/carbon/human/H = owner
if(!(NO_UNDERWEAR in H.dna.species.species_traits))
var/datum/sprite_accessory/underwear/top/T = GLOB.undershirt_list[H.undershirt]
var/datum/sprite_accessory/underwear/bottom/B = GLOB.underwear_list[H.underwear]
if(zone == BODY_ZONE_CHEST ? (H.hidden_undershirt || T?.covers_chest || B?.covers_chest) : (H.hidden_underwear || T?.covers_groin || B?.covers_groin))
return FALSE
if(genital_flags & GENITAL_THROUGH_CLOTHES)
return TRUE return TRUE
switch(zone) //update as more genitals are added switch(zone) //update as more genitals are added
@@ -60,25 +70,19 @@
if(BODY_ZONE_PRECISE_GROIN) if(BODY_ZONE_PRECISE_GROIN)
return owner.is_groin_exposed() return owner.is_groin_exposed()
/obj/item/organ/genital/proc/toggle_visibility(visibility) /obj/item/organ/genital/proc/toggle_visibility(visibility, update = TRUE)
genital_flags &= ~(GENITAL_THROUGH_CLOTHES|GENITAL_HIDDEN|GENITAL_UNDIES_HIDDEN)
owner.exposed_genitals -= src
switch(visibility) switch(visibility)
if("Always visible") if(GEN_VISIBLE_ALWAYS)
ENABLE_BITFIELD(genital_flags, GENITAL_THROUGH_CLOTHES) genital_flags |= GENITAL_THROUGH_CLOTHES
DISABLE_BITFIELD(genital_flags, GENITAL_HIDDEN) owner.exposed_genitals += src
if(!(src in owner.exposed_genitals)) if(GEN_VISIBLE_NO_UNDIES)
owner.exposed_genitals += src genital_flags |= GENITAL_UNDIES_HIDDEN
if("Hidden by clothes") if(GEN_VISIBLE_NEVER)
DISABLE_BITFIELD(genital_flags, GENITAL_THROUGH_CLOTHES) genital_flags |= GENITAL_HIDDEN
DISABLE_BITFIELD(genital_flags, GENITAL_HIDDEN)
if(src in owner.exposed_genitals)
owner.exposed_genitals -= src
if("Always hidden")
DISABLE_BITFIELD(genital_flags, GENITAL_THROUGH_CLOTHES)
ENABLE_BITFIELD(genital_flags, GENITAL_HIDDEN)
if(src in owner.exposed_genitals)
owner.exposed_genitals -= src
if(ishuman(owner)) //recast to use update genitals proc if(update && ishuman(owner)) //recast to use update genitals proc
var/mob/living/carbon/human/H = owner var/mob/living/carbon/human/H = owner
H.update_genitals() H.update_genitals()
@@ -87,6 +91,10 @@
set name = "Expose/Hide genitals" set name = "Expose/Hide genitals"
set desc = "Allows you to toggle which genitals should show through clothes or not." set desc = "Allows you to toggle which genitals should show through clothes or not."
if(stat != CONSCIOUS)
to_chat(usr, "<span class='warning'>You can toggle genitals visibility right now...</span>")
return
var/list/genital_list = list() var/list/genital_list = list()
for(var/obj/item/organ/genital/G in internal_organs) for(var/obj/item/organ/genital/G in internal_organs)
if(!CHECK_BITFIELD(G.genital_flags, GENITAL_INTERNAL)) if(!CHECK_BITFIELD(G.genital_flags, GENITAL_INTERNAL))
@@ -95,10 +103,11 @@
return return
//Full list of exposable genitals created //Full list of exposable genitals created
var/obj/item/organ/genital/picked_organ var/obj/item/organ/genital/picked_organ
picked_organ = input(src, "Choose which genitalia to expose/hide", "Expose/Hide genitals", null) in genital_list picked_organ = input(src, "Choose which genitalia to expose/hide", "Expose/Hide genitals") as null|anything in genital_list
if(picked_organ) if(picked_organ && (picked_organ in internal_organs))
var/picked_visibility = input(src, "Choose visibility setting", "Expose/Hide genitals", "Hidden by clothes") in list("Always visible", "Hidden by clothes", "Always hidden") var/picked_visibility = input(src, "Choose visibility setting", "Expose/Hide genitals") as null|anything in GLOB.genitals_visibility_toggles
picked_organ.toggle_visibility(picked_visibility) if(picked_visibility && picked_organ && (picked_organ in internal_organs))
picked_organ.toggle_visibility(picked_visibility)
return return
/mob/living/carbon/verb/toggle_arousal_state() /mob/living/carbon/verb/toggle_arousal_state()
@@ -256,6 +265,7 @@
var/list/gen_index[GENITAL_LAYER_INDEX_LENGTH] var/list/gen_index[GENITAL_LAYER_INDEX_LENGTH]
var/list/genitals_to_add var/list/genitals_to_add
var/list/fully_exposed var/list/fully_exposed
var/list/somewhat_exposed
for(var/obj/item/organ/genital/G in internal_organs) for(var/obj/item/organ/genital/G in internal_organs)
if(G.is_exposed()) //Checks appropriate clothing slot and if it's through_clothes if(G.is_exposed()) //Checks appropriate clothing slot and if it's through_clothes
LAZYADD(gen_index[G.layer_index], G) LAZYADD(gen_index[G.layer_index], G)
@@ -306,9 +316,13 @@
genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size][dna.species.use_skintones ? "_s" : ""]_[aroused_state]_[layertext]" genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size][dna.species.use_skintones ? "_s" : ""]_[aroused_state]_[layertext]"
if(layers_num[layer] == GENITALS_FRONT_LAYER && CHECK_BITFIELD(G.genital_flags, GENITAL_THROUGH_CLOTHES)) if(layers_num[layer] == GENITALS_FRONT_LAYER)
genital_overlay.layer = -GENITALS_EXPOSED_LAYER if(G.genital_flags & GENITAL_THROUGH_CLOTHES)
LAZYADD(fully_exposed, genital_overlay) // to be added to a layer with higher priority than clothes, hence the name of the bitflag. genital_overlay.layer = -GENITALS_EXPOSED_LAYER
LAZYADD(fully_exposed, genital_overlay)
else if(!(G.genital_flags & GENITAL_UNDIES_HIDDEN))
genital_overlay.layer = -GENITALS_NO_UNDIE_LAYER
LAZYADD(somewhat_exposed, genital_overlay)
else else
genital_overlay.layer = -layers_num[layer] genital_overlay.layer = -layers_num[layer]
standing += genital_overlay standing += genital_overlay
@@ -320,6 +334,10 @@
overlays_standing[GENITALS_EXPOSED_LAYER] = fully_exposed overlays_standing[GENITALS_EXPOSED_LAYER] = fully_exposed
apply_overlay(GENITALS_EXPOSED_LAYER) apply_overlay(GENITALS_EXPOSED_LAYER)
if(LAZYLEN(somewhat_exposed))
overlays_standing[GENITALS_NO_UNDIE_LAYER] = somewhat_exposed
apply_overlay(GENITALS_NO_UNDIE_LAYER)
for(var/L in relevant_layers) for(var/L in relevant_layers)
apply_overlay(layers_num[L]) apply_overlay(layers_num[L])

View File

@@ -74,13 +74,9 @@
name = "testicle" //the preview name of the accessory name = "testicle" //the preview name of the accessory
color_src = "balls_color" color_src = "balls_color"
/datum/sprite_accessory/testicles/hidden
icon_state = "none"
name = "Hidden"
/datum/sprite_accessory/testicles/single /datum/sprite_accessory/testicles/single
icon_state = "single" icon_state = "single"
name = "Single" name = "Single" //Single as "single pair", for clarity.
//Vaginas //Vaginas
/datum/sprite_accessory/vagina /datum/sprite_accessory/vagina

View File

@@ -12,7 +12,7 @@
fluid_id = /datum/reagent/consumable/milk fluid_id = /datum/reagent/consumable/milk
fluid_rate = MILK_RATE fluid_rate = MILK_RATE
shape = DEF_BREASTS_SHAPE shape = DEF_BREASTS_SHAPE
genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_FUID_PRODUCTION|GENITAL_CAN_AROUSE genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_FUID_PRODUCTION|GENITAL_CAN_AROUSE|UPDATE_OWNER_APPEARANCE|GENITAL_UNDIES_HIDDEN
masturbation_verb = "massage" masturbation_verb = "massage"
arousal_verb = "Your breasts start feeling sensitive" arousal_verb = "Your breasts start feeling sensitive"
unarousal_verb = "Your breasts no longer feel sensitive" unarousal_verb = "Your breasts no longer feel sensitive"
@@ -64,9 +64,6 @@
icon_state += "_s" icon_state += "_s"
else else
color = "#[owner.dna.features["breasts_color"]]" color = "#[owner.dna.features["breasts_color"]]"
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.update_genitals()
//Allows breasts to grow and change size, with sprite changes too. //Allows breasts to grow and change size, with sprite changes too.
//maximum wah //maximum wah
@@ -133,6 +130,7 @@
cached_size = size cached_size = size
size = breast_values[size] size = breast_values[size]
prev_size = cached_size prev_size = cached_size
toggle_visibility(D.features["breasts_visibility"], FALSE)
#undef BREASTS_ICON_MIN_SIZE #undef BREASTS_ICON_MIN_SIZE
#undef BREASTS_ICON_MAX_SIZE #undef BREASTS_ICON_MAX_SIZE

View File

@@ -8,7 +8,7 @@
masturbation_verb = "stroke" masturbation_verb = "stroke"
arousal_verb = "You pop a boner" arousal_verb = "You pop a boner"
unarousal_verb = "Your boner goes down" unarousal_verb = "Your boner goes down"
genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_CAN_AROUSE genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_CAN_AROUSE|UPDATE_OWNER_APPEARANCE|GENITAL_UNDIES_HIDDEN
linked_organ_slot = ORGAN_SLOT_TESTICLES linked_organ_slot = ORGAN_SLOT_TESTICLES
fluid_transfer_factor = 0.5 fluid_transfer_factor = 0.5
shape = DEF_COCK_SHAPE shape = DEF_COCK_SHAPE
@@ -66,9 +66,9 @@
if(owner) if(owner)
if (round(length) > round(prev_length)) if (round(length) > round(prev_length))
to_chat(owner, "<span class='warning'>Your [pick(GLOB.gentlemans_organ_names)] [pick("swells up to", "flourishes into", "expands into", "bursts forth into", "grows eagerly into", "amplifys into")] a [uppertext(round(length))] inch penis.</b></span>") to_chat(owner, "<span class='warning'>Your [pick(GLOB.dick_nouns)] [pick("swells up to", "flourishes into", "expands into", "bursts forth into", "grows eagerly into", "amplifys into")] a [uppertext(round(length))] inch penis.</b></span>")
else if ((round(length) < round(prev_length)) && (length > 0.5)) else if ((round(length) < round(prev_length)) && (length > 0.5))
to_chat(owner, "<span class='warning'>Your [pick(GLOB.gentlemans_organ_names)] [pick("shrinks down to", "decreases into", "diminishes into", "deflates into", "shrivels regretfully into", "contracts into")] a [uppertext(round(length))] inch penis.</b></span>") to_chat(owner, "<span class='warning'>Your [pick(GLOB.dick_nouns)] [pick("shrinks down to", "decreases into", "diminishes into", "deflates into", "shrivels regretfully into", "contracts into")] a [uppertext(round(length))] inch penis.</b></span>")
icon_state = sanitize_text("penis_[shape]_[size]") icon_state = sanitize_text("penis_[shape]_[size]")
diameter = (length * diameter_ratio)//Is it just me or is this ludicous, why not make it exponentially decay? diameter = (length * diameter_ratio)//Is it just me or is this ludicous, why not make it exponentially decay?
@@ -89,9 +89,6 @@
icon_state += "_s" icon_state += "_s"
else else
color = "#[owner.dna.features["cock_color"]]" color = "#[owner.dna.features["cock_color"]]"
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.update_genitals()
/obj/item/organ/genital/penis/get_features(mob/living/carbon/human/H) /obj/item/organ/genital/penis/get_features(mob/living/carbon/human/H)
var/datum/dna/D = H.dna var/datum/dna/D = H.dna
@@ -103,3 +100,4 @@
diameter_ratio = D.features["cock_diameter_ratio"] diameter_ratio = D.features["cock_diameter_ratio"]
shape = D.features["cock_shape"] shape = D.features["cock_shape"]
prev_length = length prev_length = length
toggle_visibility(D.features["cock_visibility"], FALSE)

View File

@@ -9,7 +9,7 @@
arousal_verb = "Your balls ache a little" arousal_verb = "Your balls ache a little"
unarousal_verb = "Your balls finally stop aching, again" unarousal_verb = "Your balls finally stop aching, again"
linked_organ_slot = ORGAN_SLOT_PENIS linked_organ_slot = ORGAN_SLOT_PENIS
genital_flags = CAN_MASTURBATE_WITH|MASTURBATE_LINKED_ORGAN|GENITAL_FUID_PRODUCTION genital_flags = CAN_MASTURBATE_WITH|MASTURBATE_LINKED_ORGAN|GENITAL_FUID_PRODUCTION|UPDATE_OWNER_APPEARANCE|GENITAL_UNDIES_HIDDEN
var/size_name = "average" var/size_name = "average"
shape = DEF_BALLS_SHAPE shape = DEF_BALLS_SHAPE
fluid_id = /datum/reagent/consumable/semen fluid_id = /datum/reagent/consumable/semen
@@ -53,9 +53,6 @@
icon_state += "_s" icon_state += "_s"
else else
color = "#[owner.dna.features["balls_color"]]" color = "#[owner.dna.features["balls_color"]]"
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.update_genitals()
/obj/item/organ/genital/testicles/get_features(mob/living/carbon/human/H) /obj/item/organ/genital/testicles/get_features(mob/living/carbon/human/H)
var/datum/dna/D = H.dna var/datum/dna/D = H.dna
@@ -64,8 +61,7 @@
else else
color = "#[D.features["balls_color"]]" color = "#[D.features["balls_color"]]"
shape = D.features["balls_shape"] shape = D.features["balls_shape"]
if(D.features["balls_shape"] == "Hidden")
ENABLE_BITFIELD(genital_flags, GENITAL_INTERNAL)
fluid_rate = D.features["balls_cum_rate"] fluid_rate = D.features["balls_cum_rate"]
fluid_mult = D.features["balls_cum_mult"] fluid_mult = D.features["balls_cum_mult"]
fluid_efficiency = D.features["balls_efficiency"] fluid_efficiency = D.features["balls_efficiency"]
toggle_visibility(D.features["balls_visibility"], FALSE)

View File

@@ -7,7 +7,7 @@
slot = "vagina" slot = "vagina"
size = 1 //There is only 1 size right now size = 1 //There is only 1 size right now
shape = DEF_VAGINA_SHAPE shape = DEF_VAGINA_SHAPE
genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_CAN_AROUSE genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_CAN_AROUSE|GENITAL_UNDIES_HIDDEN
masturbation_verb = "finger" masturbation_verb = "finger"
arousal_verb = "You feel wetness on your crotch" arousal_verb = "You feel wetness on your crotch"
unarousal_verb = "You no longer feel wet" unarousal_verb = "You no longer feel wet"
@@ -70,3 +70,4 @@
else else
color = "[D.features["vag_color"]]" color = "[D.features["vag_color"]]"
shape = "[D.features["vag_shape"]]" shape = "[D.features["vag_shape"]]"
toggle_visibility(D.features["vag_visibility"], FALSE)

View File

@@ -45,9 +45,3 @@
else else
if(L[slot_to_string(slot)] < DEFAULT_SLOT_AMT) if(L[slot_to_string(slot)] < DEFAULT_SLOT_AMT)
return TRUE return TRUE
/datum/preferences/copy_to(mob/living/carbon/human/character, icon_updates = 1)
..()
character.give_genitals(TRUE)
if(icon_updates)
character.update_genitals()