diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index b977e6ff7b68..ef43504cf7b9 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -357,6 +357,23 @@ if(BODY_ZONE_R_LEG) return list(LEG_RIGHT, FOOT_RIGHT) +// BLUEMOON ADD START - Применяется, когда нужна специфичная часть тела +/proc/zone2body_parts_covered_complicated(def_zone) + switch(def_zone) + if(BODY_ZONE_HEAD, BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH) + return HEAD + if(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_GROIN) + return CHEST + if(BODY_ZONE_L_ARM) + return ARM_LEFT + if(BODY_ZONE_R_ARM) + return ARM_RIGHT + if(BODY_ZONE_L_LEG) + return LEG_LEFT + if(BODY_ZONE_R_LEG) + return LEG_RIGHT +// BLUEMOON ADD END + //Turns a Body_parts_covered bitfield into a list of organ/limb names. //(I challenge you to find a use for this) -I found a use for it!! /proc/body_parts_covered2organ_names(bpc) diff --git a/code/game/objects/items/clown_items.dm b/code/game/objects/items/clown_items.dm index 7536fe0dc52f..199d83104676 100644 --- a/code/game/objects/items/clown_items.dm +++ b/code/game/objects/items/clown_items.dm @@ -31,6 +31,12 @@ . = ..() AddComponent(/datum/component/slippery, 80) +// BLUEMOON ADD START - дополнительное описание +/obj/item/soap/examine(user, distance) + . = ..() + . += span_info("Мылом можно в том числе убирать надписи с частей тела, оставленные ручкой.") // рассказываем о механиках через описания +// BLUEMOON ADD END + /obj/item/soap/nanotrasen desc = "A Nanotrasen brand bar of soap. Smells of plasma." icon_state = "soapnt" @@ -56,6 +62,71 @@ new /obj/effect/particle_effect/foam(loc) return (TOXLOSS) +// BLUEMOON ADD START - введено мытье отдельных частей тела, чтобы смывать с них надписи +/obj/item/soap/attack(mob/living/target, mob/living/user) + if(ishuman(target)) + var/mob/living/carbon/human/H = target // BLUEMOON EDIT + + var/target_limb + + target_limb = zone2body_parts_covered_complicated(user.zone_selected) + + if(!target_limb) + to_chat(user, span_warning("You must choose a bodypart on your doll to write on!")) + return + + var/list/items_on_target = list() + items_on_target = H.get_equipped_items() + + for(var/A in items_on_target) + var/obj/item/worn_clothes = A + if(worn_clothes.body_parts_covered & target_limb) + to_chat(user, span_warning("The target body part is covered with their clothes.")) + return + + var/try_to_clean_genitals = FALSE + switch(user.zone_selected) + if(BODY_ZONE_PRECISE_MOUTH) + H.visible_message("\the [user] begins to wash out \the [target]'s mouth with [src.name]!", "[user] is starting to wash out your mouth with [src.name]! IT'S AWFUL!") //washes mouth out with soap sounds better than 'the soap' here + if(do_after(user, 4 SECONDS, target = H)) + H.visible_message("\the [user] washes \the [target]'s mouth out with [src.name]!", "[user] washes out your mouth with [src.name]! IT WAS AWFUL!") //washes mouth out with soap sounds better than 'the soap' here + H.lip_style = null //removes lipstick + H.update_body() + return + if(BODY_ZONE_PRECISE_EYES) + target_limb = BODY_ZONE_HEAD + if(BODY_ZONE_PRECISE_GROIN, BODY_ZONE_CHEST) // технически, у моба нет органа таза на момент написания + target_limb = BODY_ZONE_CHEST + try_to_clean_genitals = TRUE + else + target_limb = user.zone_selected + + var/obj/item/bodypart/affected = H.get_bodypart(target_limb) + + if(try_to_clean_genitals) + if(user.zone_selected == BODY_ZONE_PRECISE_GROIN) // механически, моется не таз, а грудь + H.visible_message(span_lewd("[user] begins to wash [target]'s groin with [name], as well as taking in account their genitals there."), span_lewd("[user] is starting to wash your groin with [name]... And your genitals their.")) + else + H.visible_message(span_lewd("[user] begins to wash [target]'s [affected] with [name], as well as taking in account their private parts."), span_lewd("[user] is starting to wash your [affected] with [name]... And your private parts.")) + else + H.visible_message(span_notice("[user] begins to wash [target]'s [affected] with [name]!"), span_notice("[user] is starting to wash your [affected] with [name]!")) + + if(do_after(user, 4 SECONDS, target = H)) + target.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) + target.clean_blood() + SEND_SIGNAL(target, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_MEDIUM) + target.wash_cream() + target.wash_cum() + affected.writtentext = "" + if(try_to_clean_genitals) + for(var/obj/item/organ/genital/G in H.internal_organs) + if(G.writtentext && G.is_exposed() && G.zone == user.zone_selected) + G.writtentext = "" + H.visible_message(span_lewd("[user] washed up [target]'s [affected]!... As well as personal belongings there."), span_lewd("[user] washed up your [affected], as well as your personal belongings there.")) + else + H.visible_message(span_notice("[user] washed up [target]'s [affected]!"), span_notice("[user] washed up your [affected]!")) +// BLUEMOON ADD END + /obj/item/soap/afterattack(atom/target, mob/user, proximity) . = ..() if(!proximity || !check_allowed_items(target)) @@ -69,12 +140,14 @@ if(do_after(user, src.cleanspeed, target = target)) to_chat(user, "You scrub \the [target.name] out.") qdel(target) + /* BLUEMOON REMOVAL START - технически, этот кусок не работает, т.к. прок не работает на хуманов else if(ishuman(target) && user.zone_selected == BODY_ZONE_PRECISE_MOUTH) var/mob/living/carbon/human/H = user user.visible_message("\the [user] washes \the [target]'s mouth out with [src.name]!", "You wash \the [target]'s mouth out with [src.name]!") //washes mouth out with soap sounds better than 'the soap' here H.lip_style = null //removes lipstick H.update_body() return + / BLUEMOON REMOVAL END */ else if(istype(target, /obj/structure/window)) user.visible_message("[user] begins to clean \the [target.name] with [src]...", "You begin to clean \the [target.name] with [src]...") if(do_after(user, src.cleanspeed, target = target)) diff --git a/code/modules/arousal/organs/breasts.dm b/code/modules/arousal/organs/breasts.dm index 123ca38f08e5..3d9c3573f330 100644 --- a/code/modules/arousal/organs/breasts.dm +++ b/code/modules/arousal/organs/breasts.dm @@ -3,6 +3,9 @@ /obj/item/organ/genital/breasts name = "Грудь" + ru_name = "грудь" // BLUEMOON ADD + ru_name_v = "груди" // BLUEMOON ADD + ru_name_capital = "Грудь" // BLUEMOON ADD desc = "Female milk producing organs." icon_state = "breasts" icon = 'icons/obj/genitals/breasts.dmi' diff --git a/code/modules/arousal/organs/butt.dm b/code/modules/arousal/organs/butt.dm index 748f2e409923..70497a87bacd 100644 --- a/code/modules/arousal/organs/butt.dm +++ b/code/modules/arousal/organs/butt.dm @@ -1,5 +1,8 @@ /obj/item/organ/genital/butt name = "Попа" + ru_name = "попа" // BLUEMOON ADD + ru_name_v = "попе" // BLUEMOON ADD + ru_name_capital = "Попа" // BLUEMOON ADD desc = "You see a pair of asscheeks." icon_state = "butt" icon = 'icons/obj/genitals/butt.dmi' diff --git a/code/modules/arousal/organs/penis.dm b/code/modules/arousal/organs/penis.dm index cac526aed41c..3b2211632160 100644 --- a/code/modules/arousal/organs/penis.dm +++ b/code/modules/arousal/organs/penis.dm @@ -1,5 +1,8 @@ /obj/item/organ/genital/penis - name = "Член" + name = "член" + ru_name = "член" // BLUEMOON ADD + ru_name_v = "члене" // BLUEMOON ADD + ru_name_capital = "Член" // BLUEMOON ADD desc = "A male reproductive organ." icon_state = "penis" icon = 'icons/obj/genitals/penis.dmi' diff --git a/code/modules/arousal/organs/testicles.dm b/code/modules/arousal/organs/testicles.dm index 12ea7a9ea159..bf9239ecd83c 100644 --- a/code/modules/arousal/organs/testicles.dm +++ b/code/modules/arousal/organs/testicles.dm @@ -1,5 +1,8 @@ /obj/item/organ/genital/testicles name = "яйца" + ru_name = "яйца" // BLUEMOON ADD + ru_name_v = "яйцах" // BLUEMOON ADD + ru_name_capital = "Яйца" // BLUEMOON ADD desc = "A male reproductive organ." icon_state = "testicles" icon = 'icons/obj/genitals/testicles.dmi' diff --git a/code/modules/arousal/organs/vagina.dm b/code/modules/arousal/organs/vagina.dm index 41ce1887ed1a..dc94af02eaa8 100644 --- a/code/modules/arousal/organs/vagina.dm +++ b/code/modules/arousal/organs/vagina.dm @@ -1,5 +1,8 @@ /obj/item/organ/genital/vagina name = "вагина" + ru_name = "вагина" // BLUEMOON ADD + ru_name_v = "вагине" // BLUEMOON ADD + ru_name_capital = "Вагина" // BLUEMOON ADD desc = "A female reproductive organ." icon = 'icons/obj/genitals/vagina.dmi' icon_state = ORGAN_SLOT_VAGINA diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 6fe3d78ee953..12e234ea48ef 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -211,13 +211,40 @@ var/list/missing = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) var/list/disabled = list() - var/list/writing = list() +// var/list/writing = list() - BLUEMOON REMOVAL (не используется, заменено на show_written_on_bodypart_text) + + // BLUEMOON ADD START - отображение написанного на части тела только в случае, если она видима + var/show_written_on_bodypart_text = "" + + var/list/items_on_target = list() + items_on_target = get_equipped_items() + // BLUEMOON ADD END + for(var/X in bodyparts) var/obj/item/bodypart/BP = X if(BP.disabled) disabled += BP - if(BP.writtentext) - writing += BP + + if(BP.writtentext != "") // BLUEMOON EDIT - добавлено != "" +// writing += BP - BLUEMOON REMOVAL START - (не используется, заменено на show_written_on_bodypart_text) + + // BLUEMOON ADD START - отображение написанного на части тела только в случае, если она видима + var/covered_area + covered_area = zone2body_parts_covered_complicated(BP.body_zone) + + if(!covered_area) // если в будущем введутся новые органы, чтобы этот момент не забыли + to_chat(user, span_danger("DEV: При осмотре обнаружен неизвестный орган, сообщите разработчикам!")) + covered_area = CHEST + + var/show_text = TRUE + for(var/obj/item/worn_clothes in items_on_target) + if(worn_clothes.body_parts_covered & covered_area) + show_text = FALSE + break + + if(show_text) + show_written_on_bodypart_text += span_warning("На [t_ego] [BP.ru_name_v] написано: \"[html_encode(BP.writtentext)]\".\n") + // BLUEMOON ADD END missing -= BP.body_zone for(var/obj/item/I in BP.embedded_objects) if(I.isEmbedHarmless()) @@ -408,13 +435,20 @@ else msg += "[t_on] имеет дикие, космические глаза, которые в свою очередь имеют странный, абсолютно ненормальный вид.\n" + /* BLUEMON REMOVAL START - заменено show_written_on_bodypart_text for(var/X in writing) if(!w_uniform) var/obj/item/bodypart/BP = X msg += "На [t_ego] [BP.name] написано: \"[html_encode(BP.writtentext)]\".\n" - for(var/obj/item/organ/genital/G in internal_organs) - if(length(G.writtentext) && istype(G) && G.is_exposed()) - msg += "На [t_ego] [G.name] написано: \"[html_encode(G.writtentext)]\".\n" + / BLUEMOON REMOVAL END */ + // BLUEMOON ADD START - отображение надписей на теле, если они видимы и есть + if(show_written_on_bodypart_text != "") + msg += show_written_on_bodypart_text + if(user.client?.prefs.cit_toggles & GENITAL_EXAMINE) + // BLUEMOON ADD END + for(var/obj/item/organ/genital/G in internal_organs) + if(length(G.writtentext) && istype(G) && G.is_exposed()) + msg += "На [t_ego] [G.ru_name_v] написано: \"[html_encode(G.writtentext)]\".\n" if(!user) return diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 305391d1d944..02b778832d00 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -40,6 +40,12 @@ use_bold = FALSE, ) +// BLUEMOON ADD START - дополнительное описание +/obj/item/pen/examine(user, distance) + . = ..() + . += span_info("Ручкой можно оставлять надписи на частях тела.") // рассказываем о механиках через описания +// BLUEMOON ADD END + /obj/item/pen/suicide_act(mob/user) user.visible_message("[user] is scribbling numbers all over себя with [src]! It looks like [user.ru_who()] trying to commit sudoku...") return(BRUTELOSS) diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 9483d3c7fec7..c19891b625fc 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -31,6 +31,7 @@ var/useable = TRUE var/list/food_reagents = list(/datum/reagent/consumable/nutriment = 5) var/ru_name = "" + var/ru_name_v = "" var/ru_name_capital = "" /obj/item/organ/Initialize(mapload) diff --git a/modular_splurt/code/game/objects/structures/watercloset.dm b/modular_splurt/code/game/objects/structures/watercloset.dm index 8fa115fcbddc..d5d58c456bf7 100644 --- a/modular_splurt/code/game/objects/structures/watercloset.dm +++ b/modular_splurt/code/game/objects/structures/watercloset.dm @@ -1,6 +1,7 @@ /obj/machinery/shower/wash_mob(mob/living/L) . = ..() L.wash_cum() + /* BLUEMOON REMOVAL START - смывание текста с частей тела теперь производится с помощью мыла if(ishuman(L)) var/mob/living/carbon/human/H = L for(var/obj/item/bodypart/BP in H.bodyparts) @@ -8,6 +9,7 @@ for(var/obj/item/organ/genital/G in H.internal_organs) if(istype(G) && G.is_exposed()) G.writtentext = "" + / BLUEMOON REMOVAL END */ /obj/machinery/shower/wash_obj(obj/O) . = ..() diff --git a/modular_splurt/code/modules/paperwork/pen.dm b/modular_splurt/code/modules/paperwork/pen.dm index e9e4d7c43594..b6438a49410e 100644 --- a/modular_splurt/code/modules/paperwork/pen.dm +++ b/modular_splurt/code/modules/paperwork/pen.dm @@ -11,16 +11,45 @@ var/mob/living/carbon/human/T = M if(!iscarbon(T)) //not carbon. return + + // BLUEMOON EDIT START - возможность писать на отдельных частях тела + var/try_to_write_on_genitals = FALSE + var/target_body_part + + target_body_part = zone2body_parts_covered_complicated(user.zone_selected) + + if(!target_body_part) + to_chat(user, span_warning("You must choose a bodypart on your doll to write on!")) + return + + var/list/items_on_target = list() + items_on_target = T.get_equipped_items() + + for(var/A in items_on_target) + var/obj/item/worn_clothes = A + if(worn_clothes.body_parts_covered & target_body_part) + to_chat(user, span_warning("The target body part is covered with their clothes.")) + return + + var/obj/item/G + if(try_to_write_on_genitals && T.exposed_genitals.len) + G = user:pick_receiving_organ(T, NONE, "Pick a genital to write on", "PRESS CANCEL to write on the targeted body part") + // BLUEMOON ADD END + + /* BLUEMOON REMOVAL START - сверху более умная реализация по отдельным частям тела if(!T.is_chest_exposed()) to_chat(user, "You cannot write on someone with their clothes on.") return + / BLUEMOON REMOVAL END */ - var/obj/item/G = user:pick_receiving_organ(T, NONE, "Pick a genital to write on", "Cancel to write on the targeted body part") + var/obj/item/BP = (G ? G : T.get_bodypart(user.zone_selected)) + /* BLUEMOON ADD START - перемещаем код выше var/obj/item/BP = (G ? G : T.get_bodypart(user.zone_selected)) if(!BP) return + / BLUEMOON ADD END */ var/writting = input(user, "Add writing, doesn't replace current text", "Writing on [T]") as text|null if(!writting)