diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index d5f7031309d..e1d9a031e38 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -16,9 +16,9 @@ pass_flags = PASSFLAPS AI_delay_max = 0 SECONDS - speak_emote = list("states") + speak_emote = list("констатирует") tts_seed = null - friendly = "boops" + friendly = "утыкается в" bubble_icon = "machine" faction = list("neutral", "silicon") @@ -28,7 +28,7 @@ var/bot_core_type = /obj/machinery/bot_core var/list/users = list() //for dialog updates var/window_id = "bot_control" - var/window_name = "Protobot 1.0" //Popup title + var/window_name = "ПротоБот 1.0" //Popup title /// 0 for default size var/window_width = 0 var/window_height = 0 @@ -115,7 +115,7 @@ /// The type of bot it is. var/model = "" - var/bot_purpose = "improve the station to the best of your ability" + var/bot_purpose = "принести станции как можно больше пользы исходя из своих возможностей" /// Bot control frequency var/control_freq = BOT_FREQ /// The radio filter the bot uses to identify itself on the network. @@ -125,11 +125,11 @@ /// The type of data HUD the bot uses. Diagnostic by default. var/data_hud_type = DATA_HUD_DIAGNOSTIC /// This holds text for what the bot is mode doing, reported on the remote bot control interface. - var/list/mode_name = list("In Pursuit","Preparing to Arrest", "Arresting", \ - "Beginning Patrol", "Patrolling", "Summoned by PDA", \ - "Cleaning", "Repairing", "Proceeding to work site", "Healing", \ - "Responding", "Navigating to Delivery Location", "Navigating to Home", \ - "Waiting for clear path", "Calculating navigation path", "Pinging beacon network", "Unable to reach destination") + var/list/mode_name = list("В погоне","Подготовка к задержанию", "Процесс задержания", \ + "Начало патрулирования", "Патрулирование", "Вызов через ПДА", \ + "Уборка", "Ремонтные работы", "Движение к месту проведения ремонтных работ", "Проведение лечебных процедур", \ + "Реакция на вызов", "Движению в локацию доставки", "Движение в домашнюю локацию", \ + "Препятствие на маршруте", "Расчёт навигационного маршрута", "Запрос сети радиомаячков", "Точка маршрута недоступна") var/datum/atom_hud/data/bot_path/path_hud = new /datum/atom_hud/data/bot_path() var/path_image_icon = 'icons/obj/aibots.dmi' @@ -165,15 +165,15 @@ /mob/living/simple_animal/bot/proc/get_mode() if(client) //Player bots do not have modes, thus the override. Also an easy way for PDA users/AI to know when a bot is a player. if(paicard) - return "pAI Controlled" + return "Под управлением ПИИ" else - return "Autonomous" + return "Автономный режим" else if(!on) - return span_bad("Inactive") + return span_bad("Отключён") else if(hijacked) - return "ERROR" + return span_bad("ОШИБКА") else if(!mode) - return span_good("Idle") + return span_good("Бездействие") else return span_average("[mode_name[mode]]") @@ -292,7 +292,7 @@ locked = FALSE emagged = 1 if(user) - to_chat(user, span_notice("You bypass [src]'s controls.")) + to_chat(user, span_notice("Вы взламываете систему управления [declent_ru(GENITIVE)].")) return if(!locked && open) //Bot panel is unlocked by ID or emag, and the panel is screwed open. Ready for emagging. @@ -303,23 +303,23 @@ locked = TRUE //Access denied forever! bot_reset() turn_on() //The bot automatically turns on when emagged, unless recently hit with EMP. - to_chat(src, span_userdanger("(#$*#$^^( OVERRIDE DETECTED")) + to_chat(src, span_userdanger("ПЕРЕГРУЗКА ВНУТРЕННИХ СИСТЕМ")) show_laws() return if(user) //Bot is unlocked, but the maint panel has not been opened with a screwdriver yet. - to_chat(user, span_warning("You need to open maintenance panel first!")) + balloon_alert(user, "техпанель закрыта!") /mob/living/simple_animal/bot/examine(mob/user) . = ..() if(health < maxHealth) if(health > maxHealth/3) - . += span_notice("[src]'s parts look loose.") + . += span_notice("[capitalize(declent_ru(NOMINATIVE))] выглядит слегка повреждённым.") else - . += span_warning("[src]'s parts look very loose!") + . += span_warning("[capitalize(declent_ru(NOMINATIVE))] выглядит сильно повреждённым!") else - . += span_notice("[src] is in pristine condition.") + . += span_notice("[capitalize(declent_ru(NOMINATIVE))] в отличном состоянии.") /mob/living/simple_animal/bot/adjustHealth( @@ -366,7 +366,7 @@ user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(src) apply_damage(user.attack_damage, BRUTE) - visible_message(span_danger("[user] has slashed [src]!")) + visible_message(span_danger("[user] руб[pluralize_ru(user.gender, "ит", "ят")] [declent_ru(GENITIVE)]!")) playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1) if(prob(10)) new /obj/effect/decal/cleanable/blood/oil(loc) @@ -377,7 +377,7 @@ if(user.melee_damage_upper == 0) return apply_damage(user.melee_damage_upper, BRUTE) - visible_message(span_danger("[user] has [user.attacktext] [src]!")) + visible_message(span_danger("[user] has [user.attacktext] [declent_ru(GENITIVE)]!")) add_attack_logs(user, src, "Animal attacked", ATKLOG_ALL) if(prob(10)) new /obj/effect/decal/cleanable/blood/oil(loc) @@ -398,7 +398,7 @@ if(!topic_denied(user)) interact(user) else - to_chat(user, span_warning("[src]'s interface is not responding!")) + to_chat(user, span_warning("Интерфейс [declent_ru(GENITIVE)] не отвечает!")) /mob/living/simple_animal/bot/proc/interact(mob/user) @@ -412,45 +412,45 @@ if(I.GetID() || is_pda(I)) add_fingerprint(user) if(emagged) - to_chat(user, span_danger("ERROR##?")) + balloon_alert(user, "ошибка") return ATTACK_CHAIN_PROCEED if(open) - to_chat(user, span_warning("Please close the access panel before locking it.")) + balloon_alert(user, "техпанель открыта!") return ATTACK_CHAIN_PROCEED if(!bot_core.allowed(user)) - to_chat(user, span_warning("Access denied.")) + balloon_alert(user, "отказано в доступе!") return ATTACK_CHAIN_PROCEED locked = !locked - to_chat(user, "Controls are now [locked ? "locked." : "unlocked."]") + balloon_alert(user, "техпанель [locked ? "заблокирована" : "разблокирована"]") return ATTACK_CHAIN_PROCEED_SUCCESS if(istype(I, /obj/item/paicard)) add_fingerprint(user) var/obj/item/paicard/card = I if(locked || open || hijacked) - to_chat(user, span_warning("The personality slot is locked.")) + balloon_alert(user, "слот для ПИИ заблокирован!") return ATTACK_CHAIN_PROCEED if(paicard) - to_chat(user, span_warning("The [paicard.name] is already inserted.")) + balloon_alert(user, "слот для ПИИ занят!") return ATTACK_CHAIN_PROCEED if(!card.pai || !card.pai.mind) - to_chat(user, span_warning("The [card.name] is inactive].")) + balloon_alert(user, "ПИИ не активен!") return ATTACK_CHAIN_PROCEED if(key || (!allow_pai && !card.pai.syndipai)) - to_chat(user, span_warning("The [name] is not compatible with [card].")) + balloon_alert(user, "робот не совместим с ПИИ!") return ATTACK_CHAIN_PROCEED if(!card.pai.ckey || jobban_isbanned(card.pai, ROLE_SENTIENT)) - to_chat(user, span_warning("The [card.name] is unable to establish a connection to [src].")) + balloon_alert(user, "ПИИ не совместим с роботом!") return ATTACK_CHAIN_PROCEED if(!user.drop_transfer_item_to_loc(card, src)) return ..() paicard = card user.visible_message( - span_notice("[user] has inserted [card] into [src]."), - span_notice("You have inserted [card] into [src]."), + span_notice("[user] помести[genderize_ru(user.gender, "л", "ла", "ло", "ли")] [card] в [declent_ru(GENITIVE)]."), + span_notice("Вы поместили [card] в [declent_ru(GENITIVE)]."), ) paicard.pai.mind.transfer_to(src) - to_chat(src, span_notice("You sense your form change as you are uploaded into [src].")) + to_chat(src, span_notice("Вы были установлены в [declent_ru(GENITIVE)]. Соединение с внутренними системами в процессе.")) bot_name = name name = paicard.pai.name faction = user.faction @@ -460,17 +460,18 @@ if(istype(I, /obj/item/hemostat)) if(open) - to_chat(user, span_warning("Please close the access panel before manipulating with the personality slot.")) + balloon_alert(user, "техпанель открыта!") return ATTACK_CHAIN_PROCEED if(!paicard) - to_chat(user, span_warning("The [name] has no personality card installed.")) + balloon_alert(user, "слот для ПИИ пуст!") return ATTACK_CHAIN_PROCEED - to_chat(user, span_notice("You attempt to pull [paicard] free...")) + balloon_alert(user, "извлечение ПИИ") if(!do_after(user, 3 SECONDS * I.toolspeed, src, category = DA_CAT_TOOL) || open || !paicard) return ATTACK_CHAIN_PROCEED - user.visible_message( - span_notice("[user] has pulled [paicard] out of [bot_name]!"), - span_notice("You have pulled [paicard] out of [bot_name]."), + balloon_alert(user, "ПИИ извлечён") + visible_message( + span_notice("[user] вытащи[genderize_ru(user.gender, "л", "ла", "ло", "ли")] [paicard] из [declent_ru(GENITIVE)]!"), + span_notice("Вы вытащили [paicard] из [declent_ru(GENITIVE)]."), ) ejectpai(user) return ATTACK_CHAIN_PROCEED_SUCCESS @@ -483,12 +484,12 @@ return FALSE . = TRUE if(locked) - to_chat(user, span_warning("The maintenance panel is locked.")) + balloon_alert(user, "техпанель заблокирована!") return . // must be true or we attempt to stab the bot if(!I.use_tool(src, user, volume = I.tool_volume)) return . open = !open - to_chat(user, span_notice("The maintenance panel is now [open ? "opened" : "closed"].")) + balloon_alert(user, "техпанель [open ? "открыта" : "закрыта"]!") /mob/living/simple_animal/bot/welder_act(mob/user, obj/item/I) @@ -498,16 +499,19 @@ return FALSE . = TRUE if(health >= maxHealth) - to_chat(user, span_warning("[src] does not need a repair!")) + balloon_alert(user, "ремонт не требуется") return if(!open) - to_chat(user, span_warning("Unable to repair with the maintenance panel closed!")) + balloon_alert(user, "техпанель закрыта!") return if(!I.use_tool(src, user, volume = I.tool_volume)) return adjustBruteLoss(-10) add_fingerprint(user) - user.visible_message("[user] repairs [src]!", span_notice("You repair [src].")) + user.visible_message( + span_notice("[user] ремонтиру[pluralize_ru(user.gender, "ет", "ют")] [declent_ru(GENITIVE)]."), + span_notice("Вы ремонтируете [declent_ru(GENITIVE)].") + ) /mob/living/simple_animal/bot/bullet_act(obj/item/projectile/Proj) @@ -530,8 +534,8 @@ if(paicard) paicard.emp_act(severity) - visible_message("[paicard] is flies out of [bot_name]!", - span_warning("You are forcefully ejected from [bot_name]!")) + visible_message("[paicard] вылетает из [declent_ru(GENITIVE)]!", + span_warning("Вас выкинуло из [declent_ru(GENITIVE)]!")) ejectpai() if(on) turn_off() @@ -572,9 +576,9 @@ /mob/living/simple_animal/bot/proc/set_custom_texts() //Superclass for setting hack texts. Appears only if a set is not given to a bot locally. - text_hack = "You hack [name]." - text_dehack = "You reset [name]." - text_dehack_fail = "You fail to reset [name]." + text_hack = "Вы взломали [declent_ru(GENITIVE)]." + text_dehack = "Вы восстановили [declent_ru(GENITIVE)]." + text_dehack_fail = "Вы не смогли восстановить [declent_ru(GENITIVE)]." /mob/living/simple_animal/bot/proc/speak(message, channel) //Pass a message to have the bot say() it. Pass a frequency to say it on the radio. @@ -700,15 +704,15 @@ Pass the desired type path itself, declaring a temporary var beforehand is not r access_card.access = all_access.GetAccess() //Give the bot all-access while under the AI's command. if(client) reset_access_timer_id = addtimer(CALLBACK(src, PROC_REF(bot_reset)), 60 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE) //if the bot is player controlled, they get the extra access for a limited time - to_chat(src, span_notice("[span_big("Priority waypoint set by [calling_ai] [caller]. Proceed to [end_area.name].")]
[path.len-1] meters to destination. You have been granted additional door access for 60 seconds.")) + to_chat(src, span_notice("[span_big("Приоритетный маршрут установлен [calling_ai] [caller]. Проследуйте в локацию [end_area.name].")]
[path.len-1]
метров до точки назначения. Вам выдан неограниченный доступ к шлюзам на следующие 60 секунд.")) if(message) - to_chat(calling_ai, span_notice("[bicon(src)] [name] called to [end_area.name]. [length(path)-1] meters to destination.")) + to_chat(calling_ai, span_notice("[bicon(src)] [capitalize(declent_ru(NOMINATIVE))] вызван в локацию [end_area.name]. [length(path)-1] метров до точки назначения.")) pathset = TRUE mode = BOT_RESPONDING tries = 0 else if(message) - to_chat(calling_ai, span_danger("Failed to calculate a valid route. Ensure destination is clear of obstructions and within range.")) + to_chat(calling_ai, span_danger("Не удалось рассчитать правильный маршрут. Убедитесь в отсутствии препятствий на пути и доступности точки назначения.")) calling_ai = null access_card.access = prev_access // Don't forget to reset it set_path(null) @@ -719,14 +723,14 @@ Pass the desired type path itself, declaring a temporary var beforehand is not r var/success = bot_move(ai_waypoint, 3) if(!success) if(calling_ai) - to_chat(calling_ai, "[bicon(src)] [get_turf(src) == ai_waypoint ? "[src] successfully arrived to waypoint." : "[src] failed to reach waypoint."]") + to_chat(calling_ai, "[bicon(src)] [get_turf(src) == ai_waypoint ? span_notice("[capitalize(declent_ru(NOMINATIVE))] прибыл в точку назначения.") : span_danger("[capitalize(declent_ru(NOMINATIVE))] не смог добраться до точки назначения.")]") calling_ai = null bot_reset() /mob/living/simple_animal/bot/proc/bot_reset() if(calling_ai) //Simple notification to the AI if it called a bot. It will not know the cause or identity of the bot. - to_chat(calling_ai, "Call command to a bot has been reset.") + to_chat(calling_ai, span_danger("Команда вызова робота была отменена.")) calling_ai = null if(reset_access_timer_id) deltimer(reset_access_timer_id) @@ -760,7 +764,7 @@ Pass the desired type path itself, declaring a temporary var beforehand is not r if(tries >= BOT_STEP_MAX_RETRIES) //Bot is trapped, so stop trying to patrol. auto_patrol = FALSE tries = 0 - speak("Unable to start patrol.") + speak("Не удалось начать патрулирование.") return if(!auto_patrol) //A bot not set to patrol should not be patrolling. @@ -770,7 +774,7 @@ Pass the desired type path itself, declaring a temporary var beforehand is not r if(patrol_target) // has patrol target INVOKE_ASYNC(src, PROC_REF(target_patrol)) else // no patrol target, so need a new one - speak("Engaging patrol mode.") + speak("Режим патрулирования активирован.") find_patrol_target() tries++ @@ -831,7 +835,7 @@ Pass the desired type path itself, declaring a temporary var beforehand is not r else auto_patrol = FALSE mode = BOT_IDLE - speak("Disengaging patrol mode.") + speak("Режим патрулирования отключён.") send_status() @@ -866,18 +870,18 @@ Pass the desired type path itself, declaring a temporary var beforehand is not r /mob/living/simple_animal/bot/proc/bot_control_message(command, mob/user, user_turf) switch(command) if("stop") - to_chat(src, span_warningbig("STOP PATROL")) + to_chat(src, span_warningbig("ОСТАНОВИТЬ ПАТРУЛИРОВАНИЕ")) if("go") - to_chat(src, span_warningbig("START PATROL")) + to_chat(src, span_warningbig("НАЧАТЬ ПАТРУЛИРОВАНИЕ")) if("summon") var/area/our_area = get_area(user_turf) - to_chat(src, span_warningbig(">PRIORITY ALERT: [user] in [our_area.name]!")) + to_chat(src, span_warningbig(">ПРИОРИТЕТНОЕ ОПОВЕЩЕНИЕ: [user] в локации [our_area.name]!")) if("home") - to_chat(src, span_warningbig("RETURN HOME!")) + to_chat(src, span_warningbig("ВЕРНУТЬСЯ ДОМОЙ!")) if("ejectpai") return // Do nothing for this else - to_chat(src, span_warning("Unidentified control sequence received: [command]")) + to_chat(src, span_warning("Получена нераспознанная команда: [command].")) /obj/machinery/bot_core/receive_signal(datum/signal/signal) @@ -902,7 +906,7 @@ Pass the desired type path itself, declaring a temporary var beforehand is not r if(signal.data["active"] != src) return - if(emagged == 2 || remote_disabled || hijacked) //Emagged bots do not respect anyone's authority! Bots with their remote controls off cannot get commands. //Emagged bots do not respect anyone's authority! Bots with their remote controls off cannot get commands. + if(emagged == 2 || remote_disabled || hijacked) //Emagged bots do not respect anyone's authority! Bots with their remote controls off cannot get commands. return if(client) @@ -927,7 +931,7 @@ Pass the desired type path itself, declaring a temporary var beforehand is not r mode = BOT_SUMMON calc_summon_path() - speak("Responding.", radio_channel) + speak("Запрос получен.", radio_channel) else . = FALSE @@ -1003,7 +1007,7 @@ Pass the desired type path itself, declaring a temporary var beforehand is not r /mob/living/simple_animal/bot/proc/on_summon_path_finish(list/path) set_path(path) if(!length(path)) //Cannot reach target. Give up and announce the issue. - speak("Summon command failed, destination unreachable.", radio_channel) + speak("Команда вызова не выполнена, пункт назначения недоступен.", radio_channel) bot_reset() @@ -1064,7 +1068,7 @@ Pass the desired type path itself, declaring a temporary var beforehand is not r return TRUE if(topic_denied(usr)) - to_chat(usr, span_warning("[src]'s interface is not responding!")) + to_chat(usr, span_warning("Интерфейс [declent_ru(GENITIVE)] не отвечает!")) return TRUE add_fingerprint(usr) @@ -1085,7 +1089,7 @@ Pass the desired type path itself, declaring a temporary var beforehand is not r handle_hacking(usr) if("ejectpai") if(paicard && (!locked || issilicon(usr) || usr.can_admin_interact())) - to_chat(usr, span_notice("You eject [paicard] from [bot_name].")) + to_chat(usr, span_notice("Вы вытащили [paicard] из [declent_ru(GENITIVE)].")) ejectpai(usr) update_controls() @@ -1162,10 +1166,10 @@ Pass the desired type path itself, declaring a temporary var beforehand is not r /mob/living/simple_animal/bot/proc/hack(mob/user) var/hack if(issilicon(user) || user.can_admin_interact()) //Allows silicons or admins to toggle the emag status of a bot. - hack += "[emagged == 2 ? "Software compromised! Unit may exhibit dangerous or erratic behavior." : "Unit operating normally. Release safety lock?"]
" - hack += "Harm Prevention Safety System: [emagged ? "DANGER" : "Engaged"]
" + hack += "[emagged == 2 ? "Программное обеспечение взломано! Устройство может вести себя опасно или нестабильно." : "Устройство работает в нормальном режиме. Отключить протоколы безопасности?"]
" + hack += "Протоколы безопасности: [emagged ? span_bad("Отключены") : "Включены"]
" else if(!locked) //Humans with access can use this option to hide a bot from the AI's remote control panel and PDA control. - hack += "Remote network control radio: [remote_disabled ? "Disconnected" : "Connected"]
" + hack += "Удалённое радиоуправление: [remote_disabled ? "Отключено" : "Включено"]
" return hack @@ -1173,16 +1177,16 @@ Pass the desired type path itself, declaring a temporary var beforehand is not r var/eject = "" if(!locked || issilicon(usr) || user.can_admin_interact()) if(paicard || allow_pai) - eject += "Personality card status: " + eject += "Состояние ПИИ: " if(paicard) if(client) - eject += "Active" + eject += "Активирован" else - eject += "Inactive" + eject += "Отключён" else if(!allow_pai || key) - eject += "Unavailable" + eject += "Нет доступа" else - eject += "Not inserted" + eject += "Отсутствует" eject += "
" eject += "
" return eject @@ -1203,7 +1207,7 @@ Pass the desired type path itself, declaring a temporary var beforehand is not r else add_attack_logs(src, paicard.pai, "Ejected") if(announce) - to_chat(paicard.pai, span_notice("You feel your control fade as [paicard] ejects from [bot_name].")) + to_chat(paicard.pai, span_notice("Вы были извлечены из [declent_ru(GENITIVE)]. Соединение прервано.")) paicard = null name = bot_name faction = initial(faction) @@ -1212,7 +1216,7 @@ Pass the desired type path itself, declaring a temporary var beforehand is not r /mob/living/simple_animal/bot/proc/ejectpairemote(mob/user) if(bot_core.allowed(user) && paicard) - speak("Ejecting personality chip.", radio_channel) + speak("Извлечение ПИИ.", radio_channel) ejectpai(user) @@ -1255,19 +1259,19 @@ Pass the desired type path itself, declaring a temporary var beforehand is not r set name = "Show Directives" set category = "IC" - to_chat(src, "Directives:") + to_chat(src, "Набор законов:") if(paicard && paicard.pai && paicard.pai.master && paicard.pai.pai_law0) - to_chat(src, "Your master, [paicard.pai.master], may overrule any and all laws.") + to_chat(src, span_warning("Приказы вашего мастера, [paicard.pai.master], стоят выше любых других законов. Следование этим приказам - ваша первоочередная задача.")) to_chat(src, "0. [paicard.pai.pai_law0]") if(emagged >= 2) - to_chat(src, "1. #$!@#$32K#$") + to_chat(src, span_danger("1. #$!@#$32K#$")) else - to_chat(src, "1. You are a machine built to serve the station's crew and AI(s).") - to_chat(src, "2. Your function is to [bot_purpose].") - to_chat(src, "3. You cannot serve your function if you are broken.") - to_chat(src, "4. Serve your function to the best of your ability.") + to_chat(src, "1. Вы - машина, созданная для служения экипажу станции и ИИ.") + to_chat(src, "2. Ваше задача - [bot_purpose].") + to_chat(src, "3. Вы не сможете выполнять свою задачу, если будете сломаны.") + to_chat(src, "4. Выполняйте свою функцию в меру своих возможностей.") if(paicard && paicard.pai && paicard.pai.pai_laws) - to_chat(src, "Supplemental Directive(s):") + to_chat(src, "Дополнительные законы(s):") to_chat(src, "[paicard.pai.pai_laws]") @@ -1372,7 +1376,7 @@ Pass the desired type path itself, declaring a temporary var beforehand is not r /obj/effect/proc_holder/spell/bot_speed name = "Speed Charge" - desc = "Speeds up the bot's internal systems for a while." + desc = "На некоторое время ускоряет работу внутренних систем робота." action_icon_state = "adrenal-bot" base_cooldown = 300 SECONDS clothes_req = FALSE @@ -1386,6 +1390,7 @@ Pass the desired type path itself, declaring a temporary var beforehand is not r /obj/effect/proc_holder/spell/bot_speed/cast(list/targets, mob/user = usr) for(var/mob/living/simple_animal/bot/bot in targets) bot.set_varspeed(0.1) + balloon_alert(src, "вы ускоряетесь") addtimer(CALLBACK(bot, TYPE_PROC_REF(/mob/living/simple_animal/bot, reset_speed)), 45 SECONDS) @@ -1393,7 +1398,7 @@ Pass the desired type path itself, declaring a temporary var beforehand is not r if(QDELETED(src)) return set_varspeed(initial(speed)) - to_chat(src, span_notice("Now you are moving at your normal speed.")) + balloon_alert(src, "вы замедляетесь") /obj/machinery/bot_core/syndicate req_access = list(ACCESS_SYNDICATE) diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm index 52d26d3be43..baccfd4f241 100644 --- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm +++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm @@ -1,7 +1,15 @@ //Cleanbot /mob/living/simple_animal/bot/cleanbot name = "\improper Cleanbot" - desc = "A little cleaning robot, he looks so excited!" + desc = "Маленький робот-уборщик. Он выглядит таким увлечённым!" + ru_names = list( + NOMINATIVE = "чистобот", + GENITIVE = "чистобота", + DATIVE = "чистоботу", + ACCUSATIVE = "чистобота", + INSTRUMENTAL = "чистоботом", + PREPOSITIONAL = "чистоботе", + ) icon = 'icons/obj/aibots.dmi' icon_state = "cleanbot" density = FALSE @@ -12,10 +20,10 @@ bot_filter = RADIO_CLEANBOT bot_type = CLEAN_BOT model = "Cleanbot" - bot_purpose = "seek out messes and clean them" + bot_purpose = "найти грязь и мусор и избавиться от них" bot_core_type = /obj/machinery/bot_core/cleanbot window_id = "autoclean" - window_name = "Automatic Station Cleaner v1.1" + window_name = "Автоматическая Уборочная Единица v1.1" pass_flags = PASSMOB|PASSFLAPS path_image_color = "#993299" @@ -73,9 +81,9 @@ /mob/living/simple_animal/bot/cleanbot/set_custom_texts() - text_hack = "You corrupt [name]'s cleaning software." - text_dehack = "[name]'s software has been reset!" - text_dehack_fail = "[name] does not seem to respond to your repair code!" + text_hack = "Вы взломали протоколы уборки [declent_ru(GENITIVE)]." + text_dehack = "Вы восстановили протоколы уборки [declent_ru(GENITIVE)]." + text_dehack_fail = "[capitalize(declent_ru(NOMINATIVE))] не отвечает на ваши команды!" /mob/living/simple_animal/bot/cleanbot/attackby(obj/item/I, mob/user, params) @@ -86,9 +94,10 @@ add_fingerprint(user) var/obj/item/toy/crayon/spraycan/can = I if(can.capped) - to_chat(user, span_warning("The cap on [can] is sealed.")) + balloon_alert(user, "баллончик закрыт!") return ATTACK_CHAIN_PROCEED|ATTACK_CHAIN_NO_AFTERATTACK playsound(loc, 'sound/effects/spray.ogg', 20, TRUE) + balloon_alert(user, "краска нанесена") mask_color = can.colour update_icon() return ATTACK_CHAIN_PROCEED_SUCCESS|ATTACK_CHAIN_NO_AFTERATTACK @@ -99,7 +108,7 @@ /mob/living/simple_animal/bot/cleanbot/emag_act(mob/user) ..() if(emagged == 2 && user) - to_chat(user, span_danger("[src] buzzes and beeps.")) + to_chat(user, span_danger("[capitalize(declent_ru(NOMINATIVE))] странно жужжит!")) /mob/living/simple_animal/bot/cleanbot/process_scan(obj/effect/decal/cleanable/D) @@ -124,11 +133,11 @@ T.MakeSlippery(TURF_WET_WATER, 80 SECONDS) if(prob(5)) //Spawns foam! - visible_message(span_danger("[src] whirs and bubbles violently, before releasing a plume of froth!")) + visible_message(span_danger("[capitalize(declent_ru(NOMINATIVE))] издаёт громкие булькающие звуки, прежде чем выпустить шлейф пены!")) new /obj/effect/particle_effect/foam(loc) else if(prob(5)) - audible_message("[src] makes an excited beeping booping sound!") + custom_emote(EMOTE_VISIBLE, "бипает и бупает!") if(!target) //Search for cleanables it can see. target = scan(/obj/effect/decal/cleanable) @@ -201,7 +210,7 @@ /mob/living/simple_animal/bot/cleanbot/proc/start_clean(obj/effect/decal/cleanable/target) set_anchored(TRUE) - visible_message(span_notice("[src] begins to clean up [target]")) + visible_message(span_notice("[capitalize(declent_ru(NOMINATIVE))] начинает очищать [target].")) mode = BOT_CLEANING update_icon() addtimer(CALLBACK(src, PROC_REF(do_clean), target), 5 SECONDS) @@ -219,7 +228,7 @@ /mob/living/simple_animal/bot/cleanbot/explode() on = FALSE - visible_message(span_userdanger("[src] blows apart!")) + visible_message(span_userdanger("[capitalize(declent_ru(NOMINATIVE))] разлетается на части!")) var/turf/Tsec = get_turf(src) new /obj/item/reagent_containers/glass/bucket(Tsec) new /obj/item/assembly/prox_sensor(Tsec) @@ -260,7 +269,7 @@ if (..()) return if(topic_denied(usr)) - to_chat(usr, "[src]'s interface is not responding!") + to_chat(usr, span_danger("Интерфейс [declent_ru(GENITIVE)] не отвечает!")) return add_fingerprint(usr) . = TRUE diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm index cfa971dcf23..c195fa48f6a 100644 --- a/code/modules/mob/living/simple_animal/bot/construction.dm +++ b/code/modules/mob/living/simple_animal/bot/construction.dm @@ -2,8 +2,8 @@ //Cleanbot assembly /obj/item/bucket_sensor - desc = "It's a bucket. With a sensor attached." - name = "proxy bucket" + name = "Proxy bucket" + desc = "Это ведро, к которому прикреплён сенсор." icon = 'icons/obj/aibots.dmi' icon_state = "bucket_proxy" force = 3 @@ -20,7 +20,7 @@ return ..() if(is_pen(I)) - var/new_name = rename_interactive(user, I, prompt = "Enter new robot name") + var/new_name = rename_interactive(user, I, prompt = "Введите новое имя для робота") if(!isnull(new_name)) created_name = new_name add_game_logs("[key_name(user)] has renamed a robot to [new_name]", user) @@ -28,17 +28,20 @@ add_fingerprint(user) if(!istype(I, /obj/item/robot_parts/l_arm) && !istype(I, /obj/item/robot_parts/r_arm)) - to_chat(user, span_warning("You need a cyborg arm to finish the construction.")) + to_chat(user, span_notice("Для завершения сборки чистобота нужна робо-рука.")) + balloon_alert(user, "это сюда не подойдёт") return ATTACK_CHAIN_PROCEED if(!isturf(loc)) - to_chat(user, span_warning("You cannot finish the construction [ismob(loc) ? "in inventory" : "in [loc]"].")) + to_chat(user, span_notice("Вы не можете завершить сборку [ismob(loc) ? "в инвентаре" : "здесь"].")) + balloon_alert(user, "невозможно") return ATTACK_CHAIN_PROCEED if(!user.drop_transfer_item_to_loc(I, src)) return ..() - to_chat(user, span_notice("You have added the robot arm to the bucket and sensor assembly. Beep boop!")) + balloon_alert(user, "сборка завершена") + to_chat(user, span_notice("Вы завершили сборку чистобота.")) var/mob/living/simple_animal/bot/cleanbot/new_bot = new(loc) transfer_fingerprints_to(new_bot) I.transfer_fingerprints_to(new_bot) @@ -55,7 +58,7 @@ /obj/item/ed209_assembly name = "\improper ED-209 assembly" - desc = "Some sort of bizarre assembly." + desc = "Заготовка для чего-то серьёзного." icon = 'icons/obj/aibots.dmi' icon_state = "ed209_frame" item_state = "ed209_frame" @@ -114,7 +117,7 @@ return ..() if(is_pen(I)) - var/new_name = rename_interactive(user, I, prompt = "Enter new robot name") + var/new_name = rename_interactive(user, I, prompt = "Введите новое имя для робота") if(!isnull(new_name)) created_name = new_name add_game_logs("[key_name(user)] has renamed a robot to [new_name]", user) @@ -124,13 +127,15 @@ if(0, 1) add_fingerprint(user) if(!istype(I, /obj/item/robot_parts/l_leg) && !istype(I, /obj/item/robot_parts/r_leg)) - to_chat(user, span_warning("You need a cyborg leg to continue the construction.")) + to_chat(user, span_notice("Для продолжения сборки ED-209 нужна робо-нога.")) + balloon_alert(user, "это сюда не подойдёт") return ATTACK_CHAIN_PROCEED if(!user.drop_transfer_item_to_loc(I, src)) return ..() qdel(I) build_step++ - to_chat(user, span_notice("You have added the the robot leg to the ED-209 assembly.")) + to_chat(user, span_notice("Вы прикрепили робо-ногу к заготовке ED-209.")) + balloon_alert(user, "деталь установлена") update_appearance(UPDATE_NAME|UPDATE_ICON_STATE) return ATTACK_CHAIN_PROCEED_SUCCESS @@ -142,13 +147,15 @@ else if(istype(I, /obj/item/clothing/suit/bluetag)) newcolor = "b" if(!newcolor && !istype(I, /obj/item/clothing/suit/armor/vest)) - to_chat(user, span_warning("You need a helmet to continue the construction.")) + to_chat(user, span_notice("Для продолжения сборки ED-209 нужен защитный жилет.")) + balloon_alert(user, "это сюда не подойдёт") return ATTACK_CHAIN_PROCEED if(!user.drop_transfer_item_to_loc(I, src)) return ..() lasercolor = newcolor build_step++ - to_chat(user, span_notice("You have added [I] to the ED-209 assembly.")) + to_chat(user, span_notice("Вы прикрепили защитный жилет к заготовке ED-209.")) + balloon_alert(user, "деталь установлена") update_appearance(UPDATE_NAME|UPDATE_ICON_STATE) qdel(I) return ATTACK_CHAIN_PROCEED_SUCCESS @@ -158,20 +165,24 @@ switch(lasercolor) if("b") if(!istype(I, /obj/item/clothing/head/helmet/bluetaghelm)) - to_chat(user, span_warning("You need a blue laser tag helmet to continue the construction.")) + to_chat(user, span_notice("Для продолжения сборки ED-209 нужен синий шлем для лазертага.")) + balloon_alert(user, "неверная деталь") return ATTACK_CHAIN_PROCEED if("r") if(!istype(I, /obj/item/clothing/head/helmet/redtaghelm)) - to_chat(user, span_warning("You need a red laser tag helmet to continue the construction.")) + to_chat(user, span_notice("Для продолжения сборки ED-209 нужен красный шлем для лазертага.")) + balloon_alert(user, "неверная деталь") return ATTACK_CHAIN_PROCEED if("") if(!istype(I, /obj/item/clothing/head/helmet)) - to_chat(user, span_warning("You need a standard helmet to continue the construction.")) + to_chat(user, span_notice("Для продолжения сборки ED-209 нужен стандартный шлем СБ.")) + balloon_alert(user, "неверная деталь") return ATTACK_CHAIN_PROCEED if(!user.drop_transfer_item_to_loc(I, src)) return ..() build_step++ - to_chat(user, span_notice("You have added [I] to the ED-209 assembly.")) + to_chat(user, span_notice("Вы прикрепили шлем к заготовке ED-209.")) + balloon_alert(user, "деталь установлена") update_appearance(UPDATE_NAME|UPDATE_ICON_STATE) qdel(I) return ATTACK_CHAIN_BLOCKED_ALL @@ -179,13 +190,15 @@ if(5) add_fingerprint(user) if(!isprox(I)) - to_chat(user, span_warning("You need a proximity sensor to continue the construction.")) + to_chat(user, span_notice("Для продолжения сборки ED-209 нужен датчик движения.")) + balloon_alert(user, "неверная деталь") return ATTACK_CHAIN_PROCEED if(!user.drop_transfer_item_to_loc(I, src)) return ..() qdel(I) build_step++ - to_chat(user, span_notice("You have added the proximity sensor to the ED-209 assembly.")) + to_chat(user, span_notice("Вы прикрепили датчик движения к заготовке ED-209.")) + balloon_alert(user, "деталь установлена") update_appearance(UPDATE_NAME|UPDATE_ICON_STATE) return ATTACK_CHAIN_BLOCKED_ALL @@ -193,14 +206,14 @@ add_fingerprint(user) var/obj/item/stack/cable_coil/coil = I if(!iscoil(I) || coil.get_amount() < 1) - to_chat(user, span_warning("You need at least one length of cable to continue the construction.")) + balloon_alert(user, "здесь нужны провода") return ATTACK_CHAIN_PROCEED coil.play_tool_sound(src) - to_chat(user, span_notice("You start to wire the ED-209 assembly...")) + balloon_alert(user, "вы начинаете прокладывать проводку") if(!do_after(user, 4 SECONDS * I.toolspeed, src, category = DA_CAT_TOOL) || build_step != 6 || QDELETED(coil) || !coil.use(1)) return ATTACK_CHAIN_PROCEED build_step++ - to_chat(user, span_notice("You have wired the ED-209 assembly.")) + balloon_alert(user, "вы проложили проводку") update_appearance(UPDATE_NAME) return ATTACK_CHAIN_PROCEED_SUCCESS @@ -210,23 +223,27 @@ switch(lasercolor) if("b") if(!istype(I, /obj/item/gun/energy/laser/tag/blue)) - to_chat(user, span_warning("You need a blue laser tag gun to continue the construction.")) + to_chat(user, span_notice("Для продолжения сборки ED-209 нужен синий лазертаг-карабин.")) + balloon_alert(user, "неверная деталь") return ATTACK_CHAIN_PROCEED new_name = "bluetag ED-209 assembly" if("r") if(!istype(I, /obj/item/gun/energy/laser/tag/red)) - to_chat(user, span_warning("You need a red laser tag gun to continue the construction.")) + to_chat(user, span_notice("Для продолжения сборки ED-209 нужен красный лазертаг-карабин.")) + balloon_alert(user, "неверная деталь") return ATTACK_CHAIN_PROCEED new_name = "redtag ED-209 assembly" if("") if(!istype(I, /obj/item/gun/energy/gun/advtaser)) - to_chat(user, span_warning("You need a hybrid taser to continue the construction.")) + to_chat(user, span_notice("Для продолжения сборки ED-209 нужен гибридный тазер.")) + balloon_alert(user, "неверная деталь") return ATTACK_CHAIN_PROCEED new_name = "taser ED-209 assembly" if(!user.drop_transfer_item_to_loc(I, src)) return ..() build_step++ - to_chat(user, span_notice("You have added [I] to the ED-209 assembly.")) + to_chat(user, span_notice("Вы установили вооружение в заготовку ED-209.")) + balloon_alert(user, "деталь установлена") update_appearance(UPDATE_NAME|UPDATE_ICON_STATE) qdel(I) return ATTACK_CHAIN_BLOCKED_ALL @@ -234,14 +251,17 @@ if(9) add_fingerprint(user) if(!istype(I, /obj/item/stock_parts/cell)) - to_chat(user, span_warning("You need a power cell to complete the assembly.")) + to_chat(user, span_notice("Для завершения сборки ED-209 нужна батарея.")) + balloon_alert(user, "неверная деталь") return ATTACK_CHAIN_PROCEED if(!isturf(loc)) - to_chat(user, span_warning("You cannot finish the construction [ismob(loc) ? "in inventory" : "in [loc]"].")) + to_chat(user, span_notice("Вы не можете завершить сборку [ismob(loc) ? "в инвентаре" : "здесь"].")) + balloon_alert(user, "невозможно") return ATTACK_CHAIN_PROCEED if(!user.drop_transfer_item_to_loc(I, src)) return ..() - to_chat(user, span_notice("You have completed the ED-209 assembly. Beep boop!")) + balloon_alert(user, "сборка завершена") + to_chat(user, span_notice("Вы завершили сборку ED-209.")) var/mob/living/simple_animal/bot/ed209/new_bot = new(loc, created_name, lasercolor) transfer_fingerprints_to(new_bot) I.transfer_fingerprints_to(new_bot) @@ -262,7 +282,8 @@ if(!I.use_tool(src, user, volume = I.tool_volume)) return . build_step++ - to_chat(user, span_notice("You have welded the the armor to [src].")) + to_chat(user, span_notice("Вы приварили броню к заготовке ED-209.")) + balloon_alert(user, "деталь установлена") update_appearance(UPDATE_NAME|UPDATE_ICON_STATE) @@ -270,17 +291,17 @@ if(build_step != 8) return FALSE . = TRUE - to_chat(user, span_notice("You start attaching the gun to the frame...")) + balloon_alert(user, "вы начинаете устанавливать оружие") if(!I.use_tool(src, user, 4 SECONDS, volume = I.tool_volume) || build_step != 8) return . build_step++ update_appearance(UPDATE_NAME) - to_chat(user, span_notice("You attach the gun to the frame.")) + balloon_alert(user, "вы установили оружие") //Floorbot assemblies /obj/item/toolbox_tiles - desc = "It's a toolbox with tiles sticking out the top" + desc = "Это ящик для инструментов, из которого торчат плитки пола." name = "tiles and toolbox" icon = 'icons/obj/aibots.dmi' icon_state = "toolbox_tiles" @@ -294,7 +315,7 @@ var/toolbox_color = "" //Blank for blue, r for red, y for yellow, etc. /obj/item/toolbox_tiles/sensor - desc = "It's a toolbox with tiles sticking out the top and a sensor attached" + desc = "Это ящик для инструментов, из которого торчат плитки пола. К нему прикреплён датчик движения." name = "tiles, toolbox and sensor arrangement" icon_state = "toolbox_tiles_sensor" @@ -308,15 +329,18 @@ add_fingerprint(user) var/obj/item/stack/tile/plasteel/plasteel = I if(istype(I, /obj/item/storage/toolbox/green/memetic)) - to_chat(user, "Nice try...") + to_chat(user, span_notice("Хорошая попытка...")) + balloon_alert(user, "невозможно") return . if(length(contents)) - to_chat(user, span_warning("The [name] should be empty to start the floorbot construction.")) + to_chat(user, span_notice("Вы не можете начать сборку, пока в ящике для инструментов что-то лежит.")) + balloon_alert(user, "невозможно") return . if(!plasteel.use(10)) - to_chat(user, span_warning("You need at least ten sheets of plasteel to start the floorbot construction.")) + to_chat(user, span_notice("Для начала сборки ремонтного робота нужно 10 листов пластали.")) + balloon_alert(user, "недостаточно материалов") return . . |= ATTACK_CHAIN_BLOCKED_ALL @@ -346,7 +370,8 @@ if(loc == user) user.temporarily_remove_item_from_inventory(src, force = TRUE) user.put_in_hands(assembly) - to_chat(user, span_notice("You have reinforced the toolbox with plasteel sheets. Now it is suitable for further floorbot construction.")) + to_chat(user, span_notice("Вы укрепили ящик для инструментов листами пластали.")) + balloon_alert(user, "ящик укреплён") qdel(src) @@ -359,7 +384,7 @@ return ..() if(is_pen(I)) - var/new_name = rename_interactive(user, I, prompt = "Enter new robot name") + var/new_name = rename_interactive(user, I, prompt = "Введите новое имя для робота") if(!isnull(new_name)) created_name = new_name add_game_logs("[key_name(user)] has renamed a robot to [new_name]", user) @@ -367,7 +392,8 @@ add_fingerprint(user) if(!isprox(I)) - to_chat(user, span_warning("You need a proximity sensor to continue the construction.")) + to_chat(user, span_notice("Для продолжения сборки ремонтного робота нужен датчик движения.")) + balloon_alert(user, "неверная деталь") return ATTACK_CHAIN_PROCEED if(!user.drop_transfer_item_to_loc(I, src)) @@ -382,7 +408,8 @@ if(loc == user) user.temporarily_remove_item_from_inventory(src, force = TRUE) user.put_in_hands(assembly) - to_chat(user, span_notice("You have added the proximity sensor to the floorbot assembly.")) + to_chat(user, span_notice("Вы прикрепили датчик движения к заготовке ремонтного робота.")) + balloon_alert(user, "деталь установлена") qdel(I) qdel(src) return ATTACK_CHAIN_BLOCKED_ALL @@ -398,7 +425,7 @@ return ..() if(is_pen(I)) - var/new_name = rename_interactive(user, I, prompt = "Enter new robot name") + var/new_name = rename_interactive(user, I, prompt = "Введите новое имя для робота") if(!isnull(new_name)) created_name = new_name add_game_logs("[key_name(user)] has renamed a robot to [new_name]", user) @@ -406,11 +433,13 @@ add_fingerprint(user) if(!istype(I, /obj/item/robot_parts/l_arm) && !istype(I, /obj/item/robot_parts/r_arm)) - to_chat(user, span_warning("You need a cyborg arm to finish the construction.")) + to_chat(user, span_notice("Для завершения сборки ремонтного робота нужна робо-рука.")) + balloon_alert(user, "неверная деталь") return ATTACK_CHAIN_PROCEED if(!isturf(loc)) - to_chat(user, span_warning("You cannot finish the construction [ismob(loc) ? "in inventory" : "in [loc]"].")) + to_chat(user, span_notice("Вы не можете завершить сборку [ismob(loc) ? "в инвентаре" : "здесь"].")) + balloon_alert(user, "невозможно") return ATTACK_CHAIN_PROCEED if(!user.drop_transfer_item_to_loc(I, src)) @@ -422,7 +451,8 @@ new_bot.add_fingerprint(user) new_bot.name = created_name new_bot.robot_arm = I.type - to_chat(user, span_notice("You have completed the floorbot assembly. Beep boop!")) + balloon_alert(user, "сборка завершена") + to_chat(user, span_notice("Вы завершили сборку ремонтного робота.")) qdel(I) qdel(src) return ATTACK_CHAIN_BLOCKED_ALL @@ -436,7 +466,8 @@ add_fingerprint(user) if(length(contents)) - to_chat(user, span_warning("The [name] should be empty to start the medibot construction.")) + to_chat(user, span_notice("Вы не можете начать сборку, пока в аптечке что-то лежит.")) + balloon_alert(user, "невозможно") return . . |= ATTACK_CHAIN_BLOCKED_ALL @@ -458,14 +489,15 @@ if(loc == user) user.temporarily_remove_item_from_inventory(src, force = TRUE) user.put_in_hands(assembly) - to_chat(user, span_notice("You have added the cyborg arm to [src]. Now it is suitable for further medibot construction.")) + to_chat(user, span_notice("Вы прикрепили робо-руку к аптечке.")) + balloon_alert(user, "деталь установлена") qdel(I) qdel(src) /obj/item/firstaid_arm_assembly name = "incomplete medibot assembly." - desc = "A first aid kit with a robot arm permanently grafted to it." + desc = "Аптечка первой помощи с прикрепленной роботизированной рукой." icon = 'icons/obj/aibots.dmi' icon_state = "firstaid_arm" w_class = WEIGHT_CLASS_NORMAL @@ -508,7 +540,7 @@ return ..() if(is_pen(I)) - var/new_name = rename_interactive(user, I, prompt = "Enter new robot name") + var/new_name = rename_interactive(user, I, prompt = "Введите новое имя для робота") if(!isnull(new_name)) created_name = new_name add_game_logs("[key_name(user)] has renamed a robot to [new_name]", user) @@ -518,11 +550,13 @@ if(0) add_fingerprint(user) if(!istype(I, /obj/item/healthanalyzer)) - to_chat(user, span_warning("You need a health analyzer to continue the construction.")) + to_chat(user, span_notice("Для продолжения сборки медбота нужен анализатор здоровья.")) + balloon_alert(user, "неверная деталь") return ATTACK_CHAIN_PROCEED if(!user.drop_transfer_item_to_loc(I, src)) return ..() - to_chat(user, span_notice("You have added the health analyzer to the medibot assembly.")) + to_chat(user, span_notice("Вы прикрепили анализатор здоровья к аптечке.")) + balloon_alert(user, "деталь установлена") build_step++ update_appearance(UPDATE_NAME|UPDATE_OVERLAYS) qdel(I) @@ -531,14 +565,17 @@ if(1) add_fingerprint(user) if(!isprox(I)) - to_chat(user, span_warning("You need a proximity sensor to complete the assembly.")) + to_chat(user, span_notice("Для завершения сборки медбота нужен датчик движения.")) + balloon_alert(user, "неверная деталь") return ATTACK_CHAIN_PROCEED if(!isturf(loc)) - to_chat(user, span_warning("You cannot finish the construction [ismob(loc) ? "in inventory" : "in [loc]"].")) + to_chat(user, span_notice("Вы не можете завершить сборку [ismob(loc) ? "в инвентаре" : "здесь"].")) + balloon_alert(user, "невозможно") return ATTACK_CHAIN_PROCEED if(!user.drop_transfer_item_to_loc(I, src)) return ..() - to_chat(user, span_notice("You have completed the medibot assembly. Beep boop!")) + balloon_alert(user, "сборка завершена") + to_chat(user, span_notice("Вы завершили сборку медбота.")) var/mob/living/simple_animal/bot/medbot/new_bot if(syndicate_aligned) // syndicate medibots are a special case that have so many unique vars on them, @@ -567,7 +604,7 @@ //Secbot Assembly /obj/item/secbot_assembly name = "incomplete securitron assembly" - desc = "Some sort of bizarre assembly made from a proximity sensor, helmet, and signaler." + desc = "Замудрённая конструкция, состоящая из датчика движения, шлема и сигнального устройства." icon = 'icons/obj/aibots.dmi' icon_state = "helmet_signaler" item_state = "helmet" @@ -604,7 +641,8 @@ add_fingerprint(user) var/obj/item/assembly/signaler/signaler = I if(signaler.secured) - to_chat(user, span_warning("The [signaler.name] should be unsecured.")) + to_chat(user, span_notice("Сигнальное устройство не должно быть закреплено.")) + balloon_alert(user, "невозможно") return ATTACK_CHAIN_PROCEED . |= ATTACK_CHAIN_BLOCKED_ALL @@ -616,7 +654,7 @@ if(loc == user) user.temporarily_remove_item_from_inventory(src, force = TRUE) user.put_in_hands(assembly) - to_chat(user, span_notice("You have added the the signaler to the helmet. Now it is suitable for further securitron construction.")) + balloon_alert(user, "сигнальное устройство прикреплено") qdel(I) qdel(src) @@ -626,7 +664,7 @@ return ..() if(is_pen(I)) - var/new_name = rename_interactive(user, I, prompt = "Enter new robot name") + var/new_name = rename_interactive(user, I, prompt = "Введите новое имя для робота") if(!isnull(new_name)) created_name = new_name add_game_logs("[key_name(user)] has renamed a robot to [new_name]", user) @@ -636,11 +674,13 @@ if(1) add_fingerprint(user) if(!isprox(I)) - to_chat(user, span_warning("You need a proximity sensor to continue the construction.")) + to_chat(user, span_notice("Для продолжения сборки охранного робота нужен датчик движения.")) + balloon_alert(user, "неверная деталь") return ATTACK_CHAIN_PROCEED if(!user.drop_transfer_item_to_loc(I, src)) return ..() - to_chat(user, span_notice("You have added the proximity sensor to the securitron assembly.")) + to_chat(user, span_notice("Вы прикрепили датчик движения к заготовке охранного робота.")) + balloon_alert(user, "деталь установлена") build_step++ update_appearance(UPDATE_NAME|UPDATE_OVERLAYS) qdel(I) @@ -649,11 +689,13 @@ if(2) add_fingerprint(user) if(!istype(I, /obj/item/robot_parts/l_arm) && !istype(I, /obj/item/robot_parts/r_arm)) - to_chat(user, span_warning("You need a cyborg arm to continue the construction.")) + to_chat(user, span_notice("Для продолжения сборки охранного робота нужна робо-рука.")) + balloon_alert(user, "неверная деталь") return ATTACK_CHAIN_PROCEED if(!user.drop_transfer_item_to_loc(I, src)) return ..() - to_chat(user, span_notice("You have added the cyborg arm to the securitron assembly.")) + to_chat(user, span_notice("Вы прикрепили робо-руку к заготовке охранного робота.")) + balloon_alert(user, "деталь установлена") build_step++ robot_arm = I.type update_appearance(UPDATE_NAME|UPDATE_OVERLAYS) @@ -663,14 +705,17 @@ if(3) add_fingerprint(user) if(!istype(I, /obj/item/melee/baton/security)) - to_chat(user, span_warning("You need a stunbaton to complete the assembly.")) + to_chat(user, span_notice("Для продолжения сборки охранного робота нужна оглушающая дубинка.")) + balloon_alert(user, "неверная деталь") return ATTACK_CHAIN_PROCEED if(!isturf(loc)) - to_chat(user, span_warning("You cannot finish the construction [ismob(loc) ? "in inventory" : "in [loc]"].")) + to_chat(user, span_notice("Вы не можете завершить сборку [ismob(loc) ? "в инвентаре" : "здесь"].")) + balloon_alert(user, "невозможно") return ATTACK_CHAIN_PROCEED if(!user.drop_transfer_item_to_loc(I, src)) return ..() - to_chat(user, span_notice("You have completed the securitron assembly. Beep boop!")) + balloon_alert(user, "сборка завершена") + to_chat(user, span_notice("Вы завершили сборку охранного робота.")) var/mob/living/simple_animal/bot/secbot/new_bot = new(loc) new_bot.name = created_name new_bot.robot_arm = robot_arm @@ -699,21 +744,24 @@ var/obj/item/clothing/head/helmet/helmet = new(drop_loc) transfer_fingerprints_to(helmet) helmet.add_fingerprint(user) - to_chat(user, span_notice("You have disconnected the signaler from the helmet.")) + to_chat(user, span_notice("Вы отсоединили сигнальное устройство от шлема.")) + balloon_alert(user, "деталь отсоединена") qdel(src) if(2) var/obj/item/assembly/prox_sensor/sensor = new(drop_loc) transfer_fingerprints_to(sensor) sensor.add_fingerprint(user) build_step-- - to_chat(user, span_notice("You have detached the proximity sensor from the securitron assembly.")) + to_chat(user, span_notice("Вы отсоединили датчик движения от заготовки.")) + balloon_alert(user, "деталь отсоединена") update_appearance(UPDATE_NAME|UPDATE_OVERLAYS) if(3) var/obj/item/robot_parts/new_arm = new robot_arm(drop_loc) transfer_fingerprints_to(new_arm) new_arm.add_fingerprint(user) build_step-- - to_chat(user, span_notice("You have removed the cyborg arm from the securitron assembly.")) + to_chat(user, span_notice("Вы отсоединили робо-руку от заготовки.")) + balloon_alert(user, "деталь отсоединена") update_appearance(UPDATE_NAME|UPDATE_OVERLAYS) @@ -723,7 +771,8 @@ . = TRUE if(!I.use_tool(src, user, volume = I.tool_volume)) return . - to_chat(user, span_notice("You have adjusted the arm slots for extra weapons.")) + to_chat(user, span_notice("Вы создали дополнительные слоты для вооружения в заготовке охранного робота.")) + balloon_alert(user, "корпус модифицирован") var/obj/item/griefsky_assembly/destroyer_of_the_worlds = new(drop_location()) transfer_fingerprints_to(destroyer_of_the_worlds) destroyer_of_the_worlds.add_fingerprint(user) @@ -743,10 +792,12 @@ return . if(build_step == 1) build_step = 0 - to_chat(user, span_notice("You have welded shut the hole in the securitron assembly.")) + to_chat(user, span_notice("Вы заварили лишние отверстия в заготовке охранного робота.")) + balloon_alert(user, "корпус модифицирован") else build_step = 1 - to_chat(user, span_notice("You have welded a hole in the securitron assembly.")) + to_chat(user, span_notice("Вы вырезали дополнительные отверстия в заготовке охранного робота.")) + balloon_alert(user, "корпус модифицирован") update_appearance(UPDATE_OVERLAYS) @@ -754,7 +805,7 @@ /obj/item/griefsky_assembly name = "\improper General Griefsky assembly" - desc = "Some sort of bizarre assembly." + desc = "Причудливая конструкция. Выглядит мощно." icon = 'icons/obj/aibots.dmi' icon_state = "griefsky_assembly" item_state = "griefsky_assembly" @@ -776,27 +827,33 @@ var/toy_sword = istype(I, /obj/item/toy/sword) if(!energy_sword && !toy_sword) if(build_step == 0 && toy_step == 0) - to_chat(user, span_warning("You need a toy sword or an energy sword to continue the construction.")) + to_chat(user, span_notice("Для продолжения сборки нужен лазерный меч.")) + balloon_alert(user, "неверная деталь") return ATTACK_CHAIN_PROCEED if(build_step > 0) - to_chat(user, span_warning("You need an energy sword to continue the construction.")) + to_chat(user, span_notice("Для продолжения сборки нужен настоящий лазерный меч.")) + balloon_alert(user, "неверная деталь") return ATTACK_CHAIN_PROCEED if(toy_step > 0) - to_chat(user, span_warning("You need a toy sword to continue the construction.")) + to_chat(user, span_notice("Для продолжения сборки нужен игрушечный лазерный меч.")) + balloon_alert(user, "неверная деталь") return ATTACK_CHAIN_PROCEED return ATTACK_CHAIN_PROCEED if(energy_sword) if(toy_step > 0) - to_chat(user, span_warning("The energy sword is incompatible with the Genewul Giftskee assembly.")) + to_chat(user, span_notice("Этот лазерный меч не подойдёт.")) + balloon_alert(user, "неверная деталь") return ATTACK_CHAIN_PROCEED if(build_step == 3) if(!isturf(loc)) - to_chat(user, span_warning("You cannot finish the construction [ismob(loc) ? "in inventory" : "in [loc]"].")) + to_chat(user, span_notice("Вы не можете завершить сборку [ismob(loc) ? "в инвентаре" : "здесь"].")) + balloon_alert(user, "невозможно") return ATTACK_CHAIN_PROCEED if(!user.drop_transfer_item_to_loc(I, src)) return ..() - to_chat(user, span_notice("You have completed the General Griefsky assembly. Its war crimes time!")) + balloon_alert(user, "сборка завершена") + to_chat(user, span_notice("Вы завершили сборку Генерала Грифски. Время совершить парочку военных преступлений!")) var/mob/living/simple_animal/bot/secbot/griefsky/destroyer_of_the_worlds = new(loc) transfer_fingerprints_to(destroyer_of_the_worlds) I.transfer_fingerprints_to(destroyer_of_the_worlds) @@ -809,20 +866,24 @@ build_step++ I.transfer_fingerprints_to(src) update_appearance(UPDATE_NAME) - to_chat(user, span_notice("You have added the energy sword to the General Griefsky assembly. It prays for more!")) + to_chat(user, span_notice("Вы прикрепили лазерный меч к заготовке.")) + balloon_alert(user, "деталь установлена") qdel(I) return ATTACK_CHAIN_BLOCKED_ALL if(build_step > 0) - to_chat(user, span_warning("The toy sword is incompatible with the General Griefsky assembly.")) + to_chat(user, span_notice("Этот лазерный меч не подойдёт.")) + balloon_alert(user, "неверная деталь") return ATTACK_CHAIN_PROCEED if(toy_step == 3) if(!isturf(loc)) - to_chat(user, span_warning("You cannot finish the construction [ismob(loc) ? "in inventory" : "in [loc]"].")) + to_chat(user, span_notice("Вы не можете завершить сборку [ismob(loc) ? "в инвентаре" : "здесь"].")) + balloon_alert(user, "невозможно") return ATTACK_CHAIN_PROCEED if(!user.drop_transfer_item_to_loc(I, src)) return ..() - to_chat(user, span_notice("You have completed the Genewul Giftskee assembly. Its party time!")) + balloon_alert(user, "сборка завершена") + to_chat(user, span_notice("Вы завершили сборку Генерала Грифски.")) var/mob/living/simple_animal/bot/secbot/griefsky/toy/destroyer_of_the_pinatas = new(loc) transfer_fingerprints_to(destroyer_of_the_pinatas) I.transfer_fingerprints_to(destroyer_of_the_pinatas) @@ -835,7 +896,8 @@ toy_step++ I.transfer_fingerprints_to(src) update_appearance(UPDATE_NAME) - to_chat(user, span_notice("You have added the toy sword to the Genewul Giftskee assembly. It prays for more!")) + to_chat(user, span_notice("Вы прикрепили игрушечный лазерный меч к заготовке.")) + balloon_alert(user, "деталь установлена") qdel(I) return ATTACK_CHAIN_BLOCKED_ALL @@ -849,11 +911,13 @@ var/obj/item/sword if(build_step) sword = new /obj/item/melee/energy/sword(drop_location()) - to_chat(user, span_notice("You have detached the energy sword from the Griefsky assembly.")) + to_chat(user, span_notice("Вы отсоединили лазерный меч от заготовки.")) + balloon_alert(user, "деталь отсоединена") build_step-- else if(toy_step) sword = new /obj/item/toy/sword(drop_location()) - to_chat(user, span_notice("You have detached the toy sword from the Griefsky assembly.")) + to_chat(user, span_notice("Вы отсоединили игрушечный лазерный меч от заготовки.")) + balloon_alert(user, "деталь отсоединена") toy_step-- transfer_fingerprints_to(sword) sword.add_fingerprint(user) @@ -868,7 +932,8 @@ add_fingerprint(user) if(length(contents)) - to_chat(user, span_warning("The [name] should be empty to start the honkbot construction.")) + to_chat(user, span_notice("Вы не можете начать сборку, пока в коробке что-то лежит.")) + balloon_alert(user, "невозможно") return . . |= ATTACK_CHAIN_BLOCKED_ALL @@ -883,14 +948,15 @@ if(loc == user) user.temporarily_remove_item_from_inventory(src, force = TRUE) user.put_in_hands(assembly) - to_chat(user, span_notice("You have added the cyborg arm to [src]. Now it is suitable for further honkbot construction.")) + to_chat(user, span_notice("Вы прикрепили робо-руку к коробке.")) + balloon_alert(user, "деталь установлена") qdel(I) qdel(src) /obj/item/honkbot_arm_assembly name = "incomplete honkbot assembly" - desc = "A clown box with a robot arm permanently grafted to it." + desc = "Клоунская коробка с прикрепленной роботизированной рукой." icon = 'icons/obj/aibots.dmi' icon_state = "honkbot_arm" w_class = WEIGHT_CLASS_NORMAL @@ -908,11 +974,13 @@ if(0) add_fingerprint(user) if(!isprox(I)) - to_chat(user, span_warning("You need a proximity sensor to continue the construction.")) + to_chat(user, span_notice("Для продолжения сборки хонкбота нужен датчик движения.")) + balloon_alert(user, "неверная деталь") return ATTACK_CHAIN_PROCEED if(!user.drop_transfer_item_to_loc(I, src)) return ..() - to_chat(user, span_notice("You have added the proximity sensor to the honkbot assembly.")) + to_chat(user, span_notice("Вы прикрепили датчик движения к заготовке хонкбота.")) + balloon_alert(user, "деталь установлена") build_step++ update_appearance(UPDATE_ICON_STATE) qdel(I) @@ -921,11 +989,13 @@ if(1) add_fingerprint(user) if(!istype(I, /obj/item/bikehorn)) - to_chat(user, span_warning("You need a bike horn to continue the construction.")) + to_chat(user, span_notice("Для продолжения сборки хонкбота нужен велосипедный гудок.")) + balloon_alert(user, "неверная деталь") return ATTACK_CHAIN_PROCEED if(!user.drop_transfer_item_to_loc(I, src)) return ..() - to_chat(user, span_notice("You have added the bike horn to the honkbot assembly.")) + to_chat(user, span_notice("Вы прикрепили велосипедный гудок к заготовке хонкбота.")) + balloon_alert(user, "деталь установлена") build_step++ update_appearance(UPDATE_ICON_STATE|UPDATE_DESC) qdel(I) @@ -934,14 +1004,17 @@ if(2) add_fingerprint(user) if(!istype(I, /obj/item/instrument/trombone)) - to_chat(user, span_warning("You need a trombone to complete the assembly.")) + to_chat(user, span_notice("Для завершения сборки хонкбота нужен тромбон.")) + balloon_alert(user, "неверная деталь") return ATTACK_CHAIN_PROCEED if(!isturf(loc)) - to_chat(user, span_warning("You cannot finish the construction [ismob(loc) ? "in inventory" : "in [loc]"].")) + to_chat(user, span_notice("Вы не можете завершить сборку [ismob(loc) ? "в инвентаре" : "здесь"].")) + balloon_alert(user, "невозможно") return ATTACK_CHAIN_PROCEED if(!user.drop_transfer_item_to_loc(I, src)) return ..() - to_chat(user, span_notice("You have completed the honkbot assembly. HONK!")) + balloon_alert(user, "сборка завершена") + to_chat(user, span_notice("Вы завершили сборку хонкобота.")) var/mob/living/simple_animal/bot/honkbot/new_bot = new(loc) new_bot.robot_arm = robot_arm transfer_fingerprints_to(new_bot) @@ -961,7 +1034,7 @@ /obj/item/honkbot_arm_assembly/update_desc(updates = ALL) . = ..() if(build_step == 2) - desc = "A clown box with a robot arm and a bikehorn permanently grafted to it. It needs a trombone to be finished" + desc = "Клоунская коробка с прикреплённой роботизированной рукой и велосипедным гудком. Ему не хватает лишь тромбона." return . desc = initial(desc) diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm index 6ee5edbd899..361a97b2184 100644 --- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm +++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm @@ -3,7 +3,15 @@ /mob/living/simple_animal/bot/ed209 name = "\improper ED-209 Security Robot" - desc = "A security robot. He looks less than thrilled." + desc = "Охранный робот. Он выглядит абсолютно спокойным." + ru_names = list( + NOMINATIVE = "охранный робот ED-209", + GENITIVE = "охранного робота ED-209", + DATIVE = "охранному роботу ED-209", + ACCUSATIVE = "охранного робота ED-209", + INSTRUMENTAL = "охранным роботом ED-209", + PREPOSITIONAL = "охранном роботе ED-209", + ) icon = 'icons/obj/aibots.dmi' icon_state = "ed2090" density = TRUE @@ -19,10 +27,10 @@ bot_type = SEC_BOT bot_filter = RADIO_SECBOT model = "ED-209" - bot_purpose = "seek out criminals, handcuff them, and report their location to security" + bot_purpose = "найти преступников, задержать их и доложить службе безопасности" bot_core_type = /obj/machinery/bot_core/secbot window_id = "autoed209" - window_name = "Automatic Security Unit v2.6" + window_name = "Автоматическая Охранная Единица v2.6" path_image_color = "#FF0000" data_hud_type = DATA_HUD_SECURITY_ADVANCED @@ -80,9 +88,9 @@ if(created_name == initial(name) || !created_name) if(lasercolor == "b") - name = pick("BLUE BALLER","SANIC","BLUE KILLDEATH MURDERBOT") + name = pick("СИНИЙ УБИВАТОР","САНИК","СИНИЙ КИБОРГ УБИЙЦА") else if (lasercolor == "r") - name = pick("RED RAMPAGE","RED ROVER","RED KILLDEATH MURDERBOT") + name = pick("КРАСНОЕ БЕЗУМИЕ","КРАСНЫЙ УНИЧТОЖИТЕЛЬ","КРАСНЫЙ КИБОРГ УБИЙЦА") //SECHUD var/datum/atom_hud/secsensor = GLOB.huds[DATA_HUD_SECURITY_ADVANCED] @@ -119,9 +127,9 @@ /mob/living/simple_animal/bot/ed209/set_custom_texts() - text_hack = "You disable [name]'s combat inhibitor." - text_dehack = "You restore [name]'s combat inhibitor." - text_dehack_fail = "[name] ignores your attempts to restrict [p_them()]!" + text_hack = "Вы взломали боевую систему [declent_ru(GENITIVE)]" + text_dehack = "Вы восстановили боевую систему [declent_ru(GENITIVE)]." + text_dehack_fail = "[capitalize(declent_ru(NOMINATIVE))] отказывается вам подчиняться!" /mob/living/simple_animal/bot/ed209/show_controls(mob/M) @@ -159,7 +167,7 @@ if (..()) return if(topic_denied(usr)) - to_chat(usr, "[src]'s interface is not responding!") + to_chat(usr, span_warning("Интерфейс [declent_ru(GENITIVE)] не отвечает!")) return add_fingerprint(usr) . = TRUE @@ -228,9 +236,9 @@ ..() if(emagged == 2) if(user) - to_chat(user, span_warning("You short out [src]'s target assessment circuits.")) + to_chat(user, span_warning("Вы замыкаете микросхемы системы целеуказания [declent_ru(GENITIVE)].")) oldtarget_name = user.name - audible_message(span_danger("[src] buzzes oddly!")) + audible_message(span_danger("[capitalize(declent_ru(NOMINATIVE))] странно жужжит!")) declare_arrests = FALSE icon_state = "[lasercolor]ed209[on]" set_weapon() @@ -402,9 +410,9 @@ else if(threatlevel >= 4) target = C oldtarget_name = C.name - speak("Level [threatlevel] infraction alert!") + speak("Вижу преступника! Уровень опасности - [threatlevel]!") playsound(loc, pick('sound/voice/ed209_20sec.ogg', 'sound/voice/edplaceholder.ogg'), 50, 0) - visible_message("[src] points at [C.name]!") + visible_message("[capitalize(declent_ru(NOMINATIVE))] указывает на [C.name]!") mode = BOT_HUNT INVOKE_ASYNC(src, PROC_REF(handle_automated_action)) break @@ -420,7 +428,7 @@ /mob/living/simple_animal/bot/ed209/explode() SSmove_manager.stop_looping(src) - visible_message("[src] blows apart!") + visible_message(span_userdanger("[capitalize(declent_ru(NOMINATIVE))] разлетается на части!")) var/turf/Tsec = get_turf(src) var/obj/item/ed209_assembly/Sa = new /obj/item/ed209_assembly(Tsec) @@ -629,19 +637,19 @@ if(declare_arrests) var/area/location = get_area(src) if(!speak_cooldown) - speak("[arrest_type ? "Detaining" : "Arresting"] level [threat] scumbag [C] in [location].", radio_channel) + speak("[arrest_type ? "Удерживаю" : "Задерживаю"] подонка по имени [C] в локации [location]. Уровень опасности - [threat].", radio_channel) speak_cooldown = TRUE addtimer(VARSET_CALLBACK(src, speak_cooldown, FALSE), SPEAK_COOLDOWN) - C.visible_message(span_danger("[src] has stunned [C]!"), - span_userdanger("[src] has stunned you!")) + C.visible_message(span_danger("[capitalize(declent_ru(NOMINATIVE))] оглушил [C]!"), + span_userdanger("[capitalize(declent_ru(NOMINATIVE))] оглушил вас!")) /mob/living/simple_animal/bot/ed209/proc/start_cuffing(mob/living/carbon/C) mode = BOT_ARREST playsound(loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2) - C.visible_message(span_danger("[src] is trying to put zipties on [C]!"), - span_userdanger("[src] is trying to put zipties on you!")) + C.visible_message(span_danger("[capitalize(declent_ru(NOMINATIVE))] начинает надевать стяжки на [C]!"), + span_userdanger("[capitalize(declent_ru(NOMINATIVE))] пытается надеть на вас стяжки!")) addtimer(CALLBACK(src, PROC_REF(cuff_callback), C), 6 SECONDS) @@ -653,6 +661,9 @@ return C.apply_restraints(new /obj/item/restraints/handcuffs/cable/zipties/used(null), ITEM_SLOT_HANDCUFFED, TRUE) + C.visible_message(span_danger("[capitalize(declent_ru(NOMINATIVE))] надел стяжки на [C]!"), + span_userdanger("[capitalize(declent_ru(NOMINATIVE))] надел на вас стяжки!")) + back_to_idle() diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm index 9728321bced..2dc92554766 100644 --- a/code/modules/mob/living/simple_animal/bot/floorbot.dm +++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm @@ -1,7 +1,15 @@ //Floorbot /mob/living/simple_animal/bot/floorbot name = "\improper Floorbot" - desc = "A little floor repairing robot, he looks so excited!" + desc = "Маленький робот для починки полов и обшивки. Он выглядит таким увлечённым!" + ru_names = list( + NOMINATIVE = "ремонтный робот", + GENITIVE = "ремонтного робота", + DATIVE = "ремонтному роботу", + ACCUSATIVE = "ремонтного робота", + INSTRUMENTAL = "ремонтным роботом", + PREPOSITIONAL = "ремонтном роботе", + ) icon = 'icons/obj/aibots.dmi' icon_state = "floorbot0" density = FALSE @@ -13,10 +21,10 @@ bot_type = FLOOR_BOT bot_filter = RADIO_FLOORBOT model = "Floorbot" - bot_purpose = "seek out damaged or missing floor tiles, and repair or replace them as necessary" + bot_purpose = "найти повреждения в полу или обшивке и восстановить их целостность" bot_core_type = /obj/machinery/bot_core/floorbot window_id = "autofloor" - window_name = "Automatic Station Floor Repairer v1.1" + window_name = "Автоматическая Ремонтная Единица v1.1" path_image_color = "#FFA500" /// Determines what to do when process_scan() recieves a target. See process_scan() for details. @@ -67,35 +75,35 @@ /mob/living/simple_animal/bot/floorbot/set_custom_texts() - text_hack = "You corrupt [name]'s construction protocols." - text_dehack = "You detect errors in [name] and reset [p_their()] programming." - text_dehack_fail = "[name] is not responding to reset commands!" + text_hack = "Вы взломали рабочие протоколы [declent_ru(GENITIVE)]." + text_dehack = "Вы восстановили рабочие протоколы [declent_ru(GENITIVE)]." + text_dehack_fail = "[capitalize(declent_ru(NOMINATIVE))] не отвечает на команды сброса настроек!" /mob/living/simple_animal/bot/floorbot/get_controls(mob/user) var/dat dat += hack(user) dat += showpai(user) - dat += "Floor Repairer Controls v1.1

