diff --git a/code/datums/components/defibrillator.dm b/code/datums/components/defibrillator.dm index fa90caaf95d..612f57c496d 100644 --- a/code/datums/components/defibrillator.dm +++ b/code/datums/components/defibrillator.dm @@ -77,12 +77,12 @@ if(safety) safety = FALSE - unit.visible_message(span_warning("[unit] beeps: Safety protocols disabled!")) playsound(get_turf(unit), 'sound/machines/defib_saftyoff.ogg', 50, 0) + unit.atom_say("Протоколы безопасности деактивированы!") else safety = TRUE - unit.visible_message(span_notice("[unit] beeps: Safety protocols enabled!")) playsound(get_turf(unit), 'sound/machines/defib_saftyon.ogg', 50, 0) + unit.atom_say("Протоколы безопасности активированы!") /datum/component/defib/proc/on_emag(obj/item/unit, mob/user) SIGNAL_HANDLER // COMSIG_ATOM_EMAG_ACT @@ -90,7 +90,7 @@ return safety = !safety if(user && !robotic) - user.balloon_alert(user, "протоколы безопасности [safety ? "де" : ""]активированы!") + user.balloon_alert(user, "протоколы безопасности [safety ? "" : "де"]активированы!") /datum/component/defib/proc/set_cooldown(how_short) on_cooldown = TRUE @@ -133,22 +133,19 @@ var/application_result = SEND_SIGNAL(parent, COMSIG_DEFIB_PADDLES_APPLIED, user, target, should_cause_harm) if(application_result & COMPONENT_BLOCK_DEFIB_DEAD) - user.visible_message(span_notice("[defib_ref] beeps: Unit is unpowered.")) playsound(get_turf(defib_ref), 'sound/machines/defib_failed.ogg', 50, 0) + defib_ref.atom_say("Недостаточно энергии!") return if(on_cooldown) - user.balloon_alert(user, "всё ещё заряжается!") + user.balloon_alert(user, "заряд не готов!") return if(application_result & COMPONENT_BLOCK_DEFIB_MISC) return // the unit should handle this if(!istype(target)) - if(robotic) - user.balloon_alert(user, "на роботах не сработает") - else - user.balloon_alert(user, "\"это\" нельзя дефибриллировать") + user.balloon_alert(user, "неподходящая цель!") return if(should_cause_harm) @@ -158,14 +155,14 @@ return user.visible_message( - span_warning("[user] begins to place [parent] on [target.name]'s chest."), - span_warning("You begin to place [parent] on [target.name]'s chest."), + span_warning("[user] начина[pluralize_ru(user.gender, "ет", "ют")] размещать лопасти дефибриллятора на груди [target.name]."), + span_warning("Вы начинаете размещать лопасти дефибриллятора на груди [target.name]."), ) busy = TRUE var/mob/dead/observer/ghost = target.get_ghost(TRUE) if(ghost?.can_reenter_corpse) - to_chat(ghost, "[span_ghostalert("Your heart is being defibrillated. Return to your body if you want to be revived!")] (Verbs -> Ghost -> Re-enter corpse)") + to_chat(ghost, span_ghostalert("Ваше сердце пытаются дефибриллировать. Вернитесь в своё тело, если хотите быть оживлены!")) window_flash(ghost.client) SEND_SOUND(ghost, sound('sound/effects/genetics.ogg')) @@ -174,8 +171,8 @@ return user.visible_message( - span_notice("[user] places [parent] on [target.name]'s chest."), - span_warning("You place [parent] on [target.name]'s chest."), + span_notice("[user] разместил[genderize_ru(user.gender, "", "а", "о", "и")] лопасти дефибриллятора на груди [target.name]."), + span_notice("Вы разместили лопасти дефибриллятора на груди [target.name]."), ) playsound(get_turf(defib_ref), 'sound/machines/defib_charge.ogg', 50, 0) @@ -188,29 +185,28 @@ return if(istype(target.wear_suit, /obj/item/clothing/suit/space) && !ignore_hardsuits) - user.visible_message(span_notice("[defib_ref] buzzes: Patient's chest is obscured. Operation aborted.")) playsound(get_turf(defib_ref), 'sound/machines/defib_failed.ogg', 50, 0) + defib_ref.atom_say("Грудь пациента закрыта. Операция отменена.") busy = FALSE return if(target.undergoing_cardiac_arrest()) var/obj/item/organ/internal/heart/heart = target.get_organ_slot(INTERNAL_ORGAN_HEART) - if(!heart) - user.visible_message(span_boldnotice("[defib_ref] buzzes: Resuscitation failed - Failed to pick up any heart electrical activity.")) - else if(heart.is_dead()) - user.visible_message(span_boldnotice("[defib_ref] buzzes: Resuscitation failed - Heart necrosis detected.")) if(!heart || heart.is_dead()) playsound(get_turf(defib_ref), 'sound/machines/defib_failed.ogg', 50, 0) busy = FALSE - return + if(!heart) + defib_ref.atom_say("Реанимация не удалась - электрическая активность сердца не зафиксирована!") + else if(heart.is_dead()) + defib_ref.atom_say("Реанимация не удалась - обнаружен некроз сердца!") target.set_heartattack(FALSE) SEND_SIGNAL(target, COMSIG_LIVING_MINOR_SHOCK, 100) SEND_SIGNAL(parent, COMSIG_DEFIB_SHOCK_APPLIED, user, target, should_cause_harm, TRUE) set_cooldown(cooldown) - user.visible_message(span_boldnotice("[defib_ref] pings: Cardiac arrhythmia corrected.")) - target.visible_message(span_warning("[target]'s body convulses a bit."), span_userdanger("You feel a jolt, and your heartbeat seems to steady.")) + defib_ref.atom_say("Сердечная аритмия устранена!") + target.visible_message(span_warning("Тело [target] слегка вздрагивает."), span_userdanger("Вы чувствуете мощный удар током, после которого ритм вашего сердца приходит в норму.")) playsound(get_turf(defib_ref), 'sound/machines/defib_zap.ogg', 50, 1, -1) playsound(get_turf(defib_ref), "bodyfall", 50, 1) playsound(get_turf(defib_ref), 'sound/machines/defib_success.ogg', 50, 0) @@ -219,12 +215,12 @@ return if(target.stat != DEAD && !HAS_TRAIT(target, TRAIT_FAKEDEATH)) - user.visible_message(span_notice("[defib_ref] buzzes: Patient is not in a valid state. Operation aborted.")) playsound(get_turf(defib_ref), 'sound/machines/defib_failed.ogg', 50, 0) + defib_ref.atom_say("Пациент не подлежит реанимации. Операция отменена.") busy = FALSE return - target.visible_message(span_warning("[target]'s body convulses a bit.")) + target.visible_message(span_warning("Тело [target] слегка вздрагивает.")) playsound(get_turf(defib_ref), "bodyfall", 50, 1) playsound(get_turf(defib_ref), 'sound/machines/defib_zap.ogg', 50, 1, -1) ghost = target.get_ghost(TRUE) // We have to double check whether the dead guy has entered their body during the above @@ -235,25 +231,25 @@ var/time_dead = world.time - target.timeofdeath if((time_dead > DEFIB_TIME_LIMIT) || !target.get_organ_slot(INTERNAL_ORGAN_HEART)) - user.visible_message(span_boldnotice("[defib_ref] buzzes: Resuscitation failed - Heart tissue damage beyond point of no return for defibrillation.")) + defib_ref.atom_say("Реанимация не удалась - обнаружены необратимые повреждения сердца!") defib_success = FALSE else if(target.getBruteLoss() >= 180 || target.getFireLoss() >= 180 || target.getCloneLoss() >= 180) - user.visible_message(span_boldnotice("[defib_ref] buzzes: Resuscitation failed - Severe tissue damage detected.")) + defib_ref.atom_say("Реанимация не удалась - обнаружены обширные повреждения тканей!") defib_success = FALSE else if(target.blood_volume < BLOOD_VOLUME_SURVIVE) - user.visible_message(span_boldnotice("[defib_ref] buzzes: Resuscitation failed - Patient blood volume critically low.")) + defib_ref.atom_say("Реанимация не удалась - объём крови в организме пациента на критически низком уровне!") defib_success = FALSE else if(!target.get_organ_slot(INTERNAL_ORGAN_BRAIN)) //So things like headless clings don't get outed - user.visible_message(span_boldnotice("[defib_ref] buzzes: Resuscitation failed - No brain detected within patient.")) + defib_ref.atom_say("Реанимация не удалась - мозг в теле пациента не обнаружен!") defib_success = FALSE else if(ghost) if(!ghost.can_reenter_corpse || target.suiciding) // DNR or AntagHUD - user.visible_message(span_boldnotice("[defib_ref] buzzes: Resuscitation failed - No electrical brain activity detected.")) + defib_ref.atom_say("Реанимация не удалась - электрическая активность мозга не зафиксирована!") else - user.visible_message(span_boldnotice("[defib_ref] buzzes: Resuscitation failed - Patient's brain is unresponsive. Further attempts may succeed.")) + defib_ref.atom_say("Реанимация не удалась - мозг пациента не отреагировал!") defib_success = FALSE else if(HAS_TRAIT(target, TRAIT_NO_CLONE) || !target.mind || !(target.mind.is_revivable()) || HAS_TRAIT(target, TRAIT_FAKEDEATH) || target.suiciding) // these are a bit more arbitrary - user.visible_message(span_boldnotice("[defib_ref] buzzes: Resuscitation failed.")) + defib_ref.atom_say("Реанимация не удалась!") defib_success = FALSE if(!defib_success) @@ -273,12 +269,8 @@ target.Paralyse(12 SECONDS) target.emote("gasp") - if(target.getBrainLoss() >= 100) - playsound(get_turf(defib_ref), 'sound/machines/defib_saftyoff.ogg', 50, 0) - user.visible_message(span_boldnotice("[defib_ref] chimes: Minimal brain activity detected, brain treatment recommended for full resuscitation.")) - else - playsound(get_turf(defib_ref), 'sound/machines/defib_success.ogg', 50, 0) - user.visible_message(span_boldnotice("[defib_ref] pings: Resuscitation successful.")) + playsound(get_turf(defib_ref), 'sound/machines/defib_success.ogg', 50, 0) + defib_ref.atom_say("Реанимация успешна!") SEND_SIGNAL(target, COMSIG_LIVING_MINOR_SHOCK, 100) if(ishuman(target.pulledby)) // for some reason, pulledby isnt a list despite it being possible to be pulled by multiple people @@ -306,8 +298,8 @@ return busy = TRUE target.visible_message( - span_danger("[user] has touched [target.name] with [parent]!"), - span_userdanger("[user] has touched [target.name] with [parent]!"), + span_danger("[user] коснул[genderize_ru(user.gender, "ся", "ась", "ось", "ись")] [target.name] лопастями боевого дефибриллятора!"), + span_userdanger("[user] коснул[genderize_ru(user.gender, "ся", "ась", "ось", "ись")] вас лопастями боевого дефибриллятора!"), ) target.apply_damage(50, STAMINA) target.Weaken(4 SECONDS) @@ -347,7 +339,7 @@ if(electrocute_mob(affecting, power_source, origin)) // shock anyone touching them >:) var/obj/item/organ/internal/heart/heart = affecting.get_organ_slot(INTERNAL_ORGAN_HEART) if(istype(heart) && heart.parent_organ_zone == BODY_ZONE_CHEST && affecting.has_both_hands()) // making sure the shock will go through their heart (drask hearts are in their head), and that they have both arms so the shock can cross their heart inside their chest - affecting.visible_message(span_danger("[affecting]'s entire body shakes as a shock travels up [affecting.p_their()] arm!"), \ - span_userdanger("You feel a powerful shock travel up your [affecting.hand ? affecting.get_organ(BODY_ZONE_L_ARM) : affecting.get_organ(BODY_ZONE_R_ARM)] and back down your [affecting.hand ? affecting.get_organ(BODY_ZONE_R_ARM) : affecting.get_organ(BODY_ZONE_L_ARM)]!")) + affecting.visible_message(span_danger("[affecting] сотряса[pluralize_ru(affecting.gender, "ет", "ют")]ся от электрического тока, проходящего через [genderize_ru(affecting.gender, "его", "её", "его", "их")] руку!"), \ + span_userdanger("Вы чувствуете мощный удар током, проходящий через ваше сердце!")) affecting.set_heartattack(TRUE) diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index ccb7c665b23..25b5197add0 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -141,7 +141,7 @@ GLOBAL_VAR_INIT(record_id_num, 1001) else if(H.job) assignment = H.job else - assignment = "Unassigned" + assignment = "Неназначенный" var/id = num2hex(GLOB.record_id_num++, 6) @@ -154,8 +154,8 @@ GLOBAL_VAR_INIT(record_id_num, 1001) G.fields["rank"] = assignment G.fields["age"] = H.age G.fields["fingerprint"] = md5(H.dna.uni_identity) - G.fields["p_stat"] = "Active" - G.fields["m_stat"] = "Stable" + G.fields["p_stat"] = "Стабильное" + G.fields["m_stat"] = "Стабильное" G.fields["sex"] = capitalize(H.gender) G.fields["species"] = H.dna.species.name G.fields["photo"] = get_id_photo(H) @@ -164,11 +164,11 @@ GLOBAL_VAR_INIT(record_id_num, 1001) if(H.gen_record && !jobban_isbanned(H, "Records")) G.fields["notes"] = H.gen_record else - G.fields["notes"] = "No notes found." + G.fields["notes"] = "Дополнительная информация отсутствует." if(H.exploit_record && !jobban_isbanned(H, "Records")) G.fields["exploit_record"] = H.exploit_record else - G.fields["exploit_record"] = "No notes found." + G.fields["exploit_record"] = "Дополнительная информация отсутствует." general += G //Medical Record @@ -177,18 +177,18 @@ GLOBAL_VAR_INIT(record_id_num, 1001) M.fields["name"] = H.real_name M.fields["blood_type"] = H.dna.blood_type M.fields["b_dna"] = H.dna.unique_enzymes - M.fields["mi_dis"] = "None" - M.fields["mi_dis_d"] = "No minor disabilities have been declared." - M.fields["ma_dis"] = "None" - M.fields["ma_dis_d"] = "No major disabilities have been diagnosed." - M.fields["alg"] = "None" - M.fields["alg_d"] = "No allergies have been detected in this patient." - M.fields["cdi"] = "None" - M.fields["cdi_d"] = "No diseases have been diagnosed at the moment." + M.fields["mi_dis"] = "Отсутствуют" + M.fields["mi_dis_d"] = "Незначительные отклонения не указаны." + M.fields["ma_dis"] = "Отсутствуют" + M.fields["ma_dis_d"] = "Инвалидности не указаны." + M.fields["alg"] = "Отсутствуют" + M.fields["alg_d"] = "Аллергии не указаны." + M.fields["cdi"] = "Отсутствуют" + M.fields["cdi_d"] = "Текущие заболевания не указаны." if(H.med_record && !jobban_isbanned(H, "Records")) M.fields["notes"] = H.med_record else - M.fields["notes"] = "No notes found." + M.fields["notes"] = "Дополнительная информация отсутствует." medical += M //Security Record @@ -204,7 +204,7 @@ GLOBAL_VAR_INIT(record_id_num, 1001) if(H.sec_record && !jobban_isbanned(H, "Records")) S.fields["notes"] = H.sec_record else - S.fields["notes"] = "No notes found." + S.fields["notes"] = "Дополнительная информация отсутствует." LAZYINITLIST(S.fields["comments"]) security += S diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index 31320c3799e..a8b42ebb1c2 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -56,7 +56,15 @@ /////////////////////////// DNA MACHINES /obj/machinery/dna_scannernew name = "\improper DNA modifier" - desc = "Устройство для сканирования структуры ДНК." + desc = "Высокотехнологичное устройство, предназначенное для сканирования и изменения структуры ДНК гуманоидов. Здесь и происходит всё волшебство." + ru_names = list( + NOMINATIVE = "ДНК-модификатор", + GENITIVE = "ДНК-модификатора", + DATIVE = "ДНК-модификатору", + ACCUSATIVE = "ДНК-модификатор", + INSTRUMENTAL = "ДНК-модификатором", + PREPOSITIONAL = "ДНК-модификаторе" + ) icon = 'icons/obj/machines/cryogenic2.dmi' icon_state = "scanner_open" density = TRUE @@ -72,14 +80,7 @@ var/damage_coeff var/scan_level var/precision_coeff - ru_names = list( - NOMINATIVE = "ДНК-модификатор", - GENITIVE = "ДНК-модификатора", - DATIVE = "ДНК-модификатору", - ACCUSATIVE = "ДНК-модификатор", - INSTRUMENTAL = "ДНК-модификатором", - PREPOSITIONAL = "ДНК-модификаторе" - ) + /obj/machinery/dna_scannernew/New() ..() @@ -116,12 +117,19 @@ for(var/obj/item/stock_parts/micro_laser/P in component_parts) damage_coeff = P.rating +/obj/machinery/dna_scannernew/examine(mob/user) + . = ..() + if(occupant) + . += span_notice("Внутри кто-то есть.") + if(Adjacent(user)) + . += span_info("Наведите курсор на гуманоида, зажмите ЛКМ и перетяните на [declent_ru(ACCUSATIVE)], чтобы поместить его внутрь.
Используйте Alt + ЛКМ, чтобы извлечь ёмкость.") + /obj/machinery/dna_scannernew/AllowDrop() return FALSE /obj/machinery/dna_scannernew/verb/eject() set src in oview(1) - set name = "Eject DNA Scanner" + set name = "Извлечь субъект" if(usr.incapacitated() || HAS_TRAIT(usr, TRAIT_HANDS_BLOCKED)) return @@ -146,7 +154,7 @@ /obj/machinery/dna_scannernew/verb/move_inside() set src in oview(1) - set name = "Enter DNA Scanner" + set name = "Залезть внутрь" if(usr.incapacitated() || HAS_TRAIT(usr, TRAIT_HANDS_BLOCKED) || usr.buckled) //are you cuffed, dying, lying, stunned or other return @@ -154,19 +162,15 @@ to_chat(usr, span_notice("Как бы вы не старались, у вас не получится забраться в [declent_ru(ACCUSATIVE)].")) return if(occupant) - balloon_alert(usr, "занято!") + balloon_alert(usr, "внутри кто-то есть!") return if(usr.abiotic()) - balloon_alert(usr, "руки заняты") + balloon_alert(usr, "руки субъекта заняты!") return if(usr.has_buckled_mobs()) //mob attached to us - to_chat(usr, span_warning("[usr] не поместится в [declent_ru(ACCUSATIVE)], пока на [genderize_ru(usr, "нём", "ней", "нём", "них")] сидит слайм.")) + to_chat(usr, span_warning("Вы не поместитесь в [declent_ru(ACCUSATIVE)], пока на вас сидит слайм!")) return - usr.forceMove(src) - occupant = usr - icon_state = "scanner_occupied" - add_fingerprint(usr) - SStgui.update_uis(src) + put_in(usr) /obj/machinery/dna_scannernew/MouseDrop_T(atom/movable/O, mob/user, params) if(!istype(O)) @@ -188,21 +192,17 @@ if(!istype(user.loc, /turf) || !istype(O.loc, /turf)) // are you in a container/closet/pod/etc? return if(occupant) - balloon_alert(user, "занято") + balloon_alert(user, "внутри кто-то есть!") return TRUE var/mob/living/L = O if(!istype(L) || L.buckled) return if(L.abiotic()) - balloon_alert(user, "руки заняты") + balloon_alert(user, "руки субъекта заняты!") return TRUE if(L.has_buckled_mobs()) //mob attached to us - to_chat(user, span_warning("[L] не помест[pluralize_ru(L, "ит", "ят")]ся в [declent_ru(ACCUSATIVE)], пока на [genderize_ru(L, "нём", "ней", "нём", "них")] сидит слайм.")) + to_chat(user, span_warning("[L] не помест[pluralize_ru(L.gender, "ит", "ят")]ся в [declent_ru(ACCUSATIVE)], пока на [genderize_ru(L.gender, "нём", "ней", "нём", "них")] сидит слайм!")) return TRUE - if(L == user) - visible_message("[user] забира[pluralize_ru(user, "ет", "ют")]ся в [declent_ru(ACCUSATIVE)].") - else - visible_message("[user] помеща[pluralize_ru(user, "ет", "ют")] [L.name] в [declent_ru(ACCUSATIVE)].") put_in(L) return TRUE @@ -217,16 +217,14 @@ if(istype(I, /obj/item/reagent_containers/glass)) add_fingerprint(user) if(beaker) - balloon_alert(user, "внутри есть ёмкость") + balloon_alert(user, "слот для ёмкости занят!") return ATTACK_CHAIN_PROCEED if(!user.drop_transfer_item_to_loc(I, src)) return ..() beaker = I + visible_message(span_notice("[user] вставля[pluralize_ru(user.gender,"ет","ют")] [I.declent_ru(GENITIVE)] в [declent_ru(ACCUSATIVE)].")) + balloon_alert(user, "ёмкость установлена") SStgui.update_uis(src) - user.visible_message( - span_notice("[user] помеща[pluralize_ru(user, "ет", "ют")] [I] в [declent_ru(ACCUSATIVE)]."), - span_notice("Вы помещаете [I] в [declent_ru(ACCUSATIVE)]."), - ) return ATTACK_CHAIN_BLOCKED_ALL return ..() @@ -237,20 +235,30 @@ if(grabber.grab_state < GRAB_AGGRESSIVE || !ismob(grabbed_thing)) return . if(panel_open) - balloon_alert(grabber, "закройте панель") + balloon_alert(grabber, "техпанель открыта!") return . var/mob/target = grabbed_thing if(occupant) - balloon_alert(grabber, "занято!") + balloon_alert(grabber, "внутри кто-то есть!") return . if(target.abiotic()) - to_chat(grabber, span_warning("Субъект не должен ничего держать в руках.")) + balloon_alert(grabber, "руки субъекта заняты!") return . if(target.has_buckled_mobs()) //mob attached to us - to_chat(grabber, span_warning("[target] не помест[pluralize_ru(target, "ит", "ят")]ся в [declent_ru(ACCUSATIVE)], пока на [genderize_ru(target, "нём", "ней", "нём", "них")] сидит слайм.")) + to_chat(grabber, span_warning("[target] не помест[pluralize_ru(target.gender, "ит", "ят")]ся в [declent_ru(ACCUSATIVE)], пока на [genderize_ru(target.gender, "нём", "ней", "нём", "них")] сидит слайм!")) return . put_in(target) - add_fingerprint(grabber) + + +/obj/machinery/dna_scannernew/AltClick(mob/living/user) + if(!beaker) + return + beaker.forceMove(loc) + if(Adjacent(user) && !issilicon(user)) + user.put_in_hands(beaker, ignore_anim = FALSE) + balloon_alert(user, "ёмкость извлечена") + beaker = null + add_fingerprint(user) /obj/machinery/dna_scannernew/crowbar_act(mob/user, obj/item/I) @@ -261,7 +269,7 @@ /obj/machinery/dna_scannernew/screwdriver_act(mob/user, obj/item/I) if(occupant) - balloon_alert(user, "панель заблокирована") + balloon_alert(user, "панель заблокирована!") return TRUE if(default_deconstruction_screwdriver(user, "[icon_state]_maintenance", "[initial(icon_state)]", I)) return TRUE @@ -272,6 +280,15 @@ go_out() /obj/machinery/dna_scannernew/proc/put_in(mob/M) + add_fingerprint(usr) + if(M == usr) + visible_message("[usr] начина[pluralize_ru(usr.gender,"ет","ют")] залезать в [declent_ru(ACCUSATIVE)].") + else + visible_message("[usr] начина[pluralize_ru(usr.gender,"ет","ют")] укладывать [M] в [declent_ru(ACCUSATIVE)].") + + if(!do_after(usr, 2 SECONDS, M)) + return + M.forceMove(src) occupant = M icon_state = "scanner_occupied" @@ -288,11 +305,11 @@ /obj/machinery/dna_scannernew/proc/go_out(mob/user, force) if(!occupant) if(user) - balloon_alert(user, "сканер пуст!") + to_chat(user, span_warning("Сканер пуст!")) return if(locked && !force) if(user) - balloon_alert(user, "сканер заблокирован!") + to_chat(user, span_warning("Сканер заблокирован!")) return occupant.forceMove(loc) occupant = null @@ -330,7 +347,15 @@ /obj/machinery/computer/scan_consolenew name = "\improper DNA Modifier access console" - desc = "Устройство позволяет сканировать и изменять ДНК." + desc = "Консоль для работы с ДНК-модификатором." + ru_names = list( + NOMINATIVE = "консоль управления ДНК-модификатором", + GENITIVE = "консоли управления ДНК-модификатором", + DATIVE = "консоли управления ДНК-модификатором", + ACCUSATIVE = "консоль управления ДНК-модификатором", + INSTRUMENTAL = "консолью управления ДНК-модификатором", + PREPOSITIONAL = "консоли управления ДНК-модификатором" + ) icon = 'icons/obj/machines/computer.dmi' icon_screen = "dna" icon_keyboard = "med_key" @@ -354,29 +379,19 @@ use_power = IDLE_POWER_USE idle_power_usage = 10 active_power_usage = 400 - ru_names = list( - NOMINATIVE = "Консоль доступа ДНК-модификатора", - GENITIVE = "Консоли доступа ДНК-модификатора", - DATIVE = "Консоли доступа ДНК-модификатора", - ACCUSATIVE = "Консоль доступа ДНК-модификатора", - INSTRUMENTAL = "Консолью доступа ДНК-модификатора", - PREPOSITIONAL = "Консоли доступа ДНК-модификатора" - ) /obj/machinery/computer/scan_consolenew/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/disk/data)) //INSERT SOME diskS add_fingerprint(user) if(disk) - balloon_alert(user, "диск уже вставлен") + balloon_alert(user, "слот для дискеты занят!") return ATTACK_CHAIN_PROCEED if(!user.drop_transfer_item_to_loc(I, src)) return ..() disk = I - user.visible_message( - span_notice("[user] вставля[pluralize_ru(user, "ет", "ют")] [I.name] в [declent_ru(ACCUSATIVE)]."), - span_notice("Вы вставляете [I.name] в [declent_ru(ACCUSATIVE)]."), - ) + visible_message(span_notice("[user] вставля[pluralize_ru(user.gender, "ет", "ют")] [I.declent_ru(ACCUSATIVE)] в [declent_ru(ACCUSATIVE)].")) + balloon_alert(user, "дискета вставлена") SStgui.update_uis(src) return ATTACK_CHAIN_BLOCKED_ALL return ..() @@ -440,7 +455,7 @@ ui = SStgui.try_update_ui(user, src, ui) if(!ui) - ui = new(user, src, "DNAModifier", name) + ui = new(user, src, "DNAModifier", "Консоль управления ДНК-модификатором") ui.open() /obj/machinery/computer/scan_consolenew/ui_data(mob/user) @@ -704,6 +719,8 @@ var/obj/item/reagent_containers/glass/B = connected.beaker B.forceMove(connected.loc) connected.beaker = null + if(Adjacent(usr) && !issilicon(usr)) + usr.put_in_hands(B, ignore_anim = FALSE) if("ejectOccupant") connected.eject_occupant() // Transfer Buffer Management @@ -722,7 +739,7 @@ databuf.dna = connected.occupant.dna.Clone() if(ishuman(connected.occupant)) databuf.dna.real_name=connected.occupant.name - databuf.name = "Unique Identifier" + databuf.name = "Уникальные Идентификаторы" buffers[bufferId] = databuf if("saveUIAndUE") if(connected.occupant && connected.occupant.dna) @@ -731,7 +748,7 @@ databuf.dna = connected.occupant.dna.Clone() if(ishuman(connected.occupant)) databuf.dna.real_name=connected.occupant.dna.real_name - databuf.name = "Unique Identifier + Unique Enzymes" + databuf.name = "Уникальные Идентификаторы + Уникальные Ферменты" buffers[bufferId] = databuf if("saveSE") if(connected.occupant && connected.occupant.dna) @@ -740,12 +757,12 @@ databuf.dna = connected.occupant.dna.Clone() if(ishuman(connected.occupant)) databuf.dna.real_name = connected.occupant.dna.real_name - databuf.name = "Structural Enzymes" + databuf.name = "Структурные Ферменты" buffers[bufferId] = databuf if("clear") buffers[bufferId] = new /datum/dna2/record() if("changeLabel") - ui_modal_input(src, "changeBufferLabel", "Please enter the new buffer label:", null, list("id" = bufferId), buffer.name, UI_MODAL_INPUT_MAX_LENGTH_NAME) + ui_modal_input(src, "changeBufferLabel", "Введите название для ячейки буфера:", null, list("id" = bufferId), buffer.name, UI_MODAL_INPUT_MAX_LENGTH_NAME) if("transfer") if(!connected.occupant || (HAS_TRAIT(connected.occupant, TRAIT_NO_CLONE) && connected.scan_level < 3) || !connected.occupant.dna) return @@ -782,7 +799,7 @@ return if(text2num(params["block"]) > 0) var/list/choices = all_dna_blocks((buffer.types & DNA2_BUF_SE) ? buffer.dna.SE : buffer.dna.UI) - ui_modal_choice(src, "createInjectorBlock", "Please select the block to create an injector from:", null, list("id" = bufferId), null, choices) + ui_modal_choice(src, "createInjectorBlock", "Выберите блок, на основе которого будет создан инъектор:", null, list("id" = bufferId), null, choices) else create_injector(bufferId, TRUE) if("loadDisk") diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 5bbc3454cef..60fe63b899c 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -6,6 +6,15 @@ /obj/machinery/sleeper name = "Sleeper" + desc = "Медицинское устройство, предназначеное для стабилизации пациентов. Позволяет вводить ограниченный набор веществ в организм субъекта." + ru_names = list( + NOMINATIVE = "слипер", + GENITIVE = "слипера", + DATIVE = "слиперу", + ACCUSATIVE = "слипер", + INSTRUMENTAL = "слипером", + PREPOSITIONAL = "слипере" + ) icon = 'icons/obj/machines/cryogenic2.dmi' icon_state = "sleeper-open" var/base_icon = "sleeper" @@ -86,6 +95,16 @@ return 0 //maybe they should be able to get out with cuffs, but whatever go_out() +/obj/machinery/sleeper/examine(mob/user) + . = ..() + if(occupant) + if(occupant.is_dead()) + . += span_warning("Вы видите гуманоида внутри. Это [occupant.name]. [genderize_ru(occupant.gender, "Он мёртв", "Она мертва", "Оно мертво", "Они мертвы")]!") + else + . += span_notice("Вы видите гуманоида внутри. Это [occupant.name].") + if(Adjacent(user)) + . += span_info("Наведите курсор на гуманоида, зажмите ЛКМ и перетяните на [declent_ru(ACCUSATIVE)], чтобы поместить его внутрь.
Используйте Alt + ЛКМ, чтобы извлечь ёмкость.") + /obj/machinery/sleeper/process() for(var/mob/M as mob in src) // makes sure that simple mobs don't get stuck inside a sleeper when they resist out of occupant's grasp if(M == occupant) @@ -118,7 +137,7 @@ if(world.timeofday > (R.last_addiction_dose + ADDICTION_SPEEDUP_TIME)) // 2.5 minutes addiction_removal_chance = 10 if(prob(addiction_removal_chance)) - to_chat(occupant, span_notice("You no longer feel reliant on [R.name]!")) + to_chat(occupant, span_notice("Ваш разум проясняется, а навязчивые мысли уходят. Похоже, вы побороли свою зависимость от [R.name]!")) occupant.reagents.addiction_list.Remove(R) qdel(R) @@ -140,7 +159,7 @@ return TRUE if(panel_open) - to_chat(user, span_notice("Close the maintenance panel first.")) + balloon_alert(user, "техпанель открыта!") return add_fingerprint(user) @@ -149,7 +168,7 @@ /obj/machinery/sleeper/ui_interact(mob/user, datum/tgui/ui = null) ui = SStgui.try_update_ui(user, src, ui) if(!ui) - ui = new(user, src, "Sleeper", "Sleeper") + ui = new(user, src, "Sleeper", "Слипер") ui.open() /obj/machinery/sleeper/ui_data(mob/user) @@ -260,7 +279,7 @@ if(!controls_inside && usr == occupant) return if(panel_open) - to_chat(usr, span_notice("Close the maintenance panel first.")) + balloon_alert(usr, "техпанель открыта!") return if(stat & (NOPOWER|BROKEN)) return @@ -271,7 +290,7 @@ if(!occupant) return if(occupant.stat == DEAD) - to_chat(usr, span_danger("This person has no life to preserve anymore. Take [occupant.p_them()] to a department capable of reanimating them.")) + to_chat(usr, span_danger("Пациент мёртв, ввод веществ невозможен.")) return var/chemical = params["chemid"] var/amount = text2num(params["amount"]) @@ -280,7 +299,7 @@ if(occupant.health > min_health || (chemical in emergency_chems)) inject_chemical(usr, chemical, amount) else - to_chat(usr, span_danger("This person is not in good enough condition for sleepers to be effective! Use another means of treatment, such as cryogenics!")) + to_chat(usr, span_danger("Дальнейший ввод веществ неэффективен. Рекомендуется проведение более эффективных лечебных процедур.")) if("removebeaker") remove_beaker() if("togglefilter") @@ -306,15 +325,13 @@ if(istype(I, /obj/item/reagent_containers/glass)) add_fingerprint(user) if(beaker) - to_chat(user, span_warning("The sleeper has a beaker already.")) + balloon_alert(user, "слот для ёмкости занят!") return ATTACK_CHAIN_PROCEED if(!user.drop_transfer_item_to_loc(I, src)) return ..() beaker = I - user.visible_message( - span_notice("[user] adds [I] to [src]!"), - span_notice("You add [I] to [src]!"), - ) + visible_message(span_notice("[user] вставля[pluralize_ru(user.gender,"ет","ют")] [I.declent_ru(GENITIVE)] в [declent_ru(ACCUSATIVE)].")) + balloon_alert(user, "ёмкость установлена") SStgui.update_uis(src) return ATTACK_CHAIN_BLOCKED_ALL @@ -327,29 +344,40 @@ return . var/mob/target = grabbed_thing if(panel_open) - to_chat(grabber, span_warning("Close the maintenance panel first.")) + balloon_alert(grabber, "техпанель открыта!") return . if(occupant) - to_chat(grabber, span_warning("[src] is already occupied!")) + balloon_alert(grabber, "внутри кто-то есть!") return . if(target.abiotic()) - to_chat(grabber, span_warning("Subject cannot have abiotic items on.")) + balloon_alert(grabber, "руки субъекта заняты!") return . if(target.has_buckled_mobs()) //mob attached to us - to_chat(grabber, span_warning("[target] will not fit into the [src] because [target.p_they()] [target.p_have()] a slime latched onto [target.p_their()] head.")) + to_chat(grabber, span_warning("[target] не помест[pluralize_ru(target.gender, "ит", "ят")]ся в [declent_ru(ACCUSATIVE)], пока на [genderize_ru(target.gender, "нём", "ней", "нём", "них")] сидит слайм!")) return . - visible_message("[grabber] starts putting [target] into [src].") + visible_message("[grabber] начина[pluralize_ru(grabber.gender,"ет","ют")] укладывать [target] в [declent_ru(ACCUSATIVE)].") if(!do_after(grabber, 2 SECONDS, target) || panel_open || !target || !grabber || grabber.pulling != target || !grabber.Adjacent(src)) return . target.forceMove(src) occupant = target update_icon(UPDATE_ICON_STATE) - to_chat(target, span_boldnotice("You feel cool air surround you. You go numb as your senses turn inward.")) + to_chat(target, span_boldnotice("Вы чувствуете, как вас окутывает холод. Вы цепенеете и расслабляетесь, внутренние процессы организма замедляются.")) add_fingerprint(grabber) SStgui.update_uis(src) +/obj/machinery/sleeper/AltClick(mob/living/user) + if(!beaker) + return + beaker.forceMove(loc) + if(Adjacent(user) && !issilicon(user)) + user.put_in_hands(beaker, ignore_anim = FALSE) + balloon_alert(user, "ёмкость извлечена") + beaker = null + add_fingerprint(user) + update_icon(UPDATE_OVERLAYS) + /obj/machinery/sleeper/crowbar_act(mob/user, obj/item/I) if(default_deconstruction_crowbar(user, I)) @@ -357,7 +385,7 @@ /obj/machinery/sleeper/screwdriver_act(mob/user, obj/item/I) if(occupant) - to_chat(user, span_notice("The maintenance panel is locked.")) + balloon_alert(user, "внутри кто-то есть!") return TRUE if(default_deconstruction_screwdriver(user, "[base_icon]-o", "[base_icon]-open", I)) return TRUE @@ -368,10 +396,10 @@ if(!I.use_tool(src, user, 0, volume = I.tool_volume)) return if(occupant) - to_chat(user, span_notice("The scanner is occupied.")) + balloon_alert(user, "внутри кто-то есть!") return if(panel_open) - to_chat(user, span_notice("Close the maintenance panel first.")) + balloon_alert(user, "техпанель открыта!") return setDir(turn(dir, -90)) @@ -440,7 +468,7 @@ /obj/machinery/sleeper/proc/inject_chemical(mob/living/user, chemical, amount) if(!(chemical in possible_chems)) - to_chat(user, span_notice("The sleeper does not offer that chemical!")) + to_chat(user, span_notice("[capitalize(declent_ru(NOMINATIVE))] не может ввести такое вещество!")) return if(!(amount in amounts)) return @@ -450,14 +478,14 @@ if(occupant.reagents.get_reagent_amount(chemical) + amount <= max_chem) occupant.reagents.add_reagent(chemical, amount) else - to_chat(user, "You can not inject any more of this chemical.") + to_chat(user, "В кровотоке субъекта уже слишком много данного вещества. Дальнейший ввод невозможен.") else - to_chat(user, "The patient rejects the chemicals!") + to_chat(user, "Организм субъекта отвергает это вещество.") else - to_chat(user, "There's no occupant in the sleeper!") + to_chat(user, "[capitalize(declent_ru(NOMINATIVE))] пуст!") /obj/machinery/sleeper/verb/eject() - set name = "Eject Sleeper" + set name = "Извлечь пациента" set category = "Object" set src in oview(1) @@ -471,7 +499,7 @@ /obj/machinery/sleeper/verb/remove_beaker() - set name = "Remove Beaker" + set name = "Достать ёмкость" set category = "Object" set src in oview(1) @@ -505,24 +533,24 @@ if(!istype(user.loc, /turf) || !istype(O.loc, /turf)) // are you in a container/closet/pod/etc? return if(panel_open) - to_chat(user, span_boldnotice("Close the maintenance panel first.")) + balloon_alert(user, "техпанель открыта!") return TRUE if(occupant) - to_chat(user, span_boldnotice("The sleeper is already occupied!")) + balloon_alert(user, "внутри кто-то есть!") return TRUE var/mob/living/L = O if(!istype(L) || L.buckled) return if(L.abiotic()) - to_chat(user, span_boldnotice("Subject cannot have abiotic items on.")) + balloon_alert(user, "руки субъекта заняты!") return TRUE if(L.has_buckled_mobs()) //mob attached to us - to_chat(user, span_warning("[L] will not fit into [src] because [L.p_they()] [L.p_have()] a slime latched onto [L.p_their()] head.")) + to_chat(user, span_warning("[L] не помест[pluralize_ru(L.gender, "ит", "ят")]ся в [declent_ru(ACCUSATIVE)], пока на [genderize_ru(L.gender, "нём", "ней", "нём", "них")] сидит слайм!")) return TRUE if(L == user) - visible_message("[user] starts climbing into the sleeper.") + visible_message("[user] начина[pluralize_ru(user.gender,"ет","ют")] залезать в [declent_ru(ACCUSATIVE)].") else - visible_message("[user] starts putting [L.name] into the sleeper.") + visible_message("[user] начина[pluralize_ru(user.gender,"ет","ют")] укладывать [L.name] в [declent_ru(ACCUSATIVE)].") . = TRUE INVOKE_ASYNC(src, PROC_REF(put_in), L, user) @@ -532,7 +560,7 @@ return if(occupant) - to_chat(user, span_boldnotice("The sleeper is already occupied!")) + balloon_alert(user, "внутри кто-то есть!") return if(!L) return @@ -540,7 +568,7 @@ L.forceMove(src) occupant = L update_icon(UPDATE_ICON_STATE) - to_chat(L, span_boldnotice("You feel cool air surround you. You go numb as your senses turn inward.")) + to_chat(L, span_boldnotice("Вы чувствуете, как вас окутывает холод. Вы цепенеете и расслабляетесь, внутренние процессы организма замедляются.")) add_fingerprint(user) SStgui.update_uis(src) @@ -549,21 +577,21 @@ return FALSE /obj/machinery/sleeper/verb/move_inside() - set name = "Enter Sleeper" + set name = "Залезть внутрь" set category = "Object" set src in oview(1) if(!ishuman(usr) || usr.incapacitated() || HAS_TRAIT(usr, TRAIT_HANDS_BLOCKED) || usr.buckled) return if(occupant) - to_chat(usr, span_boldnotice("The sleeper is already occupied!")) + balloon_alert(usr, "внутри кто-то есть!") return if(panel_open) - to_chat(usr, span_boldnotice("Close the maintenance panel first.")) + balloon_alert(usr, "техпанель открыта!") return if(usr.has_buckled_mobs()) //mob attached to us - to_chat(usr, span_warning("[usr] will not fit into [src] because [usr.p_they()] [usr.p_have()] a slime latched onto [usr.p_their()] head.")) + to_chat(usr, span_warning("Вы не поместитесь в [declent_ru(ACCUSATIVE)], пока на вас сидит слайм.")) return - visible_message("[usr] starts climbing into the sleeper.") + visible_message("[usr] начина[pluralize_ru(usr.gender,"ет","ют")] залезать в [declent_ru(ACCUSATIVE)].") put_in(usr, usr) diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index f98aed6eb68..39855032244 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -1,5 +1,14 @@ /obj/machinery/bodyscanner name = "body scanner" + desc = "Сложное медицинское устройство, используется для сканирования физического состояния гуманоидов." + ru_names = list( + NOMINATIVE = "медицинский сканер", + GENITIVE = "медицинского сканера", + DATIVE = "медицинскому сканеру", + ACCUSATIVE = "медицинский сканер", + INSTRUMENTAL = "медицинским сканером", + PREPOSITIONAL = "медицинском сканере" + ) icon = 'icons/obj/machines/cryogenic2.dmi' icon_state = "bodyscanner-open" density = TRUE @@ -31,11 +40,12 @@ . = ..() if(occupant) if(occupant.is_dead()) - . += span_warning("You see [occupant.name] inside. [occupant.p_they(TRUE)] [occupant.p_are()] dead!>") + . += span_warning("Вы видите гуманоида внутри. Это [occupant.name]. [genderize_ru(occupant.gender, "Он мёртв", "Она мертва", "Оно мертво", "Они мертвы")]!") else - . += span_notice("You see [occupant.name] inside.") + . += span_notice("Вы видите гуманоида внутри. Это [occupant.name].") if(Adjacent(user)) - . += span_info("You can Alt-Click to eject the current occupant. Click-drag someone to the scanner to place them inside.") + . += span_info("Наведите курсор на гуманоида, зажмите ЛКМ и перетяните на [declent_ru(ACCUSATIVE)], чтобы поместить его внутрь.") + . += span_info("Используйте Alt + ЛКМ, чтобы извлечь ID-карту.") /obj/machinery/bodyscanner/update_icon_state() @@ -68,24 +78,34 @@ if(grabber.grab_state < GRAB_AGGRESSIVE || !ishuman(grabbed_thing)) return . if(panel_open) - to_chat(grabber, span_warning("Close the maintenance panel first.")) + balloon_alert(grabber, "техпанель открыта!") return . var/mob/living/carbon/human/target = grabbed_thing if(occupant) - to_chat(grabber, span_warning("[src] is already occupied!")) + balloon_alert(grabber, "внутри кто-то есть!") return . if(target.abiotic()) - to_chat(grabber, span_warning("Subject cannot have abiotic items on.")) + balloon_alert(grabber, "руки субъекта заняты!") return . if(target.has_buckled_mobs()) //mob attached to us - to_chat(grabber, span_warning("[grabbed_thing] will not fit into the [src] because [grabbed_thing.p_they()] [grabbed_thing.p_have()] a slime latched onto [grabbed_thing.p_their()] head.")) + to_chat(grabber, span_warning("[target] не помест[pluralize_ru(target.gender, "ит", "ят")]ся в [declent_ru(ACCUSATIVE)], пока на [genderize_ru(target.gender, "нём", "ней", "нём", "них")] сидит слайм!")) return . - grabbed_thing.forceMove(src) - occupant = grabbed_thing + + visible_message("[grabber] начина[pluralize_ru(grabber.gender,"ет","ют")] укладывать [target] в [declent_ru(ACCUSATIVE)].") + if(!do_after(grabber, 2 SECONDS, target) || panel_open || !target || !grabber || grabber.pulling != target || !grabber.Adjacent(src)) + return . + + target.forceMove(src) + occupant = target update_icon(UPDATE_ICON_STATE) + to_chat(target, span_boldnotice("Крышка [declent_ru(GENITIVE)] закрывается и окружающие звуки сразу становятся тише. Вы видите вокруг множество датчиков и слышите тихое гудение внутренних систем аппарата.")) add_fingerprint(grabber) SStgui.update_uis(src) +/obj/machinery/bodyscanner/AltClick(mob/living/carbon/user) + eject_id(user) + add_fingerprint(user) + /obj/machinery/bodyscanner/crowbar_act(mob/user, obj/item/I) if(default_deconstruction_crowbar(user, I)) @@ -101,10 +121,10 @@ if(!I.use_tool(src, user, 0, volume = I.tool_volume)) return if(occupant) - to_chat(user, span_notice("The scanner is occupied.")) + balloon_alert(user, "внутри кто-то есть!") return if(panel_open) - to_chat(user, span_notice("Close the maintenance panel first.")) + balloon_alert(user, "техпанель открыта!") return setDir(turn(dir, -90)) @@ -122,29 +142,32 @@ if(!ishuman(user) && !isrobot(user)) return FALSE //not a borg or human if(panel_open) - to_chat(user, span_notice("Close the maintenance panel first.")) + balloon_alert(user, "техпанель открыта!") return TRUE //panel open if(occupant) - to_chat(user, span_notice("[src] is already occupied.")) + balloon_alert(user, "внутри кто-то есть!") return TRUE //occupied if(H.buckled) return FALSE if(H.abiotic()) - to_chat(user, span_notice("Subject cannot have abiotic items on.")) + balloon_alert(user, "руки субъекта заняты!") return TRUE if(H.has_buckled_mobs()) //mob attached to us - to_chat(user, span_warning("[H] will not fit into [src] because [H.p_they()] [H.p_have()] a slime latched onto [H.p_their()] head.")) + to_chat(user, span_warning("Вы не поместитесь в [declent_ru(ACCUSATIVE)], пока на вас сидит слайм!")) return TRUE if(H == user) - visible_message("[user] climbs into [src].") + visible_message("[user] начина[pluralize_ru(user.gender,"ет","ют")] залезать в [declent_ru(ACCUSATIVE)].") else - visible_message("[user] puts [H] into the body scanner.") + visible_message("[user] начина[pluralize_ru(user.gender,"ет","ют")] укладывать [H] в [declent_ru(ACCUSATIVE)].") + + if(!do_after(user, 2 SECONDS, H)) + return - add_fingerprint(user) H.forceMove(src) occupant = H update_icon(UPDATE_ICON_STATE) + to_chat(H, span_boldnotice("Крышка [declent_ru(GENITIVE)] закрывается и окружающие звуки сразу становятся тише. Вы видите вокруг множество датчиков и слышите тихое гудение внутренних систем аппарата.")) add_fingerprint(user) SStgui.update_uis(src) return TRUE @@ -166,7 +189,7 @@ return // you cant reach that if(panel_open) - to_chat(user, span_notice("Close the maintenance panel first.")) + balloon_alert(user, "техпанель открыта!") return add_fingerprint(user) @@ -175,10 +198,10 @@ /obj/machinery/bodyscanner/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/card/id)) if(inserted_id) - user.balloon_alert(user, "занято") + balloon_alert(user, "слот ID карты занят") else if(user.drop_transfer_item_to_loc(I, src)) inserted_id = I - user.balloon_alert(user, "карта вставлена") + balloon_alert(user, "карта вставлена") . = ..() @@ -190,7 +213,7 @@ /obj/machinery/bodyscanner/verb/eject() set src in oview(1) set category = "Object" - set name = "Eject Body Scanner" + set name = "Извлечь пациента" if(usr.incapacitated() || HAS_TRAIT(usr, TRAIT_HANDS_BLOCKED)) return @@ -208,10 +231,13 @@ A.forceMove(loc) SStgui.update_uis(src) -/obj/machinery/bodyscanner/proc/eject_id() +/obj/machinery/bodyscanner/proc/eject_id(mob/user) if(!inserted_id) return inserted_id.forceMove(loc) + if(user && Adjacent(user) && !issilicon(user)) + user.put_in_hands(inserted_id, ignore_anim = FALSE) + balloon_alert(user, "ID-карта извлечена") inserted_id = null SStgui.update_uis(src) @@ -243,7 +269,7 @@ /obj/machinery/bodyscanner/ui_interact(mob/user, datum/tgui/ui = null) ui = SStgui.try_update_ui(user, src, ui) if(!ui) - ui = new(user, src, "BodyScanner", "Body Scanner") + ui = new(user, src, "BodyScanner", "Медицинский сканер") ui.open() /obj/machinery/bodyscanner/ui_data(mob/user) @@ -389,23 +415,23 @@ return isPrinting = TRUE if(GLOB.copier_items_printed >= GLOB.copier_max_items) - visible_message(span_warning("Nothing happens. Printing device is broken?")) + visible_message(span_warning("Ничего не происходит. Устройство печати сломано?")) if(!GLOB.copier_items_printed_logged) message_admins("Photocopier cap of [GLOB.copier_max_items] papers reached, all photocopiers/printers are now disabled. This may be the cause of any lag.") GLOB.copier_items_printed_logged = TRUE sleep(3 SECONDS) isPrinting = FALSE return - visible_message(span_notice("[src] rattles and prints out a sheet of paper.")) + visible_message(span_notice("[capitalize(declent_ru(NOMINATIVE))] дребезжит, после чего из окна печати выпадает лист бумаги.")) playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, TRUE) sleep(3 SECONDS) var/obj/item/paper/P = new /obj/item/paper(loc) - var/name = occupant ? occupant.name : "Unknown" - P.info = "
Body Scan - [name]

