diff --git a/mods/global_modpacks.dm b/mods/global_modpacks.dm index c489044b7a97c..28bd9ef885946 100644 --- a/mods/global_modpacks.dm +++ b/mods/global_modpacks.dm @@ -45,5 +45,6 @@ #include "chemtweaks/_chemtweaks.dme" #include "diona/_diona.dme" #include "simplangs/simplangs.dme" +#include "item_identification/_item_identification.dme" #include "../packs/sierra-tweaks/_pack.dm" diff --git a/mods/item_identification/README.md b/mods/item_identification/README.md new file mode 100644 index 0000000000000..8bcdae05b15dc --- /dev/null +++ b/mods/item_identification/README.md @@ -0,0 +1,39 @@ + +#### Список PRов: + +- https://github.com/SierraBay/SierraBay12/pull/2986 + + +## Идентификация предметов + +ID мода: ITEM_IDENTIFICATION + + +### Описание мода + +Добавляет верб Inspect к предметам для идентификации предметов антага прямо через функционал. + + +### Изменения *кор кода* + +- Отсутствуют + + +### Оверрайды + +- Отсутствуют + + +### Дефайны + +- Отсутствуют + + +### Используемые файлы, не содержащиеся в модпаке + +- Отсутствуют + + +### Авторы: + +Builder13 diff --git a/mods/item_identification/_item_identification.dm b/mods/item_identification/_item_identification.dm new file mode 100644 index 0000000000000..720711ac63f37 --- /dev/null +++ b/mods/item_identification/_item_identification.dm @@ -0,0 +1,4 @@ +/singleton/modpack/item_identification + name = "Идентификация предметов" + desc = "Добавляет верб Inspect к предметам для идентификации предметов антага прямо через функционал." + author = "Builder13" diff --git a/mods/item_identification/_item_identification.dme b/mods/item_identification/_item_identification.dme new file mode 100644 index 0000000000000..9115d32646792 --- /dev/null +++ b/mods/item_identification/_item_identification.dme @@ -0,0 +1,10 @@ +#ifndef MODPACK_ITEM_IDENTIFICATION +#define MODPACK_ITEM_IDENTIFICATION + +#include "_item_identification.dm" + + +#include "code/item_identification.dm" +#include "code/items/traitor.dm" + +#endif diff --git a/mods/item_identification/code/item_identification.dm b/mods/item_identification/code/item_identification.dm new file mode 100644 index 0000000000000..d6977e4c85b66 --- /dev/null +++ b/mods/item_identification/code/item_identification.dm @@ -0,0 +1,298 @@ +/obj/item + var/list/mod_skill_identification = list() + +/obj/item/proc/update_mod_identification() + return + +/mob/verb/mod_skill_examine(obj/item/I as obj in view()) + set name = "Inspect" + set category = "IC" + + mod_skill_examinate(usr, I) + +/proc/mod_skill_examinate(mob/user, atom/A) + if ((is_blind(user) || user.stat) && !isobserver(user)) + to_chat(user, SPAN_NOTICE("Something is there but you can't see it.")) + return + user.face_atom(A) + if (user.simulated) + if (A.loc != user || user.IsHolding(A)) + for (var/mob/M in viewers(4, user)) + if (M == user) + continue + if (M.client && M.client.get_preference_value(/datum/client_preference/examine_messages) == GLOB.PREF_SHOW) + if (M.is_blind() || user.is_invisible_to(M)) + continue + to_chat(M, SPAN_SUBTLE("\The [user] looks at \the [A].")) + + var/is_adjacent = FALSE + if (!isghost(user) && user.stat != DEAD) + is_adjacent = user.Adjacent(A) + + if(is_adjacent && !user.incapacitated()) + var/obj/item/I = A + if(istype(I)) + var/datum/extension/interactive/mod_inspect/MI = get_or_create_extension(user, /datum/extension/interactive/mod_inspect) + MI.examine_item(user, I) + +/datum/extension/interactive/mod_inspect + var/list/additional_users = list() + var/obj/item/identify_item + var/list/request_timeouts = list() + +/datum/extension/interactive/mod_inspect/proc/examine_item(mob/user, obj/item/I) + var/w_width = 350 + var/w_height = 400 + + if(identify_item && I != identify_item) + additional_users = list() + + identify_item = I + + var/list/HTML = list() + HTML += "[identify_item.name]" + + HTML += "\[Refresh\]
" + HTML += "Инспектируют предмет:
" + HTML += "[user.name]
" + for(var/user_ref in additional_users) + var/user_name = additional_users[user_ref]["name"] + HTML += "[user_name] \[-\]
" + + HTML += "\[Добавить человека\]

