From a92eff7891f72c4a6382ea2ca3ffcc08b574fa54 Mon Sep 17 00:00:00 2001 From: Rune Knight <30399783+Runian@users.noreply.github.com> Date: Tue, 17 Sep 2024 01:29:13 -0700 Subject: [PATCH] Multitool can be used to find the area's APC (#16544) Co-authored-by: TiviPlus <57223640+TiviPlus@users.noreply.github.com> --- code/__DEFINES/cooldowns.dm | 1 + code/game/objects/items/multitool.dm | 40 ++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/code/__DEFINES/cooldowns.dm b/code/__DEFINES/cooldowns.dm index bc654295430f1..ede781721ba2d 100644 --- a/code/__DEFINES/cooldowns.dm +++ b/code/__DEFINES/cooldowns.dm @@ -57,6 +57,7 @@ #define COOLDOWN_WHISTLE_BLOW "cooldown_whistle_blow" #define COOLDOWN_WHISTLE_WARCRY "cooldown_whistle_warcry" #define COOLDOWN_ARMORED_SMOKE "cooldown_armored_smoke" +#define COOLDOWN_LOCATE_APC "cooldown_locate_apc" //Mecha cooldowns #define COOLDOWN_MECHA "mecha" diff --git a/code/game/objects/items/multitool.dm b/code/game/objects/items/multitool.dm index a97dea728da00..531c87a52ad50 100644 --- a/code/game/objects/items/multitool.dm +++ b/code/game/objects/items/multitool.dm @@ -18,3 +18,43 @@ tool_behaviour = TOOL_MULTITOOL var/obj/machinery/telecomms/buffer // simple machine buffer for device linkage + +/obj/item/tool/multitool/attack_self(mob/user) + . = ..() + + if(TIMER_COOLDOWN_CHECK(src, COOLDOWN_LOCATE_APC) || !ishuman(user) || user.skills.getRating(SKILL_ENGINEER) < SKILL_ENGINEER_METAL || !user.client) + return + + var/area/current_area = get_area(src) + var/atom/area_apc = current_area ? current_area.get_apc() : null + if(!area_apc) + to_chat(user, span_warning("ERROR: Could not locate local APC.")) + user.balloon_alert(user, "could not locate!") + return + + var/dist = get_dist(src, area_apc) + var/direction = angle_to_dir(Get_Angle(get_turf(src), get_turf(area_apc))) + to_chat(user, span_notice("The local APC is located at [span_bold("[dist] units [dir2text(direction)]")].")) + user.balloon_alert(user, "[dist] units [dir2text(direction)]") + + //Create the appearance so we have something to apply the filter to. + var/mutable_appearance/apc_appearance = new(area_apc) + apc_appearance.filters += list("type" = "outline", "size" = 1, "color" = COLOR_GREEN) + //Make it an image we can give to the client + var/image/final_image = image(apc_appearance) + + final_image.layer = WALL_OBJ_LAYER + final_image.plane = GAME_PLANE + final_image.loc = get_turf(area_apc) + final_image.dir = apc_appearance.dir + final_image.alpha = 225 + user.client.images += final_image + + TIMER_COOLDOWN_START(src, COOLDOWN_LOCATE_APC, 1.5 SECONDS) + addtimer(CALLBACK(src, PROC_REF(remove_apc_highlight), user.client, final_image), 1.4 SECONDS) + +/// Removes the highlight from the APC. +/obj/item/tool/multitool/proc/remove_apc_highlight(client/user_client, image/highlight_image) + if(!user_client) + return + user_client.images -= highlight_image