diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm index 85ffe0b5ce..174b44c6fc 100644 --- a/code/__DEFINES/citadel_defines.dm +++ b/code/__DEFINES/citadel_defines.dm @@ -23,6 +23,8 @@ #define MASTURBATE_LINKED_ORGAN (1<<6) //used to pass our mission to the linked organ #define CAN_CLIMAX_WITH (1<<7) #define GENITAL_CAN_AROUSE (1<<8) +#define GENITAL_UNDIES_HIDDEN (1<<9) +#define UPDATE_OWNER_APPEARANCE (1<<10) #define DEF_VAGINA_SHAPE "Human" @@ -59,6 +61,12 @@ #define MILK_RATE_MULT 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 #define INDIVIDUAL_LOOC_LOG "LOOC log" diff --git a/code/__HELPERS/_cit_helpers.dm b/code/__HELPERS/_cit_helpers.dm index cc8ab0d250..9afae12c30 100644 --- a/code/__HELPERS/_cit_helpers.dm +++ b/code/__HELPERS/_cit_helpers.dm @@ -58,14 +58,13 @@ GLOBAL_LIST_EMPTY(ipc_antennas_list) //Genitals and Arousal Lists GLOBAL_LIST_EMPTY(genitals_list) GLOBAL_LIST_EMPTY(cock_shapes_list) -GLOBAL_LIST_EMPTY(gentlemans_organ_names) GLOBAL_LIST_EMPTY(balls_shapes_list) GLOBAL_LIST_EMPTY(breasts_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 -GLOBAL_LIST_INIT(dick_nouns, list("dick","cock","member","shaft")) -GLOBAL_LIST_INIT(cum_id_list,"semen") -GLOBAL_LIST_INIT(milk_id_list,"milk") +//longcat memes. +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(genitals_visibility_toggles, list(GEN_VISIBLE_ALWAYS, GEN_VISIBLE_NO_CLOTHES, GEN_VISIBLE_NO_UNDIES, GEN_VISIBLE_NEVER)) GLOBAL_LIST_INIT(dildo_shapes, list( "Human" = "human", diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index ff2559b661..38e25b04c5 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -54,11 +54,6 @@ 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/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)) var/obj/item/organ/genital/G = gpath diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index b8edf3b0f4..f7546193aa 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -185,7 +185,6 @@ "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "has_balls" = FALSE, - "balls_internal" = FALSE, "balls_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "balls_size" = BALLS_SIZE_DEF, "balls_shape" = DEF_BALLS_SHAPE, @@ -200,13 +199,11 @@ "has_vag" = FALSE, "vag_shape" = pick(GLOB.vagina_shapes_list), "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, - "womb_cum_rate" = CUM_RATE, - "womb_cum_mult" = CUM_RATE_MULT, - "womb_efficiency" = CUM_EFFICIENCY, + "balls_visibility" = GEN_VISIBLE_NO_UNDIES, + "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, + "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_antenna" = "None", "flavor_text" = "", diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index 2b4822a013..8b08366c50 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -440,3 +440,8 @@ /datum/config_entry/number/penis_max_inches_prefs config_entry_value = 20 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. diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 14fe960422..4db8f4129a 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -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.undie_color = chosen_prof.undie_color 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_color =chosen_prof.socks_color chosen_dna.transfer_identity(user, 1) user.updateappearance(mutcolor_update=1) - user.update_body() + user.update_body(TRUE) user.domutcheck() //vars hackery. not pretty, but better than the alternative. diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm index ecacf49fc2..528153324d 100644 --- a/code/game/objects/structures/dresser.dm +++ b/code/game/objects/structures/dresser.dm @@ -73,7 +73,7 @@ H.socks_color = recolor_undergarment(H, "socks", H.socks_color) 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) var/n_color = input(H, "Choose your [garment_type]'\s color.", "Character Preference", default_color) as color|null diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index 7469bd2e72..65145c0eed 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -31,7 +31,7 @@ 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.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. diff --git a/code/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm index 3336da7267..3e604856c5 100644 --- a/code/modules/admin/create_mob.dm +++ b/code/modules/admin/create_mob.dm @@ -45,6 +45,6 @@ SEND_SIGNAL(H, COMSIG_HUMAN_ON_RANDOMIZE) - H.update_body() + H.update_body(TRUE) H.update_hair() H.update_body_parts() diff --git a/code/modules/antagonists/bloodsucker/powers/veil.dm b/code/modules/antagonists/bloodsucker/powers/veil.dm index 0b3cded832..ecb0611940 100644 --- a/code/modules/antagonists/bloodsucker/powers/veil.dm +++ b/code/modules/antagonists/bloodsucker/powers/veil.dm @@ -95,7 +95,7 @@ H.dna.features = random_features(H.dna.species?.id) // 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_hair() 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 H.dna.features = prev_features // 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_body_parts() // Body itself, maybe skin color? cast_effect() // POOF diff --git a/code/modules/antagonists/devil/devil.dm b/code/modules/antagonists/devil/devil.dm index 5d9ced0aae..dec39a2aa6 100644 --- a/code/modules/antagonists/devil/devil.dm +++ b/code/modules/antagonists/devil/devil.dm @@ -247,7 +247,7 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", H.undershirt = "Nude" H.socks = "Nude" 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? owner.current.color = "#501010" give_appropriate_spells() @@ -469,7 +469,7 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", H.undershirt = "Nude" H.socks = "Nude" 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. var/mob/living/carbon/true_devil/A = new /mob/living/carbon/true_devil(targetturf) A.faction |= "hell" diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index f740ed27dd..50dd1e5608 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -208,7 +208,7 @@ else H.skin_tone = random_skin_tone() 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) 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) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index e1ecb81ab6..0a0cf25d2c 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -126,7 +126,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_color" = "fff", "has_balls" = FALSE, - "balls_internal" = FALSE, "balls_color" = "fff", "balls_shape" = DEF_BALLS_SHAPE, "balls_size" = BALLS_SIZE_DEF, @@ -141,12 +140,11 @@ GLOBAL_LIST_EMPTY(preferences_datums) "has_vag" = FALSE, "vag_shape" = DEF_VAGINA_SHAPE, "vag_color" = "fff", - "vag_clits" = 1, - "vag_clit_diam" = 0.25, "has_womb" = FALSE, - "womb_cum_rate" = CUM_RATE, - "womb_cum_mult" = CUM_RATE_MULT, - "womb_efficiency" = CUM_EFFICIENCY, + "balls_visibility" = GEN_VISIBLE_NO_UNDIES, + "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, + "cock_visibility" = GEN_VISIBLE_NO_UNDIES, + "vag_visibility" = GEN_VISIBLE_NO_UNDIES, "ipc_screen" = "Sunburst", "ipc_antenna" = "None", "flavor_text" = "", @@ -766,6 +764,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "    Change
" dat += "Penis Shape: [features["cock_shape"]]" dat += "Penis Length: [features["cock_length"]] inch(es)" + dat += "Penis Visibility:[features["cock_visibility"]]" dat += "Has Testicles:[features["has_balls"] == TRUE ? "Yes" : "No"]" if(features["has_balls"]) if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE) @@ -774,7 +773,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) else dat += "Testicles Color:
" dat += "    Change
" - dat += "Testicles showing:[features["balls_shape"]]" + dat += "Testicles Visibility:[features["balls_visibility"]]" dat += APPEARANCE_CATEGORY_COLUMN dat += "