" + + HTML += "\[Инспектировать предмет\]" + + HTML += "
" + HTML += "Вместо этого вы можете начать фейк инспекцию предмета, тогда ваши навыки не будут задействованы для осмотра. Но при этом добавленные вами люди все еще могут задействовать свои навыки для инспекции.
" + HTML += "\[Фейк инспекция предмета\]" + + if(user.mind && player_is_antag(user.mind)) + HTML += "
" + HTML += "Так как вы антаг, то можете произвести проверку предмета, как если бы у вас были максимальные навыки в каждой области.
" + HTML += "\[Гарантированно инспектировать предмет\]" + w_height += 100 + + HTML += "" + + var/datum/browser/popup = new(user, "mod_examine_item", "[I.name]", w_width, w_height) + popup.set_content(jointext(HTML,null)) + popup.open() + +/datum/extension/interactive/mod_inspect/proc/identify_item(mob/user, inspect_intent = 0) + var/list/all_users = additional_users.Copy() + + var/orig_intention = 1 + + if(inspect_intent == 1) + orig_intention = 0 + + if(inspect_intent == 2) + orig_intention = 2 + + all_users[user] = list("name" = user.name, "intention" = orig_intention) + var/list/max_skills = list() + + for(var/key in all_users) + var/intention = all_users[key]["intention"] + if(intention > 0) + var/mob/M = key + if (istype(M) && M.skillset) + for(var/singleton/hierarchy/skill/S in GLOB.skills) + var/skill_val = M.get_skill_value(S.type) + + if(intention == 2) + skill_val = SKILL_MAX + + if(!max_skills[S.type] || max_skills[S.type] < skill_val) + max_skills[S.type] = skill_val + + var/starting_message = "[user] начал детальный осмотр [identify_item.name]" + + if(LAZYLEN(additional_users)) + starting_message += " вместе с:" + for(var/auser in additional_users) + var/auser_name = additional_users[auser]["name"] + starting_message += " [auser_name]" + starting_message += "." + + user.visible_message(starting_message) + + var/done = do_after(user, 10 SECONDS, identify_item, DO_PUBLIC_UNIQUE) + + if(done) + if(user.incapacitated()) + to_chat(user, SPAN_WARNING("Вы не смогли произвести осмотр.")) + return + + if(!identify_item || !user.Adjacent(identify_item)) + to_chat(user, SPAN_WARNING("Предмет для осмотра не рядом.")) + return + + if(additional_users) + for(var/auser in additional_users) + var/mob/living/A = auser + var/auser_name = additional_users[auser]["name"] + if(!user.Adjacent(auser)) + to_chat(user, SPAN_WARNING("[auser_name] не рядом.")) + return + if(A.incapacitated() || A.stat == DEAD || !A.client) + to_chat(user, SPAN_WARNING("[auser_name] недоступен для участия в осмотре.")) + return + + identify_item.update_mod_identification() + if(identify_item && LAZYLEN(identify_item.mod_skill_identification)) + for(var/index in identify_item.mod_skill_identification) + var/success_text = identify_item.mod_skill_identification[index]["success"] + var/failure_text = identify_item.mod_skill_identification[index]["failure"] + var/logic = identify_item.mod_skill_identification[index]["LOGIC"] + + var/success = 0 + var/prevent_success = 0 + + for(var/skill in identify_item.mod_skill_identification[index]["skillcheck"]) + var/skill_level = identify_item.mod_skill_identification[index]["skillcheck"][skill] + + if(max_skills[skill] >= skill_level) + success = 1 + + if(logic && logic == "AND" && max_skills[skill] < skill_level) + prevent_success = 1 + + + if(success && !prevent_success) + if(success_text) + for(var/U in all_users) + to_chat(U, success_text) + else + if(failure_text) + for(var/U in all_users) + to_chat(U, failure_text) + else + for(var/U in all_users) + to_chat(U, SPAN_NOTICE("Вы не смогли что-либо обнаружить.")) + + else + for(var/U in all_users) + to_chat(U, SPAN_NOTICE("Вы не смогли что-либо обнаружить.")) + +/datum/extension/interactive/mod_inspect/proc/add_person(mob/user) + var/list/possible_targets = list() + var/list/starting_targets + + starting_targets = view_or_range(1, user, "view") + + for(var/mob/living/M in starting_targets) + if(M == user) + continue + possible_targets += M + + if(length(possible_targets)) + var/choice = input("Choose a mob", "Mob") as null | mob in possible_targets + + if(choice) + var/mob/living/chosen = choice + if(chosen == user) + to_chat(user, SPAN_WARNING("Нельзя выбирать себя.")) + return + + if(additional_users[chosen]) + to_chat(user, SPAN_WARNING("[chosen.name] уже участвует в осмотре.")) + return + + if(!user.Adjacent(chosen)) + to_chat(user, SPAN_WARNING("[chosen.name] слишком далеко.")) + return + + if(user.incapacitated() || chosen.incapacitated()) + to_chat(user, SPAN_WARNING("[chosen.name] недоступен для осмотра.")) + return + + request_player(chosen, 30 SECONDS) + +/datum/extension/interactive/mod_inspect/proc/request_player(mob/target, request_timeout) + if(request_timeouts[target] && world.time < request_timeouts[target]) + to_chat(usr, SPAN_WARNING("Обращение уже недавно отправлялось.")) + return + + request_timeouts[target] = world.time + request_timeout + if(target.client) + to_chat(target, SPAN_BOLD("Вас запрашивают помочь с инспекцией предмета. В случае выбора фейк помощи вы будете принимать участие в осмотре, но ваши навыки не будут задействованы для осмотра. (Помочь)(Фейк помощь)")) + + if(target.mind && player_is_antag(target.mind)) + to_chat(target, SPAN_BOLD("Так как вы антаг, то можете помочь с проверкой предмета, как если бы у вас были максимальные навыки в каждой области. (Гарантированная помощь)")) + +/datum/extension/interactive/mod_inspect/Topic(href, href_list) + . = ..() + if(href_list["add_person"]) + if(usr.stat == DEAD) + return + + add_person(usr) + return TRUE + + if(href_list["inspect"]) + if(usr.incapacitated() || usr.stat == DEAD) + return + + if(!identify_item || !usr.Adjacent(identify_item)) + to_chat(usr, SPAN_WARNING("Предмет для осмотра не рядом.")) + return + + if(additional_users) + for(var/auser in additional_users) + var/mob/living/A = auser + var/auser_name = additional_users[auser]["name"] + if(!usr.Adjacent(auser)) + to_chat(usr, SPAN_WARNING("[auser_name] не рядом.")) + return + if(A.incapacitated() || A.stat == DEAD || !A.client) + to_chat(usr, SPAN_WARNING("[auser_name] недоступен для участия в осмотре.")) + return + + var/inspect_intent = text2num(href_list["inspect_intent"]) + + if(inspect_intent == 2) + if(!usr.mind || !player_is_antag(usr.mind)) + to_chat(usr, SPAN_WARNING("Вы не антаг.")) + return + + identify_item(usr, inspect_intent) + return TRUE + + if(href_list["candidate"]) + var/mob/living/candidate = locate(href_list["candidate"]) + + if(additional_users[candidate]) + to_chat(usr, SPAN_WARNING("Вы уже участвуете в осмотре [identify_item.name].")) + return + + if(candidate.incapacitated()) + return + + if(request_timeouts[candidate] && world.time > request_timeouts[candidate]) + to_chat(usr, SPAN_WARNING("Срок обращения истечен.")) + return + + var/inspect_intent = text2num(href_list["intention"]) + + if(inspect_intent == 2) + if(!usr.mind || !player_is_antag(usr.mind)) + to_chat(usr, SPAN_WARNING("Вы не антаг.")) + return + + to_chat(holder, SPAN_WARNING("[candidate.name] соглашается участвовать в осмотре [identify_item.name].")) + additional_users[usr] = list("name" = candidate.name, "intention" = inspect_intent) + return TRUE + + if(href_list["remove_person"]) + var/mob/living/P = locate(href_list["remove_person"]) + + if(istype(P) && additional_users[P]) + additional_users.Remove(P) + examine_item(usr, identify_item) + return TRUE + + if(href_list["refresh"]) + examine_item(usr, identify_item) + return TRUE \ No newline at end of file diff --git a/mods/item_identification/code/items/traitor.dm b/mods/item_identification/code/items/traitor.dm new file mode 100644 index 0000000000000..75fcba80d9671 --- /dev/null +++ b/mods/item_identification/code/items/traitor.dm @@ -0,0 +1,668 @@ +/obj/item/device/augment_implanter/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Благодаря обширным знаниям комплексных устройств, вы идентифицируете эту коробочку как имплантер аугментаций."), + "skillcheck" = list( + SKILL_DEVICES = SKILL_EXPERIENCED, + ) + ) + ) + +/obj/item/grenade/supermatter/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Вашей обширной экспертизы в области оружия или сложных устройств достаточно, чтобы определить, что в этой гранате находится небольшой кусочек суперматерии"), + "failure" = SPAN_BAD("Выглядит как светошумовая граната с очень яркой раскраской."), + "skillcheck" = list( + SKILL_WEAPONS = SKILL_MASTER, + SKILL_DEVICES = SKILL_EXPERIENCED + ) + ) + ) + +/obj/item/grenade/anti_photon/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Вашей экспертизы в области оружия или сложных устройств достаточно, чтобы определить, что эта граната способна рассеивать фотоны, и тем самым гасить видимый свет в области своего использования."), + "failure" = SPAN_BAD("Выглядит как ЭМИ граната."), + "skillcheck" = list( + SKILL_WEAPONS = SKILL_EXPERIENCED, + SKILL_DEVICES = SKILL_TRAINED + ) + ) + ) + +/obj/item/rig_module/electrowarfare_suite/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Ваших знаний сложных устройств или оружия достаточно, чтобы понять, что модификации предоставляемые этим модулем усложняют слежку со стороны ИИ."), + "failure" = SPAN_BAD("Вы не можете определить назначение модуля."), + "skillcheck" = list( + SKILL_DEVICES = SKILL_BASIC, + SKILL_WEAPONS = SKILL_BASIC + ) + ) + ) + +/obj/item/rig_module/voice/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Ваших знаний сложных устройств или оружия достаточно, чтобы понять, что этот модуль предоставляет возможность синтеза голоса по заданным параметрам."), + "failure" = SPAN_BAD("Вы не можете определить назначение модуля."), + "skillcheck" = list( + SKILL_DEVICES = SKILL_BASIC, + SKILL_WEAPONS = SKILL_BASIC + ) + ) + ) + +/obj/item/rig_module/power_sink/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Ваших знаний сложных устройств или оружия достаточно, чтобы понять, что этот модуль может быть задействован для подпитки энергетических резервов костюма напрямую через выкачивание энергии из внешних источников."), + "failure" = SPAN_BAD("Вы не можете определить назначение модуля."), + "skillcheck" = list( + SKILL_DEVICES = SKILL_BASIC, + SKILL_WEAPONS = SKILL_BASIC + ) + ) + ) + +/obj/item/rig_module/fabricator/energy_net/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Ваших знаний сложных устройств или оружия достаточно, чтобы понять, что это комплексный энергетический проектор, способный создавать энергетическую сеть для захвата цели."), + "failure" = SPAN_BAD("Вы не можете определить назначение модуля."), + "skillcheck" = list( + SKILL_DEVICES = SKILL_TRAINED, + SKILL_WEAPONS = SKILL_TRAINED + ) + ) + ) + +/obj/item/material/harpoon/bomb/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Ваших знаний сложных устройств или оружия достаточно, чтобы понять, что на конце гарпуна установлена взрывчатка, которая предположительно должна сработать при броске в цель."), + "failure" = SPAN_BAD("Очевидно, выглядит как гарпун, но вы не можете понять что за устройство находится на его конце."), + "skillcheck" = list( + SKILL_DEVICES = SKILL_TRAINED, + SKILL_WEAPONS = SKILL_TRAINED + ) + ) + ) + +/obj/item/melee/energy/sword/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Ваших знаний сложных устройств или ближнего боя достаточно, чтобы понять, что это рукоять энергетического клинка. При активации рукояти из нее проецируется поток энергии, который может быть мощной разрезающей силой."), + "skillcheck" = list( + SKILL_COMBAT = SKILL_BASIC, + SKILL_DEVICES = SKILL_BASIC + ) + ) + ) + +/obj/item/clothing/head/helmet/space/psi_amp/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Ваших обширных знаний в медицине и сложных устройствах достаточно, для того чтобы определить, что это устройство используется для значительного сильного усиления латентных пси способностей путем прямого вмешательства в работу мозга. Подключение к мозгу возможно после выбора мозговой карты на устройстве. При активации короны, будет просверлено несколько отверстий к мозгу с применением анестезии."), + "failure" = SPAN_BAD("Выглядит как несуразная диадема. Даже если принять это за головной убор, то вам абсолютно ничего неизвестно про установку его в мозг, лишь исходя из этого осмотра."), + "skillcheck" = list( + SKILL_MEDICAL = SKILL_MASTER, + SKILL_DEVICES = SKILL_MASTER + ), + "LOGIC" = "AND" + ) + ) + + +/obj/item/device/encryptionkey/syndicate/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Ваших знаний информационных технологий достаточно, чтобы понять, что данный ключ использует незнакомый вам шифрключ и ссылается на незнакомую частоту."), + "skillcheck" = list( + SKILL_COMPUTER = SKILL_TRAINED + ) + ) + ) + +/obj/item/plastique/update_mod_identification() + mod_skill_identification = list( + "device_usage" = list( + "success" = SPAN_GOOD("Вашей экспертизы в различном оружии было бы достаточно для использования этой взрывчатки."), + "failure" = SPAN_BAD("Вы понимаете, что не смогли бы использовать эту взрывчатку при необходимости."), + "skillcheck" = list( + SKILL_WEAPONS = SKILL_TRAINED + ) + ), + "device_info" = list( + "success" = SPAN_GOOD("Вы определяете, что это C-4."), + "failure" = SPAN_BAD("Вы понимаете что это взрывчатка, но не можете определить ее тип."), + "skillcheck" = list( + SKILL_FORENSICS = SKILL_TRAINED + ) + ) + ) + +/* +/obj/item/reagent_containers/glass/bottle/dye/polychromic/strong/update_mod_identification() + var/reagent_is_there = "содержит" + if(!reagents.has_reagent(/datum/reagent/dye/strong)) + reagent_is_there = "содержала" + + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Вашей экспертизы в области химии или готовки достаточно, чтобы понять, что данная емкость [reagent_is_there] краситель."), + "skillcheck" = list( + SKILL_CHEMISTRY = SKILL_TRAINED, + SKILL_COOKING = SKILL_EXPERIENCED + ) + ) + ) +*/ + +/obj/item/device/encryptionkey/syndie_full/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Ваших знаний информационных технологий достаточно, чтобы понять, что данный ключ использует множество шифрключей и частот для возможности прослушки всего радио эфира. Должно быть наподобие того, как устроен ключ шифрования у Капитана. Но дополнительно еще есть доступ к незнакомой частоте."), + "skillcheck" = list( + SKILL_COMPUTER = SKILL_TRAINED + ) + ) + ) + +/obj/item/door_charge/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Ваших оружейных знаний хватает, чтобы понять, что это растяжка для шлюзов."), + "failure" = SPAN_BAD("Выглядит действительно подозрительно, но вы не можете понять что это за устройство."), + "skillcheck" = list( + SKILL_WEAPONS = SKILL_TRAINED + ) + ) + ) + +/obj/item/shield_diffuser/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Ваших знаний криминалистики или сложных устройств достаточно, чтобы понять, что это миниатюрный рассеиватель энергощитов"), + "skillcheck" = list( + SKILL_DEVICES = SKILL_TRAINED, + SKILL_FORENSICS = SKILL_EXPERIENCED + ) + ) + ) + +/obj/item/stamp/chameleon/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Ваших обширных знаний криминалистики достаточно, чтобы понять, что это изменяемая печать для подделки документов."), + "skillcheck" = list( + SKILL_FORENSICS = SKILL_EXPERIENCED + ) + ) + ) + +/obj/item/pen/chameleon/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Ваших обширных знаний криминалистики достаточно, чтобы понять, что это специальная ручка для подмены стиля написания."), + "skillcheck" = list( + SKILL_FORENSICS = SKILL_EXPERIENCED + ) + ) + ) + +/obj/item/device/scanner/health/syndie/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Базовых знаний сложных устройств вам достаточно для того чтобы найти посторонний микролазер на корпусе анализатора. Он способен облучать сканируемую цель."), + "skillcheck" = list( + SKILL_DEVICES = SKILL_BASIC + ) + ) + ) + +/obj/item/device/encryptionkey/binary/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Ваших знаний информационных технологий достаточно, чтобы понять, что данный ключ перенастраивает наушник для возможности работы с протоколом связи синтетических единиц. Посредством данного ключа информация из канала синтетических единиц может преобразовываться в звуковой формат и обратно в формат данных."), + "skillcheck" = list( + SKILL_COMPUTER = SKILL_TRAINED + ) + ) + ) + +/obj/item/device/suit_sensor_jammer/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Ваших знаний криминалистики или сложных устройств достаточно, чтобы понять, что данное устройство способно глушить или подменять сигнал датчиков костюма в определенном радиусе."), + "failure" = SPAN_BAD("Выглядит как странная круглая штучка. Не можете определить для чего она нужна."), + "skillcheck" = list( + SKILL_FORENSICS = SKILL_MASTER, + SKILL_DEVICES = SKILL_TRAINED + ) + ) + ) + +/obj/item/device/blackout/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Ваших знаний электротехники и информационных технологий достаточно, чтобы понять, что данное устройство способно создать перегрузку сети питания при подключении к терминалу. Например через терминал под любым АПЦ."), + "failure" = SPAN_BAD("Выглядит как одно из множества устройств из НИО."), + "skillcheck" = list( + SKILL_ELECTRICAL = SKILL_EXPERIENCED, + SKILL_COMPUTER = SKILL_TRAINED + ), + "LOGIC" = "AND" + ) + ) + +/obj/item/clothing/glasses/thermal/syndi/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("При помощи оружейных знаний и при детальном осмотре, вы находите переключатель термального режима у этих очков."), + "skillcheck" = list( + SKILL_WEAPONS = SKILL_BASIC + ) + ) + ) + + if(active) + mod_skill_identification["device_info"]["failure"] = "Вам не пришлось даже особо детально осматривать эти очки, чтобы понять что у них сейчас активен термальный режим. Но вы все еще не знаете, переключается ли этот режим каким-либо образом." + +/obj/item/device/multitool/hacktool/update_mod_identification() + var/additional_good_descr = "" + + if(in_hack_mode) + additional_good_descr = " Он уже сейчас переведен в этот скрытый режим." + + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("На вид и по функционалу как обычный мультитул, но вашей экспертизы в электротехнике и сложных устройствах достаточно, чтобы понять, что у этого мультитула есть скрытый режим для взаимодействия с дверьми, который активируется при модификации отверткой.[additional_good_descr]"), + "skillcheck" = list( + SKILL_ELECTRICITY = SKILL_EXPERIENCED, + SKILL_DEVICES = SKILL_TRAINED + ), + "LOGIC" = "AND" + ) + ) + +/obj/item/card/emag/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Вашей экспертизы в электротехнике и криминалистике достаточно, для того чтобы определить, что это устройство используется для взлома широкого спектра вещей, где могут применяться ID карты."), + "failure" = SPAN_BAD("Выглядит как пустая идентификационная карта с кучей проводов, которых там точно не должно быть."), + "skillcheck" = list( + SKILL_ELECTRICAL = SKILL_EXPERIENCED, + SKILL_FORENSICS = SKILL_EXPERIENCED + ), + "LOGIC" = "AND", + ) + ) + +/obj/item/device/radio_jammer/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Вашей экспертизы в криминалистике достаточно, для того чтобы определить, что это устройство используется для подавления радио сигналов в определенном радиусе действия."), + "failure" = SPAN_BAD("С виду выглядит как обычное радио с каким-то странным меню выбора частот."), + "skillcheck" = list( + SKILL_FORENSICS = SKILL_EXPERIENCED + ) + ) + ) + +/obj/item/device/flashlight/flashdark/update_mod_identification() + var/additional_bad_descr = "" + + if(on) + additional_bad_descr = " Но так как он уже включен, вы видите что от его работы становится только темнее." + + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Вашей экспертизы в криминалистике или сложных устройствах достаточно, для того чтобы определить, что это устройство способно поглощать свет в активном состоянии."), + "failure" = SPAN_BAD("Выглядит, как необычный, но непримечательный фонарик.[additional_bad_descr]"), + "skillcheck" = list( + SKILL_FORENSICS = SKILL_TRAINED, + SKILL_DEVICES = SKILL_EXPERIENCED + ) + ) + ) + +/obj/item/device/powersink/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Вашей экспертизы в электротехнике достаточно, для того чтобы определить, что это устройство способно вызывать перепады питания за счет очень быстрого поглащения энергии из подключенной сети."), + "failure" = SPAN_BAD("Вы не знаете что это такое. Если вы видели это устройство где-то в близи проводки, то понимаете, что это явно что-то лишнее."), + "skillcheck" = list( + SKILL_ELECTRICITY = SKILL_TRAINED + ) + ) + ) + +/obj/item/device/syndietele/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Вашей обширной экспертизы в сложных устройствах достаточно, для того чтобы определить, что это замаскированный маяк телепортации."), + "failure" = SPAN_BAD("Выглядит достаточно подозрительно. Вы не знаете что это."), + "skillcheck" = list( + SKILL_DEVICE = SKILL_EXPERIENCED + ) + ) + ) + +/obj/item/device/syndietele/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Вашей обширной экспертизы в сложных устройствах достаточно, для того чтобы определить, что это замаскированный маяк телепортации."), + "failure" = SPAN_BAD("Выглядит достаточно подозрительно. Вы не знаете что это."), + "skillcheck" = list( + SKILL_DEVICE = SKILL_EXPERIENCED + ) + ) + ) + +/obj/item/device/syndiejaunter/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Вашей обширной экспертизы в сложных устройствах достаточно, для того чтобы определить, что это ручное устройство телепортации. Устройство должно по идее работать в связке со специальным маяком."), + "failure" = SPAN_BAD("Выглядит достаточно подозрительно. Вы не знаете что это."), + "skillcheck" = list( + SKILL_DEVICE = SKILL_EXPERIENCED + ) + ) + ) + +/obj/item/supply_beacon/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Вы без проблем определяете, что это маяк снабжения."), + "skillcheck" = list( + SKILL_FORENSICS = SKILL_UNSKILLED + ) + ) + ) + +/obj/item/aiModule/syndicate/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Вашей обширной экспертизы в информационных технологиях достаточно, для того чтобы определить, что это взломанная версия платы смены законов для ИИ. Модификации платы позволяют проставить законы в максимальном приоритете и с усложнением отслеживания со стороны ИИ."), + "failure" = SPAN_BAD("Обыкновенная плата, используемая во многих машинах."), + "skillcheck" = list( + SKILL_COMPUTER = SKILL_EXPERIENCED + ) + ) + ) + +/obj/item/clothing/mask/ai/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Вашей обширной экспертизы в криминалистике и в сложных устройствах достаточно, для того чтобы определить, что через эту маску можно напрямую подключаться к сети камер."), + "failure" = SPAN_BAD("Странная маска в виде черепа, через которую всё хорошо видно в выключенном состоянии."), + "skillcheck" = list( + SKILL_FORENSICS = SKILL_MASTER, + SKILL_DEVICES = SKILL_EXPERIENCED + ) + ) + ) + +/obj/item/device/personal_shield/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Ваших обширных знаний в криминалистике или в оружии хватает для того чтобы определить, что это переносной персональный энергощит."), + "failure" = SPAN_BAD("Выглядит как дымарь."), + "skillcheck" = list( + SKILL_FORENSICS = SKILL_MASTER, + SKILL_WEAPONS = SKILL_MASTER + ) + ) + ) + +/obj/item/gun/launcher/syringe/disguised/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("(!Невозможно опознать, если нет свидетелей стрельбы из этой сигареты!) Ваших знаний в криминалистике хватает для того чтобы определить, что это скрытый дротикомет."), + "skillcheck" = list( + SKILL_FORENSICS = SKILL_TRAINED + ) + ) + ) + +/obj/item/clothing/head/bowlerhat/razor/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("При детальном осмотре вы сразу понимаете, что котелок сильно заострен."), + "skillcheck" = list( + SKILL_FORENSICS = SKILL_UNSKILLED + ) + ) + ) + +/obj/item/stack/telecrystal/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Благодаря обширным научным знаниям вы понимаете, что это телекристал."), + "skillcheck" = list( + SKILL_SCIENCE = SKILL_MASTER + ) + ) + ) + +/obj/item/device/spy_bug/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Вашей экспертизы в криминалистике или в сложных устройствах достаточно, для того чтобы определить, что это жучок передающий изображение и звук на неизвестный монитор."), + "skillcheck" = list( + SKILL_FORENSICS = SKILL_TRAINED, + SKILL_DEVICES = SKILL_BASIC + ) + ) + ) + +/obj/item/device/spy_monitor/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Вашей экспертизы в криминалистике или в сложных устройствах достаточно, для того чтобы определить, что это скрытый под ПДА монитор, который может получать изображение и звук из неизвестных источников."), + "skillcheck" = list( + SKILL_FORENSICS = SKILL_TRAINED, + SKILL_DEVICES = SKILL_BASIC + ) + ) + ) + +/obj/item/card/id/syndicate/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Вашей обширной экспертизы в криминалистике и в сложных устройствах достаточно, для того чтобы определить, что это карта со сменяемыми полями и со встроенными средстами предотвращения слежки. Также вы обнаружили, что эта карта может копировать доступ других карт."), + "skillcheck" = list( + SKILL_FORENSICS = SKILL_MASTER, + SKILL_DEVICES = SKILL_EXPERIENCED + ), + "LOGIC" = "AND" + ) + ) + +/obj/item/clothing/mask/chameleon/voice/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Благодаря знаниям сложных устройств, вы обнаруживаете встроенный модулятор голоса в обследуемой маске."), + "skillcheck" = list( + SKILL_DEVICES = SKILL_TRAINED + ) + ) + ) + +/obj/item/device/chameleon/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Благодаря знаниям сложных устройств, вы понимаете, что это устройство может сканировать небольшие объекты и при активации маскировать владельца устройства под просканированный предмет."), + "skillcheck" = list( + SKILL_DEVICES = SKILL_TRAINED + ) + ) + ) + +/obj/item/implanter/imprinting/update_mod_identification() + if(!imp || !istype(imp, /obj/item/implant/imprinting)) + mod_skill_identification = list() + else + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Вашей обширной экспертизы медицины и знаний сложных устройств достаточно, для того чтобы определить, что данный имплант способен внушить определенную инструкцию при дополнительном воздействии сильных наркотиков, влияющих на разум."), + "skillcheck" = list( + SKILL_DEVICES = SKILL_BASIC, + SKILL_MEDICAL = SKILL_EXPERIENCED + ), + "LOGIC" = "AND" + ) + ) + +/obj/item/implant/imprinting/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Вашей обширной экспертизы медицины и знаний сложных устройств достаточно, для того чтобы определить, что данный имплант способен внушить определенную инструкцию при дополнительном воздействии сильных наркотиков, влияющих на разум."), + "skillcheck" = list( + SKILL_DEVICES = SKILL_BASIC, + SKILL_MEDICAL = SKILL_EXPERIENCED + ), + "LOGIC" = "AND" + ) + ) + +/obj/item/implanter/freedom/update_mod_identification() + if(!imp || !istype(imp, /obj/item/implant/freedom)) + mod_skill_identification = list() + else + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Вашей экспертизы в области сложных устройств достаточно, для того чтобы определить, что данный имплант позволяет владельцу вырываться из оков через применение заданного эмоционального триггера."), + "skillcheck" = list( + SKILL_DEVICES = SKILL_TRAINED + ) + ) + ) + +/obj/item/implant/freedom/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Вашей экспертизы в области сложных устройств достаточно, для того чтобы определить, что данный имплант позволяет владельцу вырываться из оков через применение заданного эмоционального триггера."), + "skillcheck" = list( + SKILL_DEVICES = SKILL_TRAINED + ) + ) + ) + +/obj/item/implanter/compressed/update_mod_identification() + if(!imp || !istype(imp, /obj/item/implant/compressed)) + mod_skill_identification = list() + else + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Вашей обширной экспертизы в области сложных устройств достаточно, для того чтобы определить, что данный имплант в своей основе использует технологию сжатии материи, для возможности имплантации предметов в тело. Предмет может быть вновь развернут на заданный эмоциональный триггер."), + "skillcheck" = list( + SKILL_DEVICES = SKILL_EXPERIENCED + ) + ) + ) + +/obj/item/implant/compressed/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Вашей обширной экспертизы в области сложных устройств достаточно, для того чтобы определить, что данный имплант в своей основе использует технологию сжатии материи, для возможности имплантации предметов в тело. Предмет может быть вновь развернут на заданный эмоциональный триггер."), + "skillcheck" = list( + SKILL_DEVICES = SKILL_EXPERIENCED + ) + ) + ) + +/obj/item/implanter/adrenalin/update_mod_identification() + if(!imp || !istype(imp, /obj/item/implant/adrenalin)) + mod_skill_identification = list() + else + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Вашей экспертизы в области сложных устройств достаточно, для того чтобы определить, что данный имплант содержит в себе наноботов, способных стимулировать тело на массовое производство адреналина. Активируется на заданный эмоциональный триггер."), + "skillcheck" = list( + SKILL_DEVICES = SKILL_TRAINED + ) + ) + ) + +/obj/item/implant/adrenalin/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Вашей экспертизы в области сложных устройств достаточно, для того чтобы определить, что данный имплант содержит в себе наноботов, способных стимулировать тело на массовое производство адреналина. Активируется на заданный эмоциональный триггер."), + "skillcheck" = list( + SKILL_DEVICES = SKILL_TRAINED + ) + ) + ) + +/obj/item/implanter/explosive/update_mod_identification() + if(!imp || !istype(imp, /obj/item/implant/explosive)) + mod_skill_identification = list() + else + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Вашей обширной экспертизы в области сложных устройств достаточно, для того чтобы определить, что это имплантируемая микровзрывчатка, которая может быть активирована по сигналу или по заданной фразе.."), + "skillcheck" = list( + SKILL_DEVICES = SKILL_EXPERIENCED + ) + ) + ) + +/obj/item/implant/explosive/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Вашей обширной экспертизы в области сложных устройств достаточно, для того чтобы определить, что это имплантируемая микровзрывчатка, которая может быть активирована по сигналу или по заданной фразе."), + "skillcheck" = list( + SKILL_DEVICES = SKILL_EXPERIENCED + ) + ) + ) + +/obj/item/reagent_containers/food/snacks/corpse_cube/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Ваших знаний в медицине достаточно, чтобы понять, что этот куб способен клонировать тело того, чьё ДНК в него будет введено."), + "failure" = SPAN_BAD("Выглядит как обычный куб для быстрого выращивания животного."), + "skillcheck" = list( + SKILL_MEDICAL = SKILL_EXPERIENCED + ) + ) + ) + +/obj/item/device/dna_sampler/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Ваших знаний в медицине достаточно, чтобы понять, что этот предмет способен взять образец чужого ДНК."), + "failure" = SPAN_BAD("Выглядит как необычный шприц."), + "skillcheck" = list( + SKILL_MEDICAL = SKILL_EXPERIENCED + ) + ) + ) + +/obj/item/device/cosmetic_surgery_kit/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Ваших знаний сложных устройств достаточно, чтобы опознать данный предмет как набор для проведения автоматической косметической хирургии."), + "failure" = SPAN_BAD("Выглядит как таймер с кучей проводов."), + "skillcheck" = list( + SKILL_DEVICES = SKILL_TRAINED + ) + ) + ) + +/obj/item/pen/reagent/sleepy/update_mod_identification() + mod_skill_identification = list( + "device_info" = list( + "success" = SPAN_GOOD("Используя свои знания сложных устройств, вы смогли обнаружить небольшую ёмкость для реагентов внутри ручки."), + "skillcheck" = list( + SKILL_DEVICES = SKILL_BASIC, + SKILL_MEDICAL = SKILL_BASIC + ), + "LOGIC" = "AND" + ) + ) \ No newline at end of file