From 10b38fa323a7a5f9fa8dc7a8ddf982900c115bb4 Mon Sep 17 00:00:00 2001 From: chomasuke <85545019+chomasuke@users.noreply.github.com> Date: Mon, 9 Feb 2026 22:53:52 +0300 Subject: [PATCH 1/9] =?UTF-8?q?del:=20=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=9C=D0=AD=D0=9A=D0=BE=D0=B2=20=D0=B8=20=D0=98?= =?UTF-8?q?=D0=BD=D1=82=D0=B5=D0=B3=D1=80=D0=B0=D0=BB=D0=BE=D0=BA=20=D0=B8?= =?UTF-8?q?=D0=B7=20=D0=B1=D0=B8=D0=BB=D0=B4=D0=B0=20(#8512)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit zalupa экшены оболочки для мода оболочка для мода перенесена в мехфаб маркер. удаление устаревшего переопределённого прока get_equipped_items, замена передаваемых аргументов на битфлаги, где этого ещё не было. компоненту лазера добавлен кд на использование 1 секунда --- code/__DEFINES/cooldowns.dm | 1 + code/datums/rituals.dm | 2 +- .../special_shadowling_abilities.dm | 4 +- code/game/machinery/recycler.dm | 29 ++++---- code/game/objects/items.dm | 4 +- .../objects/items/devices/traitordevices.dm | 2 +- code/modules/admin/verbs/debug.dm | 2 +- .../contractor/drifting_contractor.dm | 2 +- .../syndicate/nuclear/nuclear_operative.dm | 2 +- code/modules/clothing/head/misc_special.dm | 2 +- code/modules/mob/inventory.dm | 2 +- .../mob/living/carbon/human/inventory.dm | 31 --------- code/modules/mob/living/carbon/inventory.dm | 32 +-------- code/modules/mob/living/living.dm | 2 +- .../mob/living/silicon/robot/inventory.dm | 2 +- .../research/designs/wiremod_designs.dm | 6 +- .../components/action/equpiment_action.dm | 3 +- .../wiremod/components/action/laserpointer.dm | 9 ++- .../wiremod/shell/brain_computer_interface.dm | 9 ++- code/modules/wiremod/shell/module.dm | 69 ++++++++++++------- 20 files changed, 91 insertions(+), 124 deletions(-) diff --git a/code/__DEFINES/cooldowns.dm b/code/__DEFINES/cooldowns.dm index 0b4bff9ff950..2c4ae0527b94 100644 --- a/code/__DEFINES/cooldowns.dm +++ b/code/__DEFINES/cooldowns.dm @@ -53,6 +53,7 @@ #define COOLDOWN_CIRCUIT_PATHFIND_DIF "circuit_pathfind_different" #define COOLDOWN_CIRCUIT_TARGET_INTERCEPT "circuit_target_intercept" #define COOLDOWN_CIRCUIT_VIEW_SENSOR "circuit_view_sensor" +#define COOLDOWN_CIRCUIT_LASER "circuit_laser" // mob cooldowns #define COOLDOWN_YAWN_PROPAGATION "yawn_propagation_cooldown" diff --git a/code/datums/rituals.dm b/code/datums/rituals.dm index 74d12e4752bc..68de490f930d 100644 --- a/code/datums/rituals.dm +++ b/code/datums/rituals.dm @@ -707,7 +707,7 @@ smoke.set_up(amount = 5, location = get_turf(human.loc)) smoke.start() - for(var/obj/item/obj as anything in human.get_equipped_items(TRUE, TRUE)) + for(var/obj/item/obj as anything in human.get_equipped_items(INCLUDE_POCKETS | INCLUDE_HELD)) human.drop_item_ground(obj) return diff --git a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm index 5b3c6602dfae..25b2e697103f 100644 --- a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm @@ -30,7 +30,7 @@ GLOBAL_LIST_INIT(possibleShadowlingNames, list("U'ruan", "Y`shej", "Nex", "Hel-u user.visible_message(span_warning("Вещи [user] неожиданно начали сползать. С них стекает обильное количество фиолетовой жижи, которая формируется вокруг них."), \ span_shadowling("Вы сбрасываете одежду, которая может помешать вашему вылуплению и начинаете выделять смолу, которая защитит вас.")) user.Stun(35 SECONDS, TRUE) - for(var/obj/item/item as anything in user.get_equipped_items(TRUE, TRUE)) + for(var/obj/item/item as anything in user.get_equipped_items(INCLUDE_POCKETS | INCLUDE_HELD)) user.drop_item_ground(item, force = TRUE) sleep(5 SECONDS) @@ -242,7 +242,7 @@ GLOBAL_LIST_INIT(possibleShadowlingNames, list("U'ruan", "Y`shej", "Nex", "Hel-u * Testing purpose. */ /mob/living/carbon/human/proc/make_unhatched_shadowling() - for(var/obj/item/item as anything in get_equipped_items(TRUE, TRUE)) + for(var/obj/item/item as anything in get_equipped_items(INCLUDE_POCKETS | INCLUDE_HELD)) drop_item_ground(item, force = TRUE) var/newNameId = pick(GLOB.possibleShadowlingNames) diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index 09cd495e9ba2..d717138307f7 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -146,41 +146,40 @@ emergency_mode = FALSE update_icon(UPDATE_ICON_STATE) -/obj/machinery/recycler/proc/crush_living(mob/living/L) +/obj/machinery/recycler/proc/crush_living(mob/living/target) + target.forceMove(loc) - L.forceMove(loc) - - if(issilicon(L)) + if(issilicon(target)) playsound(loc, 'sound/items/welder.ogg', 50, TRUE) else playsound(loc, 'sound/effects/splat.ogg', 50, TRUE) var/gib = 1 // By default, the emagged recycler will gib all non-carbons. (human simple animal mobs don't count) - if(iscarbon(L)) + if(iscarbon(target)) gib = 0 - if(L.stat == CONSCIOUS) - L.say("ARRRRRRRRRRRGH!!!") - add_mob_blood(L) + if(target.stat == CONSCIOUS) + target.say("ARRRRRRRRRRRGH!!!") + add_mob_blood(target) - if(!blood && !issilicon(L)) + if(!blood && !issilicon(target)) blood = 1 update_icon(UPDATE_ICON_STATE) // Remove and recycle the equipped items if(eat_victim_items) - for(var/obj/item/I in L.get_equipped_items(TRUE, TRUE)) - if(L.drop_item_ground(I)) - eat(I, sound = 0) + for(var/obj/item/item in target.get_equipped_items(INCLUDE_POCKETS | INCLUDE_HELD)) + if(target.drop_item_ground(item)) + eat(item, sound = 0) // Instantly lie down, also go unconscious from the pain, before you die. - L.Paralyse(10 SECONDS) + target.Paralyse(10 SECONDS) // For admin fun, var edit emagged to 2. if(gib || emagged == 2) - L.gib() + target.gib() else if(emagged == 1) - L.adjustBruteLoss(crush_damage) + target.adjustBruteLoss(crush_damage) /obj/machinery/recycler/verb/rotate() set name = "Повернуть по часовой" diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 2497e8a3a37e..265b4c2944b7 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -816,12 +816,12 @@ GLOBAL_DATUM_INIT(fire_overlay, /mutable_appearance, mutable_appearance('icons/g * Returns `TRUE` if the item is equipped by a mob, `FALSE` otherwise. * This might need some error trapping, not sure if get_equipped_items() is safe for non-human mobs. */ -/obj/item/proc/is_equipped(include_pockets = FALSE, include_hands = FALSE) +/obj/item/proc/is_equipped(include_flags = NONE) if(!ismob(loc)) return FALSE var/mob/M = loc - if(src in M.get_equipped_items(include_pockets, include_hands)) + if(src in M.get_equipped_items(include_flags)) return TRUE else return FALSE diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index ce4d2e35e26c..c31bcf4de258 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -384,7 +384,7 @@ effective or pretty fucking useless. playsound(destination, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) playsound(destination, 'sound/magic/disintegrate.ogg', 50, TRUE) destination.ex_act(rand(EXPLODE_DEVASTATE, EXPLODE_HEAVY)) - for(var/obj/item/thing as anything in user.get_equipped_items(TRUE, TRUE)) + for(var/obj/item/thing as anything in user.get_equipped_items(INCLUDE_POCKETS | INCLUDE_HELD)) if(!user.drop_item_ground(thing)) qdel(thing) to_chat(user, span_biggerdanger("You teleport into the wall, the teleporter tries to save you, but--")) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 1bbbfe78d21d..f0c2982c26cd 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -574,7 +574,7 @@ ADMIN_VERB_ONLY_CONTEXT_MENU(select_equipment, R_EVENT, "Select Equipment", mob/ if(tgui_alert(user, "Нужно ли выбрасывать вещи из карманов? Выбор \"Нет\" удалит их.", "Выбор экипировки существа", "Да", "Нет") == "Нет") delete_pocket = TRUE - for(var/obj/item/I in H.get_equipped_items(delete_pocket)) + for(var/obj/item/I in H.get_equipped_items(delete_pocket ? INCLUDE_POCKETS : NONE)) qdel(I) if(dresscode != "Naked") H.equipOutfit(dresscode) diff --git a/code/modules/antagonists/syndicate/contractor/drifting_contractor.dm b/code/modules/antagonists/syndicate/contractor/drifting_contractor.dm index 7087a6bb54b9..8b0db9da2a46 100644 --- a/code/modules/antagonists/syndicate/contractor/drifting_contractor.dm +++ b/code/modules/antagonists/syndicate/contractor/drifting_contractor.dm @@ -26,7 +26,7 @@ if(!our_outfit) return - for(var/obj/item/item as anything in human.get_equipped_items(TRUE, TRUE)) + for(var/obj/item/item as anything in human.get_equipped_items(INCLUDE_POCKETS | INCLUDE_HELD)) qdel(item) human.equipOutfit(our_outfit) diff --git a/code/modules/antagonists/syndicate/nuclear/nuclear_operative.dm b/code/modules/antagonists/syndicate/nuclear/nuclear_operative.dm index b2882fb8138b..938eebc68955 100644 --- a/code/modules/antagonists/syndicate/nuclear/nuclear_operative.dm +++ b/code/modules/antagonists/syndicate/nuclear/nuclear_operative.dm @@ -80,7 +80,7 @@ if(!outfit) return - for(var/obj/item/item in human.get_equipped_items(TRUE, TRUE)) + for(var/obj/item/item in human.get_equipped_items(INCLUDE_POCKETS | INCLUDE_HELD)) qdel(item) human.equipOutfit(outfit) diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 6757c567e4b2..2c6b08704bb5 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -136,7 +136,7 @@ return PROCESS_KILL var/turf/cake_turf = loc - if(is_equipped(include_pockets = TRUE, include_hands = TRUE)) + if(is_equipped(INCLUDE_POCKETS | INCLUDE_HELD)) cake_turf = loc.loc if(isturf(cake_turf)) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index e96facd33d68..a651973f4ef3 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -629,7 +629,7 @@ //get_all_contents that is reasonable and not stupid /mob/living/proc/get_all_gear(recursive = TRUE) - var/list/processing_list = get_equipped_items(TRUE, TRUE) + var/list/processing_list = get_equipped_items(INCLUDE_POCKETS | INCLUDE_HELD) list_clear_nulls(processing_list) // handles empty hands var/i = 0 while(i < length(processing_list)) diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index ec5869e11e1b..92fe8ef5e601 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -633,37 +633,6 @@ for(var/slot in get_all_slots())//order matters, dependant slots go first qdel(slot) -/mob/living/carbon/human/get_equipped_items(include_pockets = FALSE, include_hands = FALSE) - var/list/items = ..() - if(belt) - items += belt - if(l_ear) - items += l_ear - if(r_ear) - items += r_ear - if(glasses) - items += glasses - if(gloves) - items += gloves - if(neck) - items += neck - if(shoes) - items += shoes - if(wear_id) - items += wear_id - if(wear_pda) - items += wear_pda - if(w_uniform) - items += w_uniform - if(include_pockets) - if(l_store) - items += l_store - if(r_store) - items += r_store - if(s_store) - items += s_store - return items - /** * Used to return a list of equipped items on a human mob; does not by default include held items, see include_flags * diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index fda15752f98b..36b7eb4eb77e 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -395,38 +395,12 @@ // Returns items which are currently visible on the mob /mob/living/carbon/proc/get_visible_items() - var/static/list/visible_slots = list( - ITEM_SLOT_GLOVES, - ITEM_SLOT_EYES, - ITEM_SLOT_EARS, - ITEM_SLOT_MASK, - ITEM_SLOT_HEAD, - ITEM_SLOT_FEET, - ITEM_SLOT_ID, - ITEM_SLOT_PDA, - ITEM_SLOT_BELT, - ITEM_SLOT_BACK, - ITEM_SLOT_NECK, - ITEM_SLOT_HANDS, - ITEM_SLOT_BACKPACK, - ITEM_SLOT_SUITSTORE, - ITEM_SLOT_HANDCUFFED, - ITEM_SLOT_LEGCUFFED, - ) var/list/obscured = check_obscured_slots() var/list/visible_items = list() - for(var/slot in visible_slots) - if(obscured & slot) - continue - - var/obj/item/equipped = get_item_by_slot(slot) - - if(equipped) - visible_items += equipped - - for(var/obj/item/held in get_equipped_items(INCLUDE_HELD)) - visible_items += held + for(var/obj/item/thing in get_equipped_items(INCLUDE_HELD)) + if(!(get_slot_by_item(thing) & obscured)) + visible_items += thing return visible_items diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 218d33d7af41..300d9b028633 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1668,7 +1668,7 @@ return /mob/living/extinguish_light(force = FALSE) - for(var/obj/item/item as anything in get_equipped_items(TRUE, TRUE)) + for(var/obj/item/item as anything in get_equipped_items(INCLUDE_POCKETS | INCLUDE_HELD)) item.extinguish_light(force) /mob/living/vv_edit_var(var_name, var_value) diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index 0f7a124a2f72..7dc671f04a32 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -11,7 +11,7 @@ /mob/living/silicon/robot/get_all_slots() return list(module_state_1, module_state_2, module_state_3) -/mob/living/silicon/robot/get_equipped_items(include_pockets = FALSE, include_hands = FALSE) +/mob/living/silicon/robot/get_equipped_items(include_flags = NONE) . = list() if(module_state_1) . += module_state_1 diff --git a/code/modules/research/designs/wiremod_designs.dm b/code/modules/research/designs/wiremod_designs.dm index a420a39462c9..d10b0cee9a0d 100644 --- a/code/modules/research/designs/wiremod_designs.dm +++ b/code/modules/research/designs/wiremod_designs.dm @@ -592,15 +592,11 @@ PROTOLATHE_CATEGORY_CIRCUITRY, ) -/datum/design/mod_module_shell +/datum/design/module/mod_module_shell id = "module_shell" req_tech = list(RESEARCH_TREE_MATERIALS = 2, RESEARCH_TREE_PROGRAMMING = 2) materials = list(MAT_GLASS = 1000) build_path = /obj/item/mod/module/circuit - build_type = PROTOLATHE - category = list( - PROTOLATHE_CATEGORY_CIRCUITRY, - ) // /datum/design/undertile_shell // id = "undertile_shell" diff --git a/code/modules/wiremod/components/action/equpiment_action.dm b/code/modules/wiremod/components/action/equpiment_action.dm index ee117057cc43..d08a4737ba4a 100644 --- a/code/modules/wiremod/components/action/equpiment_action.dm +++ b/code/modules/wiremod/components/action/equpiment_action.dm @@ -127,8 +127,9 @@ /obj/item/circuit_component/equipment_action/proc/update_actions() for(var/uid in granted_to) var/datum/action/granted_action = granted_to[uid] - granted_action.name = button_name.value || "Дейстие" + granted_action.name = button_name.value || "Действие" granted_action.button_icon_state = LAZYACCESS(options_map, icon_options.value) + granted_action.build_all_button_icons(ALL) #undef HUD_BLANK diff --git a/code/modules/wiremod/components/action/laserpointer.dm b/code/modules/wiremod/components/action/laserpointer.dm index 5defa076187f..62f993be6336 100644 --- a/code/modules/wiremod/components/action/laserpointer.dm +++ b/code/modules/wiremod/components/action/laserpointer.dm @@ -18,10 +18,12 @@ var/datum/port/input/option/lasercolour_option + var/laser_cooldown = 1 SECONDS /obj/item/circuit_component/laserpointer/get_ui_notices() . = ..() . += create_ui_notice("Максимальная дальность: [max_range] тайл[DECL_CREDIT(max_range)]", "orange", "info") + . += create_ui_notice("Перезарядка: [DisplayTimeText(laser_cooldown)]", "orange", "stopwatch") /obj/item/circuit_component/laserpointer/populate_options() var/static/component_options = list( @@ -32,20 +34,19 @@ ) lasercolour_option = add_option_port("Цвет лазера", component_options) - /obj/item/circuit_component/laserpointer/populate_ports() target_input = add_input_port("Цель", PORT_TYPE_ATOM) image_pixel_x = add_input_port("X", PORT_TYPE_NUMBER) image_pixel_y = add_input_port("Y", PORT_TYPE_NUMBER) - /obj/item/circuit_component/laserpointer/input_received(datum/port/input/port) + if(TIMER_COOLDOWN_RUNNING(parent.shell, COOLDOWN_CIRCUIT_LASER)) + return var/atom/target = target_input.value var/atom/movable/shell = parent.shell var/turf/target_location = get_turf(target) - var/pointer_icon_state = lasercolour_option.value var/turf/current_turf = get_location() @@ -65,3 +66,5 @@ laser_location.pixel_z = clamp(target.pixel_y + image_pixel_y.value, -15, 15) target_location.flick_overlay_view(laser_location, 1 SECONDS) + + TIMER_COOLDOWN_START(shell, COOLDOWN_CIRCUIT_LASER, laser_cooldown) diff --git a/code/modules/wiremod/shell/brain_computer_interface.dm b/code/modules/wiremod/shell/brain_computer_interface.dm index 5cde757dd8b8..58fde6ad2d02 100644 --- a/code/modules/wiremod/shell/brain_computer_interface.dm +++ b/code/modules/wiremod/shell/brain_computer_interface.dm @@ -263,9 +263,12 @@ var/obj/item/stock_parts/cell/cell = circuit_component.parent.cell if(isnull(cell)) - to_chat(owner, span_boldwarning("[circuit_component.parent.declent_ru(NOMINATIVE)] не име[PLUR_ET_UT(circuit_component.parent)] элемента питания.")) + to_chat(owner, span_boldwarning("[circuit_component.parent.declent_ru(NOMINATIVE)] \ + не име[PLUR_ET_UT(circuit_component.parent)] элемента питания.")) else - to_chat(owner, span_notice("В [cell.declent_ru(PREPOSITIONAL)] [circuit_component.parent.declent_ru(GENITIVE)] осталось [cell.percent()]% заряда.")) + to_chat(owner, span_notice("В [cell.declent_ru(PREPOSITIONAL)] \ + [circuit_component.parent.declent_ru(GENITIVE)] \ + осталось [round(cell.percent(), 1)]% заряда.")) /datum/action/innate/bci_charge_action/process(seconds_per_tick) build_all_button_icons(UPDATE_BUTTON_STATUS) @@ -273,7 +276,7 @@ /datum/action/innate/bci_charge_action/update_button_status(atom/movable/screen/movable/action_button/button, force = FALSE) . = ..() var/obj/item/stock_parts/cell/cell = circuit_component.parent.cell - button.maptext = cell ? MAPTEXT("[cell.percent()]%") : "" + button.maptext = cell ? MAPTEXT("[round(cell.percent(), 1)]%") : "" /obj/machinery/bci_implanter name = "brain-computer interface manipulation chamber" diff --git a/code/modules/wiremod/shell/module.dm b/code/modules/wiremod/shell/module.dm index f1eac8ccab1a..3cbeaa34ce09 100644 --- a/code/modules/wiremod/shell/module.dm +++ b/code/modules/wiremod/shell/module.dm @@ -11,7 +11,7 @@ /// A reference to the shell component, used to access the shell and its attached circuit var/datum/component/shell/shell /// List of installed action components - var/list/obj/item/circuit_component/equipment_action/action_comps = list() + var/list/obj/item/circuit_component/equipment_action/action_comps /obj/item/mod/module/circuit/get_ru_names() return list( @@ -23,7 +23,6 @@ PREPOSITIONAL = "модуле интегральной схемы", ) - /obj/item/mod/module/circuit/Initialize(mapload) . = ..() @@ -42,49 +41,53 @@ /obj/item/mod/module/circuit/proc/action_comp_registered(datum/source, obj/item/circuit_component/equipment_action/action_comp) SIGNAL_HANDLER - action_comps += action_comp + LAZYADD(action_comps, action_comp) /obj/item/mod/module/circuit/proc/action_comp_unregistered(datum/source, obj/item/circuit_component/equipment_action/action_comp) SIGNAL_HANDLER - action_comps -= action_comp - for(var/ref in action_comp.granted_to) - unpin_action(action_comp, locateUID(ref)) + LAZYREMOVE(action_comps, action_comp) + for(var/uid in action_comp.granted_to) + unpin_action(action_comp, locateUID(uid)) + QDEL_LIST_ASSOC_VAL(action_comp.granted_to) /obj/item/mod/module/circuit/on_install() . = ..() if(!shell?.attached_circuit) return + RegisterSignal(shell?.attached_circuit, COMSIG_CIRCUIT_PRE_POWER_USAGE, PROC_REF(override_power_usage)) /obj/item/mod/module/circuit/on_uninstall(deleting = FALSE) . = ..() if(!shell?.attached_circuit) return + for(var/obj/item/circuit_component/equipment_action/action_comp in action_comps) - for(var/ref in action_comp.granted_to) - unpin_action(action_comp, locateUID(ref)) + for(var/uid in action_comp.granted_to) + unpin_action(action_comp, locateUID(uid)) + UnregisterSignal(shell?.attached_circuit, COMSIG_CIRCUIT_PRE_POWER_USAGE) /obj/item/mod/module/circuit/on_use() . = ..() - if(!.) - return if(!shell.attached_circuit) return - shell.attached_circuit?.interact(mod.wearer) + + shell.attached_circuit?.ui_interact(mod.wearer) /obj/item/mod/module/circuit/get_configuration(mob/user) . = ..() var/unnamed_action_index = 1 for(var/obj/item/circuit_component/equipment_action/action_comp in action_comps) - .[action_comp.UID()] = add_ui_configuration(action_comp.button_name.value || "Unnamed Action [unnamed_action_index++]", "pin", !!action_comp.granted_to[user.UID()]) + .[action_comp.UID()] = add_ui_configuration(action_comp.button_name.value || "Безымянное действие [unnamed_action_index++]", "pin", LAZYFIND(action_comp.granted_to, user.UID())) /obj/item/mod/module/circuit/configure_edit(key, value) . = ..() var/obj/item/circuit_component/equipment_action/action_comp = locateUID(key) if(!istype(action_comp)) return + if(text2num(value)) pin_action(action_comp, usr) else @@ -93,14 +96,17 @@ /obj/item/mod/module/circuit/proc/pin_action(obj/item/circuit_component/equipment_action/action_comp, mob/user) if(!istype(user)) return - if(action_comp.granted_to[user.UID()]) // Sanity check - don't pin an action for a mob that has already pinned it + + if(LAZYFIND(action_comp.granted_to, user.UID())) return + mod.add_item_action(new/datum/action/item_action/mod/pinnable/circuit(mod, user, src, action_comp)) /obj/item/mod/module/circuit/proc/unpin_action(obj/item/circuit_component/equipment_action/action_comp, mob/user) - var/datum/action/item_action/mod/pinnable/circuit/action = action_comp.granted_to[user.UID()] + var/datum/action/item_action/mod/pinnable/circuit/action = LAZYACCESS(action_comp.granted_to, user.UID()) if(!istype(action)) return + qdel(action) /datum/action/item_action/mod/pinnable/circuit @@ -114,40 +120,45 @@ var/obj/item/circuit_component/equipment_action/circuit_component /datum/action/item_action/mod/pinnable/circuit/New(Target, mob/user, obj/item/mod/module/circuit/linked_module, obj/item/circuit_component/equipment_action/action_comp) - . = ..() - module = linked_module - action_comp.granted_to[user.UID()] = src + name = action_comp.button_name.value || "Действие" + button_icon_state = LAZYACCESS(action_comp.options_map, action_comp.icon_options.value) || button_icon_state + + LAZYSET(action_comp.granted_to, user.UID(), src) circuit_component = action_comp - name = action_comp.button_name.value - button_icon_state = "bci_[replacetextEx(LOWER_TEXT(action_comp.icon_options.value), " ", "_")]" + module = linked_module + + . = ..() /datum/action/item_action/mod/pinnable/circuit/Destroy() - circuit_component.granted_to -= pinner.UID() + LAZYREMOVE(circuit_component.granted_to, pinner.UID()) circuit_component = null return ..() -/datum/action/item_action/mod/pinnable/circuit/do_effect(trigger_flags) +/datum/action/item_action/mod/pinnable/circuit/Trigger(mob/clicker, trigger_flags) . = ..() if(!.) return + var/obj/item/mod/control/mod = module.mod if(!istype(mod)) return FALSE + if(!mod.active || mod.activating) if(mod.wearer) - module.balloon_alert(mod.wearer, "not active!") + module.balloon_alert(mod.wearer, "модуль неактивен!") return FALSE + circuit_component.user.set_output(owner) circuit_component.signal.set_output(COMPONENT_SIGNAL) /// If the guy whose UI we are pinned to got deleted /datum/action/item_action/mod/pinnable/circuit/pinner_deleted() - module?.action_comps[circuit_component] -= pinner.UID() + LAZYREMOVEASSOC(module?.action_comps, circuit_component, pinner.UID()) . = ..() /obj/item/circuit_component/mod_adapter_core - display_name = "ядро адаптера схем для МЭК" + display_name = "Ядро адаптера схем для МЭК" desc = "Позволяет считывать информацию о пользователе МЭКа и позволяет удаленно запускать и отключать МЭК." /// The MODsuit module this circuit is associated with @@ -227,10 +238,13 @@ for(var/obj/item/mod/module/potential_module as anything in attached_module.mod.modules) if(potential_module.name == module_to_select.value) module = potential_module + if(COMPONENT_TRIGGERED_BY(toggle_suit, port)) INVOKE_ASYNC(attached_module.mod, TYPE_PROC_REF(/obj/item/mod/control, toggle_activate), attached_module.mod.wearer) + if(COMPONENT_TRIGGERED_BY(toggle_deploy, port)) INVOKE_ASYNC(attached_module.mod, TYPE_PROC_REF(/obj/item/mod/control, quick_deploy), attached_module.mod.wearer) + if(attached_module.mod.active && module && COMPONENT_TRIGGERED_BY(select_module, port)) INVOKE_ASYNC(module, TYPE_PROC_REF(/obj/item/mod/module, on_select)) @@ -279,6 +293,7 @@ for(var/obj/item/mod/module/module in attached_module.mod.modules) if(module.module_type != MODULE_PASSIVE) modules_list += module.name + module_to_select.possible_options = modules_list if(length(module_to_select.possible_options)) module_to_select.set_value(module_to_select.possible_options[1]) @@ -294,13 +309,18 @@ var/part_name = "Неизвестно" if(ismodhelmet(part)) part_name = "Шлем" + if(ismodchestplate(part)) part_name = "Нагрудник" + if(ismodgloves(part)) part_name = "Перчатки" + if(ismodshoes(part)) part_name = "Ботинки" + string_list += part_name + deployed_parts.set_output(string_list) deployed.set_output(is_deployed) on_deploy.set_output(COMPONENT_SIGNAL) @@ -314,4 +334,5 @@ SIGNAL_HANDLER if(!attached_module.mod?.wearer) return + wearer.set_output(attached_module.mod.wearer) From 1d1c5d9efd276903b12352438328703f822d0927 Mon Sep 17 00:00:00 2001 From: Shark Github Date: Mon, 23 Feb 2026 00:16:59 +0800 Subject: [PATCH 2/9] =?UTF-8?q?=D0=91=D0=A1=20=D0=A1=D0=B5=D1=82=D1=87?= =?UTF-8?q?=D0=B5=D0=BB=20=D0=9A=D0=9E=D1=80=D0=BE=D1=87=D0=B5=20=D1=85?= =?UTF-8?q?=D0=B7=D1=83=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/game/objects/items/weapons/storage/backpack.dm | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 851307630662..cdb1e2348f55 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -64,6 +64,16 @@ cant_hold = list(/obj/item/storage/backpack/holding) armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 60, ACID = 50) + /obj/item/storage/backpack/holding/get_ru_names() + return list( + NOMINATIVE = "бс рюкзак", + GENITIVE = "бс рюкзака", + DATIVE = "бс рюкзаку", + ACCUSATIVE = "бс рюкзак", + INSTRUMENTAL = "бс рюкзаком", + PREPOSITIONAL = "бс рюкзаке", + ) + /obj/item/storage/backpack/holding/attackby(obj/item/I, mob/user, params) if(!istype(I, /obj/item/storage/backpack/holding)) return ..() From cbf35b84b7e003f873fdada66a50995ecb99e3c6 Mon Sep 17 00:00:00 2001 From: Shark Github Date: Mon, 23 Feb 2026 02:01:07 +0800 Subject: [PATCH 3/9] =?UTF-8?q?90=D1=88=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../objects/items/weapons/storage/backpack.dm | 40 ++++++++++++------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index cdb1e2348f55..cec1ad803095 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -64,15 +64,15 @@ cant_hold = list(/obj/item/storage/backpack/holding) armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 60, ACID = 50) - /obj/item/storage/backpack/holding/get_ru_names() +/obj/item/storage/backpack/holding/get_ru_names() return list( - NOMINATIVE = "бс рюкзак", - GENITIVE = "бс рюкзака", - DATIVE = "бс рюкзаку", - ACCUSATIVE = "бс рюкзак", - INSTRUMENTAL = "бс рюкзаком", - PREPOSITIONAL = "бс рюкзаке", - ) + NOMINATIVE = "блюспейс рюкзак", + GENITIVE = "блюспейс рюкзака", + DATIVE = "блюспейс рюкзаку", + ACCUSATIVE = "блюспейс рюкзак", + INSTRUMENTAL = "блюспейс рюкзаком", + PREPOSITIONAL = "блюспейс рюкзаке", + ) /obj/item/storage/backpack/holding/attackby(obj/item/I, mob/user, params) if(!istype(I, /obj/item/storage/backpack/holding)) @@ -125,6 +125,16 @@ icon_state = "holdingsat" item_state = "holdingsat" +/obj/item/storage/backpack/holding/satchel/get_ru_names() + return list( + NOMINATIVE = "блюспейс сумка", + GENITIVE = "блюспейс сумки", + DATIVE = "блюспейс сумке", + ACCUSATIVE = "блюспейс сумку", + INSTRUMENTAL = "блюспейс сумкой", + PREPOSITIONAL = "блюспейс сумке", + ) + /obj/item/storage/backpack/holding/singularity_act(current_size) var/dist = max((current_size - 2), 1) explosion(loc, devastation_range = (dist), heavy_impact_range = (dist*2), light_impact_range = (dist*4), cause = "into singularity") @@ -136,14 +146,14 @@ item_state = "holdingduffelba" max_combined_w_class = 40 -/obj/item/storage/backpack/duffelbag/get_ru_names() +/obj/item/storage/backpack/holding/satchel/duffelbag/get_ru_names() return list( - NOMINATIVE = "блюспейс сумка хранения", - GENITIVE = "блюспейс сумки храненияя", - DATIVE = "блюспейс сумке хранения", - ACCUSATIVE = "блюспейс сумку хранения", - INSTRUMENTAL = "блюспейс сумкой хранения", - PREPOSITIONAL = "блюспейс сумке хранения" + NOMINATIVE = "блюспейс спорт-сумка ", + GENITIVE = "блюспейс спорт-сумки ", + DATIVE = "блюспейс спорт-сумке ", + ACCUSATIVE = "блюспейс спорт-сумку ", + INSTRUMENTAL = "блюспейс спорт-сумкой ", + PREPOSITIONAL = "блюспейс спорт-сумке " ) /obj/item/storage/backpack/santabag From fd7750b684d2b93d4c2dc758cf959dcd00313ff2 Mon Sep 17 00:00:00 2001 From: Shark Github Date: Mon, 23 Feb 2026 02:29:06 +0800 Subject: [PATCH 4/9] =?UTF-8?q?=D0=9E=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=B8=20=D0=A2=D0=93=D0=A3=D0=98=20=D0=B0=D0=BB=D0=B5?= =?UTF-8?q?=D1=80=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/game/objects/items/weapons/storage/backpack.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index cec1ad803095..940c3f732727 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -53,7 +53,7 @@ /obj/item/storage/backpack/holding name = "Bag of Holding" - desc = "A backpack that opens into a localized pocket of Blue Space." + desc = "Очень большой и технологичный рюкзак, вмещает невероятное количество предметов благодаря подпространственной компрессии. Этикетка предупреждает \"Избегайте рекурсивного хранения\"." origin_tech = "bluespace=5;materials=4;engineering=4;plasmatech=5" icon_state = "holdingpack" item_state = "holdingpack" @@ -80,7 +80,7 @@ . = ATTACK_CHAIN_BLOCKED_ALL add_fingerprint(user) - var/response = tgui_alert(user, "This creates a singularity, destroying you and much of the station. Are you SURE?", "IMMINENT DEATH!", list("No", "Yes")) + var/response = tgui_alert(user, "Это создаст сингулярность, которая уничтожит вас и большую часть станции. Вы уверены?", "НЕИЗБЕЖНАЯ СМЕРТЬ!", list("Нет", "Да")) if(response != "Yes") return . @@ -121,7 +121,7 @@ /obj/item/storage/backpack/holding/satchel name = "Satchel of holding" - desc = "A satchel that opens into a localized pocket of Blue Space." + desc = "Очень большая и технологичная сумка, вмещает невероятное количество предметов благодаря подпространственной компрессии. Этикетка предупреждает \"Избегайте рекурсивного хранения\"." icon_state = "holdingsat" item_state = "holdingsat" From 3535ff9c9ed0af405dcdc4f8f7215a8324977656 Mon Sep 17 00:00:00 2001 From: Shark Github Date: Mon, 23 Feb 2026 02:31:00 +0800 Subject: [PATCH 5/9] =?UTF-8?q?if=20response=20!=3D=20=D0=94=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/game/objects/items/weapons/storage/backpack.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 940c3f732727..b58376d1c1b7 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -81,7 +81,7 @@ . = ATTACK_CHAIN_BLOCKED_ALL add_fingerprint(user) var/response = tgui_alert(user, "Это создаст сингулярность, которая уничтожит вас и большую часть станции. Вы уверены?", "НЕИЗБЕЖНАЯ СМЕРТЬ!", list("Нет", "Да")) - if(response != "Yes") + if(response != "Да") return . user.visible_message( From 0b397aa0bbe98b9ac203a77fbe3c86ec275e0411 Mon Sep 17 00:00:00 2001 From: Shark Github Date: Mon, 23 Feb 2026 02:33:20 +0800 Subject: [PATCH 6/9] =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B1=D0=B5=D0=BB=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/game/objects/items/weapons/storage/backpack.dm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index b58376d1c1b7..f7db08d2dc37 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -148,12 +148,12 @@ /obj/item/storage/backpack/holding/satchel/duffelbag/get_ru_names() return list( - NOMINATIVE = "блюспейс спорт-сумка ", - GENITIVE = "блюспейс спорт-сумки ", - DATIVE = "блюспейс спорт-сумке ", - ACCUSATIVE = "блюспейс спорт-сумку ", - INSTRUMENTAL = "блюспейс спорт-сумкой ", - PREPOSITIONAL = "блюспейс спорт-сумке " + NOMINATIVE = "блюспейс спорт-сумка", + GENITIVE = "блюспейс спорт-сумки", + DATIVE = "блюспейс спорт-сумке", + ACCUSATIVE = "блюспейс спорт-сумку", + INSTRUMENTAL = "блюспейс спорт-сумкой", + PREPOSITIONAL = "блюспейс спорт-сумке" ) /obj/item/storage/backpack/santabag From e862be8fcd7fa07d24838633022c1197851d956f Mon Sep 17 00:00:00 2001 From: Shark Github Date: Mon, 23 Feb 2026 14:56:09 +0800 Subject: [PATCH 7/9] =?UTF-8?q?=D0=BF=D0=BE=D0=BC=D0=B5=D0=BD=D1=8F=D0=BB?= =?UTF-8?q?=20desc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/game/objects/items/weapons/storage/backpack.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index f7db08d2dc37..ff6c11cfcdee 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -141,7 +141,7 @@ /obj/item/storage/backpack/holding/satchel/duffelbag name = "Duffelbag of holding" - desc = "Очень большая и технологичная сумка, вмещает невероятное количество предметов благодаря подпространственной компрессии. Этикетка предупреждает \"Избегайте рекурсивного хранения\"." + desc = "Очень большая и технологичная спортивная сумка, вмещает невероятное количество предметов благодаря подпространственной компрессии. Этикетка предупреждает \"Избегайте рекурсивного хранения\"." icon_state = "holdingduffelba" item_state = "holdingduffelba" max_combined_w_class = 40 From effa19db946e66e0a7f10d7bdc3e852c6d5140bc Mon Sep 17 00:00:00 2001 From: Shark Github Date: Mon, 23 Feb 2026 20:34:09 +0800 Subject: [PATCH 8/9] =?UTF-8?q?=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/game/objects/items/weapons/storage/backpack.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index ff6c11cfcdee..9d8fbb4448ef 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -53,7 +53,7 @@ /obj/item/storage/backpack/holding name = "Bag of Holding" - desc = "Очень большой и технологичный рюкзак, вмещает невероятное количество предметов благодаря подпространственной компрессии. Этикетка предупреждает \"Избегайте рекурсивного хранения\"." + desc = "Технологичный рюкзак, в сравнении с обычными, вмещает чрезмерное количество предметов благодаря подпространственной компрессии. Этикетка предупреждает \"Не совмещать с другими блюспейс технологиями\"." origin_tech = "bluespace=5;materials=4;engineering=4;plasmatech=5" icon_state = "holdingpack" item_state = "holdingpack" @@ -121,7 +121,7 @@ /obj/item/storage/backpack/holding/satchel name = "Satchel of holding" - desc = "Очень большая и технологичная сумка, вмещает невероятное количество предметов благодаря подпространственной компрессии. Этикетка предупреждает \"Избегайте рекурсивного хранения\"." + desc = "Технологичная сумка, в сравнении с обычными, вмещает чрезмерное количество предметов благодаря подпространственной компрессии. Этикетка предупреждает \"Не совмещать с другими блюспейс технологиями\"." icon_state = "holdingsat" item_state = "holdingsat" @@ -141,7 +141,7 @@ /obj/item/storage/backpack/holding/satchel/duffelbag name = "Duffelbag of holding" - desc = "Очень большая и технологичная спортивная сумка, вмещает невероятное количество предметов благодаря подпространственной компрессии. Этикетка предупреждает \"Избегайте рекурсивного хранения\"." + desc = "Очень большая и технологичная спортивная сумка, вмещает невероятное количество предметов благодаря подпространственной компрессии. Этикетка предупреждает \"Не совмещать с другими блюспейс технологиями\"." icon_state = "holdingduffelba" item_state = "holdingduffelba" max_combined_w_class = 40 From a9be4be31ae99e2433ff23aeaea522096372fe27 Mon Sep 17 00:00:00 2001 From: Shark Github Date: Tue, 24 Feb 2026 17:37:36 +0800 Subject: [PATCH 9/9] =?UTF-8?q?=D1=82=D1=8F=D0=B0=D0=BF=20=D0=BF=D1=8F?= =?UTF-8?q?=D0=B0=D0=BB=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../objects/items/weapons/storage/backpack.dm | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 9d8fbb4448ef..26c6f4758eae 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -53,7 +53,7 @@ /obj/item/storage/backpack/holding name = "Bag of Holding" - desc = "Технологичный рюкзак, в сравнении с обычными, вмещает чрезмерное количество предметов благодаря подпространственной компрессии. Этикетка предупреждает \"Не совмещать с другими блюспейс технологиями\"." + desc = "Технологичный рюкзак, в сравнении с обычными, вмещает чрезмерно большое количество предметов благодаря подпространственной компрессии. Этикетка предупреждает \"Не совмещать с технологиями телепортации\"." origin_tech = "bluespace=5;materials=4;engineering=4;plasmatech=5" icon_state = "holdingpack" item_state = "holdingpack" @@ -121,7 +121,7 @@ /obj/item/storage/backpack/holding/satchel name = "Satchel of holding" - desc = "Технологичная сумка, в сравнении с обычными, вмещает чрезмерное количество предметов благодаря подпространственной компрессии. Этикетка предупреждает \"Не совмещать с другими блюспейс технологиями\"." + desc = "Технологичная сумка, в сравнении с обычными, вмещает чрезмерно большое количество предметов благодаря подпространственной компрессии. Этикетка предупреждает \"Не совмещать с технологиями телепортации\"." icon_state = "holdingsat" item_state = "holdingsat" @@ -141,19 +141,19 @@ /obj/item/storage/backpack/holding/satchel/duffelbag name = "Duffelbag of holding" - desc = "Очень большая и технологичная спортивная сумка, вмещает невероятное количество предметов благодаря подпространственной компрессии. Этикетка предупреждает \"Не совмещать с другими блюспейс технологиями\"." + desc = "Очень большая и технологичная спортивная сумка, вмещает невероятное количество предметов благодаря подпространственной компрессии. Этикетка предупреждает \"Не совмещать с технологиями телепортации\"." icon_state = "holdingduffelba" item_state = "holdingduffelba" max_combined_w_class = 40 /obj/item/storage/backpack/holding/satchel/duffelbag/get_ru_names() return list( - NOMINATIVE = "блюспейс спорт-сумка", - GENITIVE = "блюспейс спорт-сумки", - DATIVE = "блюспейс спорт-сумке", - ACCUSATIVE = "блюспейс спорт-сумку", - INSTRUMENTAL = "блюспейс спорт-сумкой", - PREPOSITIONAL = "блюспейс спорт-сумке" + NOMINATIVE = "блюспейс спортивная сумка", + GENITIVE = "блюспейс спортивная сумки", + DATIVE = "блюспейс спортивная сумке", + ACCUSATIVE = "блюспейс спортивная сумку", + INSTRUMENTAL = "блюспейс спортивная сумкой", + PREPOSITIONAL = "блюспейс спортивная сумке" ) /obj/item/storage/backpack/santabag