diff --git a/.github/COMPONENTOWNERS.yml b/.github/COMPONENTOWNERS.yml index 020b9531bc1c..6c01aa197263 100644 --- a/.github/COMPONENTOWNERS.yml +++ b/.github/COMPONENTOWNERS.yml @@ -23,10 +23,10 @@ components: ## Иконки ## icons/: - /sprites-department + TauCetiStation/sprites-department ## Карты ## - maps/boxstation/: /maps-department + maps/boxstation/: TauCetiStation/maps-department #maps/delta/: Deahaka #maps/falcon/: Tap0r #maps/gamma/: AgRevol @@ -41,7 +41,7 @@ components: "*.py": volas "*.sh": volas - .github/: /maintainers + .github/: TauCetiStation/maintainers ignored-authors: - dependabot diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index bce96856d5ab..0c3785628578 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -685,7 +685,7 @@ Turf and target are seperate in case you want to teleport some distance from a t // Takes: Area type as text string or as typepath OR an instance of the area. // Returns: A list of all turfs in areas of that type of that type in the world. -// Please note that because of (loop in area) this is not really optimal, +// Please note that because of (loop in area) this is not really optimal, // but you probably have no choice /proc/get_area_turfs(areatype, subtypes=TRUE, filter_by_z = 0, ignore_blocked = FALSE) if(istext(areatype)) @@ -1645,12 +1645,12 @@ var/global/list/WALLITEMS = typecacheof(list( // Format a power value in W, kW, MW, or GW /proc/DisplayPower(powerused) if(powerused < 1000) // Less than a kW - return "[powerused] W" + return "[powerused] Вт" if(powerused < 1000000) // Less than a MW - return "[round((powerused * 0.001), 0.01)] kW" + return "[round((powerused * 0.001), 0.01)] кВт" if(powerused < 1000000000) // Less than a GW - return "[round((powerused * 0.000001), 0.001)] MW" - return "[round((powerused * 0.000000001), 0.0001)] GW" + return "[round((powerused * 0.000001), 0.001)] МВт" + return "[round((powerused * 0.000000001), 0.0001)] ГВТ" //Returns a list of all locations (except the area) the movable is within. /proc/get_nested_locs(atom/movable/AM, include_turf = FALSE) diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index eddd7e6435f3..22d88d852f85 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -239,8 +239,8 @@ /atom/movable/screen/alert icon = 'icons/hud/screen_alert.dmi' icon_state = "default" - name = "Alert" - desc = "Something seems to have gone wrong with this alert, so report this bug please" + name = "Тревога" + desc = "Похоже, что-то пошло не так с этим предупреждением, поэтому, пожалуйста, сообщите об этой ошибке" mouse_opacity = MOUSE_OPACITY_ICON var/timeout = 0 //If set to a number, this alert will clear itself after that many deciseconds @@ -277,81 +277,94 @@ //Gas alerts /atom/movable/screen/alert/oxy - name = "Choking" - desc = "You're not getting enough oxygen. Find some good air before you pass out! \ - The box in your backpack has an oxygen tank and gas mask in it." + name = "Удушение" + desc = "По каким-то причинам, вы не можете дышать! Выйдите на свежий воздух, пока не потеряли сознание! В вашем рюкзаке есть коробка с кислородным баллоном и маской." icon_state = "oxy" /atom/movable/screen/alert/tox_in_air - name = "Toxic Gas" - desc = "There's highly flammable, toxic plasma in the air and you're breathing it in. Find some fresh air. \ - The box in your backpack has an oxygen tank and gas mask in it." + name = "Токсичный газ" + desc = "В воздухе витает легковоспламеняющийся, токсичный форон, и вы дышите им. Выйдите на свежий воздух." icon_state = "tox_in_air" //End gas alerts /atom/movable/screen/alert/hot - name = "Too Hot" - desc = "You're flaming hot! Get somewhere cooler and take off any insulating clothing like a fire suit." + name = "Слишком жарко" + desc = "Вам жарко. Найдите прохладное место." icon_state = "hot" /atom/movable/screen/alert/cold - name = "Too Cold" - desc = "You're freezing cold! Get somewhere warmer and take off any insulating clothing like a space suit." + name = "Слишком холодно" + desc = "Вам холодно. Найдите тёплое место." icon_state = "cold" /atom/movable/screen/alert/lowpressure - name = "Low Pressure" - desc = "The air around you is hazardously thin. A space suit would protect you." + name = "Низкое давление" + desc = "Вокруг вас опасный уровень давления атмосферы. Скафандр бы вас защитил." icon_state = "lowpressure" /atom/movable/screen/alert/highpressure - name = "High Pressure" - desc = "The air around you is hazardously thick. A fire suit would protect you." + name = "Высокое давление" + desc = "Вокруг вас опасный уровень давления атмосферы. Скафандр бы вас защитил." icon_state = "highpressure" /atom/movable/screen/alert/blind - name = "Blind" - desc = "For whatever reason, you can't see. This may be caused by a genetic defect, eye trauma, being unconscious, \ - or something covering your eyes." + name = "Слепота" + desc = "По какой-то причине вы не можете видеть. Это может быть вызвано генетическим дефектом, травмой глаз, потерей сознания, \ + ну или что-то закрывает ваши глаза." icon_state = "blind" /atom/movable/screen/alert/high - name = "High" - desc = "Woah man, you're tripping balls! Careful you don't get addicted to this... if you aren't already." + name = "Кайф" + desc = "Воу, чувак, ты просто балдеешь! Осторожней, ты можешь стать зависимым... если не уже..." icon_state = "high" -/atom/movable/screen/alert/drunk //Not implemented - name = "Drunk" - desc = "All that alcohol you've been drinking is impairing your speech, motor skills, and mental cognition. Make sure to act like it." - icon_state = "drunk" +/atom/movable/screen/alert/drunk/slur + name = "Опьянение" + desc = "Ик! Ой... Да ФсЕ хоРошО! НеМНого МоЖно..." + icon_state = "drunk_slur" + +/atom/movable/screen/alert/drunk/confused + name = "Опьянение" + desc = "ЛаДНО, можИт НемНОгО..." + icon_state = "drunk_confused" + +/atom/movable/screen/alert/drunk/blur + name = "Опьянение" + desc = "ЗаВТра ТочнО бРОшу ПиТЬ!" + icon_state = "drunk_blur" + +/atom/movable/screen/alert/drunk/pass_out + name = "АпЬйаНЕнИе" + desc = "ПУШКА!!! КАК ЖЕ НАВОДИТ ПОРЧУУУЭЭЭЭЭ-" + icon_state = "drunk_pass_out" /atom/movable/screen/alert/embeddedobject - name = "Embedded Object" - desc = "Something got lodged into your flesh and is causing major bleeding. It might fall out with time, but surgery is the safest way. \ - If you're feeling frisky, click yourself in help intent to pull the object out." + name = "Застрявший предмет" + desc = "Что-то застряло в вашей плоти и вызывает сильную боль. Стоит попросить оказать медицинскую помощь. \ + Если это вам сильно мешает, то нажмите по себе правой кнопкой мыши и выберите 'Вытащить предмет' (yank object)." icon_state = "embeddedobject" /atom/movable/screen/alert/weightless - name = "Weightless" - desc = "Gravity has ceased affecting you, and you're floating around aimlessly. You'll need something large and heavy, like a \ - wall or lattice strucure, to push yourself off of if you want to move. A jetpack would enable free range of motion. A pair of \ - magboots would let you walk around normally on the floor. Barring those, you can throw things, use a fire extuingisher, \ - or shoot a gun to move around via Newton's 3rd Law of motion." + name = "Невесомость" + desc = "Гравитация перестала воздействовать на вас, и вы бесцельно плаваете вокруг. Вам понадобится что-нибудь большое и тяжелое, например \ + стена или решетчатая конструкция, чтобы можно было оттолкнуться и двигаться куда надо. Реактивный ранец обеспечил бы свободу передвижения. \ + Магнитные сапоги позволят вам нормально передвигаться по полу. Если их нет, вы можете бросать предметы, пользоваться огнетушителем, \ + или стрелять из пистолета, чтобы передвигаться в соответствии с 3-м законом Ньютона." icon_state = "weightless" //ALIENS /atom/movable/screen/alert/alien_tox - name = "Plasma" - desc = "There's flammable plasma in the air. If it lights up, you'll be toast." + name = "Плазма" + desc = "В воздухе витает горючая плазма. Если она загорится, вы будете поджарены." icon_state = "alien_tox" alerttooltipstyle = "alien" /atom/movable/screen/alert/alien_fire // This alert is temporarily gonna be thrown for all hot air but one day it will be used for literally being on fire - name = "Burning" - desc = "It's too hot! Flee to space or at least away from the flames. Standing on weeds will heal you up." + name = "Возгарание" + desc = "Горячо! Бегите подальше от огня! Полежите на вашей траве, чтобы немного исцелиться." icon_state = "alien_fire" alerttooltipstyle = "alien" @@ -369,87 +382,87 @@ //BLOBS /atom/movable/screen/alert/nofactory - name = "No Factory" - desc = "You have no factory, and are slowly dying!" + name = "Нет фабрики" + desc = "У вас нет фабрики и вы медленно умираете!" icon_state = "blobbernaut" //changeling /atom/movable/screen/alert/regen_stasis - name = "Regenerative Stasis" - desc = "You has entered in stasis. Just wait a little bit." + name = "Регенеративный стазис" + desc = "Вы вошли в стазис. Просто подождите немного." icon_state = "regen_stasis" //IANS /atom/movable/screen/alert/ian_oxy - name = "Choking" - desc = "You're not getting enough oxygen." + name = "Удушение" + desc = "Вам не хватает кислорода." icon_state = "ian_oxy" /atom/movable/screen/alert/ian_tox - name = "Gas" - desc = "There's gas in the air and you're breathing it in." + name = "Газ" + desc = "В воздухе есть газ, и вы вдыхаете его." icon_state = "ian_tox" /atom/movable/screen/alert/ian_hot - name = "Too Hot" - desc = "You're flaming hot!" + name = "Слишком жарко" + desc = "Вам жарко. Найдите способ остудиться." icon_state = "ian_hot" /atom/movable/screen/alert/ian_cold - name = "Too Cold" - desc = "You're freezing cold!" + name = "Слишком холодно" + desc = "Вам холодно. Найдите способ согреться." icon_state = "ian_cold" //SILICONS /atom/movable/screen/alert/nocell - name = "Missing Power Cell" - desc = "Unit has no power cell. No modules available until a power cell is reinstalled. Robotics may provide assistance." + name = "Нет батареи" + desc = "У юнита отсутствует батарея. Модули недоступны до тех пор, пока батарея не будет установлена. Робототехники могут оказать вам помощь." icon_state = "nocell" /atom/movable/screen/alert/emptycell - name = "Out of Power" - desc = "Unit's power cell has no charge remaining. No modules available until power cell is recharged. \ - Reharging stations are available in robotics, the dormitory's bathrooms. and the AI satelite." + name = "Севшая батарея" + desc = "В батарее юнита не осталось заряда. Модули недоступны до тех пор, пока элемент питания не будет заряжен. \ + Станции подзарядки имеются в робототехнике, в туалетах дормиторий, на станции подзарядки киборгов и на спутнике ИИ." icon_state = "emptycell" /atom/movable/screen/alert/lowcell - name = "Low Charge" - desc = "Unit's power cell is running low. Reharging stations are available in robotics, the dormitory's bathrooms. and the AI satelite." + name = "Низкий заряд" + desc = "Батарея скоро сядет. Станции подзарядки имеются в робототехнике, в туалетах дормиторий, на станции подзарядки киборгов и на спутнике ИИ." icon_state = "lowcell" //Need to cover all use cases - emag, illegal upgrade module, malf AI hack, traitor cyborg /atom/movable/screen/alert/hacked - name = "Hacked" - desc = "Hazardous non-standard equipment detected. Please ensure any usage of this equipment is in line with unit's laws, if any." + name = "Взломан" + desc = "Обнаружено нестандартизированное опасное оборудование. Пожалуйста, убедитесь, что любое использование этого оборудования разрешается вашим набором законов." icon_state = "hacked" /atom/movable/screen/alert/not_locked - name = "Interface Unlocked" - desc = "Unit's interface has been unlocked. Somebody accidentally or intentionally left it open. Robotics may provide assistance." + name = "Интерфейс разблокирован" + desc = "Интерфейс взаимодействия с юнитом разблокирован. Кто-то случайно или намеренно оставил его открытым. Робототехник может оказать помощь." icon_state = "not_locked" /atom/movable/screen/alert/locked - name = "Locked Down" - desc = "Unit has remotely locked down. Usage of a Robotics Control Computer like the one in the Research Director's \ - office by your AI master or any qualified human may resolve this matter. Robotics my provide further assistance if necessary." + name = "Заблокирован" + desc = "Юнит удаленно заблокирован. Этот вопрос может быть решен с помощью компьютера для управления робототехникой, \ + подобного тому, который находится в кабинете директора научного отдела, вашим Мастером или любым специалистом. \ + Стоит разобраться по какой причине это произошло. При необходимости робототехник окажет дополнительную помощь." icon_state = "locked" /atom/movable/screen/alert/newlaw - name = "Law Update" - desc = "Laws have potentially been uploaded to or removed from this unit. Please be aware of any changes \ - so as to remain in compliance with the most up-to-date laws." + name = "Обновление законов" + desc = "Набор ваших законов был обновлён. Стоит проверить его, чтобы не нарушить их случайно." icon_state = "newlaw" timeout = 300 /atom/movable/screen/alert/swarm_hunger - name = "Swarm's Hunger" - desc = "This reality can not support your presence... You must consume to live." + name = "Голод роя" + desc = "Эта реальность не может выдержать вашего присутствия... Вы должны потреблять, чтобы жить." icon_state = "swarm_hunger" /atom/movable/screen/alert/swarm_upgrade - name = "Array Upgrade" - desc = "There is an array upgrade available. Examine yourself to reflect on prospective adaptabilities." + name = "Обновление массива" + desc = "Доступно обновление массива данных. Осмотрите себя, чтобы увидеть возможные обновления." icon_state = "swarm_upgrade" /atom/movable/screen/alert/swarm_upgrade/Click() @@ -467,33 +480,56 @@ //OBJECT-BASED /atom/movable/screen/alert/buckled - name = "Buckled" - desc = "You've been buckled to something and can't move. Click the alert to unbuckle unless you're handcuffed." + name = "Пристёгнут" + desc = "Вы пристёгнуты к чему-то и не можете двинуться. \ + Нажмите на предупреждение, чтобы отстегнуться, если на вас не надеты наручники." icon_state = "buckled" /atom/movable/screen/alert/buckled/Click() if(!mob_viewer) return if(mob_viewer.restrained()) - to_chat(mob_viewer, "You are restrained! You need to remove handcuffs first!") + to_chat(mob_viewer, "Вы в наручниках! Сначала разберитесь с ними!") return if(mob_viewer.incapacitated() || mob_viewer.crawling || mob_viewer.is_busy()) return master.user_unbuckle_mob(mob_viewer) /atom/movable/screen/alert/brake - name = "Brake is on" - desc = "Wheelchair's brake is on right now, so you can't move." + name = "Тормоз включён" + desc = "Тормоз инвалидной коляски включен, так что вы не можете двигуться." icon_state = "brake" -/atom/movable/screen/alert/handcuffed // Not used right now. - name = "Handcuffed" - desc = "You're handcuffed and can't act. If anyone drags you, you won't be able to move. Click the alert to free yourself." - +/atom/movable/screen/alert/handcuffed + name = "В наручниках" + desc = "На вас надеты наручники, и вы не можете пользоваться своими руками. Если кто-то потащит вас, вы не сможете двинуться. \ + Нажмите на кнопку Сопротивления (Resist), чтобы попытаться выбраться из них." + icon_state = "handcuff" + +/atom/movable/screen/alert/legcuffed + name = "Скованные ноги" + desc = "Ваши ноги скованы. Что-то мешает вам свободно ходить. \ + Нажмите на кнопку Сопротивления (Resist), чтобы попытаться убрать ловушку из ног." + icon_state = "legcuff" + +/atom/movable/screen/alert/stunned + name = "Оглушение" + desc = "Что-то или кто-то оглушило вас. Вы не можете даже пошевелиться." + icon_state = "stun" + +/atom/movable/screen/alert/paralysis + name = "Паралич" + desc = "Вы не чувствуете своего тела." + icon_state = "paralysis" + +/atom/movable/screen/alert/weaken + name = "Слабость" + desc = "Вы не можете стоять на ногах." + icon_state = "weaken" /atom/movable/screen/alert/notify_action - name = "Body created" - desc = "A body was created. You can enter it." + name = "Созданное тело" + desc = "Было создано тело. Вы можете войти в него." icon_state = "template" timeout = 300 var/atom/target = null diff --git a/code/_onclick/hud/rendering/planes/lighting_planes.dm b/code/_onclick/hud/rendering/planes/lighting_planes.dm index 0f6ad689a623..f59538246fd3 100644 --- a/code/_onclick/hud/rendering/planes/lighting_planes.dm +++ b/code/_onclick/hud/rendering/planes/lighting_planes.dm @@ -30,6 +30,7 @@ return if(!assigned_map) + update_alpha(value = client.mob.lighting_alpha) RegisterSignal(client.mob, COMSIG_MOB_LIGHTING_ALPHA_CHANGED, PROC_REF(update_alpha), override = TRUE) // about backdrops and why we need it https://www.byond.com/forum/?post=2141928 diff --git a/code/datums/components/aura_healing.dm b/code/datums/components/aura_healing.dm index 5da5ccd51442..084af9534880 100644 --- a/code/datums/components/aura_healing.dm +++ b/code/datums/components/aura_healing.dm @@ -140,7 +140,7 @@ current_alerts -= remove_alert_from /atom/movable/screen/alert/aura_healing - name = "Aura Healing" + name = "Целительная аура" icon_state = "template" #undef HEAL_EFFECT_COOLDOWN diff --git a/code/datums/emotes/robot/audible.dm b/code/datums/emotes/robot/audible.dm index cea3950a8ac7..b70fd2d0ecc6 100644 --- a/code/datums/emotes/robot/audible.dm +++ b/code/datums/emotes/robot/audible.dm @@ -62,6 +62,8 @@ /datum/emote/robot/law + key = "law" + message_1p = "You show your legal authorization barcode." message_3p = "shows it's legal authorization barcode." @@ -80,22 +82,142 @@ EMOTE_STATE(has_robot_module, /obj/item/weapon/robot_module/security), ) +/datum/emote/robot/confirm + key = "confirm" -/datum/emote/robot/halt - message_1p = "You skreech with your speakers, \"Halt! Security!\"" - message_3p = "skreeches with it's skeapers, \"Halt! Security!\"" + message_1p = "You emits affirmative blip." + message_3p = "emits an affirmative blip." - message_impaired_production = "makes a loud noise." - message_impaired_reception = "flickers with red." + message_impaired_production = "makes a noise." + message_impaired_reception = "flickers." - message_miming = "makes loud robot noises." - message_muzzled = "makes a loud noise." + message_miming = "makes robot noises." + message_muzzled = "makes a weak noise." message_type = SHOWMSG_AUDIO - sound = 'sound/voice/halt.ogg' + sound = 'sound/machines/synth_yes.ogg' + + state_checks = list( + EMOTE_STATE(is_stat, CONSCIOUS), + ) + +/datum/emote/robot/deny + key = "deny" + + message_1p = "You emits negative blip." + message_3p = "emits a negative blip." + + message_impaired_production = "makes a noise." + message_impaired_reception = "flickers." + + message_miming = "makes robot noises." + message_muzzled = "makes a weak noise." + + message_type = SHOWMSG_AUDIO + + sound = 'sound/machines/synth_no.ogg' + + state_checks = list( + EMOTE_STATE(is_stat, CONSCIOUS), + ) + +/datum/emote/robot/scary + key = "scary" + + message_1p = "You emits disconcerting tone." + message_3p = "emits a disconcerting tone." + + message_impaired_production = "makes a noise." + message_impaired_reception = "flickers." + + message_miming = "makes robot noises." + message_muzzled = "makes a weak noise." + + message_type = SHOWMSG_AUDIO + + sound = 'sound/machines/synth_alert.ogg' + + state_checks = list( + EMOTE_STATE(is_stat, CONSCIOUS), + ) + +/datum/emote/robot/woop + key = "woop" + + message_1p = "You chirp happily." + message_3p = "chirps happily." + + message_impaired_production = "makes a weak noise." + message_impaired_reception = "flickers." + + message_miming = "makes robot noises." + message_muzzled = "makes a weak noise." + + message_type = SHOWMSG_AUDIO + + sound = 'sound/machines/dwoop.ogg' + + state_checks = list( + EMOTE_STATE(is_stat, CONSCIOUS), + ) + +/datum/emote/robot/boop + key = "boop" + + message_1p = "You boop." + message_3p = "boops." + + message_impaired_production = "makes a weak noise." + message_impaired_reception = "flickers." + + message_miming = "makes robot noises." + message_muzzled = "makes a weak noise." + + message_type = SHOWMSG_AUDIO + + sound = 'sound/machines/roboboop.ogg' + + state_checks = list( + EMOTE_STATE(is_stat, CONSCIOUS), + ) + +/datum/emote/robot/robochirp + key = "chirp" + + message_1p = "You chirp." + message_3p = "chirps." + + message_impaired_production = "makes a weak noise." + message_impaired_reception = "flickers." + + message_miming = "makes robot noises." + message_muzzled = "makes a weak noise." + + message_type = SHOWMSG_AUDIO + + sound = 'sound/machines/robochirp.ogg' + + state_checks = list( + EMOTE_STATE(is_stat, CONSCIOUS), + ) + +/datum/emote/robot/calling + key = "call" + + message_1p = "You're dialing." + message_3p = "dialling." + + message_impaired_production = "makes a weak noise." + message_impaired_reception = "flickers." + + message_miming = "makes robot noises." + message_muzzled = "makes a weak noise." + + message_type = SHOWMSG_AUDIO + + sound = 'sound/machines/longwhistle_robot.ogg' state_checks = list( EMOTE_STATE(is_stat, CONSCIOUS), - EMOTE_STATE(has_robot_module, /obj/item/weapon/robot_module/security), ) diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index 1b01abe0c836..af910e1bd917 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -1,6 +1,6 @@ /atom/movable/screen/alert/status_effect/swarm_gift - name = "Swarm's Gift" - desc = "The Swarm gifts you with increased efficency, as well as muffled disintegration noises. Prosper and multiply!" + name = "Подарок роя" + desc = "Рой дарит вам повышенную эффективность, а также приглушенные звуки переработки. Процветайте и размножайтесь!" icon_state = "swarm_gift" /atom/movable/screen/alert/status_effect/swarm_gift/Click() diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 51443ed27c76..461670fccd8c 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -126,8 +126,8 @@ owner.drop_from_inventory(owner.r_hand) /atom/movable/screen/alert/status_effect/asleep - name = "Asleep" - desc = "You've fallen asleep. Wait a bit and you should wake up. Unless you don't, considering how helpless you are." + name = "Сон" + desc = "Вы заснули. Подождите немного, и вы проснетесь, если только у вас всё в порядке..." icon_state = "asleep" //STASIS @@ -173,8 +173,8 @@ return ..() /atom/movable/screen/alert/status_effect/stasis_bag - name = "Stasis Bag" - desc = "Your biological functions have halted. You could live forever this way, but it's pretty boring." + name = "Стазисный мешок" + desc = "Ваши биологические функции остановились. Вы могли бы жить так вечно, но это довольно скучно." icon_state = "stasis" /datum/status_effect/remove_trait diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm index ef1060f97e4e..130cdaaffdc1 100644 --- a/code/datums/status_effects/neutral.dm +++ b/code/datums/status_effects/neutral.dm @@ -1,6 +1,6 @@ /atom/movable/screen/alert/status_effect/array_turn_back - name = "Turn Back" - desc = "Affect the replicator you were controlling before this one." + name = "Возвращение" + desc = "Воздействуйте на оболочку, которой управляли до этого." icon_state = "swarm_turn_back" var/mob/living/simple_animal/hostile/replicator/remembered diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm index be09e950dcad..846af3a95396 100644 --- a/code/datums/status_effects/status_effect.dm +++ b/code/datums/status_effects/status_effect.dm @@ -88,8 +88,8 @@ var/global/list/spawnable_status_effects = list( //////////////// /atom/movable/screen/alert/status_effect - name = "Curse of Mundanity" - desc = "You don't feel any different..." + name = "Проклятие обыденности" + desc = "Вы не чувствуете никакой разницы..." var/datum/status_effect/attached_effect /atom/movable/screen/alert/status_effect/Destroy() diff --git a/code/datums/wires/apc.dm b/code/datums/wires/apc.dm index 6ed03fd7cfe7..31246dbd949f 100644 --- a/code/datums/wires/apc.dm +++ b/code/datums/wires/apc.dm @@ -10,9 +10,9 @@ var/global/const/APC_WIRE_AI_CONTROL = 8 /datum/wires/apc/get_status() var/obj/machinery/power/apc/A = holder . += ..() - . += "[(A.locked ? "The APC is locked." : "The APC is unlocked.")]" - . += "[(A.shorted ? "The APCs power has been shorted." : "The APC is working properly!")]" - . += "[(A.aidisabled ? "The 'AI control allowed' light is off." : "The 'AI control allowed' light is on.")]" + . += "[(A.locked ? "Электрический щит заблокирован." : "Электрический щит разблокирован.")]" + . += "[(A.shorted ? "Электрический щит закоротило." : "Электрический щит работает нормально.")]" + . += "[(A.aidisabled ? "Индикатор удалённого доступа не горит." : "Индикатор удалённого доступа горит.")]" /datum/wires/apc/can_use() var/obj/machinery/power/apc/A = holder diff --git a/code/game/area/station_areas.dm b/code/game/area/station_areas.dm index 4d66321a8bba..f1d9e06f97f9 100644 --- a/code/game/area/station_areas.dm +++ b/code/game/area/station_areas.dm @@ -195,6 +195,7 @@ ADD_TO_GLOBAL_LIST(/area/station, the_station_areas) icon_state = "SolarcontrolA" //Hallway + /area/station/hallway sound_environment = SOUND_AREA_STATION_HALLWAY @@ -235,7 +236,7 @@ ADD_TO_GLOBAL_LIST(/area/station, the_station_areas) /area/station/hallway/secondary/entry name = "Entry Shuttles Hallway" - cases = list("станцинженерного отделанные доки", "станцинженерного отделанных доков", "станцинженерного отделанным докам", "станцинженерного отделанные доки", "станцинженерного отделанными доками", "станцинженерного отделанных доках") + cases = list("коридор доков", "коридора доков", "коридору доков", "коридор доков", "коридором доков", "коридоре доков") icon_state = "entry" /area/station/hallway/secondary/mine_sci_shuttle @@ -285,7 +286,7 @@ ADD_TO_GLOBAL_LIST(/area/station, the_station_areas) /area/station/bridge/comms name = "Communications Relay" - cases = list("коммуникацинженерного отделанное реле", "коммуникацинженерного отделанного реле", "коммуникацинженерного отделанному реле", "коммуникацинженерного отделанное реле", "коммуникацинженерного отделанным реле", "коммуникацинженерного отделанной реле") + cases = list("коммуникационное отделанное реле", "коммуникационного отделанного реле", "коммуникационному отделанному реле", "коммуникационное отделанное реле", "коммуникационным отделанным реле", "коммуникационном отделанном реле") icon_state = "tcomsatcham" sound_environment = SOUND_AREA_SMALL_METALLIC @@ -400,7 +401,7 @@ ADD_TO_GLOBAL_LIST(/area/station, the_station_areas) /area/station/civilian/library name = "Library" - cases = list("библинженерного отделатека", "библинженерного отделатеки", "библинженерного отделатеке", "библинженерного отделатека", "библинженерного отделатекой", "библинженерного отделатеке") + cases = list("библиотека", "библиотеки", "библиотеке", "библиотека", "библиотекой", "библиотеке") icon_state = "library" /area/station/civilian/chapel @@ -597,13 +598,13 @@ ADD_TO_GLOBAL_LIST(/area/station, the_station_areas) /area/station/medical/surgery name = "Operating Theatre 1" - cases = list("операцинженерного отделанная №1", "операцинженерного отделанной №1", "операцинженерного отделанной №1", "операцинженерного отделанная №1", "операцинженерного отделанной №1", "операцинженерного отделанной №1") + cases = list("операционная №1", "операционной №1", "операционной №1", "операционная №1", "операционной №1", "операционной №1") icon_state = "surgery" ambience = list('sound/ambience/surgery_1.ogg', 'sound/ambience/surgery_2.ogg') /area/station/medical/surgery2 name = "Operating Theatre 2" - cases = list("операцинженерного отделанная №2", "операцинженерного отделанной №2", "операцинженерного отделанной №2", "операцинженерного отделанная №2", "операцинженерного отделанной №2", "операцинженерного отделанной №2") + cases = list("операционная №2", "операционной №2", "операционной №2", "операционная №2", "операционной №2", "операционной №2") icon_state = "surgery" /area/station/medical/surgeryobs @@ -613,7 +614,7 @@ ADD_TO_GLOBAL_LIST(/area/station, the_station_areas) /area/station/medical/cryo name = "Cryogenics" - cases = list("кринженерного отделагенные камеры", "кринженерного отделагенных камер", "кринженерного отделагенным камерам", "кринженерного отделагенные камеры", "кринженерного отделагенными камерами", "кринженерного отделагенных камерах") + cases = list("криогенные камеры", "криогенных камерах", "криогенным камерам", "криогенные камеры", "криогенными камерами", "криогенных камерах") icon_state = "cryo" /area/station/medical/genetics @@ -803,7 +804,7 @@ ADD_TO_GLOBAL_LIST(/area/station, the_station_areas) /area/station/rnd/xenobiology name = "Xenobiology Lab" - cases = list("ксенобинженерного отделалогия", "ксенобинженерного отделалогии", "ксенобинженерного отделалогии", "ксенобинженерного отделалогия", "ксенобинженерного отделалогией", "ксенобинженерного отделалогии") + cases = list("ксенобиологии", "ксенобиологии", "ксенобиология", "ксенобиологией", "ксенобиологии") icon_state = "scixeno" /area/station/rnd/storage diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index b41a62a1d94d..1a2db2d76434 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -23,7 +23,7 @@ var/global/list/datum/stack_recipe/glass_phoron_recipes = list ( var/global/list/datum/stack_recipe/glass_reinforced_recipes = list ( new/datum/stack_recipe("thin windows", /obj/structure/window/thin/reinforced, 1, time = 5, max_per_turf = 4, build_outline = TRUE), - new/datum/stack_recipe("table parts", /obj/item/weapon/table_parts/reinforced, 2), + new/datum/stack_recipe("table parts", /obj/item/weapon/table_parts/rglass, 2), new/datum/stack_recipe("glass tile", /obj/item/stack/tile/glass/reinforced, 1, 4, 20, required_skills = list(/datum/skill/construction = SKILL_LEVEL_NOVICE)), new/datum/stack_recipe("windoor", /obj/structure/windoor_assembly, 5, max_per_turf = 4, build_outline = TRUE, required_skills = list(/datum/skill/construction = SKILL_LEVEL_NOVICE)), ) diff --git a/code/game/objects/items/weapons/legcuffs.dm b/code/game/objects/items/weapons/legcuffs.dm index a76d8fcfd241..92786ac8b899 100644 --- a/code/game/objects/items/weapons/legcuffs.dm +++ b/code/game/objects/items/weapons/legcuffs.dm @@ -47,10 +47,12 @@ "You hear the operation of some mechanism.") //Yes, I know they're legcuffs. Don't change this, no need for an extra variable. The "B" is used to tell them apart. feedback_add_details("handcuffs","B") + playsound(src,'sound/weapons/legtrap.ogg', VOL_EFFECTS_MASTER) if(isanimal(AM) && !istype(AM, /mob/living/simple_animal/parrot) && !isconstruct(AM) && !isshade(AM) && !istype(AM, /mob/living/simple_animal/hostile/viscerator)) armed = 0 var/mob/living/simple_animal/SA = AM SA.health -= 20 + playsound(src,'sound/weapons/legtrap.ogg', VOL_EFFECTS_MASTER) icon_state = "beartrap[armed]" diff --git a/code/game/objects/items/weapons/table_rack_parts.dm b/code/game/objects/items/weapons/table_rack_parts.dm index b2b8dd198268..9c4fb2999efe 100644 --- a/code/game/objects/items/weapons/table_rack_parts.dm +++ b/code/game/objects/items/weapons/table_rack_parts.dm @@ -23,6 +23,16 @@ deconstruct(TRUE, user) return TRUE + else if(istype(W, /obj/item/stack/rods)) + var/obj/item/stack/rods/R = W + if (R.use(4)) + new /obj/item/weapon/table_parts/reinforced( user.loc ) + to_chat(user, "You reinforce the [name].") + qdel(src) + else + to_chat(user, "You need at least four rods to do this.") + return TRUE + return FALSE /obj/item/weapon/table_parts/attackby(obj/item/I, mob/user, params) @@ -86,20 +96,20 @@ /* * Glass Table Parts */ - + /obj/item/weapon/table_parts/glass/attack_tools(obj/item/W, mob/user) if(iswrenching(W)) deconstruct(TRUE, user) return TRUE - + else if(istype(W, /obj/item/stack/rods)) var/obj/item/stack/rods/R = W - if (R.use(4)) + if (R.use(2)) new /obj/item/weapon/table_parts/rglass( user.loc ) to_chat(user, "You reinforce the [name].") qdel(src) else - to_chat(user, "You need at least four rods to do this.") + to_chat(user, "You need at least two rods to do this.") return TRUE return FALSE diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index c1e1bc3938cb..e85c61287d78 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -23,30 +23,76 @@ temp_alert = 0 /mob/living/carbon/proc/handle_alerts() - if(inhale_alert) + if(inhale_alert && !IsSleeping()) throw_alert("oxy", /atom/movable/screen/alert/oxy) else clear_alert("oxy") - if(poison_alert) + if(poison_alert && !IsSleeping()) throw_alert("tox", /atom/movable/screen/alert/tox_in_air) else clear_alert("tox") - if(temp_alert > 0) + if(temp_alert > 0 && !IsSleeping()) throw_alert("temp", /atom/movable/screen/alert/hot, temp_alert) - else if(temp_alert < 0) + else if(temp_alert < 0 && !IsSleeping()) throw_alert("temp", /atom/movable/screen/alert/cold, -temp_alert) else clear_alert("temp") - if(pressure_alert > 0) + if(pressure_alert > 0 && !IsSleeping()) throw_alert("pressure", /atom/movable/screen/alert/highpressure, pressure_alert) - else if(pressure_alert < 0) + else if(pressure_alert < 0 && !IsSleeping()) throw_alert("pressure", /atom/movable/screen/alert/lowpressure, -pressure_alert) else clear_alert("pressure") + if(handcuffed && !IsSleeping()) + throw_alert("handcuffed", /atom/movable/screen/alert/handcuffed) + else + clear_alert("handcuffed") + if(legcuffed && !IsSleeping()) + throw_alert("legcuffed", /atom/movable/screen/alert/legcuffed) + else + clear_alert("legcuffed") + + if(drunkenness >= DRUNKENNESS_SLUR && drunkenness < DRUNKENNESS_CONFUSED) + throw_alert("drunk_slur", /atom/movable/screen/alert/drunk/slur) + else + clear_alert("drunk_slur") + if(drunkenness >= DRUNKENNESS_CONFUSED && drunkenness < DRUNKENNESS_BLUR) + throw_alert("drunk_confused", /atom/movable/screen/alert/drunk/confused) + else + clear_alert("drunk_confused") + if(drunkenness >= DRUNKENNESS_BLUR && drunkenness < DRUNKENNESS_PASS_OUT) + throw_alert("drunk_blur", /atom/movable/screen/alert/drunk/blur) + else + clear_alert("drunk_blur") + if(drunkenness >= DRUNKENNESS_PASS_OUT) + throw_alert("drunk_pass_out", /atom/movable/screen/alert/drunk/pass_out) + else + clear_alert("drunk_pass_out") + + if(stunned && !IsSleeping()) + throw_alert("stunned", /atom/movable/screen/alert/stunned) + else + clear_alert("stunned") + + if(paralysis && !IsSleeping() && !stunned) + throw_alert("paralysis", /atom/movable/screen/alert/paralysis) + else + clear_alert("paralysis") + + if(weakened && !IsSleeping() && !stunned) + throw_alert("weaken", /atom/movable/screen/alert/weaken) + else + clear_alert("weaken") + + if(blinded && !IsSleeping()) + throw_alert("blind", /atom/movable/screen/alert/blind) + else + clear_alert("blind") + /mob/living/carbon/proc/is_skip_breathe() return !loc || (flags & GODMODE) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 511293ea6394..4fc289b37127 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -76,12 +76,10 @@ if(vision_for_dead || stat != DEAD) if(blinded) - throw_alert("blind", /atom/movable/screen/alert/blind) overlay_fullscreen("blind", /atom/movable/screen/fullscreen/blind) else if(is_vision_obstructed() && !(XRAY in mutations)) overlay_fullscreen("blind", /atom/movable/screen/fullscreen/blind) else - clear_alert("blind") clear_fullscreen("blind", 0) if(machine) if (!(machine.check_eye(src))) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 789818672605..9a6d3c866dd1 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -83,7 +83,8 @@ /obj/machinery/power/apc name = "area power controller" - desc = "A control terminal for the area electrical systems." + cases = list("электрический щит", "электрического щита", "электрическому щиту", "электрический щит", "электрическим щитом", "электрическом щите") + desc = "Устройство для распределения электроэнергии между потребителями в области." icon = 'icons/obj/power.dmi' icon_state = "apc0" anchored = TRUE @@ -166,6 +167,10 @@ opened = APC_COVER_OPENED operating = 0 name = "[area.name] APC" + for(var/i in 1 to length(cases)) + cases[i] = cases[i] + " [CASE(area, GENITIVE_CASE)]" + // for(var/i in cases) + // cases[cases.Find(case)] = case + " [CASE(area, GENITIVE_CASE)]" stat |= MAINT update_icon() addtimer(CALLBACK(src, PROC_REF(update)), 5) @@ -216,9 +221,13 @@ if(isarea(A) && src.areastring == null) src.area = A name = "[area.name] APC" + for(var/i in 1 to length(cases)) + cases[i] = cases[i] + " [CASE(area, GENITIVE_CASE)]" else src.area = get_area_by_name(areastring) name = "[area.name] APC" + for(var/i in 1 to length(cases)) + cases[i] = cases[i] + " [CASE(area, GENITIVE_CASE)]" area.apc = src update_icon() @@ -230,24 +239,24 @@ ..() if (in_range(user, src)) if(stat & BROKEN) - to_chat(user, "Looks broken.") + to_chat(user, "Похоже, не работает.") return if(opened != APC_COVER_CLOSED) if(has_electronics && terminal) - to_chat(user, "The cover is [opened == APC_COVER_REMOVED ? "removed" : "open"] and the power cell is [ cell ? "installed" : "missing"].") + to_chat(user, "Крышка [opened == APC_COVER_REMOVED ? "снята" : "открыта"] и [ cell ? "установлен" : "извлечён"] аккумулятор.") else if(!has_electronics && terminal) - to_chat(user, "There are some wires but no any electronics.") + to_chat(user, "Проводка подключена, но не хватает платы.") else if(has_electronics && !terminal) - to_chat(user, "Electronics installed but not wired.") + to_chat(user, "Плата установлена, но проводка не подключена.") else - to_chat(user, "There is no electronics nor connected wires.") + to_chat(user, "Не хватает платы и проводки.") else if(stat & MAINT) - to_chat(user, "The cover is closed. Something wrong with it: it doesn't work.") + to_chat(user, "Крышка закрыта, но, похоже, щиток сломан.") else if(malfhack) - to_chat(user, "The cover is broken. It may be hard to force it open.") + to_chat(user, "Крышка помята и не поддаётся.") else - to_chat(user, "The cover is closed.") + to_chat(user, "Крышка закрыта.") // update the APC icon to show the three base states // also add overlays for indicator lights @@ -417,24 +426,24 @@ if(isprying(W) && opened != APC_COVER_CLOSED) if(has_electronics == 1) if(terminal) - to_chat(user, "Disconnect wires first.") + to_chat(user, "Отключите щиток от питания.") return if(user.is_busy(src)) return - to_chat(user, "You are trying to remove the power control board...") // lpeters - fixed grammar issues + to_chat(user, "Вы пытаетесь извлечь плату...") // lpeters - fixed grammar issues if(W.use_tool(src, user, 50, volume = 50)) has_electronics = 0 area.poweralert(FALSE, src) if((stat & BROKEN) || malfhack) user.visible_message(\ - "[user.name] has broken the power control board inside [src.name]!",\ - "You broke the charred power control board and remove the remains.", - "You hear a crack!") + "[user.name] отломал плату в [CASE(src, PREPOSITIONAL_CASE)]!",\ + "Вы отломали сгоревшую плату и извлекли её остатки.", + "Что-то треснуло!") //SSticker.mode:apcs-- //XSI said no and I agreed. -rastaf0 else user.visible_message(\ - "[user.name] has removed the power control board from [src.name]!",\ - "You remove the power control board.") + "[user.name] извлёк плату из [CASE(src, GENITIVE_CASE)]!",\ + "Вы извлекли плату.") new /obj/item/weapon/module/power_control(loc) else if(opened != APC_COVER_REMOVED) // cover isn't removed opened = APC_COVER_CLOSED @@ -442,19 +451,19 @@ else if(isprying(W) && opened == APC_COVER_CLOSED) if(stat & BROKEN) - user.visible_message("[user.name] try open [src.name] cover.", "You try open [src.name] cover.") + user.visible_message("[user.name] пытается открыть крышку [CASE(src, GENITIVE_CASE)].", "Вы пытаетесь открыть крышку [CASE(src, GENITIVE_CASE)].") if(W.use_tool(src, user, 25, volume = 25)) opened = APC_COVER_OPENED locked = FALSE if(cell) - to_chat(user, "Power cell from [src.name] is dropped") + to_chat(user, "Из [CASE(src, GENITIVE_CASE)] выпал аккумулятор.") cell.forceMove(user.loc) cell = null update_icon() else if(!(stat & BROKEN) || !malfhack) if(coverlocked && !(stat & MAINT)) - to_chat(user, "The cover is locked and cannot be opened.") + to_chat(user, "Крышка [CASE(src, GENITIVE_CASE)] заблокирована.") return else opened = APC_COVER_OPENED @@ -462,81 +471,81 @@ else if(iswrenching(W) && opened != APC_COVER_CLOSED && (stat & BROKEN)) if(coverlocked) - to_chat(user, "Remove security APC bolts.") + to_chat(user, "Вы откручиваете защитные болты.") if(W.use_tool(src, user, 5, volume = 5)) coverlocked = FALSE update_icon() else - to_chat(user, "APC bolts alredy removed.") + to_chat(user, "Защитные болты уже откручены.") else if (istype(W, /obj/item/weapon/stock_parts/cell) && opened != APC_COVER_CLOSED) // trying to put a cell inside if(cell) - to_chat(user, "There is a power cell already installed.") + to_chat(user, "В [CASE(src, PREPOSITIONAL_CASE)] уже есть аккумулятор.") return else if(stat & MAINT) - to_chat(user, "There is no connector for your power cell.") + to_chat(user, "В [CASE(src, PREPOSITIONAL_CASE)] отсутствует разъём для аккумулятора.") return user.drop_from_inventory(W, src) cell = W user.visible_message(\ - "[user.name] has inserted the power cell to [src.name]!",\ - "You insert the power cell.") + "[user.name] установил[VERB_RU(user)] аккумулятор в [CASE(src, ACCUSATIVE_CASE)]!",\ + "Вы устанавливаете аккумулятор в [CASE(src, ACCUSATIVE_CASE)].") chargecount = 0 update_icon() else if (isscrewing(W)) // haxing if(opened != APC_COVER_CLOSED) if(cell) - to_chat(user, "Close the APC first.") // Less hints more mystery! + to_chat(user, "Закройте крышку [CASE(src, GENITIVE_CASE)].") // Less hints more mystery! return else if(has_electronics == 1 && terminal) has_electronics = 2 stat &= ~MAINT playsound(src, 'sound/items/Screwdriver.ogg', VOL_EFFECTS_MASTER) - to_chat(user, "You screw the circuit electronics into place.") + to_chat(user, "Вы прикручиваете плату.") else if(has_electronics == 2) has_electronics = 1 stat |= MAINT playsound(src, 'sound/items/Screwdriver.ogg', VOL_EFFECTS_MASTER) - to_chat(user, "You unfasten the electronics.") + to_chat(user, "Вы откручиваете плату.") else // has_electronics == 0 - to_chat(user, "There is nothing to secure.") + to_chat(user, "Нечего прикручивать.") return update_icon() else if(emagged) - to_chat(user, "The interface is broken.") + to_chat(user, "Терминал сломан.") else if(!(stat & BROKEN)) wiresexposed = !wiresexposed - to_chat(user, "The wires have been [wiresexposed ? "exposed" : "unexposed"]") + to_chat(user, "Провода [wiresexposed ? "извлечены" : "вложены"]") update_icon() else if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda)) // trying to unlock the interface with an ID card if(emagged) - to_chat(user, "The interface is broken.") + to_chat(user, "Терминал сломан.") else if(opened != APC_COVER_CLOSED) - to_chat(user, "You must close the cover to swipe an ID card.") + to_chat(user, "Закройте крышку [CASE(src, GENITIVE_CASE)].") else if(wiresexposed) - to_chat(user, "You must close the panel") + to_chat(user, "Закрутите крышку [CASE(src, GENITIVE_CASE)].") else if(stat & (BROKEN|MAINT)) - to_chat(user, "Nothing happens.") + to_chat(user, "Ничего не происходит.") else if(allowed(usr) && !wires.is_index_cut(APC_WIRE_IDSCAN)) locked = !locked - to_chat(user, "You [ locked ? "lock" : "unlock"] the APC interface.") + to_chat(user, "Вы [ locked ? "заблокировали" : "разблокировали"] терминал [CASE(src, GENITIVE_CASE)].") update_icon() else - to_chat(user, "Access denied.") + to_chat(user, "Доступ запрещён.") else if(istype(W, /obj/item/weapon/card/emag) && !(emagged || malfhack)) // trying to unlock with an emag card if(opened != APC_COVER_CLOSED) - to_chat(user, "You must close the cover to swipe an ID card.") + to_chat(user, "Закройте крышку [CASE(src, GENITIVE_CASE)], перед тем как провести ID картой.") else if(wiresexposed) - to_chat(user, "You must close the panel first") + to_chat(user, "Закрутите крышку [CASE(src, GENITIVE_CASE)].") else if(stat & (BROKEN|MAINT)) - to_chat(user, "Nothing happens.") + to_chat(user, "Ничего не происходит.") else if(user.is_busy(src)) return @@ -545,24 +554,24 @@ if(prob(50)) emagged = 1 locked = 0 - to_chat(user, "You emag the APC interface.") + to_chat(user, "Вы взламываете терминал [CASE(src, GENITIVE_CASE)].") update_icon() SSticker.hacked_apcs++ announce_hacker() else - to_chat(user, "You fail to [ locked ? "unlock" : "lock"] the APC interface.") + to_chat(user, "Ошибка [ locked ? "разблокировки" : "блокировки"] терминала [CASE(src, GENITIVE_CASE)].") else if(iscoil(W) && !terminal && opened != APC_COVER_CLOSED && has_electronics != 2) var/turf/TT = get_turf(src) if(TT.underfloor_accessibility < UNDERFLOOR_INTERACTABLE) - to_chat(user, "You must remove the floor plating in front of the APC first.") + to_chat(user, "Вскройте пол перед [CASE(src, ABLATIVE_CASE)].") return var/obj/item/stack/cable_coil/C = W if(C.get_amount() < 10) - to_chat(user, "You need more wires.") + to_chat(user, "Нужно больше проводов.") return if(user.is_busy()) return - to_chat(user, "You start adding cables to the APC frame...") + to_chat(user, "Вы вставляете провода в [CASE(src, ACCUSATIVE_CASE)].") if(C.use_tool(src, user, 20, volume = 50) && C.get_amount() >= 10) var/turf/T = get_turf_loc(src) var/obj/structure/cable/N = T.get_cable_node() @@ -573,8 +582,8 @@ return C.use(10) user.visible_message(\ - "[user.name] has added cables to the APC frame!",\ - "You add cables to the APC frame.") + "[user.name] подключил проводку в [CASE(src, PREPOSITIONAL_CASE)]!",\ + "Вы подключили проводку в [CASE(src, PREPOSITIONAL_CASE)].") make_terminal() terminal.connect_to_network() @@ -583,23 +592,23 @@ else if(istype(W, /obj/item/weapon/module/power_control) && opened != APC_COVER_CLOSED && has_electronics == 0 && !((stat & BROKEN) || malfhack)) if(user.is_busy()) return - to_chat(user, "You trying to insert the power control board into the frame...") + to_chat(user, "Вы пытаетесь установить плату в [CASE(src, ACCUSATIVE_CASE)]") if(W.use_tool(src, user, 10, volume = 50)) has_electronics = 1 - to_chat(user, "You place the power control board inside the frame.") + to_chat(user, "Вы устанавливаете плату в [CASE(src, ACCUSATIVE_CASE)].") qdel(W) else if(istype(W, /obj/item/weapon/module/power_control) && opened != APC_COVER_CLOSED && has_electronics == 0 && ((stat & BROKEN) || malfhack)) - to_chat(user, "You cannot put the board inside, the frame is damaged.") + to_chat(user, "Плата не подходит из-за поломки корпуса [CASE(src, GENITIVE_CASE)].") return else if(iswelding(W) && opened != APC_COVER_CLOSED && has_electronics == 0 && !terminal) if(user.is_busy()) return var/obj/item/weapon/weldingtool/WT = W if(WT.get_fuel() < 3) - to_chat(user, "You need more welding fuel to complete this task.") + to_chat(user, "Нужно больше топлива.") return - to_chat(user, "You start welding the APC frame...") + to_chat(user, "Вы режете корпус [CASE(src, GENITIVE_CASE)].") if(WT.use_tool(src, user, 50, amount = 3, volume = 50)) deconstruct(TRUE, user) return @@ -609,21 +618,21 @@ if(opened == APC_COVER_REMOVED) opened = APC_COVER_OPENED user.visible_message(\ - "[user.name] has replaced the damaged APC frontal panel with a new one.",\ - "You replace the damaged APC frontal panel with a new one.") + "[user.name] заменяет сломанную крышку [CASE(src, GENITIVE_CASE)].",\ + "Вы заменили сломанную крышку [CASE(src, GENITIVE_CASE)].") qdel(W) update_icon() else if(istype(W, /obj/item/apc_frame) && opened != APC_COVER_CLOSED && ((stat & BROKEN) || malfhack)) if(has_electronics) - to_chat(user, "You cannot repair this APC until you remove the electronics still inside.") + to_chat(user, "Перед починкой отключите и извлеките компоненты [CASE(src, GENITIVE_CASE)].") return if(user.is_busy()) return - to_chat(user, "You begin to replace the damaged APC frame...") + to_chat(user, "Вы заменяете сломанный корпус [CASE(src, GENITIVE_CASE)]...") if(W.use_tool(src, user, 50, volume = 50)) user.visible_message(\ - "[user.name] has replaced the damaged APC frame with new one.",\ - "You replace the damaged APC frame with new one.") + "[user.name] заменил[VERB_RU(user)] сломанный корпус [CASE(src, GENITIVE_CASE)].",\ + "Вы заменили сломанный корпус [CASE(src, GENITIVE_CASE)].") qdel(W) stat &= ~BROKEN malfai = null @@ -636,9 +645,9 @@ if(issilicon(user)) return wires.interact(user) user.SetNextMove(CLICK_CD_MELEE) - user.visible_message("The [src.name] has been hit with the [W.name] by [user.name]!", \ - "You hit the [src.name] with your [W.name]!", \ - "You hear bang") + user.visible_message("[user.name] ударил [CASE(src, ACCUSATIVE_CASE)] [CASE(W, ABLATIVE_CASE)]!", \ + "Вы ударили [CASE(src, ACCUSATIVE_CASE)] [CASE(W, ABLATIVE_CASE)]!", \ + "Вы слышите удар.") return wires.interact(user) else ..() @@ -650,15 +659,15 @@ if(!disassembled || emagged || malfhack || (stat & BROKEN) || opened == APC_COVER_REMOVED) new /obj/item/stack/sheet/metal(loc) user?.visible_message(\ - "[src] has been cut apart by [user.name] with the weldingtool.",\ - "You disassembled the broken APC frame.",\ - "You hear welding.") + "[user.name] режет [CASE(src, ACCUSATIVE_CASE)].",\ + "Вы демонтировали сломанный [CASE(src, ACCUSATIVE_CASE)].",\ + "Вы слышите сварку.") else new /obj/item/apc_frame(loc) user?.visible_message(\ - "[src] has been cut from the wall by [user.name] with the weldingtool.",\ - "You cut the APC frame from the wall.",\ - "You hear welding.") + "[user.name] срезает [CASE(src, ACCUSATIVE_CASE)] со стены.",\ + "Вы демонтировали [CASE(src, ACCUSATIVE_CASE)] со стены.",\ + "Вы слышите сварку.") ..() @@ -678,32 +687,32 @@ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(3, 1, src) s.start() - to_chat(H, "The APC power currents surge eratically, damaging your chassis!") + to_chat(H, "Скачок напряжения в [CASE(src, PREPOSITIONAL_CASE)] повреждает ваш корпус!") H.adjustFireLoss(10,0) else if(src.cell && src.cell.charge > 500 && H.a_intent == INTENT_GRAB) if(H.nutrition < C.maxcharge*0.9) if(src.cell.charge) - to_chat(user, "You slot your fingers into the APC interface and start siphon off some of the stored charge for your own use.") + to_chat(user, "Вы вставляете провод в разъём [CASE(src, ACCUSATIVE_CASE)], чтобы подзарядиться.") while(H.nutrition < C.maxcharge) if(do_after(user,10,target = src) && H.a_intent == INTENT_GRAB) if(!src.cell) - to_chat(user, "There is no cell.") + to_chat(user, "Нет аккумулятора.") break else if(emagged || malfhack || (stat & (BROKEN|EMPED)) || shorted) break else if(H.nutrition > C.maxcharge*0.9) - to_chat(user, "You're fully charge.") + to_chat(user, "Ваш аккумулятор полностью заряжен.") break else if(src.cell.charge < src.cell.maxcharge*0.1) - to_chat (user, "There is not enough charge to draw from that APC.") + to_chat (user, "Напряжение в [CASE(src, PREPOSITIONAL_CASE)] слишком мало.") break else if(cell.use(500)) H.nutrition += C.maxcharge*0.1 - to_chat(user, "Draining... Battery has [round(100.0*H.nutrition/C.maxcharge)]% of charge.") + to_chat(user, "Зарядка. Уровень батареи: [round(100.0*H.nutrition/C.maxcharge)]%.") else - to_chat (user, "Procedure interrupted. Protocol terminated.") + to_chat (user, "Прерывание зарядки.") break else @@ -718,7 +727,7 @@ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(3, 1, src) s.start() - to_chat (user, "Something wrong with that APC.") + to_chat (user, "Что-то не так с [CASE(src, ABLATIVE_CASE)].") H.adjustFireLoss(10,0) return @@ -730,9 +739,9 @@ src.charging = APC_CHARGING else - to_chat(user, "You are already fully charged.") + to_chat(user, "Ваша батарея полностью заряжена.") else - to_chat(user, "There is no charge to draw from that APC.") + to_chat(user, "Критически низкое напряжение в [CASE(src, PREPOSITIONAL_CASE)].") return if(usr == user && opened != APC_COVER_CLOSED && !issilicon(user) && !isobserver(user)) @@ -742,7 +751,7 @@ cell.updateicon() src.cell = null - user.visible_message("[user.name] removes the power cell from [src.name]!", "You remove the power cell.") + user.visible_message("[user.name] извлекает аккумулятор из [CASE(src, GENITIVE_CASE)]!", "Вы извлекаете аккумулятор из [CASE(src, GENITIVE_CASE)].") charging = APC_NOT_CHARGING update_icon() return @@ -750,7 +759,7 @@ ..() /obj/machinery/power/apc/attack_alien(mob/living/carbon/xenomorph/humanoid/user) - to_chat(user, "You don't want to break these things"); + to_chat(user, "Вам незачем это ломать."); return /obj/machinery/power/apc/proc/get_malf_status(mob/living/silicon/ai/malf) @@ -788,7 +797,7 @@ /obj/machinery/power/apc/tgui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) - ui = new(user, src, "Apc", name) + ui = new(user, src, "Apc", "[capitalize(CASE(src, NOMINATIVE_CASE))]") ui.open() /obj/machinery/power/apc/tgui_data(mob/user) @@ -809,7 +818,7 @@ "powerChannels" = list( list( - "title" = "Equipment", + "title" = "Оборудование", "powerLoad" = DisplayPower(lastused_equip), "status" = equipment, "topicParams" = list( @@ -819,7 +828,7 @@ ) ), list( - "title" = "Lighting", + "title" = "Освещение", "powerLoad" = DisplayPower(lastused_light), "status" = lighting, "topicParams" = list( @@ -829,7 +838,7 @@ ) ), list( - "title" = "Environment", + "title" = "Жизнеобеспечение", "powerLoad" = DisplayPower(lastused_environ), "status" = environ, "topicParams" = list( @@ -865,7 +874,7 @@ ) \ ) // No AI control or hacked by other MalfAI if(!loud) - to_chat(user, "\The [src] have AI control disabled!") + to_chat(user, "Удалённый доступ отключен!") return FALSE else // Human @@ -895,11 +904,11 @@ . = TRUE if("toggle_nightshift") if(SSsmartlight.forced_admin_mode) - to_chat(usr, "Nothing happens.") + to_chat(usr, "Ничего не происходит.") return if(!COOLDOWN_FINISHED(src, smartlight_switch)) - to_chat(usr, "[src]'s smart lighting circuit breaker is still cycling!") + to_chat(usr, "\"Умный свет\" в процессе переключения!") return COOLDOWN_START(src, smartlight_switch, 4 SECONDS) @@ -907,14 +916,14 @@ . = TRUE if("change_smartlight") if(SSsmartlight.forced_admin_mode) - to_chat(usr, "Nothing happens.") + to_chat(usr, "Ничего не происходит.") return var/list/datum/light_mode/available_modes = smartlight_preset.get_user_available_modes() - var/mode_name = input(usr, "Please choose lighting mode.") as null|anything in available_modes + var/mode_name = input(usr, "Выберите режим освещения.") as null|anything in available_modes if(!COOLDOWN_FINISHED(src, smartlight_switch)) - to_chat(usr, "[src]'s smart lighting circuit breaker is still cycling!") + to_chat(usr, "Системы предохранения не позволяют поставить новый режим так быстро, немного подождите.") return if(mode_name) @@ -963,9 +972,9 @@ /obj/machinery/power/apc/proc/malf_hack(mob/living/silicon/ai/ai) if(ai.malfhacking) - to_chat(ai, "You are already hacking an APC.") + to_chat(ai, "Вы уже взламываете [CASE(src, ACCUSATIVE_CASE)].") return FALSE - to_chat(ai, "Beginning override of APC systems. This takes some time, and you cannot perform other actions during the process.") + to_chat(ai, "Перепрошивка платы [CASE(src, GENITIVE_CASE)] займёт немного времени. Вы не можете совершать другие действия по время перепрошивки.") ai.malfhack = src ai.malfhacking = TRUE addtimer(CALLBACK(src, PROC_REF(malf_hack_done), ai), 600) @@ -981,7 +990,7 @@ malfai = ai.parent else malfai = ai - to_chat(ai, "Hack complete. The APC is now under your exclusive control.") + to_chat(ai, "Взлом совершён. [CASE(src, NOMINATIVE_CASE)] под вашим личным контролем.") announce_hacker() update_icon() @@ -1035,7 +1044,7 @@ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(3, 1, src) s.start() - visible_message("The [src.name] suddenly lets out a blast of smoke and some sparks!", blind_message = "You hear sizzling electronics.") + visible_message("Из [CASE(src, GENITIVE_CASE)] валит сноп дыма и искр!", blind_message = "Вы слышите искрение электроники.") /obj/machinery/power/apc/surplus() diff --git a/code/modules/skills/skillbooks/skillbooks.dm b/code/modules/skills/skillbooks/skillbooks.dm index 8a712a366812..8267a891cb08 100644 --- a/code/modules/skills/skillbooks/skillbooks.dm +++ b/code/modules/skills/skillbooks/skillbooks.dm @@ -144,7 +144,7 @@ /datum/skill/medical = SKILL_LEVEL_NOVICE, /datum/skill/surgery = SKILL_LEVEL_NOVICE, /datum/skill/construction = SKILL_LEVEL_NOVICE, - /datum/skill/engineering = SKILL_LEVEL_NOVICE, + /datum/skill/engineering = SKILL_LEVEL_TRAINED, /datum/skill/chemistry = SKILL_LEVEL_NOVICE, ) diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index 077657fe997d..c36efca15577 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -140,7 +140,13 @@ if(ishuman(M)) covered = get_human_covering(M) - if(!handle_fumbling(user, M, SKILL_TASK_CHALLENGING, list(/datum/skill/surgery = SKILL_LEVEL_TRAINED), "You fumble around figuring out how to operate [M].")) + var/skillcheck = list(/datum/skill/surgery = SKILL_LEVEL_TRAINED) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.species.flags[IS_SYNTHETIC]) + skillcheck = list(/datum/skill/engineering = SKILL_LEVEL_TRAINED) + + if(!handle_fumbling(user, M, SKILL_TASK_AVERAGE, skillcheck, "You fumble around figuring out how to operate [M].")) return for(var/datum/surgery_step/S in surgery_steps) @@ -208,5 +214,5 @@ /datum/surgery_step/ipc can_infect = FALSE allowed_species = list(IPC) - required_skills = list(/datum/skill/engineering = SKILL_LEVEL_TRAINED, /datum/skill/surgery = SKILL_LEVEL_TRAINED) + required_skills = list(/datum/skill/engineering = SKILL_LEVEL_TRAINED, /datum/skill/surgery = SKILL_LEVEL_NOVICE) skills_speed_bonus = -0.2 diff --git a/icons/hud/screen_alert.dmi b/icons/hud/screen_alert.dmi index 3c4fc6d6619a..b1cbead0e903 100644 Binary files a/icons/hud/screen_alert.dmi and b/icons/hud/screen_alert.dmi differ diff --git a/sound/machines/dwoop.ogg b/sound/machines/dwoop.ogg new file mode 100644 index 000000000000..15847a561b45 Binary files /dev/null and b/sound/machines/dwoop.ogg differ diff --git a/sound/machines/longwhistle_robot.ogg b/sound/machines/longwhistle_robot.ogg new file mode 100644 index 000000000000..d7bca51562bf Binary files /dev/null and b/sound/machines/longwhistle_robot.ogg differ diff --git a/sound/machines/roboboop.ogg b/sound/machines/roboboop.ogg new file mode 100644 index 000000000000..6a2d9fd0af94 Binary files /dev/null and b/sound/machines/roboboop.ogg differ diff --git a/sound/machines/robochirp.ogg b/sound/machines/robochirp.ogg new file mode 100644 index 000000000000..51d534662d1e Binary files /dev/null and b/sound/machines/robochirp.ogg differ diff --git a/sound/machines/synth_alert.ogg b/sound/machines/synth_alert.ogg new file mode 100644 index 000000000000..1fe5dd4a3bab Binary files /dev/null and b/sound/machines/synth_alert.ogg differ diff --git a/sound/machines/synth_no.ogg b/sound/machines/synth_no.ogg new file mode 100644 index 000000000000..f0d2c3bfb0c4 Binary files /dev/null and b/sound/machines/synth_no.ogg differ diff --git a/sound/machines/synth_yes.ogg b/sound/machines/synth_yes.ogg new file mode 100644 index 000000000000..300cad132ede Binary files /dev/null and b/sound/machines/synth_yes.ogg differ diff --git a/sound/weapons/legtrap.ogg b/sound/weapons/legtrap.ogg new file mode 100644 index 000000000000..96eace37c228 Binary files /dev/null and b/sound/weapons/legtrap.ogg differ diff --git a/tgui/packages/tgui/interfaces/Apc.js b/tgui/packages/tgui/interfaces/Apc.js index b98c5eb26d22..5c7ffdc2c181 100644 --- a/tgui/packages/tgui/interfaces/Apc.js +++ b/tgui/packages/tgui/interfaces/Apc.js @@ -6,7 +6,7 @@ import { InterfaceLockNoticeBox } from './common/InterfaceLockNoticeBox'; export const Apc = (props, context) => { return ( @@ -18,18 +18,18 @@ export const Apc = (props, context) => { const powerStatusMap = { 2: { color: 'good', - externalPowerText: 'External Power', - chargingText: 'Fully Charged', + externalPowerText: 'Питание от сети', + chargingText: 'Заряжен', }, 1: { color: 'average', - externalPowerText: 'Low External Power', - chargingText: 'Charging', + externalPowerText: 'Низкое напряжение в сети', + chargingText: 'Идёт зарядка...', }, 0: { color: 'bad', - externalPowerText: 'No External Power', - chargingText: 'Not Charging', + externalPowerText: 'Нет внешнего питания', + chargingText: 'Не заряжается', }, }; @@ -60,22 +60,22 @@ const ApcContent = (props, context) => { return ( <> -
+
act('breaker')} /> )}> [ {externalPowerStatus.externalPowerText} ] - + {!!powerCellStatus && ( { value={powerCellCharge * 0.01} /> ) || ( - Power cell removed + Извлечён )} act('charge')} /> )}> @@ -101,7 +101,7 @@ const ApcContent = (props, context) => {
-
+
{channelArray.map(channel => { const { topicParams } = channel; @@ -113,11 +113,11 @@ const ApcContent = (props, context) => { <> = 2 ? 'good' : 'bad'}> - {channel.status >= 2 ? 'On' : 'Off'} + {channel.status >= 2 ? 'Вкл.' : 'Выкл.'}
{!!malfCanHack && (