diff --git a/code/citadel/cit_arousal.dm b/code/citadel/cit_arousal.dm
index d4aa1716b3..dec4b4fd24 100644
--- a/code/citadel/cit_arousal.dm
+++ b/code/citadel/cit_arousal.dm
@@ -29,9 +29,8 @@
var/list/femcum_fluids = list("femcum")
//Mob procs
-/mob/living/Life()
/mob/living/proc/handle_arousal()
- return
+
/mob/living/carbon/handle_arousal()
if(canbearoused && dna)
diff --git a/code/citadel/icons/penis.dmi b/code/citadel/icons/penis.dmi
index 56f7f12803..9ac7d82cbd 100644
Binary files a/code/citadel/icons/penis.dmi and b/code/citadel/icons/penis.dmi differ
diff --git a/code/citadel/icons/vagina.dmi b/code/citadel/icons/vagina.dmi
new file mode 100644
index 0000000000..c9d70d47e9
Binary files /dev/null and b/code/citadel/icons/vagina.dmi differ
diff --git a/code/citadel/organs/eggsack.dm b/code/citadel/organs/eggsack.dm
index e760ef6035..1e53240e1a 100644
--- a/code/citadel/organs/eggsack.dm
+++ b/code/citadel/organs/eggsack.dm
@@ -5,6 +5,7 @@
icon = 'code/citadel/icons/ovipositor.dmi'
zone = "groin"
slot = "testicles"
+ color = null //don't use the /genital color since it already is colored
w_class = 3
var/internal = TRUE
var/egg_girth = EGG_GIRTH_DEF
diff --git a/code/citadel/organs/genitals.dm b/code/citadel/organs/genitals.dm
index 1cd904fd83..6972f9e4b0 100644
--- a/code/citadel/organs/genitals.dm
+++ b/code/citadel/organs/genitals.dm
@@ -12,25 +12,31 @@
var/fluid_mult = 1
var/producing = FALSE
-/obj/item/organ/genital/New()
+/obj/item/organ/genital/Initialize()
..()
reagents = create_reagents(fluid_max_volume)
+/obj/item/organ/genital/Destroy()
+ if(owner)
+ Remove(owner, 1)//this should remove references to it, so it can be GCd correctly
+ update_link()
+ return ..()
+
/obj/item/organ/genital/proc/update()
- return
+ update_size()
+ update_appearance()
+ update_link()
/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()
@@ -40,7 +46,6 @@
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()
@@ -69,7 +74,7 @@
if(dna.species.use_skintones && dna.features["genitals_use_skintone"])
P.color = skintone2hex(skin_tone)
else
- P.color = dna.features["cock_color"]
+ 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"]
@@ -83,10 +88,10 @@
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"]
+// 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"]
diff --git a/code/citadel/organs/penis.dm b/code/citadel/organs/penis.dm
index 7427503a99..8e10540a7d 100644
--- a/code/citadel/organs/penis.dm
+++ b/code/citadel/organs/penis.dm
@@ -6,7 +6,6 @@
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
@@ -17,8 +16,7 @@
var/list/knotted_types = list("", "barbknot")
var/obj/item/organ/genital/testicles/linked_balls
-/obj/item/organ/genital/penis/New()
- ..()
+/obj/item/organ/genital/penis/Initialize()
update()
/obj/item/organ/genital/penis/update()
@@ -41,13 +39,13 @@
girth = (length * girth_ratio)
/obj/item/organ/genital/penis/update_appearance()
- var/string = "penis_[shape]_[size]"
+ var/string = "penis_[lowertext(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)
+ color = "#[owner.dna.features["cock_color"]]"
/obj/item/organ/genital/penis/update_link()
if(owner)
diff --git a/code/citadel/organs/testicles.dm b/code/citadel/organs/testicles.dm
index 9f2b0bacf2..1c1035e278 100644
--- a/code/citadel/organs/testicles.dm
+++ b/code/citadel/organs/testicles.dm
@@ -14,10 +14,10 @@
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()
- ..()
+/obj/item/organ/genital/testicles/Initialize()
create_reagents(fluid_max_volume)
reagents.add_reagent(fluid_id, fluid_max_volume)
+ update()
/obj/item/organ/genital/testicles/on_life()
if(fluid_id && producing)
diff --git a/code/citadel/organs/vagina.dm b/code/citadel/organs/vagina.dm
index 1229c45be9..2a77d976c6 100644
--- a/code/citadel/organs/vagina.dm
+++ b/code/citadel/organs/vagina.dm
@@ -1,6 +1,7 @@
/obj/item/organ/genital/vagina
name = "vagina"
desc = "A female reproductive organ."
+ icon = 'code/citadel/icons/vagina.dmi'
icon_state = "vagina"
zone = "groin"
slot = "vagina"
diff --git a/code/citadel/toys/dildos.dm b/code/citadel/toys/dildos.dm
new file mode 100644
index 0000000000..a68d85db14
--- /dev/null
+++ b/code/citadel/toys/dildos.dm
@@ -0,0 +1,148 @@
+//////////
+//DILDOS//
+//////////
+obj/item/weapon/dildo
+ name = "dildo"
+ desc = "Floppy!"
+ icon = 'code/citadel/icons/dildo.dmi'
+ damtype = BRUTE
+ force = 0
+ throwforce = 0
+ icon_state = "dildo_knotted_2"
+ alpha = 192//transparent
+ var/can_customize = FALSE
+ var/dildo_shape = "human"
+ var/dildo_size = 2
+ var/dildo_type = "dildo"//pretty much just used for the icon state
+ var/random_color = TRUE
+ var/random_size = FALSE
+ var/random_shape = FALSE
+ //these lists are used to generate random icons, stats, and names
+ var/list/possible_colors = list(//mostly neon colors
+ "Cyan" = "#00f9ff",//cyan
+ "Green" = "#49ff00",//green
+ "Pink" = "#ff4adc",//pink
+ "Yellow" = "#fdff00",//yellow
+ "Blue" = "#00d2ff",//blue
+ "Lime" = "#89ff00",//lime
+ "Black" = "#101010",//black
+ "Red" = "#ff0000",//red
+ "Orange" = "#ff9a00",//orange
+ "Purple" = "#e300ff"//purple
+ )
+ var/list/possible_shapes = list(
+ "Human" = "human",
+ "Knotted" = "knotted",
+ "Plain" = "plain",
+ "Flared" = "flared"
+ )
+ var/list/possible_sizes = list(
+ "Small" = 1,
+ "Medium" = 2,
+ "Big" = 3
+ )
+
+obj/item/weapon/dildo/proc/update_appearance()
+ icon_state = "[dildo_type]_[dildo_shape]_[dildo_size]"
+ var/sizeword = ""
+ switch(dildo_size)
+ if(1)
+ sizeword = "small "
+ if(2)
+ sizeword = ""
+ if(3)
+ sizeword = "big "
+ if(4)
+ sizeword = "huge "
+ if(5)
+ sizeword = "gigantic "
+
+ name = "[sizeword][dildo_shape] [can_customize ? "custom " : ""][dildo_type]"
+
+obj/item/weapon/dildo/AltClick(mob/living/user)
+ customize(user)
+
+obj/item/weapon/dildo/proc/customize(mob/living/user)
+ if(!can_customize)
+ return FALSE
+ if(src && !user.incapacitated() && in_range(user,src))
+ var/color_choice = input(user,"Choose a color for your dildo.","Dildo Color") as null|anything in possible_colors
+ if(src && color_choice && !user.incapacitated() && in_range(user,src))
+ sanitize_inlist(color_choice, possible_colors, "Red")
+ color = possible_colors[color_choice]
+ update_appearance()
+ if(src && !user.incapacitated() && in_range(user,src))
+ var/shape_choice = input(user,"Choose a shape for your dildo.","Dildo Shape") as null|anything in possible_shapes
+ if(src && shape_choice && !user.incapacitated() && in_range(user,src))
+ sanitize_inlist(shape_choice, possible_colors, "Knotted")
+ dildo_shape = possible_shapes[shape_choice]
+ update_appearance()
+ if(src && !user.incapacitated() && in_range(user,src))
+ var/size_choice = input(user,"Choose the size for your dildo.","Dildo Size") as null|anything in possible_sizes
+ if(src && size_choice && !user.incapacitated() && in_range(user,src))
+ sanitize_inlist(size_choice, possible_colors, "Medium")
+ dildo_size = possible_sizes[size_choice]
+ update_appearance()
+ if(src && !user.incapacitated() && in_range(user,src))
+ var/transparency_choice = input(user,"Choose the transparency of your dildo. Lower is more transparent!(192-255)","Dildo Transparency") as null|num
+ if(src && transparency_choice && !user.incapacitated() && in_range(user,src))
+ sanitize_integer(transparency_choice, 192, 255, 192)
+ alpha = transparency_choice
+ update_appearance()
+ return TRUE
+
+obj/item/weapon/dildo/Initialize()
+ if(random_color == TRUE)
+ var/randcolor = pick(possible_colors)
+ color = possible_colors[randcolor]
+ if(random_shape == TRUE)
+ var/randshape = pick(possible_shapes)
+ dildo_shape = possible_shapes[randshape]
+ if(random_size == TRUE)
+ var/randsize = pick(possible_sizes)
+ dildo_size = possible_sizes[randsize]
+ update_appearance()
+ alpha = rand(192, 255)
+ pixel_y = rand(-7,7)
+ pixel_x = rand(-7,7)
+
+obj/item/weapon/dildo/examine(mob/user)
+ ..()
+ if(can_customize)
+ user << "Alt-Click \the [src.name] to customize it."
+
+obj/item/weapon/dildo/random//totally random
+ name = "random dildo"//this name will show up in vendors and shit so you know what you're vending(or don't, i guess :^))
+ random_color = TRUE
+ random_shape = TRUE
+ random_size = TRUE
+
+
+obj/item/weapon/dildo/knotted
+ dildo_shape = "knotted"
+ name = "knotted dildo"
+
+obj/item/weapon/dildo/human
+ dildo_shape = "human"
+ name = "human dildo"
+
+obj/item/weapon/dildo/plain
+ dildo_shape = "plain"
+ name = "plain dildo"
+
+obj/item/weapon/dildo/flared
+ dildo_shape = "flared"
+ name = "flared dildo"
+
+obj/item/weapon/dildo/flared/huge
+ name = "literal horse cock"
+ desc = "THIS THING IS HUGE!"
+ dildo_size = 4
+
+obj/item/weapon/dildo/custom
+ name = "customizable dildo"
+ desc = "Thanks to significant advances in synthetic nanomaterials, this dildo is capable of taking on many different forms to fit the user's preferences! Pricy!"
+ can_customize = TRUE
+ random_color = TRUE
+ random_shape = TRUE
+ random_size = TRUE
\ No newline at end of file
diff --git a/code/datums/weather/weather_types.dm b/code/datums/weather/weather_types.dm
index aa5f05f5c3..5938bfebde 100644
--- a/code/datums/weather/weather_types.dm
+++ b/code/datums/weather/weather_types.dm
@@ -124,8 +124,8 @@
weather_message = "You feel waves of heat wash over you! Find shelter!"
weather_overlay = "ash_storm"
- weather_duration_lower = 600
- weather_duration_upper = 1500
+ weather_duration_lower = 100
+ weather_duration_upper = 600
weather_color = "green"
weather_sound = 'sound/misc/bloblarm.ogg'
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index d44c90919b..ad2bafa980 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -1168,11 +1168,13 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
products = list(
/obj/item/clothing/under/maid = 5,
/obj/item/clothing/under/stripper_pink = 5,
- /obj/item/clothing/under/stripper_green = 5
+ /obj/item/clothing/under/stripper_green = 5,
+ /obj/item/weapon/dildo/custom = 5
)
contraband = list(/obj/item/weapon/restraints/handcuffs/fake/kinky = 5,
- /obj/item/clothing/neck/petcollar=5,
- /obj/item/clothing/under/mankini = 1
+ /obj/item/clothing/neck/petcollar = 5,
+ /obj/item/clothing/under/mankini = 1,
+ /obj/item/weapon/dildo/flared/huge = 1
)
premium = list()
refill_canister = /obj/item/weapon/vending_refill/kink
diff --git a/code/game/objects/items/weapons/vending_items.dm b/code/game/objects/items/weapons/vending_items.dm
index 94042daf85..248a39f9da 100644
--- a/code/game/objects/items/weapons/vending_items.dm
+++ b/code/game/objects/items/weapons/vending_items.dm
@@ -75,8 +75,8 @@
/obj/item/weapon/vending_refill/kink
machine_name = "KinkMate"
icon_state = "refill_kink"
- charges = list(6, 4, 0)// of 30 standard, 0 contraband, 15 premium
- init_charges = list(6, 4, 0)
+ charges = list(8, 5, 0)// of 20 standard, 12 contraband, 0 premium
+ init_charges = list(8, 5, 0)
/obj/item/weapon/vending_refill/nazi
machine_name = "nazivend"
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 6d47bc7f0d..737ecfb14b 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -290,6 +290,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["socks"] >> socks
S["backbag"] >> backbag
S["uplink_loc"] >> uplink_spawn_loc
+ S["feature_exhibitionist"] >> features["exhibitionist"]
S["feature_mcolor"] >> features["mcolor"]
S["feature_mcolor2"] >> features["mcolor2"]
S["feature_mcolor3"] >> features["mcolor3"]
@@ -432,10 +433,10 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
features["has_breasts"] = sanitize_integer(features["has_breasts"], 0, 1, 0)
features["breasts_size"] = sanitize_inlist(features["breasts_size"], breasts_size_list, "C")
features["breasts_color"] = sanitize_hexcolor(features["breasts_color"], 3, 0)
- features["breasts_fluid"] = sanitize_inlist(features["breasts_fluid"], cum_id_list, "semen")
+ features["breasts_fluid"] = sanitize_inlist(features["breasts_fluid"], milk_id_list, "milk")
//vagina features
features["has_vag"] = sanitize_integer(features["has_vag"], 0, 1, 0)
- features["vag_color"] = sanitize_hexcolor(features["breasts_color"], 3, 0)
+ features["vag_color"] = sanitize_hexcolor(features["vag_color"], 3, 0)
joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole))
job_civilian_high = sanitize_integer(job_civilian_high, 0, 65535, initial(job_civilian_high))
@@ -480,6 +481,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["uplink_loc"] << uplink_spawn_loc
S["flavor_text"] << flavor_text
S["species"] << pref_species.id
+ S["feature_exhibitionist"] << features["exhibitionist"]
S["feature_mcolor"] << features["mcolor"]
S["feature_mcolor2"] << features["mcolor2"]
S["feature_mcolor3"] << features["mcolor3"]
diff --git a/code/modules/events/grid_check.dm b/code/modules/events/grid_check.dm
index a7a6a3564e..61aad3acac 100644
--- a/code/modules/events/grid_check.dm
+++ b/code/modules/events/grid_check.dm
@@ -1,8 +1,8 @@
/datum/round_event_control/grid_check
name = "Grid Check"
typepath = /datum/round_event/grid_check
- weight = 10
- max_occurrences = 3
+ weight = 7
+ max_occurrences = 1
/datum/round_event/grid_check
announceWhen = 1
diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm
index 581844bb4f..a156a0754a 100644
--- a/code/modules/events/radiation_storm.dm
+++ b/code/modules/events/radiation_storm.dm
@@ -2,6 +2,7 @@
name = "Radiation Storm"
typepath = /datum/round_event/radiation_storm
max_occurrences = 1
+ weight = 7
/datum/round_event/radiation_storm
diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm
index d56d61b22b..14ceb2cb23 100644
--- a/code/modules/events/vent_clog.dm
+++ b/code/modules/events/vent_clog.dm
@@ -10,7 +10,8 @@
var/interval = 2
var/list/vents = list()
var/list/gunk = list("water","carbon","flour","radium","toxin","cleaner","nutriment","condensedcapsaicin","mushroomhallucinogen","lube",
- "plantbgone","banana","charcoal","space_drugs","morphine","holywater","ethanol","hot_coco","sacid")
+ "plantbgone","banana","charcoal","space_drugs","morphine","holywater","ethanol","hot_coco","sacid",
+ "aphro","aphro+","anaphro","anaphro+","semen")
/datum/round_event/vent_clog/announce()
priority_announce("The scrubbers network is experiencing a backpressure surge. Some ejection of contents may occur.", "Atmospherics alert")
diff --git a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
index 1ac5b3edfa..38625b68e4 100644
--- a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
@@ -525,6 +525,22 @@
icon_state = "glass_yellow"
name = "Eggnog"
desc = "For enjoying the most wonderful time of the year."
+ if("aphro")
+ icon_state = "glass_aphro"
+ name = "glass of aphrodisiac"
+ desc = "For your love interest."
+ if("aphro+")
+ icon_state = "glass_aphro+"
+ name = "glass of strong aphrodisiac"
+ desc = "For your less interested love interest."
+ if("semen")
+ icon_state = "glass_semen"
+ name = "glass of semen"
+ desc = "Salty."
+ if("femcum")
+ icon_state = "glass_femcum"
+ name = "glass of female ejaculate"
+ desc = "A glass of female ejaculate."
else
icon_state ="glass_brown"
var/image/I = image(icon, "glassoverlay")
@@ -635,6 +651,18 @@
icon_state = "shotglassgreen"
name = "shot of absinthe"
desc = "I am stuck in the cycles of my guilt..."
+ if ("semen")
+ icon_state = "shotglasswhite"
+ name = "cum shot"
+ desc = "All those college years boil down to this."
+ if("aphro")
+ icon_state = "shotglassaphro"
+ name = "shot of love"
+ desc = "Guaranteed to put you in the mood."
+ if("aphro+")
+ icon_state = "shotglassaphro"
+ name = "strong shot of love"
+ desc = "Guaranteed to put you in the mood. Not recommended to take more than one unless you're dedicated."
else
icon_state = "shotglassbrown"
name = "shot of... what?"
diff --git a/icons/obj/citvending.dmi b/icons/obj/citvending.dmi
index 74dcffbc01..37c2c8fcf1 100644
Binary files a/icons/obj/citvending.dmi and b/icons/obj/citvending.dmi differ
diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi
index a62f1db360..35b7b57eb9 100644
Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ
diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm
index d8627232ec..8eb61deb11 100644
--- a/interface/stylesheet.dm
+++ b/interface/stylesheet.dm
@@ -147,4 +147,6 @@ BIG IMG.icon {width: 32px; height: 32px;}
.memoedit {text-align: center; font-size: 2;}
.abductor {color: #800080; font-style: italic;}
+.love {color: #FF69Bf;}
+.lovebold {color: #FF69Bf; font-weight: bold;}
"}
diff --git a/sound/music/indeep.ogg b/sound/music/indeep.ogg
new file mode 100644
index 0000000000..b56a62d48d
Binary files /dev/null and b/sound/music/indeep.ogg differ
diff --git a/strings/round_start_sounds.txt b/strings/round_start_sounds.txt
index 3ad6b508f5..fdb23dc2da 100644
--- a/strings/round_start_sounds.txt
+++ b/strings/round_start_sounds.txt
@@ -16,4 +16,5 @@ sound/music/space_oddity.ogg
sound/music/starman.ogg
sound/music/torvus.ogg
sound/music/shootingstars.ogg
-sound/music/oceanman.ogg
\ No newline at end of file
+sound/music/oceanman.ogg
+sound/music/indeep.ogg
diff --git a/tgstation.dme b/tgstation.dme
index 6f6e4bf9a6..ef77ce9728 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -160,6 +160,7 @@
#include "code\citadel\organs\testicles.dm"
#include "code\citadel\organs\vagina.dm"
#include "code\citadel\organs\womb.dm"
+#include "code\citadel\toys\dildos.dm"
#include "code\controllers\admin.dm"
#include "code\controllers\configuration.dm"
#include "code\controllers\configuration_citadel.dm"