" - P.info += "Time of scan: [station_time_timestamp()]

" + var/name = occupant ? occupant.name : "Неизвестный" + P.info = "
Отчёт по сканированию пациента - [name]

" + P.info += "Время сканирования [station_time_timestamp()]

" P.info += "[generate_printing_text()]" - P.info += "

Notes:
" - P.name = "Body Scan - [name]" + P.info += "

Заметки:
" + P.name = "Отчёт по сканированию пациента - [name]" isPrinting = FALSE if("insurance") do_insurance_collection(usr, occupant, inserted_id ? inserted_id.associated_account_number : null) @@ -417,17 +443,17 @@ /obj/machinery/bodyscanner/proc/generate_printing_text() var/dat = "" - dat = "Occupant Statistics:
" //Blah obvious + dat = "Состояние пациента:
" //Blah obvious if(istype(occupant)) //is there REALLY someone in there? var/t1 switch(occupant.stat) // obvious, see what their status is if(0) - t1 = "Conscious" + t1 = "в сознании" if(1) - t1 = "Unconscious" + t1 = "без сознания" else - t1 = "*dead*" - dat += "[occupant.health > 50 ? "" : ""]\tHealth %: [occupant.health], ([t1])
" + t1 = "[genderize_ru(occupant.gender, "мёртв", "мертва", "мертво", "мертвы")]" + dat += "[occupant.health > 50 ? "" : ""]\tПроцентная оценка состояния: [occupant.health]%, [t1]
" var/found_disease = FALSE for(var/thing in occupant.diseases) @@ -437,63 +463,63 @@ found_disease = TRUE break if(found_disease) - dat += "Disease detected in occupant.
" + dat += "У пациента выявлено заболевание
" var/extra_font = null extra_font = (occupant.getBruteLoss() < 60 ? "" : "") - dat += "[extra_font]\t-Brute Damage %: [occupant.getBruteLoss()]
" + dat += "[extra_font]\t-Физические повреждения: [occupant.getBruteLoss()]

" extra_font = (occupant.getOxyLoss() < 60 ? "" : "") - dat += "[extra_font]\t-Respiratory Damage %: [occupant.getOxyLoss()]
" + dat += "[extra_font]\t-Удушение: [occupant.getOxyLoss()]

" extra_font = (occupant.getToxLoss() < 60 ? "" : "") - dat += "[extra_font]\t-Toxin Content %: [occupant.getToxLoss()]
" + dat += "[extra_font]\t-Токсины: [occupant.getToxLoss()]

" extra_font = (occupant.getFireLoss() < 60 ? "" : "") - dat += "[extra_font]\t-Burn Severity %: [occupant.getFireLoss()]
" + dat += "[extra_font]\t-Ожоги: [occupant.getFireLoss()]

" extra_font = (occupant.radiation < 10 ?"" : "") - dat += "[extra_font]\tRadiation Level %: [occupant.radiation]
" + dat += "[extra_font]\tРадиационное поражение: [occupant.radiation]

" extra_font = (occupant.getCloneLoss() < 1 ?"" : "") - dat += "[extra_font]\tGenetic Tissue Damage %: [occupant.getCloneLoss()]
" + dat += "[extra_font]\tГенетические повреждения: [occupant.getCloneLoss()]
" extra_font = (occupant.getBrainLoss() < 1 ?"" : "") - dat += "[extra_font]\tApprox. Brain Damage %: [occupant.getBrainLoss()]
" + dat += "[extra_font]\tПовреждение мозга: [occupant.getBrainLoss()]
" - dat += "Paralysis Summary %: [occupant.AmountParalyzed()] ([round(occupant.AmountParalyzed() / 10)] seconds left!)
" - dat += "Body Temperature: [occupant.bodytemperature-T0C]°C ([occupant.bodytemperature*1.8-459.67]°F)
" + dat += "Паралич тела: [occupant.AmountParalyzed()] ([round(occupant.AmountParalyzed() / 10)] секунд осталось!)
" + dat += "Температура тела: [occupant.bodytemperature-T0C]°C ([occupant.bodytemperature*1.8-459.67]°F)
" dat += "
" if(occupant.has_brain_worms()) - dat += "Large growth detected in frontal lobe, possibly cancerous. Surgical removal is recommended.
" + dat += "В лобной доле обнаружено крупное образование, возможно, злокачественное. Рекомендуется хирургическое удаление." var/blood_percent = round((occupant.blood_volume / BLOOD_VOLUME_NORMAL)) blood_percent *= 100 extra_font = (occupant.blood_volume > 448 ? "" : "") - dat += "[extra_font]\tBlood Level %: [blood_percent] ([occupant.blood_volume] units)
" + dat += "[extra_font]\tУровень крови: [blood_percent] ([occupant.blood_volume] u)

" if(occupant.reagents) - dat += "Epinephrine units: [occupant.reagents.get_reagent_amount("Epinephrine")] units
" - dat += "Ether: [occupant.reagents.get_reagent_amount("ether")] units
" + dat += "Эпинефрин: [occupant.reagents.get_reagent_amount("Epinephrine")] u
" + dat += "Эфир: [occupant.reagents.get_reagent_amount("ether")] u
" extra_font = (occupant.reagents.get_reagent_amount("silver_sulfadiazine") < 30 ? "" : "") - dat += "[extra_font]\tSilver Sulfadiazine: [occupant.reagents.get_reagent_amount("silver_sulfadiazine")]
" + dat += "[extra_font]\tСульфадиазин серебра: [occupant.reagents.get_reagent_amount("silver_sulfadiazine")] u

