diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm index 9f5f52180c..2abe0db04e 100644 --- a/code/__DEFINES/citadel_defines.dm +++ b/code/__DEFINES/citadel_defines.dm @@ -33,8 +33,8 @@ #define BALLS_VOLUME_MULT 1 #define BALLS_SIZE_MIN 1 -#define BALLS_SIZE_DEF 3 -#define BALLS_SIZE_MAX 7 +#define BALLS_SIZE_DEF 2 +#define BALLS_SIZE_MAX 3 #define BALLS_SACK_SIZE_MIN 1 #define BALLS_SACK_SIZE_DEF 8 diff --git a/code/__HELPERS/_cit_helpers.dm b/code/__HELPERS/_cit_helpers.dm index eb2a564d1b..e21bee2e36 100644 --- a/code/__HELPERS/_cit_helpers.dm +++ b/code/__HELPERS/_cit_helpers.dm @@ -58,6 +58,7 @@ GLOBAL_LIST_EMPTY(ipc_antennas_list) //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_icons) //Associated list for names->icon_states for cockshapes. +GLOBAL_LIST_EMPTY(balls_shapes_list) GLOBAL_LIST_EMPTY(breasts_size_list) GLOBAL_LIST_EMPTY(breasts_shapes_list) GLOBAL_LIST_EMPTY(vagina_shapes_list) @@ -123,36 +124,36 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE) /mob/living/carbon/proc/has_penis() if(getorganslot("penis"))//slot shared with ovipositor if(istype(getorganslot("penis"), /obj/item/organ/genital/penis)) - return 1 - return 0 + return TRUE + return FALSE /mob/living/carbon/proc/has_balls() if(getorganslot("balls")) if(istype(getorganslot("balls"), /obj/item/organ/genital/testicles)) - return 1 - return 0 + return TRUE + return FALSE /mob/living/carbon/proc/has_vagina() if(getorganslot("vagina")) - return 1 - return 0 + return TRUE + return FALSE /mob/living/carbon/proc/has_breasts() if(getorganslot("breasts")) - return 1 - return 0 + return TRUE + return FALSE /mob/living/carbon/proc/has_ovipositor() if(getorganslot("penis"))//shared slot if(istype(getorganslot("penis"), /obj/item/organ/genital/ovipositor)) - return 1 - return 0 + return TRUE + return FALSE /mob/living/carbon/human/proc/has_eggsack() if(getorganslot("balls")) if(istype(getorganslot("balls"), /obj/item/organ/genital/eggsack)) - return 1 - return 0 + return TRUE + return FALSE /mob/living/carbon/human/proc/is_bodypart_exposed(bodypart) @@ -161,16 +162,16 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE) L = get_equipped_items() for(var/obj/item/I in L) if(I.body_parts_covered & GROIN) - return 0 - return 1 + return FALSE + return TRUE /mob/living/carbon/proc/is_chest_exposed(var/list/L) if(!L) L = get_equipped_items() for(var/obj/item/I in L) if(I.body_parts_covered & CHEST) - return 0 - return 1 + return FALSE + return TRUE //////////////////////// //DANGER | DEBUG PROCS// @@ -191,40 +192,3 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE) H.give_vagina() H.give_womb() 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() diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 74a1fbd785..6c6b197a12 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -77,6 +77,8 @@ //CIT CHANGES - genitals and such if(!GLOB.cock_shapes_list.len) 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) init_sprite_accessory_subtypes(/datum/sprite_accessory/vagina, GLOB.vagina_shapes_list) if(!GLOB.breasts_shapes_list.len) diff --git a/modular_citadel/code/modules/arousal/arousal.dm b/modular_citadel/code/modules/arousal/arousal.dm index ef9201af60..846a8cff62 100644 --- a/modular_citadel/code/modules/arousal/arousal.dm +++ b/modular_citadel/code/modules/arousal/arousal.dm @@ -40,7 +40,7 @@ adjustArousalLoss(arousal_rate * S.arousal_gain_rate) if(dna.features["exhibitionist"] && client) var/amt_nude = 0 - if(is_chest_exposed() && (gender == FEMALE || getorganslot("breasts"))) + if(is_chest_exposed() && (getorganslot("breasts"))) amt_nude++ if(is_groin_exposed()) if(getorganslot("penis")) @@ -64,14 +64,14 @@ /mob/living/proc/adjustArousalLoss(amount, updating_arousal=1) if(status_flags & GODMODE || !canbearoused) - return 0 + return FALSE arousalloss = CLAMP(arousalloss + amount, min_arousal, max_arousal) if(updating_arousal) updatearousal() /mob/living/proc/setArousalLoss(amount, updating_arousal=1) if(status_flags & GODMODE || !canbearoused) - return 0 + return FALSE arousalloss = CLAMP(amount, min_arousal, max_arousal) if(updating_arousal) updatearousal() @@ -99,6 +99,8 @@ switch(G.type) if(/obj/item/organ/genital/penis) 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) S = GLOB.vagina_shapes_list[G.shape] if(/obj/item/organ/genital/breasts) @@ -112,54 +114,54 @@ G.update_appearance() /mob/living/proc/update_arousal_hud() - return 0 + return FALSE /datum/species/proc/update_arousal_hud(mob/living/carbon/human/H) - return 0 + return FALSE /mob/living/carbon/human/update_arousal_hud() if(!client || !hud_used) - return 0 + return FALSE if(dna.species.update_arousal_hud()) - return 0 + return FALSE if(!canbearoused) hud_used.arousal.icon_state = "" - return 0 + return FALSE else if(hud_used.arousal) if(stat == DEAD) hud_used.arousal.icon_state = "arousal0" - return 1 + return TRUE if(getArousalLoss() == max_arousal) 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 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 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 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 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 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 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 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 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 hud_used.arousal.icon_state = "arousal10" - return 1 + return TRUE else hud_used.arousal.icon_state = "arousal0" @@ -171,11 +173,11 @@ /obj/screen/arousal/Click() if(!isliving(usr)) - return 0 + return FALSE var/mob/living/M = usr if(M.canbearoused) M.mob_climax() - return 1 + return TRUE else to_chat(M, "Arousal is disabled. Feature is unavailable.") @@ -196,13 +198,6 @@ "You have relieved yourself.") SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) setArousalLoss(min_arousal) - /* - switch(gender) - if(MALE) - PoolOrNew(/obj/effect/decal/cleanable/semen, loc) - if(FEMALE) - PoolOrNew(/obj/effect/decal/cleanable/femcum, loc) - */ else to_chat(src, "You aren't aroused enough for that.") diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 1239a515cd..7d482ec3a0 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -60,7 +60,5 @@ string = "breasts_[lowertext(shape)]_[size]" if(ishuman(owner)) var/mob/living/carbon/human/H = owner + icon_state = sanitize_text(string) H.update_genitals() - - icon_state = sanitize_text(string) - diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index 591bb6f1de..592d1e2f33 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -165,7 +165,7 @@ P.Insert(src) if(P) if(dna.species.use_skintones && dna.features["genitals_use_skintone"]) - P.color = skintone2hex(skin_tone) + P.color = "#[skintone2hex(skin_tone)]" else P.color = "#[dna.features["cock_color"]]" P.length = dna.features["cock_length"] @@ -181,13 +181,14 @@ 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(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.sack_size = dna.features["balls_sack_size"] + T.shape = "single" T.fluid_id = dna.features["balls_fluid"] T.fluid_rate = dna.features["balls_cum_rate"] T.fluid_mult = dna.features["balls_cum_mult"] @@ -204,7 +205,7 @@ B.Insert(src) if(B) if(dna.species.use_skintones && dna.features["genitals_use_skintone"]) - B.color = skintone2hex(skin_tone) + B.color = "#[skintone2hex(skin_tone)]" else B.color = "#[dna.features["breasts_color"]]" B.size = dna.features["breasts_size"] @@ -228,7 +229,7 @@ V.Insert(src) if(V) if(dna.species.use_skintones && dna.features["genitals_use_skintone"]) - V.color = skintone2hex(skin_tone) + V.color = "#[skintone2hex(skin_tone)]" else V.color = "[dna.features["vag_color"]]" V.shape = "[dna.features["vag_shape"]]" @@ -297,7 +298,9 @@ for(var/obj/item/organ/O in H.internal_organs) if(isgenital(O)) var/obj/item/organ/genital/G = O + to_chat(world, "checking [G] for exposure") if(G.is_exposed()) //Checks appropriate clothing slot and if it's through_clothes + to_chat(world, "[G] is [G.is_exposed() ? "true" : "false"]") genitals_to_add += H.getorganslot(G.slot) //Now we added all genitals that aren't internal and should be rendered @@ -308,9 +311,12 @@ var/datum/sprite_accessory/S size = G.size aroused_state = G.aroused_state + to_chat(world, "switching [G.type] for sprite loading") switch(G.type) if(/obj/item/organ/genital/penis) 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) S = GLOB.vagina_shapes_list[G.shape] if(/obj/item/organ/genital/breasts) @@ -318,8 +324,10 @@ if(!S || S.icon_state == "none") continue + var/mutable_appearance/genital_overlay = mutable_appearance(S.icon, layer = -layer) genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size]_[aroused_state]_[layertext]" + to_chat(world, "[G.slot]_[S.icon_state]_[size]_[aroused_state]_[layertext] is icon state") if(S.center) genital_overlay = center_image(genital_overlay, S.dimension_x, S.dimension_y) @@ -331,12 +339,15 @@ switch(S.color_src) if("cock_color") genital_overlay.color = "#[H.dna.features["cock_color"]]" + if("balls_color") + genital_overlay.color = "#[H.dna.features["balls_color"]]" if("breasts_color") genital_overlay.color = "#[H.dna.features["breasts_color"]]" if("vag_color") genital_overlay.color = "#[H.dna.features["vag_color"]]" standing += genital_overlay + if(LAZYLEN(standing)) H.overlays_standing[layer] = standing.Copy() standing = list() diff --git a/modular_citadel/code/modules/arousal/organs/genitals_sprite_accessories.dm b/modular_citadel/code/modules/arousal/organs/genitals_sprite_accessories.dm index e857c0d7ed..eaf493482f 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals_sprite_accessories.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals_sprite_accessories.dm @@ -55,8 +55,19 @@ center = TRUE //Center the image 'cause 2-tile wide. dimension_x = 64 +//Testicles +//These ones aren't inert +/datum/sprite_accessory/testicles + icon = 'modular_citadel/icons/obj/genitals/penis_onmob.dmi' + icon_state = "testicle" + name = "testicle" //the preview name of the accessory + color_src = "balls_color" + locked = 0 - +/datum/sprite_accessory/testicles/single + icon_state = "single" + name = "single" + alt_aroused = TRUE //Vaginas /datum/sprite_accessory/vagina diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index ac812e286d..2498ff6370 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -52,15 +52,15 @@ string = "penis_[GLOB.cock_shapes_icons[shape]]_[size]" if(ishuman(owner)) var/mob/living/carbon/human/H = owner + icon_state = sanitize_text(string) H.update_genitals() - icon_state = sanitize_text(string) - /obj/item/organ/genital/penis/update_link() if(owner) linked_organ = (owner.getorganslot("testicles")) if(linked_organ) linked_organ.linked_organ = src + linked_organ.size = size else if(linked_organ) linked_organ.linked_organ = null diff --git a/modular_citadel/code/modules/arousal/organs/testicles.dm b/modular_citadel/code/modules/arousal/organs/testicles.dm index 815d8034e7..2ee92d743a 100644 --- a/modular_citadel/code/modules/arousal/organs/testicles.dm +++ b/modular_citadel/code/modules/arousal/organs/testicles.dm @@ -3,15 +3,20 @@ desc = "A male reproductive organ." icon_state = "testicles" icon = 'modular_citadel/icons/obj/genitals/penis.dmi' + var/icon_on = 'modular_citadel/icons/obj/genitals/penis_onmob.dmi' zone = "groin" slot = "testicles" w_class = 3 - internal = TRUE - size = BALLS_SIZE_DEF + size = BALLS_SIZE_MIN + var/size_name = "Normal" + shape = "single" 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 + 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() . = ..() @@ -23,14 +28,22 @@ if(reagents && producing) generate_cum() +/obj/item/organ/genital/testicles/update_size() + if(size == 1) + size_name = "Normal" + if(size == 2) + size_name = "Enlarged" + if(size == 3) + size_name = "Engorged" + /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) send_full_message() - sent_full_message = 1 + sent_full_message = TRUE return FALSE - sent_full_message = 0 + sent_full_message = FALSE update_link() if(!linked_organ) return FALSE @@ -42,6 +55,8 @@ linked_organ = (owner.getorganslot("penis")) if(linked_organ) linked_organ.linked_organ = src + size = linked_organ.size + update_size() else if(linked_organ) linked_organ.linked_organ = null @@ -49,6 +64,22 @@ /obj/item/organ/genital/testicles/proc/send_full_message(msg = "Your balls finally feel full, again.") if(owner && istext(msg)) - owner << msg + to_chat(owner, msg) return TRUE +/obj/item/organ/genital/testicles/update_appearance() + if(owner) + desc = "You see a pair of testicles dangling. They're quite [lowertext(size_name)]." + 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_[size_name]-s" + else + color = "#[owner.dna.features["balls_color"]]" + string = "testicles_[size_name]" + if(ishuman(owner)) + var/mob/living/carbon/human/H = owner + icon_state = sanitize_text(string) + H.update_genitals() diff --git a/modular_citadel/code/modules/arousal/organs/vagina.dm b/modular_citadel/code/modules/arousal/organs/vagina.dm index b8ef7029b6..8c15aa5437 100644 --- a/modular_citadel/code/modules/arousal/organs/vagina.dm +++ b/modular_citadel/code/modules/arousal/organs/vagina.dm @@ -60,10 +60,9 @@ string = "vagina" if(ishuman(owner)) var/mob/living/carbon/human/H = owner + icon_state = sanitize_text(string) H.update_genitals() - icon_state = sanitize_text(string) - /obj/item/organ/genital/vagina/update_link() if(owner) linked_organ = (owner.getorganslot("womb")) diff --git a/modular_citadel/icons/obj/genitals/breasts_onmob.dmi b/modular_citadel/icons/obj/genitals/breasts_onmob.dmi index b0dc1d7aef..1869e082de 100644 Binary files a/modular_citadel/icons/obj/genitals/breasts_onmob.dmi and b/modular_citadel/icons/obj/genitals/breasts_onmob.dmi differ diff --git a/modular_citadel/icons/obj/genitals/penis.dmi b/modular_citadel/icons/obj/genitals/penis.dmi index 5ea37a722d..02597b3cdb 100644 Binary files a/modular_citadel/icons/obj/genitals/penis.dmi and b/modular_citadel/icons/obj/genitals/penis.dmi differ diff --git a/modular_citadel/icons/obj/genitals/penis_onmob.dmi b/modular_citadel/icons/obj/genitals/penis_onmob.dmi index 2457759b73..0ab1b951a7 100644 Binary files a/modular_citadel/icons/obj/genitals/penis_onmob.dmi and b/modular_citadel/icons/obj/genitals/penis_onmob.dmi differ diff --git a/modular_citadel/icons/obj/genitals/vagina.dmi b/modular_citadel/icons/obj/genitals/vagina.dmi index 00891888a4..39bdd48e89 100644 Binary files a/modular_citadel/icons/obj/genitals/vagina.dmi and b/modular_citadel/icons/obj/genitals/vagina.dmi differ diff --git a/modular_citadel/icons/obj/genitals/vagina_onmob.dmi b/modular_citadel/icons/obj/genitals/vagina_onmob.dmi index c22c12ded3..e6ad183687 100644 Binary files a/modular_citadel/icons/obj/genitals/vagina_onmob.dmi and b/modular_citadel/icons/obj/genitals/vagina_onmob.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 4d74c8a95f..dea02c485f 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -2502,12 +2502,6 @@ #include "code\modules\research\server.dm" #include "code\modules\research\stock_parts.dm" #include "code\modules\research\designs\AI_module_designs.dm" -#include "code\modules\research\designs\autolathe_desings\autolathe_designs_construction.dm" -#include "code\modules\research\designs\autolathe_desings\autolathe_designs_electronics.dm" -#include "code\modules\research\designs\autolathe_desings\autolathe_designs_medical_and_dinnerware.dm" -#include "code\modules\research\designs\autolathe_desings\autolathe_designs_sec_and_hacked.dm" -#include "code\modules\research\designs\autolathe_desings\autolathe_designs_tcomms_and_misc.dm" -#include "code\modules\research\designs\autolathe_desings\autolathe_designs_tools.dm" #include "code\modules\research\designs\biogenerator_designs.dm" #include "code\modules\research\designs\bluespace_designs.dm" #include "code\modules\research\designs\comp_board_designs.dm" @@ -2527,6 +2521,12 @@ #include "code\modules\research\designs\stock_parts_designs.dm" #include "code\modules\research\designs\telecomms_designs.dm" #include "code\modules\research\designs\weapon_designs.dm" +#include "code\modules\research\designs\autolathe_desings\autolathe_designs_construction.dm" +#include "code\modules\research\designs\autolathe_desings\autolathe_designs_electronics.dm" +#include "code\modules\research\designs\autolathe_desings\autolathe_designs_medical_and_dinnerware.dm" +#include "code\modules\research\designs\autolathe_desings\autolathe_designs_sec_and_hacked.dm" +#include "code\modules\research\designs\autolathe_desings\autolathe_designs_tcomms_and_misc.dm" +#include "code\modules\research\designs\autolathe_desings\autolathe_designs_tools.dm" #include "code\modules\research\machinery\_production.dm" #include "code\modules\research\machinery\circuit_imprinter.dm" #include "code\modules\research\machinery\departmental_circuit_imprinter.dm"