" - dat += "Status: [on ? "On" : "Off"]
" - dat += "Maintenance panel panel is [open ? "opened" : "closed"]
" - dat += "Tiles left: [amount]
" - dat += "Behvaiour controls are [locked ? "locked" : "unlocked"]
" + dat += "Панель управления ремонтным роботом v1.1

" + dat += "Состояние: [on ? "Включён" : "Выключен"]
" + dat += "Панель технического обслуживания [open ? "открыта" : "закрыта"]
" + dat += "Плиток пола в запасе: [amount]
" + dat += "Управление поведением [locked ? "заблокировано" : "разблокировано"]
" if(!locked || issilicon(user) || user.can_admin_interact()) - dat += "Add tiles to new hull plating: [autotile ? "Yes" : "No"]
" - dat += "Replace floor tiles: [replacetiles ? "Yes" : "No"]
" - dat += "Finds tiles: [eattiles ? "Yes" : "No"]
" - dat += "Make pieces of metal into tiles when empty: [maketiles ? "Yes" : "No"]
" - dat += "Transmit notice when empty: [nag_on_empty ? "Yes" : "No"]
" - dat += "Repair damaged tiles and platings: [fixfloors ? "Yes" : "No"]
" - dat += "Traction Magnets: [anchored ? "Engaged" : "Disengaged"]
" - dat += "Patrol Station: [auto_patrol ? "Yes" : "No"]
" + dat += "Устанавливать плитки пола на сегменты обшивки:[autotile ? "Да" : "Нет"]
" + dat += "Заменять плитки пола: [replacetiles ? "Да" : "Нет"]
" + dat += "Загружать свободные плитки во внутреннее хранилище: [eattiles ? "Да" : "Нет"]
" + dat += "Перерабатывать металл в плитки пола, когда хранилище опустошено: [maketiles ? "Да" : "Нет"]
" + dat += "Уведомлять, когда хранилище опустошено: [nag_on_empty ? "Да" : "Нет"]
" + dat += "Ремонтировать повреждения пола и обшивки: [fixfloors ? "Да" : "Нет"]
" + dat += "Закрепиться на месте: [anchored ? "Да" : "Нет"]
" + dat += "Режим патрулирования: [auto_patrol ? "Да" : "Нет"]
" var/bmode if(targetdirection) bmode = dir2text(targetdirection) else - bmode = "disabled" - dat += "Bridge Mode : [bmode]
" + bmode = "Выключен" + dat += "Режим постройки моста: [bmode]
" return dat @@ -109,10 +117,11 @@ var/obj/item/stack/tile/plasteel/plasteel = I var/loaded = min(50 - amount, plasteel.get_amount()) if(!plasteel.use(loaded)) - to_chat(user, span_warning("You need at least one floor tile to put into [src]!")) + to_chat(user, span_warning("Вам нужна хотя бы одна плитка пола для загрузки в [declent_ru(ACCUSATIVE)]!")) return ATTACK_CHAIN_PROCEED amount += loaded - to_chat(user, span_notice("You have loaded [loaded] tile\s into the floorbot. [p_they(TRUE)] now contains [amount] tiles.")) + balloon_alert(user, "плитки загружены") + to_chat(user, span_notice("Вы загрузили [loaded] плитки в [declent_ru(ACCUSATIVE)]. Текущее количество плиток - [amount].")) nagged = FALSE update_icon() return ATTACK_CHAIN_PROCEED_SUCCESS @@ -124,7 +133,7 @@ ..() if(emagged == 2) if(user) - to_chat(user, span_danger("[src] buzzes and beeps.")) + to_chat(user, span_danger("[capitalize(declent_ru(NOMINATIVE))] жужжит и пищит.")) /mob/living/simple_animal/bot/floorbot/Topic(href, href_list) @@ -148,17 +157,17 @@ set_anchored(!anchored) if("bridgemode") - var/setdir = input("Select construction direction:") as null|anything in list("north","east","south","west","disable") + var/setdir = input("Выберите направление строительства:") as null|anything in list("север","юг","запад","восток","отключить") switch(setdir) - if("north") + if("север") targetdirection = 1 - if("south") + if("юг") targetdirection = 2 - if("east") + if("восток") targetdirection = 4 - if("west") + if("запад") targetdirection = 8 - if("disable") + if("отключить") targetdirection = null update_controls() @@ -184,7 +193,7 @@ nag() if(prob(5)) - audible_message("[src] makes an excited booping beeping sound!") + custom_emote(EMOTE_VISIBLE, "бупает и бипает!") //Normal scanning procedure. We have tiles loaded, are not emagged. if(!target && emagged < 2 && amount > 0) @@ -238,7 +247,7 @@ F.break_tile_to_plating() else F.ReplaceWithLattice() - audible_message(span_danger("[src] makes an excited booping sound.")) + custom_emote(EMOTE_VISIBLE, "бупает.") addtimer(CALLBACK(src, PROC_REF(inc_amount_callback)), 5 SECONDS) path = list() @@ -276,7 +285,7 @@ /mob/living/simple_animal/bot/floorbot/proc/nag() //Annoy everyone on the channel to refill us! if(!nagged) - speak("Requesting refill at [get_area(src)]!", radio_channel) + speak("Запрашивается пополнение стройматериалов в локации [get_area(src)]!", radio_channel) nagged = TRUE @@ -337,7 +346,7 @@ set_anchored(TRUE) if(isspaceturf(target_turf)) //If we are fixing an area not part of pure space, it is - visible_message(span_notice("[targetdirection ? "[src] begins installing a bridge plating." : "[src] begins to repair the hole."]")) + custom_emote(EMOTE_VISIBLE, "[targetdirection ? "начинает строить сегмент моста." : "начинает заделывать пробоину."]") mode = BOT_REPAIRING update_icon() addtimer(CALLBACK(src, PROC_REF(make_bridge_plating), target_turf), 5 SECONDS) @@ -346,7 +355,7 @@ var/turf/simulated/floor/F = target_turf mode = BOT_REPAIRING update_icon() - visible_message(span_notice("[src] begins repairing the floor.")) + custom_emote(EMOTE_VISIBLE, "начинает ремонтировать пол.") addtimer(CALLBACK(src, PROC_REF(make_bridge_plating), F), 5 SECONDS) @@ -380,7 +389,7 @@ /mob/living/simple_animal/bot/floorbot/proc/start_eattile(obj/item/stack/tile/plasteel/T) if(!istype(T, /obj/item/stack/tile/plasteel)) return - visible_message(span_notice("[src] begins to collect tiles.")) + custom_emote(EMOTE_VISIBLE, "начинает собирать плитки.") mode = BOT_REPAIRING addtimer(CALLBACK(src, PROC_REF(do_eattile), T), 2 SECONDS) @@ -407,7 +416,7 @@ /mob/living/simple_animal/bot/floorbot/proc/start_maketile(obj/item/stack/sheet/metal/M) if(!istype(M, /obj/item/stack/sheet/metal)) return - visible_message(span_notice("[src] begins to create tiles.")) + custom_emote(EMOTE_VISIBLE, "начинает создавать плитки.") mode = BOT_REPAIRING addtimer(CALLBACK(src, PROC_REF(do_maketile), M), 2 SECONDS) @@ -442,7 +451,7 @@ /mob/living/simple_animal/bot/floorbot/explode() on = FALSE - visible_message("[src] blows apart!") + visible_message(span_userdanger("[capitalize(declent_ru(NOMINATIVE))] разлетается на части!")) var/turf/Tsec = get_turf(src) var/obj/item/storage/toolbox/mechanical/N = new /obj/item/storage/toolbox/mechanical(Tsec) N.contents = list() diff --git a/code/modules/mob/living/simple_animal/bot/griefsky.dm b/code/modules/mob/living/simple_animal/bot/griefsky.dm index d426c808ad5..865dc05a854 100644 --- a/code/modules/mob/living/simple_animal/bot/griefsky.dm +++ b/code/modules/mob/living/simple_animal/bot/griefsky.dm @@ -1,11 +1,19 @@ /mob/living/simple_animal/bot/secbot/griefsky //This bot is powerful. If you managed to get 4 eswords somehow, you deserve this horror. Emag him for best results. name = "\improper General Griefsky" - desc = "Is that a secbot with four eswords in its arms...?" + desc = "Это охранный робот с четырьмя лазерными мечами в руках..?" + ru_names = list( + NOMINATIVE = "Генерал Грифски", + GENITIVE = "Генерала Грифски", + DATIVE = "Генералу Грифски", + ACCUSATIVE = "Генерала Грифски", + INSTRUMENTAL = "Генералом Грифски", + PREPOSITIONAL = "Генерале Грифски", + ) icon_state = "griefsky0" health = 100 maxHealth = 100 base_icon = "griefsky" - window_name = "Automatic Security Unit v3.0" + window_name = "Автоматическая Охранная Единица v3.0" var/spin_icon = "griefsky-c" // griefsky and griefsky junior have dif icons var/weapon = /obj/item/melee/energy/sword @@ -22,7 +30,15 @@ /mob/living/simple_animal/bot/secbot/griefsky/toy //A toy version of general griefsky! name = "Genewul Giftskee" - desc = "An adorable looking secbot with four toy swords taped to its arms" + desc = "Очаровательный охранный робот с четырьмя игрушечными мечами в руках. Прелесть!" + ru_names = list( + NOMINATIVE = "Гиневал Гифтски", + GENITIVE = "Гиневала Гифтски", + DATIVE = "Гиневалу Гифтски", + ACCUSATIVE = "Гиневала Гифтски", + INSTRUMENTAL = "Гиневалом Гифтски", + PREPOSITIONAL = "Гиневале Гифтски", + ) spin_icon = "griefskyj-c" health = 50 maxHealth = 50 @@ -42,12 +58,20 @@ /mob/living/simple_animal/bot/secbot/griefsky/syndicate - radio_channel = "SyndTaipan" - name = "Генерал Синди" + name = "General Syndie" + desc = "В процессе его создания пострадало как минимум 24 агента. 22 из них не выжили..." + ru_names = list( + NOMINATIVE = "Генерал Синди", + GENITIVE = "Генерала Синди", + DATIVE = "Генералу Синди", + ACCUSATIVE = "Генерала Синди", + INSTRUMENTAL = "Генералом Синди", + PREPOSITIONAL = "Генерале Синди", + ) icon_state = "general_syndie0" base_icon = "general_syndie" spin_icon = "general_syndie-c" - desc = "В процессе его создания пострадало как минимум 24 агента. 22 из них не выжили..." + radio_channel = "SyndTaipan" faction = list("syndicate") allow_pai = TRUE auto_patrol = TRUE @@ -90,7 +114,7 @@ if(!iscarbon(arrived) || arrived != target || in_range(src, arrived)) return FALSE - visible_message(span_danger("[src] flails his swords and pushes [arrived] out of it's way!")) + visible_message(span_danger("[capitalize(declent_ru(NOMINATIVE))] размахивает своими мечами и отталкивает [arrived]!")) arrived.Weaken(4 SECONDS) @@ -105,7 +129,7 @@ /mob/living/simple_animal/bot/secbot/griefsky/bullet_act(obj/item/projectile/P) //so uncivilized retaliate(P.firer) if((icon_state == spin_icon) && (prob(block_chance_ranged))) //only when the eswords are on - visible_message("[src] deflects [P] with its energy swords!") + visible_message("[capitalize(declent_ru(NOMINATIVE))] отражает [P] своим мечом!") playsound(loc, 'sound/weapons/blade1.ogg', 50, 1, 0) else ..() @@ -113,7 +137,7 @@ /mob/living/simple_animal/bot/secbot/griefsky/proc/sword_attack(mob/living/carbon/C) // esword attack if((HAS_TRAIT(src, TRAIT_PACIFISM) || GLOB.pacifism_after_gt) && dmg) if(usr) - to_chat(usr, span_warning("You don't want to harm other living beings!")) + balloon_alert(usr, "никакого насилия!") return do_attack_animation(C) playsound(loc, 'sound/weapons/blade1.ogg', 50, TRUE, -1) @@ -133,12 +157,12 @@ var/area/location = get_area(src) if(!spam_flag) if(syndie) - speak("Back away! I will deal with this [("syndicate" in C.faction) ? "level [threat]" : "Nanotrasen"] swine [C] in [location] myself!.", radio_channel) + speak("Контакт! [C] [threat] уровня угрозы, место - [location]! Сейчас нашинкую этого [("syndicate" in C.faction) ? "ублюдка!" : "прихвостня НТ!"]", radio_channel) else - speak("Back away! I will deal with this level [threat] swine [C] in [location] myself!.", radio_channel) + speak("Контакт! [C] [threat] уровня угрозы, место - [location]! Сейчас нашинкую этого ублюдка!", radio_channel) spam_flag = TRUE addtimer(VARSET_CALLBACK(src, spam_flag, FALSE), 10 SECONDS) //to avoid spamming comms of sec for each hit - visible_message("[src] flails his swords and cuts [C]!") + visible_message("[capitalize(declent_ru(NOMINATIVE))] замахивается своими мечами и рубит [C]!") /mob/living/simple_animal/bot/secbot/griefsky/handle_automated_action() @@ -181,7 +205,7 @@ frustration = 0 else back_to_idle() - speak("You fool") + speak("Идиот...") else back_to_idle() @@ -210,7 +234,7 @@ else if(!("syndicate" in C.faction)) threatlevel = 20 if(is_taipan(z) && C.mind?.assigned_role != "Space Base Syndicate Comms Officer" && (check_for_mug(C.get_active_hand()) || check_for_mug(C.get_inactive_hand()))) - speak("[C.name] наглый вор! Положи кружку!", radio_channel) + speak("[C.name], наглый ты воришка! Положи кружку на место!", radio_channel) threatlevel += 4 else threatlevel = C.assess_threat(src) @@ -221,11 +245,11 @@ else if(threatlevel >= 4) target = C oldtarget_name = C.name - speak("You are a bold one") + speak("Ты больно смелый, как я погляжу, да?!") playsound(src,'sound/weapons/saberon.ogg',50,TRUE,-1) - visible_message("[src] ignites his energy swords!") + visible_message("[capitalize(declent_ru(NOMINATIVE))] включает свои лазерные мечи!") icon_state = "[base_icon]-c" - visible_message("[src] points at [C.name]!") + visible_message("[capitalize(declent_ru(NOMINATIVE))] указывает на [C.name]!") mode = BOT_HUNT INVOKE_ASYNC(src, PROC_REF(handle_automated_action)) break @@ -244,7 +268,7 @@ /mob/living/simple_animal/bot/secbot/griefsky/explode() SSmove_manager.stop_looping(src) - visible_message(span_boldannounceic("[src] lets out a huge cough as it blows apart!")) + visible_message(span_boldannounceic("[capitalize(declent_ru(NOMINATIVE))] разлетается на части!")) var/turf/Tsec = get_turf(src) new /obj/item/assembly/prox_sensor(Tsec) var/obj/item/secbot_assembly/Sa = new /obj/item/secbot_assembly(Tsec) @@ -272,7 +296,7 @@ /mob/living/simple_animal/bot/secbot/griefsky/bullet_act(obj/item/projectile/P) //so uncivilized retaliate(P.firer) if((icon_state == spin_icon) && (prob(block_chance_ranged))) //only when the eswords are on - visible_message("[src] deflects [P] with its energy swords!") + visible_message("[capitalize(declent_ru(NOMINATIVE))] отражает [P] своим мечом!") playsound(loc, 'sound/weapons/blade1.ogg', 50, 1, 0) else ..() @@ -285,7 +309,7 @@ if(icon_state != spin_icon) return if(prob(block_chance_melee)) - visible_message("[src] deflects [user]'s attack with his energy swords!") + visible_message("[capitalize(declent_ru(NOMINATIVE))] отражает атаку [user] своим мечом!") playsound(loc, 'sound/weapons/blade1.ogg', 50, TRUE, -1) return TRUE @@ -301,7 +325,7 @@ /mob/living/simple_animal/bot/secbot/griefsky/attackby(obj/item/I, mob/user, params) //cant touch or attack him while spinning if(icon_state == spin_icon && prob(block_chance_melee)) // FFS! have no time to rework this now user.do_attack_animation(src) - visible_message("[src] deflects [user]'s move with his energy swords!") + visible_message("[capitalize(declent_ru(NOMINATIVE))] блокирует атаку [user] своими мечами!") playsound(loc, 'sound/weapons/blade1.ogg', 50, TRUE, -1) return ATTACK_CHAIN_BLOCKED_ALL return ..() diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm index 56a52393439..eb6296117a1 100644 --- a/code/modules/mob/living/simple_animal/bot/honkbot.dm +++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm @@ -1,6 +1,14 @@ /mob/living/simple_animal/bot/honkbot name = "\improper honkbot" - desc = "A little robot. It looks happy with its bike horn." + desc = "Маленький робот. У него есть гудок. Он счастлив." + ru_names = list( + NOMINATIVE = "хонкобот", + GENITIVE = "хонкобота", + DATIVE = "хонкоботу", + ACCUSATIVE = "хонкобота", + INSTRUMENTAL = "хонкоботом", + PREPOSITIONAL = "хонкоботе", + ) icon = 'icons/obj/aibots.dmi' icon_state = "honkbot" density = FALSE @@ -15,7 +23,7 @@ model = "Honkbot" bot_core_type = /obj/machinery/bot_core/honkbot window_id = "autohonk" - window_name = "Honkomatic Bike Horn Unit v1.0.7" + window_name = "Хонкоматическая Клоуновая Единица v1.0.7" data_hud_type = DATA_HUD_SECURITY_BASIC // show jobs path_image_color = "#FF69B4" @@ -78,9 +86,9 @@ /mob/living/simple_animal/bot/honkbot/set_custom_texts() - text_hack = "You overload [name]'s sound control system" - text_dehack = "You reboot [name] and restore the sound control system." - text_dehack_fail = "[name] refuses to accept your authority!" + text_hack = "Вы перегрузили звуковую систему [declent_ru(GENITIVE)]." + text_dehack = "Вы восстановили звуковую систему [declent_ru(GENITIVE)]." + text_dehack_fail = "[capitalize(declent_ru(NOMINATIVE))] отказывается вам подчиняться!" /mob/living/simple_animal/bot/honkbot/get_controls(mob/user) @@ -88,15 +96,15 @@ dat += hack(user) dat += showpai(user) dat += text({" - Honkomatic Bike Horn Unit v1.0.7 controls