" extra_font = (occupant.reagents.get_reagent_amount("styptic_powder") < 30 ? "" : "") - dat += "[extra_font]\tStyptic Powder: [occupant.reagents.get_reagent_amount("styptic_powder")] units
" + dat += "[extra_font]\tКровоостанавливающая пудра: [occupant.reagents.get_reagent_amount("styptic_powder")] u
" extra_font = (occupant.reagents.get_reagent_amount("salbutamol") < 30 ? "" : "") - dat += "[extra_font]\tSalbutamol: [occupant.reagents.get_reagent_amount("salbutamol")] units
" + dat += "[extra_font]\tСальбутамол: [occupant.reagents.get_reagent_amount("salbutamol")] u
" dat += "
" dat += "" - dat += "" - dat += "" - dat += "" - dat += "" + dat += "" + dat += "" + dat += "" + dat += "" dat += "" for(var/obj/item/organ/external/e as anything in occupant.bodyparts) @@ -504,79 +530,81 @@ var/dead = "" var/robot = "" var/imp = "" - var/bled = "" var/splint = "" var/internal_bleeding = "" var/lung_ruptured = "" if(e.has_internal_bleeding()) - internal_bleeding = "
Internal bleeding" + internal_bleeding = "
Внутреннее кровотечение" if(istype(e, /obj/item/organ/external/chest) && occupant.is_lung_ruptured()) - lung_ruptured = "Lung ruptured:" + lung_ruptured = "Пробито лёгкое" if(e.is_splinted()) - splint = "Splinted:" + splint = "Наложена шина" if(e.has_fracture()) - AN = "[e.broken_description]:" + AN = "[e.broken_description]" if(e.is_dead()) - dead = "DEAD:" + dead = "Мертво" if(e.is_robotic()) - robot = "Robotic:" + robot = "Синтетическое" if(e.open) - open = "Open:" + open = "Открыто" switch(e.germ_level) if(INFECTION_LEVEL_ONE to INFECTION_LEVEL_ONE + 200) - infected = "Mild Infection:" + infected = "Лёгкая инфекция" if(INFECTION_LEVEL_ONE + 200 to INFECTION_LEVEL_ONE + 300) - infected = "Mild Infection+:" + infected = "Лёгкая инфекция+" if(INFECTION_LEVEL_ONE + 300 to INFECTION_LEVEL_ONE + 400) - infected = "Mild Infection++:" + infected = "Лёгкая инфекция++" if(INFECTION_LEVEL_TWO to INFECTION_LEVEL_TWO + 200) - infected = "Acute Infection:" + infected = "Острая инфекция" if(INFECTION_LEVEL_TWO + 200 to INFECTION_LEVEL_TWO + 300) - infected = "Acute Infection+:" + infected = "Острая инфекция+" if(INFECTION_LEVEL_TWO + 300 to INFECTION_LEVEL_TWO + 399) - infected = "Acute Infection++:" + infected = "Острая инфекция++" if(INFECTION_LEVEL_TWO + 400 to INFINITY) - infected = "Septic:" + infected = "Сепсис" if(LAZYLEN(e.embedded_objects) || e.hidden) - imp += "Unknown body present:" - if(!AN && !open && !infected && !imp) - AN = "None:" - dat += "" + imp += "Обнаружено инородное тело" + if(!AN && !open && !infected && !imp && !internal_bleeding && !lung_ruptured) + AN = "Отсутствуют" + dat += "" dat += "" for(var/obj/item/organ/internal/organ as anything in occupant.internal_organs) - var/mech = organ.desc - var/infection = "None" + var/robot = "" + var/infection = "" var/dead = "" + if(organ.is_robotic()) + robot = "Синтетическое" if(organ.is_dead()) - dead = "DEAD:" + dead = "Мертво" switch(organ.germ_level) if(1 to INFECTION_LEVEL_ONE + 200) - infection = "Mild Infection:" + infection = "Лёгкая инфекция" if(INFECTION_LEVEL_ONE + 200 to INFECTION_LEVEL_ONE + 300) - infection = "Mild Infection+:" + infection = "Лёгкая инфекция+" if(INFECTION_LEVEL_ONE + 300 to INFECTION_LEVEL_ONE + 400) - infection = "Mild Infection++:" + infection = "Лёгкая инфекция++" if(INFECTION_LEVEL_TWO to INFECTION_LEVEL_TWO + 200) - infection = "Acute Infection:" + infection = "Острая инфекция" if(INFECTION_LEVEL_TWO + 200 to INFECTION_LEVEL_TWO + 300) - infection = "Acute Infection+:" + infection = "Острая инфекция+" if(INFECTION_LEVEL_TWO + 300 to INFECTION_LEVEL_TWO + 399) - infection = "Acute Infection++:" + infection = "Острая инфекция++" if(INFECTION_LEVEL_TWO + 400 to INFINITY) - infection = "Septic:" - + infection = "Сепсис" + if(!infection && !dead) + infection = "Отсутствуют" dat += "" - dat += "" + dat += "" dat += "" dat += "
OrganBurn DamageBrute DamageOther WoundsОрганОжогиФиз. поврежденияДругие повреждения
[e.name][e.burn_dam][e.brute_dam][robot][bled][AN][splint][open][infected][imp][internal_bleeding][lung_ruptured][dead][e.name][e.burn_dam][e.brute_dam][robot] [AN] [splint] [open] [infected] [imp] [internal_bleeding] [lung_ruptured] [dead]
[organ.name]N/A[organ.damage][infection]:[mech][dead][organ.name]Н/Д[organ.damage][infection] [robot] [dead]
" if(HAS_TRAIT(occupant, TRAIT_BLIND)) - dat += "Cataracts detected.
" + dat += "Обнаружена катаракта.
" if(HAS_TRAIT(occupant, TRAIT_COLORBLIND)) - dat += "Photoreceptor abnormalities detected.
" + dat += "Обнаружены нарушения в работе фоторецепторов.
" if(HAS_TRAIT(occupant, TRAIT_NEARSIGHTED)) - dat += "Retinal misalignment detected.
" + dat += "Обнаружено смещение сетчатки.
" else - dat += "[src] is empty." + dat += "[capitalize(declent_ru(NOMINATIVE))] пуст." return dat diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index bfad921a3e0..fad1981a519 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -24,7 +24,15 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\ /obj/machinery/clonepod anchored = TRUE name = "experimental biomass pod" - desc = "An electronically-lockable pod for growing organic tissue." + desc = "Капсула, предназначенная для искусственного выращивания органической ткани. Оборудована электронным замком. Выглядит жутковато." + ru_names = list( + NOMINATIVE = "капсула клонирования", + GENITIVE = "капсулы клонирования", + DATIVE = "капсуле клонирования", + ACCUSATIVE = "капсулу клонирования", + INSTRUMENTAL = "капсулой клонирования", + PREPOSITIONAL = "капсуле клонирования" + ) density = TRUE icon = 'icons/obj/machines/cloning.dmi' icon_state = "pod_idle" @@ -138,6 +146,15 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\ //TO-DO: Make the genetics machine accept them. /obj/item/disk/data name = "Cloning Data Disk" + desc = "Дискета, предназначенная для хранения данных ДНК-кода гуманоида." + ru_names = list( + NOMINATIVE = "ДНК-дискета", + GENITIVE = "ДНК-дискеты", + DATIVE = "ДНК-дискете", + ACCUSATIVE = "ДНК-дискету", + INSTRUMENTAL = "ДНК-дискетой", + PREPOSITIONAL = "ДНК-дискете" + ) icon_state = "datadisk0" //Gosh I hope syndies don't mistake them for the nuke disk. var/datum/dna2/record/buf = null var/read_only = FALSE //Well,it's still a floppy disk @@ -151,7 +168,7 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\ return ..() /obj/item/disk/data/demo - name = "data disk - 'God Emperor of Mankind'" + name = "data disk - 'Император Человечества'" read_only = TRUE /obj/item/disk/data/demo/New() @@ -160,7 +177,7 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\ buf.types=DNA2_BUF_UE|DNA2_BUF_UI //data = "066000033000000000AF00330660FF4DB002690" //data = "0C80C80C80C80C80C8000000000000161FBDDEF" - Farmer Jeff - buf.dna.real_name="God Emperor of Mankind" + buf.dna.real_name="Император Человечества" buf.dna.unique_enzymes = md5(buf.dna.real_name) buf.dna.UI=list(0x066,0x000,0x033,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0xAF0,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x033,0x066,0x0FF,0x4DB,0x002,0x690,0x000,0x000,0x000,0x328,0x045,0x5FC,0x053,0x035,0x035,0x035) //buf.dna.UI=list(0x0C8,0x0C8,0x0C8,0x0C8,0x0C8,0x0C8,0x000,0x000,0x000,0x000,0x161,0xFBD,0xDEF) // Farmer Jeff @@ -171,7 +188,7 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\ buf.dna.UpdateUI() /obj/item/disk/data/monkey - name = "data disk - 'Mr. Muggles'" + name = "data disk - 'Мистер Магглс'" read_only = 1 /obj/item/disk/data/monkey/New() @@ -192,24 +209,24 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\ /obj/item/disk/data/attack_self(mob/user as mob) read_only = !read_only - to_chat(user, "You flip the write-protect tab to [read_only ? "protected" : "unprotected"].") + balloon_alert(user, "защита от записи [read_only ? "включена" : "выключена"]") /obj/item/disk/data/examine(mob/user) . = ..() - . += span_notice("The write-protect tab is set to [read_only ? "protected" : "unprotected"].") + . += span_notice("Механизм защиты от записи [read_only ? "включён" : "выключен"].") //Clonepod /obj/machinery/clonepod/examine(mob/user) . = ..() if(mess) - . += span_warning("It's filled with blood and viscera. You swear you can see it moving...") + . += span_warning("Она заполнена мессивом из крови и внутренностей. Вам кажется или оно сейчас сдвинулось..?") if(HAS_TRAIT(src, TRAIT_CMAGGED)) - . += span_warning("Yellow ooze is dripping out of the synthmeat storage chamber...") + . += span_warning("Из камеры хранения органического сырья сочится жёлтая слизь...") if(!occupant || stat & (NOPOWER|BROKEN)) return if(occupant && occupant.stat != DEAD) - . += span_notice("Current clone cycle is [round(get_completion())]% complete.") + . += span_notice("Процесс клонирования завершён на [round(get_completion())]%.") /obj/machinery/clonepod/return_air() //non-reactive air var/datum/gas_mixture/GM = new @@ -233,7 +250,7 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\ playsound(loc, pick('sound/goonstation/voice/male_scream.ogg', 'sound/goonstation/voice/female_scream.ogg'), 100, 1) mess = TRUE update_icon() - connected_message("If you keep trying to steal from me, you'll end up with me.") + connected_message("Если ты снова попытаешься украсть у Меня, то Я приду за тобой лично.") //Start growing a human clone in the pod! /obj/machinery/clonepod/proc/growclone(datum/dna2/record/R) @@ -273,7 +290,7 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\ else return 0 - attempting = TRUE //One at a time!! + attempting = TRUE // One at a time!! countdown.start() if(!R.dna) @@ -283,7 +300,7 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\ H.set_species(R.dna.species.type) occupant = H - if(!R.dna.real_name) //to prevent null names + if(!R.dna.real_name) // to prevent null names R.dna.real_name = H.real_name else H.real_name = R.dna.real_name @@ -294,10 +311,10 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\ H.add_language(L.name) if(is_taipan(z)) - H.faction.Add("syndicate") //Чтобы синдикатовцы после клонирования оставались синдикатовцами + H.faction.Add("syndicate") // So that Syndie guys remain Syndie guys after cloning - H.check_genes(MUTCHK_FORCED) //Ensures species that get powers by the species proc handle_dna keep them + H.check_genes(MUTCHK_FORCED) // Ensures species that get powers by the species proc handle_dna keep them if(efficiency > 2 && efficiency < 5 && prob(25)) randmutb(H) @@ -322,11 +339,11 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\ H.ckey = R.ckey update_clone_antag(H) //Since the body's got the mind, update their antag stuff right now. Otherwise, wait until they get kicked out (as per the CLONER_MATURE_CLONE business) to do it. var/message - message += "Consciousness slowly creeps over you as your body regenerates.
" - message += "So this is what cloning feels like?" + message += "Вы медленно обретаете сознание по мере того, как ваше тело восстанавливается.
" + message += "Так вот как ощущается клонирование..." to_chat(H, span_notice("[message]")) else if(grab_ghost_when == CLONER_MATURE_CLONE) - to_chat(clonemind.current, span_notice("Your body is beginning to regenerate in a cloning pod. You will become conscious when it is complete.")) + to_chat(clonemind.current, span_notice("Ваше тело начинает восстанавливаться в капсуле клонирования. Вы обретёте сознание после завершения.")) // Set up a soul link with the dead body to catch a revival RegisterSignal(clonemind.current, COMSIG_LIVING_REVIVE, PROC_REF(occupant_got_revived)) RegisterSignal(clonemind, COMSIG_MIND_TRANSER_TO, PROC_REF(occupant_got_revived)) @@ -346,18 +363,18 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\ biomass += BIOMASS_BASE_AMOUNT show_message = TRUE if(show_message) - visible_message("[src] sucks in and processes the nearby biomass.") + visible_message("[capitalize(declent_ru(NOMINATIVE))] всасывает и начинает обрабатывать полученную биомассу.") if(stat & NOPOWER) //Autoeject if power is lost if(occupant) go_out() - connected_message("Clone Ejected: Loss of power.") + connected_message("Клон извлечён: Недостаточно энергии.") else if((occupant) && (occupant.loc == src)) if((occupant.stat == DEAD) || (occupant.suiciding) || (occupant.mind && !occupant.mind.is_revivable())) //Autoeject corpses and suiciding dudes. - announce_radio_message("The cloning of [occupant] has been aborted due to unrecoverable tissue failure.") + announce_radio_message("Клонирование пациента [occupant]не было осуществлено из-за необратимого повреждения тканей организма.") go_out() - connected_message("Clone Rejected: Deceased.") + connected_message("Клонирование невозможно: Смерть пациента.") else if(occupant.cloneloss > (100 - heal_level)) occupant.Paralyse(8 SECONDS) @@ -390,8 +407,8 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\ use_power(7500) //This might need tweaking. else if((occupant.cloneloss <= (100 - heal_level))) - connected_message("Cloning Process Complete.") - announce_radio_message("The cloning cycle of [occupant] is complete.") + connected_message("Процесс клонирования завершён..") + announce_radio_message("Процесс клонирования пациента [occupant] завершён.") go_out() else if((!occupant) || (occupant.loc != src)) @@ -411,14 +428,14 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\ if(I.GetID()) add_fingerprint(user) if(!check_access(I)) - to_chat(user, span_danger("Access Denied.")) + balloon_alert(user, "отказано в доступе!") return ATTACK_CHAIN_PROCEED if(!(occupant || mess)) - to_chat(user, span_danger("Error: Pod has no occupant.")) + balloon_alert(user, "внутри пусто!") return ATTACK_CHAIN_PROCEED - connected_message("Authorized Ejection") - announce_radio_message("An authorized ejection of [(occupant) ? occupant.real_name : "the malfunctioning pod"] has occured") - to_chat(user, span_notice("You force an emergency ejection.")) + connected_message("Инициировано извлечение клона.") + announce_radio_message("Инициировано извлечение клона [(occupant) ? occupant.real_name : ""].") + balloon_alert(user, "клон извлечён") go_out() return ATTACK_CHAIN_PROCEED_SUCCESS @@ -434,14 +451,14 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\ if(!cleaning) return ..() user.visible_message( - span_notice("[user] starts to clean the ooze off the [src]."), - span_notice("You start to clean the ooze off the [src]."), + span_notice("[user] начина[pluralize_ru(user.gender, "ет", "ют")] счищать слизь с [declent_ru(GENITIVE)]."), + span_notice("Вы начинаете счищать слизь с [declent_ru(GENITIVE)].") ) if(!do_after(user, 5 SECONDS, src)) return ATTACK_CHAIN_PROCEED user.visible_message( - span_notice("[user] cleans the ooze off [src]."), - span_notice("You clean the ooze off [src]."), + span_notice("[user] убира[pluralize_ru(user.gender, "ет", "ют")] слизь с [declent_ru(GENITIVE)]."), + span_notice("Вы убрали слизь с [declent_ru(GENITIVE)].") ) REMOVE_TRAIT(src, TRAIT_CMAGGED, CMAGGED) return ATTACK_CHAIN_PROCEED_SUCCESS @@ -451,7 +468,7 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\ if(!user.drop_transfer_item_to_loc(I, src)) return ..() add_fingerprint(user) - to_chat(user, span_notice("The [name] processes [I].")) + balloon_alert(user, "биомасса загружена") biomass += BIOMASS_BASE_AMOUNT qdel(I) return ATTACK_CHAIN_BLOCKED_ALL @@ -483,7 +500,7 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\ if(!I.use_tool(src, user, 0, volume = I.tool_volume)) return if(occupant) - to_chat(user, span_warning("Can not do that while [src] is in use.")) + balloon_alert(user, "внутри кто-то есть!") return set_anchored(!anchored) if(anchored) @@ -503,7 +520,7 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\ if(HAS_TRAIT(src, TRAIT_CMAGGED)) return playsound(src, "sparks", 75, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - to_chat(user, span_warning("A droplet of bananium ooze seeps into the synthmeat storage chamber...")) + balloon_alert(user, "хонкнуто!") ADD_TRAIT(src, TRAIT_CMAGGED, CMAGGED) /obj/machinery/clonepod/proc/update_clone_antag(var/mob/living/carbon/human/H) @@ -556,9 +573,9 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\ clonemind.transfer_to(occupant) occupant.grab_ghost() update_clone_antag(occupant) - to_chat(occupant, span_userdanger("You remember nothing from the time that you were dead!")) - to_chat(occupant, span_notice("There is a bright flash!
\ - You feel like a new being.")) + to_chat(occupant, span_userdanger("Вы не можете ничего вспомнить с момента вашей смерти!")) + to_chat(occupant, span_notice("Ваши глаза озаряет яркая вспышка!
\ + Вы будто бы заново родились.")) if(HAS_TRAIT(src, TRAIT_CMAGGED)) playsound(loc, 'sound/items/bikehorn.ogg', 50, TRUE) occupant.force_gene_block(GLOB.clumsyblock, TRUE, TRUE) @@ -583,8 +600,8 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\ /obj/machinery/clonepod/proc/malfunction(go_easy = FALSE) if(occupant) - connected_message("Critical Error!") - announce_radio_message("Critical error! Please contact a Thinktronic Systems technician, as your warranty may be affected.") + connected_message("Критическая ошибка!") + announce_radio_message("Критическая ошибка! Свяжитесь со специалистом Thinktronic Systems, чтобы получить техническое обслуживание по гарантии!") UnregisterSignal(clonemind.current, COMSIG_LIVING_REVIVE) UnregisterSignal(clonemind, COMSIG_MIND_TRANSER_TO) if(!go_easy) @@ -592,8 +609,8 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\ clonemind.transfer_to(occupant) occupant.grab_ghost() // We really just want to make you suffer. var/message - message += "Agony blazes across your consciousness as your body is torn apart.
" - message += "Is this what dying is like? Yes it is." + message += "Ваше тело выворачивает наизнанку, волна агонизирующей боли заливает ваше сознание.
" + message += "Это и есть [pluralize_ru(occupant.gender, "моя", "наша")] смерть? Да, это она." to_chat(occupant, span_warning("[message]")) SEND_SOUND(occupant, sound('sound/hallucinations/veryfar_noise.ogg', 0, 1, 50)) for(var/i in missing_organs) @@ -696,6 +713,15 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\ /obj/item/storage/box/disks name = "Diskette Box" + desc = "Коробка для хранения дискет." + ru_names = list( + NOMINATIVE = "коробка с дискетами", + GENITIVE = "коробки с дискетами", + DATIVE = "коробке с дискетами", + ACCUSATIVE = "коробку с дискетами", + INSTRUMENTAL = "коробкой с дискетами", + PREPOSITIONAL = "коробке с дискетами" + ) icon_state = "disk_kit" /obj/item/storage/box/disks/populate_contents() diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm index e45eb7adaa2..32a614f8bd4 100644 --- a/code/game/machinery/computer/Operating.dm +++ b/code/game/machinery/computer/Operating.dm @@ -2,6 +2,15 @@ /obj/machinery/computer/operating name = "operating computer" + desc = "Высокотехнологичный медицинский компьютер, используемый для контролирования процесса хиругических операций." + ru_names = list( + NOMINATIVE = "операционный компьютер", + GENITIVE = "операционного компьютера", + DATIVE = "операционному компьютеру", + ACCUSATIVE = "операционный компьютер", + INSTRUMENTAL = "операционным компьютером", + PREPOSITIONAL = "операционном компьютере" + ) density = TRUE anchored = TRUE icon_keyboard = "med_key" @@ -201,20 +210,20 @@ var/isNewPatient = (table.patient != currentPatient) //Is this a new Patient? if(table.patient.stat == DEAD || HAS_TRAIT(table.patient, TRAIT_FAKEDEATH)) - patientStatus = "умер" + patientStatus = "зафиксирована смерть" else if(table.patient.stat == CONSCIOUS) patientStatus = "в сознании" else if(table.patient.stat == UNCONSCIOUS) - patientStatus = "спит" + patientStatus = "без сознания" if(isNewPatient) - atom_say("Обнаружен новый пациент, загрузка показаний") + atom_say("Обнаружен новый пациент, загрузка показаний.") var/blood_type_msg if(ishuman(table.patient)) blood_type_msg = table.patient.dna.blood_type else blood_type_msg = "\[ОШИБКА: НЕИЗВЕСТНО\]" - atom_say("[table.patient], группа крови [blood_type_msg], [patientStatus]") + atom_say("[table.patient], группа крови [blood_type_msg], [patientStatus].") SStgui.update_uis(src) patientStatusHolder = table.patient.stat currentPatient = table.patient @@ -226,9 +235,9 @@ if(oxy && table.patient.getOxyLoss()>oxyAlarm) playsound(src.loc, 'sound/machines/defib_saftyoff.ogg', 50, 0) if(healthAnnounce && table.patient.health <= healthAlarm) - atom_say("[round(table.patient.health)]") + atom_say("Оценка здоровья пациента: [round(table.patient.health)] %.") if(table.patient.stat != patientStatusHolder) - atom_say("Пациент [patientStatus]") + atom_say("Состояние пациента: [patientStatus].") patientStatusHolder = table.patient.stat /obj/machinery/computer/operating/old_frame diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index dbfc063915e..1e03826f20b 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -3,6 +3,15 @@ /obj/machinery/computer/cloning name = "biomass pod console" + desc = "Консоль для управления капсулой клонирования." + ru_names = list( + NOMINATIVE = "консоль капсулы клонирования", + GENITIVE = "консоли капсулы клонирования", + DATIVE = "консоли капсулы клонирования", + ACCUSATIVE = "консоль капсулы клонирования", + INSTRUMENTAL = "консолью капсулы клонирования", + PREPOSITIONAL = "консоли капсулы клонирования" + ) icon = 'icons/obj/machines/computer.dmi' icon_keyboard = "med_key" icon_screen = "dna" @@ -29,7 +38,7 @@ . = ..() pods = list() records = list() - set_scan_temp(emagged ? "Killer ready." : "Scanner ready.", "good") + set_scan_temp(emagged ? "Уничтожитель готов." : "Сканер готов.", "good") updatemodules() /obj/machinery/computer/cloning/Destroy() @@ -102,12 +111,12 @@ if(istype(I, /obj/item/disk/data)) //INSERT SOME DISKETTES add_fingerprint(user) if(diskette) - to_chat(user, span_warning("There is already [diskette] inside!")) + balloon_alert(user, "слот для дискеты занят!") return ATTACK_CHAIN_PROCEED if(!user.drop_transfer_item_to_loc(I, src)) return ..() diskette = I - to_chat(user, "You insert [I].") + balloon_alert(user, "дискета вставлена") SStgui.update_uis(src) return ATTACK_CHAIN_BLOCKED_ALL @@ -122,13 +131,13 @@ if(!multitool.buffer || !istype(multitool.buffer, /obj/machinery/clonepod)) return . if(multitool.buffer in pods) - to_chat(user, span_notice("The [multitool.buffer.name] is already connected to [src].")) + balloon_alert(user, "уже подключено!") return . var/obj/machinery/clonepod/clonepod = multitool.buffer pods += clonepod clonepod.connected = src clonepod.name = "[initial(clonepod.name)] #[length(pods)]" - to_chat(user, span_notice("You connect [clonepod] to [src].")) + balloon_alert(user, "устройства связаны") /obj/machinery/computer/cloning/attack_ai(mob/user) @@ -158,7 +167,7 @@ if(!emagged) emagged = TRUE add_attack_logs(user, src, "emagged") - set_scan_temp(emagged ? "Killer ready." : "Scanner ready.", "good") + set_scan_temp(emagged ? "Уничтожитель готов." : "Сканер готов.", "good") emp_act(1) SStgui.update_uis(src) else @@ -177,7 +186,7 @@ ui = SStgui.try_update_ui(user, src, ui) if(!ui) - ui = new(user, src, "CloningConsole", "Cloning Console") + ui = new(user, src, "CloningConsole", "Консоль клонирования") ui.open() /obj/machinery/computer/cloning/ui_assets(mob/user) @@ -199,11 +208,11 @@ if(pod.efficiency > 5) canpodautoprocess = 1 - var/status = "idle" + var/status = "режим ожидания" if(pod.mess) - status = "mess" + status = "неопознанный объект" else if(pod.occupant && !(pod.stat & NOPOWER)) - status = "cloning" + status = "клонирование" tempods.Add(list(list( "pod" = "\ref[pod]", "name" = sanitize(capitalize(pod.name)), @@ -261,15 +270,15 @@ if(params["id"] == "del_rec" && active_record) var/obj/item/C = usr.get_active_hand() if(!istype(C) || !C.GetID()) - set_temp("ID not in hand.", "danger") + set_temp("ID карта не предъявлена.", "danger") return if(check_access(C.GetID())) records.Remove(active_record) qdel(active_record) - set_temp("Record deleted.", "success") + set_temp("Запись удалена.", "success") menu = MENU_RECORDS else - set_temp("Access denied.", "danger") + set_temp("Отказано в доступе.", "danger") playsound(src, pick('sound/machines/button.ogg', 'sound/machines/button_alternate.ogg', 'sound/machines/button_meloboom.ogg'), 20) return @@ -277,7 +286,7 @@ if("scan") if(!scanner || !scanner.occupant || loading) return - set_scan_temp(emagged ? "Killer ready." : "Scanner ready.", "good") + set_scan_temp(emagged ? "Уничтожитель готов." : "Сканер готов.", "good") loading = TRUE spawn(20) @@ -301,7 +310,7 @@ if(istype(active_record)) if(isnull(active_record.ckey)) qdel(active_record) - set_temp("Error: Record corrupt.", "danger") + set_temp("Ошибка: запись повреждена.", "danger") else var/obj/item/implant/health/H = null if(active_record.implant) @@ -316,29 +325,29 @@ ui_modal_message(src, action, "", null, payload) else active_record = null - set_temp(emagged ? "Error: Prey missing." : "Error: Record missing.", "danger") + set_temp(emagged ? "Ошибка: жертва не обнаружена." : "Ошибка: запись не обнаружена.", "danger") if("del_rec") if(!active_record) return - ui_modal_boolean(src, action, "Please confirm that you want to delete the record by holding your ID and pressing Delete:", yes_text = "Delete", no_text = "Cancel") + ui_modal_boolean(src, action, "Для удаления записи предъявите свою ID-карту и нажмите на кнопку\"Удалить\":", yes_text = "Удалить", no_text = "Отмена") if("disk") // Disk management. if(!length(params["option"])) return switch(params["option"]) if("load") if(isnull(diskette) || isnull(diskette.buf)) - set_temp("Error: The disk's data could not be read.", "danger") + set_temp("Ошибка: не удалось считать данные с дискеты.", "danger") return else if(isnull(active_record)) - set_temp(emagged ? "Error: No active prey was found." : "Error: No active record was found.", "danger") + set_temp(emagged ? "Ошибка: жертва не обнаружена." : "Ошибка: запись не обнаружена", "danger") menu = MENU_MAIN return active_record = diskette.buf.copy() - set_temp("Successfully loaded from disk.", "success") + set_temp("Данные загружены с дискеты.", "success") if("save") if(isnull(diskette) || diskette.read_only || isnull(active_record)) - set_temp("Error: The data could not be saved.", "danger") + set_temp("Ошибка: сохранение данных невозможно.", "danger") return // DNA2 makes things a little simpler. @@ -351,12 +360,12 @@ if("se") types = DNA2_BUF_SE else - set_temp("Error: Invalid save format.", "danger") + set_temp("Ошибка: неподходящий для сохранения формат данных.", "danger") return diskette.buf = active_record.copy() diskette.buf.types = types diskette.name = "data disk - '[active_record.dna.real_name]'" - set_temp("Successfully saved to disk.", "success") + set_temp("Данные сохранены на дискету.", "success") if("eject") if(!isnull(diskette)) diskette.loc = loc @@ -380,33 +389,33 @@ ui_modal_clear(src) //Can't clone without someone to clone. Or a pod. Or if the pod is busy. Or full of gibs. if(!length(pods)) - set_temp(emagged ? "Error: No killing pod detected." : "Error: No cloning pod detected.", "danger") + set_temp(emagged ? "Ошибка: капсула уничтожения не обнаружена." : "Ошибка: капсула клонирования не обнаружена.", "danger") else var/obj/machinery/clonepod/pod = selected_pod var/cloneresult if(!selected_pod) - set_temp(emagged ? "Error: No killing pod selected." : "Error: No cloning pod selected.", "danger") + set_temp(emagged ? "Ошибка: капсула уничтожения не выбрана." : "Ошибка: капсула клонирования не выбрана.", "danger") else if(pod.occupant) - set_temp("Error: The cloning pod is currently occupied.", "danger") + set_temp("Ошибка: капсула клонирования занята.", "danger") else if(pod.biomass < CLONE_BIOMASS) - set_temp(emagged ? "Error: Not enough MEAT!" : "Error: Not enough biomass.", "danger") + set_temp(emagged ? "Ошибка: недостаточно ПЛОТИ!" : "Ошибка: недостаточно биомассы", "danger") else if(pod.mess) - set_temp(emagged ? "Error: The killing pod is ok." : "Error: The cloning pod is malfunctioning.", emagged? "good" : "danger") + set_temp(emagged ? "Ошибка: капсула уничтожения в порядке." : "Ошибка: капсула клонирования неисправна.", emagged? "good" : "danger") else if(!CONFIG_GET(flag/revival_cloning)) - set_temp(emagged ? "Error: Unable to initiate killing cycle. " : "Error: Unable to initiate cloning cycle.", "danger") + set_temp(emagged ? "Ошибка: запуск процесса уничтожения невозможен." : "Ошибка: запуск процесса клонирования невозможен.", "danger") else cloneresult = pod.growclone(C) if(cloneresult) - set_temp(emagged ? "Initiating killing cycle... Subject successfully killed!" : "Initiating cloning cycle...", "success") + set_temp(emagged ? "Запуск процеса уничтожения... Субъект успешно уничтожен!" : "Запуск процеса клонирования...", "success") records.Remove(C) qdel(C) menu = MENU_MAIN if(emagged) emp_act() else - set_temp(emagged ? "Success: You are doing great!" : "Error: Initialisation failure.", emagged ? "good" : "danger") + set_temp(emagged ? "Успех: всё идёт хорошо!" : "Ошибка: сбой инициализации клонирования.", emagged ? "good" : "danger") else - set_temp("Error: Data corruption.", "danger") + set_temp("Ошибка: данные повреждены.", "danger") if("menu") menu = clamp(text2num(params["num"]), MENU_MAIN, MENU_RECORDS) if("toggle_mode") @@ -437,43 +446,43 @@ return if(isnull(subject) || (!(ishuman(subject))) || (!subject.dna)) if(isalien(subject)) - set_scan_temp("Xenomorphs are not scannable.", "bad") + set_scan_temp("Ксеноморфы не подлежат сканированию.", "bad") SStgui.update_uis(src) return // can add more conditions for specific non-human messages here else - set_scan_temp("Subject species is not scannable.", "bad") + set_scan_temp("Субъект данной расы не подлежит сканированию.", "bad") SStgui.update_uis(src) return var/obj/item/organ/internal/brain/brain = subject.get_int_organ(/obj/item/organ/internal/brain) if(!brain) - set_scan_temp("No brain detected in subject.", emagged ? "good" : "bad") + set_scan_temp("Мозг в теле субъекта не обнаружен.", emagged ? "good" : "bad") SStgui.update_uis(src) return if(HAS_TRAIT(brain, TRAIT_NO_SCAN)) - set_scan_temp("Subject is not scannable.", "bad") + set_scan_temp("Субъект не подлежит сканированию.", "bad") SStgui.update_uis(src) return if(subject.suiciding) - set_scan_temp(emagged ? "Prey come in better world. Leave it be" : "Subject has committed suicide and is not scannable.", emagged ? "good" : "bad") + set_scan_temp(emagged ? "Жертва ушла в лучший мир. Да будет так." : "Субъект совершил самоубийство и не подлежит сканированию.", emagged ? "good" : "bad") SStgui.update_uis(src) return if((!subject.ckey) || (!subject.client)) - set_scan_temp(emagged ? "Prey's brain is in pristine condition. Further attempts not needed." : "Subject's brain is not responding. Further attempts after a short delay may succeed.", emagged ? "good" : "bad") + set_scan_temp(emagged ? "Мозг жертвы в идеальном состоянии. Дальнейшие попытки сканирования не требуются." : "Мозг субъекта не подаёт сигналов. Дальнейшии попытки сканирования могут быть успешны.", emagged ? "good" : "bad") SStgui.update_uis(src) return if(HAS_TRAIT(subject, TRAIT_NO_CLONE) && scanner.scan_level < 2) - set_scan_temp(emagged ? "Prey has a too perfect body. Cry about it" : "Subject has incompatible genetic mutations.", emagged ? "good" : "bad") + set_scan_temp(emagged ? "Тело жертвы слишком идеально. Поплачь об этом." : "Субъект подвергся генетическим мутациям, не совместимым со сканированием.", emagged ? "good" : "bad") SStgui.update_uis(src) return if(!isnull(find_record(subject.ckey))) - set_scan_temp(emagged ? "Баян." : "Subject already in database.") + set_scan_temp(emagged ? "Баян." : "Данные о субъекте уже занесены в базу данных.") SStgui.update_uis(src) return for(var/obj/machinery/clonepod/pod in pods) if(pod.occupant && pod.clonemind == subject.mind) - set_scan_temp("Subject already getting cloned.") + set_scan_temp("Субъект уже клонируется.") SStgui.update_uis(src) return @@ -505,7 +514,7 @@ R.mind = "\ref[subject.mind]" src.records += R - set_scan_temp(emagged ? "Prey successfully scanned. [extra_info]" : "Subject successfully scanned. [extra_info]", "good") + set_scan_temp(emagged ? "Жертва успешно отсканирована. [extra_info]" : "Субъект успешно отсканирован. [extra_info]", "good") SStgui.update_uis(src) //Find a specific record by key. diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index d90f389afea..beb7abf06e0 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -1,6 +1,14 @@ /obj/machinery/computer/crew name = "crew monitoring computer" - desc = "Используется для контроля активных датчиков состояния здоровья, встроенных в униформу большинства членов экипажа." + desc = "Консоль, используемая для контроля активных датчиков состояния здоровья, встроенных в униформу большинства членов экипажа." + ru_names = list( + NOMINATIVE = "консоль наблюдения за экипажем", + GENITIVE = "консоли наблюдения за экипажем", + DATIVE = "консоли наблюдения за экипажем", + ACCUSATIVE = "консоль наблюдения за экипажем", + INSTRUMENTAL = "консолью наблюдения за экипажем", + PREPOSITIONAL = "консоли наблюдения за экипажем" + ) icon_keyboard = "med_key" icon_screen = "crew" use_power = IDLE_POWER_USE diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index a04d1cacb97..ca414df76dd 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -9,7 +9,15 @@ /obj/machinery/computer/med_data //TODO:SANITY name = "medical records console" - desc = "Используется для проверки медицинских записей." + desc = "Консоль, подключённая к станционной базе данных. Позволяет просматривать и редактировать медицинские записи членов экипажа." + ru_names = list( + NOMINATIVE = "консоль медицинских записей", + GENITIVE = "консоли медицинских записей", + DATIVE = "консоли медицинских записей", + ACCUSATIVE = "консоль медицинских записей", + INSTRUMENTAL = "консолью медицинских записей", + PREPOSITIONAL = "консоли медицинских записей" + ) icon_keyboard = "med_key" icon_screen = "medcomp" req_access = list(ACCESS_MEDICAL, ACCESS_FORENSICS_LOCKERS) @@ -29,29 +37,29 @@ . = ..() field_edit_questions = list( // General - "sex" = "Please select new sex:", - "age" = "Please input new age:", - "fingerprint" = "Please input new fingerprint hash:", - "p_stat" = "Please select new physical status:", - "m_stat" = "Please select new mental status:", + "sex" = "Укажите пол:", + "age" = "Укажите возраст:", + "fingerprint" = "Введите код отпечатков пальцев:", + "p_stat" = "Укажите физическое состояние:", + "m_stat" = "Укажите психологическое состояние:", // Medical - "blood_type" = "Please select new blood type:", - "b_dna" = "Please input new DNA:", - "mi_dis" = "Please input new minor disabilities:", - "mi_dis_d" = "Please summarize minor disabilities:", - "ma_dis" = "Please input new major disabilities:", - "ma_dis_d" = "Please summarize major disabilities:", - "alg" = "Please input new allergies:", - "alg_d" = "Please summarize allergies:", - "cdi" = "Please input new current diseases:", - "cdi_d" = "Please summarize current diseases:", - "notes" = "Please input new important notes:", + "blood_type" = "Укажите группу крови:", + "b_dna" = "Введите ДНК-код:", + "mi_dis" = "Укажите незначительные отклонения:", + "mi_dis_d" = "Укажите детали незначительных отклонений:", + "ma_dis" = "Укажите инвалидности:", + "ma_dis_d" = "Укажите детали инвалидностей:", + "alg" = "Укажите аллергии:", + "alg_d" = "Укажите детали аллергий:", + "cdi" = "Укажите текущие заболевания:", + "cdi_d" = "Укажите детали текущих заболеваний:", + "notes" = "Укажите дополнительную информацию:", ) field_edit_choices = list( // General - "sex" = list("Male", "Female"), - "p_stat" = list("*Deceased*", "*SSD*", "Active", "Physically Unfit", "Disabled"), - "m_stat" = list("*Insane*", "*Unstable*", "*Watch*", "Stable"), + "sex" = list("Мужской", "Женский", "Небинарный", "Множественный"), + "p_stat" = list("Смерть", "КРС", "Стабильное", "Нетрудоспособность", "Ограниченные возможности"), + "m_stat" = list("Невменяемость", "Нестабильное", "Рекомендуется наблюдение", "Стабильное"), // Medical "blood_type" = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-"), ) @@ -77,7 +85,7 @@ if(..()) return if(is_away_level(z)) - to_chat(user, span_danger("Unable to establish a connection") + ": You're too far away from the station!") + to_chat(user, span_danger("Удалённый сервер не отвечает на запросы") + ": база данных вне зоны досягаемости.") return add_fingerprint(user) ui_interact(user) @@ -85,7 +93,7 @@ /obj/machinery/computer/med_data/ui_interact(mob/user, datum/tgui/ui = null) ui = SStgui.try_update_ui(user, src, ui) if(!ui) - ui = new(user, src, "MedicalRecords", "Medical Records") + ui = new(user, src, "MedicalRecords", "Медицинские записи") ui.open() ui.set_autoupdate(FALSE) @@ -116,13 +124,13 @@ if(istype(active1, /datum/data/record) && GLOB.data_core.general.Find(active1)) var/list/fields = list() general["fields"] = fields - fields[++fields.len] = FIELD("Name", active1.fields["name"], null) + fields[++fields.len] = FIELD("Имя", active1.fields["name"], null) fields[++fields.len] = FIELD("ID", active1.fields["id"], null) - fields[++fields.len] = FIELD("Sex", active1.fields["sex"], "sex") - fields[++fields.len] = FIELD("Age", active1.fields["age"], "age") - fields[++fields.len] = FIELD("Fingerprint", active1.fields["fingerprint"], "fingerprint") - fields[++fields.len] = FIELD("Physical Status", active1.fields["p_stat"], "p_stat") - fields[++fields.len] = FIELD("Mental Status", active1.fields["m_stat"], "m_stat") + fields[++fields.len] = FIELD("Пол", active1.fields["sex"], "sex") + fields[++fields.len] = FIELD("Возраст", active1.fields["age"], "age") + fields[++fields.len] = FIELD("Отпечатки пальцев", active1.fields["fingerprint"], "fingerprint") + fields[++fields.len] = FIELD("Физическое состояние", active1.fields["p_stat"], "p_stat") + fields[++fields.len] = FIELD("Психологическое состояние", active1.fields["m_stat"], "m_stat") var/list/photos = list() general["photos"] = photos photos[++photos.len] = active1.fields["photo-south"] @@ -137,17 +145,17 @@ if(istype(active2, /datum/data/record) && GLOB.data_core.medical.Find(active2)) var/list/fields = list() medical["fields"] = fields - fields[++fields.len] = MED_FIELD("Blood Type", active2.fields["blood_type"], "blood_type", FALSE) - fields[++fields.len] = MED_FIELD("DNA", active2.fields["b_dna"], "b_dna", TRUE) - fields[++fields.len] = MED_FIELD("Minor Disabilities", active2.fields["mi_dis"], "mi_dis", FALSE) - fields[++fields.len] = MED_FIELD("Details", active2.fields["mi_dis_d"], "mi_dis_d", FALSE) - fields[++fields.len] = MED_FIELD("Major Disabilities", active2.fields["ma_dis"], "ma_dis", FALSE) - fields[++fields.len] = MED_FIELD("Details", active2.fields["ma_dis_d"], "ma_dis_d", TRUE) - fields[++fields.len] = MED_FIELD("Allergies", active2.fields["alg"], "alg", FALSE) - fields[++fields.len] = MED_FIELD("Details", active2.fields["alg_d"], "alg_d", FALSE) - fields[++fields.len] = MED_FIELD("Current Diseases", active2.fields["cdi"], "cdi", FALSE) - fields[++fields.len] = MED_FIELD("Details", active2.fields["cdi_d"], "cdi_d", TRUE) - fields[++fields.len] = MED_FIELD("Important Notes", active2.fields["notes"], "notes", FALSE) + fields[++fields.len] = MED_FIELD("Группа крови", active2.fields["blood_type"], "blood_type", FALSE) + fields[++fields.len] = MED_FIELD("ДНК", active2.fields["b_dna"], "b_dna", TRUE) + fields[++fields.len] = MED_FIELD("Незначительные отклонения", active2.fields["mi_dis"], "mi_dis", FALSE) + fields[++fields.len] = MED_FIELD("Детали", active2.fields["mi_dis_d"], "mi_dis_d", FALSE) + fields[++fields.len] = MED_FIELD("Инвалидности", active2.fields["ma_dis"], "ma_dis", FALSE) + fields[++fields.len] = MED_FIELD("Детали", active2.fields["ma_dis_d"], "ma_dis_d", TRUE) + fields[++fields.len] = MED_FIELD("Аллергии", active2.fields["alg"], "alg", FALSE) + fields[++fields.len] = MED_FIELD("Детали", active2.fields["alg_d"], "alg_d", FALSE) + fields[++fields.len] = MED_FIELD("Текущие заболевания", active2.fields["cdi"], "cdi", FALSE) + fields[++fields.len] = MED_FIELD("Детали", active2.fields["cdi_d"], "cdi_d", TRUE) + fields[++fields.len] = MED_FIELD("Дополнительная информация", active2.fields["notes"], "notes", FALSE) if(!active2.fields["comments"] || !islist(active2.fields["comments"])) active2.fields["comments"] = list() medical["comments"] = active2.fields["comments"] @@ -238,7 +246,7 @@ name = D.name, max_stages = D.max_stages, spread_text = istype(V) ? V.spread_text() : "", - cure = D.cure_text || "None", + cure = D.cure_text || "Н/Д", desc = D.desc, severity = D.severity ) @@ -247,15 +255,15 @@ if("del_all_med_records") for(var/datum/data/record/R in GLOB.data_core.medical) qdel(R) - set_temp("All medical records deleted.") + set_temp("База данных очищена.") if("del_med_record") if(active2) - set_temp("Medical record deleted.") + set_temp("Запись удалена.") qdel(active2) if("view_record") var/datum/data/record/general_record = locate(params["view_record"] || "") if(!GLOB.data_core.general.Find(general_record)) - set_temp("Record not found.", "danger") + set_temp("Запись не найдена.", "danger") return var/datum/data/record/medical_record @@ -272,22 +280,22 @@ var/datum/data/record/R = new /datum/data/record() R.fields["name"] = active1.fields["name"] R.fields["id"] = active1.fields["id"] - R.name = "Medical Record #[R.fields["id"]]" - R.fields["blood_type"] = "Unknown" - R.fields["b_dna"] = "Unknown" - R.fields["mi_dis"] = "None" - R.fields["mi_dis_d"] = "No minor disabilities have been declared." - R.fields["ma_dis"] = "None" - R.fields["ma_dis_d"] = "No major disabilities have been diagnosed." - R.fields["alg"] = "None" - R.fields["alg_d"] = "No allergies have been detected in this patient." - R.fields["cdi"] = "None" - R.fields["cdi_d"] = "No diseases have been diagnosed at the moment." - R.fields["notes"] = "No notes." + R.name = "Медицинская запись №[R.fields["id"]]" + R.fields["blood_type"] = "Неизвестно" + R.fields["b_dna"] = "Неизвестно" + R.fields["mi_dis"] = "Отсутствуют" + R.fields["mi_dis_d"] = "Незначительные отклонения не указаны." + R.fields["ma_dis"] = "Отсутствуют" + R.fields["ma_dis_d"] = "Инвалидности не указаны." + R.fields["alg"] = "Отсутствуют" + R.fields["alg_d"] = "Аллергии не указаны." + R.fields["cdi"] = "Отсутствуют" + R.fields["cdi_d"] = "Текущие заболевания не указаны." + R.fields["notes"] = "Дополнительная информация не указана." GLOB.data_core.medical += R active2 = R screen = MED_DATA_RECORD - set_temp("Medical record created.", "success") + set_temp("Медицинская запись создана.", "success") if("del_comment") var/index = text2num(params["del_comment"] || "") if(!index || !istype(active2, /datum/data/record)) @@ -331,7 +339,7 @@ else ui_modal_input(src, id, question, arguments = arguments, value = arguments["value"]) if("add_comment") - ui_modal_input(src, id, "Please enter your message:") + ui_modal_input(src, id, "Введите комментарий.") else return FALSE if(UI_MODAL_ANSWER) @@ -353,7 +361,7 @@ var/new_age = text2num(answer) var/age_limits = get_age_limits(species, list(SPECIES_AGE_MIN, SPECIES_AGE_MAX)) if(new_age < age_limits[SPECIES_AGE_MIN] || new_age > age_limits[SPECIES_AGE_MAX]) - set_temp("Invalid age. It must be between [age_limits[SPECIES_AGE_MIN]] and [age_limits[SPECIES_AGE_MAX]].", "danger") + set_temp("Недопустимый возраст. Принимаются значения от [age_limits[SPECIES_AGE_MIN]] до [age_limits[SPECIES_AGE_MAX]] лет.", "danger") return answer = new_age @@ -367,7 +375,7 @@ if(!length(answer) || !istype(active2) || !length(state.name)) return active2.fields["comments"] += list(list( - header = "Made by [state.name] ([state.rank]) on [GLOB.current_date_string] [station_time_timestamp()]", + header = "Создатель записи - [state.name] ([state.rank]). Запись создана [GLOB.current_date_string] [station_time_timestamp()].", text = answer )) else @@ -380,38 +388,38 @@ */ /obj/machinery/computer/med_data/proc/print_finish() var/obj/item/paper/P = new /obj/item/paper(loc) - P.info = "
Medical Record

