diff --git a/_maps/map_files/nova/nova.dmm b/_maps/map_files/nova/nova.dmm index faf10b9e956..a660768c920 100644 --- a/_maps/map_files/nova/nova.dmm +++ b/_maps/map_files/nova/nova.dmm @@ -8047,6 +8047,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 5 }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, /turf/simulated/floor/plasteel{ icon_state = "whiteblue" }, @@ -21376,6 +21379,10 @@ icon_state = "purplefull" }, /area/medical/research/nhallway) +"dcl" = ( +/obj/effect/spawner/random_spawners/blood_5, +/turf/simulated/floor/plating, +/area/maintenance/secpost) "dcq" = ( /turf/simulated/wall/r_wall, /area/toxins/xenobiology) @@ -30040,6 +30047,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/disposalpipe/segment, /turf/simulated/floor/plasteel{ icon_state = "white" }, @@ -36205,7 +36213,10 @@ /area/turret_protected/aisat_interior/secondary) "fkL" = ( /obj/machinery/vending/boozeomat, -/turf/simulated/floor/carpet/black, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/simulated/floor/wood/dark, /area/ntrep) "fkO" = ( /obj/structure/railing/corner{ @@ -38557,6 +38568,10 @@ /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plating, /area/storage/secure) +"fBy" = ( +/obj/effect/decal/cleanable/spiderling_remains, +/turf/simulated/floor/plating, +/area/maintenance/secpost) "fBE" = ( /turf/simulated/floor/plasteel{ icon_state = "neutralfull" @@ -40551,6 +40566,11 @@ }, /turf/simulated/floor/carpet/red, /area/lawoffice) +"fQX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/vomit, +/turf/simulated/floor/plating, +/area/maintenance/secpost) "fQY" = ( /obj/effect/decal/cleanable/dirt, /obj/item/ammo_casing{ @@ -49004,6 +49024,9 @@ /obj/structure/cable{ icon_state = "4-8" }, +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_y = -30 + }, /turf/simulated/floor/engine{ slowdown = -0.3 }, @@ -58387,6 +58410,9 @@ d2 = 8; icon_state = "4-8" }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, /turf/simulated/floor/plasteel{ icon_state = "white" }, @@ -67059,6 +67085,9 @@ pixel_y = -33; req_access = list(73) }, +/obj/structure/disposalpipe/trunk/multiz/down{ + dir = 2 + }, /turf/simulated/floor/carpet/black, /area/ntrep) "jOs" = ( @@ -73290,6 +73319,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/segment, /turf/simulated/floor/plasteel{ icon_state = "white" }, @@ -76649,6 +76679,9 @@ /area/maintenance/fsmaint) "loQ" = ( /obj/machinery/disposal, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, /turf/simulated/floor/carpet/black, /area/ntrep) "loR" = ( @@ -77678,6 +77711,9 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/trunk/multiz{ + dir = 2 + }, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "dark" @@ -77889,6 +77925,7 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 8 }, +/obj/structure/disposalpipe/segment, /turf/simulated/floor/plasteel{ icon_state = "white" }, @@ -83543,12 +83580,6 @@ /turf/space/openspace, /area/space) "mpH" = ( -/obj/structure/disposalpipe/sortjunction{ - dir = 1; - name = "Captain's Office"; - sortType = 18; - icon_state = "pipe-j2s" - }, /obj/structure/cable{ icon_state = "4-8" }, @@ -83565,6 +83596,11 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 8 }, +/obj/structure/disposalpipe/sortjunction/reversed{ + dir = 1; + name = "Captain Office"; + sortType = 18 + }, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -86599,6 +86635,7 @@ /obj/structure/cable{ icon_state = "2-8" }, +/obj/structure/disposalpipe/segment, /turf/simulated/floor/plasteel{ icon_state = "white" }, @@ -90705,6 +90742,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/segment, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "dark" @@ -92138,8 +92176,8 @@ /obj/structure/cable{ icon_state = "1-4" }, -/obj/structure/disposalpipe/segment{ - dir = 6 +/obj/structure/disposalpipe/junction/reversed{ + dir = 2 }, /turf/simulated/floor/plasteel{ icon_state = "white" @@ -147670,6 +147708,9 @@ /obj/structure/cable{ icon_state = "4-8" }, +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_y = -30 + }, /turf/simulated/floor/engine{ slowdown = -0.3 }, @@ -148865,6 +148906,7 @@ /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/disposalpipe/segment, /turf/simulated/floor/plasteel{ icon_state = "white" }, @@ -157988,6 +158030,11 @@ }, /turf/simulated/floor/wood/fancy/cherry, /area/crew_quarters/theatre) +"xhp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random_spawners/blood_5, +/turf/simulated/floor/plating, +/area/maintenance/secpost) "xhr" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -255171,7 +255218,7 @@ ieI gtF otn kZy -wUw +fQX chE ddQ bbZ @@ -255685,7 +255732,7 @@ orm kfz xKb thB -wre +dcl xic ddQ oqM @@ -256711,7 +256758,7 @@ btM syu gVD bbZ -wre +fBy mVH bRV wre @@ -257228,7 +257275,7 @@ awC xRZ pWi wUw -wre +fBy ihn xXG aiQ @@ -257486,7 +257533,7 @@ xRZ wre wCs rhi -wUw +xhp uhC cPv tUk @@ -258000,7 +258047,7 @@ hoH mTa mqL jYH -wre +fBy awC ibR jAH diff --git a/code/controllers/subsystem/idlenpcpool.dm b/code/controllers/subsystem/idlenpcpool.dm index d3b3f072fbb..6a926cdce56 100644 --- a/code/controllers/subsystem/idlenpcpool.dm +++ b/code/controllers/subsystem/idlenpcpool.dm @@ -33,9 +33,8 @@ SUBSYSTEM_DEF(idlenpcpool) /datum/controller/subsystem/idlenpcpool/fire(resumed = FALSE) - if(!resumed) - var/list/idlelist = GLOB.simple_animals[AI_IDLE] - src.currentrun = idlelist.Copy() + var/list/idlelist = GLOB.simple_animals[AI_IDLE] + src.currentrun = idlelist.Copy() //cache for sanic speed (lists are references anyways) var/list/currentrun = src.currentrun diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index ac8a46d0b89..4eeac88c353 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -1618,7 +1618,7 @@ name = "Access Tuner" desc = "The access tuner is a small device that can interface with airlocks from range. It takes a few seconds to connect and can change the bolt state, open the door, or toggle emergency access." item = /obj/item/door_remote/omni/access_tuner - cost = 30 + cost = 15 /datum/uplink_item/device_tools/toolbox name = "Fully Loaded Toolbox" diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 0d3da129c58..8d5244cd0ad 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -68,6 +68,9 @@ // Open UI ui = new(user, src, "CameraConsole", name) ui.open() + sleep(1) //Fast and furious: assets were too slow and camera got screwed! + if(!ui.closing) + ui.window?.reinitialize() /obj/machinery/computer/security/ui_assets(mob/user) return list( diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index f8d9f076909..c9c8237cd9f 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -30,7 +30,15 @@ /obj/machinery/vending name = "\improper Vendomat" - desc = "A generic vending machine." + ru_names = list( + NOMINATIVE = "торговый автомат", + GENITIVE = "торгового автомата", + DATIVE = "торговому автомату", + ACCUSATIVE = "торговый автомат", + INSTRUMENTAL = "торговым автоматом", + PREPOSITIONAL = "торговом автомате" + ) + desc = "Обычный торговый автомат." icon = 'icons/obj/machines/vending.dmi' icon_state = "generic_off" layer = BELOW_OBJ_LAYER @@ -212,11 +220,11 @@ /obj/machinery/vending/examine(mob/user) . = ..() if(tilted) - . += span_warning("It's been tipped over and won't be usable unless it's righted.") + . += span_warning("Он лежит на боку и не будет функционировать до тех пор, пока его не поправят.") if(Adjacent(user)) - . += span_notice("You can Alt-Click it to right it.") + . += span_notice("Нажмите Alt-Click чтобы поднять автомат.") if(aggressive) - . += span_warning("Its product lights seem to be blinking ominously...") + . += span_warning("Его индикаторы, кажется, зловеще мигают...") /obj/machinery/vending/AltClick(mob/user) if(!tilted || !Adjacent(user) || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) @@ -460,7 +468,8 @@ /obj/machinery/vending/attackby(obj/item/I, mob/user, params) if(tilted) if(user.a_intent == INTENT_HELP) - to_chat(user, span_warning("[src] is tipped over and non-functional! You'll need to right it first.")) + balloon_alert(user, "автомат не работает!") + to_chat(user, span_warning("[capitalize(declent_ru(NOMINATIVE))] не может работать, пока он опрокинут!")) return ATTACK_CHAIN_BLOCKED_ALL return ..() @@ -470,39 +479,39 @@ if(istype(I, /obj/item/coin)) add_fingerprint(user) if(!length(premium)) - to_chat(user, span_warning("[src] does not accept coins.")) + balloon_alert(user, "слот отсутствует!") return ATTACK_CHAIN_PROCEED if(coin) - to_chat(user, span_warning("There is already a coin in this machine!")) + balloon_alert(user, "слот занят!") return ATTACK_CHAIN_PROCEED if(!user.drop_transfer_item_to_loc(I, src)) return ..() coin = I - to_chat(user, span_notice("You insert [I] into [src].")) + balloon_alert(user, "монета вставлена") SStgui.update_uis(src) return ATTACK_CHAIN_BLOCKED_ALL if(istype(I, refill_canister)) add_fingerprint(user) if(stat & (BROKEN|NOPOWER)) - to_chat(user, span_notice("[src] does not respond.")) + balloon_alert(user, "автомат не работает!") return ATTACK_CHAIN_PROCEED if(!panel_open) - to_chat(user, span_warning("You should probably unscrew the service panel first!")) + balloon_alert(user, "техпанель открыта!") return ATTACK_CHAIN_PROCEED var/obj/item/vending_refill/canister = I if(canister.get_part_rating() == 0) - to_chat(user, span_warning("The [canister.name] is empty!")) + balloon_alert(user, "канистра пуста!") return ATTACK_CHAIN_PROCEED // instantiate canister if needed var/transferred = restock(canister) if(transferred) - to_chat(user, span_notice("You loaded [transferred] items in [src].")) + balloon_alert(user, "канистра вставлена") return ATTACK_CHAIN_PROCEED_SUCCESS - to_chat(user, span_warning("There's nothing to restock!")) + balloon_alert(user,"нечего пополнять!") return ATTACK_CHAIN_PROCEED if(item_slot_check(user, I)) @@ -519,8 +528,8 @@ // no goodies, but also no tilts return if(COOLDOWN_FINISHED(src, last_hit_time)) - visible_message(span_warning("[src] seems to sway a bit!")) - to_chat(user, span_userdanger("You might want to think twice about doing that again, [src] looks like it could come crashing down!")) + visible_message(span_warning("[capitalize(declent_ru(NOMINATIVE))] странно покачивается...")) + to_chat(user, span_userdanger("Кажется, что [declent_ru(NOMINATIVE)] так и норовит упасть!")) COOLDOWN_START(src, last_hit_time, hit_warning_cooldown_length) return @@ -539,7 +548,7 @@ tilt(user, crit = TRUE) /obj/machinery/vending/proc/freebie(mob/user, num_freebies) - visible_message(span_notice("[num_freebies] free goodie\s tumble[num_freebies > 1 ? "" : "s"] out of [src]!")) + visible_message(span_notice("Из [declent_ru(GENITIVE)] начинают выпадать бесплатные товары!")) for(var/i in 1 to num_freebies) for(var/datum/data/vending_product/R in shuffle(product_records)) if(R.amount <= 0) @@ -557,8 +566,8 @@ if(isliving(AM) && prob(25)) AM.visible_message( - span_warning("[src] suddenly topples over onto [AM]!"), - span_userdanger("[src] topples over onto you without warning!") + span_warning("[capitalize(declent_ru(NOMINATIVE))] внезапно опрокидывается на [AM]!"), + span_userdanger("[capitalize(declent_ru(NOMINATIVE))] обрушивается на вас без предупреждения!") ) tilt(AM, prob(5), FALSE) aggressive = FALSE @@ -570,14 +579,14 @@ return . = TRUE if(tilted) - to_chat(user, span_warning("You'll need to right it first!")) + balloon_alert(user, "автомат перевёрнут!") return default_deconstruction_crowbar(user, I) /obj/machinery/vending/multitool_act(mob/user, obj/item/I) . = TRUE if(tilted) - to_chat(user, span_warning("You'll need to right it first!")) + balloon_alert(user, "автомат перевёрнут!") return if(!I.use_tool(src, user, 0, volume = I.tool_volume)) return @@ -586,7 +595,7 @@ /obj/machinery/vending/screwdriver_act(mob/user, obj/item/I) . = TRUE if(tilted) - to_chat(user, span_warning("You'll need to right it first!")) + balloon_alert(user, "автомат перевёрнут!") return if(!I.use_tool(src, user, 0, volume = I.tool_volume)) return @@ -599,7 +608,7 @@ /obj/machinery/vending/wirecutter_act(mob/user, obj/item/I) . = TRUE if(tilted) - to_chat(user, span_warning("You'll need to right it first!")) + balloon_alert(user, "автомат перевёрнут!") return if(I.use_tool(src, user, 0, volume = 0)) wires.Interact(user) @@ -607,7 +616,7 @@ /obj/machinery/vending/wrench_act(mob/user, obj/item/I) . = TRUE if(tilted) - to_chat(user, span_warning("The fastening bolts aren't on the ground, you'll need to right it first!")) + balloon_alert(user, "автомат перевёрнут!") return if(!I.use_tool(src, user, 0, volume = 0)) return @@ -633,7 +642,7 @@ if(!item_slot) return FALSE if(inserted_item) - to_chat(user, "There is something already inserted!") + balloon_alert(user, "внутри уже что-то есть!") return FALSE return TRUE @@ -665,7 +674,7 @@ else to_chat(user, display_parts(user)) if(moved) - to_chat(user, "[moved] items restocked.") + to_chat(user, "Вы пополнили [moved] товар[declension_ru(moved, "", "а", "ов")].") W.play_rped_sound() return TRUE @@ -677,10 +686,11 @@ if(!item_slot || inserted_item) return if(!user.drop_transfer_item_to_loc(I, src)) - to_chat(user, "[I] is stuck to your hand, you can't seem to put it down!") + to_chat(user, span_warning("[I] будто бы приклеен к твоей руке! Вы не можете его скинуть!")) return inserted_item = I - to_chat(user, "You insert [I] into [src].") + balloon_alert(user, "предмет вставлен") + to_chat(user, span_notice("Вы вставили [I] в [declent_ru(GENITIVE)].")) SStgui.update_uis(src) /obj/machinery/vending/proc/eject_item(mob/user) @@ -700,7 +710,7 @@ /obj/machinery/vending/emag_act(mob/user) emagged = TRUE if(user) - to_chat(user, "You short out the product lock on [src]") + to_chat(user, "Вы закоротили микросхемы [declent_ru(GENITIVE)]") /obj/machinery/vending/attack_ai(mob/user) return attack_hand(user) @@ -713,7 +723,7 @@ return if(tilted) - to_chat(user, span_warning("[src] is tipped over and non-functional! You'll need to right it first.")) + balloon_alert(user, "автомат не работает!") return if(..()) @@ -740,7 +750,7 @@ /obj/machinery/vending/ui_data(mob/user) var/list/data = list() var/datum/money_account/A = null - data["guestNotice"] = "No valid ID card detected. Wear your ID, or present cash."; + data["guestNotice"] = "Предъявите ID-карту или используйте наличные."; data["userMoney"] = 0 data["user"] = null if(issilicon(user) && !istype(user, /mob/living/silicon/robot/drone) && !istype(user, /mob/living/silicon/pai)) @@ -755,7 +765,7 @@ var/obj/item/stack/spacecash/S = H.get_active_hand() if(istype(S)) data["userMoney"] = S.amount - data["guestNotice"] = "Accepting Cash. You have: [S.amount] credits." + data["guestNotice"] = "Принимаем наличные. У вас есть: [S.amount] кредитов." else if(istype(H)) var/obj/item/card/id/C = H.get_id_card() if(istype(A)) @@ -764,7 +774,7 @@ data["userMoney"] = A.money data["user"]["job"] = (istype(C) && C.rank) ? C.rank : "No Job" else - data["guestNotice"] = "Unlinked ID detected. Present cash to pay."; + data["guestNotice"] = "Обнаруженная ID-карта не привязана к счёту."; data["stock"] = list() for (var/datum/data/vending_product/R in product_records + coin_records + hidden_records) data["stock"][R.name] = R.amount @@ -831,7 +841,7 @@ if(.) return if(issilicon(usr) && !isrobot(usr)) - to_chat(usr, span_warning("The vending machine refuses to interface with you, as you are not in its target demographic!")) + to_chat(usr, span_warning("[capitalize(declent_ru(NOMINATIVE))] отказывается взаимодействовать с вами, поскольку вы не входите в его целевую аудиторию!")) return switch(action) if("toggle_voice") @@ -843,22 +853,22 @@ . = TRUE if("remove_coin") if(!coin) - to_chat(usr, span_warning("There is no coin in this machine.")) + balloon_alert(usr, "в автомате нет монет!") return - if(istype(usr, /mob/living/silicon)) - to_chat(usr, span_warning("You lack hands.")) + if(issilicon(usr)) + balloon_alert(usr, "у вас нет рук!") return - to_chat(usr, span_notice("You remove [coin] from [src].")) + to_chat(usr, span_notice("Вы достали [coin] из [declent_ru(GENITIVE)].")) coin.forceMove_turf() usr.put_in_hands(coin, ignore_anim = FALSE) coin = null . = TRUE if("vend") if(!vend_ready) - to_chat(usr, span_warning("The vending machine is busy!")) + balloon_alert(usr, "торговый автомат занят!") return if(panel_open) - to_chat(usr, span_warning("The vending machine cannot dispense products while its service panel is open!")) + balloon_alert(usr, "техпанель открыта!") return var/key = text2num(params["inum"]) var/list/display_records = product_records + coin_records @@ -904,7 +914,7 @@ // --- THE REST OF THIS PROC IS JUST PAYMENT LOGIC --- if(!GLOB.vendor_account || GLOB.vendor_account.suspended) - to_chat(usr, "Vendor account offline. Unable to process transaction.") + to_chat(usr, "Удалённый сервер торговых автоматов отключён. Не удается обработать операцию.") flick_vendor_overlay(FLICK_DENY) vend_ready = TRUE return @@ -924,7 +934,7 @@ to_chat(usr, span_notice("Vending object due to admin interaction.")) paid = TRUE else - to_chat(usr, span_warning("Payment failure: you have no ID or other method of payment.")) + to_chat(usr, span_warning("Сбой платежа: у вас нет ID-карты или другого способа оплаты.")) vend_ready = TRUE flick_vendor_overlay(FLICK_DENY) . = TRUE // we set this because they shouldn't even be able to get this far, and we want the UI to update. @@ -933,7 +943,7 @@ vend(currently_vending, usr) . = TRUE else - to_chat(usr, span_warning("Payment failure: unable to process payment.")) + to_chat(usr, span_warning("Сбой платежа: не удается обработать платеж.")) vend_ready = TRUE if(.) add_fingerprint(usr) @@ -943,13 +953,13 @@ /obj/machinery/vending/proc/vend(datum/data/vending_product/R, mob/user) if(!allowed(user) && !user.can_admin_interact() && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH - to_chat(user, span_warning("Access denied."))//Unless emagged of course + to_chat(user, span_warning("В доступе отказано."))//Unless emagged of course flick_vendor_overlay(FLICK_DENY) vend_ready = TRUE return if(!R.amount) - to_chat(user, span_warning("The vending machine has ran out of that product.")) + to_chat(user, span_warning("В [declent_ru(PREPOSITIONAL)] закончился этот товар.")) vend_ready = TRUE return @@ -957,14 +967,14 @@ if(coin_records.Find(R)) if(!coin) - to_chat(user, span_notice("You need to insert a coin to get this item.")) + to_chat(user, span_notice("Вам нужно вставить монету, чтобы получить этот товар.")) vend_ready = TRUE return if(coin.string_attached) if(prob(50)) - to_chat(user, span_notice("You successfully pull the coin out before [src] could swallow it.")) + to_chat(user, span_notice("Вы успешно вытаскиваете монету до того, как [declent_ru(NOMINATIVE)] успевает ее проглотить.")) else - to_chat(user, span_notice("You weren't able to pull the coin out fast enough, the machine ate it, string and all.")) + to_chat(user, span_notice("Вы не смогли вытащить монету достаточно быстро, [declent_ru(NOMINATIVE)] съел ее вместе с ниткой и всем остальным.")) QDEL_NULL(coin) else QDEL_NULL(coin) @@ -1095,7 +1105,7 @@ if(!throw_item) return throw_item.throw_at(target, 16, 3) - visible_message("[src] launches [throw_item.name] at [target.name]!") + visible_message(span_danger("[capitalize(declent_ru(NOMINATIVE))] метнул [throw_item.name] в [target.name]!")) /obj/machinery/vending/shove_impact(mob/living/target, mob/living/attacker) @@ -1105,14 +1115,14 @@ add_attack_logs(attacker, target, "shoved into a vending machine ([src])") tilt(target, from_combat = TRUE) target.visible_message( - span_danger("[attacker] slams [target] into [src]!"), - span_userdanger("You get slammed into [src] by [attacker]!"), - span_danger(">You hear a loud crunch.") + span_danger("[attacker] толкает [target] в [declent_ru(ACCUSATIVE)]!"), + span_userdanger("[attacker] впечатывает вас в [declent_ru(GENITIVE)]!"), + span_danger("Вы слышите громкий хруст.") ) else attacker.visible_message( - span_notice("[attacker] lightly presses [target] against [src]."), - span_userdanger("You lightly press [target] against [src], you don't want to hurt [target.p_them()]!") + span_notice("[attacker] слегка прижимает [target] к [declent_ru(DATIVE)]."), + span_userdanger("Вы слегка прижимаете [target] к [declent_ru(DATIVE)], вы же не хотите причинить [genderize_ru(target.gender, "ему", "ей", "ему", "им")] боль!") ) return TRUE @@ -1146,9 +1156,9 @@ else victim.visible_message( - span_danger("[victim] is crushed by [src]!"), - span_userdanger("[src] crushes you!"), - span_warning("You hear a loud crunch!") + span_danger("[victim] раздавлен[genderize_ru(victim.gender, "", "а", "о", "ы")] [declent_ru(INSTRUMENTAL)]!"), + span_userdanger("[capitalize(declent_ru(NOMINATIVE))] сокрушает тебя!"), + span_warning("Вы слышите громкий хруст!") ) add_attack_logs(null, victim, "crushed by [src]") @@ -1214,9 +1224,9 @@ should_throw_at_target = FALSE else victim.visible_message( - span_danger("[victim] is crushed by [src]!"), - span_userdanger("[src] falls on top of you, crushing you!"), - span_warning("You hear a loud crunch!") + span_danger("[victim] раздавлен[genderize_ru(victim.gender, "", "а", "о", "ы")] [declent_ru(INSTRUMENTAL)]!"), + span_userdanger("[capitalize(declent_ru(NOMINATIVE))] сокрушает тебя!"), + span_warning("Вы слышите громкий хруст!") ) victim.apply_damage(damage_to_deal, BRUTE) add_attack_logs(null, victim, "crushed by [src]") @@ -1231,7 +1241,7 @@ tilt_over(should_throw_at_target ? target_atom : null) /obj/machinery/vending/proc/tilt_over(mob/victim) - visible_message( span_danger("[src] tips over!")) + visible_message(span_danger("[capitalize(declent_ru(NOMINATIVE))] опрокидывается!")) playsound(src, "sound/effects/bang.ogg", 100, TRUE) var/picked_rotation = pick(90, 270) tilted_rotation = picked_rotation @@ -1247,15 +1257,15 @@ if(user) user.visible_message( - "[user] begins to right [src].", - "You begin to right [src]." + "[user] начинает поднимать [declent_ru(ACCUSATIVE)].", + "Вы начинаете поднимать [declent_ru(ACCUSATIVE)]." ) if(!do_after(user, 7 SECONDS, src, max_interact_count = 1, cancel_on_max = TRUE)) return user.visible_message( - span_notice("[user] rights [src]."), - span_notice("You right [src]."), - span_notice(">You hear a loud clang.") + span_notice("[user] поднял [declent_ru(ACCUSATIVE)]."), + span_notice("Вы подняли [declent_ru(ACCUSATIVE)]."), + span_notice("Вы слышите громкий лязг.") ) if(!tilted) //Sanity check return @@ -1280,12 +1290,25 @@ products = list( /obj/item/assembly/prox_sensor = 5,/obj/item/assembly/igniter = 3,/obj/item/assembly/signaler = 4, /obj/item/wirecutters = 1, /obj/item/cartridge/signal = 4) contraband = list(/obj/item/flashlight = 5,/obj/item/assembly/timer = 2, /obj/item/assembly/voice = 2, /obj/item/assembly/health = 2) - ads_list = list("Only the finest!","Have some tools.","The most robust equipment.","The finest gear in space!") + ads_list = list( + "Только самое лучшее!", + "Имеются всякие инструменты.", + "Самое надежное оборудование!", + "Лучшее снаряжение в космосе!" + ) refill_canister = /obj/item/vending_refill/assist /obj/machinery/vending/boozeomat name = "\improper Booze-O-Mat" - desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one." + ru_names = list( + NOMINATIVE = "торговый автомат Booze-O-Mat", + GENITIVE = "торгового автомата Booze-O-Mat", + DATIVE = "торговому автомату Booze-O-Mat", + ACCUSATIVE = "торговый автомат Booze-O-Mat", + INSTRUMENTAL = "торговым автоматом Booze-O-Mat", + PREPOSITIONAL = "торговом автомате Booze-O-Mat" + ) + desc = "Чудо техники, предположительно способное выдать идеальный напиток для вас в тот момент, когда вы об этом попросите." icon_state = "boozeomat_off" //////////////18 drink entities below, plus the glasses, in case someone wants to edit the number of bottles panel_overlay = "boozeomat_panel" @@ -1330,8 +1353,30 @@ contraband = list(/obj/item/reagent_containers/food/drinks/tea = 10, /obj/item/reagent_containers/food/drinks/bottle/fernet = 5) vend_delay = 15 - slogan_list = list("Надеюсь, никто не попросит меня о чёртовой кружке чая…","Алкоголь — друг человека. Вы же не бросите друга?","Очень рад вас обслужить!","Никто на этой станции не хочет выпить?") - ads_list = list("Выпьем!","Бухло пойдёт вам на пользу!","Алкоголь — друг человека.","Очень рад вас обслужить!","Хотите отличного холодного пива?","Ничто так не лечит, как бухло!","Пригубите!","Выпейте!","Возьмите пивка!","Пиво пойдёт вам на пользу!","Только лучший алкоголь!","Бухло лучшего качества с 2053 года!","Вино со множеством наград!","Максимум алкоголя!","Мужчины любят пиво","Тост: «За прогресс!»") + slogan_list = list( + "Надеюсь, никто не попросит меня о чёртовой кружке чая…", + "Алкоголь — друг человека. Вы же не бросите друга?", + "Очень рад вас обслужить!", + "Никто на этой станции не хочет выпить?" + ) + ads_list = list( + "Выпьем!", + "Бухло пойдёт вам на пользу!", + "Алкоголь — друг человека.", + "Очень рад вас обслужить!", + "Хотите отличного холодного пива?", + "Ничто так не лечит, как бухло!", + "Пригубите!", + "Выпейте!", + "Возьмите пивка!", + "Пиво пойдёт вам на пользу!", + "Только лучший алкоголь!", + "Бухло лучшего качества с 2053 года!", + "Вино со множеством наград!", + "Максимум алкоголя!", + "Мужчины любят пиво", + "Тост: «За прогресс!»" + ) refill_canister = /obj/item/vending_refill/boozeomat /obj/machinery/vending/boozeomat/syndicate_access @@ -1339,8 +1384,30 @@ /obj/machinery/vending/coffee name = "\improper Solar's Best Hot Drinks" - desc = "A vending machine which dispenses hot drinks." - ads_list = list("Выпейте!","Выпьем!","На здоровье!","Не хотите горячего супчику?","Я бы убил за чашечку кофе!","Лучшие зёрна в галактике","Для Вас — только лучшие напитки","М-м-м-м… Ничто не сравнится с кофе","Я люблю кофе, а Вы?","Кофе помогает работать!","Возьмите немного чайку","Надеемся, Вы предпочитаете лучшее!","Отведайте наш новый шоколад!","Admin conspiracies") + ru_names = list( + NOMINATIVE = "торговый автомат Solar's Best Hot Drinks", + GENITIVE = "торгового автомата Solar's Best Hot Drinks", + DATIVE = "торговому автомату Solar's Best Hot Drinks", + ACCUSATIVE = "торговый автомат Solar's Best Hot Drinks", + INSTRUMENTAL = "торговым автоматом Solar's Best Hot Drinks", + PREPOSITIONAL = "торговом автомате Solar's Best Hot Drinks" + ) + desc = "Это машина, которая готовит горячие напитки. Ну, знаете, такие, которые кипятком заливают." + ads_list = list( + "Выпейте!", + "Выпьем!", + "На здоровье!", + "Не хотите горячего супчику?", + "Я бы убил за чашечку кофе!", + "Лучшие зёрна в галактике", + "Для Вас — только лучшие напитки", + "М-м-м-м… Ничто не сравнится с кофе", + "Я люблю кофе, а Вы?", + "Кофе помогает работать!", + "Возьмите немного чайку", + "Надеемся, Вы предпочитаете лучшее!", + "Отведайте наш новый шоколад!" + ) icon_state = "coffee_off" panel_overlay = "coffee_panel" @@ -1382,7 +1449,7 @@ if(!..()) return FALSE if(!I.is_open_container()) - to_chat(user, "You need to open [I] before inserting it.") + to_chat(user, span_warning("Вам нужно открыть [I], прежде чем вставить его.")) return FALSE return TRUE @@ -1418,9 +1485,31 @@ /obj/machinery/vending/snack name = "\improper Getmore Chocolate Corp" - desc = "A snack machine courtesy of the Getmore Chocolate Corporation, based out of Mars." - slogan_list = list("Попробуйте наш новый батончик с нугой!","Вдвое больше калорий за полцены!") - ads_list = list("The healthiest!","Award-winning chocolate bars!","Mmm! So good!","Oh my god it's so juicy!","Have a snack.","Snacks are good for you!","Have some more Getmore!","Best quality snacks straight from mars.","We love chocolate!","Try our new jerky!") + ru_names = list( + NOMINATIVE = "торговый автомат Getmore Chocolate Corp", + GENITIVE = "торгового автомата Getmore Chocolate Corp", + DATIVE = "торговому автомату Getmore Chocolate Corp", + ACCUSATIVE = "торговый автомат Getmore Chocolate Corp", + INSTRUMENTAL = "торговым автоматом Getmore Chocolate Corp", + PREPOSITIONAL = "торговом автомате Getmore Chocolate Corp" + ) + desc = "Автомат самообслуживания, любезно предоставленный шоколадной корпорацией Getmore, базирующейся на Марсе." + slogan_list = list( + "Попробуйте наш новый батончик с нугой!", + "Вдвое больше калорий за полцены!" + ) + ads_list = list( + "Самый здоровый!", + "Отмеченные наградами шоколадные батончики!", + "Ммм! Так вкусно!", + "О боже, это так вкусно!", + "Перекусите.", + "Закуски - это здорово!", + "Возьми немного, и еще немного!", + "Закуски высшего качества прямо с Марса.", + "Мы любим шоколад!", + "Попробуйте наше новое вяленое мясо!" + ) icon_state = "snack_off" panel_overlay = "snack_panel" @@ -1461,8 +1550,21 @@ /obj/machinery/vending/chinese name = "\improper Mr. Chang" - desc = "A self-serving Chinese food machine, for all your Chinese food needs." - slogan_list = list("Попробуйте 5000 лет культуры!","Мистер Чанг, одобрен для безопасного потребления в более чем 10 секторах!","Китайская кухня отлично подходит для вечернего свидания или одинокого вечера!","Вы не ошибетесь, если попробуете настоящую китайскую кухню от мистера Чанга.!") + ru_names = list( + NOMINATIVE = "торговый автомат Mr. Chang", + GENITIVE = "торгового автомата Mr. Chang", + DATIVE = "торговому автомату Mr. Chang", + ACCUSATIVE = "торговый автомат Mr. Chang", + INSTRUMENTAL = "торговым автоматом Mr. Chang", + PREPOSITIONAL = "торговом автомате Mr. Chang" + ) + desc = "Китайская машина самообслуживания, создана специально для удовлетворения потребности в китайской кухне." + slogan_list = list( + "Попробуйте 5000 лет культуры!", + "Мистер Чанг, одобрен для безопасного потребления в более чем 10 секторах!", + "Китайская кухня отлично подходит для вечернего свидания или одинокого вечера!", + "Вы не ошибетесь, если попробуете настоящую китайскую кухню от мистера Чанга!" + ) icon_state = "chang_off" panel_overlay = "chang_panel" @@ -1505,7 +1607,15 @@ /obj/machinery/vending/cola name = "\improper Robust Softdrinks" - desc = "A soft drink vendor provided by Robust Industries, LLC." + ru_names = list( + NOMINATIVE = "торговый автомат Robust Softdrinks", + GENITIVE = "торгового автомата Robust Softdrinks", + DATIVE = "торговому автомату Robust Softdrinks", + ACCUSATIVE = "торговый автомат Robust Softdrinks", + INSTRUMENTAL = "торговым автоматом Robust Softdrinks", + PREPOSITIONAL = "торговом автомате Robust Softdrinks" + ) + desc = "Автомат с безалкогольными напитками, предоставляемый компанией Robust Industries, LLC." icon_state = "cola-machine_off" panel_overlay = "cola-machine_panel" @@ -1515,7 +1625,15 @@ broken_lightmask_overlay = "cola-machine_broken_lightmask" slogan_list = list("Роб+аст с+офтдринкс: крепче, чем тулбоксом по голове!") - ads_list = list("Освежает!","Надеюсь, вас одолела жажда!","Продано больше миллиона бутылок!","Хотите пить? Почему бы не взять колы?","Пожалуйста, купите напиток","Выпьем!","Лучшие напитки во всём космосе") + ads_list = list( + "Освежает!", + "Надеюсь, вас одолела жажда!", + "Продано больше миллиона бутылок!", + "Хотите пить? Почему бы не взять колы?", + "Пожалуйста, купите напиток", + "Выпьем!", + "Лучшие напитки во всём космосе" + ) products = list( /obj/item/reagent_containers/food/drinks/cans/cola = 10, /obj/item/reagent_containers/food/drinks/cans/space_mountain_wind = 10, @@ -1548,7 +1666,15 @@ /obj/machinery/vending/cart name = "\improper PTech" - desc = "Cartridges for PDA's." + ru_names = list( + NOMINATIVE = "торговый автомат PTech", + GENITIVE = "торгового автомата PTech", + DATIVE = "торговому автомату PTech", + ACCUSATIVE = "торговый автомат PTech", + INSTRUMENTAL = "торговым автоматом PTech", + PREPOSITIONAL = "торговом автомате PTech" + ) + desc = "Картриджи для КПК." slogan_list = list("Карточки в дорогу!") icon_state = "cart_off" @@ -1573,7 +1699,15 @@ /obj/machinery/vending/liberationstation name = "\improper Liberation Station" - desc = "An overwhelming amount of ancient patriotism washes over you just by looking at the machine." + ru_names = list( + NOMINATIVE = "торговый автомат Liberation Station", + GENITIVE = "торгового автомата Liberation Station", + DATIVE = "торговому автомату Liberation Station", + ACCUSATIVE = "торговый автомат Liberation Station", + INSTRUMENTAL = "торговым автоматом Liberation Station", + PREPOSITIONAL = "торговом автомате Liberation Station" + ) + desc = "При одном взгляде на эту машину вас охватывает непреодолимое чувство древнего патриотизма." icon_state = "liberationstation_off" panel_overlay = "liberationstation_panel" @@ -1583,9 +1717,19 @@ broken_lightmask_overlay = "liberationstation_broken_lightmask" req_access = list(ACCESS_SECURITY) - slogan_list = list("Liberation Station: Your one-stop shop for all things second amendment!","Be a patriot today, pick up a gun!","Quality weapons for cheap prices!","Better dead than red!") - ads_list = list("Float like an astronaut, sting like a bullet!","Express your second amendment today!","Guns don't kill people, but you can!","Who needs responsibilities when you have guns?") - vend_reply = "Remember the name: Liberation Station!" + slogan_list = list( + "Liberation Station: Ваш универсальный магазин всего, что связано со второй поправкой!", + "Будь патриотом, возьми в руки оружие уже сегодня!", + "Качественное оружие по низким ценам!", + "Лучше умереть, чем покраснеть!" + ) + ads_list = list( + "Порхай, как космонавт, жаль, как пуля!", + "Ты что, опять сохраняешься?", + "Оружие не убивает людей, а вот ты можешь!", + "Какая ещё может быть ответственность, если у тебя есть ствол?" + ) + vend_reply = "Запомни моё имя: Liberation Station!" products = list(/obj/item/gun/projectile/automatic/pistol/deagle/gold = 2,/obj/item/gun/projectile/automatic/pistol/deagle/camo = 2, /obj/item/gun/projectile/automatic/pistol/m1911 = 2,/obj/item/gun/projectile/automatic/proto = 2, /obj/item/gun/projectile/shotgun/automatic/combat = 2,/obj/item/gun/projectile/automatic/gyropistol = 1, @@ -1598,7 +1742,15 @@ /obj/machinery/vending/toyliberationstation name = "\improper Syndicate Donksoft Toy Vendor" - desc = "An ages 8 and up approved vendor that dispenses toys. If you were to find the right wires, you can unlock the adult mode setting!" + ru_names = list( + NOMINATIVE = "торговый автомат Syndicate Donksoft Toy Vendor", + GENITIVE = "торгового автомата Syndicate Donksoft Toy Vendor", + DATIVE = "торговому автомату Syndicate Donksoft Toy Vendor", + ACCUSATIVE = "торговый автомат Syndicate Donksoft Toy Vendor", + INSTRUMENTAL = "торговым автоматом Syndicate Donksoft Toy Vendor", + PREPOSITIONAL = "торговом автомате Syndicate Donksoft Toy Vendor" + ) + desc = "Одобренный автомат игрушек для детей от 8 лет и старше. Если вы найдете нужные провода, вы сможете разблокировать режим для взрослых!" icon_state = "syndi_off" panel_overlay = "syndi_panel" @@ -1607,9 +1759,21 @@ broken_overlay = "syndi_broken" broken_lightmask_overlay = "syndi_broken_lightmask" - slogan_list = list("Get your cool toys today!","Trigger a valid hunter today!","Quality toy weapons for cheap prices!","Give them to HoPs for all access!","Give them to HoS to get permabrigged!") - ads_list = list("Feel robust with your toys!","Express your inner child today!","Toy weapons don't kill people, but valid hunters do!","Who needs responsibilities when you have toy weapons?","Make your next murder FUN!") - vend_reply = "Come back for more!" + slogan_list = list( + "Получите крутые игрушки прямо сейчас!", + "Начните свою охоту уже сегодня!", + "Качественное игрушечное оружие по низким ценам!", + "Подарите их ГП для получения общего доступа!", + "Подарите их ГСБ чтобы попасть в пермабриг!" + ) + ads_list = list( + "Почувствуй робастность, с игрушкой в руках!", + "Проявите своего внутреннего ребенка уже сегодня!", + "Давай, сражайся как мужчина!", + "Какая к чёрту ответственность, за игрушечный ствол?", + "Сделайте свое следующее убийство ВЕСЕЛЫМ!" + ) + vend_reply = "Возвращайтесь за добавкой!" products = list(/obj/item/gun/projectile/automatic/toy = 10, /obj/item/gun/projectile/automatic/toy/pistol= 10, /obj/item/gun/projectile/shotgun/toy = 10, @@ -1633,9 +1797,30 @@ /obj/machinery/vending/cigarette name = "ShadyCigs Deluxe" - desc = "If you want to get cancer, might as well do it in style." - slogan_list = list("Космосигареты весьма хороши на вкус, какими они и должны быть","I'd rather toolbox than switch.","Затянитесь!","Не верьте исследованиям — курите!") - ads_list = list("Наверняка не очень-то и вредно для Вас!","Не верьте учёным!","На здоровье!","Не бросайте курить, купите ещё!","Затянитесь!","Никотиновый рай","Лучшие сигареты с 2150 года","Сигареты с множеством наград") + ru_names = list( + NOMINATIVE = "торговый автомат ShadyCigs Deluxe", + GENITIVE = "торгового автомата ShadyCigs Deluxe", + DATIVE = "торговому автомату ShadyCigs Deluxe", + ACCUSATIVE = "торговый автомат ShadyCigs Deluxe", + INSTRUMENTAL = "торговым автоматом ShadyCigs Deluxe", + PREPOSITIONAL = "торговом автомате ShadyCigs Deluxe" + ) + desc = "Если ты собираешься заболеть раком, по крайней мере, сделай это стильно!" + slogan_list = list( + "Космосигареты весьма хороши на вкус, какими они и должны быть", + "Затянитесь!", + "Не верьте исследованиям — курите!" + ) + ads_list = list( + "Наверняка не очень-то и вредно для Вас!", + "Не верьте учёным!", + "На здоровье!", + "Не бросайте курить, купите ещё!", + "Затянитесь!", + "Никотиновый рай", + "Лучшие сигареты с 2150 года", + "Сигареты с множеством наград" + ) vend_delay = 34 icon_state = "cigs_off" @@ -1693,9 +1878,26 @@ /obj/machinery/vending/cigarette/beach //Used in the lavaland_biodome_beach.dmm ruin name = "\improper ShadyCigs Ultra" - desc = "Now with extra premium products!" - ads_list = list("Наверняка не очень-то и вредно для Вас!","Допинг проведёт через безденежье лучше, чем деньги через бездопингье!","На здоровье!") - slogan_list = list("Включи, настрой, получи!","С химией жить веселей!","Затянитесь!","Сохраняй улыбку на устах и песню в своём сердце!") + ru_names = list( + NOMINATIVE = "торговый автомат ShadyCigs Ultra", + GENITIVE = "торгового автомата ShadyCigs Ultra", + DATIVE = "торговому автомату ShadyCigs Ultra", + ACCUSATIVE = "торговый автомат ShadyCigs Ultra", + INSTRUMENTAL = "торговым автоматом ShadyCigs Ultra", + PREPOSITIONAL = "торговом автомате ShadyCigs Ultra" + ) + desc = "Теперь с дополнительными продуктами премиум-класса!" + ads_list = list( + "Наверняка не очень-то и вредно для Вас!", + "Допинг проведёт через безденежье лучше, чем деньги через бездопингье!", + "На здоровье!" + ) + slogan_list = list( + "Включи, настрой, получи!", + "С химией жить веселей!", + "Затянитесь!", + "Сохраняй улыбку на устах и песню в своём сердце!" + ) products = list(/obj/item/storage/fancy/cigarettes = 5, /obj/item/storage/fancy/cigarettes/cigpack_uplift = 3, /obj/item/storage/fancy/cigarettes/cigpack_robust = 3, @@ -1711,7 +1913,15 @@ /obj/machinery/vending/medical name = "\improper NanoMed Plus" - desc = "Medical drug dispenser." + ru_names = list( + NOMINATIVE = "торговый автомат NanoMed Plus", + GENITIVE = "торгового автомата NanoMed Plus", + DATIVE = "торговому автомату NanoMed Plus", + ACCUSATIVE = "торговый автомат NanoMed Plus", + INSTRUMENTAL = "торговым автоматом NanoMed Plus", + PREPOSITIONAL = "торговом автомате NanoMed Plus" + ) + desc = "Медицинский раздатчик веществ." icon_state = "med_off" panel_overlay = "med_panel" @@ -1721,7 +1931,15 @@ broken_lightmask_overlay = "med_broken_lightmask" deny_overlay = "med_deny" - ads_list = list("Иди и спаси несколько жизней!","Лучшее снаряжение для вашего медотдела","Только лучшие инструменты","Натуральные химикаты!","Эта штука спасает жизни","Может сами примете?","Пинг!") + ads_list = list( + "Иди и спаси несколько жизней!", + "Лучшее снаряжение для вашего медотдела", + "Только лучшие инструменты", + "Натуральные химикаты!", + "Эта штука спасает жизни", + "Может сами примете?", + "Пинг!" + ) req_access = list(ACCESS_MEDICAL) products = list(/obj/item/reagent_containers/syringe = 12, /obj/item/reagent_containers/food/pill/patch/styptic = 4, /obj/item/reagent_containers/food/pill/patch/silver_sulf = 4, /obj/item/reagent_containers/applicator/brute = 3, /obj/item/reagent_containers/applicator/burn = 3, /obj/item/reagent_containers/glass/bottle/charcoal = 4, /obj/item/reagent_containers/glass/bottle/epinephrine = 4, /obj/item/reagent_containers/glass/bottle/diphenhydramine = 4, @@ -1739,7 +1957,14 @@ /obj/machinery/vending/medical/syndicate_access name = "\improper SyndiMed Plus" - + ru_names = list( + NOMINATIVE = "торговый автомат SyndiMed Plus", + GENITIVE = "торгового автомата SyndiMed Plus", + DATIVE = "торговому автомату SyndiMed Plus", + ACCUSATIVE = "торговый автомат SyndiMed Plus", + INSTRUMENTAL = "торговым автоматом SyndiMed Plus", + PREPOSITIONAL = "торговом автомате SyndiMed Plus" + ) icon_state = "syndi-big-med_off" panel_overlay = "syndi-big-med_panel" screen_overlay = "syndi-big-med" @@ -1755,7 +1980,15 @@ /obj/machinery/vending/plasmaresearch name = "\improper Toximate 3000" - desc = "All the fine parts you need in one vending machine!" + ru_names = list( + NOMINATIVE = "торговый автомат Toximate 3000", + GENITIVE = "торгового автомата Toximate 3000", + DATIVE = "торговому автомату Toximate 3000", + ACCUSATIVE = "торговый автомат Toximate 3000", + INSTRUMENTAL = "торговым автоматом Toximate 3000", + PREPOSITIONAL = "торговом автомате Toximate 3000" + ) + desc = "Все, что вам нужно, в одном удобном месте!" icon_state = "generic_off" panel_overlay = "generic_panel" @@ -1771,8 +2004,24 @@ /obj/machinery/vending/wallmed name = "\improper NanoMed" - desc = "Wall-mounted Medical Equipment dispenser." - ads_list = list("Иди и спаси несколько жизней!","Лучшее снаряжение для вашего медотдела","Только лучшие инструменты","Натуральные химикаты!","Эта штука спасает жизни","Может сами примете?","Пинг!") + ru_names = list( + NOMINATIVE = "торговый автомат NanoMed", + GENITIVE = "торгового автомата NanoMed", + DATIVE = "торговому автомату NanoMed", + ACCUSATIVE = "торговый автомат NanoMed", + INSTRUMENTAL = "торговым автоматом NanoMed", + PREPOSITIONAL = "торговом автомате NanoMed" + ) + desc = "Настенный раздатчик медицинских изделий." + ads_list = list( + "Иди и спаси несколько жизней!", + "Лучшее снаряжение для вашего медотдела", + "Только лучшие инструменты", + "Натуральные химикаты!", + "Эта штука спасает жизни", + "Может сами примете?", + "Пинг!" + ) icon_state = "wallmed_off" panel_overlay = "wallmed_panel" @@ -1792,7 +2041,15 @@ /obj/machinery/vending/wallmed/syndicate name = "\improper SyndiWallMed" - desc = "EVIL wall-mounted Medical Equipment dispenser." + ru_names = list( + NOMINATIVE = "торговый автомат SyndiWallMed", + GENITIVE = "торгового автомата SyndiWallMed", + DATIVE = "торговому автомату SyndiWallMed", + ACCUSATIVE = "торговый автомат SyndiWallMed", + INSTRUMENTAL = "торговым автоматом SyndiWallMed", + PREPOSITIONAL = "торговом автомате SyndiWallMed" + ) + desc = "Злое воплощение настенного раздатчика медицинских изделий." icon_state = "wallmed_off" panel_overlay = "wallmed_panel" @@ -1811,8 +2068,26 @@ /obj/machinery/vending/security name = "\improper SecTech" - desc = "A security equipment vendor." - ads_list = list("Круши черепа капиталистов!","Отбей несколько голов!","Не забывай, вредительство - полезно!","Твое оружие здесь.","Наручники!","Стоять, подонок!","Не бей меня, брат!","Убей их, брат.","Почему бы не съесть пончик?") + ru_names = list( + NOMINATIVE = "торговый автомат SecTech", + GENITIVE = "торгового автомата SecTech", + DATIVE = "торговому автомату SecTech", + ACCUSATIVE = "торговый автомат SecTech", + INSTRUMENTAL = "торговым автоматом SecTech", + PREPOSITIONAL = "торговом автомате SecTech" + ) + desc = "Раздатчик снаряжения службы безопасности." + ads_list = list( + "Круши черепа капиталистов!", + "Отбей несколько голов!", + "Не забывай, вредительство - полезно!", + "Твое оружие здесь.", + "Наручники!", + "Стоять, подонок!", + "Не бей меня, брат!", + "Убей их, брат.", + "Почему бы не съесть пончик?" + ) icon_state = "sec_off" panel_overlay = "sec_panel" @@ -1833,8 +2108,24 @@ /obj/machinery/vending/security/training name = "\improper SecTech Training" - desc = "A security training equipment vendor." - ads_list = list("Соблюдай чистоту на стрельбище!","Даже я стреляю лучше тебя!","Почему так косо, бухой что ли?!","Техника безопасности нам не писана, да?","1 из 10 попаданий... А ты хорош!","Инструктор это твой папочка!","Эй, ты куда целишься?!") + ru_names = list( + NOMINATIVE = "торговый автомат SecTech Training", + GENITIVE = "торгового автомата SecTech Training", + DATIVE = "торговому автомату SecTech Training", + ACCUSATIVE = "торговый автомат SecTech Training", + INSTRUMENTAL = "торговым автоматом SecTech Training", + PREPOSITIONAL = "торговом автомате SecTech Training" + ) + desc = "Раздатчик тренировочного снаряжения службы безопасности." + ads_list = list( + "Соблюдай чистоту на стрельбище!", + "Даже я стреляю лучше тебя!", + "Почему так косо, бухой что ли?!", + "Техника безопасности нам не писана, да?", + "1 из 10 попаданий... А ты хорош!", + "Инструктор – это твой папочка!", + "Эй, ты куда целишься?!" + ) icon_state = "sectraining_off" panel_overlay = "sec_panel" @@ -1880,15 +2171,33 @@ /obj/item/security_voucher name = "security voucher" - desc = "A token to redeem a weapon kit. Use it on a SecTech." + desc = "Жетон, позволяющий получить набор оружия. Используйте его на SecTech." icon_state = "security_voucher" w_class = WEIGHT_CLASS_SMALL /obj/machinery/vending/hydronutrients name = "\improper NutriMax" - desc = "A plant nutrients vendor" - slogan_list = list("Вам не надо удобрять почву естественным путём — разве это не чудесно?","Теперь на 50% меньше вони!","Растения тоже люди!") - ads_list = list("Мы любим растения!","Может сами примете?","Самые зелёные кнопки на свете.","Мы любим большие растения.","Мягкая почва…") + ru_names = list( + NOMINATIVE = "торговый автомат NutriMax", + GENITIVE = "торгового автомата NutriMax", + DATIVE = "торговому автомату NutriMax", + ACCUSATIVE = "торговый автомат NutriMax", + INSTRUMENTAL = "торговым автоматом NutriMax", + PREPOSITIONAL = "торговом автомате NutriMax" + ) + desc = "Поставщик питательных веществ для растений." + slogan_list = list( + "Вам не надо удобрять почву естественным путём — разве это не чудесно?", + "Теперь на 50% меньше вони!", + "Растения тоже люди!" + ) + ads_list = list( + "Мы любим растения!", + "Может сами примете?", + "Самые зелёные кнопки на свете.", + "Мы любим большие растения.", + "Мягкая почва…" + ) icon_state = "nutri_off" panel_overlay = "nutri_panel" @@ -1905,9 +2214,26 @@ /obj/machinery/vending/hydroseeds name = "\improper MegaSeed Servitor" - desc = "When you need seeds fast!" - slogan_list = list("THIS'S WHERE TH' SEEDS LIVE! GIT YOU SOME!","Hands down the best seed selection on the station!","Also certain mushroom varieties available, more for experts! Get certified today!") - ads_list = list("Мы любим растения!","Вырасти урожай!","Расти, малыш, расти-и-и-и!","Ды-а, сына!") + ru_names = list( + NOMINATIVE = "торговый автомат MegaSeed Servitor", + GENITIVE = "торгового автомата MegaSeed Servitor", + DATIVE = "торговому автомату MegaSeed Servitor", + ACCUSATIVE = "торговый автомат MegaSeed Servitor", + INSTRUMENTAL = "торговым автоматом MegaSeed Servitor", + PREPOSITIONAL = "торговом автомате MegaSeed Servitor" + ) + desc = "Когда вам срочно нужны семена!" + slogan_list = list( + "ВОТ ГДЕ ЖИВУТ СЕМЕНА! ВОЗЬМИ СЕБЕ НЕМНОГО!", + "Без сомнений, лучший выбор семян на станции!", + "Кроме того, некоторые виды грибов доступны исключительно для экспертов! Получите сертификат уже сегодня!" + ) + ads_list = list( + "Мы любим растения!", + "Вырасти урожай!", + "Расти, малыш, расти-и-и-и!", + "Ды-а, сына!" + ) icon_state = "seeds_off" panel_overlay = "seeds_panel" @@ -1987,7 +2313,15 @@ /obj/machinery/vending/magivend name = "\improper MagiVend" - desc = "A magic vending machine." + ru_names = list( + NOMINATIVE = "торговый автомат MagiVend", + GENITIVE = "торгового автомата MagiVend", + DATIVE = "торговому автомату MagiVend", + ACCUSATIVE = "торговый автомат MagiVend", + INSTRUMENTAL = "торговым автоматом MagiVend", + PREPOSITIONAL = "торговом автомате MagiVend" + ) + desc = "Волшебный торговый автомат." icon_state = "magivend_off" panel_overlay = "magivend_panel" @@ -1996,10 +2330,24 @@ broken_overlay = "magivend_broken" broken_lightmask_overlay = "magivend_broken_lightmask" - slogan_list = list("Sling spells the proper way with MagiVend!","Be your own Houdini! Use MagiVend!") + slogan_list = list( + "MagiVend превращает произношение заклинаний в сущий пустяк!", + "Стань сам себе Гудини! Используй MagiVend!" + ) vend_delay = 15 - vend_reply = "Have an enchanted evening!" - ads_list = list("FJKLFJSD","AJKFLBJAKL","1234 LOONIES LOL!",">MFW","Kill them fuckers!","GET DAT FUKKEN DISK","HONK!","EI NATH","Destroy the station!","Admin conspiracies since forever!","Space-time bending hardware!") + vend_reply = "Желаю вам чудесного вечера!" + ads_list = list( + "FJKLFJSD","AJKFLBJAKL", + "1234 LOONIES LOL!", + ">MFW", + "Kill them fuckers!", + "GET DAT FUKKEN DISK", + "HONK!", + "EI NATH", + "Разнесите станцию!", + "Админские заговоры стары как само время!", + "Оборудование для изгиба пространства-времени!" + ) products = list(/obj/item/clothing/head/wizard = 5, /obj/item/clothing/suit/wizrobe = 5, /obj/item/clothing/head/wizard/red = 5, @@ -2033,7 +2381,15 @@ /obj/machinery/vending/autodrobe name = "\improper AutoDrobe" - desc = "A vending machine for costumes." + ru_names = list( + NOMINATIVE = "торговый автомат AutoDrobe", + GENITIVE = "торгового автомата AutoDrobe", + DATIVE = "торговому автомату AutoDrobe", + ACCUSATIVE = "торговый автомат AutoDrobe", + INSTRUMENTAL = "торговым автоматом AutoDrobe", + PREPOSITIONAL = "торговом автомате AutoDrobe" + ) + desc = "Автомат с бесплатными костюмами!" icon_state = "theater_off" panel_overlay = "theater_panel" @@ -2043,9 +2399,14 @@ broken_lightmask_overlay = "theater_broken_lightmask" deny_overlay = "theater_deny" - slogan_list = list("Dress for success!","Suited and booted!","It's show time!","Why leave style up to fate? Use AutoDrobe!") + slogan_list = list( + "Приоденься для Успеха!", + "Одетый и обутый!", + "Пришло время шоу!", + "Зачем оставлять стиль на произвол судьбы? Используй AutoDrobe!" + ) vend_delay = 15 - vend_reply = "Thank you for using AutoDrobe!" + vend_reply = "Спасибо за использование AutoDrobe!" products = list(/obj/item/clothing/suit/chickensuit = 1, /obj/item/clothing/head/chicken = 1, /obj/item/clothing/under/gladiator = 1, @@ -2194,8 +2555,24 @@ /obj/machinery/vending/dinnerware name = "\improper Plasteel Chef's Dinnerware Vendor" - desc = "A kitchen and restaurant equipment vendor." - ads_list = list("Mm, food stuffs!","Food and food accessories.","Get your plates!","You like forks?","I like forks.","Woo, utensils.","You don't really need these...") + ru_names = list( + NOMINATIVE = "торговый автомат Plasteel Chef's Dinnerware Vendor", + GENITIVE = "торгового автомата Plasteel Chef's Dinnerware Vendor", + DATIVE = "торговому автомату Plasteel Chef's Dinnerware Vendor", + ACCUSATIVE = "торговый автомат Plasteel Chef's Dinnerware Vendor", + INSTRUMENTAL = "торговым автоматом Plasteel Chef's Dinnerware Vendor", + PREPOSITIONAL = "торговом автомате Plasteel Chef's Dinnerware Vendor" + ) + desc = "Поставщик кухонного и ресторанного оборудования." + ads_list = list( + "Мм, продукты питания!", + "Пища и пищевые принадлежности.", + "Принесите свои тарелки!", + "Тебе нравятся вилки?", + "Я люблю вилки.", + "Ух ты, посуда.", + "На самом деле они тебе не нужны..." + ) icon_state = "dinnerware_off" panel_overlay = "dinnerware_panel" @@ -2239,7 +2616,15 @@ /obj/machinery/vending/sovietsoda name = "\improper BODA" - desc = "Old sweet water vending machine." + ru_names = list( + NOMINATIVE = "торговый автомат BODA", + GENITIVE = "торгового автомата BODA", + DATIVE = "торговому автомату BODA", + ACCUSATIVE = "торговый автомат BODA", + INSTRUMENTAL = "торговым автоматом BODA", + PREPOSITIONAL = "торговом автомате BODA" + ) + desc = "Старый автомат по продаже сладкой газировки." icon_state = "sovietsoda_off" panel_overlay = "sovietsoda_panel" @@ -2248,7 +2633,13 @@ broken_overlay = "sovietsoda_broken" broken_lightmask_overlay = "sovietsoda_broken_lightmask" - ads_list = list("For Tsar and Country.","Have you fulfilled your nutrition quota today?","Very nice!","We are simple people, for this is all we eat.","If there is a person, there is a problem. If there is no person, then there is no problem.") + ads_list = list( + "За царя и Отечество.", + "Ты уже осуществил свою норму питания на сегодня?", + "Очень хорошо!", + "Мы обычные люди, и едим мы то, что есть.", + "Если есть человек, то есть и проблема. Если нет человека, то нет и проблемы." + ) products = list(/obj/item/reagent_containers/food/drinks/drinkingglass/soda = 30) contraband = list(/obj/item/reagent_containers/food/drinks/drinkingglass/cola = 20) resistance_flags = FIRE_PROOF @@ -2256,7 +2647,15 @@ /obj/machinery/vending/tool name = "\improper YouTool" - desc = "Tools for tools." + ru_names = list( + NOMINATIVE = "торговый автомат YouTool", + GENITIVE = "торгового автомата YouTool", + DATIVE = "торговому автомату YouTool", + ACCUSATIVE = "торговый автомат YouTool", + INSTRUMENTAL = "торговым автоматом YouTool", + PREPOSITIONAL = "торговом автомате YouTool" + ) + desc = "Инструменты для инструментов." icon_state = "tool_off" panel_overlay = "tool_panel" @@ -2297,7 +2696,15 @@ /obj/machinery/vending/engivend name = "\improper Engi-Vend" - desc = "Spare tool vending. What? Did you expect some witty description?" + ru_names = list( + NOMINATIVE = "торговый автомат Engi-Vend", + GENITIVE = "торгового автомата Engi-Vend", + DATIVE = "торговому автомату Engi-Vend", + ACCUSATIVE = "торговый автомат Engi-Vend", + INSTRUMENTAL = "торговым автоматом Engi-Vend", + PREPOSITIONAL = "торговом автомате Engi-Vend" + ) + desc = "Автомат с запасными инструментами. Что? Вы ожидали какого-нибудь остроумного описания?" icon_state = "engivend_off" panel_overlay = "engivend_panel" @@ -2315,7 +2722,15 @@ /obj/machinery/vending/engineering name = "\improper Robco Tool Maker" - desc = "Everything you need for do-it-yourself station repair." + ru_names = list( + NOMINATIVE = "торговый автомат Robco Tool Maker", + GENITIVE = "торгового автомата Robco Tool Maker", + DATIVE = "торговому автомату Robco Tool Maker", + ACCUSATIVE = "торговый автомат Robco Tool Maker", + INSTRUMENTAL = "торговым автоматом Robco Tool Maker", + PREPOSITIONAL = "торговом автомате Robco Tool Maker" + ) + desc = "Все, что вам требуется для самостоятельного обслуживания станции." icon_state = "engi_off" panel_overlay = "engi_panel" @@ -2337,7 +2752,15 @@ /obj/machinery/vending/robotics name = "\improper Robotech Deluxe" - desc = "All the tools you need to create your own robot army." + ru_names = list( + NOMINATIVE = "торговый автомат Robotech Deluxe", + GENITIVE = "торгового автомата Robotech Deluxe", + DATIVE = "торговому автомату Robotech Deluxe", + ACCUSATIVE = "торговый автомат Robotech Deluxe", + INSTRUMENTAL = "торговым автоматом Robotech Deluxe", + PREPOSITIONAL = "торговом автомате Robotech Deluxe" + ) + desc = "Все, что вам нужно для создания вашей собственной армии роботов." icon_state = "robotics_off" panel_overlay = "robotics_panel" @@ -2375,9 +2798,31 @@ /obj/machinery/vending/sustenance name = "\improper Sustenance Vendor" - desc = "A vending machine which vends food, as required by section 47-C of the NT's Prisoner Ethical Treatment Agreement." - slogan_list = list("Enjoy your meal.","Enough calories to support strenuous labor.") - ads_list = list("The healthiest!","Award-winning chocolate bars!","Mmm! So good!","Oh my god it's so juicy!","Have a snack.","Snacks are good for you!","Have some more Getmore!","Best quality snacks straight from mars.","We love chocolate!","Try our new jerky!") + ru_names = list( + NOMINATIVE = "торговый автомат Sustenance Vendor", + GENITIVE = "торгового автомата Sustenance Vendor", + DATIVE = "торговому автомату Sustenance Vendor", + ACCUSATIVE = "торговый автомат Sustenance Vendor", + INSTRUMENTAL = "торговым автоматом Sustenance Vendor", + PREPOSITIONAL = "торговом автомате Sustenance Vendor" + ) + desc = "Торговый автомат, в котором продаются продукты питания, в соответствии с разделом 47-С Соглашения об этическом обращении с заключёнными в NT." + slogan_list = list( + "Приятного аппетита!", + "Достаточное количество калорий для интенсивной работы." + ) + ads_list = list( + "Самый здоровый!", + "Отмеченные наградами шоколадные батончики!", + "Ммм! Так вкусно!", + "О боже, это так вкусно!", + "Перекусите.", + "Закуски - это здорово!", + "Возьми немного, и еще немного!", + "Закуски высшего качества прямо с Марса.", + "Мы любим шоколад!", + "Попробуйте наше новое вяленое мясо!" + ) icon_state = "sustenance_off" panel_overlay = "snack_panel" @@ -2397,7 +2842,7 @@ refill_canister = /obj/item/vending_refill/sustenance /obj/machinery/vending/sustenance/additional - desc = "Какого этот автомат тут оказался?!" + desc = "Какого чёрта этот автомат тут оказался?!" products = list(/obj/item/reagent_containers/food/snacks/tofu = 12, /obj/item/reagent_containers/food/drinks/ice = 6, /obj/item/reagent_containers/food/snacks/candy/candy_corn = 6) @@ -2405,7 +2850,15 @@ /obj/machinery/vending/hatdispenser name = "\improper Hatlord 9000" - desc = "It doesn't seem the slightest bit unusual. This frustrates you immensely." + ru_names = list( + NOMINATIVE = "торговый автомат Hatlord 9000", + GENITIVE = "торгового автомата Hatlord 9000", + DATIVE = "торговому автомату Hatlord 9000", + ACCUSATIVE = "торговый автомат Hatlord 9000", + INSTRUMENTAL = "торговым автоматом Hatlord 9000", + PREPOSITIONAL = "торговом автомате Hatlord 9000" + ) + desc = "В этом нет ничего необычного. Это вас очень расстраивает." icon_state = "hats_off" panel_overlay = "hats_panel" @@ -2414,7 +2867,12 @@ broken_overlay = "hats_broken" broken_lightmask_overlay = "hats_broken_lightmask" - ads_list = list("Warning, not all hats are dog/monkey compatible. Apply forcefully with care.","Apply directly to the forehead.","Who doesn't love spending cash on hats?!","From the people that brought you collectable hat crates, Hatlord!") + ads_list = list( + "Внимание: не все шляпы совместимы с собаками и обезьянами. Надевайте с усилием, но осторожно.", + "Надевайте прямо на голову.", + "Кто не любит тратить деньги на шляпы?!", + "От создателей коробок с коллекционными шляпами — Hatlord!" + ) products = list(/obj/item/clothing/head/bowlerhat = 10, /obj/item/clothing/head/beaverhat = 10, /obj/item/clothing/head/boaterhat = 10, @@ -2428,7 +2886,15 @@ /obj/machinery/vending/suitdispenser name = "\improper Suitlord 9000" - desc = "You wonder for a moment why all of your shirts and pants come conjoined. This hurts your head and you stop thinking about it." + ru_names = list( + NOMINATIVE = "торговый автомат Suitlord 9000", + GENITIVE = "торгового автомата Suitlord 9000", + DATIVE = "торговому автомату Suitlord 9000", + ACCUSATIVE = "торговый автомат Suitlord 9000", + INSTRUMENTAL = "торговым автоматом Suitlord 9000", + PREPOSITIONAL = "торговом автомате Suitlord 9000" + ) + desc = "На мгновение ты задумываешься, почему все твои рубашки и брюки сшиты вместе. От этого у тебя начинает болеть голова, и ты перестаешь об этом думать." icon_state = "suits_off" panel_overlay = "suits_panel" @@ -2437,7 +2903,13 @@ broken_overlay = "suits_broken" broken_lightmask_overlay = "suits_broken_lightmask" - ads_list = list("Pre-Ironed, Pre-Washed, Pre-Wor-*BZZT*","Blood of your enemies washes right out!","Who are YOU wearing?","Look dapper! Look like an idiot!","Dont carry your size? How about you shave off some pounds you fat lazy- *BZZT*") + ads_list = list( + "Предварительно проглаженный, предварительно стиранный, предво-*БЗЗЗ*", + "Кровь твоих врагов сразу же смоется!", + "Что ВЫ носите?", + "Выгляди элегантно! Выгляди как идиот!", + "Не подходит по размеру? А как насчёт того, чтобы сбросить пару килограммов, ты, жирный лентяй-*БЗЗЗЗ*" + ) products = list( /obj/item/clothing/under/color/black = 10, /obj/item/clothing/under/color/blue = 10, @@ -2466,7 +2938,15 @@ /obj/machinery/vending/shoedispenser name = "\improper Shoelord 9000" - desc = "Wow, hatlord looked fancy, suitlord looked streamlined, and this is just normal. The guy who designed these must be an idiot." + ru_names = list( + NOMINATIVE = "торговый автомат Shoelord 9000", + GENITIVE = "торгового автомата Shoelord 9000", + DATIVE = "торговому автомату Shoelord 9000", + ACCUSATIVE = "торговый автомат Shoelord 9000", + INSTRUMENTAL = "торговым автоматом Shoelord 9000", + PREPOSITIONAL = "торговом автомате Shoelord 9000" + ) + desc = "Оу, шляпы у Hatlord такие классные, костюмы у Suitlord такие элегантные, а у этого всё такое обычное... Дизайнер, должно быть, идиот." icon_state = "shoes_off" icon_state = "shoes_off" @@ -2476,7 +2956,13 @@ broken_overlay = "shoes_broken" broken_lightmask_overlay = "shoes_broken_lightmask" - ads_list = list("Put your foot down!","One size fits all!","IM WALKING ON SUNSHINE!","No hobbits allowed.","NO PLEASE WILLY, DONT HURT ME- *BZZT*") + ads_list = list( + "Опусти ногу!", + "Один размер подходит всем!", + "Я ШАГАЮ В ЛУЧАХ СОЛНЦА!", + "Хоббитам вход воспрещен.", + "НЕТ, ПОЖАЛУЙСТА, ВИЛЛИ, НЕ ДЕЛАЙ МНЕ БОЛЬНО-*БЗЗЗЗ*" + ) products = list(/obj/item/clothing/shoes/black = 10,/obj/item/clothing/shoes/brown = 10,/obj/item/clothing/shoes/blue = 10,/obj/item/clothing/shoes/green = 10,/obj/item/clothing/shoes/yellow = 10,/obj/item/clothing/shoes/purple = 10,/obj/item/clothing/shoes/red = 10,/obj/item/clothing/shoes/white = 10,/obj/item/clothing/shoes/sandal=10) contraband = list(/obj/item/clothing/shoes/orange = 5) premium = list(/obj/item/clothing/shoes/rainbow = 1) @@ -2484,9 +2970,30 @@ /obj/machinery/vending/syndicigs name = "\improper Suspicious Cigarette Machine" - desc = "Smoke 'em if you've got 'em." - slogan_list = list("Космосигареты на вкус хороши, какими они и должны быть.","I'd rather toolbox than switch.","Затянитесь!","Не верьте исследованиям — курите сегодня!") - ads_list = list("Наверняка не очень-то и вредно для Вас!","Не верьте учёным!","На здоровье!","Не бросайте курить, купите ещё!","Затянитесь!","Никотиновый рай.","Лучшие сигареты с 2150 года.","Сигареты с множеством наград.") + ru_names = list( + NOMINATIVE = "торговый автомат Suspicious Cigarette Machine", + GENITIVE = "торгового автомата Suspicious Cigarette Machine", + DATIVE = "торговому автомату Suspicious Cigarette Machine", + ACCUSATIVE = "торговый автомат Suspicious Cigarette Machine", + INSTRUMENTAL = "торговым автоматом Suspicious Cigarette Machine", + PREPOSITIONAL = "торговом автомате Suspicious Cigarette Machine" + ) + desc = "Кури, раз уж взял." + slogan_list = list( + "Космосигареты на вкус хороши, какими они и должны быть.", + "Затянитесь!", + "Не верьте исследованиям — курите сегодня!" + ) + ads_list = list( + "Наверняка не очень-то и вредно для Вас!", + "Не верьте учёным!", + "На здоровье!", + "Не бросайте курить, купите ещё!", + "Затянитесь!", + "Никотиновый рай.", + "Лучшие сигареты с 2150 года.", + "Сигареты с множеством наград." + ) vend_delay = 34 icon_state = "cigs_off" @@ -2501,9 +3008,31 @@ /obj/machinery/vending/syndisnack name = "\improper Getmore Chocolate Corp" - desc = "A modified snack machine courtesy of the Getmore Chocolate Corporation, based out of Mars" - slogan_list = list("Try our new nougat bar!","Twice the calories for half the price!") - ads_list = list("The healthiest!","Award-winning chocolate bars!","Mmm! So good!","Oh my god it's so juicy!","Have a snack.","Snacks are good for you!","Have some more Getmore!","Best quality snacks straight from mars.","We love chocolate!","Try our new jerky!") + ru_names = list( + NOMINATIVE = "торговый автомат Getmore Chocolate Corp", + GENITIVE = "торгового автомата Getmore Chocolate Corp", + DATIVE = "торговому автомату Getmore Chocolate Corp", + ACCUSATIVE = "торговый автомат Getmore Chocolate Corp", + INSTRUMENTAL = "торговым автоматом Getmore Chocolate Corp", + PREPOSITIONAL = "торговом автомате Getmore Chocolate Corp" + ) + desc = "Модифицированный автомат самообслуживания, любезно предоставленный шоколадной корпорацией Getmore, базирующейся на Марсе." + slogan_list = list( + "Попробуйте наш новый батончик с нугой!", + "Вдвое больше калорий за полцены!" + ) + ads_list = list( + "Самый здоровый!", + "Отмеченные наградами шоколадные батончики!", + "Ммм! Так вкусно!", + "О боже, это так вкусно!", + "Перекусите.", + "Закуски - это здорово!", + "Возьми немного, и еще немного!", + "Закуски высшего качества прямо с Марса.", + "Мы любим шоколад!", + "Попробуйте наше новое вяленое мясо!" + ) icon_state = "snack_off" panel_overlay = "snack_panel" @@ -2517,8 +3046,20 @@ /obj/machinery/vending/syndierobotics name = "Синди Робо-ДеЛюкс!" + ru_names = list( + NOMINATIVE = "торговый автомат Синди Робо-ДеЛюкс", + GENITIVE = "торгового автомата Синди Робо-ДеЛюкс", + DATIVE = "торговому автомату Синди Робо-ДеЛюкс", + ACCUSATIVE = "торговый автомат Синди Робо-ДеЛюкс", + INSTRUMENTAL = "торговым автоматом Синди Робо-ДеЛюкс", + PREPOSITIONAL = "торговом автомате Синди Робо-ДеЛюкс" + ) desc = "Всё что нужно, чтобы сделать личного железного друга из ваших врагов!" - ads_list = list("Make them beep-boop like a robot should!","Robotisation is NOT a crime!","Nyoom!") + ads_list = list( + "Заставьте их пищать и гудеть, как и подобает роботу!", + "Роботизация — это НЕ преступление!", + "Ньям!" + ) icon_state = "robotics_off" panel_overlay = "robotics_panel" @@ -2547,7 +3088,15 @@ //don't forget to change the refill size if you change the machine's contents! /obj/machinery/vending/clothing name = "\improper ClothesMate" //renamed to make the slogan rhyme - desc = "A vending machine for clothing." + ru_names = list( + NOMINATIVE = "торговый автомат ClothesMate", + GENITIVE = "торгового автомата ClothesMate", + DATIVE = "торговому автомату ClothesMate", + ACCUSATIVE = "торговый автомат ClothesMate", + INSTRUMENTAL = "торговым автоматом ClothesMate", + PREPOSITIONAL = "торговом автомате ClothesMate" + ) + desc = "Автомат с бесплатной одеждой." icon_state = "clothes_off" panel_overlay = "clothes_panel" @@ -2556,9 +3105,14 @@ broken_overlay = "clothes_broken" broken_lightmask_overlay = "clothes_broken_lightmask" - slogan_list = list("Dress for success!","Prepare to look swagalicious!","Look at all this free swag!","Why leave style up to fate? Use the ClothesMate!") + slogan_list = list( + "Приоденься для Успеха!", + "Приготовьтесь выглядеть потрясающе!", + "Посмотрите на все эти классные вещи бесплатно!", + "Зачем оставлять стиль на произвол судьбы? Используй ClothesMate!" + ) vend_delay = 15 - vend_reply = "Thank you for using the ClothesMate!" + vend_reply = "Спасибо за использование ClothesMate!" products = list(/obj/item/clothing/head/that = 2, /obj/item/clothing/head/fedora = 1, /obj/item/clothing/glasses/monocle = 1, @@ -2655,9 +3209,27 @@ /obj/machinery/vending/artvend name = "\improper ArtVend" - desc = "A vending machine for art supplies." - slogan_list = list("Stop by for all your artistic needs!","Color the floors with crayons, not blood!","Don't be a starving artist, use ArtVend. ","Don't fart, do art!") - ads_list = list("Just like Kindergarten!","Now with 1000% more vibrant colors!","Screwing with the janitor was never so easy!","Creativity is at the heart of every spessman.") + ru_names = list( + NOMINATIVE = "торговый автомат ArtVend", + GENITIVE = "торгового автомата ArtVend", + DATIVE = "торговому автомату ArtVend", + ACCUSATIVE = "торговый автомат ArtVend", + INSTRUMENTAL = "торговым автоматом ArtVend", + PREPOSITIONAL = "торговом автомате ArtVend" + ) + desc = "Торговый автомат для всех ваших художественных нужд." + slogan_list = list( + "Забирайте свои прикольные вещички!" + ,"Раскрасьте пол цветными карандашами, а не кровью!", + "Не будь голодающим творцом, используй ArtVend.", + "Не сри, твори!" + ) + ads_list = list( + "Прямо как в детском саду!", + "Теперь на 1000% больше ярких цветов!", + "Поиметь уборщика еще никогда не было так просто!", + "Креативность лежит в основе каждого специалиста!" + ) vend_delay = 15 icon_state = "artvend_off" @@ -2715,9 +3287,30 @@ /obj/machinery/vending/crittercare name = "\improper CritterCare" - desc = "A vending machine for pet supplies." - slogan_list = list("Stop by for all your animal's needs!","Cuddly pets deserve a stylish collar!","Pets in space, what could be more adorable?","Freshest fish eggs in the system!","Rocks are the perfect pet, buy one today!") - ads_list = list("House-training costs extra!","Now with 1000% more cat hair!","Allergies are a sign of weakness!","Dogs are man's best friend. Remember that Vulpkanin!"," Heat lamps for Unathi!"," Vox-y want a cracker?") + ru_names = list( + NOMINATIVE = "торговый автомат CritterCare", + GENITIVE = "торгового автомата CritterCare", + DATIVE = "торговому автомату CritterCare", + ACCUSATIVE = "торговый автомат CritterCare", + INSTRUMENTAL = "торговым автоматом CritterCare", + PREPOSITIONAL = "торговом автомате CritterCare" + ) + desc = "Торговый автомат по продаже зоотоваров." + slogan_list = list( + "Здесь всё, чтобы ваш питомец был всем доволен!", + "Крутые питомцы заслуживают крутой ошейник!", + "Домашние животные в космосе - что может быть очаровательнее?", + "Самая свежая икра в системе!", + "Камни - лучшие питомцы, купите себе их уже сегодня!" + ) + ads_list = list( + "Дрессировка на дому оплачивается дополнительно!", + "Теперь на 1000% больше кошачьей шерсти!", + "Аллергия - признак слабости!", + "Собаки - лучшие друзья человека. Помни об этом, вульпа!", + "Нагревательные лампы для Унатхов!", + "Вокс хочет крекер?" + ) vend_delay = 15 icon_state = "crittercare_off" @@ -2776,6 +3369,14 @@ /obj/machinery/vending/clothing/departament name = "\improper Broken Departament ClothesMate" + ru_names = list( + NOMINATIVE = "торговый автомат Broken Departament ClothesMate", + GENITIVE = "торгового автомата Broken Departament ClothesMate", + DATIVE = "торговому автомату Broken Departament ClothesMate", + ACCUSATIVE = "торговый автомат Broken Departament ClothesMate", + INSTRUMENTAL = "торговым автоматом Broken Departament ClothesMate", + PREPOSITIONAL = "торговом автомате Broken Departament ClothesMate" + ) desc = "Автомат-помощник по выдаче одежды отдела." slogan_list = list( "Одежда успешного работника!", "Похвала на глаза!", "Ну наконец-то нормально оделся!", @@ -2798,6 +3399,14 @@ /obj/machinery/vending/clothing/departament/security name = "\improper Departament Security ClothesMate" + ru_names = list( + NOMINATIVE = "торговый автомат Departament Security ClothesMate", + GENITIVE = "торгового автомата Departament Security ClothesMate", + DATIVE = "торговому автомату Departament Security ClothesMate", + ACCUSATIVE = "торговый автомат Departament Security ClothesMate", + INSTRUMENTAL = "торговым автоматом Departament Security ClothesMate", + PREPOSITIONAL = "торговом автомате Departament Security ClothesMate" + ) desc = "Автомат-помощник по выдаче одежды Отдела Службы Безопасности." icon_state = "clothes-dep-sec_off" @@ -2877,6 +3486,14 @@ /obj/machinery/vending/clothing/departament/medical name = "\improper Departament Medical ClothesMate" + ru_names = list( + NOMINATIVE = "торговый автомат Departament Medical ClothesMate", + GENITIVE = "торгового автомата Departament Medical ClothesMate", + DATIVE = "торговому автомату Departament Medical ClothesMate", + ACCUSATIVE = "торговый автомат Departament Medical ClothesMate", + INSTRUMENTAL = "торговым автоматом Departament Medical ClothesMate", + PREPOSITIONAL = "торговом автомате Departament Medical ClothesMate" + ) desc = "Автомат-помощник по выдаче одежды Медицинского Отдела." icon_state = "clothes-dep-med_off" @@ -2977,6 +3594,14 @@ /obj/machinery/vending/clothing/departament/engineering name = "\improper Departament Engineering ClothesMate" + ru_names = list( + NOMINATIVE = "торговый автомат Departament Engineering ClothesMat", + GENITIVE = "торгового автомата Departament Engineering ClothesMat", + DATIVE = "торговому автомату Departament Engineering ClothesMat", + ACCUSATIVE = "торговый автомат Departament Engineering ClothesMat", + INSTRUMENTAL = "торговым автоматом Departament Engineering ClothesMat", + PREPOSITIONAL = "торговом автомате Departament Engineering ClothesMat" + ) desc = "Автомат-помощник по выдаче одежды Инженерного Отдела." icon_state = "clothes-dep-eng_off" @@ -3036,6 +3661,14 @@ /obj/machinery/vending/clothing/departament/science name = "\improper Departament Science ClothesMate" + ru_names = list( + NOMINATIVE = "торговый автомат Departament Science ClothesMate", + GENITIVE = "торгового автомата Departament Science ClothesMate", + DATIVE = "торговому автомату Departament Science ClothesMate", + ACCUSATIVE = "торговый автомат Departament Science ClothesMate", + INSTRUMENTAL = "торговым автоматом Departament Science ClothesMate", + PREPOSITIONAL = "торговом автомате Departament Science ClothesMate" + ) desc = "Автомат-помощник по выдаче одежды Научного Отдела." icon_state = "clothes-dep-sci_off" @@ -3091,6 +3724,14 @@ /obj/machinery/vending/clothing/departament/cargo name = "\improper Departament Cargo ClothesMate" + ru_names = list( + NOMINATIVE = "торговый автомат Departament Cargo ClothesMate", + GENITIVE = "торгового автомата Departament Cargo ClothesMate", + DATIVE = "торговому автомату Departament Cargo ClothesMate", + ACCUSATIVE = "торговый автомат Departament Cargo ClothesMate", + INSTRUMENTAL = "торговым автоматом Departament Cargo ClothesMate", + PREPOSITIONAL = "торговом автомате Departament Cargo ClothesMate" + ) desc = "Автомат-помощник по выдаче одежды Отдела Поставок." icon_state = "clothes-dep-car_off" @@ -3149,6 +3790,14 @@ /obj/machinery/vending/clothing/departament/law name = "\improper Departament Law ClothesMate" + ru_names = list( + NOMINATIVE = "торговый автомат Departament Law ClothesMate", + GENITIVE = "торгового автомата Departament Law ClothesMate", + DATIVE = "торговому автомату Departament Law ClothesMate", + ACCUSATIVE = "торговый автомат Departament Law ClothesMate", + INSTRUMENTAL = "торговым автоматом Departament Law ClothesMate", + PREPOSITIONAL = "торговом автомате Departament Law ClothesMate" + ) desc = "Автомат-помощник по выдаче одежды Юридического Отдела." icon_state = "clothes-dep-sec_off" @@ -3208,6 +3857,14 @@ /obj/machinery/vending/clothing/departament/service name = "\improper Departament Service ClothesMate" + ru_names = list( + NOMINATIVE = "торговый автомат Departament Service ClothesMate", + GENITIVE = "торгового автомата Departament Service ClothesMate", + DATIVE = "торговому автомату Departament Service ClothesMate", + ACCUSATIVE = "торговый автомат Departament Service ClothesMate", + INSTRUMENTAL = "торговым автоматом Departament Service ClothesMate", + PREPOSITIONAL = "торговом автомате Departament Service ClothesMate" + ) desc = "Автомат-помощник по выдаче одежды Сервисного отдела." req_access = list() products = list() @@ -3215,6 +3872,14 @@ /obj/machinery/vending/clothing/departament/service/chaplain name = "\improper Departament Service ClothesMate Chaplain" + ru_names = list( + NOMINATIVE = "торговый автомат Departament Service ClothesMate Chaplain", + GENITIVE = "торгового автомата Departament Service ClothesMate Chaplain", + DATIVE = "торговому автомату Departament Service ClothesMate Chaplain", + ACCUSATIVE = "торговый автомат Departament Service ClothesMate Chaplain", + INSTRUMENTAL = "торговым автоматом Departament Service ClothesMate Chaplain", + PREPOSITIONAL = "торговом автомате Departament Service ClothesMate Chaplain" + ) desc = "Автомат-помощник по выдаче одежды Сервисного отдела церкви." icon_state = "clothes-dep-car_off" @@ -3252,6 +3917,14 @@ /obj/machinery/vending/clothing/departament/service/botanical name = "\improper Departament Service ClothesMate Botanical" + ru_names = list( + NOMINATIVE = "торговый автомат Departament Service ClothesMate Botanical", + GENITIVE = "торгового автомата Departament Service ClothesMate Botanical", + DATIVE = "торговому автомату Departament Service ClothesMate Botanical", + ACCUSATIVE = "торговый автомат Departament Service ClothesMate Botanical", + INSTRUMENTAL = "торговым автоматом Departament Service ClothesMate Botanical", + PREPOSITIONAL = "торговом автомате Departament Service ClothesMate Botanical" + ) desc = "Автомат-помощник по выдаче одежды Сервисного отдела ботаники." req_access = list(ACCESS_HYDROPONICS) products = list( @@ -3279,8 +3952,22 @@ /obj/machinery/vending/nta name = "NT Ammunition" - desc = "A special equipment vendor." - ads_list = list("Возьми патрон!","Не забывай, снаряжаться - полезно!","Бжж-Бзз-з!.","Обезопасить, Удержать, Сохранить!","Стоять, снярядись на задание!") + ru_names = list( + NOMINATIVE = "торговый автомат NT Ammunition", + GENITIVE = "торгового автомата NT Ammunition", + DATIVE = "торговому автомату NT Ammunition", + ACCUSATIVE = "торговый автомат NT Ammunition", + INSTRUMENTAL = "торговым автоматом NT Ammunition", + PREPOSITIONAL = "торговом автомате NT Ammunition" + ) + desc = "Автомат-помощник по выдаче специального снаряжения." + ads_list = list( + "Возьми патрон!", + "Не забывай, снаряжаться - полезно!", + "Бжж-Бзз-з!", + "Обезопасить, Удержать, Сохранить!", + "Стоять, снярядись на задание!" + ) icon_state = "nta_base" panel_overlay = "nta_panel" @@ -3358,8 +4045,22 @@ /obj/machinery/vending/nta/ertarmory/blue name = "NT ERT Medium Gear & Ammunition" - desc = "A ERT Medium equipment vendor." - ads_list = list("Круши черепа синдиката!","Не забывай, спасать - полезно!","Бжж-Бзз-з!.","Обезопасить, Удержать, Сохранить!","Стоять, снярядись на задание!") + ru_names = list( + NOMINATIVE = "торговый автомат NT ERT Medium Gear & Ammunition", + GENITIVE = "торгового автомата NT ERT Medium Gear & Ammunition", + DATIVE = "торговому автомату NT ERT Medium Gear & Ammunition", + ACCUSATIVE = "торговый автомат NT ERT Medium Gear & Ammunition", + INSTRUMENTAL = "торговым автоматом NT ERT Medium Gear & Ammunition", + PREPOSITIONAL = "торговом автомате NT ERT Medium Gear & Ammunition" + ) + desc = "Автомат-помощник по выдаче снаряжения среднего класса." + ads_list = list( + "Круши черепа синдиката!", + "Не забывай, спасать - полезно!", + "Бжж-Бзз-з!", + "Обезопасить, Удержать, Сохранить!", + "Стоять, снярядись на задание!" + ) icon_state = "nta_base" base_icon_state = "nta-blue" @@ -3386,8 +4087,22 @@ /obj/machinery/vending/nta/ertarmory/red name = "NT ERT Heavy Gear & Ammunition" - desc = "A ERT Heavy equipment vendor." - ads_list = list("Круши черепа синдиката!","Не забывай, спасать - полезно!","Бжж-Бзз-з!.","Обезопасить, Удержать, Сохранить!","Стоять, снярядись на задание!") + ru_names = list( + NOMINATIVE = "торговый автомат NT ERT Heavy Gear & Ammunition", + GENITIVE = "торгового автомата NT ERT Heavy Gear & Ammunition", + DATIVE = "торговому автомату NT ERT Heavy Gear & Ammunition", + ACCUSATIVE = "торговый автомат NT ERT Heavy Gear & Ammunition", + INSTRUMENTAL = "торговым автоматом NT ERT Heavy Gear & Ammunition", + PREPOSITIONAL = "торговом автомате NT ERT Heavy Gear & Ammunition" + ) + desc = "Автомат-помощник по выдаче снаряжения тяжелого класса." + ads_list = list( + "Круши черепа синдиката!", + "Не забывай, спасать - полезно!", + "Бжж-Бзз-з!", + "Обезопасить, Удержать, Сохранить!", + "Стоять, снярядись на задание!" + ) icon_state = "nta_base" base_icon_state = "nta-red" @@ -3414,8 +4129,22 @@ /obj/machinery/vending/nta/ertarmory/green name = "NT ERT Light Gear & Ammunition" - desc = "A ERT Light equipment vendor." - ads_list = list("Круши черепа синдиката!","Не забывай, спасать - полезно!","Бжж-Бзз-з!.","Обезопасить, Удержать, Сохранить!","Стоять, снярядись на задание!") + ru_names = list( + NOMINATIVE = "торговый автомат NT ERT Light Gear & Ammunition", + GENITIVE = "торгового автомата NT ERT Light Gear & Ammunition", + DATIVE = "торговому автомату NT ERT Light Gear & Ammunition", + ACCUSATIVE = "торговый автомат NT ERT Light Gear & Ammunition", + INSTRUMENTAL = "торговым автоматом NT ERT Light Gear & Ammunition", + PREPOSITIONAL = "торговом автомате NT ERT Light Gear & Ammunition" + ) + desc = "Автомат-помощник по выдаче снаряжения легкого класса" + ads_list = list( + "Круши черепа синдиката!", + "Не забывай, спасать - полезно!", + "Бжж-Бзз-з!", + "Обезопасить, Удержать, Сохранить!", + "Стоять, снярядись на задание!" + ) icon_state = "nta_base" base_icon_state = "nta-green" @@ -3446,7 +4175,15 @@ /obj/machinery/vending/nta/ertarmory/green/cc_jail name = "NT CentComm prison guards' Gear & Ammunition" - desc = "An equipment vendor for CentComm corrections officers." + ru_names = list( + NOMINATIVE = "торговый автомат NT CentComm prison guards' Gear & Ammunition", + GENITIVE = "торгового автомата NT CentComm prison guards' Gear & Ammunition", + DATIVE = "торговому автомату NT CentComm prison guards' Gear & Ammunition", + ACCUSATIVE = "торговый автомат NT CentComm prison guards' Gear & Ammunition", + INSTRUMENTAL = "торговым автоматом NT CentComm prison guards' Gear & Ammunition", + PREPOSITIONAL = "торговом автомате NT CentComm prison guards' Gear & Ammunition" + ) + desc = "Автомат с оборудованием для сотрудников CentComm." products = list(/obj/item/restraints/handcuffs=5, /obj/item/restraints/handcuffs/cable/zipties=5, /obj/item/grenade/flashbang=3, @@ -3466,8 +4203,22 @@ /obj/machinery/vending/nta/ertarmory/yellow name = "NT ERT Death Wish Gear & Ammunition" - desc = "A ERT Death Wish equipment vendor." - ads_list = list("Круши черепа ВСЕХ!","Не забывай, УБИВАТЬ - полезно!","УБИВАТЬ УБИВАТЬ УБИВАТЬ УБИВАТЬ!.","УБИВАТЬ, Удержать, УБИВАТЬ!","Стоять, снярядись на УБИВАТЬ!") + ru_names = list( + NOMINATIVE = "торговый автомат NT ERT Death Wish Gear & Ammunition", + GENITIVE = "торгового автомата NT ERT Death Wish Gear & Ammunition", + DATIVE = "торговому автомату NT ERT Death Wish Gear & Ammunition", + ACCUSATIVE = "торговый автомат NT ERT Death Wish Gear & Ammunition", + INSTRUMENTAL = "торговым автоматом NT ERT Death Wish Gear & Ammunition", + PREPOSITIONAL = "торговом автомате NT ERT Death Wish Gear & Ammunition" + ) + desc = "Автомат с оборудованием для ОБР — помогает людям осуществить их желание умереть." + ads_list = list( + "Круши черепа ВСЕХ!", + "Не забывай, УБИВАТЬ - полезно!", + "УБИВАТЬ УБИВАТЬ УБИВАТЬ УБИВАТЬ!.", + "УБИВАТЬ, Удержать, УБИВАТЬ!", + "Стоять, снярядись на УБИВАТЬ!" + ) icon_state = "nta_base" base_icon_state = "nta-yellow" @@ -3493,8 +4244,22 @@ /obj/machinery/vending/nta/ertarmory/medical name = "NT ERT Medical Gear" - desc = "A ERT medical equipment vendor." - ads_list = list("Лечи раненых от рук синдиката!","Не забывай, лечить - полезно!","Бжж-Бзз-з!.","Перевязать, Оперировать, Выписать!","Стоять, снярядись медикаментами на задание!") + ru_names = list( + NOMINATIVE = "торговый автомат NT ERT Medical Gear", + GENITIVE = "торгового автомата NT ERT Medical Gear", + DATIVE = "торговому автомату NT ERT Medical Gear", + ACCUSATIVE = "торговый автомат NT ERT Medical Gear", + INSTRUMENTAL = "торговым автоматом NT ERT Medical Gear", + PREPOSITIONAL = "торговом автомате NT ERT Medical Gear" + ) + desc = "Автомат с медицинским оборудованием ОБР." + ads_list = list( + "Лечи раненых от рук синдиката!", + "Не забывай, лечить - полезно!", + "Бжж-Бзз-з!", + "Перевязать, Оперировать, Выписать!", + "Стоять, снярядись медикаментами на задание!" + ) icon_state = "nta_base" base_icon_state = "nta-medical" @@ -3530,8 +4295,22 @@ /obj/machinery/vending/nta/ertarmory/engineer name = "NT ERT Engineer Gear" - desc = "A ERT engineering equipment vendor." - ads_list = list("Чини станцию от рук синдиката!","Не забывай, чинить - полезно!","Бжж-Бзз-з!.","Починить, Заварить, Трубить!","Стоять, снярядись на починку труб!") + ru_names = list( + NOMINATIVE = "торговый автомат NT ERT Engineer Gear", + GENITIVE = "торгового автомата NT ERT Engineer Gear", + DATIVE = "торговому автомату NT ERT Engineer Gear", + ACCUSATIVE = "торговый автомат NT ERT Engineer Gear", + INSTRUMENTAL = "торговым автоматом NT ERT Engineer Gear", + PREPOSITIONAL = "торговом автомате NT ERT Engineer Gear" + ) + desc = "Автомат с инженерным оборудованием ОБР." + ads_list = list( + "Чини станцию от рук синдиката!", + "Не забывай, чинить - полезно!", + "Бжж-Бзз-з!", + "Починить, Заварить, Трубить!", + "Стоять, снярядись на починку труб!" + ) icon_state = "nta_base" base_icon_state = "nta-engi" @@ -3560,8 +4339,22 @@ /obj/machinery/vending/nta/ertarmory/janitor name = "NT ERT Janitor Gear" - desc = "A ERT ccleaning equipment vendor." - ads_list = list("Чисть станцию от рук синдиката!","Не забывай, чистить - полезно!","Вилкой чисти!.","Помыть, Постирать, Оттереть!","Стоять, снярядись клинерами!") + ru_names = list( + NOMINATIVE = "торговый автомат NT ERT Janitor Gear", + GENITIVE = "торгового автомата NT ERT Janitor Gear", + DATIVE = "торговому автомату NT ERT Janitor Gear", + ACCUSATIVE = "торговый автомат NT ERT Janitor Gear", + INSTRUMENTAL = "торговым автоматом NT ERT Janitor Gear", + PREPOSITIONAL = "торговом автомате NT ERT Janitor Gear" + ) + desc = "Автомат с уборочным оборудованием ОБР." + ads_list = list( + "Чисть станцию от рук синдиката!", + "Не забывай, чистить - полезно!", + "Вилкой чисти!", + "Помыть, Постирать, Оттереть!", + "Стоять, снярядись клинерами!" + ) icon_state = "nta_base" base_icon_state = "nta-janitor" @@ -3588,7 +4381,15 @@ /obj/machinery/vending/pai name = "\improper RoboFriends" - desc = "Wonderful vendor of PAI friends" + ru_names = list( + NOMINATIVE = "торговый автомат RoboFriends", + GENITIVE = "торгового автомата RoboFriends", + DATIVE = "торговому автомату RoboFriends", + ACCUSATIVE = "торговый автомат RoboFriends", + INSTRUMENTAL = "торговым автоматом RoboFriends", + PREPOSITIONAL = "торговом автомате RoboFriends" + ) + desc = "Потрясающий продавец ПИИ-друзей!" icon_state = "paivend_off" panel_overlay = "paivend_panel" @@ -3597,7 +4398,13 @@ broken_overlay = "paivend_broken" broken_lightmask_overlay = "paivend_broken_lightmask" - ads_list = list("А вы любите нас?","Мы твои друзья!","Эта покупка войдет в историю","Я ПАИ простой, купишь меня, а я тебе друга!","Спасибо за покупку.") + ads_list = list( + "А вы любите нас?", + "Мы твои друзья!", + "Эта покупка войдет в историю", + "Я ПИИ простой, купишь меня, а я тебе друга!", + "Спасибо за покупку." + ) resistance_flags = FIRE_PROOF products = list( /obj/item/paicard = 10, @@ -3627,7 +4434,15 @@ /obj/machinery/vending/security/ert name = "NT ERT Consumables Gear" - desc = "A consumable equipment for different situations." + ru_names = list( + NOMINATIVE = "торговый автомат NT ERT Consumables Gear", + GENITIVE = "торгового автомата NT ERT Consumables Gear", + DATIVE = "торговому автомату NT ERT Consumables Gear", + ACCUSATIVE = "торговый автомат NT ERT Consumables Gear", + INSTRUMENTAL = "торговым автоматом NT ERT Consumables Gear", + PREPOSITIONAL = "торговом автомате NT ERT Consumables Gear" + ) + desc = "Расходное оборудование для различных ситуаций." resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF refill_canister = /obj/item/vending_refill/nta @@ -3700,7 +4515,15 @@ /obj/machinery/vending/ntc/medal name = "NT Cargo Encouragement" - desc = "A encourage vendor with many of medal types." + ru_names = list( + NOMINATIVE = "торговый автомат NT Cargo Encouragement", + GENITIVE = "торгового автомата NT Cargo Encouragement", + DATIVE = "торговому автомату NT Cargo Encouragement", + ACCUSATIVE = "торговый автомат NT Cargo Encouragement", + INSTRUMENTAL = "торговым автоматом NT Cargo Encouragement", + PREPOSITIONAL = "торговом автомате NT Cargo Encouragement" + ) + desc = "Тяжелый кейс с медалями на любой вкус и цвет." icon = 'icons/obj/storage.dmi' icon_state = "medalbox" products = list( @@ -3720,7 +4543,15 @@ /obj/machinery/vending/ntc/medical name = "NT Cargo Medical Gear" - desc = "A some medical equipment vendor for cargo." + ru_names = list( + NOMINATIVE = "торговый автомат NT Cargo Medical Gear", + GENITIVE = "торгового автомата NT Cargo Medical Gear", + DATIVE = "торговому автомату NT Cargo Medical Gear", + ACCUSATIVE = "торговый автомат NT Cargo Medical Gear", + INSTRUMENTAL = "торговым автоматом NT Cargo Medical Gear", + PREPOSITIONAL = "торговом автомате NT Cargo Medical Gear" + ) + desc = "Различное медицинское оборудование для доставки." icon_state = "nta_base" base_icon_state = "nta-medical" @@ -3741,7 +4572,15 @@ /obj/machinery/vending/ntc/engineering name = "NT Cargo Engineering Gear" - desc = "A some engineering equipment vendor for cargo." + ru_names = list( + NOMINATIVE = "торговый автомат NT Cargo Engineering Gear", + GENITIVE = "торгового автомата NT Cargo Engineering Gear", + DATIVE = "торговому автомату NT Cargo Engineering Gear", + ACCUSATIVE = "торговый автомат NT Cargo Engineering Gear", + INSTRUMENTAL = "торговым автоматом NT Cargo Engineering Gear", + PREPOSITIONAL = "торговом автомате NT Cargo Engineering Gear" + ) + desc = "Различное инженерное оборудование для доставки." icon_state = "nta_base" base_icon_state = "nta-engi" @@ -3761,7 +4600,15 @@ /obj/machinery/vending/ntc/janitor name = "NT Cargo Janitor Gear" - desc = "A some janitor equipment vendor for cargo." + ru_names = list( + NOMINATIVE = "торговый автомат NT Cargo Janitor Gear", + GENITIVE = "торгового автомата NT Cargo Janitor Gear", + DATIVE = "торговому автомату NT Cargo Janitor Gear", + ACCUSATIVE = "торговый автомат NT Cargo Janitor Gear", + INSTRUMENTAL = "торговым автоматом NT Cargo Janitor Gear", + PREPOSITIONAL = "торговом автомате NT Cargo Janitor Gear" + ) + desc = "Различное уборочное оборудование для доставки." icon_state = "nta_base" base_icon_state = "nta-janitor" @@ -3786,7 +4633,15 @@ /obj/machinery/vending/ntcrates name = "NT Cargo Preset Gear" - desc = "A already preset of equipments vendor for cargo." + ru_names = list( + NOMINATIVE = "торговый автомат NT Cargo Preset Gear", + GENITIVE = "торгового автомата NT Cargo Preset Gear", + DATIVE = "торговому автомату NT Cargo Preset Gear", + ACCUSATIVE = "торговый автомат NT Cargo Preset Gear", + INSTRUMENTAL = "торговым автоматом NT Cargo Preset Gear", + PREPOSITIONAL = "торговом автомате NT Cargo Preset Gear" + ) + desc = "Предварительный комплект оборудования для доставки, на все случаи жизни." resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF refill_canister = /obj/item/vending_refill/nta @@ -3812,7 +4667,15 @@ /obj/machinery/vending/ntc/ert name = "NT Response Team Base Gear" - desc = "A ERT Base equipment vendor" + ru_names = list( + NOMINATIVE = "торговый автомат NT Response Team Base Gear", + GENITIVE = "торгового автомата NT Response Team Base Gear", + DATIVE = "торговому автомату NT Response Team Base Gear", + ACCUSATIVE = "торговый автомат NT Response Team Base Gear", + INSTRUMENTAL = "торговым автоматом NT Response Team Base Gear", + PREPOSITIONAL = "торговом автомате NT Response Team Base Gear" + ) + desc = "Автомат с базовым оборудованием ОБР" icon_state = "nta_base" base_icon_state = "nta-blue" @@ -3833,7 +4696,15 @@ /obj/machinery/vending/ntc_resources name = "NT Matter Сompression Vendor" - desc = "Its vendor use advanced technology of matter compression and can have a many volume of resources." + ru_names = list( + NOMINATIVE = "торговый автомат NT Matter Сompression Vendor", + GENITIVE = "торгового автомата NT Matter Сompression Vendor", + DATIVE = "торговому автомату NT Matter Сompression Vendor", + ACCUSATIVE = "торговый автомат NT Matter Сompression Vendor", + INSTRUMENTAL = "торговым автоматом NT Matter Сompression Vendor", + PREPOSITIONAL = "торговом автомате NT Matter Сompression Vendor" + ) + desc = "Этот автомат использует передовую технологию сжатия и может хранить в себе большой объем ресурсов." resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF refill_canister = /obj/item/vending_refill/nta @@ -3866,7 +4737,15 @@ /obj/machinery/vending/mech/ntc/exousuit name = "NT Exosuit Bluespace Transporter" - desc = "Fabricator with advanced technology of bluespace transporting of resources." + ru_names = list( + NOMINATIVE = "торговый автомат NT Exosuit Bluespace Transporter", + GENITIVE = "торгового автомата NT Exosuit Bluespace Transporter", + DATIVE = "торговому автомату NT Exosuit Bluespace Transporter", + ACCUSATIVE = "торговый автомат NT Exosuit Bluespace Transporter", + INSTRUMENTAL = "торговым автоматом NT Exosuit Bluespace Transporter", + PREPOSITIONAL = "торговом автомате NT Exosuit Bluespace Transporter" + ) + desc = "Фабрикатор с передовой технологией BlueSpace-транспортировки ресурсов." icon = 'icons/obj/machines/robotics.dmi' icon_state = "fab-idle" products = list( @@ -3880,7 +4759,15 @@ /obj/machinery/vending/mech/ntc/equipment name = "NT Exosuit Bluespace Transporter" - desc = "Fabricator with advanced technology of bluespace transporting of resources." + ru_names = list( + NOMINATIVE = "торговый автомат NT Exosuit Bluespace Transporter", + GENITIVE = "торгового автомата NT Exosuit Bluespace Transporter", + DATIVE = "торговому автомату NT Exosuit Bluespace Transporter", + ACCUSATIVE = "торговый автомат NT Exosuit Bluespace Transporter", + INSTRUMENTAL = "торговым автоматом NT Exosuit Bluespace Transporter", + PREPOSITIONAL = "торговом автомате NT Exosuit Bluespace Transporter" + ) + desc = "Фабрикатор с передовой технологией BlueSpace-транспортировки ресурсов." icon_state = "engivend_off" panel_overlay = "engivend_panel" @@ -3900,7 +4787,15 @@ /obj/machinery/vending/mech/ntc/weapon name = "NT Exosuit Bluespace Transporter" - desc = "Fabricator with advanced technology of bluespace transporting of resources." + ru_names = list( + NOMINATIVE = "торговый автомат NT Exosuit Bluespace Transporter", + GENITIVE = "торгового автомата NT Exosuit Bluespace Transporter", + DATIVE = "торговому автомату NT Exosuit Bluespace Transporter", + ACCUSATIVE = "торговый автомат NT Exosuit Bluespace Transporter", + INSTRUMENTAL = "торговым автоматом NT Exosuit Bluespace Transporter", + PREPOSITIONAL = "торговом автомате NT Exosuit Bluespace Transporter" + ) + desc = "Фабрикатор с передовой технологией BlueSpace-транспортировки ресурсов." icon = 'icons/obj/machines/vending.dmi' icon_state = "liberationstation_off" @@ -3926,7 +4821,15 @@ /obj/machinery/vending/mech/ntc/tools name = "NT Exosuit Bluespace Transporter" - desc = "Fabricator with advanced technology of bluespace transporting of resources." + ru_names = list( + NOMINATIVE = "торговый автомат NT Exosuit Bluespace Transporter", + GENITIVE = "торгового автомата NT Exosuit Bluespace Transporter", + DATIVE = "торговому автомату NT Exosuit Bluespace Transporter", + ACCUSATIVE = "торговый автомат NT Exosuit Bluespace Transporter", + INSTRUMENTAL = "торговым автоматом NT Exosuit Bluespace Transporter", + PREPOSITIONAL = "торговом автомате NT Exosuit Bluespace Transporter" + ) + desc = "Фабрикатор с передовой технологией BlueSpace-транспортировки ресурсов." icon_state = "tool_off" panel_overlay = "tool_panel" diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 25b478b26a2..d88fc674794 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -202,29 +202,33 @@ GLOBAL_DATUM_INIT(fire_overlay, /mutable_appearance, mutable_appearance('icons/g ///Datum used in item pixel shift TGUI var/datum/ui_module/item_pixel_shift/item_pixel_shift -/obj/item/New() - ..() - for(var/path in actions_types) - if(action_icon && action_icon_state) - new path(src, action_icon[path], action_icon_state[path]) - else - new path(src) - - if(!move_resist) - determine_move_resist() - /obj/item/Initialize(mapload) . = ..() + if(isstorage(loc)) //marks all items in storage as being such item_flags |= IN_STORAGE + if(!hitsound) if(damtype == "fire") hitsound = 'sound/items/welder.ogg' + if(damtype == "brute") hitsound = "swing_hit" + + for(var/path in actions_types) + if(action_icon && action_icon_state) + new path(src, action_icon[path], action_icon_state[path]) + + else + new path(src) + + if(!move_resist) + determine_move_resist() + add_eatable_component() + /obj/item/proc/add_eatable_component() AddComponent(/datum/component/eatable) diff --git a/code/modules/mini_games/thunderdome/thunderdome_battle.dm b/code/modules/mini_games/thunderdome/thunderdome_battle.dm index 38fca4877f9..8d233c1c83c 100644 --- a/code/modules/mini_games/thunderdome/thunderdome_battle.dm +++ b/code/modules/mini_games/thunderdome/thunderdome_battle.dm @@ -9,7 +9,7 @@ #define MAX_PLAYERS_COUNT 16 #define MIN_PLAYERS_COUNT 2 #define SPAWN_COEFFICENT 0.85 //how many (polled * spawn_coefficent) players will go brawling -#define PICK_PENALTY 30 SECONDS //Prevents fast handed guys from picking polls twice in a row. +#define PICK_PENALTY 10 SECONDS //Prevents fast handed guys from picking polls twice in a row. // Uncomment this if you want to mess up with thunderdome alone /* #define THUND_TESTING 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/code/modules/power/solar.dm b/code/modules/power/solar.dm index 644ba9ec05d..8ff7699a8b3 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -337,10 +337,12 @@ track = TRACKER_AUTO autostart = TRUE // Automatically search for connected devices -/obj/machinery/power/solar_control/Initialize() +/obj/machinery/power/solar_control/Initialize(mapload, obj/structure/computerframe) SSsun.solars |= src setup() . = ..() + if(computerframe) + qdel(computerframe) /obj/machinery/power/solar_control/proc/setup() connect_to_network() diff --git a/code/modules/surgery/limb_reattach.dm b/code/modules/surgery/limb_reattach.dm index fab5b28c908..311be85a546 100644 --- a/code/modules/surgery/limb_reattach.dm +++ b/code/modules/surgery/limb_reattach.dm @@ -341,7 +341,7 @@ continue var/new_limb_type = organ_data["path"] - var/obj/item/organ/external/new_limb = new new_limb_type(holder = target, special = ORGAN_MANIPULATION_DEFAULT) + var/obj/item/organ/external/new_limb = new new_limb_type(target, ORGAN_MANIPULATION_DEFAULT) new_limb.robotize(company = L.model_info) if(L.sabotaged) diff --git a/code/modules/surgery/organs/organ.dm b/code/modules/surgery/organs/organ.dm index 04a08e1a281..462f89ebc09 100644 --- a/code/modules/surgery/organs/organ.dm +++ b/code/modules/surgery/organs/organ.dm @@ -50,13 +50,14 @@ var/hidden_pain = FALSE -/obj/item/organ/New(mob/living/carbon/human/holder) - ..(holder) +/obj/item/organ/Initialize(mapload) + . = ..() if(!max_damage) max_damage = min_broken_damage * 2 - if(ishuman(holder)) + if(ishuman(loc)) + var/mob/living/carbon/human/holder = loc update_DNA(holder.dna) return diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm index 4eacc7768a4..acb5ccfd3d3 100644 --- a/code/modules/surgery/organs/organ_external.dm +++ b/code/modules/surgery/organs/organ_external.dm @@ -105,15 +105,16 @@ light_on = FALSE -/obj/item/organ/external/New(mob/living/carbon/holder, special = ORGAN_MANIPULATION_NOEFFECT) - ..() +/obj/item/organ/external/Initialize(mapload, special = ORGAN_MANIPULATION_NOEFFECT) + . = ..() if(dna?.species) icobase = dna.species.icobase deform = dna.species.deform - if(ishuman(holder)) - replaced(holder, special) - sync_colour_to_human(holder) + + if(ishuman(loc)) + replaced(loc, special) + sync_colour_to_human(loc) properly_attached = TRUE if(is_robotic()) diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index c12203c2244..e929d3fe9e6 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -12,10 +12,11 @@ light_on = FALSE -/obj/item/organ/internal/New(mob/living/carbon/holder) - ..() - if(istype(holder)) - insert(holder) +/obj/item/organ/internal/Initialize(mapload) + . = ..() + + if(iscarbon(loc)) + insert(loc) if(species_type == /datum/species/diona) AddComponent(/datum/component/diona_internals) diff --git a/code/modules/surgery/organs/subtypes/machine.dm b/code/modules/surgery/organs/subtypes/machine.dm index aa7ab941793..d9dfe52dbde 100644 --- a/code/modules/surgery/organs/subtypes/machine.dm +++ b/code/modules/surgery/organs/subtypes/machine.dm @@ -10,8 +10,9 @@ pickup_sound = 'sound/items/handling/component_pickup.ogg' drop_sound = 'sound/items/handling/component_drop.ogg' -/obj/item/organ/external/head/ipc/New() - ..() +/obj/item/organ/external/head/ipc/Initialize(mapload, special = ORGAN_MANIPULATION_NOEFFECT) + . = ..() + robotize(company = "Morpheus Cyberkinetics") /obj/item/organ/external/chest/ipc @@ -22,8 +23,9 @@ pickup_sound = 'sound/items/handling/component_pickup.ogg' drop_sound = 'sound/items/handling/component_drop.ogg' -/obj/item/organ/external/chest/ipc/New() - ..() +/obj/item/organ/external/chest/ipc/Initialize(mapload, special = ORGAN_MANIPULATION_NOEFFECT) + . = ..() + robotize(company = "Morpheus Cyberkinetics") /obj/item/organ/external/groin/ipc @@ -34,8 +36,9 @@ pickup_sound = 'sound/items/handling/component_pickup.ogg' drop_sound = 'sound/items/handling/component_drop.ogg' -/obj/item/organ/external/groin/ipc/New() - ..() +/obj/item/organ/external/groin/ipc/Initialize(mapload, special = ORGAN_MANIPULATION_NOEFFECT) + . = ..() + robotize(company = "Morpheus Cyberkinetics") /obj/item/organ/external/arm/ipc @@ -46,8 +49,9 @@ pickup_sound = 'sound/items/handling/component_pickup.ogg' drop_sound = 'sound/items/handling/component_drop.ogg' -/obj/item/organ/external/arm/ipc/New() - ..() +/obj/item/organ/external/arm/ipc/Initialize(mapload, special = ORGAN_MANIPULATION_NOEFFECT) + . = ..() + robotize(company = "Morpheus Cyberkinetics") /obj/item/organ/external/arm/right/ipc @@ -56,8 +60,9 @@ status = ORGAN_ROBOT emp_resistant = TRUE -/obj/item/organ/external/arm/right/ipc/New() - ..() +/obj/item/organ/external/arm/right/ipc/Initialize(mapload, special = ORGAN_MANIPULATION_NOEFFECT) + . = ..() + robotize(company = "Morpheus Cyberkinetics") /obj/item/organ/external/leg/ipc @@ -68,8 +73,9 @@ pickup_sound = 'sound/items/handling/component_pickup.ogg' drop_sound = 'sound/items/handling/component_drop.ogg' -/obj/item/organ/external/leg/ipc/New() - ..() +/obj/item/organ/external/leg/ipc/Initialize(mapload, special = ORGAN_MANIPULATION_NOEFFECT) + . = ..() + robotize(company = "Morpheus Cyberkinetics") /obj/item/organ/external/leg/right/ipc @@ -78,8 +84,9 @@ status = ORGAN_ROBOT emp_resistant = TRUE -/obj/item/organ/external/leg/right/ipc/New() - ..() +/obj/item/organ/external/leg/right/ipc/Initialize(mapload, special = ORGAN_MANIPULATION_NOEFFECT) + . = ..() + robotize(company = "Morpheus Cyberkinetics") /obj/item/organ/external/foot/ipc @@ -90,8 +97,9 @@ pickup_sound = 'sound/items/handling/component_pickup.ogg' drop_sound = 'sound/items/handling/component_drop.ogg' -/obj/item/organ/external/foot/ipc/New() - ..() +/obj/item/organ/external/foot/ipc/Initialize(mapload, special = ORGAN_MANIPULATION_NOEFFECT) + . = ..() + robotize(company = "Morpheus Cyberkinetics") /obj/item/organ/external/foot/right/ipc @@ -100,8 +108,9 @@ status = ORGAN_ROBOT emp_resistant = TRUE -/obj/item/organ/external/foot/right/ipc/New() - ..() +/obj/item/organ/external/foot/right/ipc/Initialize(mapload, special = ORGAN_MANIPULATION_NOEFFECT) + . = ..() + robotize(company = "Morpheus Cyberkinetics") /obj/item/organ/external/hand/ipc @@ -112,8 +121,9 @@ pickup_sound = 'sound/items/handling/component_pickup.ogg' drop_sound = 'sound/items/handling/component_drop.ogg' -/obj/item/organ/external/hand/ipc/New() - ..() +/obj/item/organ/external/hand/ipc/Initialize(mapload, special = ORGAN_MANIPULATION_NOEFFECT) + . = ..() + robotize(company = "Morpheus Cyberkinetics") /obj/item/organ/external/hand/right/ipc @@ -122,8 +132,9 @@ status = ORGAN_ROBOT emp_resistant = TRUE -/obj/item/organ/external/hand/right/ipc/New() - ..() +/obj/item/organ/external/hand/right/ipc/Initialize(mapload, special = ORGAN_MANIPULATION_NOEFFECT) + . = ..() + robotize(company = "Morpheus Cyberkinetics") /obj/item/organ/internal/cell diff --git a/code/modules/surgery/organs/subtypes/standard.dm b/code/modules/surgery/organs/subtypes/standard.dm index d0971da1aca..27d9ff57e74 100644 --- a/code/modules/surgery/organs/subtypes/standard.dm +++ b/code/modules/surgery/organs/subtypes/standard.dm @@ -486,9 +486,10 @@ var/list/m_colours = list("tail" = "#000000") s_col = "#000000" -/obj/item/organ/external/tail/New(mob/living/carbon/holder) - ..() - if(!holder) +/obj/item/organ/external/tail/Initialize(mapload, special = ORGAN_MANIPULATION_NOEFFECT) + . = ..() + + if(!ishuman(loc)) var/icon/tempicon = new/icon("icon" = force_icon, "icon_state" = icon_name) var/icon/tempicon2 = new/icon(tempicon,dir=NORTH) tempicon2.Flip(SOUTH) @@ -548,9 +549,10 @@ var/list/m_colours = list("wing" = "#000000") s_col = "#000000" -/obj/item/organ/external/wing/New(mob/living/carbon/holder) - ..() - if(!holder) +/obj/item/organ/external/wing/Initialize(mapload, special = ORGAN_MANIPULATION_NOEFFECT) + . = ..() + + if(!ishuman(loc)) var/icon/tempicon = new/icon("icon" = force_icon, "icon_state" = icon_name) var/icon/tempicon2 = new/icon(tempicon,dir=NORTH) tempicon2.Flip(SOUTH) 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 && ( -
+