- Status: []
- Behaviour controls are [locked ? "locked" : "unlocked"]
- Maintenance panel is [open ? "opened" : "closed"]
"}, + Панель управления Хонкоматической Клоуновой Единицей v1.0.7

+ Состояние: []
+ Управление поведением [locked ? "заблокировано" : "разблокировано"]
+ Панель технического обслуживания [open ? "открыта" : "закрыта"]
"}, - "[on ? "On" : "Off"]") + "[on ? "Включён" : "Выключен"]") if(!locked || issilicon(user) || user.can_admin_interact()) - dat += "Auto Patrol [auto_patrol ? "On" : "Off"]
" + dat += "Режим патрулирования: [auto_patrol ? "Да" : "Нет"]
" return dat @@ -118,9 +126,9 @@ ..() if(emagged == 2) if(user) - to_chat(user, span_warning("You short out [src]'s target assessment circuits. It gives out an evil laugh!!")) + to_chat(user, span_warning("Вы замыкаете микросхемы системы целеуказания [declent_ru(GENITIVE)]. [capitalize(declent_ru(NOMINATIVE))] злобно смеётся!")) oldtarget_name = user.name - audible_message(span_danger("[src] gives out an evil laugh!")) + audible_message(span_danger("[capitalize(declent_ru(NOMINATIVE))] злобно смеётся!")) playsound(src, 'sound/machines/honkbot_evil_laugh.ogg', 75, TRUE, -1) // evil laughter update_icon() @@ -205,8 +213,8 @@ threatlevel = 6 // will never let you go addtimer(VARSET_CALLBACK(src, spam_flag, FALSE), cooldowntime) add_attack_logs(src, C, "honked by [src]") - C.visible_message("[src] has honked [C]!",\ - "[src] has honked you!") + C.visible_message(span_danger("[capitalize(declent_ru(NOMINATIVE))] хонкнул [C]!"), + span_userdanger("[capitalize(declent_ru(NOMINATIVE))] хонкнул вас!")) else C.Stuttering(40 SECONDS) C.Stun(20 SECONDS) @@ -295,8 +303,8 @@ target = C oldtarget_name = C.name bike_horn() - speak("Honk!") - visible_message("[src] starts chasing [C.name]!") + speak("Хонк!") + visible_message("[capitalize(declent_ru(NOMINATIVE))] начинает гнаться за [C.name]!") mode = BOT_HUNT INVOKE_ASYNC(src, PROC_REF(handle_automated_action)) break @@ -309,7 +317,7 @@ /mob/living/simple_animal/bot/honkbot/explode() //doesn't drop cardboard nor its assembly, since its a very frail material. SSmove_manager.stop_looping(src) - visible_message(span_boldannounceic("[src] blows apart!")) + visible_message(span_userdanger("[capitalize(declent_ru(NOMINATIVE))] разлетается на части!")) var/turf/Tsec = get_turf(src) new /obj/item/bikehorn(Tsec) new /obj/item/assembly/prox_sensor(Tsec) @@ -336,14 +344,14 @@ return arrived.visible_message(span_warning("[pick( \ - "[arrived] dives out of [src]'s way!", \ - "[arrived] stumbles over [src]!", \ - "[arrived] jumps out of [src]'s path!", \ - "[arrived] trips over [src] and falls!", \ - "[arrived] topples over [src]!", \ - "[arrived] leaps out of [src]'s way!")]")) + "[arrived] спотыка[pluralize_ru(arrived.gender, "ет", "ют")]ся об [declent_ru(GENITIVE)]!", \ + "[arrived] опрокидыва[pluralize_ru(arrived.gender, "ет", "ют")]ся на [declent_ru(GENITIVE)]!", \ + "[arrived] отлета[pluralize_ru(arrived.gender, "ет", "ют")] с пути [declent_ru(GENITIVE)]!", \ + "[capitalize(declent_ru(NOMINATIVE))] сбивает [arrived]!", \ + "[capitalize(declent_ru(NOMINATIVE))] влетает в [arrived], заставляя [genderize_ru(arrived.gender, "его", "её", "его", "их")] упасть!", \ + "[capitalize(declent_ru(NOMINATIVE))] опрокидывает [arrived]!")]")) arrived.Weaken(10 SECONDS) if(!client) - INVOKE_ASYNC(src, PROC_REF(speak), "honk") + INVOKE_ASYNC(src, PROC_REF(speak), "хонк!") sensor_blink() diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm index c655f81514f..49b6e53e178 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -1,7 +1,15 @@ //Medbot /mob/living/simple_animal/bot/medbot name = "\improper Medibot" - desc = "A little medical robot. He looks somewhat underwhelmed." + desc = "Маленький медицинский робот. Выглядит несколько подавленным." + ru_names = list( + NOMINATIVE = "медбот", + GENITIVE = "медбота", + DATIVE = "медботу", + ACCUSATIVE = "медбота", + INSTRUMENTAL = "медботом", + PREPOSITIONAL = "медботе", + ) icon = 'icons/obj/aibots.dmi' icon_state = "medibot0" density = FALSE @@ -15,10 +23,10 @@ bot_type = MED_BOT bot_filter = RADIO_MEDBOT model = "Medibot" - bot_purpose = "seek out hurt crewmembers and ensure that they are healed" + bot_purpose = "найти раненых членов экипажа и проследить, чтобы они были исцелены" bot_core_type = /obj/machinery/bot_core/medbot window_id = "automed" - window_name = "Automatic Medical Unit v1.1" + window_name = "Автоматическая Медицинская Единица v1.1" path_image_color = "#DDDDFF" data_hud_type = DATA_HUD_MEDICAL_ADVANCED @@ -85,7 +93,15 @@ /mob/living/simple_animal/bot/medbot/mysterious name = "\improper Mysterious Medibot" - desc = "International Medibot of mystery." + desc = "Загадочный медбот. От него веет тайнами..." + ru_names = list( + NOMINATIVE = "загадочный медбот", + GENITIVE = "загадочного медбота", + DATIVE = "загадочному медботу", + ACCUSATIVE = "загадочного медбота", + INSTRUMENTAL = "загадочным медботом", + PREPOSITIONAL = "загадочном медботе", + ) skin = "bezerk" treatment_oxy = "perfluorodecalin" treatment_brute = "bicaridine" @@ -94,7 +110,15 @@ /mob/living/simple_animal/bot/medbot/syndicate name = "Suspicious Medibot" - desc = "You'd better have insurance!" + desc = "Вам лучше быть застрахованным!" + ru_names = list( + NOMINATIVE = "подозрительный медбот", + GENITIVE = "подозрительного медбота", + DATIVE = "подозрительному медботу", + ACCUSATIVE = "подозрительного медбота", + INSTRUMENTAL = "подозрительным медботом", + PREPOSITIONAL = "подозрительном медботе", + ) skin = "bezerk" faction = list("syndicate") treatment_oxy = "perfluorodecalin" @@ -107,7 +131,6 @@ radio_channel = "Syndicate" radio_config = list("Common" = 1, "Medical" = 1, "Syndicate" = 1) - /mob/living/simple_animal/bot/medbot/syndicate/Initialize(mapload, new_skin) . = ..() Radio.syndiekey = new /obj/item/encryptionkey/syndicate @@ -172,26 +195,26 @@ /mob/living/simple_animal/bot/medbot/set_custom_texts() - text_hack = "You corrupt [name]'s reagent processor circuits." - text_dehack = "You reset [name]'s reagent processor circuits." - text_dehack_fail = "[name] seems damaged and does not respond to reprogramming!" + text_hack = "Вы взломали микросхемы синтезатора реагентов [declent_ru(GENITIVE)]." + text_dehack = "Вы восстановили микросхемы синтезатора реагентов [declent_ru(GENITIVE)]." + text_dehack_fail = "[capitalize(declent_ru(NOMINATIVE))] выглядит повреждённым и не может быть перепрограммирован!" /mob/living/simple_animal/bot/medbot/get_controls(mob/user) var/dat dat += hack(user) dat += showpai(user) - dat += "Medical Unit Controls v1.1

" - dat += "Status: [on ? "On" : "Off"]
" - dat += "Maintenance panel panel is [open ? "opened" : "closed"]
" - dat += "Beaker: " + dat += "Панель управления медицинским роботом v1.1

" + dat += "Состояние: [on ? "Включён" : "Выключен"]
" + dat += "Панель технического обслуживания [open ? "открыта" : "закрыта"]
" + dat += "Ёмкость: " if(reagent_glass) - dat += "Loaded \[[reagent_glass.reagents.total_volume]/[reagent_glass.reagents.maximum_volume]\]" + dat += "Установлена \[[reagent_glass.reagents.total_volume]/[reagent_glass.reagents.maximum_volume]\]" else - dat += "None Loaded" - dat += "
Behaviour controls are [locked ? "locked" : "unlocked"]
" + dat += "Не установлена" + dat += "
Управление поведением [locked ? "заблокировано" : "разблокировано"]
" if(!locked || issilicon(user) || user.can_admin_interact()) - dat += "Healing Threshold: " + dat += "Порог лечения: " dat += "-- " dat += "- " dat += "[heal_threshold] " @@ -199,20 +222,20 @@ dat += "++" dat += "
" - dat += "Injection Level: " + dat += "Объём инъекции: " dat += "- " dat += "[injection_amount] " dat += "+ " dat += "
" - dat += "Reagent Source: " - dat += "[use_beaker ? "Loaded Beaker (When available)" : "Internal Synthesizer"]
" + dat += "Источник реагентов: " + dat += "[use_beaker ? "Установленная ёмкость (Если доступна)" : "Внутренний синтезатор"]
" - dat += "Treat Viral Infections: [treat_virus ? "Yes" : "No"]
" - dat += "The speaker switch is [shut_up ? "off" : "on"]. Toggle
" - dat += "Critical Patient Alerts: [declare_crit ? "Yes" : "No"]
" - dat += "Patrol Station: [auto_patrol ? "Yes" : "No"]
" - dat += "Stationary Mode: [stationary_mode ? "Yes" : "No"]
" + dat += "Лечить вирусные инфекции: [treat_virus ? "Да" : "Нет"]
" + dat += "Динамик [shut_up ? "выключен" : "включён"]. Переключить
" + dat += "Оповещать о тяжелораненых: [declare_crit ? "Да" : "Нет"]
" + dat += "Режим патрулирования: [auto_patrol ? "Да" : "Нет"]
" + dat += "Стационарный режим: [stationary_mode ? "Да" : "Нет"]
" return dat @@ -241,8 +264,12 @@ use_beaker = !use_beaker else if(href_list["eject"] && (!isnull(reagent_glass))) - reagent_glass.forceMove(get_turf(src)) + if(ishuman(usr)) + usr.put_in_active_hand(reagent_glass, ignore_anim = FALSE) + else + reagent_glass.forceMove(get_turf(src)) reagent_glass = null + balloon_alert(usr, "ёмкость извлечена") else if(href_list["togglevoice"]) shut_up = !shut_up @@ -274,15 +301,15 @@ if(istype(I, /obj/item/reagent_containers/glass)) add_fingerprint(user) if(locked) - to_chat(user, span_warning("You cannot insert a beaker because the panel is locked!")) + balloon_alert(user, "техпанель заблокирована!") return ATTACK_CHAIN_PROCEED|ATTACK_CHAIN_NO_AFTERATTACK if(reagent_glass) - to_chat(user, span_warning("There is already a beaker loaded!")) + balloon_alert(user, "слот для ёмкости занят!") return ATTACK_CHAIN_PROCEED|ATTACK_CHAIN_NO_AFTERATTACK if(!user.drop_transfer_item_to_loc(I, src)) return ..() | ATTACK_CHAIN_NO_AFTERATTACK reagent_glass = I - to_chat(user, span_notice("You insert [I].")) + balloon_alert(user, "ёмкость установлена") show_controls(user) return ATTACK_CHAIN_PROCEED_SUCCESS|ATTACK_CHAIN_NO_AFTERATTACK @@ -298,8 +325,8 @@ if(emagged == 2) declare_crit = FALSE if(user) - to_chat(user, span_notice("You short out [src]'s reagent synthesis circuits.")) - audible_message(span_danger("[src] buzzes oddly!")) + to_chat(user, span_notice("Вы замыкаете микросхемы синтеза реагентов [declent_ru(GENITIVE)].")) + audible_message(span_danger("[capitalize(declent_ru(NOMINATIVE))] странно жужжит.")) flick("medibot_spark", src) if(user) oldpatient = user @@ -308,7 +335,7 @@ /mob/living/simple_animal/bot/medbot/process_scan(mob/living/carbon/human/H) if(buckled) if((last_warning + 30 SECONDS) < world.time) - speak(span_danger("Movement restrained! Unit on standby!")) + speak(span_danger("Движение невозможно! Режим ожидания.")) playsound(loc, 'sound/machines/buzz-two.ogg', 50, FALSE) last_warning = world.time return @@ -316,14 +343,15 @@ return if((H == oldpatient) && (world.time < last_found + 20 SECONDS)) + return if(assess_patient(H)) last_found = world.time if((last_newpatient_speak + 30 SECONDS) < world.time) //Don't spam these messages! - var/list/messagevoice = list("Hey, [H.name]! Hold on, I'm coming." = 'sound/voice/mcoming.ogg', - "Wait [H.name]! I want to help!" = 'sound/voice/mhelp.ogg', - "[H.name], you appear to be injured!" = 'sound/voice/minjured.ogg') + var/list/messagevoice = list("Эй, [H.name]! Держись, я уже иду!" = 'sound/voice/mcoming.ogg', + "Подожди, [H.name]! Я спешу на помощь!" = 'sound/voice/mhelp.ogg', + "[H.name], кажется, вы ранены!" = 'sound/voice/minjured.ogg') var/message = pick(messagevoice) speak(message) playsound(loc, messagevoice[message], 50, FALSE) @@ -344,11 +372,11 @@ if(!patient) if(!shut_up && prob(1)) - var/list/messagevoice = list("Radar, put a mask on!" = 'sound/voice/mradar.ogg', - "There's always a catch, and I'm the best there is." = 'sound/voice/mcatch.ogg', - "I knew it, I should've been a plastic surgeon." = 'sound/voice/msurgeon.ogg', - "What kind of medbay is this? Everyone's dropping like flies." = 'sound/voice/mflies.ogg', - "Delicious!" = 'sound/voice/mdelicious.ogg') + var/list/messagevoice = list("Ты, надень свою маску!" = 'sound/voice/mradar.ogg', + "Что-то всегда идёт не так, но я справлюсь." = 'sound/voice/mcatch.ogg', + "А ведь я мог бы стать пластическим хирургом..." = 'sound/voice/msurgeon.ogg', + "Что это за медотсек? Все мрут, словно мухи." = 'sound/voice/mflies.ogg', + "Замечательно!") var/message = pick(messagevoice) speak(message) playsound(loc, messagevoice[message], 50, FALSE) @@ -501,9 +529,9 @@ return if(C.stat == DEAD || HAS_TRAIT(C, TRAIT_FAKEDEATH)) - var/list/messagevoice = list("No! Stay with me!" = 'sound/voice/mno.ogg', - "Live, damnit! LIVE!" = 'sound/voice/mlive.ogg', - "I...I've never lost a patient before. Not today, I mean." = 'sound/voice/mlost.ogg') + var/list/messagevoice = list("Нет, не оставляй меня!" = 'sound/voice/mno.ogg', + "Живи, чёрт возьми! ЖИВИ!" = 'sound/voice/mlive.ogg', + "Я... Я ещё не терял пациента. Не сегодня, имею ввиду." = 'sound/voice/mlost.ogg') var/message = pick(messagevoice) speak(message) playsound(loc, messagevoice[message], 50, FALSE) @@ -521,9 +549,9 @@ reagent_id = select_medication(C, beaker_injection) if(!reagent_id) //If they don't need any of that they're probably cured! - var/list/messagevoice = list("All patched up!" = 'sound/voice/mpatchedup.ogg', - "An apple a day keeps me away." = 'sound/voice/mapple.ogg', - "Feel better soon!" = 'sound/voice/mfeelbetter.ogg') + var/list/messagevoice = list("Как новенький!" = 'sound/voice/mpatchedup.ogg', + "Кто яблоко в день съедает, у того [declent_ru(NOMINATIVE)] не бывает!" = 'sound/voice/mapple.ogg', + "Скоро полегчает!" = 'sound/voice/mfeelbetter.ogg') var/message = pick(messagevoice) speak(message) playsound(loc, messagevoice[message], 50, FALSE) @@ -533,8 +561,8 @@ if(!emagged && !hijacked && check_overdose(patient, reagent_id, injection_amount)) soft_reset() return - C.visible_message(span_danger("[src] is trying to inject [patient]!"), - span_userdanger("[src] is trying to inject you!")) + C.visible_message(span_danger("[capitalize(declent_ru(NOMINATIVE))] пытается сделать укол [patient]!"), + span_userdanger("[capitalize(declent_ru(NOMINATIVE))] пытается сделать вам укол!")) addtimer(CALLBACK(src, PROC_REF(do_inject), C, !isnull(beaker_injection), reagent_id), 3 SECONDS) @@ -551,10 +579,10 @@ else patient.reagents.add_reagent(reagent_id, injection_amount) - C.visible_message(span_danger("[src] injects [patient] with its syringe!"), - span_userdanger("[src] injects you with its syringe!")) + C.visible_message(span_danger("[capitalize(declent_ru(NOMINATIVE))] сделал укол [patient] своим шприцем!"), + span_userdanger("[capitalize(declent_ru(NOMINATIVE))] сделал вам укол своим шприцем!")) else - visible_message("[src] retracts its syringe.") + visible_message("[capitalize(declent_ru(NOMINATIVE))] убирает свой шприц.") update_icon() soft_reset() @@ -572,7 +600,7 @@ /mob/living/simple_animal/bot/medbot/explode() on = FALSE - visible_message(span_userdanger("[src] blows apart!")) + visible_message(span_userdanger("[capitalize(declent_ru(NOMINATIVE))] разлетается на части!")) var/turf/Tsec = get_turf(src) if(drops_parts) @@ -623,7 +651,7 @@ if(syndicate_aligned) return var/area/location = get_area(src) - speak("Medical emergency! [crit_patient ? "[crit_patient]" : "A patient"] is in critical condition at [location]!", radio_channel) + speak("Нужна срочная медицинская помощь! [crit_patient ? "[crit_patient]" : "Пациент"] в тяжёлом состоянии в локации [location]!", radio_channel) declare_cooldown = TRUE spawn(200) //Twenty seconds declare_cooldown = FALSE diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 28ca08789e5..61659f90974 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -8,7 +8,15 @@ /mob/living/simple_animal/bot/mulebot name = "\improper MULEbot" - desc = "A Multiple Utility Load Effector bot." + desc = "Многофункциональный Узкоспециализированный Легкомоторный робот. Нет, это не просто случайные слова, подобранные для красивого написания. Честно." + ru_names = list( + NOMINATIVE = "МУЛбот", + GENITIVE = "МУЛбота", + DATIVE = "МУЛботу", + ACCUSATIVE = "МУЛбота", + INSTRUMENTAL = "МУЛботом", + PREPOSITIONAL = "МУЛботе", + ) icon_state = "mulebot0" density = TRUE move_resist = MOVE_FORCE_STRONG @@ -26,7 +34,7 @@ bot_type = MULE_BOT bot_filter = RADIO_MULEBOT model = "MULE" - bot_purpose = "deliver crates and other packages between departments, as requested" + bot_purpose = "доставлять ящики и другие посылки получателям" bot_core_type = /obj/machinery/bot_core/mulebot path_image_color = "#7F5200" @@ -108,26 +116,24 @@ . = ..() if(!ATTACK_CHAIN_CANCEL_CHECK(.) && knock_off(1 + I.force * 2)) user.visible_message( - span_danger("[user] has knocked [cached_load] off [src]!"), - span_danger("You have knocked [cached_load] off [src]!"), + span_danger("[user] столкнул [cached_load] с [declent_ru(GENITIVE)]!"), + span_danger("Вы столкнули [cached_load] с [declent_ru(GENITIVE)]!"), ) return . if(istype(I,/obj/item/stock_parts/cell)) add_fingerprint(user) if(!open) - to_chat(user, span_warning("You should open the maintenance panel first.")) + balloon_alert(user, "техпанель закрыта!") return ATTACK_CHAIN_PROCEED if(cell) - to_chat(user, span_warning("The [name] already has a power cell installed.")) + balloon_alert(user, "слот батареи занят!") return ATTACK_CHAIN_PROCEED if(!user.drop_transfer_item_to_loc(I, src)) return ..() cell = I - user.visible_message( - span_notice("[user] has inserted a cell into [src]."), - span_notice("You have inserted the new cell into [src]."), - ) + visible_message(span_notice("[user] вставил батарею в [declent_ru(GENITIVE)].")) + balloon_alert(user, "вы вставили батарею внутрь") update_controls() return ATTACK_CHAIN_BLOCKED_ALL @@ -135,8 +141,8 @@ . = ..() if(!ATTACK_CHAIN_CANCEL_CHECK(.) && knock_off(1 + I.force * 2)) user.visible_message( - span_danger("[user] has knocked off [cached_load] from [src]!"), - span_danger("You have knocked off [cached_load] from [src]!"), + span_danger("[user] столкнул [cached_load] с [declent_ru(GENITIVE)]!"), + span_danger("Вы столкнули [cached_load] с [declent_ru(GENITIVE)]!"), ) @@ -163,37 +169,31 @@ . = TRUE if(health >= maxHealth) add_fingerprint(user) - to_chat(user, span_warning("[src] does not need a repair!")) + balloon_alert(user, "ремонт не требуется") return . user.visible_message( - span_notice("[user] starts to repair [src]."), - span_notice("You start to repair [src]..."), + span_notice("[user] ремонтиру[pluralize_ru(user.gender, "ет", "ют")] [declent_ru(GENITIVE)]."), + span_notice("Вы ремонтируете [declent_ru(GENITIVE)].") ) if(!I.use_tool(src, user, 2 SECONDS, volume = I.tool_volume) || health >= maxHealth) return . heal_damage_type(25, BRUTE) - user.visible_message( - span_notice("[user] has repaired [src]."), - span_notice("You have repaired [src]."), - ) /mob/living/simple_animal/bot/mulebot/crowbar_act(mob/living/user, obj/item/I) . = TRUE if(!open) add_fingerprint(user) - to_chat(user, span_warning("You should open the maintenance panel first.")) + 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 . - user.visible_message( - span_notice("[user] has removed the power cell from [src]."), - span_notice("You have removed the power cell from [src]."), - ) + visible_message(span_notice("[user] вынул батарею из [declent_ru(GENITIVE)].")) + balloon_alert(user, "батарея извлечена") cell.add_fingerprint(user) cell.forceMove(drop_location()) cell = null @@ -203,7 +203,7 @@ . = TRUE if(!open) add_fingerprint(user) - to_chat(user, span_warning("You should open the maintenance panel first.")) + balloon_alert(user, "техпанель закрыта!") return . if(!I.use_tool(src, user, volume = I.tool_volume)) return . @@ -214,7 +214,7 @@ . = TRUE if(!open) add_fingerprint(user) - to_chat(user, span_warning("You should open the maintenance panel first.")) + balloon_alert(user, "техпанель закрыта!") return . if(!I.use_tool(src, user, volume = I.tool_volume)) return . @@ -226,7 +226,7 @@ emagged = 1 if(!open) locked = !locked - to_chat(user, span_notice("You [locked ? "lock" : "unlock"] [src]'s controls!")) + balloon_alert(user, "техпанель [locked ? "заблокирована" : "разблокирована"]") flick("mulebot-emagged", src) playsound(loc, 'sound/effects/sparks1.ogg', 100, FALSE) @@ -266,7 +266,7 @@ if(prob(50) && !isnull(load)) unload(0) if(prob(25)) - visible_message(span_danger("Something shorts out inside [src]!")) + visible_message(span_danger("Что-то замыкается внутри [declent_ru(GENITIVE)]!")) wires.cut_random() @@ -285,11 +285,11 @@ turn_off() else if(cell && !open) if(!turn_on()) - to_chat(usr, span_warning("You can't switch on [src]!")) + to_chat(usr, span_warning("Вы не можете включить !")) return else return - visible_message("[usr] switches [on ? "on" : "off"] [src].") + visible_message("[usr] [on ? "включает" : "выключает"] [declent_ru(GENITIVE)].") if("cellremove") if(open && cell && !usr.get_active_hand()) cell.update_icon() @@ -298,8 +298,8 @@ cell.add_fingerprint(usr) cell = null - usr.visible_message(span_notice("[usr] removes the power cell from [src]."), - span_notice("You remove the power cell from [src].")) + usr.visible_message(span_notice("[usr] вынул батарею из [declent_ru(GENITIVE)]."), + span_notice("Вы вынули батарею из [declent_ru(GENITIVE)].")) if("cellinsert") if(open && !cell) var/obj/item/stock_parts/cell/C = usr.get_active_hand() @@ -308,8 +308,8 @@ cell = C C.add_fingerprint(usr) - usr.visible_message(span_notice("[usr] inserts a power cell into [src]."), - span_notice("You insert the power cell into [src].")) + usr.visible_message(span_notice("[usr] вставил батарею в [declent_ru(GENITIVE)]."), + span_notice("Вы вставили батарею в [declent_ru(GENITIVE)].")) if("stop") if(mode >= BOT_DELIVER) bot_reset() @@ -320,15 +320,15 @@ if(mode == BOT_IDLE || mode == BOT_DELIVER) start_home() if("destination") - var/new_dest = input(usr, "Enter Destination:", name, destination) as null|anything in GLOB.deliverybeacontags + var/new_dest = input(usr, "Введите пункт назначения:", name, destination) as null|anything in GLOB.deliverybeacontags if(new_dest) set_destination(new_dest) if("setid") - var/new_id = tgui_input_text(usr, "Enter ID:", name, suffix, MAX_NAME_LEN) + var/new_id = tgui_input_text(usr, "Введите ID:", name, suffix, MAX_NAME_LEN) if(new_id) set_suffix(new_id) if("sethome") - var/new_home = input(usr, "Enter Home:", name, home_destination) as null|anything in GLOB.deliverybeacontags + var/new_home = input(usr, "Введите домашнюю точку:", name, home_destination) as null|anything in GLOB.deliverybeacontags if(new_home) home_destination = new_home if("unload") @@ -352,7 +352,7 @@ update_controls() return TRUE else - to_chat(user, span_danger("Access denied.")) + balloon_alert(user, "отказано в доступе!") return FALSE @@ -362,16 +362,16 @@ var/dat dat += hack(user) dat += showpai(user) - dat += "

Multiple Utility Load Effector Mk. V

" + dat += "

Многофункциональный Узкоспециализированный Легкомоторный робот v5.0

" dat += "ID: [suffix]
" - dat += "Power: [on ? "On" : "Off"]
" + dat += "Питание: [on ? "Включён" : "Выключен"]
" if(!open) - dat += "

Status

" + dat += "

Состояние

" dat += "
" switch(mode) if(BOT_IDLE) - dat += "Ready" + dat += "Готовность" if(BOT_DELIVER) dat += "[mode_name[BOT_DELIVER]]" if(BOT_GO_HOME) @@ -384,40 +384,40 @@ dat += "[mode_name[BOT_NO_ROUTE]]" dat += "
" - dat += "Current Load: [load ? load.name : "none"]
" - dat += "Destination: [!destination ? "none" : destination]
" - dat += "Power level: [cell ? cell.percent() : 0]%" + dat += "Груз [load ? load.name : "отсутствует"]
" + dat += "Пункт назначения: [!destination ? "отсутствует" : destination]
" + dat += "Заряд: [cell ? cell.percent() : 0]%" if(locked && !ai && !user.can_admin_interact()) - dat += " 
Controls are locked
Unlock Controls" + dat += " 
Управление поведением заблокировано
Разблокировать" else - dat += " 
Controls are unlocked
Lock Controls

" - - dat += "Toggle Power
" - dat += "Stop
" - dat += "Proceed
" - dat += "Return to Home
" - dat += "Set Destination
" - dat += "Set Bot ID
" - dat += "Set Home
" - dat += "Toggle Auto Return Home ([auto_return ? "On":"Off"])
" - dat += "Toggle Auto Pickup Crate ([auto_pickup ? "On":"Off"])
" - dat += "Toggle Delivery Reporting ([report_delivery ? "On" : "Off"])
" + dat += " 
Управление поведением разблокировано
Заблокировать

" + + dat += "Включить/Выключить
" + dat += "Остановиться
" + dat += "Продолжить движение
" + dat += "Возврат домой
" + dat += "Задать точку назначения
" + dat += "Задать ID роботу
" + dat += "Задать домашнюю точку
" + dat += "[auto_return ? "Включить":"Выключить"] автоматическое возвращение домой
" + dat += "[auto_return ? "Включить":"Выключить"] автоматический подбор ящиков
" + dat += "[auto_return ? "Включить":"Выключить"] автоматический отчёт о доставке
" if(load) - dat += "Unload Now
" - dat += "
The maintenance hatch is closed.
" + dat += "Разгрузиться
" + dat += "
Панель технического обслуживания закрыта
" else if(!ai) - dat += "
The maintenance hatch is open.

" - dat += "Power cell: " + dat += "
Панель технического обслуживания открыта

" + dat += "Батарея: " if(cell) - dat += "Installed
" + dat += "Установлена
" else - dat += "Removed
" + dat += "Отсутствует
" wires.Interact(user) else - dat += "
The bot is in maintenance mode and cannot be controlled.

" + dat += "
Робот в режиме технического обслуживания - управление поведением заблокировано

" return dat @@ -430,13 +430,13 @@ /mob/living/simple_animal/bot/mulebot/proc/buzz(type) switch(type) if(SIGH) - audible_message("[src] makes a sighing buzz.") + audible_message("[capitalize(declent_ru(NOMINATIVE))] разочарованно гудит.") playsound(loc, 'sound/machines/buzz-sigh.ogg', 50, 0) if(ANNOYED) - audible_message("[src] makes an annoyed buzzing sound.") + audible_message("[capitalize(declent_ru(NOMINATIVE))] раздражённо жужжит.") playsound(loc, 'sound/machines/buzz-two.ogg', 50, 0) if(DELIGHT) - audible_message("[src] makes a delighted ping!") + audible_message("[capitalize(declent_ru(NOMINATIVE))] восторженно звенит!") playsound(loc, 'sound/machines/ping.ogg', 50, 0) @@ -708,21 +708,21 @@ /mob/living/simple_animal/bot/mulebot/proc/at_target() if(!reached_target) radio_channel = "Supply" //Supply channel - audible_message("[src] makes a chiming sound!") + audible_message("[capitalize(declent_ru(NOMINATIVE))] громко звенит!") playsound(loc, 'sound/machines/chime.ogg', 50, 0) reached_target = 1 if(pathset) //The AI called us here, so notify it of our arrival. loaddir = dir //The MULE will attempt to load a crate in whatever direction the MULE is "facing". if(calling_ai) - to_chat(calling_ai, "[bicon(src)] [src] wirelessly plays a chiming sound!") + to_chat(calling_ai, "[bicon(src)] [capitalize(declent_ru(NOMINATIVE))] удалённо проигрывает звук звонка!") playsound(calling_ai, 'sound/machines/chime.ogg',40, 0) calling_ai = null radio_channel = "AI Private" //Report on AI Private instead if the AI is controlling us. if(load) // if loaded, unload at target if(report_delivery) - speak("Destination [destination] reached. Unloading [load].", radio_channel) + speak("Пункт назначения [destination] достигнут. Выгружаю [load].", radio_channel) if(istype(load, /obj/structure/closet/crate)) var/obj/structure/closet/crate/C = load C.notifyRecipient(destination) @@ -741,7 +741,7 @@ if(AM && AM.Adjacent(src)) load(AM) if(report_delivery) - speak("Now loading [load] at [get_area(src)].", radio_channel) + speak("Загружаю [load] в локации [get_area(src)].", radio_channel) // whatever happened, check to see if we return home if(auto_return && home_destination && destination != home_destination) @@ -787,14 +787,14 @@ // usually just bumps, but if avoidance disabled knock over mobs if(isrobot(bumped_living)) - visible_message(span_danger("[src] bumps into [bumped_living]!")) + visible_message(span_danger("[capitalize(declent_ru(NOMINATIVE))] врезается в [bumped_living]!")) return . if(paicard) return . add_attack_logs(src, bumped_living, "Knocked down") - visible_message(span_danger("[src] knocks over [bumped_living]!")) + visible_message(span_danger("[capitalize(declent_ru(NOMINATIVE))] сбивает [bumped_living]!")) bumped_living.Weaken(16 SECONDS) @@ -802,8 +802,8 @@ if(H.player_logged)//No running over SSD people return add_attack_logs(src, H, "Run over (DAMTYPE: [uppertext(BRUTE)])") - H.visible_message(span_danger("[src] drives over [H]!"), - span_userdanger("[src] drives over you!")) + H.visible_message(span_danger("[capitalize(declent_ru(NOMINATIVE))] переезжает [H]!"), + span_userdanger("[capitalize(declent_ru(NOMINATIVE))] переезжает вас!")) playsound(loc, 'sound/effects/splat.ogg', 50, 1) var/damage = rand(5, 15) @@ -832,15 +832,15 @@ switch(command) if("start") if(load) - to_chat(src, span_warningbig("DELIVER [load] TO [destination]")) + to_chat(src, span_warningbig("ДОСТАВИТЬ [load] В ЛОКАЦИЮ [destination]")) else - to_chat(src, span_warningbig("PICK UP DELIVERY AT [destination]")) + to_chat(src, span_warningbig("ЗАБРАТЬ ГРУЗ В ЛОКАЦИИ [destination]")) if("unload", "load") if(load) - to_chat(src, span_warningbig("UNLOAD")) + to_chat(src, span_warningbig("ВЫГРУЗИТЬСЯ")) else - to_chat(src, span_warningbig("LOAD")) + to_chat(src, span_warningbig("ЗАГРУЗИТЬСЯ")) if("autoret", "autopick", "target") return else @@ -948,7 +948,7 @@ /mob/living/simple_animal/bot/mulebot/explode() - visible_message(span_userdanger("[src] blows apart!")) + visible_message(span_userdanger("[capitalize(declent_ru(NOMINATIVE))] разлетается на части!")) var/turf/Tsec = get_turf(src) new /obj/item/assembly/prox_sensor(Tsec) diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index bfd7453c1c0..9f9c4ed393c 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -3,7 +3,15 @@ /mob/living/simple_animal/bot/secbot name = "\improper Securitron" - desc = "A little security robot. He looks less than thrilled." + desc = "Маленький охранный робот. Он выглядит абсолютно спокойным." + ru_names = list( + NOMINATIVE = "охранный робот", + GENITIVE = "охранного робота", + DATIVE = "охранному роботу", + ACCUSATIVE = "охранного робота", + INSTRUMENTAL = "охранным роботом", + PREPOSITIONAL = "охранном роботе", + ) icon = 'icons/obj/aibots.dmi' icon_state = "secbot0" density = FALSE @@ -19,10 +27,10 @@ bot_type = SEC_BOT bot_filter = RADIO_SECBOT model = "Securitron" - bot_purpose = "seek out criminals, handcuff them, and report their location to security" + bot_purpose = "найти преступников, задержать их и доложить службе безопасности" bot_core_type = /obj/machinery/bot_core/secbot window_id = "autosec" - window_name = "Automatic Security Unit v1.6" + window_name = "Автоматическая Охранная Единица v1.6" path_image_color = "#FF0000" data_hud_type = DATA_HUD_SECURITY_ADVANCED @@ -55,7 +63,15 @@ /mob/living/simple_animal/bot/secbot/beepsky name = "Officer Beepsky" - desc = "It's Officer Beepsky! Powered by a potato and a shot of whiskey." + desc = "Это Офицер Бипски! Работает с помощью картофеля и рюмки виски." + ru_names = list( + NOMINATIVE = "Офицер Бипски", + GENITIVE = "Офицера Бипски", + DATIVE = "Офицеру Бипски", + ACCUSATIVE = "Офицера Бипски", + INSTRUMENTAL = "Офицером Бипски", + PREPOSITIONAL = "Офицере Бипски", + ) idcheck = FALSE weaponscheck = FALSE auto_patrol = TRUE @@ -72,13 +88,29 @@ /mob/living/simple_animal/bot/secbot/pingsky name = "Officer Pingsky" - desc = "It's Officer Pingsky! Delegated to satellite guard duty for harbouring anti-human sentiment." + desc = "Это Офицер Пингски! Переведён на охрану спутника за разжигание античеловеческих настроений." + ru_names = list( + NOMINATIVE = "Офицер Пингски", + GENITIVE = "Офицера Пингски", + DATIVE = "Офицеру Пингски", + ACCUSATIVE = "Офицера Пингски", + INSTRUMENTAL = "Офицером Пингски", + PREPOSITIONAL = "Офицере Пингски", + ) radio_channel = "AI Private" /mob/living/simple_animal/bot/secbot/ofitser name = "Prison Ofitser" - desc = "It's Prison Ofitser! Powered by the tears and sweat of prisoners." + desc = "Это Офицер Тюремски! Работает с помощью крови, пота и слёз заключённых." + ru_names = list( + NOMINATIVE = "Офицер Тюремски", + GENITIVE = "Офицера Тюремски", + DATIVE = "Офицеру Тюремски", + ACCUSATIVE = "Офицера Тюремски", + INSTRUMENTAL = "Офицером Тюремски", + PREPOSITIONAL = "Офицере Тюремски", + ) idcheck = FALSE weaponscheck = TRUE auto_patrol = TRUE @@ -86,7 +118,15 @@ /mob/living/simple_animal/bot/secbot/buzzsky name = "Officer Buzzsky" - desc = "It's Officer Buzzsky! Rusted and falling apart, he seems less than thrilled with the crew for leaving him in his current state." + desc = "Это Офицер Баззски! Проржавевший и разваливающийся на части, он явно не в восторге от того, что экипаж оставил его в таком состоянии." + ru_names = list( + NOMINATIVE = "Офицер Баззски", + GENITIVE = "Офицера Баззски", + DATIVE = "Офицеру Баззски", + ACCUSATIVE = "Офицера Баззски", + INSTRUMENTAL = "Офицером Баззски", + PREPOSITIONAL = "Офицере Баззски", + ) base_icon = "rustbot" icon_state = "rustbot0" declare_arrests = FALSE @@ -97,6 +137,14 @@ /mob/living/simple_animal/bot/secbot/armsky name = "Sergeant-at-Armsky" + ru_names = list( + NOMINATIVE = "Офицер Арсеналски", + GENITIVE = "Офицера Арсеналски", + DATIVE = "Офицеру Арсеналски", + ACCUSATIVE = "Офицера Арсеналски", + INSTRUMENTAL = "Офицером Арсеналски", + PREPOSITIONAL = "Офицере Арсеналски", + ) health = 45 idcheck = TRUE arrest_type = TRUE @@ -106,6 +154,14 @@ /mob/living/simple_animal/bot/secbot/podsky name = "Officer Podsky" + ru_names = list( + NOMINATIVE = "Офицер Подски", + GENITIVE = "Офицера Подски", + DATIVE = "Офицеру Подски", + ACCUSATIVE = "Офицера Подски", + INSTRUMENTAL = "Офицером Подски", + PREPOSITIONAL = "Офицере Подски", + ) health = 45 idcheck = TRUE arrest_type = TRUE @@ -152,9 +208,9 @@ /mob/living/simple_animal/bot/secbot/set_custom_texts() - text_hack = "You overload [name]'s target identification system." - text_dehack = "You reboot [name] and restore the target identification." - text_dehack_fail = "[name] refuses to accept your authority!" + text_hack = "Вы взломали систему идентификации целей [declent_ru(GENITIVE)]." + text_dehack = "Вы восстановили систему идентификации целей [declent_ru(GENITIVE)]." + text_dehack_fail = "[capitalize(declent_ru(NOMINATIVE))] отказывается признавать вашу власть!" /mob/living/simple_animal/bot/secbot/show_controls(mob/M) @@ -192,7 +248,7 @@ if (..()) return if(topic_denied(usr)) - to_chat(usr, "[src]'s interface is not responding!") + to_chat(usr, span_warning("Интерфейс [declent_ru(GENITIVE)] не отвечает!")) return add_fingerprint(usr) . = TRUE @@ -251,9 +307,9 @@ ..() if(emagged == 2) if(user) - to_chat(user, span_danger("You short out [src]'s target assessment circuits.")) + to_chat(user, span_danger("Вы замыкаете микросхемы системы целеуказания [declent_ru(GENITIVE)].")) oldtarget_name = user.name - audible_message(span_danger("[src] buzzes oddly!")) + audible_message(span_danger("[capitalize(declent_ru(NOMINATIVE))] странно жужжит!")) declare_arrests = FALSE icon_state = "[base_icon][on]" @@ -291,8 +347,8 @@ /mob/living/simple_animal/bot/secbot/proc/cuff(mob/living/carbon/C) mode = BOT_ARREST playsound(loc, 'sound/weapons/cablecuff.ogg', 30, TRUE, -2) - C.visible_message(span_danger("[src] is trying to put zipties on [C]!"), - span_userdanger("[src] is trying to put zipties on you!")) + C.visible_message(span_danger("[capitalize(declent_ru(NOMINATIVE))] начинает надевать стяжки на [C]!"), + span_userdanger("[capitalize(declent_ru(NOMINATIVE))] пытается надеть на вас стяжки!")) addtimer(CALLBACK(src, PROC_REF(cuff_callback), C), 6 SECONDS) @@ -304,6 +360,8 @@ return C.apply_restraints(new /obj/item/restraints/handcuffs/cable/zipties/used(null), ITEM_SLOT_HANDCUFFED, TRUE) + C.visible_message(span_danger("[capitalize(declent_ru(NOMINATIVE))] надел стяжки на [C]!"), + span_userdanger("[capitalize(declent_ru(NOMINATIVE))] надел на вас стяжки!")) playsound(loc, pick('sound/voice/bgod.ogg', 'sound/voice/biamthelaw.ogg', 'sound/voice/bsecureday.ogg', 'sound/voice/bradio.ogg', 'sound/voice/binsult.ogg', 'sound/voice/bcreep.ogg'), 50, 0) back_to_idle() @@ -328,11 +386,11 @@ if(declare_arrests) var/area/location = get_area(src) if(!speak_cooldown) - speak("[arrest_type ? "Detaining" : "Arresting"] level [threat] scumbag [C] in [location].", radio_channel) + speak("[arrest_type ? "Удерживаю" : "Задерживаю"] подонка по имени [C] в локации [location]. Уровень опасности - [threat].", radio_channel) speak_cooldown = TRUE addtimer(VARSET_CALLBACK(src, speak_cooldown, FALSE), SPEAK_COOLDOWN) - C.visible_message(span_danger("[src] has [harmbaton ? "beaten" : "stunned"] [C]!"), - span_userdanger("[src] has [harmbaton ? "beaten" : "stunned"] you!")) + C.visible_message(span_danger("[capitalize(declent_ru(NOMINATIVE))] [harmbaton ? "ударил" : "оглушил"] [C]!"), + span_userdanger("[capitalize(declent_ru(NOMINATIVE))] [harmbaton ? "ударил" : "оглушил"] вас!")) /mob/living/simple_animal/bot/secbot/Life(seconds, times_fired) @@ -483,9 +541,9 @@ else if(threatlevel >= 4) target = C oldtarget_name = C.name - speak("Level [threatlevel] infraction alert!") + speak("Вижу преступника! Уровень опасности - [threatlevel]!") playsound(loc, pick('sound/voice/bcriminal.ogg', 'sound/voice/bjustice.ogg', 'sound/voice/bfreeze.ogg'), 50, 0) - visible_message("[src] points at [C.name]!") + visible_message("[capitalize(declent_ru(NOMINATIVE))] указывает на [C.name]!") mode = BOT_HUNT INVOKE_ASYNC(src, PROC_REF(handle_automated_action)) break @@ -501,7 +559,7 @@ /mob/living/simple_animal/bot/secbot/explode() SSmove_manager.stop_looping(src) - visible_message("[src] blows apart!") + visible_message(span_userdanger("[capitalize(declent_ru(NOMINATIVE))] разлетается на части!")) var/turf/Tsec = get_turf(src) var/obj/item/secbot_assembly/Sa = new /obj/item/secbot_assembly(Tsec) Sa.build_step = 1 @@ -534,12 +592,12 @@ return arrived.visible_message(span_warning("[pick( \ - "[arrived] dives out of [src]'s way!", \ - "[arrived] stumbles over [src]!", \ - "[arrived] jumps out of [src]'s path!", \ - "[arrived] trips over [src] and falls!", \ - "[arrived] topples over [src]!", \ - "[arrived] leaps out of [src]'s way!")]")) + "[arrived] спотыка[pluralize_ru(arrived.gender, "ет", "ют")]ся об [declent_ru(GENITIVE)]!", \ + "[arrived] опрокидыва[pluralize_ru(arrived.gender, "ет", "ют")]ся на [declent_ru(GENITIVE)]!", \ + "[arrived] отлета[pluralize_ru(arrived.gender, "ет", "ют")] с пути [declent_ru(GENITIVE)]!", \ + "[capitalize(declent_ru(NOMINATIVE))] сбивает [arrived]!", \ + "[capitalize(declent_ru(NOMINATIVE))] влетает в [arrived], заставляя [genderize_ru(arrived.gender, "его", "её", "его", "их")] упасть!", \ + "[capitalize(declent_ru(NOMINATIVE))] опрокидывает [arrived]!")]")) arrived.Weaken(4 SECONDS) diff --git a/code/modules/mob/living/simple_animal/bot/syndicate.dm b/code/modules/mob/living/simple_animal/bot/syndicate.dm index b26619937d0..c8bcbcd2c71 100644 --- a/code/modules/mob/living/simple_animal/bot/syndicate.dm +++ b/code/modules/mob/living/simple_animal/bot/syndicate.dm @@ -1,7 +1,15 @@ /mob/living/simple_animal/bot/ed209/syndicate name = "Syndicate Sentry Bot" - desc = "A syndicate security bot." + desc = "Охранный робот Синдиката." + ru_names = list( + NOMINATIVE = "робот-часовой Синдиката", + GENITIVE = "робота-часового Синдиката", + DATIVE = "роботу-часовому Синдиката", + ACCUSATIVE = "робота-часового Синдиката", + INSTRUMENTAL = "роботом-часовым Синдиката", + PREPOSITIONAL = "роботе-часовом Синдиката", + ) model = "Guardian" icon = 'icons/obj/mecha/mecha.dmi' icon_state = "darkgygax" @@ -17,7 +25,7 @@ shoot_sound = 'sound/weapons/wave.ogg' anchored = TRUE window_id = "syndiebot" - window_name = "Syndicate Bot Interface" + window_name = "Интерфейс Часового Робота Синдиката" var/turf/saved_turf var/stepsound = 'sound/mecha/mechstep.ogg' var/area/syndicate_depot/core/depotarea @@ -54,7 +62,7 @@ /mob/living/simple_animal/bot/ed209/syndicate/ui_interact(mob/user, datum/tgui/ui = null) - to_chat(user, span_warning("[src] has no accessible control panel!")) + balloon_alert(user, "панель управления отсутствует!") return @@ -79,7 +87,7 @@ /mob/living/simple_animal/bot/ed209/syndicate/emag_act(mob/user) if(user) - to_chat(user, span_warning("[src] has no card reader slot!")) + balloon_alert(user, "сканер ID-карт отсутствует!") /mob/living/simple_animal/bot/ed209/syndicate/ed209_ai() @@ -87,9 +95,9 @@ if(saved_turf && current_turf != saved_turf) playsound(loc, stepsound, 40, TRUE) if(spawn_turf && !atoms_share_level(src, spawn_turf)) - raise_alert("[src] lost in space.") + raise_alert("[capitalize(declent_ru(NOMINATIVE))] потерялся в пространстве.") raised_alert = FALSE - raise_alert("[src] activated self-destruct.") + raise_alert("[capitalize(declent_ru(NOMINATIVE))] активировал протокол само-уничтожения.") qdel(src) saved_turf = current_turf switch(mode) @@ -183,13 +191,13 @@ if(depotarea) depotarea.list_remove(src, depotarea.guard_list) SSmove_manager.stop_looping(src) - visible_message(span_userdanger("[src] blows apart!")) + visible_message(span_userdanger("[capitalize(declent_ru(NOMINATIVE))] разлетается на части!")) do_sparks(3, 1, src) new /obj/effect/decal/cleanable/blood/oil(loc) var/obj/structure/mecha_wreckage/gygax/dark/wreck = new /obj/structure/mecha_wreckage/gygax/dark(loc) wreck.name = "sentry bot wreckage" - raise_alert("[src] destroyed.") + raise_alert("[capitalize(declent_ru(NOMINATIVE))] уничтожен.") qdel(src) diff --git a/tgui/packages/tgui/interfaces/BotClean.js b/tgui/packages/tgui/interfaces/BotClean.js index 7d73bc8e5cf..e43095641e0 100644 --- a/tgui/packages/tgui/interfaces/BotClean.js +++ b/tgui/packages/tgui/interfaces/BotClean.js @@ -20,71 +20,74 @@ export const BotClean = (props, context) => { - Swipe an ID card to {locked ? 'unlock' : 'lock'} this interface. + Проведите своей ID-картой, чтобы + {locked ? 'разблокировать' : 'заблокировать'} этот интерфейс. -
+
- +
-
+
act('blood')} />
{painame && ( -
+
-
+
act('authid')} /> act('authweapon')} /> act('authwarrant')} />
-
+
act('arrtype')} /> act('arrdeclare')} />
{painame && ( -
+