" + P.info = "
Медицинская запись

" if(istype(active1, /datum/data/record) && GLOB.data_core.general.Find(active1)) - P.info += {"Name: [active1.fields["name"]] ID: [active1.fields["id"]] -
\nSex: [active1.fields["sex"]] -
\nAge: [active1.fields["age"]] -
\nFingerprint: [active1.fields["fingerprint"]] -
\nPhysical Status: [active1.fields["p_stat"]] -
\nMental Status: [active1.fields["m_stat"]]
"} + P.info += {"Имя: [active1.fields["name"]] ID: [active1.fields["id"]] +
\nПол: [active1.fields["sex"]] +
\nВозраст: [active1.fields["age"]] +
\nОтпечатки пальцев: [active1.fields["fingerprint"]] +
\nФизическое состояние: [active1.fields["p_stat"]] +
\nПсихологическое состояние: [active1.fields["m_stat"]]
"} else - P.info += "General Record Lost!
" + P.info += "Основная информация утрачена!
" if(istype(active2, /datum/data/record) && GLOB.data_core.medical.Find(active2)) - P.info += {"
\n
Medical Data
-
\nBlood Type: [active2.fields["blood_type"]] -
\nDNA: [active2.fields["b_dna"]]
\n -
\nMinor Disabilities: [active2.fields["mi_dis"]] -
\nDetails: [active2.fields["mi_dis_d"]]
\n -
\nMajor Disabilities: [active2.fields["ma_dis"]] -
\nDetails: [active2.fields["ma_dis_d"]]
\n -
\nAllergies: [active2.fields["alg"]] -
\nDetails: [active2.fields["alg_d"]]
\n -
\nCurrent Diseases: [active2.fields["cdi"]] (per disease info placed in log/comment section) -
\nDetails: [active2.fields["cdi_d"]]
\n -
\nImportant Notes: + P.info += {"
\n
Медицинские данные
+
\nГруппа крови: [active2.fields["blood_type"]] +
\nДНК: [active2.fields["b_dna"]]
\n +
\nНезначительные отклонения: [active2.fields["mi_dis"]] +
\nДетали: [active2.fields["mi_dis_d"]]
\n +
\nИнвалидности: [active2.fields["ma_dis"]] +
\nДетали: [active2.fields["ma_dis_d"]]
\n +
\nАллергии: [active2.fields["alg"]] +
\nДетали: [active2.fields["alg_d"]]
\n +
\nТекущие заболевания: [active2.fields["cdi"]] +
\nДетали: [active2.fields["cdi_d"]]
\n +
\nДополнительная информация:
\n\t[active2.fields["notes"]]
\n
\n -
Comments/Log
"} +
Комментарии
"} for(var/c in active2.fields["comments"]) - P.info += "
[c["header"]]
Comment: [c["text"]]
" + P.info += "
[c["header"]]
Комментарий: [c["text"]]
" else - P.info += "Medical Record Lost!
" + P.info += "Медицинская информация утрачена!
" P.info += "" - P.name = "paper - 'Medical Record: [active1.fields["name"]]'" + P.name = "Медицинская запись: [active1.fields["name"]]" printing = FALSE SStgui.update_uis(src) @@ -437,15 +445,15 @@ if(1) R.fields["name"] = pick("[pick(GLOB.first_names_male)] [pick(GLOB.last_names)]", "[pick(GLOB.first_names_female)] [pick(GLOB.last_names_female)]") if(2) - R.fields["sex"] = pick("Male", "Female") + R.fields["sex"] = pick("Мужской", "Женский", "Небинарный", "Множественный") if(3) - R.fields["age"] = rand(5, 85) + R.fields["age"] = rand(1, 999) if(4) R.fields["blood_type"] = pick("A-", "B-", "AB-", "O-", "A+", "B+", "AB+", "O+") if(5) - R.fields["p_stat"] = pick("*SSD*", "Active", "Physically Unfit", "Disabled") + R.fields["p_stat"] = pick("Смерть", "КРС", "Стабильное", "Нетрудоспособность", "Ограниченные возможности") if(6) - R.fields["m_stat"] = pick("*Insane*", "*Unstable*", "*Watch*", "Stable") + R.fields["m_stat"] = pick("Невменяемость", "Нестабильное", "Рекомендуется наблюдение", "Стабильное") continue else if(prob(1)) @@ -461,7 +469,15 @@ /obj/machinery/computer/med_data/laptop name = "medical laptop" - desc = "Дешёвый ноутбук корпорации Nanotrasen." + desc = "Дешёвый ноутбук, произведённый Nanotrasen." + ru_names = list( + NOMINATIVE = "медицинский ноутбук", + GENITIVE = "медицинского ноутбука", + DATIVE = "медицинскому ноутбуку", + ACCUSATIVE = "медицинский ноутбук", + INSTRUMENTAL = "медицинским ноутбуком", + PREPOSITIONAL = "медицинском ноутбуке" + ) icon_state = "laptop" icon_keyboard = "laptop_key" icon_screen = "medlaptop" diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index 70b46f014ed..bcac9682351 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -4,8 +4,16 @@ #define OCCUPANT_PIXEL_BOUNCE_LOW 22 /obj/machinery/atmospherics/unary/cryo_cell - name = "криокапсула" - desc = "Понижает температуру тела, позволяя применять определённые лекарства." + name = "cryo cell" + desc = "Медицинское устройство, представляющее из себя высокую капсулу, напичканную датчиками и сканерами. Судя по всему, она понижает температуру тела субъекта внутри." + ru_names = list( + NOMINATIVE = "криогенная капсула", + GENITIVE = "криогенной капсулы", + DATIVE = "криогенной капсуле", + ACCUSATIVE = "криогенную капсулу", + INSTRUMENTAL = "криогенной капсулой", + PREPOSITIONAL = "криогенной капсуле" + ) icon = 'icons/obj/machines/cryogenics.dmi' icon_state = "pod0" density = TRUE @@ -48,12 +56,11 @@ . = ..() if(occupant) if(occupant.is_dead()) - . += span_warning("You see [occupant.name] inside. [occupant.p_they(TRUE)] [occupant.p_are()] dead!") + . += span_warning("Вы видите гуманоида внутри. Это [occupant.name]. [genderize_ru(occupant.gender, "Он мёртв", "Она мертва", "Оно мертво", "Они мертвы")]!") else - . += span_notice("You see [occupant.name] inside.") - . += span_notice("The Cryogenic cell chamber is effective at treating those with genetic damage, but all other damage types at a moderate rate.") - . += span_notice("Mostly using cryogenic chemicals, such as cryoxadone for it's medical purposes, requires that the inside of the cell be kept cool at all times. Hooking up a freezer and cooling the pipeline will do this nicely.") - . += span_info("Click-drag someone to a cell to place them in it, Alt-Click it to remove it.") + . += span_notice("Вы видите гуманоида внутри. Это [occupant.name].") + if(Adjacent(user)) + . += span_info("Наведите курсор на пациента, зажмите ЛКМ и перетяните на [declent_ru(ACCUSATIVE)], чтобы поместить пациента внутрь.
Используйте Alt + ЛКМ, чтобы извлечь ёмкость.") /obj/machinery/atmospherics/unary/cryo_cell/New() @@ -145,24 +152,23 @@ if(!istype(user.loc, /turf) || !istype(O.loc, /turf)) // are you in a container/closet/pod/etc? return if(occupant) - to_chat(user, span_boldnotice("Криокапсула уже занята!")) + balloon_alert(user, "внтури кто-то есть!") return TRUE var/mob/living/L = O if(!istype(L) || L.buckled) return if(L.abiotic()) - to_chat(user, span_danger("Субъект не должен держать в руках абиотические предметы.")) + balloon_alert(user, "руки субъекта заняты!") return TRUE if(L.has_buckled_mobs()) //mob attached to us - to_chat(user, span_warning("[L] нельзя поместить в [src], поскольку к [genderize_ru(L.gender,"его","её","его","их")] голове прилеплен слайм.")) + to_chat(user, span_warning("[L] не помест[pluralize_ru(L.gender, "ит", "ят")]ся в [declent_ru(ACCUSATIVE)], пока на [genderize_ru(L.gender, "нём", "ней", "нём", "них")] сидит слайм!")) return TRUE . = TRUE if(put_mob(L)) - add_fingerprint(user) if(L == user) - visible_message("[user] залеза[pluralize_ru(user.gender,"ет","ют")] в криокапсулу.") + visible_message("[user] начинает[pluralize_ru(user.gender,"ет","ют")] залезать в [declent_ru(ACCUSATIVE)].") else - visible_message("[user] помеща[pluralize_ru(user.gender,"ет","ют")] [L.name] в криокапсулу.") + visible_message("[user] начина[pluralize_ru(user.gender,"ет","ют")] укладывать [L] в [declent_ru(ACCUSATIVE)].") add_attack_logs(user, L, "put into a cryo cell at [COORD(src)].", ATKLOG_ALL) if(user.pulling == L) user.stop_pulling() @@ -221,7 +227,7 @@ return if(panel_open) - to_chat(usr, span_boldnotice("Сначала закройте панель техобслуживания.")) + balloon_alert(usr, "техпанель открыта!") return add_fingerprint(user) @@ -230,7 +236,7 @@ /obj/machinery/atmospherics/unary/cryo_cell/ui_interact(mob/user, datum/tgui/ui = null) ui = SStgui.try_update_ui(user, src, ui) if(!ui) - ui = new(user, src, "Cryo", "Криокапсула") + ui = new(user, src, "Cryo", "Криогенная капсула") ui.open() /obj/machinery/atmospherics/unary/cryo_cell/ui_data(mob/user) @@ -321,16 +327,14 @@ add_fingerprint(user) var/obj/item/reagent_containers/glass/glass = I if(beaker) - to_chat(user, span_warning("В криокапсулу уже загружена другая ёмкость.")) + balloon_alert(user, "слот для ёмкости занят!") return ATTACK_CHAIN_PROCEED if(!user.drop_transfer_item_to_loc(glass, src)) return ..() beaker = glass add_attack_logs(user, null, "Added [glass] containing [glass.reagents.log_list()] to a cryo cell at [COORD(src)]") - user.visible_message( - span_notice("[user] загружа[pluralize_ru(user.gender,"ет","ют")] [glass] в криокапсулу!"), - span_notice("Вы загружаете [glass] в криокапсулу!"), - ) + visible_message(span_notice("[user] вставля[pluralize_ru(user.gender,"ет","ют")] [glass] в [declent_ru(ACCUSATIVE)].")) + balloon_alert(user, "ёмкость установлена") SStgui.update_uis(src) return ATTACK_CHAIN_BLOCKED_ALL @@ -342,16 +346,16 @@ if(grabber.grab_state < GRAB_AGGRESSIVE || !ismob(grabbed_thing)) return . if(panel_open) - to_chat(grabber, span_warning("Сначала закройте панель техобслуживания.")) + balloon_alert(grabber, "техпанель открыта!") return . if(occupant) - to_chat(grabber, span_warning("Криокапсула уже занята!")) + balloon_alert(grabber, "внутри кто-то есть!") return . if(grabbed_thing.has_buckled_mobs()) //mob attached to us - to_chat(grabber, span_warning("[grabbed_thing] не влеза[pluralize_ru(grabbed_thing.gender,"ет","ют")] в [src] потому что к [genderize_ru(grabbed_thing.gender,"его","её","его","их")] голове прилеплен слайм.")) + to_chat(grabber, span_warning("[grabbed_thing] не помест[pluralize_ru(grabbed_thing.gender, "ит", "ят")]ся в [declent_ru(ACCUSATIVE)], пока на [genderize_ru(grabbed_thing.gender, "нём", "ней", "нём", "них")] сидит слайм!")) return . if(put_mob(grabbed_thing)) - add_fingerprint(grabber) + return /obj/machinery/atmospherics/unary/cryo_cell/crowbar_act(mob/user, obj/item/I) @@ -360,7 +364,7 @@ /obj/machinery/atmospherics/unary/cryo_cell/screwdriver_act(mob/user, obj/item/I) if(occupant || on) - to_chat(user, span_notice("Панель техобслуживания закрыта.")) + balloon_alert(user, "машина работает!") return TRUE if(default_deconstruction_screwdriver(user, "pod0-o", "pod0", I)) return TRUE @@ -472,31 +476,44 @@ /obj/machinery/atmospherics/unary/cryo_cell/proc/put_mob(mob/living/carbon/M) if(!istype(M)) - to_chat(usr, span_danger("Подобную форму жизни не удастся поместить в криокапсулу!")) + balloon_alert(usr, "невозможно!") return if(occupant) - to_chat(usr, span_danger("Криокапсула уже занята!")) + balloon_alert(usr, "внутри кто-то есть!") return if(M.abiotic()) - to_chat(usr, span_warning("Субъект не должен держать в руках абиотические предметы.")) + balloon_alert(usr, "руки субъекта заняты!") return if(!node) - to_chat(usr, span_warning("Криокапсула не подключена к трубам!")) + balloon_alert(usr, "не подключено!") + return + + add_fingerprint(usr) + if(M == usr) + visible_message("[usr] начина[pluralize_ru(usr.gender,"ет","ют")] залезать в [declent_ru(ACCUSATIVE)].") + else + visible_message("[usr] начина[pluralize_ru(usr.gender,"ет","ют")] укладывать [M] в [declent_ru(ACCUSATIVE)].") + + if(!do_after(usr, 2 SECONDS, M)) return + M.forceMove(src) if(M.health > -100 && (M.health < 0 || M.IsSleeping())) to_chat(M, span_boldnotice("Вас окружает холодная жидкость. Кожа начинает замерзать.")) occupant = M - add_fingerprint(usr) update_icon(UPDATE_OVERLAYS) M.ExtinguishMob() return TRUE /obj/machinery/atmospherics/unary/cryo_cell/AltClick(mob/living/carbon/user) - if(!iscarbon(user) || user.incapacitated() || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) + if(!beaker) return - go_out() + beaker.forceMove(loc) + if(Adjacent(user) && !issilicon(user)) + user.put_in_hands(beaker, ignore_anim = FALSE) + balloon_alert(user, "ёмкость извлечена") + beaker = null add_fingerprint(user) @@ -508,7 +525,7 @@ if(usr == occupant)//If the user is inside the tube... if(usr.stat == DEAD) return - to_chat(usr, span_notice("Активирована высвобождающая последовательность. Время ожидания: одна минута.")) + to_chat(usr, span_notice("Активация протокола аварийного извлечения. Время ожидания: одна минута.")) sleep(60 SECONDS) if(!src || !usr || !occupant || (occupant != usr)) //Check if someone's released/replaced/bombed him already return @@ -540,7 +557,7 @@ set src in oview(1) if(usr.has_buckled_mobs()) //mob attached to us - to_chat(usr, span_warning("[usr] не влез[pluralize_ru(usr.gender,"ет","ут")] в [src], потому что к [genderize_ru(usr.gender,"его","её","его","их")] голове прилеплен слайм.")) + to_chat(usr, span_warning("Вы не поместитесь в [declent_ru(ACCUSATIVE)], пока на вас сидит слайм.")) return if(stat & (NOPOWER|BROKEN)) diff --git a/code/game/machinery/defib_mount.dm b/code/game/machinery/defib_mount.dm index c069a4da1f6..2b53c6d6e14 100644 --- a/code/game/machinery/defib_mount.dm +++ b/code/game/machinery/defib_mount.dm @@ -3,7 +3,15 @@ //Not being adjacent will cause the paddles to snap back /obj/machinery/defibrillator_mount name = "defibrillator mount" - desc = "Holds and recharges defibrillators. You can grab the paddles if one is mounted." + desc = "Станция для хранения и зарядки дефибрилляторов. Вы можете использовать использовать дефибриллятор прямо отсюда, если оный имеется." + ru_names = list( + NOMINATIVE = "крепление для дефибриллятора", + GENITIVE = "крепления для дефибриллятора", + DATIVE = "креплению для дефибриллятора", + ACCUSATIVE = "крепление для дефибриллятора", + INSTRUMENTAL = "креплением для дефибриллятора", + PREPOSITIONAL = "креплении для дефибриллятора" + ) icon = 'icons/obj/machines/defib_mount.dmi' icon_state = "defibrillator_mount" density = FALSE @@ -46,13 +54,11 @@ /obj/machinery/defibrillator_mount/examine(mob/user) . = ..() if(defib) - . += span_info("There is a defib unit hooked up. Alt-Click to remove it.") + . += span_info("Используйте Alt + ЛКМ, чтобы взять прикреплённый дефибриллятор.") if(GLOB.security_level >= SEC_LEVEL_RED) - . += span_notice("Due to a security situation, its locking clamps can be toggled by swiping any ID.") + . += span_notice("Автоматическа система блокировки активирована. Используйте любую ID-карту для разблокировки.") else - . += span_notice("Its locking clamps can be [clamps_locked ? "dis" : ""]engaged by swiping an ID with access.") - else - . += span_notice("There are a pair of bolts in the defib unit housing securing the [src] to the wall.") + . += span_notice("Вы можете активировать систему блокировки, использовав свою ID-карту.") /obj/machinery/defibrillator_mount/process() if(defib && defib.cell && defib.cell.charge < defib.cell.maxcharge && is_operational()) @@ -78,11 +84,11 @@ /obj/machinery/defibrillator_mount/attack_hand(mob/living/carbon/human/user = usr) if(!defib) - to_chat(user, span_warning("There's no defibrillator unit loaded!")) + balloon_alert(user, "дефибриллятор отсутствует!") return if(!defib.paddles_on_defib) - to_chat(user, span_warning("[user.is_in_hands(defib.paddles) ? "You are already" : "Someone else is"] holding [defib]'s paddles!")) + balloon_alert(user, "лопасти уже кем-то взяты!") return defib.dispence_paddles(user) @@ -96,14 +102,12 @@ if(istype(I, /obj/item/defibrillator)) add_fingerprint(user) if(defib) - to_chat(user, span_warning("There's already a defibrillator in [src]!")) + balloon_alert(user, "дефибриллятор уже установлен!") return ATTACK_CHAIN_PROCEED if(!user.drop_transfer_item_to_loc(I, src)) return ..() - user.visible_message( - span_notice("[user] hooks up [I] to [src]!"), - span_notice("You press [I] into the mount, and it clicks into place."), - ) + visible_message(span_notice("[user] прикрепил[genderize_ru(user.gender, "", "а", "о", "и")] [I.declent_ru(ACCUSATIVE)] к [declent_ru(DATIVE)]!")) + balloon_alert(user, "дефибриллятор установлен") playsound(src, 'sound/machines/click.ogg', 50, TRUE) defib = I update_icon(UPDATE_OVERLAYS) @@ -118,13 +122,13 @@ add_fingerprint(user) if(check_access(I) || GLOB.security_level >= SEC_LEVEL_RED) //anyone can toggle the clamps in red alert! if(!defib) - to_chat(user, span_warning("You can't engage the clamps on a defibrillator that isn't there.")) + balloon_alert(user, "дефибриллятор отсутствует!") return ATTACK_CHAIN_PROCEED clamps_locked = !clamps_locked - to_chat(user, span_notice("Clamps [clamps_locked ? "" : "dis"]engaged.")) + balloon_alert(user, "блокировка [clamps_locked ? "" : "де"]активирована") update_icon(UPDATE_OVERLAYS) return ATTACK_CHAIN_PROCEED_SUCCESS - to_chat(user, span_warning("Insufficient access.")) + balloon_alert(user, "отказано в доступе!") return ATTACK_CHAIN_PROCEED return ..() @@ -133,7 +137,7 @@ /obj/machinery/defibrillator_mount/wrench_act(mob/user, obj/item/I) . = TRUE if(defib) - to_chat(user, span_warning("The [defib] is blocking access to the bolts!")) + balloon_alert(user, "болты закрыты дефибриллятором!") return if(!I.use_tool(src, user, 0, volume = I.tool_volume)) return @@ -146,23 +150,23 @@ if(!istype(user) || !Adjacent(user)) return if(user.incapacitated() || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) - to_chat(user, span_warning("You can't do that right now!")) + balloon_alert(user, "невозможно!") return if(!defib) - to_chat(user, span_warning("It'd be hard to remove a defib unit from a mount that has none.")) + balloon_alert(user, "дефибриллятор отсутствует!") return var/obj/item/organ/external/hand_right = user.get_organ(BODY_ZONE_PRECISE_R_HAND) var/obj/item/organ/external/hand_left = user.get_organ(BODY_ZONE_PRECISE_L_HAND) if((!hand_right || !hand_right.is_usable()) && (!hand_left || !hand_left.is_usable())) - to_chat(user, span_warning("You can't use your hand to take out the defibrillator!")) + balloon_alert(user, "невозможно!") return if(clamps_locked) - to_chat(user, span_warning("You try to tug out [defib], but the mount's clamps are locked tight!")) + balloon_alert(user, "заблокировано!") return defib.forceMove_turf() user.put_in_hands(defib, ignore_anim = FALSE) - user.visible_message(span_notice("[user] unhooks [defib] from [src]."), \ - span_notice("You slide out [defib] from [src] and unhook the charging cables.")) + visible_message(span_notice("[user] вынима[pluralize_ru(user.gender, "ет", "ют")] [defib.declent_ru(ACCUSATIVE)] из [declent_ru(GENITIVE)].")) + balloon_alert(user, "дефибриллятор извлечён") playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) defib = null update_icon(UPDATE_OVERLAYS) @@ -171,7 +175,15 @@ //wallframe, for attaching the mounts easily /obj/item/mounted/frame/defib_mount name = "unhooked defibrillator mount" - desc = "A frame for a defibrillator mount." + desc = "Крепление для дефибриллятора, которое предварительно нужно будет закрепить." + ru_names = list( + NOMINATIVE = "разобранное крепление для дефибриллятора", + GENITIVE = "разобранного крепления для дефибриллятора", + DATIVE = "разобранному креплению для дефибриллятора", + ACCUSATIVE = "разобранное крепление для дефибриллятора", + INSTRUMENTAL = "разобранным креплением для дефибриллятора", + PREPOSITIONAL = "разобранном креплении для дефибриллятора" + ) icon = 'icons/obj/machines/defib_mount.dmi' icon_state = "defibrillator_mount" sheets_refunded = 0 diff --git a/code/game/objects/items/devices/autopsy.dm b/code/game/objects/items/devices/autopsy.dm index f9ce669e32c..359ee31fd0d 100644 --- a/code/game/objects/items/devices/autopsy.dm +++ b/code/game/objects/items/devices/autopsy.dm @@ -1,6 +1,14 @@ /obj/item/autopsy_scanner name = "autopsy scanner" - desc = "Extracts information on wounds." + desc = "Небольшое устройство, используемое для проведения аутопсии." + ru_names = list( + NOMINATIVE = "сканер аутопсии", + GENITIVE = "сканера аутопсии", + DATIVE = "сканеру аутопсии", + ACCUSATIVE = "сканер аутопсии", + INSTRUMENTAL = "сканером аутопсии", + PREPOSITIONAL = "сканере аутопсии" + ) icon = 'icons/obj/autopsy_scanner.dmi' icon_state = "autopsy_scanner" flags = CONDUCT @@ -67,17 +75,17 @@ /obj/item/autopsy_scanner/attackby(obj/item/I, mob/user, params) if(is_pen(I)) add_fingerprint(user) - var/dead_name = tgui_input_text(user, "Insert name of the deceased individual", "Enter Name") || "Unknown" - var/dead_rank = tgui_input_text(user, "Insert rank of deceased individual", "Enter Rank") || "Not Available" - var/dead_tod = tgui_input_text(user, "Insert time of death", "Time Of Death") || "Unknown" - var/dead_cause = tgui_input_text(user, "Insert cause of death", "Cause Of Death") || "Unknown" - var/dead_chems = tgui_input_text(user, "Insert any chemical traces", "Chemical Traces") || "Unknown" - var/dead_notes = tgui_input_text(user, "Insert any relevant notes", "Relevant Notes") || "None" + var/dead_name = tgui_input_text(user, "Укажите имя субъекта", "Имя") || "Неизвестный" + var/dead_rank = tgui_input_text(user, "Укажите должность субъекта", "Должность") || "Неизвестно" + var/dead_tod = tgui_input_text(user, "Укажите время смерти", "Время смерти") || "Неизвестно" + var/dead_cause = tgui_input_text(user, "Укажите причину смерти", "Причина смерти") || "Неизвестно" + var/dead_chems = tgui_input_text(user, "Укажите химические следы", "Химические следы") || "Неизвестно" + var/dead_notes = tgui_input_text(user, "Укажите важные детали", "Важные детали") || "Неизвестно" playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, TRUE) sleep(1 SECONDS) var/obj/item/paper/paper = new(user.loc) - paper.name = "Official Coroner's Report - [dead_name]" - paper.info = "Nanotrasen Science Station [SSmapping.map_datum.station_short] - Coroner's Report

Name of Deceased: [dead_name]

Rank of Deceased: [dead_rank]

Time of Death: [dead_tod]

Cause of Death: [dead_cause]

Trace Chemicals: [dead_chems]

Additional Coroner's Notes: [dead_notes]

Coroner's Signature: " + paper.name = "Отчёт патологоанатома - [dead_name]" + paper.info = "Исследовательская Станция Nanotrasen [SSmapping.map_datum.station_short] - Отчёт патологоанатома

Имя погибшего: [dead_name]

Должность погибшего: [dead_rank]

Время смерти: [dead_tod]

Причина смерти: [dead_cause]

Химические следы: [dead_chems]

Важные детали: [dead_notes]

Подпись патологоанатома: " user.put_in_hands(paper, ignore_anim = FALSE) return ATTACK_CHAIN_PROCEED_SUCCESS @@ -88,9 +96,9 @@ var/scan_data = "" if(timeofdeath) - scan_data += "Time of death: [station_time_timestamp("hh:mm:ss", timeofdeath)]

" + scan_data += "Время смерти: [station_time_timestamp("hh:mm:ss", timeofdeath)]

" else - scan_data += "Time of death: No data

" + scan_data += "Время смерти: Н/Д

" if(wdata.len) var/n = 1 @@ -113,41 +121,41 @@ // total score happens to be the total damage switch(total_score) if(1 to 5) - damage_desc = "negligible" + damage_desc = "небольшой тяжести" if(5 to 15) - damage_desc = "light" + damage_desc = "средней тяжести" if(15 to 30) - damage_desc = "moderate" + damage_desc = "тяжёлое" if(30 to 1000) - damage_desc = "severe" + damage_desc = "критическое" else - damage_desc = "Unknown" + damage_desc = "Н/Д" var/damaging_weapon = (total_score != 0) - scan_data += "Weapon #[n]
" + scan_data += "Оружие №[n]
" if(damaging_weapon) - scan_data += "Severity: [damage_desc]
" - scan_data += "Hits by weapon: [total_hits]
" - scan_data += "Approximate time of wound infliction: [station_time_timestamp("hh:mm", age)]
" - scan_data += "Affected limbs: [D.organ_names]
" - scan_data += "Weapon: [D.weapon]
" + scan_data += "Тяжесть: [damage_desc]
" + scan_data += "Нанесено ударов: [total_hits]
" + scan_data += "Приблизительное время нанесения ранения: [station_time_timestamp("hh:mm", age)]
" + scan_data += "Поражённые части тела: [D.organ_names]
" + scan_data += "Оружие: [D.weapon]
" scan_data += "
" n++ if(chemtraces.len) - scan_data += "Trace Chemicals:
" + scan_data += "Химические следы:
" for(var/chemID in chemtraces) scan_data += chemID scan_data += "
" - user.visible_message(span_notice("[src] rattles and prints out a sheet of paper.")) + user.visible_message(span_notice("[capitalize(declent_ru(NOMINATIVE))] дребезжит, после чего из окна печати выпадает лист бумаги.")) playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1) flick("autopsy_scanner_anim", src) sleep(3 SECONDS) var/obj/item/paper/P = new(drop_location()) - P.name = "Autopsy Data ([target_name])" + P.name = "Отчёт об аутопсии - [target_name]" P.info = "[scan_data]" P.update_icon() @@ -161,7 +169,7 @@ . = ATTACK_CHAIN_PROCEED_SUCCESS if(target_UID != target.UID()) - to_chat(user, span_notice("A new patient has been registered.[target_UID ? " Purging data for previous patient." : ""]")) + to_chat(user, span_notice("Обнаружен новый пациент.[target_UID ? " Очищение буфера данных." : ""]")) target_UID = target.UID() target_name = target.name wdata.Cut() @@ -172,8 +180,8 @@ var/obj/item/organ/external/limb = target.get_organ(user.zone_selected) if(!limb) - to_chat(user, span_warning("You can't scan this body part!")) + balloon_alert(user, "часть тела нельзя просканировать!") return NONE - target.visible_message(span_notice("[user] scans the wounds on [target]'s [limb] with [src].")) + target.visible_message(span_notice("[user] сканирует [limb.declent_ru(ACCUSATIVE)] [target] на предмет ранений, используя [declent_ru(ACCUSATIVE)].")) add_data(limb) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index d3620082bb2..91eb05f233f 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -258,11 +258,19 @@ REAGENT SCANNER /obj/item/healthanalyzer name = "health analyzer" + desc = "Ручной сканер тела, способный определить жизненные показатели субъекта." + ru_names = list( + NOMINATIVE = "анализатор здоровья", + GENITIVE = "анализатора здоровья", + DATIVE = "анализатору здоровья", + ACCUSATIVE = "анализатор здоровья", + INSTRUMENTAL = "анализатором здоровья", + PREPOSITIONAL = "анализаторе здоровья" + ) icon = 'icons/obj/device.dmi' icon_state = "health" item_state = "healthanalyzer" belt_icon = "health_analyzer" - desc = "Ручной сканер тела, способный определить жизненные показатели субъекта." flags = CONDUCT item_flags = NOBLUDGEON slot_flags = ITEM_SLOT_BELT @@ -301,7 +309,7 @@ REAGENT SCANNER /obj/item/healthanalyzer/attack_self(mob/user) if(!scan_data) - to_chat(user, "[src] не содержит сохраненных данных.") + to_chat(user, span_notice("[capitalize(declent_ru(NOMINATIVE))] не содержит сохранённых данных.")) return show_results(user) @@ -313,7 +321,7 @@ REAGENT SCANNER winset(user, "mapwindow.map", "focus=true") if(!in_range(user, src)) - to_chat(user, "Нужно подойти ближе, чтобы нажать на кнопку.") + to_chat(user, span_notice("Нужно подойти ближе, чтобы нажать на кнопку.")) return if(href_list["print"]) @@ -327,14 +335,14 @@ REAGENT SCANNER toggle_mode() return 1 if(href_list["clear"]) - to_chat(user, "Вы очистили буфер данных [src].") + to_chat(user, "Вы очистили буфер данных [declent_ru(ACCUSATIVE)].") scan_data = null scan_title = null user << browse(null, "window=scanner") return 1 /obj/item/healthanalyzer/proc/print_report_verb() - set name = "Печать отчета" + set name = "Печать отчёта" set category = "Object" set src = usr @@ -351,7 +359,7 @@ REAGENT SCANNER return isPrinting = TRUE if(reports_printed > reports_per_device || GLOB.copier_items_printed >= GLOB.copier_max_items) - visible_message("Nothing happens. Printing device is broken?") + visible_message(span_warning("Ничего не происходит. Устройство печати сломано?")) if(!GLOB.copier_items_printed_logged) message_admins("Photocopier cap of [GLOB.copier_max_items] papers reached, all photocopiers/printers are now disabled. This may be the cause of any lag.") GLOB.copier_items_printed_logged = TRUE @@ -370,7 +378,7 @@ REAGENT SCANNER P.info += "

Заметки:
" if(in_range(user, src)) user.put_in_hands(P, ignore_anim = FALSE) - user.visible_message("[src.declent_ru(NOMINATIVE)] [pluralize_ru(src.gender,"выдаёт","выдают")] лист с отчётом.") + user.visible_message(span_notice("[capitalize(declent_ru(NOMINATIVE))] дребезжит, после чего из окна печати выпадает лист бумаги.")) GLOB.copier_items_printed++ reports_printed++ isPrinting = FALSE @@ -381,7 +389,7 @@ REAGENT SCANNER popup.open(no_focus = 1) /obj/item/healthanalyzer/proc/get_header(mob/user) - return "ОчиститьЛокализация[advanced ? "Печать отчетаСписать страховку" : ""]" + return "ОчиститьЛокализация[advanced ? "Печать отчётаСписать страховку" : ""]" /obj/item/healthanalyzer/examine(mob/user) . = ..() @@ -389,25 +397,29 @@ REAGENT SCANNER if(in_range(user, src) || istype(user, /mob/dead/observer)) show_results(user) else - . += "Нужно подойти ближе, чтобы прочесть содержимое." + . += span_notice("Нужно подойти ближе, чтобы прочесть содержмое.") -/proc/medical_scan_action(mob/living/user, atom/target, var/obj/item/healthanalyzer/scanner, var/mode, var/advanced) +/obj/item/healthanalyzer/proc/medical_scan_action(mob/living/user, atom/target, var/obj/item/healthanalyzer/scanner, var/mode, var/advanced) if(!user.IsAdvancedToolUser()) - to_chat(user, "Вы не достаточно ловки, чтобы использовать это устройство.") + to_chat(user, span_warning("Вам не хватает ловкости, чтобы использовать [declent_ru(ACCUSATIVE)]!")) + balloon_alert(user, "невозможно!") return scanner.window_height = initial(scanner.window_height) if((HAS_TRAIT(user, TRAIT_CLUMSY) || user.getBrainLoss() >= 60) && prob(50)) . = list() - user.visible_message("[user] анализирует жизненные показатели пола!", "Вы по глупости анализировали жизненные показатели пола!") - . += "Общий статус: 100% Здоров" + user.visible_message( + span_warning("[user] анализиру[pluralize_ru(user.gender, "ет", "ют")] жизненные показатели пола!"), + span_notice("Вы по глупости проанализировали жизненные показатели пола!") + ) + . += "Состояние: 100% Здоров" . += "Тип повреждений: Удушение/Токсины/Ожоги/Физ." . += "Уровень повреждений: 0 - 0 - 0 - 0" - . += "Температура тела: ---°C (---°F)" + . += "Температура тела: --- °C (--- °F)" if(mode == 1) . += "Локализация повреждений, Физ./Ожоги:" - . += "Уровень крови: --- %, --- cl, тип: ---" - . += "Пульс: --- bpm." + . += "Уровень крови: --- %, --- u, тип: ---" + . += "Пульс: --- уд/мин" . += "Гены не обнаружены." scanner.window_height += length(.) * 20 scanner.scan_title = "Сканирование: Пол" @@ -427,19 +439,25 @@ REAGENT SCANNER for(var/mob/living/carbon/human/L in scan_content) scan_subject = L else if(scan_content.len > 1) - to_chat(user, "[scanner] обнаружил несколько субъектов внутри [target], слишком близко для нормального сканирования.") + balloon_alert(user, "внутри слишком много субъектов!") return else - to_chat(user, "[scanner] не обнаружил никого внутри [target].") + balloon_alert(user, "внутри пусто!") return if(!scan_subject) return if(user == target) - user.visible_message("[user.declent_ru(NOMINATIVE)] анализиру[pluralize_ru(user.gender,"ет","ют")] свои жизненные показатели.", "[pluralize_ru(user.gender,"Ты анализируешь","Вы анализируете")] свои жизненные показатели.") + user.visible_message( + span_notice("[user] сканиру[pluralize_ru(user.gender,"ет","ют")] себя с помощью [declent_ru(GENITIVE)]."), + span_notice("Вы сканируете себя с помощью [declent_ru(GENITIVE)].") + ) else - user.visible_message("[user.declent_ru(NOMINATIVE)] анализиру[pluralize_ru(user.gender,"ет","ют")] жизненные показатели [target.declent_ru(ACCUSATIVE)].", "[pluralize_ru(user.gender,"Ты анализируешь","Вы анализируете")] жизненные показатели [target.declent_ru(ACCUSATIVE)].") + user.visible_message( + span_notice("[user] сканиру[pluralize_ru(user.gender,"ет","ют")] [target] с помощью [declent_ru(GENITIVE)]."), + span_notice("Вы сканируете [target] с помощью [declent_ru(GENITIVE)].") + ) . = medical_scan_results(scan_subject, mode, advanced) scanner.window_height += length(.) * 20 @@ -451,13 +469,13 @@ REAGENT SCANNER . = list() if(!ishuman(M) || ismachineperson(M)) //these sensors are designed for organic life - . += "Общий статус: ОШИБКА
" + . += "Состояние: ОШИБКА
" . += "Тип повреждений: Удушение/Токсины/Ожоги/Физ." . += "Уровень повреждений: ? - ? - ? - ?" - . += "Температура тела: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)" + . += "Температура тела: [M.bodytemperature-T0C] °C ([M.bodytemperature*1.8-459.67] °F)" if(mode == 1) . += "Локализация повреждений, Физ./Ожоги:" - . += "Уровень крови: --- %, --- cl, тип: ---" + . += "Уровень крови: --- %, --- u, тип: ---" . += "Пульс: --- bpm." . += "Гены не обнаружены." return . @@ -471,18 +489,18 @@ REAGENT SCANNER var/DNR = !H.ghost_can_reenter() if(H.stat == DEAD) if(DNR) - . += "Общий статус: МЕРТВ \[DNR]" + . += "Состояние: Смерть\[НР]" else - . += "Общий статус: МЕРТВ" + . += "Состояние: Смерть" else //Если живой или отключка if(HAS_TRAIT(H, TRAIT_FAKEDEATH)) OX = fake_oxy > 50 ? "[fake_oxy]" : fake_oxy - . += "Общий статус: МЕРТВ" + . += "Состояние: Смерть" else - . += "Общий статус: [H.stat > 1 ? "МЕРТВ" : H.health > 0 ? "[H.health]%" : "[H.health]%"]" + . += "Состояние: [H.stat > 1 ? "Смерть" : H.health > 0 ? "[H.health]%" : "[H.health]%"]" . += "Тип повреждений: Удушение/Токсины/Ожоги/Физ." . += "Уровень повреждений: [OX] - [TX] - [BU] - [BR]" - . += "Температура тела: [H.bodytemperature-T0C]°C ([H.bodytemperature*1.8-459.67]°F)" + . += "Температура тела: [H.bodytemperature-T0C] °C ([H.bodytemperature*1.8-459.67] °F)" if(H.timeofdeath && (H.stat == DEAD || HAS_TRAIT(H, TRAIT_FAKEDEATH))) . += "Время смерти: [station_time_timestamp("hh:mm:ss", H.timeofdeath)]" var/tdelta = round(world.time - H.timeofdeath) @@ -538,27 +556,24 @@ REAGENT SCANNER . += " Стадия: 1/1" . += " Лечение: Электрический шок" else if(heart && heart.is_dead()) - . += "Обнаружен некроз сердца!" + . += "Обнаружен некроз сердца." else if(!heart) - . += "Сердце не обнаружено!" + . += "Сердце не обнаружено." if(H.getStaminaLoss()) . += "Обнаружено переутомление." if(H.getCloneLoss()) - . += "Обнаружено [H.getCloneLoss() > 30 ? "серьезное" : "незначительное"] клеточное повреждение." + . += "Обнаружено [H.getCloneLoss() > 30 ? "серьёзное" : "незначительное"] клеточное повреждение." if(H.has_brain_worms()) - . += "Обнаружено отклонение в мозговой активности." - . += " Рекомендуется подробное сканирование." + . += "Обнаружены отклонения в работе мозга." if(H.get_int_organ(/obj/item/organ/internal/brain)) if(H.getBrainLoss() >= 100) - . += "Мозг мертв." + . += "Мозг мёртв." else if(H.getBrainLoss() >= 60) - . += "Обнаружено серьезное повреждение мозга." - . += " У субъекта может быть слабоумие." + . += "Обнаружено серьёзное повреждение мозга." else if(H.getBrainLoss() >= 10) - . += "Обнаружено значительное повреждение мозга." - . += " У субъекта могло быть сотрясение мозга." + . += "Обнаружено значительное повреждение мозга." else . += "Мозг не обнаружен." @@ -570,29 +585,25 @@ REAGENT SCANNER if(e.has_fracture()) var/list/check_list = list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG, BODY_ZONE_PRECISE_L_FOOT, BODY_ZONE_PRECISE_R_FOOT) if((e.limb_zone in check_list) && !e.is_splinted()) - . += "Незакрепленные переломы в [limb]." - . += " Рекомендуется применить шину." + . += "Обнаружен перелом в [limb]." if(e.has_infected_wound()) - . += "Заражение в [limb]." - . += " Рекомендуется дезинфекция." + . += "Заражение в [limb]." for(var/name in H.bodyparts_by_name) var/obj/item/organ/external/e = H.bodyparts_by_name[name] if(!e) continue if(e.has_fracture()) - . += "Обнаружены переломы." - . += " Рекомендуется подробное сканирование." + . += "Обнаружены переломы. Локализация повреждений невозможна." break for(var/obj/item/organ/external/e as anything in H.bodyparts) if(e.has_internal_bleeding()) - . += "Внутреннее кровотечение." - . += " Рекомендуется подробное сканирование." + . += "Обнаружено внутреннее кровотечение. Локализация невозможна." break var/blood_id = H.get_blood_id() if(blood_id) if(H.bleed_rate) - . += "Обнаружено кровотечение!" + . += "Обнаружено кровотечение." var/blood_percent = round((H.blood_volume / BLOOD_VOLUME_NORMAL)*100) var/blood_type = H.dna.blood_type var/blood_species = H.dna.species.blood_species @@ -603,13 +614,13 @@ REAGENT SCANNER else blood_type = blood_id if(H.blood_volume <= BLOOD_VOLUME_SAFE && H.blood_volume > BLOOD_VOLUME_OKAY) - . += "Уровень крови: НИЗКИЙ [blood_percent] %, [H.blood_volume] cl, тип: [blood_type], кровь расы: [blood_species]" + . += "Уровень крови: НИЗКИЙ - [blood_percent] %, [H.blood_volume] u, тип: [blood_type], кровь расы: [blood_species]." else if(H.blood_volume <= BLOOD_VOLUME_OKAY) - . += "Уровень крови: КРИТИЧЕСКИЙ [blood_percent] %, [H.blood_volume] cl, тип: [blood_type], кровь расы: [blood_species]" + . += "Уровень крови: КРИТИЧЕСКИЙ - [blood_percent] %, [H.blood_volume] u, тип: [blood_type], кровь расы: [blood_species]." else - . += "Уровень крови: [blood_percent] %, [H.blood_volume] cl, тип: [blood_type], кровь расы: [blood_species]" + . += "Уровень крови: [blood_percent] %, [H.blood_volume] u, тип: [blood_type], кровь расы: [blood_species]." - . += "Пульс: [H.get_pulse(GETPULSE_TOOL)] bpm." + . += "Пульс: [H.get_pulse(GETPULSE_TOOL)] уд/мин." var/list/implant_detect = list() for(var/obj/item/organ/internal/cyberimp/cybernetics in H.internal_organs) if(cybernetics.is_robotic()) @@ -618,22 +629,22 @@ REAGENT SCANNER . += "Обнаружены кибернетические модификации:" . += implant_detect if(H.gene_stability < 40) - . += "Гены быстро распадаются!" + . += "Критическая генная нестабильность." else if(H.gene_stability < 70) - . += "Возможно спонтанное генное разложение." + . += "Тяжёлая генная нестабильность." else if(H.gene_stability < 85) - . += "Признаки незначительной генной нестабильности." + . += "Незначительная генная нестабильность." else . += "Гены стабильны." var/datum/money_account/acc = get_insurance_account(H) if(acc) - . += "Тип страховки - [acc.insurance_type]" + . += "Тип страховки - [acc.insurance_type]." else - . += "Аккаунт не обнаружен" - . += "Требуемое количество очков страховки: [get_req_insurance(H)]" + . += "Аккаунт не обнаружен." + . += "Требуемое количество очков страховки: [get_req_insurance(H)]." if(acc) - . += "Текущее количество очков страховки: [acc.insurance]" + . += "Текущее количество очков страховки: [acc.insurance]." // This is the output to the chat /proc/healthscan(mob/user, mob/living/M, mode = 1, advanced = FALSE) @@ -650,9 +661,9 @@ REAGENT SCANNER mode = !mode switch(mode) if(1) - to_chat(usr, "Сканер теперь показывает повреждения конечностей.") + to_chat(usr, "Локализация повреждений включена.") if(0) - to_chat(usr, "Сканер больше не показывает повреждения конечностей.") + to_chat(usr, "Локализация повреждений выключена.") /obj/item/healthanalyzer/update_overlays() @@ -665,11 +676,11 @@ REAGENT SCANNER if(istype(I, /obj/item/healthupgrade)) add_fingerprint(user) if(advanced) - to_chat(user, span_warning("Продвинутый модуль сканирования уже установлен.")) + balloon_alert(user, "уже установлено!") return ATTACK_CHAIN_PROCEED if(!user.drop_transfer_item_to_loc(I, src)) return ..() - to_chat(user, span_notice("Вы установили продвинутый модуль сканирования.")) + balloon_alert(user, "модуль установлен") playsound(loc, I.usesound, 50, TRUE) advanced = TRUE update_icon(UPDATE_OVERLAYS) @@ -679,13 +690,13 @@ REAGENT SCANNER if(istype(I, /obj/item/card/id)) add_fingerprint(user) if(!advanced) - to_chat(user, span_warning("Для привязки счета требуется наличие продвинутого модуля сканирования.")) + to_chat(user, span_warning("Для привязки счёта требуется наличие продвинутого модуля сканирования.")) return ATTACK_CHAIN_PROCEED var/obj/item/card/id/id = I if(!id.associated_account_number) - to_chat(user, span_warning("Не обнаружено привязанного аккаунта.")) + to_chat(user, span_warning("Привязанный аккаунт не обнаружен.")) return ATTACK_CHAIN_PROCEED connected_acc = id.associated_account_number @@ -705,10 +716,18 @@ REAGENT SCANNER /obj/item/healthupgrade - name = "Health Analyzer Upgrade" + name = "health analyzer upgrade" + desc = "Модуль, устанавливаемый на анализатор здоровья для расширения его функционала." + ru_names = list( + NOMINATIVE = "модуль улучшения анализатора здоровья", + GENITIVE = "модуля улучшения анализатора здоровья", + DATIVE = "модулю улучшения анализатора здоровья", + ACCUSATIVE = "модуль улучшения анализатора здоровья", + INSTRUMENTAL = "модулем улучшения анализатора здоровья", + PREPOSITIONAL = "модуле улучшения анализатора здоровья" + ) icon = 'icons/obj/device.dmi' icon_state = "healthupgrade" - desc = "Модуль обновления, устанавливаемый на Health Analyzer для расширения функционала." w_class = WEIGHT_CLASS_TINY origin_tech = "magnets=2;biotech=2" usesound = 'sound/items/deconstruct.ogg' @@ -1042,7 +1061,7 @@ REAGENT SCANNER dat += "[extra_font]\tApprox. Brain Damage %: [target.getBrainLoss()]
" dat += "Paralysis Summary %: [target.AmountParalyzed()] ([round(target.AmountParalyzed() / 10)] seconds left!)
" - dat += "Body Temperature: [target.bodytemperature-T0C]°C ([target.bodytemperature*1.8-459.67]°F)
" + dat += "Body Temperature: [target.bodytemperature-T0C] °C ([target.bodytemperature*1.8-459.67] °F)
" dat += "
" diff --git a/code/game/objects/items/devices/sensor_device.dm b/code/game/objects/items/devices/sensor_device.dm index d63d959dd66..43a884419f9 100644 --- a/code/game/objects/items/devices/sensor_device.dm +++ b/code/game/objects/items/devices/sensor_device.dm @@ -1,6 +1,14 @@ /obj/item/sensor_device name = "handheld crew monitor" - desc = "A miniature machine that tracks suit sensors across the station." + desc = "Миниатюрное устройство, с помощью которого можно отслеживать датчики членов экипажа станции." + ru_names = list( + NOMINATIVE = "ручной монитор экипажа", + GENITIVE = "ручного монитора экипажа", + DATIVE = "ручному монитору экипажа", + ACCUSATIVE = "ручной монитор экипажа", + INSTRUMENTAL = "ручным монитором экипажа", + PREPOSITIONAL = "ручном мониторе экипажа" + ) icon = 'icons/obj/device.dmi' icon_state = "scanner" item_state = "scanner" @@ -44,6 +52,15 @@ /obj/item/sensor_device/advanced/command name = "command crew monitor" + desc = "Миниатюрное устройство, с помощью которого можно отслеживать датчики членов экипажа станции. Эта модель настроена на членов командования." + ru_names = list( + NOMINATIVE = "командный монитор экипажа", + GENITIVE = "командного монитора экипажа", + DATIVE = "командному монитору экипажа", + ACCUSATIVE = "командный монитор экипажа", + INSTRUMENTAL = "командным монитором экипажа", + PREPOSITIONAL = "командном мониторе экипажа" + ) item_state = "blueshield_monitor" icon_state = "c_scanner" @@ -53,6 +70,15 @@ /obj/item/sensor_device/advanced/security name = "security crew monitor" + desc = "Миниатюрное устройство, с помощью которого можно отслеживать датчики членов экипажа станции. Эта модель настроена на членов службы безопасности." + ru_names = list( + NOMINATIVE = "охранный монитор экипажа", + GENITIVE = "охранного монитора экипажа", + DATIVE = "охранному монитору экипажа", + ACCUSATIVE = "охранный монитор экипажа", + INSTRUMENTAL = "охранным монитором экипажа", + PREPOSITIONAL = "охранном мониторе экипажа" + ) item_state = "brig_monitor" icon_state = "s_scanner" diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index ff5f18cd8b1..fd61732cb86 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -2,7 +2,15 @@ /obj/item/defibrillator name = "defibrillator" - desc = "A device that delivers powerful shocks to detachable paddles that resuscitate incapacitated patients." + desc = "Прибор, генерирующий высоковольтный импульс, позволяющий запустить остановившееся сердце." + ru_names = list( + NOMINATIVE = "дефибриллятор", + GENITIVE = "дефибриллятора", + DATIVE = "дефибриллятору", + ACCUSATIVE = "дефибриллятор", + INSTRUMENTAL = "дефибриллятором", + PREPOSITIONAL = "дефибрилляторе" + ) icon_state = "defibunit" item_state = "defibunit" slot_flags = ITEM_SLOT_BACK @@ -70,7 +78,7 @@ /obj/item/defibrillator/examine(mob/user) . = ..() - . += span_info("Ctrl-Click to remove the paddles from the defibrillator.") + . += span_info("Используйте Ctrl + ЛКМ, чтобы взять лопасти.") /obj/item/defibrillator/proc/update_power() @@ -124,16 +132,16 @@ add_fingerprint(user) var/obj/item/stock_parts/cell/new_cell = I if(cell) - to_chat(user, span_warning("The [name] already has a cell.")) + balloon_alert(user, "слот для батареи занят!") return ATTACK_CHAIN_PROCEED if(new_cell.maxcharge < paddles.revivecost) - to_chat(user, span_warning("The [name] requires a higher capacity cell.")) + balloon_alert(user, "требуется батарея большей мощности!") return ATTACK_CHAIN_PROCEED if(!user.drop_transfer_item_to_loc(new_cell, src)) return ..() cell = new_cell update_icon(UPDATE_OVERLAYS) - to_chat(user, span_notice("You install a cell in [src].")) + balloon_alert(user, "батарея установлена") return ATTACK_CHAIN_BLOCKED_ALL if(I == paddles) @@ -145,19 +153,19 @@ /obj/item/defibrillator/screwdriver_act(mob/living/user, obj/item/I) if(!cell) - to_chat(user, span_notice("[src] doesn't have a cell.")) + balloon_alert(user, "слот для батареи пуст!") return // we want an infinite power cell to stay inside (used in advanced compact defib) if(istype(cell, /obj/item/stock_parts/cell/infinite)) - to_chat(user, span_notice("[src] somehow resists your attempt to remove a cell.")) + balloon_alert(user, "невозможно извлечь батарею!") return cell.update_icon() cell.forceMove_turf() cell = null I.play_tool_sound(src) - to_chat(user, span_notice("You remove the cell from [src].")) + balloon_alert(user, "батарея извлечена") update_icon(UPDATE_OVERLAYS) return TRUE @@ -175,7 +183,7 @@ update_icon(UPDATE_OVERLAYS) /obj/item/defibrillator/verb/toggle_paddles_verb() - set name = "Toggle Paddles" + set name = "Взять лопасти" set category = "Object" set src in oview(1) @@ -187,7 +195,7 @@ /obj/item/defibrillator/proc/toggle_paddles(mob/living/carbon/human/user = usr) if(!paddles) - to_chat(user, span_warning("[src] has no paddles!")) + balloon_alert(user, "лопасти отсутствуют!") return if(paddles_on_defib) @@ -208,7 +216,7 @@ var/obj/item/organ/external/hand_right = user.get_organ(BODY_ZONE_PRECISE_R_HAND) if((!hand_left || !hand_left.is_usable()) && (!hand_right || !hand_right.is_usable())) - to_chat(user, span_warning("You can't use your hands to take out the paddles!")) + balloon_alert(user, "невозможно взять в руки!") return paddles_on_defib = FALSE @@ -216,7 +224,7 @@ if(!user.put_in_hands(paddles, ignore_anim = FALSE)) paddles.loc = src paddles_on_defib = TRUE - to_chat(user, span_warning("You need a free hand to hold the paddles!")) + balloon_alert(user, "руки заняты!") return paddles.update_icon(UPDATE_ICON_STATE) @@ -259,7 +267,15 @@ /obj/item/defibrillator/compact name = "compact defibrillator" - desc = "A belt-equipped defibrillator that can be rapidly deployed." + desc = "Переносной дефибриллятор, оборудован для ношения на поясе." + ru_names = list( + NOMINATIVE = "компактный дефибриллятор", + GENITIVE = "компактного дефибриллятора", + DATIVE = "компактному дефибриллятору", + ACCUSATIVE = "компактный дефибриллятор", + INSTRUMENTAL = "компактным дефибриллятором", + PREPOSITIONAL = "компактном дефибрилляторе" + ) icon_state = "defibcompact" item_state = "defibcompact" w_class = WEIGHT_CLASS_NORMAL @@ -278,7 +294,15 @@ /obj/item/defibrillator/compact/combat name = "combat defibrillator" - desc = "A belt-equipped blood-red defibrillator that can be rapidly deployed. Does not have the restrictions or safeties of conventional defibrillators and can revive through space suits." + desc = "Переносной дефибриллятор кроваво-красного цвета, оборудован для ношения на поясе. Не оснащён протоколами безопасности, в отличие от обычных дефибрилляторов. Может работать через скафандры." + ru_names = list( + NOMINATIVE = "боевой дефибриллятор", + GENITIVE = "боевого дефибриллятора", + DATIVE = "боевому дефибриллятору", + ACCUSATIVE = "боевой дефибриллятор", + INSTRUMENTAL = "боевым дефибриллятором", + PREPOSITIONAL = "боевом дефибрилляторе" + ) icon_state = "defibcombat" item_state = "defibcombat" paddle_type = /obj/item/twohanded/shockpaddles/syndicate @@ -293,7 +317,15 @@ /obj/item/defibrillator/compact/advanced name = "advanced compact defibrillator" - desc = "A belt-mounted state-of-the-art defibrillator that can be rapidly deployed in all environments. Uses an experimental self-charging cell, meaning that it will (probably) never stop working. Can be used to defibrillate through space suits. It is impossible to damage." + desc = "Высокотехнологичный продвинутый дефибриллятор, созданный для использования в самых экстремальных условиях. Выполнен из передовых материалов, благодаря чему его почти невозможно повредить или уничтожить. Использует экспериментальную батарею с функций самозаряда. Может работать через скафандры." + ru_names = list( + NOMINATIVE = "продвинутый компактный дефибриллятор", + GENITIVE = "продвинутого компактного дефибриллятора", + DATIVE = "продвинутому компактному дефибриллятору", + ACCUSATIVE = "продвинутый компактный дефибриллятор", + INSTRUMENTAL = "продвинутым компактным дефибриллятором", + PREPOSITIONAL = "продвинутом компактном дефибрилляторе" + ) icon_state = "defibnt" item_state = "defibnt" paddle_type = /obj/item/twohanded/shockpaddles/advanced @@ -313,7 +345,7 @@ /obj/item/defibrillator/compact/advanced/emp_act(severity) if(world.time > next_emp_message) - atom_say("Warning: Electromagnetic pulse detected. Integrated shielding prevented all potential hardware damage.") + atom_say("Предупреждение: зафиксирован мощный электро-магнитный импульс. Защитная система предотвратила возможное повреждение оборудования.") playsound(src, 'sound/machines/defib_saftyon.ogg', 50) next_emp_message = world.time + 5 SECONDS @@ -321,7 +353,15 @@ /obj/item/twohanded/shockpaddles name = "defibrillator paddles" - desc = "A pair of plastic-gripped paddles with flat metal surfaces that are used to deliver powerful electric shocks." + desc = "Пара лопастей с тонкими металлическими пластинами, оснащённых пластиковыми ручками. Используются для подачи мощных ударов электрическим током." + ru_names = list( + NOMINATIVE = "лопасти дефибриллятора", + GENITIVE = "лопастей дефибриллятора", + DATIVE = "лопастям дефибриллятора", + ACCUSATIVE = "лопасти дефибриллятора", + INSTRUMENTAL = "лопастями дефибриллятора", + PREPOSITIONAL = "лопастях дефибриллятора" + ) icon_state = "defibpaddles" item_state = "defibpaddles" force = 0 @@ -339,13 +379,30 @@ /obj/item/twohanded/shockpaddles/advanced name = "advanced defibrillator paddles" - desc = "A pair of high-tech paddles with flat plasteel surfaces that are used to deliver powerful electric shocks. They possess the ability to penetrate armor to deliver shock." + desc = "Пара высокотехнологичных лопастей с тонкими пласталевыми пластинами, оснащённых пластиковыми ручками. Используются для подачи мощных ударов электрическим током, могут действовать сквозь слой брони." + ru_names = list( + NOMINATIVE = "лопасти продвинутого дефибриллятора", + GENITIVE = "лопастей продвинутого дефибриллятора", + DATIVE = "лопастям продвинутого дефибриллятора", + ACCUSATIVE = "лопасти продвинутого дефибриллятора", + INSTRUMENTAL = "лопастями продвинутого дефибриллятора", + PREPOSITIONAL = "лопастях продвинутого дефибриллятора" + ) icon_state = "ntpaddles" item_state = "ntpaddles" /obj/item/twohanded/shockpaddles/syndicate name = "combat defibrillator paddles" desc = "A pair of high-tech paddles with flat plasteel surfaces to revive deceased operatives (unless they exploded). They possess both the ability to penetrate armor and to deliver powerful or disabling shocks offensively." + desc = "Пара высокотехнологичных лопастей с тонкими пласталевыми пластинами, оснащённых пластиковыми ручками. Используются для подачи мощных ударов электрическим током, могут действовать сквозь слой брони. Одинаково хорошо подходят как для оживления мёртвых оперативников, так и для устранения противников." + ru_names = list( + NOMINATIVE = "лопасти боевого дефибриллятора", + GENITIVE = "лопастей боевого дефибриллятора", + DATIVE = "лопастям боевого дефибриллятора", + ACCUSATIVE = "лопасти боевого дефибриллятора", + INSTRUMENTAL = "лопастями боевого дефибриллятора", + PREPOSITIONAL = "лопастях боевого дефибриллятора" + ) icon_state = "syndiepaddles" item_state = "syndiepaddles" @@ -372,7 +429,7 @@ SIGNAL_HANDLER // COMSIG_DEFIB_PADDLES_APPLIED if(!HAS_TRAIT(src, TRAIT_WIELDED)) - to_chat(user, "You need to wield the paddles in both hands before you can use them on someone!") + balloon_alert(user, "нужно держать обеими руками!") return COMPONENT_BLOCK_DEFIB_MISC if(!defib.powered) @@ -384,10 +441,10 @@ on_cooldown = FALSE if(defib.cell) if(defib.cell.charge >= revivecost) - defib.visible_message(span_notice("[defib] beeps: Unit ready.")) + atom_say("Заряд готов.") playsound(get_turf(src), 'sound/machines/defib_ready.ogg', 50) else - defib.visible_message(span_notice("[defib] beeps: Charge depleted.")) + atom_say("Заряд исчерпан.") playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) update_icon(UPDATE_ICON_STATE) defib.update_icon(UPDATE_ICON_STATE) @@ -406,7 +463,7 @@ /obj/item/twohanded/shockpaddles/suicide_act(mob/user) - user.visible_message(span_suicide("[user] is putting the live paddles on [user.p_their()] chest! It looks like [user.p_theyre()] trying to commit suicide.")) + user.visible_message(span_suicide("[user] поднос[pluralize_ru(user.gender, "ит", "ят")] включенные лопасти к своей груди! Похоже, что [genderize_ru(user.gender, "он", "она", "оно", "они")] пыта[pluralize_ru(user.gender, "ет", "ют")]ся совершить самоубийство!")) defib.deductcharge(revivecost) playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1) return OXYLOSS @@ -417,7 +474,7 @@ if(defib) defib.toggle_paddles(user) if(!silent) - to_chat(user, span_notice("The paddles snap back into the main unit.")) + balloon_alert(user, "лопасти возвращены на место") UnregisterSignal(user, COMSIG_MOB_CLIENT_MOVED) /obj/item/twohanded/shockpaddles/equip_to_best_slot(mob/user, force = FALSE) @@ -440,7 +497,7 @@ return TRUE /obj/item/twohanded/shockpaddles/borg - desc = "A pair of mounted paddles with flat metal surfaces that are used to deliver powerful electric shocks." + desc = "Пара встроенных лопастей с тонкими металлическими пластинами. Используются для подачи мощных ударов электрическим током." icon_state = "defibpaddles0" item_state = "defibpaddles0" var/safety = TRUE @@ -470,7 +527,7 @@ update_icon(UPDATE_ICON_STATE) /obj/item/twohanded/shockpaddles/borg/on_cooldown_expire(obj/item/paddles) - visible_message(span_notice("[src] beeps: Defibrillation unit ready.")) + visible_message(span_notice("[capitalize(declent_ru(NOMINATIVE))] сообщает: заряд готов.")) playsound(get_turf(src), 'sound/machines/defib_ready.ogg', 50, 0) on_cooldown = FALSE update_icon(UPDATE_ICON_STATE) diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 23e34998174..805febbdcfd 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -19,7 +19,15 @@ /obj/structure/morgue name = "morgue" - desc = "Used to keep bodies in until someone fetches them." + desc = "Холодильная камера, предназначенная для хранения мертвецов. Предотвращает процессы разложения." + ru_names = list( + NOMINATIVE = "холодильник для трупов", + GENITIVE = "холодильника для трупов", + DATIVE = "холодильнику для трупов", + ACCUSATIVE = "холодильник для трупов", + INSTRUMENTAL = "холодильником для трупов", + PREPOSITIONAL = "холодильнике для трупов" + ) icon = 'icons/obj/stationobjs.dmi' icon_state = "morgue" density = TRUE @@ -28,12 +36,12 @@ anchored = TRUE var/obj/structure/m_tray/connected var/static/status_descriptors = list( - EXTENDED_TRAY = "The tray is currently extended.", - EMPTY_MORGUE = "The tray is currently empty.", - UNREVIVABLE = "The tray contains an unviable body.", - REVIVABLE = "The tray contains a body that is responsive to revival techniques.", - NOT_BODY = "The tray contains something that is not a body.", - GHOST_CONNECTED = "The tray contains a body that might be responsive.", + EXTENDED_TRAY = "Поддон для тела полностью выдвинут.", + EMPTY_MORGUE = "Камера пуста.", + UNREVIVABLE = "В камере находится тело. Оживление невозможно.", + REVIVABLE = "В камере находится тело. Оживление возможно.", + NOT_BODY = "В камере находится инородный объект, не являющийся телом.", + GHOST_CONNECTED = "В камере находится тело. Зафиксированы слабые мозговые сигналы.", ) var/toggle_sound = 'sound/items/deconstruct.ogg' var/status @@ -130,6 +138,7 @@ var/rename = rename_interactive(user, I) if(!isnull(rename)) update_icon(UPDATE_OVERLAYS) + balloon_alert(user, "бирка прикреплена") return ATTACK_CHAIN_PROCEED_SUCCESS return ..() @@ -143,7 +152,7 @@ if(!I.use_tool(src, user, 0, volume = I.tool_volume)) return . - to_chat(user, span_notice("You cut the tag off the morgue.")) + balloon_alert(user, "бирка удалена") name = initial(name) update_icon(UPDATE_OVERLAYS) @@ -172,7 +181,7 @@ break if(desity_found) if(user) - to_chat(user, span_warning("Tray location is blocked!")) + balloon_alert(user, "движение заблокировано!") return FALSE playsound(loc, toggle_sound, 50, TRUE) get_revivable(closing = FALSE) @@ -211,7 +220,7 @@ if(!iscarbon(user) || user.incapacitated() || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) return - to_chat(user, span_alert("You attempt to slide yourself out of [src]...")) + to_chat(user, span_alert("Вы пытаетесь вылезти из [declent_ru(GENITIVE)]...")) attack_hand(user) @@ -252,7 +261,15 @@ */ /obj/structure/m_tray name = "morgue tray" - desc = "Apply corpse before closing." + desc = "Поместить тело, задвинуть, закрыть крышку. Всё просто." + ru_names = list( + NOMINATIVE = "поддон холодильника для трупов", + GENITIVE = "поддона холодильника для трупов", + DATIVE = "поддону холодильника для трупов", + ACCUSATIVE = "поддон холодильника для трупов", + INSTRUMENTAL = "поддоном холодильника для трупов", + PREPOSITIONAL = "поддоне холодильника для трупов" + ) icon = 'icons/obj/stationobjs.dmi' icon_state = "morgue_tray" density = TRUE @@ -307,7 +324,7 @@ dropping.forceMove(loc) if(user != dropping) - user.visible_message(span_warning("[user] stuffs [dropping] into [src]!")) + user.visible_message(span_warning("[user] помеща[pluralize_ru(user.gender, "ет", "ют")] [dropping.declent_ru(GENITIVE)] на [declent_ru(GENITIVE)]!")) return TRUE @@ -351,7 +368,15 @@ GLOBAL_LIST_EMPTY(crematoriums) /obj/machinery/crematorium name = "crematorium" - desc = "A human incinerator. Works well on barbeque nights." + desc = "Печь, предназначенная для кремации тел. Интересно, шашлык в таком можно приготовить?" + ru_names = list( + NOMINATIVE = "крематорий", + GENITIVE = "крематория", + DATIVE = "крематорию", + ACCUSATIVE = "крематорий", + INSTRUMENTAL = "крематорием", + PREPOSITIONAL = "крематории" + ) icon = 'icons/obj/stationobjs.dmi' icon_state = "crema" max_integrity = 1000 @@ -392,7 +417,7 @@ GLOBAL_LIST_EMPTY(crematoriums) /obj/machinery/crematorium/examine(mob/user) . = ..() - . += span_info("You can rotate [src] by using wrench.") + . += span_info("Используйте гаечный ключ для изменения направления.") /obj/machinery/crematorium/update_overlays() @@ -431,21 +456,21 @@ GLOBAL_LIST_EMPTY(crematoriums) flame_spread(user) return . if(length(contents)) - to_chat(user, span_warning("You can not rotate [src] while its full!")) + balloon_alert(user, "внутри что-то есть!") return . if(connected) - to_chat(user, span_warning("You can not rotate [src] while its open!")) + balloon_alert(user, "крышка открыта!") return . if(!I.use_tool(src, user, 3 SECONDS, volume = I.tool_volume) || cremating || length(contents) || connected) return . dir = turn(dir, 90) - to_chat(user, span_notice("You rotate [src].")) + balloon_alert(user, "направление изменено") /obj/machinery/crematorium/proc/flame_spread(mob/living/user) if(!isliving(user)) return - visible_message(span_userdanger("The flame escapes from [src] and spreads to [user]!")) + visible_message(span_userdanger("Пламя вырывается из [declent_ru(GENITIVE)] и перекидывается на [user]!")) user.apply_damage(40, BURN, user.hand ? BODY_ZONE_L_ARM : BODY_ZONE_R_ARM) user.adjust_fire_stacks(20) user.IgniteMob() @@ -462,7 +487,7 @@ GLOBAL_LIST_EMPTY(crematoriums) /obj/machinery/crematorium/proc/tray_toggle(mob/user, skip_checks = FALSE) if(cremating) if(user) - to_chat(user, span_warning("It's locked!")) + balloon_alert(user, "заблокировано!") return FALSE if(connected) for(var/atom/movable/check in connected.loc) @@ -482,7 +507,7 @@ GLOBAL_LIST_EMPTY(crematoriums) break if(!skip_checks && desity_found) if(user) - to_chat(user, span_warning("Tray location is blocked!")) + balloon_alert(user, "движение заблокировано!") return FALSE playsound(loc, toggle_sound, 50, TRUE) connect() @@ -520,7 +545,7 @@ GLOBAL_LIST_EMPTY(crematoriums) /obj/machinery/crematorium/container_resist(mob/living/carbon/user) if(cremating || !iscarbon(user) || user.incapacitated() || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) return - to_chat(user, span_alert("You attempt to slide yourself out of [src]...")) + to_chat(user, span_alert("Вы пытаетесь вылезти из [declent_ru(GENITIVE)]...")) tray_toggle(user) @@ -541,26 +566,26 @@ GLOBAL_LIST_EMPTY(crematoriums) return if(stat & NOPOWER) - to_chat(user, span_warning("[src] is unpowered!")) + balloon_alert(user, "нет энергии!") return if(cremating) - to_chat(user, span_warning("[src] is working!")) + balloon_alert(user, "уже активно!") return if(connected) - to_chat(user, span_warning("You should close the tray first!")) + balloon_alert(user, "крышка открыта!") return if(user.loc == src) - to_chat(user, span_warning("You can not reach inceneration button!")) + balloon_alert(user, "невозможно!") return if(allowed(user) || user.can_advanced_admin_interact()) cremate(user) return - to_chat(user, span_warning("Access denied.")) + balloon_alert(user, "отказано в доступе!") playsound(src, pick('sound/machines/button.ogg', 'sound/machines/button_alternate.ogg', 'sound/machines/button_meloboom.ogg'), 20) @@ -572,12 +597,12 @@ GLOBAL_LIST_EMPTY(crematoriums) var/list/crema_content = get_all_contents() - src - connected - saved_contents if(!length(crema_content)) - audible_message(span_warning("You hear a hollow crackle.")) + audible_message(span_warning("Вы слышите странный треск.")) refuse_ungibbable_items() return use_power(400000) - audible_message(span_warning("You hear a roar as [src] activates!")) + audible_message(span_warning("[capitalize(declent_ru(NOMINATIVE))] с громким грохотом начинает кремацию!")) cremating = TRUE update_icon(UPDATE_OVERLAYS) @@ -605,7 +630,6 @@ GLOBAL_LIST_EMPTY(crematoriums) /obj/machinery/crematorium/proc/refuse_ungibbable_items() if(length(saved_contents)) - visible_message(span_boldnotice("[src] refuses to burn [lowertext(english_list(saved_contents))].")) tray_toggle(skip_checks = TRUE) saved_contents.Cut() @@ -675,7 +699,15 @@ GLOBAL_LIST_EMPTY(crematoriums) */ /obj/structure/c_tray name = "crematorium tray" - desc = "Apply body before burning." + desc = "Поместить тело, задвинуть, закрыть крышку. Всё просто." + ru_names = list( + NOMINATIVE = "поддон крематория", + GENITIVE = "поддона крематория", + DATIVE = "поддону крематория", + ACCUSATIVE = "поддон крематория", + INSTRUMENTAL = "поддоном крематория", + PREPOSITIONAL = "поддоне крематория" + ) icon = 'icons/obj/stationobjs.dmi' icon_state = "crema_tray" density = TRUE @@ -738,7 +770,7 @@ GLOBAL_LIST_EMPTY(crematoriums) dropping.forceMove(loc) if(user != dropping) - user.visible_message(span_warning("[user] stuffs [dropping] into [src]!")) + user.visible_message(span_warning("[user] помеща[pluralize_ru(user.gender, "ет", "ют")] [dropping.declent_ru(GENITIVE)] на [declent_ru(GENITIVE)]!")) return TRUE @@ -748,8 +780,16 @@ GLOBAL_LIST_EMPTY(crematoriums) // Crematorium switch /obj/machinery/crema_switch - desc = "Burn baby burn!" name = "crematorium igniter" + desc = "Жги, детка!" + ru_names = list( + NOMINATIVE = "активатор крематория", + GENITIVE = "активатора крематория", + DATIVE = "активатору крематория", + ACCUSATIVE = "активатор крематория", + INSTRUMENTAL = "активатором крематория", + PREPOSITIONAL = "активаторе крематория" + ) icon = 'icons/obj/engines_and_power/power.dmi' icon_state = "crema_switch" anchored = TRUE diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index b9efa4e202a..61f0a1efc88 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -5,6 +5,15 @@ */ /obj/machinery/smartfridge name = "\improper SmartFridge" + desc = "Это холодильник. Он умный. Просто удивительно, да?" + ru_names = list( + NOMINATIVE = "холодильник SmartFridge", + GENITIVE = "холодильника SmartFridge", + DATIVE = "холодильнику SmartFridge", + ACCUSATIVE = "холодильник SmartFridge", + INSTRUMENTAL = "холодильником SmartFridge", + PREPOSITIONAL = "холодильнике SmartFridge" + ) icon = 'icons/obj/machines/vending.dmi' icon_state = "smartfridge" layer = 2.9 @@ -200,7 +209,7 @@ /obj/machinery/smartfridge/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/card/emag)) - to_chat(user, span_notice("The [name] smartly refuses [I].")) + balloon_alert(user, "невозможно!") return ATTACK_CHAIN_PROCEED|ATTACK_CHAIN_NO_AFTERATTACK if(user.a_intent == INTENT_HARM) @@ -212,14 +221,15 @@ add_fingerprint(user) if(stat & (BROKEN|NOPOWER)) - to_chat(user, span_warning("The [name] is unpowered or broken.")) + balloon_alert(user, "не работает!") return ATTACK_CHAIN_PROCEED if(load(I, user)) user.visible_message( - span_notice("[user] has added [I] into [src]."), - span_notice("You have added [I] into [src]."), + span_notice("[user] загрузил[pluralize_ru(user.gender, "", "а", "о", "и")] [I.declent_ru(ACCUSATIVE)] в [declent_ru(ACCUSATIVE)]."), + span_notice("Вы загрузили [I.declent_ru(ACCUSATIVE)] в [declent_ru(ACCUSATIVE)]."), ) + balloon_alert(user, "загружено внутрь") SStgui.update_uis(src) update_icon(UPDATE_OVERLAYS) return ATTACK_CHAIN_BLOCKED_ALL @@ -233,17 +243,18 @@ items_loaded++ if(items_loaded) user.visible_message( - span_notice("[user] has loaded [src] with [storage]."), - span_notice("You have loaded [src] with [storage]."), + span_notice("[user] загрузил[pluralize_ru(user.gender, "", "а", "о", "и")] содержимое [storage.declent_ru(GENITIVE)] в [declent_ru(ACCUSATIVE)]."), + span_notice("Вы загрузили содержимое [storage.declent_ru(GENITIVE)] в [declent_ru(ACCUSATIVE)]."), ) + balloon_alert(user, "содержимое загружено") SStgui.update_uis(src) update_icon(UPDATE_OVERLAYS) var/failed = length(storage.contents) if(failed) - to_chat(user, span_notice("[failed] item\s [failed == 1 ? "is" : "are"] refused.")) + to_chat(user, span_notice("[failed] предмет[declension_ru(failed, "", "а", "ов")] не был[declension_ru(failed, "", "и", "и")] загружен[declension_ru(failed, "", "ы", "ы")].")) return ATTACK_CHAIN_PROCEED_SUCCESS - to_chat(user, span_warning("You cannot put [I] into [src].")) + balloon_alert(user, "не подходит!") return ATTACK_CHAIN_PROCEED @@ -252,6 +263,7 @@ /obj/machinery/smartfridge/attack_hand(mob/user) if(stat & (BROKEN|NOPOWER)) + balloon_alert(user, "не работает!") return wires.Interact(user) ui_interact(user) @@ -264,12 +276,12 @@ if(!istype(over_object, /obj/item/storage/pill_bottle)) //Only pill bottles, please return TRUE if(stat & (BROKEN|NOPOWER)) - to_chat(user, "\The [src] is unpowered and useless.") + balloon_alert(user, "не работает!") return TRUE var/obj/item/storage/box/pillbottles/P = over_object if(!length(P.contents)) - to_chat(user, "\The [P] is empty.") + balloon_alert(user, "нечего выгружать!") return TRUE add_fingerprint(user) @@ -279,11 +291,14 @@ G.add_fingerprint(user) items_loaded++ if(items_loaded) - user.visible_message("[user] empties \the [P] into \the [src].", "You empty \the [P] into \the [src].") + user.visible_message( + span_notice("[user] загрузил[pluralize_ru(user.gender, "", "а", "о", "и")] содержимое [P.declent_ru(GENITIVE)] в [declent_ru(ACCUSATIVE)]."), + span_notice("Вы загрузили содержимое [P.declent_ru(GENITIVE)] в [declent_ru(ACCUSATIVE)].")) + balloon_alert(user, "содержимое загружено") update_icon(UPDATE_OVERLAYS) var/failed = length(P.contents) if(failed) - to_chat(user, "[failed] item\s [failed == 1 ? "is" : "are"] refused.") + to_chat(user, span_notice("[failed] предмет[declension_ru(failed, "", "а", "ов")] не был[declension_ru(failed, "", "и", "и")] загружен[declension_ru(failed, "", "ы", "ы")].")) return TRUE /obj/machinery/smartfridge/ui_interact(mob/user, datum/tgui/ui = null) @@ -327,7 +342,7 @@ switch(action) if("vend") if(is_secure && !emagged && scan_id && !allowed(usr)) //secure fridge check - to_chat(usr, "Access denied.") + to_chat(usr, span_warning("Отказано в доступе.")) return FALSE var/index = text2num(params["index"]) @@ -375,7 +390,7 @@ return FALSE if(length(contents) >= max_n_of_items) - to_chat(user, span_notice("The [name] is full.")) + balloon_alert(user, "хранилище переполнено!") return FALSE if(isstorage(I.loc)) @@ -422,7 +437,7 @@ return FALSE INVOKE_ASYNC(throw_item, TYPE_PROC_REF(/atom/movable, throw_at), target, 16, 3, src) - visible_message("[src] launches [throw_item.name] at [target.name]!") + visible_message(span_warning("[capitalize(declent_ru(NOMINATIVE))] кидает [throw_item.declent_ru(ACCUSATIVE)] в [target]!")) return TRUE /** @@ -440,6 +455,15 @@ */ /obj/machinery/smartfridge/syndie name = "\improper Suspicious SmartFridge" + desc = "Это холодильник. Он умный. Подозрительно умный." + ru_names = list( + NOMINATIVE = "подозрительный холодильник SmartFridge", + GENITIVE = "подозрительного холодильника SmartFridge", + DATIVE = "подозрительному холодильнику SmartFridge", + ACCUSATIVE = "подозрительный холодильник SmartFridge", + INSTRUMENTAL = "подозрительным холодильником SmartFridge", + PREPOSITIONAL = "подозрительном холодильнике SmartFridge" + ) icon_state = "smartfridge-syndie" contents_overlay = "smartfridge-syndie" @@ -456,7 +480,7 @@ /obj/machinery/smartfridge/secure/emag_act(mob/user) emagged = TRUE if(user) - to_chat(user, "You short out the product lock on \the [src].") + balloon_alert(user, "механизм блокировки взломан!") /obj/machinery/smartfridge/secure/emp_act(severity) if(!emagged && prob(40 / severity)) @@ -471,7 +495,15 @@ */ /obj/machinery/smartfridge/seeds name = "\improper Seed Storage" - desc = "When you need seeds fast!" + desc = "Это холодильник, предназначенный для растений и их плодов." + ru_names = list( + NOMINATIVE = "ботанический холодильник", + GENITIVE = "ботанического холодильника", + DATIVE = "ботаническому холодильнику", + ACCUSATIVE = "ботанический холодильник", + INSTRUMENTAL = "ботаническим холодильником", + PREPOSITIONAL = "ботаническом холодильнике" + ) icon = 'icons/obj/machines/vending.dmi' icon_state = "seeds_off" base_icon_state = "seeds" @@ -512,7 +544,15 @@ */ /obj/machinery/smartfridge/medbay name = "\improper Refrigerated Medicine Storage" - desc = "A refrigerated storage unit for storing medicine and chemicals." + desc = "Это холодильник, предназначенный для хранения медикаментов и химикатов." + ru_names = list( + NOMINATIVE = "медицинский холодильник", + GENITIVE = "медицинского холодильника", + DATIVE = "медицинскому холодильнику", + ACCUSATIVE = "медицинский холодильник", + INSTRUMENTAL = "медицинским холодильником", + PREPOSITIONAL = "медицинском холодильнике" + ) icon_state = "smartfridge" //To fix the icon in the map editor. /obj/machinery/smartfridge/medbay/Initialize(mapload) @@ -537,12 +577,18 @@ */ /obj/machinery/smartfridge/secure/extract name = "\improper Slime Extract Storage" - desc = "A refrigerated storage unit for slime extracts" + desc = "Это холодильник, предназначенный для хранения слаймовых экстрактов." + ru_names = list( + NOMINATIVE = "холодильник для слаймовых экстрактов", + GENITIVE = "холодильника для слаймовых экстрактов", + DATIVE = "холодильнику для слаймовых экстрактов", + ACCUSATIVE = "холодильник для слаймовых экстрактов", + INSTRUMENTAL = "холодильником для слаймовых экстрактов", + PREPOSITIONAL = "холодильнике для слаймовых экстрактов" + ) req_access = list(ACCESS_RESEARCH) /obj/machinery/smartfridge/secure/extract/syndie - name = "\improper Suspicious Slime Extract Storage" - desc = "A refrigerated storage unit for slime extracts" icon_state = "smartfridge-syndie" contents_overlay = "smartfridge-syndie" @@ -560,8 +606,6 @@ * Secure, Medical variant of the [Smart Fridge][/obj/machinery/smartfridge]. */ /obj/machinery/smartfridge/secure/medbay - name = "\improper Secure Refrigerated Medicine Storage" - desc = "A refrigerated storage unit for storing medicine and chemicals." icon_state = "smartfridge" //To fix the icon in the map editor. req_access = list(ACCESS_MEDICAL, ACCESS_CHEMISTRY) @@ -587,7 +631,15 @@ */ /obj/machinery/smartfridge/secure/chemistry name = "\improper Smart Chemical Storage" - desc = "A refrigerated storage unit for medicine and chemical storage." + desc = "Это холодильник, предназначенный для хранения медикаментов и химикатов." + ru_names = list( + NOMINATIVE = "химический холодильник", + GENITIVE = "химического холодильника", + DATIVE = "химическому холодильнику", + ACCUSATIVE = "химический холодильник", + INSTRUMENTAL = "химическим холодильником", + PREPOSITIONAL = "химическом холодильнике" + ) icon_state = "smartfridge" //To fix the icon in the map editor. req_access = list(ACCESS_CHEMISTRY) @@ -629,9 +681,18 @@ /obj/machinery/smartfridge/secure/medbay/organ - req_access = list(ACCESS_SURGERY) + name = "\improper Secure Refrigerated Organ Storage" - desc = "A refrigerated storage unit for storing organs, limbs, implants and IV bags." + desc = "Это холодильник, предназначенный для хранения органов, конечностей, имплантов и капельниц." + ru_names = list( + NOMINATIVE = "холодильник для органов", + GENITIVE = "холодильника для органов", + DATIVE = "холодильнику для органов", + ACCUSATIVE = "холодильник для органов", + INSTRUMENTAL = "холодильником для органов", + PREPOSITIONAL = "холодильнике для органов" + ) + req_access = list(ACCESS_SURGERY) opacity = TRUE contents_overlay = "smartfridge-organ" @@ -655,7 +716,15 @@ */ /obj/machinery/smartfridge/disks name = "disk compartmentalizer" - desc = "A machine capable of storing a variety of disks. Denoted by most as the DSU (disk storage unit)." + desc = "Машина, предназначенная для хранения различного рода дискет." + ru_names = list( + NOMINATIVE = "хранилище для дискет", + GENITIVE = "хранилища для дискет", + DATIVE = "хранилищу для дискет", + ACCUSATIVE = "хранилище для дискет", + INSTRUMENTAL = "хранилищем для дискет", + PREPOSITIONAL = "хранилище для дискет" + ) icon_state = "disktoaster_off" base_icon_state = "disktoaster" pass_flags = PASSTABLE @@ -692,7 +761,15 @@ */ /obj/machinery/smartfridge/secure/chemistry/virology name = "\improper Smart Virus Storage" - desc = "A refrigerated storage unit for volatile sample storage." + desc = "Это холодильник, предназначенный для хранения образцов вирусов." + ru_names = list( + NOMINATIVE = "холодильник для вирусных образцов", + GENITIVE = "холодильника для вирусных образцов", + DATIVE = "холодильнику для вирусных образцов", + ACCUSATIVE = "холодильник для вирусных образцов", + INSTRUMENTAL = "холодильником для вирусных образцов", + PREPOSITIONAL = "холодильнике для вирусных образцов" + ) icon_state = "smartfridge" req_access = list(ACCESS_VIROLOGY) icon_addon = "smartfridge-viro-overlay" @@ -745,7 +822,15 @@ */ /obj/machinery/smartfridge/drinks name = "\improper Drink Showcase" - desc = "A refrigerated storage unit for tasty tasty alcohol." + desc = "Это холодильник, предназначенный для хранения напитков." + ru_names = list( + NOMINATIVE = "холодильник для напитков", + GENITIVE = "холодильника для напитков", + DATIVE = "холодильнику для напитков", + ACCUSATIVE = "холодильник для напитков", + INSTRUMENTAL = "холодильником для напитков", + PREPOSITIONAL = "холодильнике для напитков" + ) /obj/machinery/smartfridge/drinks/Initialize(mapload) . = ..() @@ -762,7 +847,15 @@ */ /obj/machinery/smartfridge/dish name = "\improper Dish Showcase" - desc = "A refrigerated storage unit for some delicious food." + desc = "Это холодильник, предназначенный для хранения органов, конечностей, имплантов и капельниц." + ru_names = list( + NOMINATIVE = "холодильник для еды", + GENITIVE = "холодильника для еды", + DATIVE = "холодильнику для еды", + ACCUSATIVE = "холодильник для еды", + INSTRUMENTAL = "холодильником для еды", + PREPOSITIONAL = "холодильнике для еды" + ) /obj/machinery/smartfridge/dish/Initialize(mapload) . = ..() @@ -782,6 +875,15 @@ /obj/machinery/smartfridge/drying_rack name = "drying rack" desc = "A wooden contraption, used to dry plant products, food and leather." + desc = "Деревянная стойка, предназначенная для просушки растительных продуктов, еды и кожи." + ru_names = list( + NOMINATIVE = "сушильная стойка", + GENITIVE = "сушильной стойки", + DATIVE = "сушильной стойке", + ACCUSATIVE = "сушильную стойку", + INSTRUMENTAL = "сушильной стойкой", + PREPOSITIONAL = "сушильной стойке" + ) icon = 'icons/obj/hydroponics/equipment.dmi' icon_state = "drying-rack_off" use_power = IDLE_POWER_USE diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index f424af5d551..d476c9a00e6 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -4,6 +4,15 @@ /obj/machinery/chem_dispenser name = "chem dispenser" + desc = "Высокотехнологичная машина, способная синтезировать определённые вещества с помощью сложных физико-химических процессов. Даже не спрашивайте, как оно работает - вы всё равно не поймёте." + ru_names = list( + NOMINATIVE = "химический раздатчик", + GENITIVE = "химического раздатчика", + DATIVE = "химическому раздатчику", + ACCUSATIVE = "химический раздатчик", + INSTRUMENTAL = "химическим раздатчиком", + PREPOSITIONAL = "химическом раздатчике" + ) density = TRUE anchored = TRUE icon = 'icons/obj/chemical.dmi' @@ -11,7 +20,7 @@ use_power = IDLE_POWER_USE idle_power_usage = 40 resistance_flags = FIRE_PROOF | ACID_PROOF - var/ui_title = "Chem Dispenser 5000" + var/ui_title = "ХимРаздатчик 5000" var/cell_type = /obj/item/stock_parts/cell/high var/obj/item/stock_parts/cell/cell var/powerefficiency = 0.1 @@ -27,8 +36,6 @@ "copper", "mercury", "plasma", "radium", "water", "ethanol", "sugar", "iodine", "bromine", "silver", "chromium") var/list/upgrade_reagents = list("oil", "ash", "acetone", "saltpetre", "ammonia", "diethylamine", "fuel") var/list/hacked_reagents = list("toxin") - var/hack_message = "You disable the safety safeguards, enabling the \"Mad Scientist\" mode." - var/unhack_message = "You re-enable the safety safeguards, enabling the \"NT Standard\" mode." var/is_drink = FALSE /obj/machinery/chem_dispenser/get_cell() @@ -74,7 +81,15 @@ /obj/machinery/chem_dispenser/mutagensaltpeter name = "botanical chemical dispenser" - desc = "Creates and dispenses chemicals useful for botany." + desc = "Узкоспециализированная модель химического раздатчика, настроенная на синтез ограниченного числа веществ, специально для ботанических нужд." + ru_names = list( + NOMINATIVE = "ботанический раздатчик", + GENITIVE = "ботанического раздатчика", + DATIVE = "ботаническому раздатчику", + ACCUSATIVE = "ботанический раздатчик", + INSTRUMENTAL = "ботаническим раздатчиком", + PREPOSITIONAL = "ботаническом раздатчике" + ) obj_flags = NODECONSTRUCT dispensable_reagents = list( @@ -127,9 +142,11 @@ /obj/machinery/chem_dispenser/examine(mob/user) . = ..() if(panel_open) - . += "[src]'s maintenance hatch is open!" + . += span_notice("Панель техобслуживания открыта.") if(in_range(user, src) || isobserver(user)) - . += "The status display reads:
Recharging [recharge_amount] power units per interval.
Power efficiency increased by [round((powerefficiency * 1000) - 100, 1)]%." + . += span_notice("
Монитор состояния сообщает: скорость зарядки - [recharge_amount] единиц[declension_ru(recharge_amount, "у", "ы", "")] энергии за единицу времени.
Энергоэффективность увеличена на [round((powerefficiency * 1000) - 100, 1)]%") + if(Adjacent(user)) + . += span_info("Используйте Alt + ЛКМ, чтобы извлечь ёмкость.") /obj/machinery/chem_dispenser/process() @@ -256,24 +273,35 @@ if(istype(I, /obj/item/reagent_containers/glass) || istype(I, /obj/item/reagent_containers/food/drinks)) add_fingerprint(user) if(panel_open) - to_chat(user, span_warning("Close the maintenance panel first.")) + balloon_alert(user, "техпанель открыта!") return ATTACK_CHAIN_PROCEED if(beaker) - to_chat(user, span_warning("The [name] already has [beaker] loaded.")) + balloon_alert(user, "слот для ёмкости занят!") return ATTACK_CHAIN_PROCEED if(!user.drop_transfer_item_to_loc(I, src)) return ..() beaker = I - to_chat(user, span_notice("You have inserted [I] into [src].")) + balloon_alert(user, "ёмкость установлена") SStgui.update_uis(src) // update all UIs attached to src update_icon(UPDATE_OVERLAYS) return ATTACK_CHAIN_BLOCKED_ALL return ..() +/obj/machinery/chem_dispenser/AltClick(mob/living/user) + if(!beaker) + return + beaker.forceMove(loc) + if(Adjacent(user) && !issilicon(user)) + user.put_in_hands(beaker, ignore_anim = FALSE) + balloon_alert(user, "ёмкость извлечена") + beaker = null + add_fingerprint(user) + update_icon(UPDATE_OVERLAYS) /obj/machinery/chem_dispenser/crowbar_act(mob/user, obj/item/I) if(!panel_open) + balloon_alert(user, "техпанель закрыта!") return if(default_deconstruction_crowbar(user, I)) return TRUE @@ -307,7 +335,7 @@ return hackedcheck = !hackedcheck - to_chat(user, hackedcheck ? hack_message : unhack_message) + balloon_alert(user, "защитные протоколы [hackedcheck ? "активированы" : "дезактивированы"]") update_reagents(UPDATE_TYPE_HACK) SStgui.update_uis(src) @@ -361,18 +389,24 @@ /obj/machinery/chem_dispenser/soda - icon_state = "soda_dispenser" name = "soda fountain" - desc = "A drink fabricating machine, capable of producing many sugary drinks with just one touch." - ui_title = "Soda Dispens-o-matic" + desc = "Машина, способная синтезировать целый ряд самых разных напитков. Круто!" + ru_names = list( + NOMINATIVE = "раздатчик напитков", + GENITIVE = "раздатчика напитков", + DATIVE = "раздатчику напитков", + ACCUSATIVE = "раздатчик напитков", + INSTRUMENTAL = "раздатчиком напитков", + PREPOSITIONAL = "раздатчике напитков" + ) + icon_state = "soda_dispenser" + ui_title = "Фонтан Напитков 10000" dispensable_reagents = list("water", "ice", "soymilk", "coffee", "tea", "hot_coco", "cola", "spacemountainwind", "dr_gibb", "space_up", "tonic", "sodawater", "lemon_lime", "grapejuice", "sugar", "orangejuice", "lemonjuice", "limejuice", "tomatojuice", "banana", "watermelonjuice", "carrotjuice", "potato", "berryjuice") upgrade_reagents = list("bananahonk", "milkshake", "cafe_latte", "cafe_mocha", "triple_citrus", "icecoffe","icetea") hacked_reagents = list("thirteenloko") - var/list/hackedupgrade_reagents = list("zaza") - hack_message = "You change the mode from 'McNano' to 'Pizza King'." - unhack_message = "You change the mode from 'Pizza King' to 'McNano'." + var/list/hackedupgrade_reagents = list("zaza") //I possess zaza is_drink = TRUE /obj/machinery/chem_dispenser/soda/New() @@ -413,15 +447,21 @@ /obj/machinery/chem_dispenser/beer - icon_state = "booze_dispenser" name = "booze dispenser" - ui_title = "Booze Portal 9001" - desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one." + desc = "Машина, способная синтезировать для вас любую алкогольную бурду, которая только может прийти в голову. Настоящее чудо алкологольных технологий!" + ru_names = list( + NOMINATIVE = "раздатчик алкоголя", + GENITIVE = "раздатчика алкоголя", + DATIVE = "раздатчику алкоголя", + ACCUSATIVE = "раздатчик алкоголя", + INSTRUMENTAL = "раздатчиком алкоголя", + PREPOSITIONAL = "раздатчике алкоголя" + ) + icon_state = "booze_dispenser" + ui_title = "Наливатель Бухла 9001" dispensable_reagents = list("ice", "cream", "cider", "beer", "kahlua", "whiskey", "wine", "vodka", "gin", "rum", "tequila", "vermouth", "cognac", "ale", "mead", "synthanol", "jagermeister", "bluecuracao", "sambuka", "schnaps", "sheridan") upgrade_reagents = list("iced_beer", "irishcream", "manhattan", "antihol", "synthignon", "bravebull") hacked_reagents = list("goldschlager", "patron", "absinthe", "ethanol", "nothing", "sake", "bitter", "champagne", "aperol", "noalco_beer") - hack_message = "You disable the 'nanotrasen-are-cheap-bastards' lock, enabling hidden and very expensive boozes." - unhack_message = "You re-enable the 'nanotrasen-are-cheap-bastards' lock, disabling hidden and very expensive boozes." is_drink = TRUE /obj/machinery/chem_dispenser/beer/New() @@ -451,8 +491,16 @@ //botanical chemical dispenser /obj/machinery/chem_dispenser/botanical name = "botanical chemical dispenser" - desc = "A botanical chemical dispenser on a budget." - ui_title = "Botanical Chem Dispenser" + desc = "Узкоспециализированная модель химического раздатчика, настроенная на синтез ограниченного числа веществ, специально для ботанических нужд." + ru_names = list( + NOMINATIVE = "ботанический раздатчик", + GENITIVE = "ботанического раздатчика", + DATIVE = "ботаническому раздатчику", + ACCUSATIVE = "ботанический раздатчик", + INSTRUMENTAL = "ботаническим раздатчиком", + PREPOSITIONAL = "ботаническом раздатчике" + ) + ui_title = "Ботанический ХимРаздатчик" dispensable_reagents = list("mutagen", "saltpetre", "ammonia", "water") upgrade_reagents = list("atrazine", "glyphosate", "pestkiller", "diethylamine", "ash") @@ -483,6 +531,15 @@ // Handheld chem dispenser /obj/item/handheld_chem_dispenser name = "handheld chem dispenser" + desc = "Компактная версия химического раздатчика. Удобно!" + ru_names = list( + NOMINATIVE = "ручной химический раздатчик", + GENITIVE = "ручного химического раздатчика", + DATIVE = "ручному химическому раздатчику", + ACCUSATIVE = "ручной химический раздатчик", + INSTRUMENTAL = "ручным химическим раздатчиком", + PREPOSITIONAL = "ручном химическом раздатчике" + ) icon = 'icons/obj/chemical.dmi' item_state = "handheld_chem" icon_state = "handheld_chem" @@ -526,20 +583,20 @@ target.reagents.add_reagent(current_reagent, actual) cell.charge -= actual / efficiency if(actual) - to_chat(user, "You dispense [amount] units of [current_reagent] into the [target].") + to_chat(user, span_notice("Вы наливаете [amount] единиц[declension_ru(amount, "у", "ы", "")] [current_reagent] в [target.declent_ru(ACCUSATIVE)].")) update_icon(UPDATE_OVERLAYS) if("remove") if(!target.reagents.remove_reagent(current_reagent, amount)) - to_chat(user, "You remove [amount] units of [current_reagent] from the [target].") + to_chat(user, span_notice("Вы удаляете [amount] единиц[declension_ru(amount, "у", "ы", "")] [current_reagent] из [target.declent_ru(GENITIVE)].")) if("isolate") if(!target.reagents.isolate_reagent(current_reagent)) - to_chat(user, "You remove all but the [current_reagent] from the [target].") + to_chat(user, span_notice("Вы удаляете всё, кроме [current_reagent] в [target.declent_ru(PREPOSITIONAL)].")) /obj/item/handheld_chem_dispenser/attack_self(mob/user) if(cell) ui_interact(user) else - to_chat(user, "The [src] lacks a power cell!") + balloon_alert(user, "нет батареи!") /obj/item/handheld_chem_dispenser/ui_state(mob/user) return GLOB.inventory_state @@ -547,7 +604,7 @@ /obj/item/handheld_chem_dispenser/ui_interact(mob/user, datum/tgui/ui = null) ui = SStgui.try_update_ui(user, src, ui) if(!ui) - ui = new(user, src, "HandheldChemDispenser", name) + ui = new(user, src, "HandheldChemDispenser", capitalize(declent_ru(NOMINATIVE))) ui.open() /obj/item/handheld_chem_dispenser/ui_data(mob/user) @@ -639,16 +696,16 @@ if(istype(I, /obj/item/stock_parts/cell)) add_fingerprint(user) if(cell) - to_chat(user, span_warning("The [name] already has a cell.")) + balloon_alert(user, "слот для батареи занят!") return ATTACK_CHAIN_PROCEED if(cell.maxcharge < 100) - to_chat(user, span_warning("The [name] requires a higher capacity cell.")) + balloon_alert(user, "требуется батарея большей ёмкости!") return ATTACK_CHAIN_PROCEED if(!user.drop_transfer_item_to_loc(I, src)) return ..() cell = I update_icon(UPDATE_OVERLAYS) - to_chat(user, span_notice("You have installed [I] into the [src].")) + balloon_alert(user, "батарея установлена") return ATTACK_CHAIN_BLOCKED_ALL return ..() @@ -657,15 +714,15 @@ /obj/item/handheld_chem_dispenser/screwdriver_act(mob/user, obj/item/I) . = TRUE if(isrobot(loc)) - to_chat(user, span_warning("That was dumb idea.")) + balloon_alert(user, "невозможно!") return . if(!cell) add_fingerprint(user) - to_chat(user, span_warning("The [name] has no power cell installed.")) + balloon_alert(user, "батарея отсутствует!") return . if(!I.use_tool(src, user, volume = I.tool_volume)) return . - to_chat(user, span_notice("You have removed [cell] from [src].")) + balloon_alert(user, "батарея извлечена") cell.update_icon() cell.forceMove(drop_location()) cell.add_fingerprint(user) @@ -675,6 +732,15 @@ /obj/item/handheld_chem_dispenser/booze name = "handheld bar tap" + desc = "Компактная версия алкогольного раздатчика. Удобно!" + ru_names = list( + NOMINATIVE = "ручной алкогольный раздатчик", + GENITIVE = "ручного алкогольного раздатчика", + DATIVE = "ручному алкогольному раздатчику", + ACCUSATIVE = "ручной алкогольный раздатчик", + INSTRUMENTAL = "ручным алкогольным раздатчиком", + PREPOSITIONAL = "ручном алкогольном раздатчике" + ) item_state = "handheld_booze" icon_state = "handheld_booze" is_drink = TRUE @@ -685,6 +751,15 @@ /obj/item/handheld_chem_dispenser/soda name = "handheld soda fountain" + desc = "Компактная версия раздатчика напитков. Удобно!" + ru_names = list( + NOMINATIVE = "ручной раздатчик напитков", + GENITIVE = "ручного раздатчика напитков", + DATIVE = "ручному раздатчику напитков", + ACCUSATIVE = "ручной раздатчик напитков", + INSTRUMENTAL = "ручным раздатчиком напитков", + PREPOSITIONAL = "ручном раздатчике напитков" + ) item_state = "handheld_soda" icon_state = "handheld_soda" is_drink = TRUE @@ -695,6 +770,15 @@ /obj/item/handheld_chem_dispenser/botanical name = "handheld botanical chemical dispenser" + desc = "Компактная версия ботанического раздатчика. Удобно!" + ru_names = list( + NOMINATIVE = "ручной ботанический раздатчик", + GENITIVE = "ручного ботанического раздатчика", + DATIVE = "ручному ботаническому раздатчику", + ACCUSATIVE = "ручной ботанический раздатчик", + INSTRUMENTAL = "ручным ботаническим раздатчиком", + PREPOSITIONAL = "ручном ботаническом раздатчике" + ) dispensable_reagents = list( "mutagen", "saltpetre", @@ -712,6 +796,15 @@ /obj/item/handheld_chem_dispenser/cooking name = "handheld cooking chemical dispenser" + desc = "Компактный кухонный раздатчик. Удобно!" + ru_names = list( + NOMINATIVE = "компактный кухонный раздатчик", + GENITIVE = "компактного кухонного раздатчика", + DATIVE = "компактному кухонному раздатчику", + ACCUSATIVE = "компактный кухонный раздатчик", + INSTRUMENTAL = "компактным кухонным раздатчиком", + PREPOSITIONAL = "компактном кухонном раздатчике" + ) dispensable_reagents = list( "sodiumchloride", "blackpepper", diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index c87f66047f9..09182ddc4eb 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -1,5 +1,14 @@ /obj/machinery/chem_heater name = "chemical heater" + desc = "Простая машина, представляющая собой камеру для нагрева помещённых ёмкостей. Не смотря на своё название, также может охлаждать." + ru_names = list( + NOMINATIVE = "химический нагреватель", + GENITIVE = "химического нагревателя", + DATIVE = "химическому нагревателю", + ACCUSATIVE = "химический нагреватель", + INSTRUMENTAL = "химическим нагревателем", + PREPOSITIONAL = "химическом нагревателе" + ) density = TRUE anchored = TRUE icon = 'icons/obj/chemical.dmi' @@ -28,6 +37,13 @@ for(var/obj/item/stock_parts/micro_laser/M in component_parts) speed_increase += 5 * (M.rating - 1) +/obj/machinery/chem_heater/examine(mob/user) + . = ..() + if(panel_open) + . += span_notice("Панель техобслуживания открыта.") + if(Adjacent(user)) + . += span_info("Используйте Alt + ЛКМ, чтобы извлечь ёмкость.") + /obj/machinery/chem_heater/process() ..() if(stat & (NOPOWER|BROKEN)) @@ -55,6 +71,7 @@ beaker.forceMove(get_turf(src)) if(user && Adjacent(user) && !issilicon(user)) user.put_in_hands(beaker, ignore_anim = FALSE) + balloon_alert(user, "ёмкость извлечена") beaker = null on = FALSE update_icon(UPDATE_ICON_STATE) @@ -72,18 +89,22 @@ if(istype(I, /obj/item/reagent_containers/glass)) add_fingerprint(user) if(beaker) - to_chat(user, span_warning("The [name] already has [beaker] loaded.")) + balloon_alert(user, "слот для ёмкости занят!") return ATTACK_CHAIN_PROCEED if(!user.drop_transfer_item_to_loc(I, src)) return ..() beaker = I - to_chat(user, span_notice("You have inserted [I] into [src].")) + balloon_alert(user, "ёмкость установлена") SStgui.update_uis(src) update_icon(UPDATE_ICON_STATE) return ATTACK_CHAIN_BLOCKED_ALL return ..() +/obj/machinery/chem_heater/AltClick(mob/living/user) + eject_beaker(user) + add_fingerprint(user) + /obj/machinery/chem_heater/wrench_act(mob/user, obj/item/I) . = TRUE @@ -95,6 +116,7 @@ /obj/machinery/chem_heater/crowbar_act(mob/user, obj/item/I) if(!panel_open) + balloon_alert(user, "техпанель закрыта!") return . = TRUE eject_beaker() @@ -139,7 +161,7 @@ ui = SStgui.try_update_ui(user, src, ui) if(!ui) - ui = new(user, src, "ChemHeater", "Chemical Heater") + ui = new(user, src, "ChemHeater", "Химический нагреватель") ui.open() /obj/machinery/chem_heater/ui_data(mob/user) diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 3348df63932..d33e374dc6d 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -12,7 +12,15 @@ /obj/machinery/chem_master name = "\improper ChemMaster 3000" - desc = "Used to turn reagents into pills, patches, and store them in bottles." + desc = "Химическое оборудование, предназначенное для преобразования реагентов в таблетки, пластыри и бутылки." + ru_names = list( + NOMINATIVE = "ХимМастер 3000", + GENITIVE = "ХимМастера 3000", + DATIVE = "ХимМастеру 3000", + ACCUSATIVE = "ХимМастер 3000", + INSTRUMENTAL = "ХимМастером 3000", + PREPOSITIONAL = "ХимМастере 3000" + ) density = TRUE anchored = TRUE icon = 'icons/obj/chemical.dmi' @@ -87,6 +95,13 @@ for(var/obj/item/reagent_containers/glass/beaker/B in component_parts) reagents.maximum_volume += B.reagents.maximum_volume +/obj/machinery/chem_master/examine(mob/user) + . = ..() + if(panel_open) + . += span_notice("Панель техобслуживания открыта.") + if(Adjacent(user)) + . += span_info("Используйте Alt + ЛКМ, чтобы извлечь ёмкость.") + /obj/machinery/chem_master/ex_act(severity) if(severity < 3) if(beaker) @@ -132,17 +147,17 @@ if(istype(I, /obj/item/reagent_containers/glass) || istype(I, /obj/item/reagent_containers/food/drinks/drinkingglass)) add_fingerprint(user) if(panel_open) - to_chat(user, span_warning("Close the maintenance panel first.")) + balloon_alert(user, "техпанель открыта!") return ATTACK_CHAIN_PROCEED if(!user.drop_transfer_item_to_loc(I, src)) return ..() if(beaker) - to_chat(user, span_notice("You have swapped [beaker] with [I].")) + balloon_alert(user, "ёмкость заменена") beaker.forceMove(drop_location()) if(Adjacent(user) && !issilicon(user)) //Prevents telekinesis from putting in hand user.put_in_hands(beaker, ignore_anim = FALSE) else - to_chat(user, span_notice("You have inserted [I] into [src].")) + balloon_alert(user, "ёмкость установлена") beaker = I SStgui.update_uis(src) update_icon() @@ -151,23 +166,36 @@ if(istype(I, /obj/item/storage/pill_bottle)) add_fingerprint(user) if(panel_open) - to_chat(user, span_warning("Close the maintenance panel first.")) + balloon_alert(user, "техпанель открыта!") return ATTACK_CHAIN_PROCEED if(loaded_pill_bottle) - to_chat(user, span_warning("The [loaded_pill_bottle.name] is already inserted into [src].")) + balloon_alert(user, "слот занят!") return ATTACK_CHAIN_PROCEED if(!user.drop_transfer_item_to_loc(I, src)) return ..() loaded_pill_bottle = I - to_chat(user, span_notice("You have inserted [I] into the dispenser slot.")) + balloon_alert(user, "контейнер установлен") SStgui.update_uis(src) return ATTACK_CHAIN_BLOCKED_ALL return ..() +/obj/machinery/chem_master/AltClick(mob/living/user) + if(!beaker) + return + beaker.forceMove(get_turf(src)) + if(Adjacent(user) && !issilicon(user)) + user.put_in_hands(beaker, ignore_anim = FALSE) + balloon_alert(user, "ёмкость извлечена") + beaker = null + add_fingerprint(user) + reagents.clear_reagents() + update_icon() + /obj/machinery/chem_master/crowbar_act(mob/user, obj/item/I) if(!panel_open) + balloon_alert(user, "техпанель закрыта!") return if(default_deconstruction_crowbar(user, I)) return TRUE @@ -186,6 +214,7 @@ /obj/machinery/chem_master/wrench_act(mob/user, obj/item/I) if(panel_open) + balloon_alert(user, "техпанель открыта!") return return default_unfasten_wrench(user, I, 4 SECONDS) @@ -221,20 +250,20 @@ var/datum/reagent/R = reagent_list[idx] printing = TRUE - visible_message(span_notice("[src] rattles and prints out a sheet of paper.")) + visible_message(span_notice("[capitalize(declent_ru(NOMINATIVE))] дребезжит, после чего из окна печати выпадает лист бумаги.")) playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1) var/obj/item/paper/P = new /obj/item/paper(loc) - P.info = "
Chemical Analysis

