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:
TalkingCactus
2017-02-24 21:42:15 -05:00
committed by GitHub
parent 82fe4b01be
commit 36c580c236
49 changed files with 1608 additions and 540 deletions
+32
View File
@@ -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))
+14
View File
@@ -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
+233
View File
@@ -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"
+17
View File
@@ -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
+60
View File
@@ -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
+60
View File
@@ -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
+15
View File
@@ -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
+9
View File
@@ -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