diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 7c907c4605c..3c30ffa198e 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -25,6 +25,14 @@ var/frame_desc = null var/contain_parts = 1 +//Not sure where else to put this +/obj/item/weapon/circuitboard/broken + name = "broken electronics" + icon = 'icons/obj/doors/door_assembly.dmi' + icon_state = "door_electronics_smoked" + origin_tech = null + board_type = "other" + //Called when the circuitboard is used to contruct a new machine. /obj/item/weapon/circuitboard/proc/construct(var/obj/machinery/M) if (istype(M, build_path)) @@ -453,4 +461,4 @@ user << "\blue You connect the monitor." var/B = new src.circuit.build_path ( src.loc ) src.circuit.construct(B) - del(src) \ No newline at end of file + del(src) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 7328c7b8f3d..e595cea9333 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -27,8 +27,7 @@ normalspeed = 1 var/obj/item/weapon/airlock_electronics/electronics = null var/hasShocked = 0 //Prevents multiple shocks from happening - var/secured_wires = 0 //for mapping use - var/security_bolts = 0 //if 1, door bolts when broken + var/secured_wires = 0 var/datum/wires/airlock/wires = null /obj/machinery/door/airlock/command @@ -78,7 +77,7 @@ name = "Vault" icon = 'icons/obj/doors/vault.dmi' opacity = 1 - security_bolts = 1 + secured_wires = 1 assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity //Until somebody makes better sprites. /obj/machinery/door/airlock/freezer @@ -259,9 +258,9 @@ glass = 1 /obj/machinery/door/airlock/highsecurity - name = "High Tech Security Airlock" + name = "Secure Airlock" icon = 'icons/obj/doors/hightechsecurity.dmi' - security_bolts = 1 + secured_wires = 1 assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity /* @@ -911,23 +910,14 @@ About the new airlock wires panel: da.created_name = src.name da.update_state() - var/obj/item/weapon/airlock_electronics/ae - if(!electronics) - ae = new/obj/item/weapon/airlock_electronics( src.loc ) - if(!src.req_access) - src.check_access() - if(src.req_access.len) - ae.conf_access = src.req_access - else if (src.req_one_access.len) - ae.conf_access = src.req_one_access - ae.one_access = 1 - else - ae = electronics - electronics = null - ae.loc = src.loc if(operating == -1) - ae.icon_state = "door_electronics_smoked" + new /obj/item/weapon/circuitboard/broken(src.loc) operating = 0 + else + if (!electronics) create_electronics() + + electronics.loc = src.loc + electronics = null del(src) return @@ -970,7 +960,7 @@ About the new airlock wires panel: /obj/machinery/door/airlock/set_broken() src.p_open = 1 stat |= BROKEN - if (src.security_bolts) + if (secured_wires) lock() for (var/mob/O in viewers(src, null)) if ((O.client && !( O.blinded ))) @@ -1066,9 +1056,30 @@ About the new airlock wires panel: return 1 return 0 -/obj/machinery/door/airlock/New() +/obj/machinery/door/airlock/New(var/newloc, var/obj/structure/door_assembly/assembly=null) ..() + //if assembly is given, create the new door from the assembly + if (assembly) + assembly_type = assembly.type + + electronics = assembly.electronics + electronics.loc = src + + //update the door's access to match the electronics' + secured_wires = electronics.secure + if(electronics.one_access) + req_access = null + req_one_access = src.electronics.conf_access + else + req_access = src.electronics.conf_access + + //get the name from the assembly + if(assembly.created_name) + name = assembly.created_name + else + name = "[istext(assembly.glass) ? "[assembly.glass] airlock" : assembly.base_name]" + //wires if (secured_wires) wires = new/datum/wires/airlock/secure(src) @@ -1082,6 +1093,25 @@ About the new airlock wires panel: src.closeOther = A break +// Most doors will never be deconstructed over the course of a round, +// so as an optimization defer the creation of electronics until +// the airlock is deconstructed +/obj/machinery/door/airlock/proc/create_electronics() + //create new electronics + if (secured_wires) + src.electronics = new/obj/item/weapon/airlock_electronics/secure( src.loc ) + else + src.electronics = new/obj/item/weapon/airlock_electronics( src.loc ) + + //update the electronics to match the door's access + if(!src.req_access) + src.check_access() + if(src.req_access.len) + electronics.conf_access = src.req_access + else if (src.req_one_access.len) + electronics.conf_access = src.req_one_access + electronics.one_access = 1 + /obj/machinery/door/airlock/power_change() //putting this is obj/machinery/door itself makes non-airlock doors turn invisible for some reason ..() update_icon() @@ -1093,4 +1123,4 @@ About the new airlock wires panel: src.unlock() src.open() src.lock() - return \ No newline at end of file + return diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm index 7f549375676..32e356de3fe 100644 --- a/code/game/machinery/doors/airlock_electronics.dm +++ b/code/game/machinery/doors/airlock_electronics.dm @@ -10,6 +10,7 @@ req_access = list(access_engine) + var/secure = 0 //if set, then wires will be randomized and bolts will drop if the door is broken var/list/conf_access = null var/one_access = 0 //if set to 1, door would receive req_one_access instead of req_access var/last_configurator = null @@ -114,3 +115,4 @@ name = "secure airlock electronics" desc = "designed to be somewhat more resistant to hacking than standard electronics." origin_tech = "programming=2" + secure = 1 diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index 17e34e4efd2..9fbf63ba182 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -205,7 +205,7 @@ obj/structure/door_assembly new/obj/item/stack/cable_coil(src.loc, 1) src.state = 0 - else if(istype(W, /obj/item/weapon/airlock_electronics) && state == 1 && W:icon_state != "door_electronics_smoked") + else if(istype(W, /obj/item/weapon/airlock_electronics) && state == 1) playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) user.visible_message("[user] installs the electronics into the airlock assembly.", "You start to install electronics into the airlock assembly.") @@ -219,6 +219,12 @@ obj/structure/door_assembly src.electronics = W else if(istype(W, /obj/item/weapon/crowbar) && state == 2 ) + //This should never happen, but just in case I guess + if (!electronics) + user << "There was nothing to remove." + src.state = 1 + return + playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove the electronics from the airlock assembly.") @@ -227,13 +233,8 @@ obj/structure/door_assembly user << "\blue You removed the airlock electronics!" src.state = 1 src.name = "Wired Airlock Assembly" - var/obj/item/weapon/airlock_electronics/ae - if (!electronics) - ae = new/obj/item/weapon/airlock_electronics( src.loc ) - else - ae = electronics - electronics = null - ae.loc = src.loc + electronics.loc = src.loc + electronics = null else if(istype(W, /obj/item/stack/sheet) && !glass) var/obj/item/stack/sheet/S = W @@ -271,22 +272,7 @@ obj/structure/door_assembly else path = text2path("/obj/machinery/door/airlock[airlock_type]") - var/obj/machinery/door/airlock/door = new path(src.loc) - - door.assembly_type = type - door.electronics = src.electronics - if (istype(electronics, /obj/item/weapon/airlock_electronics/secure)) - door.wires = new/datum/wires/airlock/secure(src) - if(src.electronics.one_access) - door.req_access = null - door.req_one_access = src.electronics.conf_access - else - door.req_access = src.electronics.conf_access - if(created_name) - door.name = created_name - else - door.name = "[istext(glass) ? "[glass] airlock" : base_name]" - src.electronics.loc = door + new path(src.loc, src) del(src) else ..()