From 9610b6a9aff4b7b367201746f7048fd6628586dd Mon Sep 17 00:00:00 2001
From: Enric Gabriel <43283559+SandPoot@users.noreply.github.com>
Date: Sun, 16 Aug 2020 15:17:37 -0300
Subject: [PATCH] ya guys like wiring?
---
code/game/machinery/firealarm.dm | 42 +++++++++++++----
sandcode/code/__DEFINES/wires.dm | 3 ++
sandcode/code/datums/wires/firealarm.dm | 61 +++++++++++++++++++++++++
tgstation.dme | 2 +
4 files changed, 98 insertions(+), 10 deletions(-)
create mode 100644 sandcode/code/__DEFINES/wires.dm
create mode 100644 sandcode/code/datums/wires/firealarm.dm
diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm
index 000b3dc7b5..080b61d5e2 100644
--- a/code/game/machinery/firealarm.dm
+++ b/code/game/machinery/firealarm.dm
@@ -36,6 +36,10 @@
var/last_alarm = 0
var/area/myarea = null
+ var/alarm_active = FALSE
+ var/wire_override = FALSE
+ var/button_wire_cut = FALSE
+
/obj/machinery/firealarm/Initialize(mapload, dir, building)
. = ..()
if(dir)
@@ -49,8 +53,14 @@
myarea = get_base_area(src)
LAZYADD(myarea.firealarms, src)
+ wires = new /datum/wires/firealarm(src)
+
/obj/machinery/firealarm/Destroy()
LAZYREMOVE(myarea.firealarms, src)
+
+ qdel(wires)
+ wires = null
+
return ..()
/obj/machinery/firealarm/power_change()
@@ -133,6 +143,8 @@
if(user)
log_game("[user] triggered a fire alarm at [COORD(src)]")
+ alarm_active = TRUE
+
/obj/machinery/firealarm/proc/reset(mob/user)
if(!is_operational())
return
@@ -141,12 +153,16 @@
if(user)
log_game("[user] reset a fire alarm at [COORD(src)]")
+ alarm_active = FALSE
+
/obj/machinery/firealarm/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(buildstage != 2)
return ..()
add_fingerprint(user)
var/area/A = get_base_area(src)
- if(A.fire)
+ if(wire_override || button_wire_cut)
+ to_chat(user, "The fire alarm doesn't respond!")
+ else if(A.fire)
reset(user)
else
alarm(user)
@@ -169,6 +185,10 @@
if(panel_open)
+ if(panel_open && is_wire_tool(W) && user.a_intent == INTENT_HELP)
+ wires.interact(user)
+ return
+
if(istype(W, /obj/item/weldingtool) && user.a_intent == INTENT_HELP)
if(obj_integrity < max_integrity)
if(!W.tool_start_check(user, amount=0))
@@ -184,19 +204,18 @@
switch(buildstage)
if(2)
- if(istype(W, /obj/item/multitool))
- detecting = !detecting
- if (src.detecting)
- user.visible_message("[user] has reconnected [src]'s detecting unit!", "You reconnect [src]'s detecting unit.")
- else
- user.visible_message("[user] has disconnected [src]'s detecting unit!", "You disconnect [src]'s detecting unit.")
- return
-
- else if (istype(W, /obj/item/wirecutters))
+ if(istype(W, /obj/item/wirecutters) && !(user.a_intent == INTENT_HELP))
buildstage = 1
W.play_tool_sound(src)
new /obj/item/stack/cable_coil(user.loc, 5)
to_chat(user, "You cut the wires from \the [src].")
+
+ alarm_active = FALSE
+ wire_override = FALSE
+ button_wire_cut = FALSE
+ qdel(wires)
+ wires = null
+
update_icon()
return
else if(W.force) //hit and turn it on
@@ -212,6 +231,9 @@
else
buildstage = 2
to_chat(user, "You wire \the [src].")
+
+ wires = new /datum/wires/firealarm(src)
+
update_icon()
return
diff --git a/sandcode/code/__DEFINES/wires.dm b/sandcode/code/__DEFINES/wires.dm
new file mode 100644
index 0000000000..9b7acc633c
--- /dev/null
+++ b/sandcode/code/__DEFINES/wires.dm
@@ -0,0 +1,3 @@
+#define WIRE_FIRE_TOGGLE "Alarm toggle"
+#define WIRE_FIRE_DETECT "Fire detection"
+#define WIRE_FIRE_TRIGGER "Alarm trigger"
diff --git a/sandcode/code/datums/wires/firealarm.dm b/sandcode/code/datums/wires/firealarm.dm
new file mode 100644
index 0000000000..cb8ef5f71f
--- /dev/null
+++ b/sandcode/code/datums/wires/firealarm.dm
@@ -0,0 +1,61 @@
+/datum/wires/firealarm
+ holder_type = /obj/machinery/firealarm
+ proper_name = "Fire alarm's"
+ req_knowledge = JOB_SKILL_MASTER
+
+/datum/wires/firealarm/New(atom/holder)
+ wires = list(
+ WIRE_FIRE_TOGGLE,
+ WIRE_FIRE_DETECT,
+ WIRE_FIRE_TRIGGER
+ )
+ add_duds(2)
+ ..()
+
+/datum/wires/firealarm/interactable(mob/user)
+ var/obj/machinery/firealarm/A = holder
+ if(A.panel_open)
+ return TRUE
+
+/datum/wires/firealarm/get_status()
+ var/obj/machinery/firealarm/A = holder
+ var/list/status = list()
+ status += "The alarm light is [A.alarm_active ? "blinking red" : "green"]."
+ status += "The fire detection light is [A.detecting ? "on" : "off"]."
+ status += "The button wire is [A.button_wire_cut ? "cut" : "connected"]."
+ return status
+
+/datum/wires/firealarm/on_pulse(wire)
+ var/obj/machinery/firealarm/A = holder
+ switch(wire)
+ if(WIRE_FIRE_TOGGLE) // ohno, fire!
+ if(A.alarm_active && !A.wire_override)
+ A.reset()
+ else if(!A.alarm_active)
+ A.alarm() //no wire_override here, it's just a pulse.
+ if(WIRE_FIRE_DETECT)
+ A.detecting = !A.detecting
+ if(WIRE_FIRE_TRIGGER)
+ A.alarm()
+ addtimer(CALLBACK(A, /obj/machinery/firealarm.proc/reset, wire), 1000)
+
+/datum/wires/firealarm/on_cut(index, mend)
+ var/obj/machinery/firealarm/A = holder
+ switch(index)
+ if(WIRE_FIRE_TOGGLE)
+ if(mend)
+ A.wire_override = FALSE
+ A.reset()
+ else
+ A.wire_override = TRUE
+ A.alarm()
+ if(WIRE_FIRE_DETECT)
+ if(mend)
+ A.detecting = TRUE
+ else
+ A.detecting = FALSE
+ if(WIRE_FIRE_TRIGGER)
+ if(mend)
+ A.button_wire_cut = FALSE
+ else
+ A.button_wire_cut = TRUE
diff --git a/tgstation.dme b/tgstation.dme
index f715a9e84e..6d1fbe1151 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -3548,6 +3548,7 @@
#include "sandcode\code\__DEFINES\runechat_defines.dm"
#include "sandcode\code\__DEFINES\status_effects.dm"
#include "sandcode\code\__DEFINES\traits.dm"
+#include "sandcode\code\__DEFINES\wires.dm"
#include "sandcode\code\_onclick\hud\screen_objects.dm"
#include "sandcode\code\datums\action.dm"
#include "sandcode\code\datums\shuttles.dm"
@@ -3558,6 +3559,7 @@
#include "sandcode\code\datums\traits\_quirk.dm"
#include "sandcode\code\datums\traits\negative.dm"
#include "sandcode\code\datums\traits\neutral.dm"
+#include "sandcode\code\datums\wires\firealarm.dm"
#include "sandcode\code\game\area\ship_area.dm"
#include "sandcode\code\game\area\areas\ruins\lavaland.dm"
#include "sandcode\code\game\machinery\autodoc.dm"