The Update (#241)
* auto vote runtime error fix * part 1 * adds a wolf pai sprite modified fox sprite that doesn't make your eyes bleed * missed a painful sprite * part 2 * ptwhatever * save * conflict resolution pt1 * conflict resolution pt2 * almost done with the preferences shit * fixes missing arousal HUD * file rename * even more * keep the panic commits coming * forgot one * wew, gonna go make some small changes * s o o n * LOOC admin and player toggles * fixed backpacks and taurs clipping on the preview * fixed penis length saving * typo fix * arousal fix * icon tuning * final
This commit is contained in:
@@ -0,0 +1,32 @@
|
||||
/obj/item/organ/genital/breasts
|
||||
name = "breasts"
|
||||
desc = "Female milk producing organs."
|
||||
icon_state = "breasts"
|
||||
icon = 'code/citadel/icons/breasts.dmi'
|
||||
zone = "chest"
|
||||
slot = "breasts"
|
||||
w_class = 3
|
||||
size = "e"
|
||||
fluid_id = "milk"
|
||||
var/cup_size = BREASTS_SIZE_DEF
|
||||
var/amount = 2
|
||||
producing = TRUE
|
||||
|
||||
/obj/item/organ/genital/breasts/New()
|
||||
..()
|
||||
create_reagents(fluid_max_volume)
|
||||
reagents.add_reagent(fluid_id, fluid_max_volume)
|
||||
update()
|
||||
|
||||
/obj/item/organ/genital/breasts/on_life()
|
||||
reagents.maximum_volume = fluid_max_volume
|
||||
if(fluid_id && producing)
|
||||
generate_milk()
|
||||
|
||||
/obj/item/organ/genital/breasts/proc/generate_milk()
|
||||
if(!owner)
|
||||
return FALSE
|
||||
if(owner.stat == DEAD)
|
||||
return FALSE
|
||||
reagents.isolate_reagent(fluid_id)
|
||||
reagents.add_reagent(fluid_id, (fluid_mult * fluid_rate))
|
||||
@@ -0,0 +1,14 @@
|
||||
/obj/item/organ/genital/eggsack
|
||||
name = "egg sack"
|
||||
desc = "An egg producing reproductive organ."
|
||||
icon_state = "egg_sack"
|
||||
icon = 'code/citadel/icons/ovipositor.dmi'
|
||||
zone = "groin"
|
||||
slot = "testicles"
|
||||
w_class = 3
|
||||
var/internal = TRUE
|
||||
var/egg_girth = EGG_GIRTH_DEF
|
||||
var/cum_mult = CUM_RATE_MULT
|
||||
var/cum_rate = CUM_RATE
|
||||
var/cum_efficiency = CUM_EFFICIENCY
|
||||
var/obj/item/organ/ovipositor/linked_ovi
|
||||
@@ -0,0 +1,233 @@
|
||||
/obj/item/organ/genital
|
||||
color = "#fcccb3"
|
||||
var/shape = "human"
|
||||
var/sensitivity = 1
|
||||
var/list/genital_flags = list()
|
||||
var/can_masturbate_with = 0
|
||||
var/size = 2 //can vary between num or text, just used in icon_state strings
|
||||
var/fluid_id = null
|
||||
var/fluid_max_volume = 50
|
||||
var/fluid_efficiency = 1
|
||||
var/fluid_rate = 1
|
||||
var/fluid_mult = 1
|
||||
var/producing = FALSE
|
||||
|
||||
/obj/item/organ/genital/New()
|
||||
..()
|
||||
reagents = create_reagents(fluid_max_volume)
|
||||
|
||||
/obj/item/organ/genital/proc/update()
|
||||
return
|
||||
|
||||
/obj/item/organ/genital/proc/update_size()
|
||||
return
|
||||
|
||||
/obj/item/organ/genital/proc/update_appearance()
|
||||
return
|
||||
|
||||
/obj/item/organ/genital/proc/update_link()
|
||||
|
||||
|
||||
/obj/item/organ/genital/Insert(mob/living/carbon/M, special = 0)
|
||||
..()
|
||||
update()
|
||||
/obj/item/organ/genital/Remove(mob/living/carbon/M, special = 0)
|
||||
..()
|
||||
update()
|
||||
|
||||
//proc to give a player their genitals and stuff when they log in
|
||||
/mob/living/carbon/human/proc/give_genitals(clean=0)//clean will remove all pre-existing genitals. proc will then give them any genitals that are enabled in their DNA
|
||||
if(clean)
|
||||
var/obj/item/organ/genital/GtoClean
|
||||
for(GtoClean in internal_organs)
|
||||
GtoClean.Remove(src)
|
||||
qdel(GtoClean)
|
||||
if(dna.features["has_cock"])
|
||||
give_penis()
|
||||
if(dna.features["has_balls"])
|
||||
give_balls()
|
||||
else if(dna.features["has_ovi"])
|
||||
give_ovipositor()
|
||||
if(dna.features["has_eggsack"])
|
||||
give_eggsack()
|
||||
if(dna.features["has_breasts"])
|
||||
give_breasts()
|
||||
if(dna.features["has_vag"])
|
||||
give_vagina()
|
||||
if(dna.features["has_womb"])
|
||||
give_womb()
|
||||
|
||||
/mob/living/carbon/human/proc/give_penis()
|
||||
if(!dna)
|
||||
return FALSE
|
||||
if(NOGENITALS in dna.species.species_traits)
|
||||
return FALSE
|
||||
if(!getorganslot("penis"))
|
||||
var/obj/item/organ/genital/penis/P = new
|
||||
P.Insert(src)
|
||||
if(P)
|
||||
if(dna.species.use_skintones && dna.features["genitals_use_skintone"])
|
||||
P.color = skintone2hex(skin_tone)
|
||||
else
|
||||
P.color = dna.features["cock_color"]
|
||||
P.length = dna.features["cock_length"]
|
||||
P.girth_ratio = dna.features["cock_girth_ratio"]
|
||||
P.shape = dna.features["cock_shape"]
|
||||
P.update()
|
||||
|
||||
/mob/living/carbon/human/proc/give_balls()
|
||||
if(!dna)
|
||||
return FALSE
|
||||
if(NOGENITALS in dna.species.species_traits)
|
||||
return FALSE
|
||||
if(!getorganslot("testicles"))
|
||||
var/obj/item/organ/genital/testicles/T = new
|
||||
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"]
|
||||
T.size = dna.features["bals_size"]
|
||||
T.sack_size = dna.features["balls_sack_size"]
|
||||
T.fluid_id = dna.features["balls_fluid"]
|
||||
T.fluid_rate = dna.features["balls_cum_rate"]
|
||||
T.fluid_mult = dna.features["balls_cum_mult"]
|
||||
T.fluid_efficiency = dna.features["balls_efficiency"]
|
||||
T.update()
|
||||
|
||||
/mob/living/carbon/human/proc/give_breasts()
|
||||
if(!has_dna())
|
||||
return FALSE
|
||||
if(NOGENITALS in dna.species.species_traits)
|
||||
return FALSE
|
||||
if(!getorganslot("breasts"))
|
||||
var/obj/item/organ/genital/breasts/B = new
|
||||
B.Insert(src)
|
||||
B.cup_size = dna.features["breasts_size"]
|
||||
B.fluid_id = dna.features["breasts_fluid"]
|
||||
B.update()
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/give_ovipositor()
|
||||
/mob/living/carbon/human/proc/give_eggsack()
|
||||
/mob/living/carbon/human/proc/give_vagina()
|
||||
if(!has_dna())
|
||||
return FALSE
|
||||
if(NOGENITALS in dna.species.species_traits)
|
||||
return FALSE
|
||||
if(!getorganslot("vagina"))
|
||||
var/obj/item/organ/genital/vagina/V = new
|
||||
V.Insert(src)
|
||||
if(dna.species.use_skintones && dna.features["genitals_use_skintone"])
|
||||
V.color = skintone2hex(skin_tone)
|
||||
else
|
||||
V.color = dna.features["vag_color"]
|
||||
V.update()
|
||||
/mob/living/carbon/human/proc/give_womb()
|
||||
if(!has_dna())
|
||||
return FALSE
|
||||
if(NOGENITALS in dna.species.species_traits)
|
||||
return FALSE
|
||||
if(!getorganslot("womb"))
|
||||
var/obj/item/organ/genital/womb/W = new
|
||||
W.Insert(src)
|
||||
W.update()
|
||||
|
||||
|
||||
/datum/species/proc/genitals_layertext(layer)
|
||||
switch(layer)
|
||||
if(GENITALS_BEHIND_LAYER)
|
||||
return "BEHIND"
|
||||
if(GENITALS_ADJ_LAYER)
|
||||
return "ADJ"
|
||||
if(GENITALS_FRONT_LAYER)
|
||||
return "FRONT"
|
||||
|
||||
//procs to handle sprite overlays being applied to humans
|
||||
|
||||
/obj/item/equipped(mob/user, slot)
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
H.update_genitals()
|
||||
..()
|
||||
|
||||
/mob/living/carbon/human/doUnEquip(obj/item/I, force)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
update_genitals()
|
||||
|
||||
/mob/living/carbon/human/proc/update_genitals()
|
||||
dna.species.handle_genitals(src)
|
||||
|
||||
/datum/species/proc/handle_genitals(mob/living/carbon/human/H)
|
||||
if(!H)
|
||||
CRASH("H = null")
|
||||
if(!H.internal_organs.len)
|
||||
return
|
||||
if(NOGENITALS in species_traits)
|
||||
return
|
||||
|
||||
var/list/genitals_to_add = list()
|
||||
var/list/relevent_layers = list(GENITALS_BEHIND_LAYER, GENITALS_ADJ_LAYER, GENITALS_FRONT_LAYER)
|
||||
var/list/standing = list()
|
||||
var/size
|
||||
|
||||
H.remove_overlay(GENITALS_BEHIND_LAYER)
|
||||
H.remove_overlay(GENITALS_ADJ_LAYER)
|
||||
H.remove_overlay(GENITALS_FRONT_LAYER)
|
||||
|
||||
if(H.disabilities & HUSK)
|
||||
return
|
||||
//start scanning for genitals
|
||||
if(H.has_penis() && H.is_groin_exposed())
|
||||
genitals_to_add += H.getorganslot("penis")
|
||||
if(H.has_breasts() && H.is_chest_exposed())
|
||||
genitals_to_add += H.getorganslot("breasts")
|
||||
if(H.has_vagina() && H.is_groin_exposed())
|
||||
genitals_to_add += H.getorganslot("vagina")
|
||||
var/image/I
|
||||
//start applying overlays
|
||||
for(var/layer in relevent_layers)
|
||||
var/layertext = genitals_layertext(layer)
|
||||
for(var/obj/item/organ/genital/G in genitals_to_add)
|
||||
var/datum/sprite_accessory/S
|
||||
switch(G.type)
|
||||
if(/obj/item/organ/genital/penis)
|
||||
S = cock_shapes_list[G.shape]
|
||||
size = G.size
|
||||
|
||||
if(!S || S.icon_state == "none")
|
||||
continue
|
||||
var/icon_string
|
||||
icon_string = "[G.slot]_[S.icon_state]_[size]_[layertext]"
|
||||
I = image("icon" = S.icon, "icon_state" = icon_string, "layer" =- layer)
|
||||
if(S.center)
|
||||
I = center_image(I,S.dimension_x,S.dimension_y)
|
||||
switch(S.color_src)
|
||||
if("cock_color")
|
||||
I.color = "#[H.dna.features["cock_color"]]"
|
||||
if("breasts_color")
|
||||
I.color = "#[H.dna.features["breasts_color"]]"
|
||||
if(MUTCOLORS)
|
||||
if(fixed_mut_color)
|
||||
I.color = "#[fixed_mut_color]"
|
||||
else
|
||||
I.color = "#[H.dna.features["mcolor"]]"
|
||||
if(MUTCOLORS2)
|
||||
if(fixed_mut_color2)
|
||||
I.color = "#[fixed_mut_color2]"
|
||||
else
|
||||
I.color = "#[H.dna.features["mcolor2"]]"
|
||||
if(MUTCOLORS3)
|
||||
if(fixed_mut_color3)
|
||||
I.color = "#[fixed_mut_color3]"
|
||||
else
|
||||
I.color = "#[H.dna.features["mcolor3"]]"
|
||||
standing += I
|
||||
H.overlays_standing[layer] = standing.Copy()
|
||||
standing = list()
|
||||
|
||||
H.apply_overlay(GENITALS_BEHIND_LAYER)
|
||||
H.apply_overlay(GENITALS_ADJ_LAYER)
|
||||
H.apply_overlay(GENITALS_FRONT_LAYER)
|
||||
@@ -0,0 +1,116 @@
|
||||
//DICKS,COCKS,PENISES,WHATEVER YOU WANT TO CALL THEM
|
||||
/datum/sprite_accessory/penis
|
||||
icon = 'code/citadel/icons/penis_onmob.dmi'
|
||||
icon_state = null
|
||||
name = "penis" //the preview name of the accessory
|
||||
gender_specific = 0 //Might be needed somewhere down the list.
|
||||
color_src = "cock_color"
|
||||
locked = 0
|
||||
|
||||
/datum/sprite_accessory/penis/none
|
||||
icon_state = "none"
|
||||
name = "None"
|
||||
|
||||
/datum/sprite_accessory/penis/human
|
||||
icon_state = "human"
|
||||
name = "Human"
|
||||
|
||||
/datum/sprite_accessory/penis/knotted
|
||||
icon_state = "knotted"
|
||||
name = "Knotted"
|
||||
|
||||
/datum/sprite_accessory/penis/flared
|
||||
icon_state = "flared"
|
||||
name = "Flared"
|
||||
|
||||
/datum/sprite_accessory/penis/barbknot
|
||||
icon_state = "barbknot"
|
||||
name = "Barbed, Knotted"
|
||||
|
||||
/datum/sprite_accessory/penis/tapered
|
||||
icon_state = "tapered"
|
||||
name = "Tapered"
|
||||
|
||||
//BREASTS BE HERE
|
||||
/datum/sprite_accessory/breasts
|
||||
icon = 'code/citadel/icons/breasts_onmob.dmi'
|
||||
icon_state = null
|
||||
name = "breasts"
|
||||
gender_specific = 0
|
||||
color_src = MUTCOLORS2 //I'll have skin_tone override this if the species uses them
|
||||
locked = 0
|
||||
/*!!ULTRACOMPRESSEDEDITION!!*/
|
||||
/datum/sprite_accessory/breasts/none
|
||||
icon_state = "none"
|
||||
name = "None"
|
||||
/datum/sprite_accessory/breasts/a
|
||||
icon_state = "a"
|
||||
name = "A"
|
||||
/datum/sprite_accessory/breasts/aa
|
||||
icon_state = "a"
|
||||
name = "AA"
|
||||
/datum/sprite_accessory/breasts/b
|
||||
icon_state = "b"
|
||||
name = "B"
|
||||
/datum/sprite_accessory/breasts/bb
|
||||
icon_state = "b"
|
||||
name = "BB"
|
||||
/datum/sprite_accessory/breasts/c
|
||||
icon_state = "c"
|
||||
name = "C"
|
||||
/datum/sprite_accessory/breasts/cc
|
||||
icon_state = "c"
|
||||
name = "CC"
|
||||
/datum/sprite_accessory/breasts/d
|
||||
icon_state = "d"
|
||||
name = "D"
|
||||
/datum/sprite_accessory/breasts/dd
|
||||
icon_state = "d"
|
||||
name = "DD"
|
||||
/datum/sprite_accessory/breasts/e
|
||||
icon_state = "e"
|
||||
name = "E"
|
||||
/datum/sprite_accessory/breasts/ee
|
||||
icon_state = "e"
|
||||
name = "EE"
|
||||
/datum/sprite_accessory/breasts/f
|
||||
icon_state = "f"
|
||||
name = "F"
|
||||
locked = 1
|
||||
/datum/sprite_accessory/breasts/ff
|
||||
icon_state = "f"
|
||||
name = "FF"
|
||||
locked = 1
|
||||
/datum/sprite_accessory/breasts/g
|
||||
icon_state = "g"
|
||||
name = "G"
|
||||
locked = 1
|
||||
/datum/sprite_accessory/breasts/gg
|
||||
icon_state = "g"
|
||||
name = "GG"
|
||||
locked = 1
|
||||
/datum/sprite_accessory/breasts/h
|
||||
icon_state = "h"
|
||||
name = "H"
|
||||
locked = 1
|
||||
/datum/sprite_accessory/breasts/hh
|
||||
icon_state = "h"
|
||||
name = "HH"
|
||||
locked = 1
|
||||
|
||||
//OVIPOSITORS BE HERE
|
||||
/datum/sprite_accessory/ovipositor
|
||||
icon = 'code/citadel/icons/penis_onmob.dmi'
|
||||
icon_state = null
|
||||
name = "Ovipositor" //the preview name of the accessory
|
||||
gender_specific = 0 //Might be needed somewhere down the list.
|
||||
color_src = "cock_color"
|
||||
locked = 0
|
||||
|
||||
/datum/sprite_accessory/ovipositor/knotted
|
||||
icon_state = "none"
|
||||
name = "None"
|
||||
|
||||
/datum/sprite_accessory/ovipositor/knotted
|
||||
icon_state = "knotted"
|
||||
name = "Knotted"
|
||||
@@ -0,0 +1,17 @@
|
||||
/obj/item/organ/genital/ovipositor
|
||||
name = "ovipositor"
|
||||
desc = "An egg laying reproductive organ."
|
||||
icon_state = "ovi_knotted_2"
|
||||
icon = 'code/citadel/icons/ovipositor.dmi'
|
||||
zone = "groin"
|
||||
slot = "penis"
|
||||
w_class = 3
|
||||
shape = "knotted"
|
||||
size = 3
|
||||
var/length = 6 //inches
|
||||
var/girth = 0
|
||||
var/girth_ratio = COCK_GIRTH_RATIO_DEF //citadel_defines.dm for these defines
|
||||
var/knot_girth_ratio = KNOT_GIRTH_RATIO_DEF
|
||||
var/list/oviflags = list()
|
||||
|
||||
var/obj/item/organ/eggsack/linked_eggsack
|
||||
@@ -0,0 +1,60 @@
|
||||
/obj/item/organ/genital/penis
|
||||
name = "penis"
|
||||
desc = "A male reproductive organ."
|
||||
icon_state = "penis"
|
||||
icon = 'code/citadel/icons/penis.dmi'
|
||||
zone = "groin"
|
||||
slot = "penis"
|
||||
w_class = 3
|
||||
color = null
|
||||
can_masturbate_with = 1
|
||||
size = 2 //arbitrary value derived from length and girth for sprites.
|
||||
var/length = 6 //inches
|
||||
var/girth = 0
|
||||
var/girth_ratio = COCK_GIRTH_RATIO_DEF //0.73; check citadel_defines.dm
|
||||
var/knot_girth_ratio = KNOT_GIRTH_RATIO_DEF
|
||||
var/list/dickflags = list()
|
||||
var/list/knotted_types = list("", "barbknot")
|
||||
var/obj/item/organ/genital/testicles/linked_balls
|
||||
|
||||
/obj/item/organ/genital/penis/New()
|
||||
..()
|
||||
update()
|
||||
|
||||
/obj/item/organ/genital/penis/update()
|
||||
update_size()
|
||||
update_appearance()
|
||||
update_link()
|
||||
|
||||
/obj/item/organ/genital/penis/update_size()
|
||||
switch(length)
|
||||
if(-INFINITY to 5)
|
||||
size = 1
|
||||
if(5 to 9)
|
||||
size = 2
|
||||
if(9 to 12)
|
||||
size = 3//no new sprites for anything larger
|
||||
if(9 to 15)
|
||||
size = 3
|
||||
if(15 to INFINITY)
|
||||
size = 3
|
||||
girth = (length * girth_ratio)
|
||||
|
||||
/obj/item/organ/genital/penis/update_appearance()
|
||||
var/string = "penis_[shape]_[size]"
|
||||
icon_state = sanitize_text(string)
|
||||
// name = "[shape] penis"
|
||||
desc = "That's a [lowertext(shape)] penis. You estimate it's about [round(length, 0.25)] inch[length > 1 ? "es" : ""] long and [round(girth, 0.25)] inch[length > 1 ? "es" : ""] around."
|
||||
if(!owner)
|
||||
return
|
||||
color = sanitize_hexcolor(owner.dna.features["cock_color"], 6, 0)
|
||||
|
||||
/obj/item/organ/genital/penis/update_link()
|
||||
if(owner)
|
||||
linked_balls = (owner.getorganslot("testicles"))
|
||||
if(linked_balls)
|
||||
linked_balls.linked_penis = src
|
||||
else
|
||||
if(linked_balls)
|
||||
linked_balls.linked_penis = null
|
||||
linked_balls = null
|
||||
@@ -0,0 +1,60 @@
|
||||
/obj/item/organ/genital/testicles
|
||||
name = "testicles"
|
||||
desc = "A male reproductive organ."
|
||||
icon_state = "testicles"
|
||||
icon = 'code/citadel/icons/penis.dmi'
|
||||
zone = "groin"
|
||||
slot = "testicles"
|
||||
w_class = 3
|
||||
var/internal = FALSE
|
||||
size = BALLS_SIZE_DEF
|
||||
var/sack_size = BALLS_SACK_SIZE_DEF
|
||||
fluid_id = "semen"
|
||||
producing = TRUE
|
||||
var/sent_full_message = 1 //defaults to 1 since they're full to start
|
||||
var/obj/item/organ/genital/penis/linked_penis
|
||||
|
||||
/obj/item/organ/genital/testicles/New()
|
||||
..()
|
||||
create_reagents(fluid_max_volume)
|
||||
reagents.add_reagent(fluid_id, fluid_max_volume)
|
||||
|
||||
/obj/item/organ/genital/testicles/on_life()
|
||||
if(fluid_id && producing)
|
||||
generate_cum()
|
||||
|
||||
/obj/item/organ/genital/testicles/proc/generate_cum()
|
||||
reagents.maximum_volume = fluid_max_volume
|
||||
if(reagents.total_volume >= reagents.maximum_volume)
|
||||
if(sent_full_message < 0)
|
||||
send_full_message()
|
||||
sent_full_message = 1
|
||||
return FALSE
|
||||
sent_full_message = 0
|
||||
if(!owner && linked_penis)
|
||||
if(linked_penis.linked_balls == src)
|
||||
linked_penis.linked_balls = null
|
||||
linked_penis = null
|
||||
return FALSE
|
||||
if(!reagents)
|
||||
create_reagents(fluid_max_volume)
|
||||
update_link()
|
||||
if(!linked_penis)
|
||||
return FALSE
|
||||
reagents.isolate_reagent(fluid_id)//remove old reagents if it changed and just clean up generally
|
||||
reagents.add_reagent(fluid_id, (fluid_mult * fluid_rate))//generate the cum
|
||||
|
||||
/obj/item/organ/genital/testicles/update_link()
|
||||
if(owner)
|
||||
linked_penis = (owner.getorganslot("penis"))
|
||||
if(linked_penis)
|
||||
linked_penis.linked_balls = src
|
||||
else if(linked_penis != null)
|
||||
linked_penis.linked_balls = null
|
||||
linked_penis = null
|
||||
|
||||
/obj/item/organ/genital/testicles/proc/send_full_message(msg = "Your balls finally feel full, again.")
|
||||
if(owner && istext(msg))
|
||||
owner << msg
|
||||
return TRUE
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
/obj/item/organ/genital/vagina
|
||||
name = "vagina"
|
||||
desc = "A female reproductive organ."
|
||||
icon_state = "vagina"
|
||||
zone = "groin"
|
||||
slot = "vagina"
|
||||
can_masturbate_with = 1
|
||||
w_class = 3
|
||||
var/wetness = 1
|
||||
var/capacity_length = 8//D E P T H
|
||||
var/capacity_girth = 8
|
||||
var/clits = 1
|
||||
var/clit_diam = 0.25
|
||||
var/clit_len = 0.25
|
||||
var/obj/item/organ/womb/linked_womb
|
||||
@@ -0,0 +1,9 @@
|
||||
/obj/item/organ/genital/womb
|
||||
name = "womb"
|
||||
desc = "A female reproductive organ."
|
||||
icon_state = "womb"
|
||||
zone = "groin"
|
||||
slot = "womb"
|
||||
w_class = 3
|
||||
fluid_id = "femcum"
|
||||
var/obj/item/organ/genital/vagina/linked_vag
|
||||
Reference in New Issue
Block a user