" - P.info += "Time of analysis: [station_time_timestamp()]

" - P.info += "Chemical name: [R.name]
" + P.info = "
Химический анализ

" + P.info += "Время анализа: [station_time_timestamp()]

" + P.info += "Название реагента: [R.name]
" if(istype(R, /datum/reagent/blood)) var/datum/reagent/blood/B = R - P.info += "Description: N/A
Blood Type: [B.data["blood_type"]]
DNA: [B.data["blood_species"]]" + P.info += "Описание: Н/Д
Группа крови: [B.data["blood_type"]]
ДНК: [B.data["blood_species"]]" else - P.info += "Description: [R.description]" - P.info += "

Notes:
" - P.name = "Chemical Analysis - [R.name]" + P.info += "Описание: [R.description]" + P.info += "

Заметки:
" + P.name = "Химический анализ - [R.name]" spawn(50) printing = FALSE @@ -294,6 +323,7 @@ if(pill_bottle_wrappers[new_color]) loaded_pill_bottle.wrapper_color = new_color loaded_pill_bottle.apply_wrap() + playsound(loc, 'sound/effects/spray.ogg', 10, TRUE) else . = FALSE @@ -353,7 +383,7 @@ /obj/machinery/chem_master/ui_interact(mob/user, datum/tgui/ui = null) ui = SStgui.try_update_ui(user, src, ui) if(!ui) - ui = new(user, src, "ChemMaster", name) + ui = new(user, src, "ChemMaster", "ХимМастер 3000") ui.open() /obj/machinery/chem_master/ui_assets(mob/user) @@ -479,12 +509,12 @@ if("addcustom") if(!beaker || !beaker.reagents.total_volume) return - ui_modal_input(src, id, "Please enter the amount to transfer to buffer:", null, arguments, useramount) + ui_modal_input(src, id, "Укажите объём вещества для переноса в буфер:", null, arguments, useramount) if("removecustom") if(!reagents.total_volume) return - ui_modal_input(src, id, "Please enter the amount to transfer to [mode ? "beaker" : "disposal"]:", null, arguments, useramount) + ui_modal_input(src, id, "Укажите объём вещества для [mode ? "переноса в ёмкость" : "удаления"]:", null, arguments, useramount) else return FALSE @@ -520,7 +550,15 @@ /obj/machinery/chem_master/condimaster name = "\improper CondiMaster 3000" - desc = "Used to remove reagents from that single beaker you're using, or create condiment packs and bottles; your choice." + desc = "Химическое оборудование, специализированное под кулинарные нужды. Позволяет создавать пакеты со специями или бутыли, как вы того пожелаете." + ru_names = list( + NOMINATIVE = "КондиМастер 3000", + GENITIVE = "КондиМастера 3000", + DATIVE = "КондиМастеру 3000", + ACCUSATIVE = "КондиМастер 3000", + INSTRUMENTAL = "КондиМастером 3000", + PREPOSITIONAL = "КондиМастере 3000" + ) condi = TRUE /obj/machinery/chem_master/condimaster/Initialize(mapload) @@ -565,7 +603,7 @@ return get_base_placeholder_name(reagents, clamp(reagents.total_volume / set_items_amount, 0, max_units_per_item)) /datum/chemical_production_mode/proc/get_base_placeholder_name(datum/reagents/reagents, amount_per_item) - return "[reagents.get_master_reagent_name()] ([amount_per_item]u)" + return "[reagents.get_master_reagent_name()] ([amount_per_item] ед.)" /** public @@ -593,12 +631,12 @@ var/data = list("count" = count) for(var/i in 1 to count) if(reagents.total_volume <= 0) - to_chat(user, span_warning("Not enough reagents to create these items!")) + to_chat(user, span_warning("Недостаточно реагентов для создания этого предмета!")) return var/obj/item/reagent_containers/P = new item_type(location) if(!isnull(medicine_name)) - P.name = "[medicine_name][name_suffix]" + P.name = "[name_suffix][medicine_name]" P.pixel_x = rand(-7, 7) // Random position P.pixel_y = rand(-7, 7) configure_item(data, reagents, P) @@ -610,23 +648,23 @@ /datum/chemical_production_mode/pills mode_id = "pills" - production_name = "Pills" + production_name = "Таблетки" production_icon = "pills" item_type = /obj/item/reagent_containers/food/pill max_items_amount = MAX_MULTI_AMOUNT max_units_per_item = MAX_UNITS_PER_PILL - name_suffix = " pill" + name_suffix = "Таблетка - " sprite_mask = "pill" sprites_amount = MAX_PILL_SPRITE /datum/chemical_production_mode/patches mode_id = "patches" - production_name = "Patches" + production_name = "Пластыри" production_icon = "plus-square" item_type = /obj/item/reagent_containers/food/pill/patch max_items_amount = MAX_MULTI_AMOUNT max_units_per_item = MAX_UNITS_PER_PATCH - name_suffix = " patch" + name_suffix = "Пластырь - " sprite_mask = "bandaid" sprites_amount = MAX_PATCH_SPRITE @@ -649,21 +687,21 @@ /datum/chemical_production_mode/bottles mode_id = "chem_bottles" - production_name = "Bottles" + production_name = "Бутылки" production_icon = "wine-bottle" item_type = /obj/item/reagent_containers/glass/bottle/reagent sprites = list("bottle", "small_bottle", "wide_bottle", "round_bottle", "reagent_bottle") max_items_amount = 5 max_units_per_item = 50 - name_suffix = " bottle" + name_suffix = "Бутылка - " /datum/chemical_production_mode/bottles/get_base_placeholder_name(datum/reagents/reagents, amount_per_item) return reagents.get_master_reagent_name() /datum/chemical_production_mode/condiment_bottles mode_id = "condi_bottles" - production_name = "Bottles" + production_name = "Бутылки" production_icon = "wine-bottle" item_type = /obj/item/reagent_containers/food/condiment max_items_amount = 5 @@ -673,12 +711,12 @@ /datum/chemical_production_mode/condiment_packs mode_id = "condi_packets" - production_name = "Packet" + production_name = "Упаковки для специй" production_icon = "bacon" item_type = /obj/item/reagent_containers/food/condiment/pack max_items_amount = 10 max_units_per_item = 10 - name_suffix = " pack" + name_suffix = "Пакет для специй - " /datum/chemical_production_mode/condiment_packs/get_base_placeholder_name(datum/reagents/reagents, amount_per_item) return reagents.get_master_reagent_name() diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index e6c201a8d56..c1cf5022346 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -1,6 +1,14 @@ /obj/machinery/computer/pandemic - name = "PanD.E.M.I.C 2200" - desc = "Используется для работы с вирусами." + name = "PanD.E.M.I.C 220" + desc = "Высокотехнологичная машина, предназначенная для исследования и работы с вирусными культурами. Лучший друг вирусолога!" + ru_names = list( + NOMINATIVE = "Панд.Е.М.И.К 220", + GENITIVE = "Панд.Е.М.И.К 220", + DATIVE = "Панд.Е.М.И.К 220", + ACCUSATIVE = "Панд.Е.М.И.К 220", + INSTRUMENTAL = "Панд.Е.М.И.К 220", + PREPOSITIONAL = "Панд.Е.М.И.К 220" + ) density = TRUE anchored = TRUE icon = 'icons/obj/chemical.dmi' @@ -14,6 +22,13 @@ var/wait = null var/obj/item/reagent_containers/beaker = null +/obj/machinery/computer/pandemic/examine(mob/user) + . = ..() + if(panel_open) + . += span_notice("Панель техобслуживания открыта.") + if(Adjacent(user)) + . += span_info("Используйте Alt + ЛКМ, чтобы извлечь ёмкость.") + /obj/machinery/computer/pandemic/New() ..() update_icon() @@ -78,7 +93,7 @@ B.pixel_y = rand(-3, 3) var/path = GetResistancesByIndex(text2num(href_list["create_vaccine"])) var/vaccine_type = path - var/vaccine_name = "Unknown" + var/vaccine_name = "Неизвестно" if(!ispath(vaccine_type)) if(GLOB.archive_diseases[path]) @@ -93,11 +108,11 @@ if(vaccine_type) - B.name = "[vaccine_name] vaccine bottle" + B.name = "бутылёк вакцины \"[vaccine_name]\"" B.reagents.add_reagent("vaccine", 15, list(vaccine_type)) replicator_cooldown(200) else - temp_html = "The replicator is not ready yet." + temp_html = "Репликатор ещё не готов." updateUsrDialog() return else if(href_list["create_disease_culture"]) @@ -112,7 +127,7 @@ copy = D.Copy() if(!copy) return - var/name = tgui_input_text(usr, "Name:", "Name the culture", D.name, MAX_NAME_LEN) + var/name = tgui_input_text(usr, "Название:", "Введите название культуры", D.name, MAX_NAME_LEN) if(name == null || wait) return var/obj/item/reagent_containers/glass/bottle/B = new(loc) @@ -121,12 +136,12 @@ B.pixel_y = rand(-3, 3) replicator_cooldown(50) var/list/data = list("diseases"=list(copy)) - B.name = "[name] culture bottle" - B.desc = "A small bottle. Contains [copy.agent] culture in synthblood medium." + B.name = "бутылёк культуры \"[name]\"" + B.desc = "Небольшой бутылёк. Содержит синтетическую кровь, заражённую культурой \"[copy.agent]\"." B.reagents.add_reagent("blood",20,data) updateUsrDialog() else - temp_html = "The replicator is not ready yet." + temp_html = "Репликатор ещё не готов." updateUsrDialog() return else if(href_list["empty_beaker"]) @@ -143,7 +158,7 @@ updateUsrDialog() return else if(href_list["name_disease"]) - var/new_name = tgui_input_text(usr, "Name the Disease", "New Name", max_length = MAX_NAME_LEN) + var/new_name = tgui_input_text(usr, "Назовите вирус:", "Введите название вируса", max_length = MAX_NAME_LEN) if(!new_name) return if(..()) @@ -168,8 +183,19 @@ add_fingerprint(usr) +/obj/machinery/computer/pandemic/AltClick(mob/living/user) + beaker.forceMove(loc) + if(Adjacent(user) && !issilicon(user)) + user.put_in_hands(beaker, ignore_anim = FALSE) + beaker = null + icon_state = "mixer0" + balloon_alert(user, "ёмкость извлечена") + add_fingerprint(user) + /obj/machinery/computer/pandemic/proc/eject_beaker() beaker.forceMove(loc) + if(Adjacent(usr) && !issilicon(usr)) + usr.put_in_hands(beaker, ignore_anim = FALSE) beaker = null icon_state = "mixer0" @@ -188,13 +214,13 @@ var/signature if(tgui_alert(user, "Вы хотите подписать этот документ?", "Подпись", list("Да","Нет")) == "Да") - signature = "[user ? user.real_name : "Аноним"]" + signature = "[user ? user.real_name : "Неизвестный"]" else signature = "" printing = 1 var/obj/item/paper/P = new /obj/item/paper(loc) - visible_message("[src] гремит и печатает лист бумаги.") + visible_message(span_notice("[capitalize(declent_ru(NOMINATIVE))] дребезжит, после чего из окна печати выпадает лист бумаги.")) playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1) P.info = "
Выпуск вируса
" @@ -223,7 +249,7 @@ if(temp_html) dat += "[temp_html]

