Merge pull request #8517 from Poojawa/shitcode-is-so-bad-and-people-like-it-I-guess
Adds visible balls and multi-breasts
@@ -33,8 +33,8 @@
|
|||||||
#define BALLS_VOLUME_MULT 1
|
#define BALLS_VOLUME_MULT 1
|
||||||
|
|
||||||
#define BALLS_SIZE_MIN 1
|
#define BALLS_SIZE_MIN 1
|
||||||
#define BALLS_SIZE_DEF 3
|
#define BALLS_SIZE_DEF 2
|
||||||
#define BALLS_SIZE_MAX 7
|
#define BALLS_SIZE_MAX 3
|
||||||
|
|
||||||
#define BALLS_SACK_SIZE_MIN 1
|
#define BALLS_SACK_SIZE_MIN 1
|
||||||
#define BALLS_SACK_SIZE_DEF 8
|
#define BALLS_SACK_SIZE_DEF 8
|
||||||
|
|||||||
@@ -58,8 +58,11 @@ GLOBAL_LIST_EMPTY(ipc_antennas_list)
|
|||||||
//Genitals and Arousal Lists
|
//Genitals and Arousal Lists
|
||||||
GLOBAL_LIST_EMPTY(cock_shapes_list)//global_lists.dm for the list initializations //Now also _DATASTRUCTURES globals.dm
|
GLOBAL_LIST_EMPTY(cock_shapes_list)//global_lists.dm for the list initializations //Now also _DATASTRUCTURES globals.dm
|
||||||
GLOBAL_LIST_EMPTY(cock_shapes_icons) //Associated list for names->icon_states for cockshapes.
|
GLOBAL_LIST_EMPTY(cock_shapes_icons) //Associated list for names->icon_states for cockshapes.
|
||||||
|
GLOBAL_LIST_EMPTY(balls_shapes_list)
|
||||||
|
GLOBAL_LIST_EMPTY(balls_shapes_icons)
|
||||||
GLOBAL_LIST_EMPTY(breasts_size_list)
|
GLOBAL_LIST_EMPTY(breasts_size_list)
|
||||||
GLOBAL_LIST_EMPTY(breasts_shapes_list)
|
GLOBAL_LIST_EMPTY(breasts_shapes_list)
|
||||||
|
GLOBAL_LIST_EMPTY(breasts_shapes_icons)
|
||||||
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
|
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(dick_nouns, list("dick","cock","member","shaft"))
|
||||||
@@ -123,36 +126,36 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE)
|
|||||||
/mob/living/carbon/proc/has_penis()
|
/mob/living/carbon/proc/has_penis()
|
||||||
if(getorganslot("penis"))//slot shared with ovipositor
|
if(getorganslot("penis"))//slot shared with ovipositor
|
||||||
if(istype(getorganslot("penis"), /obj/item/organ/genital/penis))
|
if(istype(getorganslot("penis"), /obj/item/organ/genital/penis))
|
||||||
return 1
|
return TRUE
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
/mob/living/carbon/proc/has_balls()
|
/mob/living/carbon/proc/has_balls()
|
||||||
if(getorganslot("balls"))
|
if(getorganslot("balls"))
|
||||||
if(istype(getorganslot("balls"), /obj/item/organ/genital/testicles))
|
if(istype(getorganslot("balls"), /obj/item/organ/genital/testicles))
|
||||||
return 1
|
return TRUE
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
/mob/living/carbon/proc/has_vagina()
|
/mob/living/carbon/proc/has_vagina()
|
||||||
if(getorganslot("vagina"))
|
if(getorganslot("vagina"))
|
||||||
return 1
|
return TRUE
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
/mob/living/carbon/proc/has_breasts()
|
/mob/living/carbon/proc/has_breasts()
|
||||||
if(getorganslot("breasts"))
|
if(getorganslot("breasts"))
|
||||||
return 1
|
return TRUE
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
/mob/living/carbon/proc/has_ovipositor()
|
/mob/living/carbon/proc/has_ovipositor()
|
||||||
if(getorganslot("penis"))//shared slot
|
if(getorganslot("penis"))//shared slot
|
||||||
if(istype(getorganslot("penis"), /obj/item/organ/genital/ovipositor))
|
if(istype(getorganslot("penis"), /obj/item/organ/genital/ovipositor))
|
||||||
return 1
|
return TRUE
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
/mob/living/carbon/human/proc/has_eggsack()
|
/mob/living/carbon/human/proc/has_eggsack()
|
||||||
if(getorganslot("balls"))
|
if(getorganslot("balls"))
|
||||||
if(istype(getorganslot("balls"), /obj/item/organ/genital/eggsack))
|
if(istype(getorganslot("balls"), /obj/item/organ/genital/eggsack))
|
||||||
return 1
|
return TRUE
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
/mob/living/carbon/human/proc/is_bodypart_exposed(bodypart)
|
/mob/living/carbon/human/proc/is_bodypart_exposed(bodypart)
|
||||||
|
|
||||||
@@ -161,16 +164,16 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE)
|
|||||||
L = get_equipped_items()
|
L = get_equipped_items()
|
||||||
for(var/obj/item/I in L)
|
for(var/obj/item/I in L)
|
||||||
if(I.body_parts_covered & GROIN)
|
if(I.body_parts_covered & GROIN)
|
||||||
return 0
|
return FALSE
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
/mob/living/carbon/proc/is_chest_exposed(var/list/L)
|
/mob/living/carbon/proc/is_chest_exposed(var/list/L)
|
||||||
if(!L)
|
if(!L)
|
||||||
L = get_equipped_items()
|
L = get_equipped_items()
|
||||||
for(var/obj/item/I in L)
|
for(var/obj/item/I in L)
|
||||||
if(I.body_parts_covered & CHEST)
|
if(I.body_parts_covered & CHEST)
|
||||||
return 0
|
return FALSE
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
////////////////////////
|
////////////////////////
|
||||||
//DANGER | DEBUG PROCS//
|
//DANGER | DEBUG PROCS//
|
||||||
@@ -191,40 +194,3 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE)
|
|||||||
H.give_vagina()
|
H.give_vagina()
|
||||||
H.give_womb()
|
H.give_womb()
|
||||||
H.give_breasts()
|
H.give_breasts()
|
||||||
|
|
||||||
/client/proc/test_mammal_overlays()
|
|
||||||
set name = "Mass Give Mammalitus"
|
|
||||||
set category = "Dangerous"
|
|
||||||
set desc = "Turns every human into a mammal with tails, ears, etc. WARNING: NOT FOR LIVE SERVER USAGE!!"
|
|
||||||
|
|
||||||
log_admin("[src] turned everyone into mammals.")
|
|
||||||
message_admins("[src] turned everyone into mammals.")
|
|
||||||
for(var/mob/living/carbon/human/H in GLOB.mob_list)
|
|
||||||
if(!H.dna)
|
|
||||||
continue
|
|
||||||
var/datum/dna/hdna = H.dna
|
|
||||||
H.set_species(/datum/species/mammal)
|
|
||||||
var/subspec = pick("Fox","Wolf","Fennec")
|
|
||||||
switch(subspec)
|
|
||||||
if("Wolf")
|
|
||||||
hdna.features["mam_tail"] = "Wolf"
|
|
||||||
hdna.features["mam_ears"] = "Wolf"
|
|
||||||
hdna.features["mam_snouts"] = "Wolf"
|
|
||||||
hdna.features["mam_body_markings"] = "Wolf"
|
|
||||||
hdna.features["mcolor"] = "555"
|
|
||||||
hdna.features["mcolor2"] = "999"
|
|
||||||
hdna.features["mcolor3"] = "999"
|
|
||||||
if("Fox")
|
|
||||||
hdna.features["mam_tail"] = "Fox"
|
|
||||||
hdna.features["mam_ears"] = "Fox"
|
|
||||||
hdna.features["mam_snouts"] = "Fox, Long"
|
|
||||||
hdna.features["mam_body_markings"] = "Fox"
|
|
||||||
hdna.features["mcolor"] = "f60"
|
|
||||||
hdna.features["mcolor2"] = "fff"
|
|
||||||
hdna.features["mcolor3"] = "fff"
|
|
||||||
if("Fennec")
|
|
||||||
hdna.features["mam_tail"] = "Fennec"
|
|
||||||
hdna.features["mam_ears"] = "Fennec"
|
|
||||||
hdna.features["mam_snouts"] = "Fox, Short"
|
|
||||||
hdna.features["mam_body_markings"] = "Fox"
|
|
||||||
H.regenerate_icons()
|
|
||||||
|
|||||||
@@ -46,7 +46,6 @@
|
|||||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/xeno_dorsal, GLOB.xeno_dorsal_list)
|
init_sprite_accessory_subtypes(/datum/sprite_accessory/xeno_dorsal, GLOB.xeno_dorsal_list)
|
||||||
//genitals
|
//genitals
|
||||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/penis, GLOB.cock_shapes_list)
|
init_sprite_accessory_subtypes(/datum/sprite_accessory/penis, GLOB.cock_shapes_list)
|
||||||
|
|
||||||
for(var/K in GLOB.cock_shapes_list)
|
for(var/K in GLOB.cock_shapes_list)
|
||||||
var/datum/sprite_accessory/penis/value = GLOB.cock_shapes_list[K]
|
var/datum/sprite_accessory/penis/value = GLOB.cock_shapes_list[K]
|
||||||
GLOB.cock_shapes_icons[K] = value.icon_state
|
GLOB.cock_shapes_icons[K] = value.icon_state
|
||||||
@@ -54,6 +53,14 @@
|
|||||||
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)
|
||||||
GLOB.breasts_size_list = list("a","b","c","d","e") //We need the list to choose from initialized, but it's no longer a sprite_accessory thing.
|
GLOB.breasts_size_list = list("a","b","c","d","e") //We need the list to choose from initialized, but it's no longer a sprite_accessory thing.
|
||||||
|
for(var/K in GLOB.breasts_shapes_list)
|
||||||
|
var/datum/sprite_accessory/breasts/value = GLOB.breasts_shapes_list[K]
|
||||||
|
GLOB.breasts_shapes_icons[K] = value.icon_state
|
||||||
|
|
||||||
|
init_sprite_accessory_subtypes(/datum/sprite_accessory/testicles, GLOB.balls_shapes_list)
|
||||||
|
for(var/K in GLOB.balls_shapes_list)
|
||||||
|
var/datum/sprite_accessory/testicles/value = GLOB.balls_shapes_list[K]
|
||||||
|
GLOB.balls_shapes_icons[K] = value.icon_state
|
||||||
//END OF CIT CHANGES
|
//END OF CIT CHANGES
|
||||||
|
|
||||||
//Species
|
//Species
|
||||||
|
|||||||
@@ -77,6 +77,8 @@
|
|||||||
//CIT CHANGES - genitals and such
|
//CIT CHANGES - genitals and such
|
||||||
if(!GLOB.cock_shapes_list.len)
|
if(!GLOB.cock_shapes_list.len)
|
||||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/penis, GLOB.cock_shapes_list)
|
init_sprite_accessory_subtypes(/datum/sprite_accessory/penis, GLOB.cock_shapes_list)
|
||||||
|
if(!GLOB.balls_shapes_list.len)
|
||||||
|
init_sprite_accessory_subtypes(/datum/sprite_accessory/testicles, GLOB.balls_shapes_list)
|
||||||
if(!GLOB.vagina_shapes_list.len)
|
if(!GLOB.vagina_shapes_list.len)
|
||||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/vagina, GLOB.vagina_shapes_list)
|
init_sprite_accessory_subtypes(/datum/sprite_accessory/vagina, GLOB.vagina_shapes_list)
|
||||||
if(!GLOB.breasts_shapes_list.len)
|
if(!GLOB.breasts_shapes_list.len)
|
||||||
@@ -168,6 +170,7 @@
|
|||||||
"balls_amount" = 2,
|
"balls_amount" = 2,
|
||||||
"balls_sack_size" = BALLS_SACK_SIZE_DEF,
|
"balls_sack_size" = BALLS_SACK_SIZE_DEF,
|
||||||
"balls_size" = BALLS_SIZE_DEF,
|
"balls_size" = BALLS_SIZE_DEF,
|
||||||
|
"balls_shape" = "Pair",
|
||||||
"balls_cum_rate" = CUM_RATE,
|
"balls_cum_rate" = CUM_RATE,
|
||||||
"balls_cum_mult" = CUM_RATE_MULT,
|
"balls_cum_mult" = CUM_RATE_MULT,
|
||||||
"balls_efficiency" = CUM_EFFICIENCY,
|
"balls_efficiency" = CUM_EFFICIENCY,
|
||||||
@@ -185,7 +188,7 @@
|
|||||||
"has_breasts" = FALSE,
|
"has_breasts" = FALSE,
|
||||||
"breasts_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
|
"breasts_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
|
||||||
"breasts_size" = pick(GLOB.breasts_size_list),
|
"breasts_size" = pick(GLOB.breasts_size_list),
|
||||||
"breasts_shape" = pick(GLOB.breasts_shapes_list),
|
"breasts_shape" = "Pair",
|
||||||
"breasts_fluid" = "milk",
|
"breasts_fluid" = "milk",
|
||||||
"has_vag" = FALSE,
|
"has_vag" = FALSE,
|
||||||
"vag_shape" = pick(GLOB.vagina_shapes_list),
|
"vag_shape" = pick(GLOB.vagina_shapes_list),
|
||||||
|
|||||||
@@ -117,6 +117,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
|||||||
"balls_color" = "fff",
|
"balls_color" = "fff",
|
||||||
"balls_amount" = 2,
|
"balls_amount" = 2,
|
||||||
"balls_sack_size" = BALLS_SACK_SIZE_DEF,
|
"balls_sack_size" = BALLS_SACK_SIZE_DEF,
|
||||||
|
"balls_shape" = "Single",
|
||||||
"balls_size" = BALLS_SIZE_DEF,
|
"balls_size" = BALLS_SIZE_DEF,
|
||||||
"balls_cum_rate" = CUM_RATE,
|
"balls_cum_rate" = CUM_RATE,
|
||||||
"balls_cum_mult" = CUM_RATE_MULT,
|
"balls_cum_mult" = CUM_RATE_MULT,
|
||||||
@@ -701,6 +702,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
|||||||
else
|
else
|
||||||
dat += "<b>Testicles Color:</b>"
|
dat += "<b>Testicles Color:</b>"
|
||||||
dat += "<span style='border: 1px solid #161616; background-color: #[features["balls_color"]];'> </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"]];'> </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 += APPEARANCE_CATEGORY_COLUMN
|
dat += APPEARANCE_CATEGORY_COLUMN
|
||||||
dat += "<b>Has Vagina:</b>"
|
dat += "<b>Has Vagina:</b>"
|
||||||
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>"
|
||||||
@@ -1836,7 +1838,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
|||||||
else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3])
|
else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3])
|
||||||
features["cock_color"] = sanitize_hexcolor(new_cockcolor)
|
features["cock_color"] = sanitize_hexcolor(new_cockcolor)
|
||||||
else
|
else
|
||||||
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("cock_length")
|
if("cock_length")
|
||||||
var/new_length = input(user, "Penis length in inches:\n([COCK_SIZE_MIN]-[COCK_SIZE_MAX])", "Character Preference") as num|null
|
var/new_length = input(user, "Penis length in inches:\n([COCK_SIZE_MIN]-[COCK_SIZE_MAX])", "Character Preference") as num|null
|
||||||
@@ -1858,7 +1860,13 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
|||||||
else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3])
|
else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3])
|
||||||
features["balls_color"] = sanitize_hexcolor(new_ballscolor)
|
features["balls_color"] = sanitize_hexcolor(new_ballscolor)
|
||||||
else
|
else
|
||||||
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")
|
||||||
|
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("egg_size")
|
if("egg_size")
|
||||||
var/new_size
|
var/new_size
|
||||||
@@ -1874,7 +1882,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
|||||||
if(ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3])
|
if(ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3])
|
||||||
features["eggsack_egg_color"] = sanitize_hexcolor(new_egg_color)
|
features["eggsack_egg_color"] = sanitize_hexcolor(new_egg_color)
|
||||||
else
|
else
|
||||||
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_size")
|
if("breasts_size")
|
||||||
var/new_size
|
var/new_size
|
||||||
@@ -1897,7 +1905,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
|||||||
else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3])
|
else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3])
|
||||||
features["breasts_color"] = sanitize_hexcolor(new_breasts_color)
|
features["breasts_color"] = sanitize_hexcolor(new_breasts_color)
|
||||||
else
|
else
|
||||||
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_shape")
|
if("vag_shape")
|
||||||
var/new_shape
|
var/new_shape
|
||||||
@@ -1914,7 +1922,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
|||||||
else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3])
|
else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3])
|
||||||
features["vag_color"] = sanitize_hexcolor(new_vagcolor)
|
features["vag_color"] = sanitize_hexcolor(new_vagcolor)
|
||||||
else
|
else
|
||||||
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("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
|
||||||
|
|||||||
@@ -330,6 +330,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
|||||||
S["feature_has_balls"] >> features["has_balls"]
|
S["feature_has_balls"] >> features["has_balls"]
|
||||||
S["feature_balls_color"] >> features["balls_color"]
|
S["feature_balls_color"] >> features["balls_color"]
|
||||||
S["feature_balls_size"] >> features["balls_size"]
|
S["feature_balls_size"] >> features["balls_size"]
|
||||||
|
S["feature_balls_shape"] >> features["balls_shape"]
|
||||||
S["feature_balls_sack_size"] >> features["balls_sack_size"]
|
S["feature_balls_sack_size"] >> features["balls_sack_size"]
|
||||||
S["feature_balls_fluid"] >> features["balls_fluid"]
|
S["feature_balls_fluid"] >> features["balls_fluid"]
|
||||||
//breasts features
|
//breasts features
|
||||||
|
|||||||
@@ -97,6 +97,7 @@
|
|||||||
brutemod = 0.9
|
brutemod = 0.9
|
||||||
|
|
||||||
/datum/species/lizard/ashwalker/on_species_gain(mob/living/carbon/human/C, datum/species/old_species)
|
/datum/species/lizard/ashwalker/on_species_gain(mob/living/carbon/human/C, datum/species/old_species)
|
||||||
if((C.dna.features["spines"] != "None" ) && (C.dna.features["tail"] == "None")) //tbh, it's kinda ugly for them not to have a tail yet have floating spines
|
if((C.dna.features["spines"] != "None" ) && (C.dna.features["tail_lizard"] == "None")) //tbh, it's kinda ugly for them not to have a tail yet have floating spines
|
||||||
C.dna.features["tail"] = "Smooth"
|
C.dna.features["tail_lizard"] = "Smooth"
|
||||||
|
C.update_body()
|
||||||
return ..()
|
return ..()
|
||||||
|
|||||||
@@ -40,7 +40,7 @@
|
|||||||
adjustArousalLoss(arousal_rate * S.arousal_gain_rate)
|
adjustArousalLoss(arousal_rate * S.arousal_gain_rate)
|
||||||
if(dna.features["exhibitionist"] && client)
|
if(dna.features["exhibitionist"] && client)
|
||||||
var/amt_nude = 0
|
var/amt_nude = 0
|
||||||
if(is_chest_exposed() && (gender == FEMALE || getorganslot("breasts")))
|
if(is_chest_exposed() && (getorganslot("breasts")))
|
||||||
amt_nude++
|
amt_nude++
|
||||||
if(is_groin_exposed())
|
if(is_groin_exposed())
|
||||||
if(getorganslot("penis"))
|
if(getorganslot("penis"))
|
||||||
@@ -64,14 +64,14 @@
|
|||||||
|
|
||||||
/mob/living/proc/adjustArousalLoss(amount, updating_arousal=1)
|
/mob/living/proc/adjustArousalLoss(amount, updating_arousal=1)
|
||||||
if(status_flags & GODMODE || !canbearoused)
|
if(status_flags & GODMODE || !canbearoused)
|
||||||
return 0
|
return FALSE
|
||||||
arousalloss = CLAMP(arousalloss + amount, min_arousal, max_arousal)
|
arousalloss = CLAMP(arousalloss + amount, min_arousal, max_arousal)
|
||||||
if(updating_arousal)
|
if(updating_arousal)
|
||||||
updatearousal()
|
updatearousal()
|
||||||
|
|
||||||
/mob/living/proc/setArousalLoss(amount, updating_arousal=1)
|
/mob/living/proc/setArousalLoss(amount, updating_arousal=1)
|
||||||
if(status_flags & GODMODE || !canbearoused)
|
if(status_flags & GODMODE || !canbearoused)
|
||||||
return 0
|
return FALSE
|
||||||
arousalloss = CLAMP(amount, min_arousal, max_arousal)
|
arousalloss = CLAMP(amount, min_arousal, max_arousal)
|
||||||
if(updating_arousal)
|
if(updating_arousal)
|
||||||
updatearousal()
|
updatearousal()
|
||||||
@@ -99,6 +99,8 @@
|
|||||||
switch(G.type)
|
switch(G.type)
|
||||||
if(/obj/item/organ/genital/penis)
|
if(/obj/item/organ/genital/penis)
|
||||||
S = GLOB.cock_shapes_list[G.shape]
|
S = GLOB.cock_shapes_list[G.shape]
|
||||||
|
if(/obj/item/organ/genital/testicles)
|
||||||
|
S = GLOB.balls_shapes_list[G.shape]
|
||||||
if(/obj/item/organ/genital/vagina)
|
if(/obj/item/organ/genital/vagina)
|
||||||
S = GLOB.vagina_shapes_list[G.shape]
|
S = GLOB.vagina_shapes_list[G.shape]
|
||||||
if(/obj/item/organ/genital/breasts)
|
if(/obj/item/organ/genital/breasts)
|
||||||
@@ -112,54 +114,54 @@
|
|||||||
G.update_appearance()
|
G.update_appearance()
|
||||||
|
|
||||||
/mob/living/proc/update_arousal_hud()
|
/mob/living/proc/update_arousal_hud()
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
/datum/species/proc/update_arousal_hud(mob/living/carbon/human/H)
|
/datum/species/proc/update_arousal_hud(mob/living/carbon/human/H)
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
/mob/living/carbon/human/update_arousal_hud()
|
/mob/living/carbon/human/update_arousal_hud()
|
||||||
if(!client || !hud_used)
|
if(!client || !hud_used)
|
||||||
return 0
|
return FALSE
|
||||||
if(dna.species.update_arousal_hud())
|
if(dna.species.update_arousal_hud())
|
||||||
return 0
|
return FALSE
|
||||||
if(!canbearoused)
|
if(!canbearoused)
|
||||||
hud_used.arousal.icon_state = ""
|
hud_used.arousal.icon_state = ""
|
||||||
return 0
|
return FALSE
|
||||||
else
|
else
|
||||||
if(hud_used.arousal)
|
if(hud_used.arousal)
|
||||||
if(stat == DEAD)
|
if(stat == DEAD)
|
||||||
hud_used.arousal.icon_state = "arousal0"
|
hud_used.arousal.icon_state = "arousal0"
|
||||||
return 1
|
return TRUE
|
||||||
if(getArousalLoss() == max_arousal)
|
if(getArousalLoss() == max_arousal)
|
||||||
hud_used.arousal.icon_state = "arousal100"
|
hud_used.arousal.icon_state = "arousal100"
|
||||||
return 1
|
return TRUE
|
||||||
if(getArousalLoss() >= (max_arousal / 100) * 90)//M O D U L A R , W O W
|
if(getArousalLoss() >= (max_arousal / 100) * 90)//M O D U L A R , W O W
|
||||||
hud_used.arousal.icon_state = "arousal90"
|
hud_used.arousal.icon_state = "arousal90"
|
||||||
return 1
|
return TRUE
|
||||||
if(getArousalLoss() >= (max_arousal / 100) * 80)//M O D U L A R , W O W
|
if(getArousalLoss() >= (max_arousal / 100) * 80)//M O D U L A R , W O W
|
||||||
hud_used.arousal.icon_state = "arousal80"
|
hud_used.arousal.icon_state = "arousal80"
|
||||||
return 1
|
return TRUE
|
||||||
if(getArousalLoss() >= (max_arousal / 100) * 70)//M O D U L A R , W O W
|
if(getArousalLoss() >= (max_arousal / 100) * 70)//M O D U L A R , W O W
|
||||||
hud_used.arousal.icon_state = "arousal70"
|
hud_used.arousal.icon_state = "arousal70"
|
||||||
return 1
|
return TRUE
|
||||||
if(getArousalLoss() >= (max_arousal / 100) * 60)//M O D U L A R , W O W
|
if(getArousalLoss() >= (max_arousal / 100) * 60)//M O D U L A R , W O W
|
||||||
hud_used.arousal.icon_state = "arousal60"
|
hud_used.arousal.icon_state = "arousal60"
|
||||||
return 1
|
return TRUE
|
||||||
if(getArousalLoss() >= (max_arousal / 100) * 50)//M O D U L A R , W O W
|
if(getArousalLoss() >= (max_arousal / 100) * 50)//M O D U L A R , W O W
|
||||||
hud_used.arousal.icon_state = "arousal50"
|
hud_used.arousal.icon_state = "arousal50"
|
||||||
return 1
|
return TRUE
|
||||||
if(getArousalLoss() >= (max_arousal / 100) * 40)//M O D U L A R , W O W
|
if(getArousalLoss() >= (max_arousal / 100) * 40)//M O D U L A R , W O W
|
||||||
hud_used.arousal.icon_state = "arousal40"
|
hud_used.arousal.icon_state = "arousal40"
|
||||||
return 1
|
return TRUE
|
||||||
if(getArousalLoss() >= (max_arousal / 100) * 30)//M O D U L A R , W O W
|
if(getArousalLoss() >= (max_arousal / 100) * 30)//M O D U L A R , W O W
|
||||||
hud_used.arousal.icon_state = "arousal30"
|
hud_used.arousal.icon_state = "arousal30"
|
||||||
return 1
|
return TRUE
|
||||||
if(getArousalLoss() >= (max_arousal / 100) * 20)//M O D U L A R , W O W
|
if(getArousalLoss() >= (max_arousal / 100) * 20)//M O D U L A R , W O W
|
||||||
hud_used.arousal.icon_state = "arousal10"
|
hud_used.arousal.icon_state = "arousal10"
|
||||||
return 1
|
return TRUE
|
||||||
if(getArousalLoss() >= (max_arousal / 100) * 10)//M O D U L A R , W O W
|
if(getArousalLoss() >= (max_arousal / 100) * 10)//M O D U L A R , W O W
|
||||||
hud_used.arousal.icon_state = "arousal10"
|
hud_used.arousal.icon_state = "arousal10"
|
||||||
return 1
|
return TRUE
|
||||||
else
|
else
|
||||||
hud_used.arousal.icon_state = "arousal0"
|
hud_used.arousal.icon_state = "arousal0"
|
||||||
|
|
||||||
@@ -171,11 +173,11 @@
|
|||||||
|
|
||||||
/obj/screen/arousal/Click()
|
/obj/screen/arousal/Click()
|
||||||
if(!isliving(usr))
|
if(!isliving(usr))
|
||||||
return 0
|
return FALSE
|
||||||
var/mob/living/M = usr
|
var/mob/living/M = usr
|
||||||
if(M.canbearoused)
|
if(M.canbearoused)
|
||||||
M.mob_climax()
|
M.mob_climax()
|
||||||
return 1
|
return TRUE
|
||||||
else
|
else
|
||||||
to_chat(M, "<span class='warning'>Arousal is disabled. Feature is unavailable.</span>")
|
to_chat(M, "<span class='warning'>Arousal is disabled. Feature is unavailable.</span>")
|
||||||
|
|
||||||
@@ -196,13 +198,6 @@
|
|||||||
"<span class='userdanger'>You have relieved yourself.</span>")
|
"<span class='userdanger'>You have relieved yourself.</span>")
|
||||||
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
|
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
|
||||||
setArousalLoss(min_arousal)
|
setArousalLoss(min_arousal)
|
||||||
/*
|
|
||||||
switch(gender)
|
|
||||||
if(MALE)
|
|
||||||
PoolOrNew(/obj/effect/decal/cleanable/semen, loc)
|
|
||||||
if(FEMALE)
|
|
||||||
PoolOrNew(/obj/effect/decal/cleanable/femcum, loc)
|
|
||||||
*/
|
|
||||||
else
|
else
|
||||||
to_chat(src, "<span class='notice'>You aren't aroused enough for that.</span>")
|
to_chat(src, "<span class='notice'>You aren't aroused enough for that.</span>")
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
icon = 'modular_citadel/icons/obj/genitals/breasts.dmi'
|
icon = 'modular_citadel/icons/obj/genitals/breasts.dmi'
|
||||||
zone = "chest"
|
zone = "chest"
|
||||||
slot = "breasts"
|
slot = "breasts"
|
||||||
w_class = 3
|
|
||||||
size = BREASTS_SIZE_DEF
|
size = BREASTS_SIZE_DEF
|
||||||
fluid_id = "milk"
|
fluid_id = "milk"
|
||||||
var/amount = 2
|
var/amount = 2
|
||||||
@@ -14,7 +13,7 @@
|
|||||||
can_masturbate_with = TRUE
|
can_masturbate_with = TRUE
|
||||||
masturbation_verb = "massage"
|
masturbation_verb = "massage"
|
||||||
can_climax = TRUE
|
can_climax = TRUE
|
||||||
fluid_transfer_factor =0.5
|
fluid_transfer_factor = 0.5
|
||||||
|
|
||||||
/obj/item/organ/genital/breasts/Initialize()
|
/obj/item/organ/genital/breasts/Initialize()
|
||||||
. = ..()
|
. = ..()
|
||||||
@@ -40,6 +39,10 @@
|
|||||||
switch(lowershape)
|
switch(lowershape)
|
||||||
if("pair")
|
if("pair")
|
||||||
desc = "You see a pair of breasts."
|
desc = "You see a pair of breasts."
|
||||||
|
if("quad")
|
||||||
|
desc = "You see two pairs of breast, one just under the other."
|
||||||
|
if("sextuple")
|
||||||
|
desc = "You see three sets of breasts, running from their chest to their belly."
|
||||||
else
|
else
|
||||||
desc = "You see some breasts, they seem to be quite exotic."
|
desc = "You see some breasts, they seem to be quite exotic."
|
||||||
if (size)
|
if (size)
|
||||||
@@ -54,13 +57,11 @@
|
|||||||
if(ishuman(owner)) // Check before recasting type, although someone fucked up if you're not human AND have use_skintones somehow...
|
if(ishuman(owner)) // Check before recasting type, although someone fucked up if you're not human AND have use_skintones somehow...
|
||||||
var/mob/living/carbon/human/H = owner // only human mobs have skin_tone, which we need.
|
var/mob/living/carbon/human/H = owner // only human mobs have skin_tone, which we need.
|
||||||
color = "#[skintone2hex(H.skin_tone)]"
|
color = "#[skintone2hex(H.skin_tone)]"
|
||||||
string = "breasts_[lowertext(shape)]_[size]-s"
|
string = "breasts_[GLOB.breasts_shapes_icons[shape]]_[size]-s"
|
||||||
else
|
else
|
||||||
color = "#[owner.dna.features["breasts_color"]]"
|
color = "#[owner.dna.features["breasts_color"]]"
|
||||||
string = "breasts_[lowertext(shape)]_[size]"
|
string = "breasts_[GLOB.breasts_shapes_icons[shape]]_[size]"
|
||||||
if(ishuman(owner))
|
if(ishuman(owner))
|
||||||
var/mob/living/carbon/human/H = owner
|
var/mob/living/carbon/human/H = owner
|
||||||
|
icon_state = sanitize_text(string)
|
||||||
H.update_genitals()
|
H.update_genitals()
|
||||||
|
|
||||||
icon_state = sanitize_text(string)
|
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,6 @@
|
|||||||
zone = "groin"
|
zone = "groin"
|
||||||
slot = "testicles"
|
slot = "testicles"
|
||||||
color = null //don't use the /genital color since it already is colored
|
color = null //don't use the /genital color since it already is colored
|
||||||
w_class = 3
|
|
||||||
internal = TRUE
|
internal = TRUE
|
||||||
var/egg_girth = EGG_GIRTH_DEF
|
var/egg_girth = EGG_GIRTH_DEF
|
||||||
var/cum_mult = CUM_RATE_MULT
|
var/cum_mult = CUM_RATE_MULT
|
||||||
|
|||||||
@@ -1,25 +1,26 @@
|
|||||||
/obj/item/organ/genital
|
/obj/item/organ/genital
|
||||||
color = "#fcccb3"
|
color = "#fcccb3"
|
||||||
var/shape = "human"
|
w_class = WEIGHT_CLASS_NORMAL
|
||||||
var/sensitivity = 1
|
var/shape = "human"
|
||||||
var/list/genital_flags = list()
|
var/sensitivity = AROUSAL_START_VALUE
|
||||||
var/can_masturbate_with = FALSE
|
var/list/genital_flags = list()
|
||||||
var/masturbation_verb = "masturbate"
|
var/can_masturbate_with = FALSE
|
||||||
var/can_climax = FALSE
|
var/masturbation_verb = "masturbate"
|
||||||
var/fluid_transfer_factor = 0.0 //How much would a partner get in them if they climax using this?
|
var/can_climax = FALSE
|
||||||
var/size = 2 //can vary between num or text, just used in icon_state strings
|
var/fluid_transfer_factor = 0.0 //How much would a partner get in them if they climax using this?
|
||||||
var/fluid_id = null
|
var/size = 2 //can vary between num or text, just used in icon_state strings
|
||||||
var/fluid_max_volume = 50
|
var/fluid_id = null
|
||||||
var/fluid_efficiency = 1
|
var/fluid_max_volume = 50
|
||||||
var/fluid_rate = 1
|
var/fluid_efficiency = 1
|
||||||
var/fluid_mult = 1
|
var/fluid_rate = 1
|
||||||
var/producing = FALSE
|
var/fluid_mult = 1
|
||||||
var/aroused_state = FALSE //Boolean used in icon_state strings
|
var/producing = FALSE
|
||||||
var/aroused_amount = 50 //This is a num from 0 to 100 for arousal percentage for when to use arousal state icons.
|
var/aroused_state = FALSE //Boolean used in icon_state strings
|
||||||
|
var/aroused_amount = 50 //This is a num from 0 to 100 for arousal percentage for when to use arousal state icons.
|
||||||
var/obj/item/organ/genital/linked_organ
|
var/obj/item/organ/genital/linked_organ
|
||||||
var/through_clothes = FALSE
|
var/through_clothes = FALSE
|
||||||
var/internal = FALSE
|
var/internal = FALSE
|
||||||
var/hidden = FALSE
|
var/hidden = FALSE
|
||||||
|
|
||||||
/obj/item/organ/genital/Initialize()
|
/obj/item/organ/genital/Initialize()
|
||||||
. = ..()
|
. = ..()
|
||||||
@@ -140,14 +141,14 @@
|
|||||||
if (NOGENITALS in dna.species.species_traits)
|
if (NOGENITALS in dna.species.species_traits)
|
||||||
return
|
return
|
||||||
//Order should be very important. FIRST vagina, THEN testicles, THEN penis, as this affects the order they are rendered in.
|
//Order should be very important. FIRST vagina, THEN testicles, THEN penis, as this affects the order they are rendered in.
|
||||||
if(dna.features["has_breasts"])
|
|
||||||
give_breasts()
|
|
||||||
if(dna.features["has_vag"])
|
if(dna.features["has_vag"])
|
||||||
give_vagina()
|
give_vagina()
|
||||||
if(dna.features["has_womb"])
|
if(dna.features["has_womb"])
|
||||||
give_womb()
|
give_womb()
|
||||||
if(dna.features["has_balls"])
|
if(dna.features["has_balls"])
|
||||||
give_balls()
|
give_balls()
|
||||||
|
if(dna.features["has_breasts"]) // since we have multi-boobs as a thing, we'll want to at least draw over these. but not over the pingas.
|
||||||
|
give_breasts()
|
||||||
if(dna.features["has_cock"])
|
if(dna.features["has_cock"])
|
||||||
give_penis()
|
give_penis()
|
||||||
if(dna.features["has_ovi"])
|
if(dna.features["has_ovi"])
|
||||||
@@ -165,7 +166,7 @@
|
|||||||
P.Insert(src)
|
P.Insert(src)
|
||||||
if(P)
|
if(P)
|
||||||
if(dna.species.use_skintones && dna.features["genitals_use_skintone"])
|
if(dna.species.use_skintones && dna.features["genitals_use_skintone"])
|
||||||
P.color = skintone2hex(skin_tone)
|
P.color = "#[skintone2hex(skin_tone)]"
|
||||||
else
|
else
|
||||||
P.color = "#[dna.features["cock_color"]]"
|
P.color = "#[dna.features["cock_color"]]"
|
||||||
P.length = dna.features["cock_length"]
|
P.length = dna.features["cock_length"]
|
||||||
@@ -181,13 +182,18 @@
|
|||||||
if(!getorganslot("testicles"))
|
if(!getorganslot("testicles"))
|
||||||
var/obj/item/organ/genital/testicles/T = new
|
var/obj/item/organ/genital/testicles/T = new
|
||||||
T.Insert(src)
|
T.Insert(src)
|
||||||
// if(dna.species.use_skintones && dna.features["genitals_use_skintone"])
|
|
||||||
// T.color = skintone2hex(skin_tone)
|
|
||||||
// else
|
|
||||||
// T.color = "#[dna.features["balls_color"]]"
|
|
||||||
if(T)
|
if(T)
|
||||||
|
if(dna.species.use_skintones && dna.features["genitals_use_skintone"])
|
||||||
|
T.color = "#[skintone2hex(skin_tone)]"
|
||||||
|
else
|
||||||
|
T.color = "#[dna.features["balls_color"]]"
|
||||||
T.size = dna.features["balls_size"]
|
T.size = dna.features["balls_size"]
|
||||||
T.sack_size = dna.features["balls_sack_size"]
|
T.sack_size = dna.features["balls_sack_size"]
|
||||||
|
T.shape = dna.features["balls_shape"]
|
||||||
|
if(dna.features["balls_shape"] == "Hidden")
|
||||||
|
T.internal = TRUE
|
||||||
|
else
|
||||||
|
T.internal = FALSE
|
||||||
T.fluid_id = dna.features["balls_fluid"]
|
T.fluid_id = dna.features["balls_fluid"]
|
||||||
T.fluid_rate = dna.features["balls_cum_rate"]
|
T.fluid_rate = dna.features["balls_cum_rate"]
|
||||||
T.fluid_mult = dna.features["balls_cum_mult"]
|
T.fluid_mult = dna.features["balls_cum_mult"]
|
||||||
@@ -204,7 +210,7 @@
|
|||||||
B.Insert(src)
|
B.Insert(src)
|
||||||
if(B)
|
if(B)
|
||||||
if(dna.species.use_skintones && dna.features["genitals_use_skintone"])
|
if(dna.species.use_skintones && dna.features["genitals_use_skintone"])
|
||||||
B.color = skintone2hex(skin_tone)
|
B.color = "#[skintone2hex(skin_tone)]"
|
||||||
else
|
else
|
||||||
B.color = "#[dna.features["breasts_color"]]"
|
B.color = "#[dna.features["breasts_color"]]"
|
||||||
B.size = dna.features["breasts_size"]
|
B.size = dna.features["breasts_size"]
|
||||||
@@ -228,7 +234,7 @@
|
|||||||
V.Insert(src)
|
V.Insert(src)
|
||||||
if(V)
|
if(V)
|
||||||
if(dna.species.use_skintones && dna.features["genitals_use_skintone"])
|
if(dna.species.use_skintones && dna.features["genitals_use_skintone"])
|
||||||
V.color = skintone2hex(skin_tone)
|
V.color = "#[skintone2hex(skin_tone)]"
|
||||||
else
|
else
|
||||||
V.color = "[dna.features["vag_color"]]"
|
V.color = "[dna.features["vag_color"]]"
|
||||||
V.shape = "[dna.features["vag_shape"]]"
|
V.shape = "[dna.features["vag_shape"]]"
|
||||||
@@ -311,6 +317,8 @@
|
|||||||
switch(G.type)
|
switch(G.type)
|
||||||
if(/obj/item/organ/genital/penis)
|
if(/obj/item/organ/genital/penis)
|
||||||
S = GLOB.cock_shapes_list[G.shape]
|
S = GLOB.cock_shapes_list[G.shape]
|
||||||
|
if(/obj/item/organ/genital/testicles)
|
||||||
|
S = GLOB.balls_shapes_list[G.shape]
|
||||||
if(/obj/item/organ/genital/vagina)
|
if(/obj/item/organ/genital/vagina)
|
||||||
S = GLOB.vagina_shapes_list[G.shape]
|
S = GLOB.vagina_shapes_list[G.shape]
|
||||||
if(/obj/item/organ/genital/breasts)
|
if(/obj/item/organ/genital/breasts)
|
||||||
@@ -318,6 +326,7 @@
|
|||||||
|
|
||||||
if(!S || S.icon_state == "none")
|
if(!S || S.icon_state == "none")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
var/mutable_appearance/genital_overlay = mutable_appearance(S.icon, layer = -layer)
|
var/mutable_appearance/genital_overlay = mutable_appearance(S.icon, layer = -layer)
|
||||||
genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size]_[aroused_state]_[layertext]"
|
genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size]_[aroused_state]_[layertext]"
|
||||||
|
|
||||||
@@ -331,12 +340,15 @@
|
|||||||
switch(S.color_src)
|
switch(S.color_src)
|
||||||
if("cock_color")
|
if("cock_color")
|
||||||
genital_overlay.color = "#[H.dna.features["cock_color"]]"
|
genital_overlay.color = "#[H.dna.features["cock_color"]]"
|
||||||
|
if("balls_color")
|
||||||
|
genital_overlay.color = "#[H.dna.features["balls_color"]]"
|
||||||
if("breasts_color")
|
if("breasts_color")
|
||||||
genital_overlay.color = "#[H.dna.features["breasts_color"]]"
|
genital_overlay.color = "#[H.dna.features["breasts_color"]]"
|
||||||
if("vag_color")
|
if("vag_color")
|
||||||
genital_overlay.color = "#[H.dna.features["vag_color"]]"
|
genital_overlay.color = "#[H.dna.features["vag_color"]]"
|
||||||
|
|
||||||
standing += genital_overlay
|
standing += genital_overlay
|
||||||
|
|
||||||
if(LAZYLEN(standing))
|
if(LAZYLEN(standing))
|
||||||
H.overlays_standing[layer] = standing.Copy()
|
H.overlays_standing[layer] = standing.Copy()
|
||||||
standing = list()
|
standing = list()
|
||||||
|
|||||||
@@ -55,8 +55,24 @@
|
|||||||
center = TRUE //Center the image 'cause 2-tile wide.
|
center = TRUE //Center the image 'cause 2-tile wide.
|
||||||
dimension_x = 64
|
dimension_x = 64
|
||||||
|
|
||||||
|
//Testicles
|
||||||
|
//These ones aren't inert
|
||||||
|
/datum/sprite_accessory/testicles
|
||||||
|
icon = 'modular_citadel/icons/obj/genitals/testicles_onmob.dmi'
|
||||||
|
icon_state = "testicle"
|
||||||
|
name = "testicle" //the preview name of the accessory
|
||||||
|
color_src = "balls_color"
|
||||||
|
locked = 0
|
||||||
|
|
||||||
|
/datum/sprite_accessory/testicles/hidden
|
||||||
|
icon_state = "hidden"
|
||||||
|
name = "Hidden"
|
||||||
|
alt_aroused = TRUE
|
||||||
|
|
||||||
|
/datum/sprite_accessory/testicles/single
|
||||||
|
icon_state = "single"
|
||||||
|
name = "Single"
|
||||||
|
alt_aroused = TRUE
|
||||||
|
|
||||||
//Vaginas
|
//Vaginas
|
||||||
/datum/sprite_accessory/vagina
|
/datum/sprite_accessory/vagina
|
||||||
@@ -109,6 +125,15 @@
|
|||||||
name = "Pair"
|
name = "Pair"
|
||||||
alt_aroused = TRUE
|
alt_aroused = TRUE
|
||||||
|
|
||||||
|
/datum/sprite_accessory/breasts/quad
|
||||||
|
icon_state = "quad"
|
||||||
|
name = "Quad"
|
||||||
|
alt_aroused = TRUE
|
||||||
|
|
||||||
|
/datum/sprite_accessory/breasts/sextuple
|
||||||
|
icon_state = "sextuple"
|
||||||
|
name = "Sextuple"
|
||||||
|
alt_aroused = TRUE
|
||||||
|
|
||||||
//OVIPOSITORS BE HERE
|
//OVIPOSITORS BE HERE
|
||||||
/datum/sprite_accessory/ovipositor
|
/datum/sprite_accessory/ovipositor
|
||||||
|
|||||||
@@ -5,14 +5,13 @@
|
|||||||
icon = 'modular_citadel/icons/obj/genitals/penis.dmi'
|
icon = 'modular_citadel/icons/obj/genitals/penis.dmi'
|
||||||
zone = "groin"
|
zone = "groin"
|
||||||
slot = ORGAN_SLOT_PENIS
|
slot = ORGAN_SLOT_PENIS
|
||||||
w_class = 3
|
|
||||||
can_masturbate_with = TRUE
|
can_masturbate_with = TRUE
|
||||||
masturbation_verb = "stroke"
|
masturbation_verb = "stroke"
|
||||||
can_climax = TRUE
|
can_climax = TRUE
|
||||||
fluid_transfer_factor = 0.5
|
fluid_transfer_factor = 0.5
|
||||||
size = 2 //arbitrary value derived from length and girth for sprites.
|
size = 2 //arbitrary value derived from length and girth for sprites.
|
||||||
var/length = 6 //inches
|
var/length = 6 //inches
|
||||||
var/cached_length //used to detect a change in length
|
var/cached_length //used to detect a change in length
|
||||||
var/girth = 0
|
var/girth = 0
|
||||||
var/girth_ratio = COCK_GIRTH_RATIO_DEF //0.73; check citadel_defines.dm
|
var/girth_ratio = COCK_GIRTH_RATIO_DEF //0.73; check citadel_defines.dm
|
||||||
var/knot_girth_ratio = KNOT_GIRTH_RATIO_DEF
|
var/knot_girth_ratio = KNOT_GIRTH_RATIO_DEF
|
||||||
@@ -52,15 +51,15 @@
|
|||||||
string = "penis_[GLOB.cock_shapes_icons[shape]]_[size]"
|
string = "penis_[GLOB.cock_shapes_icons[shape]]_[size]"
|
||||||
if(ishuman(owner))
|
if(ishuman(owner))
|
||||||
var/mob/living/carbon/human/H = owner
|
var/mob/living/carbon/human/H = owner
|
||||||
|
icon_state = sanitize_text(string)
|
||||||
H.update_genitals()
|
H.update_genitals()
|
||||||
|
|
||||||
icon_state = sanitize_text(string)
|
|
||||||
|
|
||||||
/obj/item/organ/genital/penis/update_link()
|
/obj/item/organ/genital/penis/update_link()
|
||||||
if(owner)
|
if(owner)
|
||||||
linked_organ = (owner.getorganslot("testicles"))
|
linked_organ = (owner.getorganslot("testicles"))
|
||||||
if(linked_organ)
|
if(linked_organ)
|
||||||
linked_organ.linked_organ = src
|
linked_organ.linked_organ = src
|
||||||
|
linked_organ.size = size
|
||||||
else
|
else
|
||||||
if(linked_organ)
|
if(linked_organ)
|
||||||
linked_organ.linked_organ = null
|
linked_organ.linked_organ = null
|
||||||
|
|||||||
@@ -1,17 +1,20 @@
|
|||||||
/obj/item/organ/genital/testicles
|
/obj/item/organ/genital/testicles
|
||||||
name = "testicles"
|
name = "testicles"
|
||||||
desc = "A male reproductive organ."
|
desc = "A male reproductive organ."
|
||||||
icon_state = "testicles"
|
icon_state = "testicles"
|
||||||
icon = 'modular_citadel/icons/obj/genitals/penis.dmi'
|
icon = 'modular_citadel/icons/obj/genitals/testicles.dmi'
|
||||||
zone = "groin"
|
zone = "groin"
|
||||||
slot = "testicles"
|
slot = "testicles"
|
||||||
w_class = 3
|
size = BALLS_SIZE_MIN
|
||||||
internal = TRUE
|
var/size_name = "average"
|
||||||
size = BALLS_SIZE_DEF
|
shape = "single"
|
||||||
var/sack_size = BALLS_SACK_SIZE_DEF
|
var/sack_size = BALLS_SACK_SIZE_DEF
|
||||||
fluid_id = "semen"
|
fluid_id = "semen"
|
||||||
producing = TRUE
|
producing = TRUE
|
||||||
var/sent_full_message = 1 //defaults to 1 since they're full to start
|
can_masturbate_with = TRUE
|
||||||
|
masturbation_verb = "massage"
|
||||||
|
can_climax = TRUE
|
||||||
|
var/sent_full_message = TRUE //defaults to 1 since they're full to start
|
||||||
|
|
||||||
/obj/item/organ/genital/testicles/Initialize()
|
/obj/item/organ/genital/testicles/Initialize()
|
||||||
. = ..()
|
. = ..()
|
||||||
@@ -28,9 +31,9 @@
|
|||||||
if(reagents.total_volume >= reagents.maximum_volume)
|
if(reagents.total_volume >= reagents.maximum_volume)
|
||||||
if(!sent_full_message)
|
if(!sent_full_message)
|
||||||
send_full_message()
|
send_full_message()
|
||||||
sent_full_message = 1
|
sent_full_message = TRUE
|
||||||
return FALSE
|
return FALSE
|
||||||
sent_full_message = 0
|
sent_full_message = FALSE
|
||||||
update_link()
|
update_link()
|
||||||
if(!linked_organ)
|
if(!linked_organ)
|
||||||
return FALSE
|
return FALSE
|
||||||
@@ -42,6 +45,7 @@
|
|||||||
linked_organ = (owner.getorganslot("penis"))
|
linked_organ = (owner.getorganslot("penis"))
|
||||||
if(linked_organ)
|
if(linked_organ)
|
||||||
linked_organ.linked_organ = src
|
linked_organ.linked_organ = src
|
||||||
|
|
||||||
else
|
else
|
||||||
if(linked_organ)
|
if(linked_organ)
|
||||||
linked_organ.linked_organ = null
|
linked_organ.linked_organ = null
|
||||||
@@ -49,6 +53,34 @@
|
|||||||
|
|
||||||
/obj/item/organ/genital/testicles/proc/send_full_message(msg = "Your balls finally feel full, again.")
|
/obj/item/organ/genital/testicles/proc/send_full_message(msg = "Your balls finally feel full, again.")
|
||||||
if(owner && istext(msg))
|
if(owner && istext(msg))
|
||||||
owner << msg
|
to_chat(owner, msg)
|
||||||
return TRUE
|
return TRUE
|
||||||
|
|
||||||
|
/obj/item/organ/genital/testicles/update_appearance()
|
||||||
|
if(owner)
|
||||||
|
if(size == 0)
|
||||||
|
size_name = "nonexistant"
|
||||||
|
if(size == 1)
|
||||||
|
size_name = "average"
|
||||||
|
if(size == 2)
|
||||||
|
size_name = "enlarged"
|
||||||
|
if(size >= 3)
|
||||||
|
size_name = "engorged"
|
||||||
|
|
||||||
|
if(!internal)
|
||||||
|
desc = "You see an [size_name] pair of testicles dangling."
|
||||||
|
else
|
||||||
|
desc = "They don't have any testicles you can see."
|
||||||
|
var/string
|
||||||
|
if(owner.dna.species.use_skintones && owner.dna.features["genitals_use_skintone"])
|
||||||
|
if(ishuman(owner)) // Check before recasting type, although someone fucked up if you're not human AND have use_skintones somehow...
|
||||||
|
var/mob/living/carbon/human/H = owner // only human mobs have skin_tone, which we need.
|
||||||
|
color = "#[skintone2hex(H.skin_tone)]"
|
||||||
|
string = "testicles_[GLOB.balls_shapes_icons[shape]]_[size]-s"
|
||||||
|
else
|
||||||
|
color = "#[owner.dna.features["balls_color"]]"
|
||||||
|
string = "testicles_[GLOB.balls_shapes_icons[shape]]_[size]"
|
||||||
|
if(ishuman(owner))
|
||||||
|
var/mob/living/carbon/human/H = owner
|
||||||
|
icon_state = sanitize_text(string)
|
||||||
|
H.update_genitals()
|
||||||
|
|||||||
@@ -60,10 +60,9 @@
|
|||||||
string = "vagina"
|
string = "vagina"
|
||||||
if(ishuman(owner))
|
if(ishuman(owner))
|
||||||
var/mob/living/carbon/human/H = owner
|
var/mob/living/carbon/human/H = owner
|
||||||
|
icon_state = sanitize_text(string)
|
||||||
H.update_genitals()
|
H.update_genitals()
|
||||||
|
|
||||||
icon_state = sanitize_text(string)
|
|
||||||
|
|
||||||
/obj/item/organ/genital/vagina/update_link()
|
/obj/item/organ/genital/vagina/update_link()
|
||||||
if(owner)
|
if(owner)
|
||||||
linked_organ = (owner.getorganslot("womb"))
|
linked_organ = (owner.getorganslot("womb"))
|
||||||
|
|||||||
@@ -5,12 +5,10 @@
|
|||||||
icon_state = "womb"
|
icon_state = "womb"
|
||||||
zone = "groin"
|
zone = "groin"
|
||||||
slot = "womb"
|
slot = "womb"
|
||||||
w_class = 3
|
|
||||||
internal = TRUE
|
internal = TRUE
|
||||||
fluid_id = "femcum"
|
fluid_id = "femcum"
|
||||||
producing = TRUE
|
producing = TRUE
|
||||||
|
|
||||||
|
|
||||||
/obj/item/organ/genital/womb/Initialize()
|
/obj/item/organ/genital/womb/Initialize()
|
||||||
. = ..()
|
. = ..()
|
||||||
reagents.add_reagent(fluid_id, fluid_max_volume)
|
reagents.add_reagent(fluid_id, fluid_max_volume)
|
||||||
|
|||||||
@@ -56,6 +56,7 @@
|
|||||||
WRITE_FILE(S["feature_has_balls"], features["has_balls"])
|
WRITE_FILE(S["feature_has_balls"], features["has_balls"])
|
||||||
WRITE_FILE(S["feature_balls_color"], features["balls_color"])
|
WRITE_FILE(S["feature_balls_color"], features["balls_color"])
|
||||||
WRITE_FILE(S["feature_balls_size"], features["balls_size"])
|
WRITE_FILE(S["feature_balls_size"], features["balls_size"])
|
||||||
|
WRITE_FILE(S["feature_balls_shape"], features["balls_shape"])
|
||||||
WRITE_FILE(S["feature_balls_sack_size"], features["balls_sack_size"])
|
WRITE_FILE(S["feature_balls_sack_size"], features["balls_sack_size"])
|
||||||
WRITE_FILE(S["feature_balls_fluid"], features["balls_fluid"])
|
WRITE_FILE(S["feature_balls_fluid"], features["balls_fluid"])
|
||||||
//breasts features
|
//breasts features
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 762 B |
|
Before Width: | Height: | Size: 510 B After Width: | Height: | Size: 626 B |
|
Before Width: | Height: | Size: 939 B After Width: | Height: | Size: 1.1 KiB |