diff --git a/code/game/objects/items/weapons/keys.dm b/code/game/objects/items/weapons/keys.dm
new file mode 100644
index 0000000000..fc13449767
--- /dev/null
+++ b/code/game/objects/items/weapons/keys.dm
@@ -0,0 +1,10 @@
+/obj/item/weapon/simple_key
+ name = "key"
+ desc = "A plain, old-timey key, as one might use to unlock a door."
+ icon = 'icons/obj/keys.dmi'
+ icon_state = "key_basetype"
+ drop_sound = 'sound/items/drop/ring.ogg'
+ pickup_sound = 'sound/items/pickup/ring.ogg'
+ w_class = ITEMSIZE_TINY
+ var/keyverb = "uses" //so simple_keys can be keycards instead, if desired
+ var/key_id = "placeholder_DONOTUSE" //needs to match the associated door's LOCK_ID var
\ No newline at end of file
diff --git a/code/game/objects/structures/simple_doors.dm b/code/game/objects/structures/simple_doors.dm
index f54abd7439..f032855e3a 100644
--- a/code/game/objects/structures/simple_doors.dm
+++ b/code/game/objects/structures/simple_doors.dm
@@ -16,6 +16,10 @@
var/knock_sound = 'sound/machines/door/knock_glass.ogg'
var/knock_hammer_sound = 'sound/weapons/sonic_jackhammer.ogg'
+ var/locked = FALSE //has the door been locked?
+ var/lock_id = null //does the door have an associated key?
+ var/keysound = 'sound/items/toolbelt_equip.ogg'
+
/obj/structure/simple_door/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
TemperatureAct(exposed_temperature)
@@ -97,6 +101,9 @@
var/mob/M = user
if(!material.can_open_material_door(user))
return
+ if(locked && state == 0)
+ to_chat(M,"It's locked!")
+ return
if(world.time - user.last_bumped <= 60)
return
if(M.client)
@@ -147,13 +154,24 @@
/obj/structure/simple_door/attackby(obj/item/weapon/W as obj, mob/user as mob)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
- if(istype(W,/obj/item/weapon/pickaxe))
+ if(istype(W,/obj/item/weapon/simple_key))
+ var/obj/item/weapon/simple_key/key = W
+ if(state)
+ to_chat(user,"\The [src] must be closed in order for you to lock it.")
+ else if(key.key_id != src.lock_id)
+ to_chat(user,"The [key] doesn't fit \the [src]'s lock!")
+ else if(key.key_id == src.lock_id)
+ visible_message("[user] [key.keyverb] \the [key] and [locked ? "unlocks" : "locks"] \the [src].")
+ locked = !locked
+ playsound(src, keysound,100, 1)
+ return
+ if(istype(W,/obj/item/weapon/pickaxe) && breakable)
var/obj/item/weapon/pickaxe/digTool = W
visible_message("[user] starts digging [src]!")
if(do_after(user,digTool.digspeed*hardness) && src)
visible_message("[user] finished digging [src]!")
Dismantle()
- else if(istype(W,/obj/item/weapon)) //not sure, can't not just weapons get passed to this proc?
+ else if(istype(W,/obj/item/weapon) && breakable) //not sure, can't not just weapons get passed to this proc?
hardness -= W.force/10
visible_message("[user] hits [src] with [W]!")
if(material == get_material_by_name("resin"))
@@ -163,7 +181,7 @@
else
playsound(src, 'sound/weapons/smash.ogg', 50, 1)
CheckHardness()
- else if(istype(W,/obj/item/weapon/weldingtool))
+ else if(istype(W,/obj/item/weapon/weldingtool) && breakable)
var/obj/item/weapon/weldingtool/WT = W
if(material.ignition_point && WT.remove_fuel(0, user))
TemperatureAct(150)
diff --git a/icons/obj/keys.dmi b/icons/obj/keys.dmi
new file mode 100644
index 0000000000..cd301f910d
Binary files /dev/null and b/icons/obj/keys.dmi differ
diff --git a/vorestation.dme b/vorestation.dme
index d45f0f0880..ca8966d122 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -1305,6 +1305,7 @@
#include "code\game\objects\items\weapons\handcuffs_vr.dm"
#include "code\game\objects\items\weapons\improvised_components.dm"
#include "code\game\objects\items\weapons\inducer_vr.dm"
+#include "code\game\objects\items\weapons\keys.dm"
#include "code\game\objects\items\weapons\manuals.dm"
#include "code\game\objects\items\weapons\manuals_vr.dm"
#include "code\game\objects\items\weapons\mop.dm"