Главное меню" else if(!beaker) - dat += "Пожалуйста, вставьте мензурку.
" + dat += "Пожалуйста, вставьте ёмкость.
" dat += "Закрыть" else var/datum/reagents/R = beaker.reagents @@ -236,15 +262,15 @@ continue break if(!R.total_volume||!R.reagent_list.len) - dat += "Мензурка пуста
" + dat += "Ёмкость пуста
" else if(!Blood) - dat += "В мензурке отсутствует образец крови." + dat += "В ёмкости отсутствует образец крови." else if(!Blood.data) - dat += "В мензурке отсутствует данные крови." + dat += "В ёмкости отсутствует данные крови." else dat += "

Данные образца крови:

" dat += "ДНК крови: [(Blood.data["blood_DNA"]||"нет")]
" - dat += "Тип крови: [(Blood.data["blood_type"]||"нет")]
" + dat += "Группа крови: [(Blood.data["blood_type"]||"нет")]
" dat += "Тип расовой крови: [(Blood.data["blood_species"]||"нет")]
" dat += "

Данные о заболеваниях:

" @@ -296,7 +322,7 @@ var/i = 0 for(var/type in Blood.data["resistances"]) i++ - var/disease_name = "Unknown" + var/disease_name = "Неизвестно" if(!ispath(type)) var/datum/disease/virus/advance/A = GLOB.archive_diseases[type] @@ -312,7 +338,7 @@ dat += "
Не содержит антител
" else dat += "
Не содержит антител
" - dat += "
Извлечь мензурку[((R.total_volume&&R.reagent_list.len) ? "-- Очистить и извлечь мензурку":"")]
" + dat += "
Извлечь ёмкость[((R.total_volume&&R.reagent_list.len) ? "-- Очистить и извлечь ёмкость":"")]
" dat += "Закрыть" var/datum/browser/popup = new(user, "pandemic", name, 575, 480) @@ -328,15 +354,15 @@ if(istype(I, /obj/item/reagent_containers)) add_fingerprint(user) if(!(I.container_type & OPENCONTAINER)) - to_chat(user, span_warning("The [I.name] is incompatible.")) + balloon_alert(user, "несовместимо!") return ATTACK_CHAIN_PROCEED if(beaker) - to_chat(user, span_warning("The [name] already has [beaker] loaded.")) + balloon_alert(user, "слот для ёмкости занят!") return ATTACK_CHAIN_PROCEED if(!user.drop_transfer_item_to_loc(I, src)) return ..() beaker = I - to_chat(user, span_notice("You have inserted [I] into [src].")) + balloon_alert(user, "ёмкость вставлена") updateUsrDialog() update_icon(UPDATE_ICON_STATE) return ATTACK_CHAIN_BLOCKED_ALL @@ -348,6 +374,7 @@ . = TRUE if(!beaker) add_fingerprint(user) + balloon_alert(user, "ёмкость отсутствует!") to_chat(user, span_warning("There is no beaker installed.")) return . if(!I.use_tool(src, user, volume = I.tool_volume)) diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index 3ca90cc829d..2603529dec2 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -1,5 +1,14 @@ /obj/machinery/reagentgrinder name = "\improper All-In-One Grinder" + desc = "Измельчает, дробит, разжижает и извлекает вещества из предметов, помещённых внутрь. Ради всего святого, не суйте туда свои пальцы." + ru_names = list( + NOMINATIVE = "универсальный блендер", + GENITIVE = "универсального блендера", + DATIVE = "универсальному блендеру", + ACCUSATIVE = "универсальный блендер", + INSTRUMENTAL = "универсальным блендером", + PREPOSITIONAL = "универсальном блендере" + ) icon = 'icons/obj/kitchen.dmi' icon_state = "juicer1" layer = 2.9 @@ -96,6 +105,13 @@ var/list/holdingitems = list() +/obj/machinery/reagentgrinder/examine(mob/user) + . = ..() + if(panel_open) + . += span_notice("Панель техобслуживания открыта.") + if(Adjacent(user)) + . += span_info("Используйте Alt + ЛКМ, чтобы извлечь ёмкость.") + /obj/machinery/reagentgrinder/empty icon_state = "juicer0" beaker = null @@ -143,6 +159,7 @@ if(!anchored || beaker) return if(!panel_open) + balloon_alert(user, "панель закрыта!") return if(!I.tool_use_check(user, 0)) return @@ -173,15 +190,15 @@ if(istype(I, /obj/item/reagent_containers) && (I.container_type & OPENCONTAINER)) add_fingerprint(user) if(panel_open) - to_chat(user, span_warning("Close the maintenance panel first.")) + balloon_alert(user, "панель открыта!") return ATTACK_CHAIN_PROCEED if(beaker) - to_chat(user, span_warning("The [name] already has [beaker] loaded.")) + balloon_alert(user, "слот для ёмкости занят!") return ATTACK_CHAIN_PROCEED if(!user.drop_transfer_item_to_loc(I, src)) return ..() beaker = I - to_chat(user, span_notice("You have inserted [I] into [src].")) + balloon_alert(user, "ёмкость установлена") updateUsrDialog() update_icon(UPDATE_ICON_STATE) return ATTACK_CHAIN_BLOCKED_ALL @@ -190,11 +207,11 @@ if(is_type_in_list(I, dried_items) && istype(I, /obj/item/reagent_containers/food/snacks/grown)) var/obj/item/reagent_containers/food/snacks/grown/grown = I if(!grown.dry) - to_chat(user, span_warning("You must dry that first.")) + balloon_alert(user, "сначала высушите!") return ATTACK_CHAIN_PROCEED if(length(holdingitems) >= limit) - to_chat(user, span_warning("The [name] cannot hold anymore items.")) + balloon_alert(user, "нет места!") return ATTACK_CHAIN_PROCEED //Fill machine with a bag! @@ -202,7 +219,7 @@ var/obj/item/storage/bag/bag = I var/original_contents_len = length(bag.contents) if(!length(bag.contents)) - to_chat(user, span_warning("The [bag.name] is empty.")) + balloon_alert(user, "нечего загружать!") return ATTACK_CHAIN_PROCEED for(var/obj/item/thing as anything in bag.contents) @@ -214,21 +231,27 @@ var/new_contents_len = length(bag.contents) if(new_contents_len == original_contents_len) - to_chat(user, span_warning("Nothing in [bag] can be put into [src].")) + balloon_alert(user, "нечего загружать!") return ATTACK_CHAIN_PROCEED - - to_chat(user, span_notice("You have emptied [new_contents_len ? "some" : "all"] of [bag]'s contents into [src].")) + user.visible_message( + span_notice("[user] загрузил[pluralize_ru(user.gender, "", "а", "о", "и")] содержимое [bag.declent_ru(GENITIVE)] в [declent_ru(ACCUSATIVE)]."), + span_notice("Вы загрузили содержимое [bag.declent_ru(GENITIVE)] в [declent_ru(ACCUSATIVE)].")) + balloon_alert(user, "содержимое загружено") updateUsrDialog() return ATTACK_CHAIN_PROCEED_SUCCESS if(!is_type_in_list(I, blend_items) && !is_type_in_list(I, juice_items)) - to_chat(user, span_warning("Cannot refine [I] into a reagent.")) + balloon_alert(user, "не подходит!") return ATTACK_CHAIN_PROCEED if(!user.drop_transfer_item_to_loc(I, src)) return ..() holdingitems += I + user.visible_message( + span_notice("[user] загрузил[pluralize_ru(user.gender, "", "а", "о", "и")] [I.declent_ru(ACCUSATIVE)] в [declent_ru(ACCUSATIVE)]."), + span_notice("Вы загрузили [I.declent_ru(ACCUSATIVE)] в [declent_ru(ACCUSATIVE)].")) + balloon_alert(user, "загружено в камеру") updateUsrDialog() return ATTACK_CHAIN_BLOCKED_ALL @@ -252,40 +275,40 @@ if(!operating) for (var/obj/item/O in holdingitems) - processing_chamber += "\A [O.name]
" + processing_chamber += "\A [O.declent_ru(NOMINATIVE)]
" if (!processing_chamber) is_chamber_empty = 1 - processing_chamber = "Nothing." + processing_chamber = "Ничего." if (!beaker) - beaker_contents = "No beaker attached.
" + beaker_contents = "Ёмкость не установлена.
" else is_beaker_ready = 1 - beaker_contents = "The beaker contains:
" + beaker_contents = "Содержимое ёмкости:
" var/anything = 0 for(var/datum/reagent/R in beaker.reagents.reagent_list) anything = 1 beaker_contents += "[R.volume] - [R.name]
" if(!anything) - beaker_contents += "Nothing
" + beaker_contents += "Ничего
" dat += {" - Processing chamber contains:
+ Содержимое камеры:
[processing_chamber]
[beaker_contents]
"} if (is_beaker_ready && !is_chamber_empty && !(stat & (NOPOWER|BROKEN))) - dat += "Grind the reagents
" - dat += "Juice the reagents

