Merge pull request #8517 from Poojawa/shitcode-is-so-bad-and-people-like-it-I-guess

Adds visible balls and multi-breasts
This commit is contained in:
kevinz000
2019-06-05 01:42:48 -07:00
committed by GitHub
24 changed files with 200 additions and 153 deletions
+2 -2
View File
@@ -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
+19 -53
View File
@@ -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()
+8 -1
View File
@@ -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
+4 -1
View File
@@ -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),
+13 -5
View File
@@ -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"]];'>&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 += 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 ..()
+23 -28
View File
@@ -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
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 762 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 510 B

After

Width:  |  Height:  |  Size: 626 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 939 B

After

Width:  |  Height:  |  Size: 1.1 KiB