Vagina

" dat += "[features["has_vag"] == TRUE ? "Yes" : "No"]" @@ -786,6 +785,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) else dat += "Vagina Color:
" dat += "    Change
" + dat += "Vagina Visibility:[features["vag_visibility"]]" dat += "Has Womb:[features["has_womb"] == TRUE ? "Yes" : "No"]" dat += "" dat += APPEARANCE_CATEGORY_COLUMN @@ -799,7 +799,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Color:
" dat += "    Change
" dat += "Cup Size:[features["breasts_size"]]" - dat += "Breast Shape:[features["breasts_shape"]]" + dat += "Breasts Shape:[features["breasts_shape"]]" + dat += "Breasts Visibility:[features["breasts_visibility"]]" dat += "Lactates:[features["breasts_producing"] == TRUE ? "Yes" : "No"]" dat += "" dat += "" @@ -1944,8 +1945,13 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(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") - 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) var/temp_hsv = RGBtoHSV(new_ballscolor) if(new_ballscolor == "#000000") @@ -1955,11 +1961,10 @@ GLOBAL_LIST_EMPTY(preferences_datums) else to_chat(user,"Invalid color. Your color is not bright enough.") - if("balls_shape") - var/new_shape - new_shape = input(user, "Testicle Type:", "Character Preference") as null|anything in GLOB.balls_shapes_list - if(new_shape) - features["balls_shape"] = new_shape + if("balls_visibility") + var/n_vis = input(user, "Testicles Visibility", "Character Preference") as null|anything in CONFIG_GET(keyed_list/safe_visibility_toggles) + if(n_vis) + features["balls_visibility"] = n_vis if("breasts_size") var/new_size = input(user, "Breast Size", "Character Preference") as null|anything in CONFIG_GET(keyed_list/breasts_cups_prefs) @@ -1983,6 +1988,11 @@ GLOBAL_LIST_EMPTY(preferences_datums) else to_chat(user,"Invalid color. Your color is not bright enough.") + 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") var/new_shape new_shape = input(user, "Vagina Type", "Character Preference") as null|anything in GLOB.vagina_shapes_list @@ -2000,6 +2010,11 @@ GLOBAL_LIST_EMPTY(preferences_datums) else to_chat(user,"Invalid color. Your color is not bright enough.") + 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") var/new_ooccolor = input(user, "Choose your OOC colour:", "Game Preference",ooccolor) as color|null if(new_ooccolor) @@ -2098,8 +2113,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) features["has_balls"] = FALSE if("has_balls") features["has_balls"] = !features["has_balls"] - if("balls_internal") - features["balls_internal"] = !features["balls_internal"] if("has_breasts") features["has_breasts"] = !features["has_breasts"] if(features["has_breasts"] == FALSE) @@ -2416,6 +2429,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) else 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) //let's be sure the character updates diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 731b6b7725..749ac8c6db 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -5,7 +5,7 @@ // You do not need to raise this if you are adding new values that have sane defaults. // Only raise this value when changing the meaning/format/name/layout of an existing value // where you would want the updater procs below to run -#define SAVEFILE_VERSION_MAX 26 +#define SAVEFILE_VERSION_MAX 27 /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn @@ -145,6 +145,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(features["meat_type"] == "Inesct") features["meat_type"] = "Insect" + if(current_version < 27) + var/tennis + S["feature_balls_shape"] >> tennis + if(tennis == "Hidden") + features["balls_visibility"] = GEN_VISIBLE_NEVER + /datum/preferences/proc/load_path(ckey,filename="preferences.sav") if(!ckey) return @@ -452,22 +458,24 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["feature_cock_color"] >> features["cock_color"] S["feature_cock_length"] >> features["cock_length"] S["feature_cock_diameter"] >> features["cock_diameter"] - S["feature_has_sheath"] >> features["sheath_color"] + S["feature_cock_visibility"] >> features["cock_visibility"] //balls features S["feature_has_balls"] >> features["has_balls"] S["feature_balls_color"] >> features["balls_color"] S["feature_balls_size"] >> features["balls_size"] - S["feature_balls_shape"] >> features["balls_shape"] + S["feature_balls_visibility"] >> features["balls_visibility"] //breasts features S["feature_has_breasts"] >> features["has_breasts"] S["feature_breasts_size"] >> features["breasts_size"] S["feature_breasts_shape"] >> features["breasts_shape"] S["feature_breasts_color"] >> features["breasts_color"] S["feature_breasts_producing"] >> features["breasts_producing"] + S["feature_breasts_visibility"] >> features["breasts_visibility"] //vagina features S["feature_has_vag"] >> features["has_vag"] S["feature_vag_shape"] >> features["vag_shape"] S["feature_vag_color"] >> features["vag_color"] + S["feature_vag_visibility"] >> features["vag_visibility"] //womb features S["feature_has_womb"] >> features["has_womb"] //flavor text @@ -554,14 +562,18 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car var/static/list/B_sizes if(!B_sizes) - B_sizes = CONFIG_GET(keyed_list/breasts_cups_prefs) - B_sizes = B_sizes.Copy() + var/list/L = CONFIG_GET(keyed_list/breasts_cups_prefs) + B_sizes = L.Copy() var/static/min_D if(!min_D) min_D = CONFIG_GET(number/penis_min_inches_prefs) var/static/max_D if(!max_D) max_D = CONFIG_GET(number/penis_max_inches_prefs) + var/static/safe_visibilities + if(!safe_visibilities) + var/list/L = CONFIG_GET(keyed_list/safe_visibility_toggles) + safe_visibilities = L.Copy() features["breasts_size"] = sanitize_inlist(features["breasts_size"], B_sizes, BREASTS_SIZE_DEF) features["cock_length"] = sanitize_integer(features["cock_length"], min_D, max_D, COCK_SIZE_DEF) @@ -573,6 +585,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car features["cock_color"] = sanitize_hexcolor(features["cock_color"], 3, FALSE, "FFF") features["balls_color"] = sanitize_hexcolor(features["balls_color"], 3, FALSE, "FFF") features["vag_color"] = sanitize_hexcolor(features["vag_color"], 3, FALSE, "FFF") + features["breasts_visibility"] = sanitize_inlist(features["breasts_visibility"], safe_visibilities, GEN_VISIBLE_NO_UNDIES) + features["cock_visibility"] = sanitize_inlist(features["cock_visibility"], safe_visibilities, GEN_VISIBLE_NO_UNDIES) + features["balls_visibility"] = sanitize_inlist(features["balls_visibility"], safe_visibilities, GEN_VISIBLE_NO_UNDIES) + features["vag_visibility"] = sanitize_inlist(features["vag_visibility"], safe_visibilities, GEN_VISIBLE_NO_UNDIES) + features["flavor_text"] = copytext(features["flavor_text"], 1, MAX_FLAVOR_LEN) @@ -653,6 +670,30 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["feature_insect_markings"] , features["insect_markings"]) WRITE_FILE(S["feature_meat"] , features["meat_type"]) + WRITE_FILE(S["feature_has_cock"], features["has_cock"]) + WRITE_FILE(S["feature_cock_shape"], features["cock_shape"]) + WRITE_FILE(S["feature_cock_color"], features["cock_color"]) + WRITE_FILE(S["feature_cock_length"], features["cock_length"]) + WRITE_FILE(S["feature_cock_visibility"], features["cock_visibility"]) + + WRITE_FILE(S["feature_has_balls"], features["has_balls"]) + WRITE_FILE(S["feature_balls_color"], features["balls_color"]) + WRITE_FILE(S["feature_balls_size"], features["balls_size"]) + WRITE_FILE(S["feature_balls_visibility"], features["balls_visibility"]) + + WRITE_FILE(S["feature_has_breasts"], features["has_breasts"]) + WRITE_FILE(S["feature_breasts_size"], features["breasts_size"]) + WRITE_FILE(S["feature_breasts_shape"], features["breasts_shape"]) + WRITE_FILE(S["feature_breasts_color"], features["breasts_color"]) + WRITE_FILE(S["feature_breasts_producing"], features["breasts_producing"]) + WRITE_FILE(S["feature_breasts_visibility"], features["breasts_visibility"]) + + WRITE_FILE(S["feature_has_vag"], features["has_vag"]) + WRITE_FILE(S["feature_vag_shape"], features["vag_shape"]) + WRITE_FILE(S["feature_vag_color"], features["vag_color"]) + WRITE_FILE(S["feature_vag_visibility"], features["vag_visibility"]) + + WRITE_FILE(S["feature_has_womb"], features["has_womb"]) //Custom names for(var/custom_name_id in GLOB.preferences_custom_names) diff --git a/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm index abe51bf486..4365e59a7a 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm @@ -71,11 +71,13 @@ //for snowflake/donor specific sprites var/list/ckeys_allowed - + //For soft-restricting markings to species IDs var/list/recommended_species /datum/sprite_accessory/underwear icon = 'icons/mob/underwear.dmi' var/has_color = FALSE - var/has_digitigrade = FALSE \ No newline at end of file + var/has_digitigrade = FALSE + var/covers_groin = FALSE + var/covers_chest = FALSE \ No newline at end of file diff --git a/code/modules/mob/dead/new_player/sprite_accessories/undershirt.dm b/code/modules/mob/dead/new_player/sprite_accessories/undershirt.dm index 58c64dc7d0..73233f3e09 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/undershirt.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/undershirt.dm @@ -2,9 +2,13 @@ // Undershirt Definitions // //////////////////////////// +/datum/sprite_accessory/underwear/top + covers_chest = TRUE + /datum/sprite_accessory/underwear/top/nude name = "Nude" icon_state = null + covers_chest = FALSE // please make sure they're sorted alphabetically and categorized diff --git a/code/modules/mob/dead/new_player/sprite_accessories/underwear.dm b/code/modules/mob/dead/new_player/sprite_accessories/underwear.dm index 9441b5120a..58d5e1ba88 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/underwear.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/underwear.dm @@ -2,9 +2,13 @@ // Underwear Definitions // /////////////////////////// +/datum/sprite_accessory/underwear/bottom + covers_groin = TRUE + /datum/sprite_accessory/underwear/bottom/nude name = "Nude" icon_state = null + covers_groin = FALSE /datum/sprite_accessory/underwear/bottom/mankini name = "Mankini" @@ -155,16 +159,19 @@ name = "Swimsuit, One Piece - Red" icon_state = "swimming_red" gender = FEMALE + covers_chest = TRUE /datum/sprite_accessory/underwear/bottom/swimsuit name = "Swimsuit, One Piece - Black" icon_state = "swimming_black" gender = FEMALE + covers_chest = TRUE /datum/sprite_accessory/underwear/bottom/swimsuit_blue name = "Swimsuit, One Piece - Striped Blue" icon_state = "swimming_blue" gender = FEMALE + covers_chest = TRUE /datum/sprite_accessory/underwear/bottom/thong name = "Thong" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 90a3d628dc..007f91fa60 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -629,9 +629,8 @@ underwear = "Nude" undershirt = "Nude" socks = "Nude" - update_body() + update_body(TRUE) update_hair() - update_genitals() /mob/living/carbon/human/singularity_pull(S, current_size) ..() diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index ad1173c9dd..f0bf2fc23e 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -549,48 +549,45 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) //Underwear, Undershirts & Socks if(!(NO_UNDERWEAR in species_traits)) - if(H.socks && H.get_num_legs(FALSE) >= 2) - if(H.hidden_socks) - H.socks = "Nude" - else + if(H.socks && !H.hidden_socks && H.get_num_legs(FALSE) >= 2) + if(H.saved_socks) H.socks = H.saved_socks - var/datum/sprite_accessory/underwear/socks/S = GLOB.socks_list[H.socks] - if(S) - var/digilegs = ((DIGITIGRADE in species_traits) && S.has_digitigrade) ? "_d" : "" - var/mutable_appearance/MA = mutable_appearance(S.icon, "[S.icon_state][digilegs]", -BODY_LAYER) - if(S.has_color) - MA.color = "#[H.socks_color]" - standing += MA + H.saved_socks = "" + var/datum/sprite_accessory/underwear/socks/S = GLOB.socks_list[H.socks] + if(S) + var/digilegs = ((DIGITIGRADE in species_traits) && S.has_digitigrade) ? "_d" : "" + var/mutable_appearance/MA = mutable_appearance(S.icon, "[S.icon_state][digilegs]", -BODY_LAYER) + if(S.has_color) + MA.color = "#[H.socks_color]" + standing += MA - if(H.underwear) - if(H.hidden_underwear) - H.underwear = "Nude" - else + if(H.underwear && !H.hidden_underwear) + if(H.saved_underwear) H.underwear = H.saved_underwear - var/datum/sprite_accessory/underwear/bottom/B = GLOB.underwear_list[H.underwear] - if(B) - var/digilegs = ((DIGITIGRADE in species_traits) && B.has_digitigrade) ? "_d" : "" - var/mutable_appearance/MA = mutable_appearance(B.icon, "[B.icon_state][digilegs]", -BODY_LAYER) - if(B.has_color) - MA.color = "#[H.undie_color]" - standing += MA + H.saved_underwear = "" + var/datum/sprite_accessory/underwear/bottom/B = GLOB.underwear_list[H.underwear] + if(B) + var/digilegs = ((DIGITIGRADE in species_traits) && B.has_digitigrade) ? "_d" : "" + var/mutable_appearance/MA = mutable_appearance(B.icon, "[B.icon_state][digilegs]", -BODY_LAYER) + if(B.has_color) + MA.color = "#[H.undie_color]" + standing += MA - if(H.undershirt) - if(H.hidden_undershirt) - H.undershirt = "Nude" - else + if(H.undershirt && !H.hidden_undershirt) + if(H.saved_undershirt) H.undershirt = H.saved_undershirt - var/datum/sprite_accessory/underwear/top/T = GLOB.undershirt_list[H.undershirt] - if(T) - var/state = "[T.icon_state][((DIGITIGRADE in species_traits) && T.has_digitigrade) ? "_d" : ""]" - var/mutable_appearance/MA - if(H.dna.species.sexes && H.dna.features["body_model"] == FEMALE) - MA = wear_female_version(state, T.icon, BODY_LAYER) - else - MA = mutable_appearance(T.icon, state, -BODY_LAYER) - if(T.has_color) - MA.color = "#[H.shirt_color]" - standing += MA + H.saved_undershirt = "" + var/datum/sprite_accessory/underwear/top/T = GLOB.undershirt_list[H.undershirt] + if(T) + var/state = "[T.icon_state][((DIGITIGRADE in species_traits) && T.has_digitigrade) ? "_d" : ""]" + var/mutable_appearance/MA + if(H.dna.species.sexes && H.dna.features["body_model"] == FEMALE) + MA = wear_female_version(state, T.icon, BODY_LAYER) + else + MA = mutable_appearance(T.icon, state, -BODY_LAYER) + if(T.has_color) + MA.color = "#[H.shirt_color]" + standing += MA if(standing.len) H.overlays_standing[BODY_LAYER] = standing diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index e344ba5304..cb603dee90 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -57,10 +57,12 @@ There are several things that need to be remembered: 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) dna.species.handle_body(src) ..() + if(update_genitals) + update_genitals() /mob/living/carbon/human/update_fire() ..((fire_stacks > 3) ? "Standing" : "Generic_mob_burning") @@ -72,7 +74,7 @@ There are several things that need to be remembered: if(!..()) icon_render_key = null //invalidate bodyparts cache - update_body() + update_body(TRUE) update_hair() update_inv_w_uniform() update_inv_wear_id() diff --git a/modular_citadel/code/modules/arousal/arousal.dm b/modular_citadel/code/modules/arousal/arousal.dm index 5c7d5a39e9..843672877e 100644 --- a/modular_citadel/code/modules/arousal/arousal.dm +++ b/modular_citadel/code/modules/arousal/arousal.dm @@ -33,7 +33,7 @@ hidden_underwear = 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 diff --git a/modular_citadel/code/modules/arousal/genitals.dm b/modular_citadel/code/modules/arousal/genitals.dm index 6f0588f76e..7705dcafd1 100644 --- a/modular_citadel/code/modules/arousal/genitals.dm +++ b/modular_citadel/code/modules/arousal/genitals.dm @@ -41,6 +41,9 @@ return update_size() 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)) 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 /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 - 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 = H.hidden_undershirt ? null : GLOB.undershirt_list[H.undershirt] + var/datum/sprite_accessory/underwear/bottom/B = H.hidden_underwear ? null : GLOB.underwear_list[H.underwear] + if(zone == BODY_ZONE_CHEST ? (T?.covers_chest || B?.covers_chest) : (T?.covers_groin || B?.covers_groin)) + return FALSE + if(genital_flags & GENITAL_THROUGH_CLOTHES) return TRUE switch(zone) //update as more genitals are added @@ -60,25 +70,21 @@ if(BODY_ZONE_PRECISE_GROIN) 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) + if(owner) + owner.exposed_genitals -= src switch(visibility) - if("Always visible") - ENABLE_BITFIELD(genital_flags, GENITAL_THROUGH_CLOTHES) - DISABLE_BITFIELD(genital_flags, GENITAL_HIDDEN) - if(!(src in owner.exposed_genitals)) + if(GEN_VISIBLE_ALWAYS) + genital_flags |= GENITAL_THROUGH_CLOTHES + if(owner) owner.exposed_genitals += src - if("Hidden by clothes") - DISABLE_BITFIELD(genital_flags, GENITAL_THROUGH_CLOTHES) - 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(GEN_VISIBLE_NO_UNDIES) + genital_flags |= GENITAL_UNDIES_HIDDEN + if(GEN_VISIBLE_NEVER) + genital_flags |= GENITAL_HIDDEN - if(ishuman(owner)) //recast to use update genitals proc + if(update && owner && ishuman(owner)) //recast to use update genitals proc var/mob/living/carbon/human/H = owner H.update_genitals() @@ -87,6 +93,10 @@ 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, "You can toggle genitals visibility right now...") + return + var/list/genital_list = list() for(var/obj/item/organ/genital/G in internal_organs) if(!CHECK_BITFIELD(G.genital_flags, GENITAL_INTERNAL)) @@ -95,10 +105,11 @@ return //Full list of exposable genitals created var/obj/item/organ/genital/picked_organ - picked_organ = input(src, "Choose which genitalia to expose/hide", "Expose/Hide genitals", null) in genital_list - if(picked_organ) - var/picked_visibility = input(src, "Choose visibility setting", "Expose/Hide genitals", "Hidden by clothes") in list("Always visible", "Hidden by clothes", "Always hidden") - picked_organ.toggle_visibility(picked_visibility) + 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/picked_visibility = input(src, "Choose visibility setting", "Expose/Hide genitals") as null|anything in GLOB.genitals_visibility_toggles + if(picked_visibility && picked_organ && (picked_organ in internal_organs)) + picked_organ.toggle_visibility(picked_visibility) return /mob/living/carbon/verb/toggle_arousal_state() @@ -182,14 +193,19 @@ if(.) update() RegisterSignal(owner, COMSIG_MOB_DEATH, .proc/update_appearance) + if(genital_flags & GENITAL_THROUGH_CLOTHES) + owner.exposed_genitals += src /obj/item/organ/genital/Remove(special = FALSE) . = ..() - var/mob/living/carbon/human/H = . + var/mob/living/carbon/C = . update() - if(!QDELETED(H)) - UnregisterSignal(H, COMSIG_MOB_DEATH) - H.update_genitals() + if(!QDELETED(C)) + if(genital_flags & UPDATE_OWNER_APPEARANCE && ishuman(C)) + var/mob/living/carbon/human/H = . + H.update_genitals() + C.exposed_genitals -= src + UnregisterSignal(C, COMSIG_MOB_DEATH) //proc to give a player their genitals and stuff when they log in /mob/living/carbon/human/proc/give_genitals(clean = FALSE)//clean will remove all pre-existing genitals. proc will then give them any genitals that are enabled in their DNA @@ -306,9 +322,9 @@ 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 && G.genital_flags & GENITAL_THROUGH_CLOTHES) genital_overlay.layer = -GENITALS_EXPOSED_LAYER - LAZYADD(fully_exposed, genital_overlay) // to be added to a layer with higher priority than clothes, hence the name of the bitflag. + LAZYADD(fully_exposed, genital_overlay) else genital_overlay.layer = -layers_num[layer] standing += genital_overlay diff --git a/modular_citadel/code/modules/arousal/genitals_sprite_accessories.dm b/modular_citadel/code/modules/arousal/genitals_sprite_accessories.dm index 07453facdf..92c643c4bd 100644 --- a/modular_citadel/code/modules/arousal/genitals_sprite_accessories.dm +++ b/modular_citadel/code/modules/arousal/genitals_sprite_accessories.dm @@ -74,13 +74,9 @@ name = "testicle" //the preview name of the accessory color_src = "balls_color" -/datum/sprite_accessory/testicles/hidden - icon_state = "none" - name = "Hidden" - /datum/sprite_accessory/testicles/single icon_state = "single" - name = "Single" + name = "Single" //Single as "single pair", for clarity. //Vaginas /datum/sprite_accessory/vagina diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index bfa506da6d..8183ba92bc 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -12,7 +12,7 @@ fluid_id = /datum/reagent/consumable/milk fluid_rate = MILK_RATE 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" arousal_verb = "Your breasts start feeling sensitive" unarousal_verb = "Your breasts no longer feel sensitive" @@ -64,9 +64,6 @@ icon_state += "_s" else 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. //maximum wah @@ -133,6 +130,7 @@ cached_size = size size = breast_values[size] prev_size = cached_size + toggle_visibility(D.features["breasts_visibility"], FALSE) #undef BREASTS_ICON_MIN_SIZE #undef BREASTS_ICON_MAX_SIZE \ No newline at end of file diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index 294ac6c877..ded05134a9 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -8,7 +8,7 @@ masturbation_verb = "stroke" arousal_verb = "You pop a boner" 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 fluid_transfer_factor = 0.5 shape = DEF_COCK_SHAPE @@ -66,9 +66,9 @@ if(owner) if (round(length) > round(prev_length)) - to_chat(owner, "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.") + to_chat(owner, "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.") else if ((round(length) < round(prev_length)) && (length > 0.5)) - to_chat(owner, "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.") + to_chat(owner, "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.") 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? @@ -89,9 +89,6 @@ icon_state += "_s" else 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) var/datum/dna/D = H.dna @@ -103,3 +100,4 @@ diameter_ratio = D.features["cock_diameter_ratio"] shape = D.features["cock_shape"] prev_length = length + toggle_visibility(D.features["cock_visibility"], FALSE) \ No newline at end of file diff --git a/modular_citadel/code/modules/arousal/organs/testicles.dm b/modular_citadel/code/modules/arousal/organs/testicles.dm index cf4480ff1f..4264cf5e48 100644 --- a/modular_citadel/code/modules/arousal/organs/testicles.dm +++ b/modular_citadel/code/modules/arousal/organs/testicles.dm @@ -9,7 +9,7 @@ arousal_verb = "Your balls ache a little" unarousal_verb = "Your balls finally stop aching, again" 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" shape = DEF_BALLS_SHAPE fluid_id = /datum/reagent/consumable/semen @@ -53,9 +53,6 @@ icon_state += "_s" else 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) var/datum/dna/D = H.dna @@ -64,8 +61,7 @@ else color = "#[D.features["balls_color"]]" 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_mult = D.features["balls_cum_mult"] fluid_efficiency = D.features["balls_efficiency"] + toggle_visibility(D.features["balls_visibility"], FALSE) \ No newline at end of file diff --git a/modular_citadel/code/modules/arousal/organs/vagina.dm b/modular_citadel/code/modules/arousal/organs/vagina.dm index 91c3b8b8e9..f7e8eddcbd 100644 --- a/modular_citadel/code/modules/arousal/organs/vagina.dm +++ b/modular_citadel/code/modules/arousal/organs/vagina.dm @@ -7,7 +7,7 @@ slot = "vagina" size = 1 //There is only 1 size right now 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" arousal_verb = "You feel wetness on your crotch" unarousal_verb = "You no longer feel wet" @@ -70,3 +70,4 @@ else color = "[D.features["vag_color"]]" shape = "[D.features["vag_shape"]]" + toggle_visibility(D.features["vag_visibility"], FALSE) diff --git a/modular_citadel/code/modules/client/preferences.dm b/modular_citadel/code/modules/client/preferences.dm index f1dbe31d02..8c55f2d9a8 100644 --- a/modular_citadel/code/modules/client/preferences.dm +++ b/modular_citadel/code/modules/client/preferences.dm @@ -45,9 +45,3 @@ else if(L[slot_to_string(slot)] < DEFAULT_SLOT_AMT) return TRUE - -/datum/preferences/copy_to(mob/living/carbon/human/character, icon_updates = 1) - ..() - character.give_genitals(TRUE) - if(icon_updates) - character.update_genitals() diff --git a/modular_citadel/code/modules/client/preferences_savefile.dm b/modular_citadel/code/modules/client/preferences_savefile.dm index 80e20c9f48..d9b902656f 100644 --- a/modular_citadel/code/modules/client/preferences_savefile.dm +++ b/modular_citadel/code/modules/client/preferences_savefile.dm @@ -44,29 +44,6 @@ WRITE_FILE(S["feature_xeno_tail"], features["xenotail"]) WRITE_FILE(S["feature_xeno_dors"], features["xenodorsal"]) WRITE_FILE(S["feature_xeno_head"], features["xenohead"]) - //cock features - WRITE_FILE(S["feature_has_cock"], features["has_cock"]) - WRITE_FILE(S["feature_cock_shape"], features["cock_shape"]) - WRITE_FILE(S["feature_cock_color"], features["cock_color"]) - WRITE_FILE(S["feature_cock_length"], features["cock_length"]) - WRITE_FILE(S["feature_cock_girth"], features["cock_girth"]) - //balls features - WRITE_FILE(S["feature_has_balls"], features["has_balls"]) - WRITE_FILE(S["feature_balls_color"], features["balls_color"]) - WRITE_FILE(S["feature_balls_size"], features["balls_size"]) - WRITE_FILE(S["feature_balls_shape"], features["balls_shape"]) - //breasts features - WRITE_FILE(S["feature_has_breasts"], features["has_breasts"]) - WRITE_FILE(S["feature_breasts_size"], features["breasts_size"]) - WRITE_FILE(S["feature_breasts_shape"], features["breasts_shape"]) - WRITE_FILE(S["feature_breasts_color"], features["breasts_color"]) - WRITE_FILE(S["feature_breasts_producing"], features["breasts_producing"]) - //vagina features - WRITE_FILE(S["feature_has_vag"], features["has_vag"]) - WRITE_FILE(S["feature_vag_shape"], features["vag_shape"]) - WRITE_FILE(S["feature_vag_color"], features["vag_color"]) - //womb features - WRITE_FILE(S["feature_has_womb"], features["has_womb"]) //flavor text WRITE_FILE(S["feature_flavor_text"], features["flavor_text"])