From b0295d315077aaa8f0c5f1cec56bf8cafa0325e0 Mon Sep 17 00:00:00 2001 From: Interception&? <137328283+intercepti0n@users.noreply.github.com> Date: Tue, 17 Oct 2023 19:28:45 +0300 Subject: [PATCH 1/9] replace ugly type-checking procs with macro --- cev_eris.dme | 1 - code/__DEFINES/is_helpers.dm | 13 +++++++++ code/game/machinery/portable_turret.dm | 2 +- .../objects/items/devices/transfer_valve.dm | 2 +- .../items/weapons/grenades/chem_grenade.dm | 14 ++++----- code/modules/assembly/assembly.dm | 2 +- code/modules/assembly/bomb.dm | 2 +- code/modules/assembly/helpers.dm | 29 ------------------- code/modules/mob/living/bot/ed209bot.dm | 2 +- code/modules/mob/living/bot/farmbot.dm | 2 +- code/modules/mob/living/bot/floorbot.dm | 2 +- code/modules/mob/living/bot/medbot.dm | 2 +- code/modules/mob/living/bot/secbot.dm | 4 +-- .../reagent_containers/glass/beaker.dm | 2 +- 14 files changed, 31 insertions(+), 48 deletions(-) delete mode 100644 code/modules/assembly/helpers.dm diff --git a/cev_eris.dme b/cev_eris.dme index 7ae1726112e..49bffb470fb 100644 --- a/cev_eris.dme +++ b/cev_eris.dme @@ -1453,7 +1453,6 @@ #include "code\modules\alarm\power_alarm.dm" #include "code\modules\assembly\assembly.dm" #include "code\modules\assembly\bomb.dm" -#include "code\modules\assembly\helpers.dm" #include "code\modules\assembly\holder.dm" #include "code\modules\assembly\igniter.dm" #include "code\modules\assembly\infrared.dm" diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index f42d8e2313a..691523c118f 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -97,3 +97,16 @@ #define ismachinery(A) (istype(A, /obj/machinery)) #define isProjectile(A) (istype(A, /obj/item/projectile)) + +// Assembly specific checks +#define isassembly(A) (istype(A, /obj/item/device/assembly)) + +#define isigniter(A) (istype(A, /obj/item/device/assembly/igniter)) + +#define isinfrared(A) (istype(A, /obj/item/device/assembly/infra)) + +#define isproxsensor(A) (istype(A, /obj/item/device/assembly/prox_sensor)) + +#define issignaler(A) (istype(A, /obj/item/device/assembly/signaler)) + +#define istimer(A) (istype(A, /obj/item/device/assembly/timer)) diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 658c89fa059..6207c80612b 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -902,7 +902,7 @@ var/list/turret_icons //attack_hand() removes the gun if(4) - if(is_proximity_sensor(I)) + if(isproxsensor(I)) build_step = 5 if(!user.unEquip(I)) to_chat(user, SPAN_NOTICE("\the [I] is stuck to your hand, you cannot put it in \the [src]")) diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 0df064d8d10..ab74a8f3f16 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -37,7 +37,7 @@ update_icon() SSnano.update_uis(src) // update all UIs attached to src //TODO: Have this take an assemblyholder - else if(is_assembly(item)) + else if(isassembly(item)) var/obj/item/device/assembly/A = item if(A.secured) to_chat(user, SPAN_NOTICE("The device is secured.")) diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index ba89798572b..af682aeb279 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -58,7 +58,7 @@ return if(istype(W,/obj/item/device/assembly_holder) && stage != READY && path != 2) var/obj/item/device/assembly_holder/det = W - if(istype(det.left_assembly,det.right_assembly.type) || (!is_igniter(det.left_assembly) && !is_igniter(det.right_assembly))) + if(istype(det.left_assembly,det.right_assembly.type) || (!isigniter(det.left_assembly) && !isigniter(det.right_assembly))) to_chat(user, SPAN_WARNING("Assembly must contain one igniter.")) return if(!det.secured) @@ -70,10 +70,10 @@ user.remove_from_mob(det) det.loc = src detonator = det - if(is_timer(detonator.left_assembly)) + if(istimer(detonator.left_assembly)) var/obj/item/device/assembly/timer/T = detonator.left_assembly det_time = 10*T.time - if(is_timer(detonator.right_assembly)) + if(istimer(detonator.right_assembly)) var/obj/item/device/assembly/timer/T = detonator.right_assembly det_time = 10*T.time icon_state = initial(icon_state) +"_ass" @@ -128,11 +128,11 @@ if(active) return if(detonator) - if(!is_igniter(detonator.left_assembly)) + if(!isigniter(detonator.left_assembly)) detonator.left_assembly.activate() active = TRUE log_and_message_admins("primed via detonator \a [src]") - if(!is_igniter(detonator.right_assembly)) + if(!isigniter(detonator.right_assembly)) detonator.right_assembly.activate() active = TRUE log_and_message_admins("primed via detonator \a [src]") @@ -160,10 +160,10 @@ icon_state = initial(icon_state) +"_locked" playsound(loc, 'sound/items/Screwdriver2.ogg', 50, 1) spawn(0) //Otherwise det_time is erroneously set to 0 after this - if(is_timer(detonator.left_assembly)) //Make sure description reflects that the timer has been reset + if(istimer(detonator.left_assembly)) //Make sure description reflects that the timer has been reset var/obj/item/device/assembly/timer/T = detonator.left_assembly det_time = 10*T.time - if(is_timer(detonator.right_assembly)) + if(istimer(detonator.right_assembly)) var/obj/item/device/assembly/timer/T = detonator.right_assembly det_time = 10*T.time return diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm index 02429922ac7..a7bca19e3e2 100644 --- a/code/modules/assembly/assembly.dm +++ b/code/modules/assembly/assembly.dm @@ -74,7 +74,7 @@ /obj/item/device/assembly/attackby(obj/item/I, mob/user) - if(is_assembly(I)) + if(isassembly(I)) var/obj/item/device/assembly/A = I if((!A.secured) && (!secured)) attach_assembly(A, user) diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm index df7d41712ff..d240660a2cd 100644 --- a/code/modules/assembly/bomb.dm +++ b/code/modules/assembly/bomb.dm @@ -93,7 +93,7 @@ var/mob/M = user if(!S.secured) //Check if the assembly is secured return - if(is_igniter(S.left_assembly) == is_igniter(S.right_assembly)) //Check if either part of the assembly has an igniter, but if both parts are igniters, then fuck it + if(isigniter(S.left_assembly) == isigniter(S.right_assembly)) //Check if either part of the assembly has an igniter, but if both parts are igniters, then fuck it return var/obj/item/device/onetankbomb/R = new /obj/item/device/onetankbomb(loc) diff --git a/code/modules/assembly/helpers.dm b/code/modules/assembly/helpers.dm deleted file mode 100644 index 221bd123b50..00000000000 --- a/code/modules/assembly/helpers.dm +++ /dev/null @@ -1,29 +0,0 @@ -/proc/is_assembly(O) - if(istype(O, /obj/item/device/assembly)) - return TRUE - return FALSE - -/proc/is_igniter(O) - if(istype(O, /obj/item/device/assembly/igniter)) - return TRUE - return FALSE - -/proc/is_infrared(O) - if(istype(O, /obj/item/device/assembly/infra)) - return TRUE - return FALSE - -/proc/is_proximity_sensor(O) - if(istype(O, /obj/item/device/assembly/prox_sensor)) - return TRUE - return FALSE - -/proc/is_signaler(O) - if(istype(O, /obj/item/device/assembly/signaler)) - return TRUE - return FALSE - -/proc/is_timer(O) - if(istype(O, /obj/item/device/assembly/timer)) - return TRUE - return FALSE diff --git a/code/modules/mob/living/bot/ed209bot.dm b/code/modules/mob/living/bot/ed209bot.dm index 393e70ff27f..b2060857438 100644 --- a/code/modules/mob/living/bot/ed209bot.dm +++ b/code/modules/mob/living/bot/ed209bot.dm @@ -158,7 +158,7 @@ icon_state = "ed209_hat" if(5) - if(is_proximity_sensor(I)) + if(isproxsensor(I)) user.drop_item() qdel(I) build_step++ diff --git a/code/modules/mob/living/bot/farmbot.dm b/code/modules/mob/living/bot/farmbot.dm index 80e755c6ee9..d3ed5fec4cb 100644 --- a/code/modules/mob/living/bot/farmbot.dm +++ b/code/modules/mob/living/bot/farmbot.dm @@ -363,7 +363,7 @@ user.remove_from_mob(W) qdel(W) - else if((is_proximity_sensor(W)) && (build_step == 3)) + else if((isproxsensor(W)) && (build_step == 3)) build_step++ to_chat(user, "You complete the Farmbot! Beep boop.") playsound(src.loc, 'sound/effects/insert.ogg', 50, 1) diff --git a/code/modules/mob/living/bot/floorbot.dm b/code/modules/mob/living/bot/floorbot.dm index 1863b8cb3ce..fea4726402a 100644 --- a/code/modules/mob/living/bot/floorbot.dm +++ b/code/modules/mob/living/bot/floorbot.dm @@ -381,7 +381,7 @@ /obj/item/toolbox_tiles/attackby(var/obj/item/W, mob/user as mob) ..() - if(is_proximity_sensor(W)) + if(isproxsensor(W)) qdel(W) var/obj/item/toolbox_tiles_sensor/B = new /obj/item/toolbox_tiles_sensor() B.created_name = created_name diff --git a/code/modules/mob/living/bot/medbot.dm b/code/modules/mob/living/bot/medbot.dm index 320d41572de..963e3419713 100644 --- a/code/modules/mob/living/bot/medbot.dm +++ b/code/modules/mob/living/bot/medbot.dm @@ -355,7 +355,7 @@ overlays += image('icons/obj/aibots.dmi', "na_scanner") if(1) - if(is_proximity_sensor(W)) + if(isproxsensor(W)) user.drop_item() qdel(W) to_chat(user, SPAN_NOTICE("You complete the Medibot! Beep boop.")) diff --git a/code/modules/mob/living/bot/secbot.dm b/code/modules/mob/living/bot/secbot.dm index 9ad4229f729..814dadfa5a2 100644 --- a/code/modules/mob/living/bot/secbot.dm +++ b/code/modules/mob/living/bot/secbot.dm @@ -479,7 +479,7 @@ /obj/item/clothing/head/armor/helmet/attackby(var/obj/item/device/assembly/signaler/S, mob/user as mob) ..() - if(!is_signaler(S)) + if(!issignaler(S)) ..() return @@ -514,7 +514,7 @@ overlays += image('icons/obj/aibots.dmi', "hs_hole") to_chat(user, "You weld a hole in \the [src].") - else if(is_proximity_sensor(I) && (build_step == 1)) + else if(isproxsensor(I) && (build_step == 1)) user.drop_item() build_step = 2 to_chat(user, "You add \the [I] to [src].") diff --git a/code/modules/reagents/reagent_containers/glass/beaker.dm b/code/modules/reagents/reagent_containers/glass/beaker.dm index 7505b3202d3..db35a3b2d66 100644 --- a/code/modules/reagents/reagent_containers/glass/beaker.dm +++ b/code/modules/reagents/reagent_containers/glass/beaker.dm @@ -204,7 +204,7 @@ /obj/item/reagent_containers/glass/bucket/attackby(obj/D, mob/user) - if(is_proximity_sensor(D)) + if(isproxsensor(D)) to_chat(user, "You add [D] to [src].") qdel(D) user.put_in_hands(new /obj/item/bucket_sensor) From 842f3c18ba147adc4e140039ff990c7b548c797a Mon Sep 17 00:00:00 2001 From: Interception&? <137328283+intercepti0n@users.noreply.github.com> Date: Fri, 20 Oct 2023 03:03:37 +0300 Subject: [PATCH 2/9] replace NanoUI state check with TGUI --- cev_eris.dme | 2 +- code/modules/nano/interaction/hands.dm | 23 ----------------------- code/modules/tgui/states/hands.dm | 7 ++++--- 3 files changed, 5 insertions(+), 27 deletions(-) delete mode 100644 code/modules/nano/interaction/hands.dm diff --git a/cev_eris.dme b/cev_eris.dme index 49bffb470fb..eff9506c3c3 100644 --- a/cev_eris.dme +++ b/cev_eris.dme @@ -2270,7 +2270,6 @@ #include "code\modules\nano\interaction\contained.dm" #include "code\modules\nano\interaction\default.dm" #include "code\modules\nano\interaction\exosuits.dm" -#include "code\modules\nano\interaction\hands.dm" #include "code\modules\nano\interaction\interactive.dm" #include "code\modules\nano\interaction\inventory.dm" #include "code\modules\nano\interaction\inventory_deep.dm" @@ -2748,6 +2747,7 @@ #include "code\modules\tgui\tgui.dm" #include "code\modules\tgui\tgui_window.dm" #include "code\modules\tgui\states\always.dm" +#include "code\modules\tgui\states\hands.dm" #include "code\modules\tgui\states\machinery.dm" #include "code\modules\tgui\states\notcontained.dm" #include "code\modules\tips_and_tricks\gameplay.dm" diff --git a/code/modules/nano/interaction/hands.dm b/code/modules/nano/interaction/hands.dm deleted file mode 100644 index 0791f8b8c23..00000000000 --- a/code/modules/nano/interaction/hands.dm +++ /dev/null @@ -1,23 +0,0 @@ -/* - This state only checks if user is conscious. -*/ -GLOBAL_DATUM_INIT(hands_state, /datum/nano_topic_state/hands, new) - -/datum/nano_topic_state/hands/can_use_topic(src_object, mob/user) - . = user.shared_nano_interaction(src_object) - if(. > STATUS_CLOSE) - . = min(., user.hands_can_use_topic(src_object)) - -/mob/proc/hands_can_use_topic(src_object) - return STATUS_CLOSE - -/mob/living/hands_can_use_topic(src_object) - if(src_object in get_both_hands(src)) - return STATUS_INTERACTIVE - return STATUS_CLOSE - -/mob/living/silicon/robot/hands_can_use_topic(src_object) - for(var/obj/item/gripper/active_gripper in list(module_state_1, module_state_2, module_state_3)) - if(active_gripper.contains(src_object)) - return STATUS_INTERACTIVE - return STATUS_CLOSE diff --git a/code/modules/tgui/states/hands.dm b/code/modules/tgui/states/hands.dm index e8cb844bf7f..9b4b7b1c811 100644 --- a/code/modules/tgui/states/hands.dm +++ b/code/modules/tgui/states/hands.dm @@ -20,11 +20,12 @@ GLOBAL_DATUM_INIT(hands_state, /datum/ui_state/hands_state, new) return UI_CLOSE /mob/living/hands_can_use_topic(src_object) - if(is_holding(src_object)) + if(src_object in get_both_hands(src)) return UI_INTERACTIVE return UI_CLOSE /mob/living/silicon/robot/hands_can_use_topic(src_object) - if(activated(src_object)) - return UI_INTERACTIVE + for(var/obj/item/gripper/active_gripper in list(module_state_1, module_state_2, module_state_3)) + if(active_gripper.contains(src_object)) + return UI_INTERACTIVE return UI_CLOSE From 6d75c238fceb3c7ca6148ff16e6bfa66258ed545 Mon Sep 17 00:00:00 2001 From: Interception&? <137328283+intercepti0n@users.noreply.github.com> Date: Fri, 20 Oct 2023 03:04:39 +0300 Subject: [PATCH 3/9] add basic TGUI support to assembly --- code/modules/assembly/assembly.dm | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm index a7bca19e3e2..916254647f5 100644 --- a/code/modules/assembly/assembly.dm +++ b/code/modules/assembly/assembly.dm @@ -103,24 +103,34 @@ /obj/item/device/assembly/attack_self(mob/user) if(!user) - return 0 - user.set_machine(src) - interact(user) - return 1 + return FALSE + interact(user) + return TRUE /obj/item/device/assembly/interact(mob/user) - return //HTML MENU FOR WIRES GOES HERE + return ui_interact(user) /obj/item/device/assembly/proc/holder_movement() return -/obj/item/device/assembly/nano_host() - if(istype(loc, /obj/item/device/assembly_holder)) - return loc.nano_host() - return ..() - /obj/item/device/assembly/proc/is_attachable() if(secured) return FALSE return TRUE + +/obj/item/device/assembly/proc/is_secured(mob/user) + if(!secured) + to_chat(user, SPAN_WARNING("The [name] is unsecured!")) + return FALSE + + return TRUE + +/obj/item/device/assembly/ui_host(mob/user) + if(holder) + return holder + + return ..() + +/obj/item/device/assembly/ui_state(mob/user) + return GLOB.hands_state From 1efb03fae3bf41b138c68b9f015d822f8aa4e705 Mon Sep 17 00:00:00 2001 From: Interception&? <137328283+intercepti0n@users.noreply.github.com> Date: Fri, 20 Oct 2023 03:05:18 +0300 Subject: [PATCH 4/9] convert timer UI to TGUI --- code/modules/assembly/timer.dm | 74 +++++++++----------- tgui/packages/tgui/interfaces/Timer.tsx | 91 +++++++++++-------------- 2 files changed, 74 insertions(+), 91 deletions(-) diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm index bff7db776ca..a66c2a9bf42 100644 --- a/code/modules/assembly/timer.dm +++ b/code/modules/assembly/timer.dm @@ -5,11 +5,10 @@ origin_tech = list(TECH_MAGNET = 1) matter = list(MATERIAL_PLASTIC = 1) + secured = FALSE wires = WIRE_PULSE - secured = 0 - - var/timing = 0 + var/timing = FALSE var/time = 10 @@ -61,47 +60,40 @@ if(holder) holder.update_icon() +/obj/item/device/assembly/timer/ui_status(mob/user) + if(is_secured(user)) + return ..() -/obj/item/device/assembly/timer/interact(mob/user as mob)//TODO: Have this use the wires - if(!secured) - to_chat(user, SPAN_WARNING("The [name] is unsecured!")) - return - var/second = time % 60 - var/minute = (time - second) / 60 - - var/dat = {" - Timing Unit
[minute]:[second]
- - - - - + - +
- [timing ? "Timing" : "Not Timing"] -

