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"