From 2c59eed989b0cf9c1a45c46fe3dd3006409cffab Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 26 Feb 2025 19:59:17 +0300 Subject: [PATCH 1/3] initial --- modular_bandastation/objects/_objects.dme | 1 + .../objects/code/items/spy_spider.dm | 184 ++++++++++++++++++ .../objects/icons/obj/items/spy_spider.dmi | Bin 0 -> 420 bytes 3 files changed, 185 insertions(+) create mode 100644 modular_bandastation/objects/code/items/spy_spider.dm create mode 100644 modular_bandastation/objects/icons/obj/items/spy_spider.dmi diff --git a/modular_bandastation/objects/_objects.dme b/modular_bandastation/objects/_objects.dme index 5c341173d6c6c..1b3a8bc7fbbb1 100644 --- a/modular_bandastation/objects/_objects.dme +++ b/modular_bandastation/objects/_objects.dme @@ -16,6 +16,7 @@ #include "code/items/papers.dm" #include "code/items/stamp.dm" #include "code/items/wallets.dm" +#include "code/items/spy_spider.dm" #include "code/items/clothing/accessories/accessories.dm" #include "code/items/clothing/glasses/glasses.dm" #include "code/items/clothing/gloves/gloves.dm" diff --git a/modular_bandastation/objects/code/items/spy_spider.dm b/modular_bandastation/objects/code/items/spy_spider.dm new file mode 100644 index 0000000000000..acb450aa7311f --- /dev/null +++ b/modular_bandastation/objects/code/items/spy_spider.dm @@ -0,0 +1,184 @@ +/datum/controller/subsystem/radio/return_frequency(frequency) + if(frequency == SPY_SPIDER_FREQ) + return "spyradio" + return ..() + +/obj/item/clothing/accessory/spy_spider + name = "шпионский жучок" + desc = "Кажется, ты видел такого в фильмах про шпионов." + icon = 'modular_bandastation/objects/icons/obj/items/spy_spider.dmi' + icon_state = "spy_spider" + var/obj/item/radio/spider_transmitter/transmitter = null + +/obj/item/clothing/accessory/spy_spider/Initialize(mapload) + . = ..() + AddComponent(/datum/component/pinnable_accessory) + transmitter = new /obj/item/radio/spider_transmitter(src) + +/obj/item/clothing/accessory/spy_spider/Destroy() + QDEL_NULL(transmitter) + . = ..() + +/obj/item/clothing/accessory/spy_spider/examine(mob/user) + . = ..() + . += span_info("Сейчас он [transmitter.get_broadcasting() ? "включён" : "выключен"].") + +/obj/item/clothing/accessory/spy_spider/attack_self(mob/user, modifiers) + transmitter.ui_interact(user) + return ..() + +/obj/item/radio/spider_transmitter + name = "шпионский передатчик" + desc = "Кажется, ты видел такого в фильмах про шпионов." + icon = 'modular_bandastation/objects/icons/obj/items/spy_spider.dmi' + icon_state = "spy_spider" + canhear_range = 3 + radio_noise = FALSE + interaction_flags_atom = parent_type::interaction_flags_atom | INTERACT_ATOM_ALLOW_USER_LOCATION + +/obj/item/radio/spider_transmitter/Initialize(mapload) + . = ..() + set_listening(FALSE) + set_broadcasting(FALSE) + +/obj/item/radio/spider_transmitter/ui_state(mob/user) + return GLOB.always_state + +/obj/item/encryptionkey/spy_spider + name = "Spy Encryption Key" + icon = 'modular_bandastation/objects/icons/obj/items/spy_spider.dmi' + icon_state = "spy_cypherkey" + channels = list("Spy Spider" = TRUE) + +/obj/item/storage/lockbox/spy_kit + name = "набор жучков" + desc = "Не самый легальный из способов достать информацию, но какая разница, если никто не узнает?" + req_access = list(ACCESS_DETECTIVE) + +/obj/item/storage/lockbox/spy_kit/Initialize(mapload) + . = ..() + atom_storage.max_slots = 5 + atom_storage.max_specific_storage = WEIGHT_CLASS_SMALL + atom_storage.max_total_storage = 20 + atom_storage.locked = STORAGE_FULLY_LOCKED + new /obj/item/clothing/accessory/spy_spider(src) + new /obj/item/clothing/accessory/spy_spider(src) + new /obj/item/clothing/accessory/spy_spider(src) + new /obj/item/encryptionkey/spy_spider(src) + new /obj/item/encryptionkey/spy_spider(src) + +/** + * CLOTHING PART + */ +// /obj/item/clothing +// var/obj/item/radio/spy_spider/spy_spider_attached + +// /obj/item/clothing/Destroy() +// QDEL_NULL(spy_spider_attached) +// return ..() + +// /obj/item/clothing/emp_act(severity) +// . = ..() +// spy_spider_attached?.emp_act(severity) + +// /obj/item/clothing/Hear(mob/M, list/message_pieces) +// . = ..() +// spy_spider_attached?.Hear(M, message_pieces) + +// /obj/item/clothing/attack(obj/item/I, mob/user, params) +// if(!istype(I, /obj/item/radio/spy_spider)) +// return ..() +// if(spy_spider_attached || !((slot_flags & ITEM_SLOT_OCLOTHING) || (slot_flags & ITEM_SLOT_ICLOTHING))) +// to_chat(user, span_warning("Ты не находишь места для жучка!")) +// return TRUE +// var/obj/item/radio/spy_spider/spy_spider = I + +// if(!spy_spider.broadcasting) +// to_chat(user, span_warning("Жучок выключен!")) +// return TRUE + +// if(!user.temporarilyRemoveItemFromInventory(spy_spider)) +// return FALSE +// spy_spider.forceMove(src) +// spy_spider_attached = spy_spider +// to_chat(user, span_info("Ты незаметно прикрепляешь жучок к [src].")) +// return TRUE + +// /obj/item/clothing/proc/remove_spy_spider(cloth_uid, spider_uid) +// if(!in_range(src, usr)) +// to_chat(usr, span_info("Тебе нужно подойти ближе, чтобы снять жучок с [src.declent_ru(GENITIVE)].")) +// return +// if(usr.stat || HAS_TRAIT(usr, TRAIT_HANDS_BLOCKED) || usr.incapacitated) +// to_chat(usr, span_info("Тебе нужны свободные руки для этого")) +// return +// if(isnull(src.spy_spider_attached)) +// to_chat(usr, span_info("На [src.declent_ru(PREPOSITIONAL)] нет жучка.")) +// return + +// var/obj/item/I = locate(spider_uid) +// if(do_after(usr, 3 SECONDS, target = src, NEED_HANDS = TRUE)) +// if(usr.put_in_hands(I)) +// usr.visible_message("[capitalize(usr.declent_ru(NOMINATIVE))] что-то снимает с [src.declent_ru(GENITIVE)] !", span_notice("Вы успешно снимаете жучок с [src.declent_ru(ACCUSATIVE)].")) +// else +// I.forceMove(get_turf(src)) +// usr.visible_message("[capitalize(usr.declent_ru(NOMINATIVE))] роняет шпионский жучок на пол.", span_notice("Вы роняете жучок на пол.")) +// spy_spider_attached = null + +// /obj/item/clothing/Topic(href, href_list) +// . = ..() +// remove_spy_spider(href_list["src"], href_list["remove_spy_spider"]) + +// /** +// * HUMAN PART +// */ +// /mob/living/carbon/human/proc/attack(obj/item/I, mob/living/user, def_zone) +// // if(!istype(I, /obj/item/radio/spy_spider)) +// // return ..() + +// if(!(w_uniform || wear_suit)) +// to_chat(user, span_warning("У тебя нет желания лезть к [src.declent_ru(GENITIVE)] в трусы. Жучок надо крепить на одежду!")) +// return TRUE + +// var/obj/item/radio/spy_spider/spy_spider = I +// var/obj/item/clothing/clothing_for_attach = wear_suit || w_uniform +// if(clothing_for_attach.spy_spider_attached) +// to_chat(user, span_warning("Ты не находишь места для жучка!")) +// return TRUE + +// if(!spy_spider.broadcasting) +// to_chat(user, span_warning("Жучок выключен!")) +// return TRUE + +// var/attempt_cancel_message = span_warning("Ты не успеваешь установить жучок.") +// if(!do_after(user, 3 SECONDS, TRUE, src, TRUE, attempt_cancel_message)) +// return TRUE + +// //user.unequip_to(spy_spider, clothing_for_attach) +// user.doUnEquip(spy_spider, FALSE, clothing_for_attach) + +// clothing_for_attach.spy_spider_attached = spy_spider +// to_chat(user, span_info("Ты незаметно прикрепляешь жучок к одежде [src.declent_ru(ACCUSATIVE)].")) +// return TRUE + +// /obj/item/clothing/suit/storage/attack(obj/item/W as obj, mob/user as mob, params) +// if(istype(W, /obj/item/radio/spy_spider)) +// return +// . = ..() + +// Spy spider detection +/obj/item/detective_scanner/scan(atom/A, mob/user) + . = ..() + + if(!scanner_busy) + scanner_busy = TRUE + + if(istype(A, /obj/item/clothing)) + var/obj/item/clothing/scanned_clothing = A + usr.visible_message("[capitalize(usr.declent_ru(NOMINATIVE))] сканирует одежду на наличие шпиоского устройства.") + + // if(scanned_clothing.spy_spider_attached) + // // Triger /obj/item/clothing/Topic + // add_log(span_info("Найдено шпионское устройство!")) + // else + // usr.visible_message("Но ничего не находит") + scanner_busy = FALSE diff --git a/modular_bandastation/objects/icons/obj/items/spy_spider.dmi b/modular_bandastation/objects/icons/obj/items/spy_spider.dmi new file mode 100644 index 0000000000000000000000000000000000000000..85edd2915d11dfa9f90cb7df00c3ed988372e491 GIT binary patch literal 420 zcmV;V0bBlwP)nP1GQPMVGbOc1iHkEOv#1y-XvoExR+N~V3SpxtO|C4+NG-}vt;D5T zS;5uM1?&<4k^U-ry}Uew00029NklXkaa6tgga>d68A&yZ2d3FMpaF2e Date: Fri, 28 Feb 2025 22:33:01 +0300 Subject: [PATCH 2/3] cleanup and fixes --- .../items/clothing/accessories/accessories.dm | 12 ++ .../objects/code/items/spy_spider.dm | 140 ++---------------- 2 files changed, 21 insertions(+), 131 deletions(-) diff --git a/modular_bandastation/objects/code/items/clothing/accessories/accessories.dm b/modular_bandastation/objects/code/items/clothing/accessories/accessories.dm index 7ff6d5ce08040..23e179e0af93d 100644 --- a/modular_bandastation/objects/code/items/clothing/accessories/accessories.dm +++ b/modular_bandastation/objects/code/items/clothing/accessories/accessories.dm @@ -1,3 +1,15 @@ +/obj/item/clothing/accessory/stealth + +/obj/item/clothing/accessory/stealth/on_uniform_equipped(obj/item/clothing/under/source, mob/living/user, slot) + src.icon = null + . = ..() + source.attached_accessories -= src + +/obj/item/clothing/accessory/stealth/on_uniform_dropped(obj/item/clothing/under/source, mob/living/user) + src.icon = initial(src.icon) + source.attached_accessories += src + . = ..() + /obj/item/clothing/suit/apron/chef/red name = "красный фартук" icon = 'modular_bandastation/objects/icons/obj/clothing/accessories.dmi' diff --git a/modular_bandastation/objects/code/items/spy_spider.dm b/modular_bandastation/objects/code/items/spy_spider.dm index acb450aa7311f..abff4a9e927ad 100644 --- a/modular_bandastation/objects/code/items/spy_spider.dm +++ b/modular_bandastation/objects/code/items/spy_spider.dm @@ -1,29 +1,25 @@ -/datum/controller/subsystem/radio/return_frequency(frequency) - if(frequency == SPY_SPIDER_FREQ) - return "spyradio" - return ..() - -/obj/item/clothing/accessory/spy_spider +/obj/item/clothing/accessory/stealth/spy_spider name = "шпионский жучок" desc = "Кажется, ты видел такого в фильмах про шпионов." icon = 'modular_bandastation/objects/icons/obj/items/spy_spider.dmi' icon_state = "spy_spider" + worn_icon = null var/obj/item/radio/spider_transmitter/transmitter = null -/obj/item/clothing/accessory/spy_spider/Initialize(mapload) +/obj/item/clothing/accessory/stealth/spy_spider/Initialize(mapload) . = ..() AddComponent(/datum/component/pinnable_accessory) transmitter = new /obj/item/radio/spider_transmitter(src) -/obj/item/clothing/accessory/spy_spider/Destroy() +/obj/item/clothing/accessory/stealth/spy_spider/Destroy() QDEL_NULL(transmitter) . = ..() -/obj/item/clothing/accessory/spy_spider/examine(mob/user) +/obj/item/clothing/accessory/stealth/spy_spider/examine(mob/user) . = ..() . += span_info("Сейчас он [transmitter.get_broadcasting() ? "включён" : "выключен"].") -/obj/item/clothing/accessory/spy_spider/attack_self(mob/user, modifiers) +/obj/item/clothing/accessory/stealth/spy_spider/attack_self(mob/user, modifiers) transmitter.ui_interact(user) return ..() @@ -61,124 +57,6 @@ atom_storage.max_specific_storage = WEIGHT_CLASS_SMALL atom_storage.max_total_storage = 20 atom_storage.locked = STORAGE_FULLY_LOCKED - new /obj/item/clothing/accessory/spy_spider(src) - new /obj/item/clothing/accessory/spy_spider(src) - new /obj/item/clothing/accessory/spy_spider(src) - new /obj/item/encryptionkey/spy_spider(src) - new /obj/item/encryptionkey/spy_spider(src) - -/** - * CLOTHING PART - */ -// /obj/item/clothing -// var/obj/item/radio/spy_spider/spy_spider_attached - -// /obj/item/clothing/Destroy() -// QDEL_NULL(spy_spider_attached) -// return ..() - -// /obj/item/clothing/emp_act(severity) -// . = ..() -// spy_spider_attached?.emp_act(severity) - -// /obj/item/clothing/Hear(mob/M, list/message_pieces) -// . = ..() -// spy_spider_attached?.Hear(M, message_pieces) - -// /obj/item/clothing/attack(obj/item/I, mob/user, params) -// if(!istype(I, /obj/item/radio/spy_spider)) -// return ..() -// if(spy_spider_attached || !((slot_flags & ITEM_SLOT_OCLOTHING) || (slot_flags & ITEM_SLOT_ICLOTHING))) -// to_chat(user, span_warning("Ты не находишь места для жучка!")) -// return TRUE -// var/obj/item/radio/spy_spider/spy_spider = I - -// if(!spy_spider.broadcasting) -// to_chat(user, span_warning("Жучок выключен!")) -// return TRUE - -// if(!user.temporarilyRemoveItemFromInventory(spy_spider)) -// return FALSE -// spy_spider.forceMove(src) -// spy_spider_attached = spy_spider -// to_chat(user, span_info("Ты незаметно прикрепляешь жучок к [src].")) -// return TRUE - -// /obj/item/clothing/proc/remove_spy_spider(cloth_uid, spider_uid) -// if(!in_range(src, usr)) -// to_chat(usr, span_info("Тебе нужно подойти ближе, чтобы снять жучок с [src.declent_ru(GENITIVE)].")) -// return -// if(usr.stat || HAS_TRAIT(usr, TRAIT_HANDS_BLOCKED) || usr.incapacitated) -// to_chat(usr, span_info("Тебе нужны свободные руки для этого")) -// return -// if(isnull(src.spy_spider_attached)) -// to_chat(usr, span_info("На [src.declent_ru(PREPOSITIONAL)] нет жучка.")) -// return - -// var/obj/item/I = locate(spider_uid) -// if(do_after(usr, 3 SECONDS, target = src, NEED_HANDS = TRUE)) -// if(usr.put_in_hands(I)) -// usr.visible_message("[capitalize(usr.declent_ru(NOMINATIVE))] что-то снимает с [src.declent_ru(GENITIVE)] !", span_notice("Вы успешно снимаете жучок с [src.declent_ru(ACCUSATIVE)].")) -// else -// I.forceMove(get_turf(src)) -// usr.visible_message("[capitalize(usr.declent_ru(NOMINATIVE))] роняет шпионский жучок на пол.", span_notice("Вы роняете жучок на пол.")) -// spy_spider_attached = null - -// /obj/item/clothing/Topic(href, href_list) -// . = ..() -// remove_spy_spider(href_list["src"], href_list["remove_spy_spider"]) - -// /** -// * HUMAN PART -// */ -// /mob/living/carbon/human/proc/attack(obj/item/I, mob/living/user, def_zone) -// // if(!istype(I, /obj/item/radio/spy_spider)) -// // return ..() - -// if(!(w_uniform || wear_suit)) -// to_chat(user, span_warning("У тебя нет желания лезть к [src.declent_ru(GENITIVE)] в трусы. Жучок надо крепить на одежду!")) -// return TRUE - -// var/obj/item/radio/spy_spider/spy_spider = I -// var/obj/item/clothing/clothing_for_attach = wear_suit || w_uniform -// if(clothing_for_attach.spy_spider_attached) -// to_chat(user, span_warning("Ты не находишь места для жучка!")) -// return TRUE - -// if(!spy_spider.broadcasting) -// to_chat(user, span_warning("Жучок выключен!")) -// return TRUE - -// var/attempt_cancel_message = span_warning("Ты не успеваешь установить жучок.") -// if(!do_after(user, 3 SECONDS, TRUE, src, TRUE, attempt_cancel_message)) -// return TRUE - -// //user.unequip_to(spy_spider, clothing_for_attach) -// user.doUnEquip(spy_spider, FALSE, clothing_for_attach) - -// clothing_for_attach.spy_spider_attached = spy_spider -// to_chat(user, span_info("Ты незаметно прикрепляешь жучок к одежде [src.declent_ru(ACCUSATIVE)].")) -// return TRUE - -// /obj/item/clothing/suit/storage/attack(obj/item/W as obj, mob/user as mob, params) -// if(istype(W, /obj/item/radio/spy_spider)) -// return -// . = ..() - -// Spy spider detection -/obj/item/detective_scanner/scan(atom/A, mob/user) - . = ..() - - if(!scanner_busy) - scanner_busy = TRUE - - if(istype(A, /obj/item/clothing)) - var/obj/item/clothing/scanned_clothing = A - usr.visible_message("[capitalize(usr.declent_ru(NOMINATIVE))] сканирует одежду на наличие шпиоского устройства.") - - // if(scanned_clothing.spy_spider_attached) - // // Triger /obj/item/clothing/Topic - // add_log(span_info("Найдено шпионское устройство!")) - // else - // usr.visible_message("Но ничего не находит") - scanner_busy = FALSE + new /obj/item/clothing/accessory/stealth/spy_spider(src) + new /obj/item/clothing/accessory/stealth/spy_spider(src) + new /obj/item/clothing/accessory/stealth/spy_spider(src) From c38a23004fa20b11c90a938306edfdad356dc1bd Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 28 Feb 2025 22:44:06 +0300 Subject: [PATCH 3/3] silent pin --- modular_bandastation/objects/code/items/spy_spider.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_bandastation/objects/code/items/spy_spider.dm b/modular_bandastation/objects/code/items/spy_spider.dm index abff4a9e927ad..00e4afc441aa0 100644 --- a/modular_bandastation/objects/code/items/spy_spider.dm +++ b/modular_bandastation/objects/code/items/spy_spider.dm @@ -8,7 +8,7 @@ /obj/item/clothing/accessory/stealth/spy_spider/Initialize(mapload) . = ..() - AddComponent(/datum/component/pinnable_accessory) + AddComponent(/datum/component/pinnable_accessory, silent = TRUE) transmitter = new /obj/item/radio/spider_transmitter(src) /obj/item/clothing/accessory/stealth/spy_spider/Destroy()