Refresh -

Close - "} - user << browse(dat, "window=timer") - onclose(user, "timer") - - -/obj/item/device/assembly/timer/Topic(href, href_list) - if(..()) return 1 - if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr)) - usr << browse(null, "window=timer") - onclose(usr, "timer") - return + return UI_CLOSE - if(href_list["time"]) - timing = text2num(href_list["time"]) - update_icon() +/obj/item/device/assembly/timer/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "Timer", name) + ui.open() - if(href_list["tp"]) - var/tp = text2num(href_list["tp"]) - time += tp - time = min(max(round(time), 0), 600) +/obj/item/device/assembly/timer/ui_data(mob/user) + var/list/data = list( + "isTiming" = timing, + ) - if(href_list["close"]) - usr << browse(null, "window=timer") + data["minutes"] = round((time - data["seconds"]) / 60) + data["seconds"] = round(time % 60) + + return data + +/obj/item/device/assembly/timer/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) return - if(usr) - attack_self(usr) + switch(action) + if("time") + timing = !timing + . = TRUE + if("adjust") + if(params["value"]) + var/value = text2num(params["value"]) + time = clamp(time + value, 0, 600) + . = TRUE + diff --git a/tgui/packages/tgui/interfaces/Timer.tsx b/tgui/packages/tgui/interfaces/Timer.tsx index eff3140b879..dec3d4682f4 100644 --- a/tgui/packages/tgui/interfaces/Timer.tsx +++ b/tgui/packages/tgui/interfaces/Timer.tsx @@ -1,18 +1,16 @@ -import { BooleanLike } from 'common/react'; import { useBackend } from '../backend'; -import { Button, Section } from '../components'; +import { Button, Section, Stack } from '../components'; import { Window } from '../layouts'; -type Data = { +interface TimerData { + isTiming: boolean; minutes: number; seconds: number; - timing: BooleanLike; - loop: BooleanLike; -}; +} -export const Timer = (props, context) => { - const { act, data } = useBackend(context); - const { timing, loop } = data; +export const Timer = (props: any, context: any) => { + const { act, data } = useBackend(context); + const { isTiming } = data; return ( @@ -20,20 +18,12 @@ export const Timer = (props, context) => {
-
@@ -42,34 +32,35 @@ export const Timer = (props, context) => { ); }; -/** Displays a few more buttons to control the timer. */ -const TimerContent = (props, context) => { - const { act, data } = useBackend(context); - const { minutes, seconds, timing } = data; +const TimerContent = (props: any, context: any) => { + const { act, data } = useBackend(context); + const { minutes, seconds, isTiming } = data; return ( - <> -