From 344630ea29c3ed76bdf2b56a48c2137e91bb8f3f Mon Sep 17 00:00:00 2001 From: Geeves Date: Mon, 25 May 2020 18:22:41 +0200 Subject: [PATCH] Agent ID Buff (#8918) The agent ID card now makes you invisible to the AI when electronic warfare is enabled. The price of the agent ID card have been upped to 4, from 3. Agent IDs now have a charge, which lasts for a few minutes. When the charge runs out, electronic warfare is disabled. Credits to Loaf (the man of many names) from Nebula for teaching me this technique. --- aurorastation.dme | 1 + code/controllers/subsystems/ai_obfuscation.dm | 33 ++++++++++ .../uplink/stealth and camouflage items.dm | 2 +- code/game/objects/items.dm | 4 ++ .../items/weapons/cards_ids_syndicate.dm | 62 +++++++++++++++++- code/modules/mob/living/carbon/give.dm | 7 +- code/modules/mob/living/silicon/ai/login.dm | 3 + html/changelogs/geeves-ai_visibility_nerf.yml | 7 ++ icons/obj/card.dmi | Bin 10414 -> 10481 bytes 9 files changed, 113 insertions(+), 6 deletions(-) create mode 100644 code/controllers/subsystems/ai_obfuscation.dm create mode 100644 html/changelogs/geeves-ai_visibility_nerf.yml diff --git a/aurorastation.dme b/aurorastation.dme index 63af9a19cf0..843cc4747af 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -166,6 +166,7 @@ #include "code\controllers\master\failsafe.dm" #include "code\controllers\master\master.dm" #include "code\controllers\master\subsystem.dm" +#include "code\controllers\subsystems\ai_obfuscation.dm" #include "code\controllers\subsystems\air.dm" #include "code\controllers\subsystems\alarm.dm" #include "code\controllers\subsystems\ao.dm" diff --git a/code/controllers/subsystems/ai_obfuscation.dm b/code/controllers/subsystems/ai_obfuscation.dm new file mode 100644 index 00000000000..c6c0f67215c --- /dev/null +++ b/code/controllers/subsystems/ai_obfuscation.dm @@ -0,0 +1,33 @@ +var/global/datum/controller/subsystem/ai_obfuscation/SSai_obfuscation + +/datum/controller/subsystem/ai_obfuscation + name = "AI Obfuscation" + flags = SS_NO_FIRE + + var/list/image/obfuscation_images = list() + +/datum/controller/subsystem/ai_obfuscation/New() + NEW_SS_GLOBAL(SSai_obfuscation) + +/datum/controller/subsystem/ai_obfuscation/proc/add_obfuscation_image(var/image/added_image) + if(!istype(added_image)) + return + obfuscation_images += added_image + + for(var/ai in ai_list) + var/mob/living/silicon/ai/A = ai + if(A.client) + A.client.images += added_image + +/datum/controller/subsystem/ai_obfuscation/proc/remove_obfuscation_image(var/image/removed_image) + if(!istype(removed_image)) + return + obfuscation_images -= removed_image + + for(var/ai in ai_list) + var/mob/living/silicon/ai/A = ai + if(A.client) + A.client.images -= removed_image + +/datum/controller/subsystem/ai_obfuscation/proc/get_obfuscation_images() + return obfuscation_images \ No newline at end of file diff --git a/code/datums/uplink/stealth and camouflage items.dm b/code/datums/uplink/stealth and camouflage items.dm index 06de7b73f9e..b4058b157da 100644 --- a/code/datums/uplink/stealth and camouflage items.dm +++ b/code/datums/uplink/stealth and camouflage items.dm @@ -16,7 +16,7 @@ /datum/uplink_item/item/stealth_items/id name = "Agent ID card" - item_cost = 3 + item_cost = 4 path = /obj/item/card/id/syndicate /datum/uplink_item/item/stealth_items/chameleon_kit diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 3dfae529431..9e3c92439e6 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -466,6 +466,10 @@ var/list/global/slot_flags_enumeration = list( return 0 return 1 +// override for give shenanigans +/obj/item/proc/on_give(var/mob/giver, var/mob/receiver) + return + /* /obj/item/verb/verb_pickup() set src in oview(1) diff --git a/code/game/objects/items/weapons/cards_ids_syndicate.dm b/code/game/objects/items/weapons/cards_ids_syndicate.dm index 732c2d9abc7..820b812557e 100644 --- a/code/game/objects/items/weapons/cards_ids_syndicate.dm +++ b/code/game/objects/items/weapons/cards_ids_syndicate.dm @@ -2,17 +2,38 @@ name = "agent card" assignment = "Agent" origin_tech = list(TECH_ILLEGAL = 3) - var/electronic_warfare = 1 + var/charge = 10000 + var/electronic_warfare = FALSE + var/image/obfuscation_image var/mob/registered_user = null /obj/item/card/id/syndicate/New(mob/user as mob) ..() access = syndicate_access.Copy() + START_PROCESSING(SSprocessing, src) /obj/item/card/id/syndicate/Destroy() + STOP_PROCESSING(SSprocessing, src) unset_registered_user(registered_user) return ..() +/obj/item/card/id/syndicate/examine(mob/user) + ..() + if(Adjacent(user)) + if(user == registered_user) + to_chat(user, FONT_SMALL(SPAN_NOTICE("It is at [charge]/[initial(charge)] charge."))) + +/obj/item/card/id/syndicate/process() + if(electronic_warfare) + charge = max(0, charge - 50) + if(charge <= 0) + if(ismob(loc)) + to_chat(loc, SPAN_WARNING("\The [src] runs out of power and deactivates.")) + electronic_warfare = FALSE + check_obfuscation() + else if(charge != initial(charge)) + charge = min(initial(charge), charge + 100) + /obj/item/card/id/syndicate/prevent_tracking() return electronic_warfare @@ -79,6 +100,42 @@ return STATUS_CLOSE return ..() + +/obj/item/card/id/syndicate/throw_at() + ..() + electronic_warfare = FALSE + check_obfuscation() + +/obj/item/card/id/syndicate/dropped() + ..() + electronic_warfare = FALSE + check_obfuscation() + +/obj/item/card/id/syndicate/on_give() + check_obfuscation() + +/obj/item/card/id/syndicate/update_icon() + cut_overlays() + if(electronic_warfare) + var/mutable_appearance/electro_overlay = mutable_appearance(icon, "electronic_warfare") + add_overlay(electro_overlay) + +/obj/item/card/id/syndicate/proc/check_obfuscation() + if(electronic_warfare) + if(ismob(loc)) + obfuscation_image = image("loc" = loc) + obfuscation_image.override = TRUE + SSai_obfuscation.add_obfuscation_image(obfuscation_image) + else if(obfuscation_image) + electronic_warfare = FALSE + SSai_obfuscation.remove_obfuscation_image(obfuscation_image) + QDEL_NULL(obfuscation_image) + else + if(obfuscation_image) + SSai_obfuscation.remove_obfuscation_image(obfuscation_image) + QDEL_NULL(obfuscation_image) + update_icon() + /obj/item/card/id/syndicate/Topic(href, href_list, var/datum/topic_state/state) if(..()) return 1 @@ -86,7 +143,8 @@ var/user = usr if(href_list["electronic_warfare"]) electronic_warfare = text2num(href_list["electronic_warfare"]) - to_chat(user, "Electronic warfare [electronic_warfare ? "enabled" : "disabled"].") + to_chat(user, SPAN_NOTICE("Electronic warfare [electronic_warfare ? "enabled" : "disabled"].")) + check_obfuscation() else if(href_list["set"]) switch(href_list["set"]) if("Age") diff --git a/code/modules/mob/living/carbon/give.dm b/code/modules/mob/living/carbon/give.dm index 75b614b009e..0d1cf4af905 100644 --- a/code/modules/mob/living/carbon/give.dm +++ b/code/modules/mob/living/carbon/give.dm @@ -38,6 +38,7 @@ return if(usr.unEquip(I)) - target.put_in_hands(I) // If this fails it will just end up on the floor, but that's fitting for things like dionaea. - usr.visible_message(span("notice", "\The [usr] handed \the [I] to \the [target]."), span("notice", "You give \the [I] to \the [target].")) - + I.on_give(usr, target) + if(!QDELETED(I)) // if on_give deletes the item, we don't want runtimes below + target.put_in_hands(I) // If this fails it will just end up on the floor, but that's fitting for things like dionaea. + usr.visible_message(span("notice", "\The [usr] handed \the [I] to \the [target]."), span("notice", "You give \the [I] to \the [target].")) diff --git a/code/modules/mob/living/silicon/ai/login.dm b/code/modules/mob/living/silicon/ai/login.dm index 3c4352c5c65..8e08082b28b 100644 --- a/code/modules/mob/living/silicon/ai/login.dm +++ b/code/modules/mob/living/silicon/ai/login.dm @@ -14,6 +14,9 @@ blind.invisibility = 101 client.screen.Add( blind, flash ) + for(var/image/obfuscation_image in SSai_obfuscation.get_obfuscation_images()) + client.images += obfuscation_image + if(stat != DEAD) for(var/obj/machinery/ai_status_display/O in SSmachinery.all_status_displays) //change status O.mode = 1 diff --git a/html/changelogs/geeves-ai_visibility_nerf.yml b/html/changelogs/geeves-ai_visibility_nerf.yml new file mode 100644 index 00000000000..a455406d65d --- /dev/null +++ b/html/changelogs/geeves-ai_visibility_nerf.yml @@ -0,0 +1,7 @@ +author: Geeves + +delete-after: True +changes: + - rscadd: "The agent ID card now makes you invisible to the AI when electronic warfare is enabled." + - tweak: "The price of the agent ID card have been upped to 4, from 3." + - tweak: "Agent IDs now have a charge, which lasts for a few minutes. When the charge runs out, electronic warfare is disabled." \ No newline at end of file diff --git a/icons/obj/card.dmi b/icons/obj/card.dmi index 1685be026a03b3f2572bef53dbf427bc5000bd0d..d1b01b20a2a3ef13f1658c3c13088d01aecc6dbf 100644 GIT binary patch literal 10481 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 FzX2bmZzcc$ literal 10414 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