Constructing/deconstructing secure crates and lockers (#19656)

* Can make normal closets secure, and viceversa

* Separate basic lockers from the parent class, so that you can't add a lock to a coffin or statue and stuff like that

* Closets now use airlock circuitry to gain locks, and setup access

* Links non-secure crates to their secure counterparts. Also medsec

* Update cargo crates

* Basic lockers linked to basic secure lockers

* goddamnit smartgit

* Fixes locked/unlocked overlay when making a crate secure

* Can lock and alt-click lock crates, like closets

* Closets drop electronics when destroyed.

* Secure closets start unlocked. Emag fix

* Clear up whether a closet can be secured/unsecured through description

* fuck bins I guess

* lil typo

* remove comment I made as a todo while working

* and another comment

* Resolve requested changes
This commit is contained in:
Jellyveggie
2018-09-19 16:12:39 +02:00
committed by DamianX
parent f2945b313f
commit 3dbcf73aec
5 changed files with 299 additions and 71 deletions

View File

@@ -16,6 +16,9 @@
var/sound_effect_open = 'sound/machines/click.ogg'
var/sound_effect_close = 'sound/machines/click.ogg'
/obj/structure/closet/crate/basic
has_lock_type = /obj/structure/closet/crate/secure/basic
/obj/structure/closet/pcrate
name = "plastic crate"
desc = "A rectangular plastic crate."
@@ -96,6 +99,7 @@
density = 1
icon_opened = "medicalcrateopen"
icon_closed = "medicalcrate"
has_lock_type = /obj/structure/closet/crate/secure/medsec
/obj/structure/closet/crate/rcd
desc = "A crate for the storage of the RCD."
@@ -105,6 +109,7 @@
density = 1
icon_opened = "crateopen"
icon_closed = "crate"
has_lock_type = /obj/structure/closet/crate/secure/basic
/obj/structure/closet/crate/freezer
desc = "A freezer."
@@ -148,6 +153,7 @@
density = 1
icon_opened = "largebinopen"
icon_closed = "largebin"
/obj/structure/closet/crate/bin/attackby(var/obj/item/weapon/W, var/mob/user)
if(iswrench(W) && wrenchable())
return wrenchAnchor(user)
@@ -200,6 +206,7 @@
density = 1
icon_opened = "hydrosecurecrateopen"
icon_closed = "hydrosecurecrate"
has_lockless_type = /obj/structure/closet/crate/hydroponics
/obj/structure/closet/crate/secure/bin
desc = "A secure bin."
@@ -211,6 +218,7 @@
greenlight = "largebing"
sparks = "largebinsparks"
emag = "largebinemag"
/obj/structure/closet/crate/secure/bin/attackby(var/obj/item/weapon/W, var/mob/user)
if(iswrench(W) && wrenchable())
return wrenchAnchor(user)
@@ -228,6 +236,7 @@
icon_closed = "largemetal"
redlight = "largemetalr"
greenlight = "largemetalg"
has_lockless_type = /obj/structure/closet/crate/large
/obj/structure/closet/crate/secure/large/close()
//we can hold up to one large item
@@ -265,8 +274,12 @@
var/emag = "securecrateemag"
broken = 0
locked = 1
has_electronics = 1
health = 1000
/obj/structure/closet/crate/secure/basic
has_lockless_type = /obj/structure/closet/crate/basic
/obj/structure/closet/crate/secure/anti_tamper
name = "Extra-secure crate"
@@ -290,6 +303,7 @@
icon_state = "largemetal"
icon_opened = "largemetalopen"
icon_closed = "largemetal"
has_lock_type = /obj/structure/closet/crate/secure/large
/obj/structure/closet/crate/large/close()
//we can hold up to one large item
@@ -316,6 +330,7 @@
icon_opened = "hydrocrateopen"
icon_closed = "hydrocrate"
density = 1
has_lock_type = /obj/structure/closet/crate/secure/hydrosec
/obj/structure/closet/crate/sci
desc = "A science crate."
@@ -325,6 +340,7 @@
density = 1
icon_opened = "scicrateopen"
icon_closed = "scicrate"
has_lock_type = /obj/structure/closet/crate/secure/scisec
/obj/structure/closet/crate/secure/scisec
desc = "A secure science crate."
@@ -334,6 +350,7 @@
density = 1
icon_opened = "scisecurecrateopen"
icon_closed = "scisecurecrate"
has_lockless_type = /obj/structure/closet/crate/sci
/obj/structure/closet/crate/engi
desc = "An engineering crate."
@@ -343,6 +360,7 @@
density = 1
icon_opened = "engicrateopen"
icon_closed = "engicrate"
has_lock_type = /obj/structure/closet/crate/secure/engisec
/obj/structure/closet/crate/secure/engisec
desc = "A secure engineering crate."
@@ -352,6 +370,7 @@
density = 1
icon_opened = "engisecurecrateopen"
icon_closed = "engisecurecrate"
has_lockless_type = /obj/structure/closet/crate/engi
/obj/structure/closet/crate/secure/medsec
desc = "A secure medical crate."
@@ -361,6 +380,7 @@
density = 1
icon_opened = "medicalsecurecrateopen"
icon_closed = "medicalsecurecrate"
has_lockless_type = /obj/structure/closet/crate/medical
/obj/structure/closet/crate/secure/plasma/prefilled
var/count=10
@@ -379,12 +399,7 @@
/obj/structure/closet/crate/secure/New()
..()
if(locked)
overlays.len = 0
overlays += redlight
else
overlays.len = 0
overlays += greenlight
update_icon()
/obj/structure/closet/crate/rcd/New()
..()
@@ -488,23 +503,28 @@
if (allowed(user))
to_chat(user, "<span class='notice'>You unlock [src].</span>")
src.locked = 0
overlays.len = 0
overlays += greenlight
update_icon()
return
else
to_chat(user, "<span class='notice'>[src] is locked.</span>")
to_chat(user, "<span class='notice'>Access Denied.</span>")
return
else
..()
/obj/structure/closet/crate/secure/proc/togglelock(mob/user)
if(src.allowed(user))
src.locked = !src.locked
if (src.locked)
to_chat(user, "<span class='notice'>You lock \the [src].</span>")
update_icon()
else
to_chat(user, "<span class='notice'>You unlock [src].</span>")
update_icon()
else
to_chat(user, "<span class='notice'>Access Denied.</span>")
/obj/structure/closet/crate/secure/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/card) && src.allowed(user) && !locked && !opened && !broken)
to_chat(user, "<span class='notice'>You lock \the [src].</span>")
src.locked = 1
overlays.len = 0
overlays += redlight
return
else if ( istype(W, /obj/item/weapon/card/emag) && locked &&!broken)
if ( istype(W, /obj/item/weapon/card/emag) && locked &&!broken)
overlays.len = 0
overlays += emag
overlays += sparks
@@ -514,14 +534,61 @@
src.broken = 1
to_chat(user, "<span class='notice'>You unlock \the [src].</span>")
return
else if(istype(W, /obj/item/weapon/card) && !opened && !broken)
togglelock(user)
return
else if(istype(W, /obj/item/weapon/screwdriver) && !opened && !locked && src.has_lockless_type)
remove_lock(user)
return
return ..()
/obj/structure/closet/crate/secure/verb/verb_togglelock()
set src in oview(1) // One square distance
set category = "Object"
set name = "Toggle Lock"
if(usr.incapacitated()) // Don't use it if you're not able to! Checks for stuns, ghost and restrain
return
if(!Adjacent(usr) || usr.loc == src)
return
if(src.broken)
return
if (ishuman(usr))
if (!opened)
togglelock(usr)
return 1
else
to_chat(usr, "<span class='warning'>This mob type can't use this verb.</span>")
/obj/structure/closet/crate/secure/AltClick()
if(verb_togglelock())
return
return ..()
/obj/structure/closet/crate/secure/update_icon()
if(opened)
icon_state = icon_opened
else
icon_state = icon_closed
if (!broken)
overlays.len = 0
if(locked)
overlays += redlight
else
overlays += greenlight
/obj/structure/closet/crate/attack_paw(mob/user as mob)
return attack_hand(user)
/obj/structure/closet/crate/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(opened)
return ..()
else if(istype(W, /obj/item/weapon/circuitboard/airlock) && src.has_lock_type)
add_lock(W, user)
return
else if(istype(W, /obj/item/stack/package_wrap))
return
else if(istype(W, /obj/item/stack/cable_coil))
@@ -555,8 +622,7 @@
if(!broken && !opened && prob(50/severity))
if(!locked)
src.locked = 1
overlays.len = 0
overlays += redlight
update_icon()
else
overlays.len = 0
overlays += emag
@@ -581,6 +647,12 @@
qdel(src)
return
if(2.0)
broken = 1
if(has_electronics)
if (prob(50))
dump_electronics()
else
qdel(electronics)
for(var/obj/O in src.contents)
if(prob(50))
qdel(O)
@@ -588,6 +660,9 @@
return
if(3.0)
if (prob(50))
broken = 1
if(has_electronics)
dump_electronics()
qdel(src)
return
else