" + dat += "Измельчить
" + dat += "Выжать

" if(holdingitems && holdingitems.len > 0) - dat += "Eject the reagents
" + dat += "Вынуть содержимое камеры
" if (beaker) - dat += "Detach the beaker
" + dat += "Извлечь ёмкость
" else - dat += "Please wait..." + dat += "Пожалуйста, подождите..." - var/datum/browser/popup = new(user, "reagentgrinder", "All-In-One Grinder") + var/datum/browser/popup = new(user, "reagentgrinder", "Универсальный блендер") popup.set_content(dat) popup.open(1) return @@ -307,19 +330,31 @@ if ("detach") detach() -/obj/machinery/reagentgrinder/proc/detach() +/obj/machinery/reagentgrinder/AltClick(mob/living/user) + if(!beaker) + return + beaker.forceMove(loc) + if(Adjacent(user) && !issilicon(user)) + user.put_in_hands(beaker, ignore_anim = FALSE) + balloon_alert(user, "ёмкость извлечена") + beaker = null + add_fingerprint(user) + update_icon(UPDATE_ICON_STATE) + updateUsrDialog() +/obj/machinery/reagentgrinder/proc/detach() if (usr.stat != 0) return if (!beaker) return beaker.loc = src.loc + if(Adjacent(usr) && !issilicon(usr)) + usr.put_in_hands(beaker, ignore_anim = FALSE) beaker = null update_icon(UPDATE_ICON_STATE) updateUsrDialog() /obj/machinery/reagentgrinder/proc/eject() - if (usr.stat != 0) return if (holdingitems && holdingitems.len == 0) diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm index 4eacc7768a4..1827878b2fd 100644 --- a/code/modules/surgery/organs/organ_external.dm +++ b/code/modules/surgery/organs/organ_external.dm @@ -950,7 +950,7 @@ Note that amputating the affected organ does in fact remove the infection from t INVOKE_ASYNC(owner, TYPE_PROC_REF(/mob, emote), "scream") status |= ORGAN_BROKEN - broken_description = pick("broken", "fracture", "hairline fracture") + broken_description = pick("Смещение кости", "Перелом", "Микротрещина") perma_injury = brute_dam // Fractures have a chance of getting you out of restraints diff --git a/code/modules/tgui/modules/crew_monitor.dm b/code/modules/tgui/modules/crew_monitor.dm index 8f8a8653c12..ac7443a58a0 100644 --- a/code/modules/tgui/modules/crew_monitor.dm +++ b/code/modules/tgui/modules/crew_monitor.dm @@ -1,5 +1,5 @@ /datum/ui_module/crew_monitor - name = "Crew monitor" + name = "Монитор наблюдения за экипажем" var/crew_vision = CREW_VISION_COMMON /datum/ui_module/crew_monitor/ui_act(action, params) @@ -8,7 +8,7 @@ var/turf/T = get_turf(ui_host()) if(!T || !is_level_reachable(T.z)) - to_chat(usr, "Unable to establish a connection: You're too far away from the station!") + to_chat(usr, span_danger("Удалённый сервер не отвечает на запросы") + ": база данных вне зоны досягаемости.") return FALSE switch(action) @@ -25,7 +25,7 @@ ui = SStgui.try_update_ui(user, src, ui) if(GLOB.communications_blackout) - to_chat(user, span_warning("Monitor shows strange symbols. There is no useful information, because of noise.")) + to_chat(user, span_warning("Монитор показывает странные символы. Разобрать в них что-то невозможно.")) if(ui) ui.close() return diff --git a/code/modules/tgui/plugins/login.dm b/code/modules/tgui/plugins/login.dm index 7b3c57a4efc..17c1272503f 100644 --- a/code/modules/tgui/plugins/login.dm +++ b/code/modules/tgui/plugins/login.dm @@ -137,21 +137,21 @@ GLOBAL_LIST(ui_logins) state.rank = state.id.assignment state.access = state.id.access else - to_chat(usr, "Access Denied.") + to_chat(usr, "Отказано в доступе.") return else if(login_type == LOGIN_TYPE_AI && (isAI(usr) || ispAI(usr))) state.name = usr.name state.rank = JOB_TITLE_AI else if(iscogscarab(usr)) - to_chat(usr, "Access Denied.") + to_chat(usr, "Отказано в доступе.") return else if(login_type == LOGIN_TYPE_ROBOT && isrobot(usr)) var/mob/living/silicon/robot/R = usr state.name = usr.name state.rank = "[R.modtype] [R.braintype]" else if(login_type == LOGIN_TYPE_ADMIN && usr.can_admin_interact()) - state.name = "*CONFIDENTIAL*" - state.rank = "CentComm Secure Connection" + state.name = "*ЗАСЕКРЕЧЕНО*" + state.rank = "Защищённый канал ЦентКома" state.access = get_all_accesses() + get_all_centcom_access() state.logged_in = TRUE diff --git a/tgui/packages/tgui/interfaces/BodyScanner.js b/tgui/packages/tgui/interfaces/BodyScanner.js index 0ddad70e91f..6aceee59039 100644 --- a/tgui/packages/tgui/interfaces/BodyScanner.js +++ b/tgui/packages/tgui/interfaces/BodyScanner.js @@ -16,33 +16,33 @@ import { import { Window } from '../layouts'; const stats = [ - ['good', 'Alive'], - ['average', 'Critical'], - ['bad', 'DEAD'], + ['good', 'Норма'], + ['average', 'Критическое состояние'], + ['bad', 'Зафиксирована смерть'], ]; const abnormalities = [ [ 'hasBorer', 'bad', - 'Large growth detected in frontal lobe,' + - ' possibly cancerous. Surgical removal is recommended.', + 'В лобной доле обнаружено крупное образование,' + + ' возможно, злокачественное. Рекомендуется хирургическое удаление.', ], - ['hasVirus', 'bad', 'Viral pathogen detected in blood stream.'], - ['blind', 'average', 'Cataracts detected.'], - ['colourblind', 'average', 'Photoreceptor abnormalities detected.'], - ['nearsighted', 'average', 'Retinal misalignment detected.'], + ['hasVirus', 'bad', 'Обнаружен вирус в кровотоке пациента.'], + ['blind', 'average', 'Обнаружена катаракта.'], + ['colourblind', 'average', 'Обнаружены нарушения в работе фоторецепторов'], + ['nearsighted', 'average', 'Обнаружено смещение сетчатки.'], ]; const damages = [ - ['Respiratory', 'oxyLoss'], - ['Brain', 'brainLoss'], - ['Toxin', 'toxLoss'], - ['Radioactive', 'radLoss'], - ['Brute', 'bruteLoss'], - ['Genetic', 'cloneLoss'], - ['Burn', 'fireLoss'], - ['Paralysis', 'paralysis'], + ['Удушение', 'oxyLoss'], + ['Повреждение мозга', 'brainLoss'], + ['Токсины', 'toxLoss'], + ['Радиационное поражение', 'radLoss'], + ['Физические повреждения', 'bruteLoss'], + ['Генетические повреждения', 'cloneLoss'], + ['Ожоги', 'fireLoss'], + ['Паралич тела', 'paralysis'], ]; const damageRange = { @@ -75,25 +75,25 @@ const reduceOrganStatus = (A) => { const germStatus = (i) => { if (i > 100) { if (i < 300) { - return 'mild infection'; + return 'Лёгкая инфекция'; } if (i < 400) { - return 'mild infection+'; + return 'Лёгкая инфекция+'; } if (i < 500) { - return 'mild infection++'; + return 'Лёгкая инфекция++'; } if (i < 700) { - return 'acute infection'; + return 'Острая инфекция'; } if (i < 800) { - return 'acute infection+'; + return 'Острая инфекция+'; } if (i < 900) { - return 'acute infection++'; + return 'Острая инфекция++'; } if (i >= 900) { - return 'septic'; + return 'Сепсис'; } } @@ -109,7 +109,7 @@ export const BodyScanner = (props, context) => { ); return ( - + {body} ); @@ -133,11 +133,11 @@ const BodyScannerMainOccupant = (props, context) => { const { occupant } = data; return (