From 605a3a660c812785cebba2fcb4b37a9fdfa92caf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E6=9C=88=E7=8C=AB?= Date: Mon, 6 Sep 2021 04:59:16 -0400 Subject: [PATCH] The Cycling 2.0, Airlocks can now be built in game to cycle and named (#61226) You can now edit an airlock control board (both physically and through an RCD) to set the airlock name and what ID it cycles on Airlocks now say what ID it cycles on when examined when an airlock is made it takes its circuits set name and ID and updates the cycling i redid how the cycle_id is updated on creation, so now when an airlock is made and grabbing airlocks with an identical ID to cycle it checks if the other airlocks with that ID needs a reference to the new airlock, and if so, it adds it, so you can add doors back to a cycle system if it breaks NOTE: unfortunately the way linear airlocks, like the small 2 door airlocks to space, set their links, you cannot repair their cycle this way, you will have to deconstruct the remaining door and rebuild both to cycle again --- code/game/machinery/doors/airlock.dm | 9 +++++++- .../machinery/doors/airlock_electronics.dm | 14 ++++++++++++ code/game/objects/structures/door_assembly.dm | 5 +++++ code/game/turfs/open/floor.dm | 7 ++++++ .../tgui/interfaces/AirlockElectronics.js | 22 ++++++++++++++++++- 5 files changed, 55 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 406c3ad4a3b..d51cb74f984 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -214,7 +214,10 @@ /obj/machinery/door/airlock/proc/update_other_id() for(var/obj/machinery/door/airlock/Airlock in GLOB.airlocks) if(Airlock.closeOtherId == closeOtherId && Airlock != src) - close_others += Airlock + if(!(Airlock in close_others)) + close_others += Airlock + if(!(src in Airlock.close_others)) + Airlock.close_others += src /obj/machinery/door/airlock/proc/cyclelinkairlock() if (cyclelinkedairlock) @@ -595,6 +598,10 @@ /obj/machinery/door/airlock/examine(mob/user) . = ..() + if(closeOtherId) + . += span_warning("This airlock cycles on ID: [sanitize(closeOtherId)].") + else if(!closeOtherId) + . += span_warning("This airlock does not cycle.") if(obj_flags & EMAGGED) . += span_warning("Its access panel is smoking slightly.") if(note) diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm index 6650dee3373..e5f32d32a92 100644 --- a/code/game/machinery/doors/airlock_electronics.dm +++ b/code/game/machinery/doors/airlock_electronics.dm @@ -7,6 +7,10 @@ var/one_access = 0 /// Unrestricted sides, or sides of the airlock that will open regardless of access var/unres_sides = 0 + ///what name are we passing to the finished airlock + var/passed_name + ///what string are we passing to the finished airlock as the cycle ID + var/passed_cycle_id /// A holder of the electronics, in case of them working as an integrated part var/holder @@ -39,6 +43,8 @@ data["accesses"] = accesses data["oneAccess"] = one_access data["unres_direction"] = unres_sides + data["passedName"] = passed_name + data["passedCycleId"] = passed_cycle_id return data /obj/item/electronics/airlock/ui_act(action, params) @@ -80,6 +86,14 @@ return accesses -= SSid_access.get_region_access_list(list(region)) . = TRUE + if("passedName") + var/new_name = trim("[params["passedName"]]", 30) + passed_name = new_name + . = TRUE + if("passedCycleId") + var/new_cycle_id = trim(params["passedCycleId"], 30) + passed_cycle_id = new_cycle_id + . = TRUE /obj/item/electronics/airlock/ui_host() if(holder) diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index c0ebc28bdb0..800a9f7f4de 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -259,8 +259,13 @@ door.req_access = electronics.accesses if(created_name) door.name = created_name + else if(electronics.passed_name) + door.name = sanitize(electronics.passed_name) else door.name = base_name + if(electronics.passed_cycle_id) + door.closeOtherId = electronics.passed_cycle_id + door.update_other_id() door.previous_airlock = previous_assembly electronics.forceMove(door) door.update_appearance() diff --git a/code/game/turfs/open/floor.dm b/code/game/turfs/open/floor.dm index d9efc7bb5af..dd61a6b94b9 100644 --- a/code/game/turfs/open/floor.dm +++ b/code/game/turfs/open/floor.dm @@ -298,12 +298,19 @@ new_airlock.electronics.accesses = the_rcd.airlock_electronics.accesses.Copy() new_airlock.electronics.one_access = the_rcd.airlock_electronics.one_access new_airlock.electronics.unres_sides = the_rcd.airlock_electronics.unres_sides + new_airlock.electronics.passed_name = the_rcd.airlock_electronics.passed_name + new_airlock.electronics.passed_cycle_id = the_rcd.airlock_electronics.passed_cycle_id if(new_airlock.electronics.one_access) new_airlock.req_one_access = new_airlock.electronics.accesses else new_airlock.req_access = new_airlock.electronics.accesses if(new_airlock.electronics.unres_sides) new_airlock.unres_sides = new_airlock.electronics.unres_sides + if(new_airlock.electronics.passed_name) + new_airlock.name = sanitize(new_airlock.electronics.passed_name) + if(new_airlock.electronics.passed_cycle_id) + new_airlock.closeOtherId = new_airlock.electronics.passed_cycle_id + new_airlock.update_other_id() new_airlock.autoclose = TRUE new_airlock.update_appearance() return TRUE diff --git a/tgui/packages/tgui/interfaces/AirlockElectronics.js b/tgui/packages/tgui/interfaces/AirlockElectronics.js index c37d8513196..24d2cefa757 100644 --- a/tgui/packages/tgui/interfaces/AirlockElectronics.js +++ b/tgui/packages/tgui/interfaces/AirlockElectronics.js @@ -1,5 +1,5 @@ import { useBackend, useLocalState } from '../backend'; -import { Button, Flex, Grid, LabeledList, Section, Tabs } from '../components'; +import { Button, Flex, Grid, Input, LabeledList, Section, Tabs } from '../components'; import { Window } from '../layouts'; import { sortBy } from 'common/collections'; @@ -8,6 +8,8 @@ export const AirlockElectronics = (props, context) => { const { oneAccess, unres_direction, + passedName, + passedCycleId, } = data; const regions = data.regions || []; const accesses = data.accesses || []; @@ -56,6 +58,24 @@ export const AirlockElectronics = (props, context) => { unres_direction: '8', })} /> + + act('passedName', { + passedName: value, + })} /> + + + act('passedCycleId', { + passedCycleId: value, + })} /> +