diff --git a/baystation12.dme b/baystation12.dme
index 517d479c851..87530435e11 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -420,6 +420,7 @@
#include "code\game\machinery\deployable.dm"
#include "code\game\machinery\door_control.dm"
#include "code\game\machinery\doppler_array.dm"
+#include "code\game\machinery\firealarm.dm"
#include "code\game\machinery\flasher.dm"
#include "code\game\machinery\floodlight.dm"
#include "code\game\machinery\floor_light.dm"
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index aec01d56e45..435b5972946 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -883,389 +883,4 @@ Just a object used in constructing air alarms
w_class = 2.0
matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
-/*
-FIRE ALARM
-*/
-/obj/machinery/firealarm
- name = "fire alarm"
- desc = "\"Pull this in case of emergency\". Thus, keep pulling it forever."
- icon = 'icons/obj/monitors.dmi'
- icon_state = "fire0"
- var/detecting = 1.0
- var/working = 1.0
- var/time = 10.0
- var/timing = 0.0
- var/lockdownbyai = 0
- anchored = 1.0
- use_power = 1
- idle_power_usage = 2
- active_power_usage = 6
- power_channel = ENVIRON
- var/last_process = 0
- var/wiresexposed = 0
- var/buildstage = 2 // 2 = complete, 1 = no wires, 0 = circuit gone
- var/seclevel
-
-/obj/machinery/firealarm/update_icon()
- overlays.Cut()
-
- if(wiresexposed)
- switch(buildstage)
- if(2)
- icon_state="fire_b2"
- if(1)
- icon_state="fire_b1"
- if(0)
- icon_state="fire_b0"
- set_light(0)
- return
-
- if(stat & BROKEN)
- icon_state = "firex"
- set_light(0)
- else if(stat & NOPOWER)
- icon_state = "firep"
- set_light(0)
- else
- if(!src.detecting)
- icon_state = "fire1"
- set_light(l_range = 4, l_power = 2, l_color = COLOR_RED)
- else
- icon_state = "fire0"
- switch(seclevel)
- if("green") set_light(l_range = 2, l_power = 0.5, l_color = COLOR_LIME)
- if("blue") set_light(l_range = 2, l_power = 0.5, l_color = "#1024A9")
- if("red") set_light(l_range = 4, l_power = 2, l_color = COLOR_RED)
- if("delta") set_light(l_range = 4, l_power = 2, l_color = "#FF6633")
-
- src.overlays += image('icons/obj/monitors.dmi', "overlay_[seclevel]")
-
-/obj/machinery/firealarm/fire_act(datum/gas_mixture/air, temperature, volume)
- if(src.detecting)
- if(temperature > T0C+200)
- src.alarm() // added check of detector status here
- return
-
-/obj/machinery/firealarm/attack_ai(mob/user as mob)
- return src.attack_hand(user)
-
-/obj/machinery/firealarm/bullet_act()
- return src.alarm()
-
-/obj/machinery/firealarm/emp_act(severity)
- if(prob(50/severity))
- alarm(rand(30/severity, 60/severity))
- ..()
-
-/obj/machinery/firealarm/attackby(obj/item/W as obj, mob/user as mob)
- src.add_fingerprint(user)
-
- if (istype(W, /obj/item/weapon/screwdriver) && buildstage == 2)
- wiresexposed = !wiresexposed
- update_icon()
- return
-
- if(wiresexposed)
- switch(buildstage)
- if(2)
- if (istype(W, /obj/item/device/multitool))
- src.detecting = !( src.detecting )
- if (src.detecting)
- user.visible_message("\The [user] has reconnected [src]'s detecting unit!", "You have reconnected [src]'s detecting unit.")
- else
- user.visible_message("\The [user] has disconnected [src]'s detecting unit!", "You have disconnected [src]'s detecting unit.")
- else if (istype(W, /obj/item/weapon/wirecutters))
- user.visible_message("\The [user] has cut the wires inside \the [src]!", "You have cut the wires inside \the [src].")
- new/obj/item/stack/cable_coil(get_turf(src), 5)
- playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
- buildstage = 1
- update_icon()
- if(1)
- if(istype(W, /obj/item/stack/cable_coil))
- var/obj/item/stack/cable_coil/C = W
- if (C.use(5))
- user << "You wire \the [src]."
- buildstage = 2
- return
- else
- user << "You need 5 pieces of cable to wire \the [src]."
- return
- else if(istype(W, /obj/item/weapon/crowbar))
- user << "You pry out the circuit!"
- playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
- spawn(20)
- var/obj/item/weapon/firealarm_electronics/circuit = new /obj/item/weapon/firealarm_electronics()
- circuit.loc = user.loc
- buildstage = 0
- update_icon()
- if(0)
- if(istype(W, /obj/item/weapon/firealarm_electronics))
- user << "You insert the circuit!"
- qdel(W)
- buildstage = 1
- update_icon()
-
- else if(istype(W, /obj/item/weapon/wrench))
- user << "You remove the fire alarm assembly from the wall!"
- new /obj/item/frame/fire_alarm(get_turf(user))
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
- qdel(src)
- return
-
- src.alarm()
- return
-
-/obj/machinery/firealarm/process()//Note: this processing was mostly phased out due to other code, and only runs when needed
- if(stat & (NOPOWER|BROKEN))
- return
-
- if(src.timing)
- if(src.time > 0)
- src.time = src.time - ((world.timeofday - last_process)/10)
- else
- src.alarm()
- src.time = 0
- src.timing = 0
- processing_objects.Remove(src)
- src.updateDialog()
- last_process = world.timeofday
-
- if(locate(/obj/fire) in loc)
- alarm()
-
- return
-
-/obj/machinery/firealarm/power_change()
- ..()
- spawn(rand(0,15))
- update_icon()
-
-/obj/machinery/firealarm/attack_hand(mob/user as mob)
- if(user.stat || stat & (NOPOWER|BROKEN))
- return
-
- if (buildstage != 2)
- return
-
- user.set_machine(src)
- var/area/A = src.loc
- var/d1
- var/d2
- if (istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon))
- A = A.loc
-
- if (A.fire)
- d1 = text("Reset - Lockdown", src)
- else
- d1 = text("Alarm - Lockdown", src)
- if (src.timing)
- d2 = text("Stop Time Lock", src)
- else
- d2 = text("Initiate Time Lock", src)
- var/second = round(src.time) % 60
- var/minute = (round(src.time) - second) / 60
- var/dat = "
Fire alarm [d1]\n
The current alert level is: [get_security_level()]
\nTimer System: [d2]
\nTime Left: [(minute ? "[minute]:" : null)][second] - - + +\n"
- user << browse(dat, "window=firealarm")
- onclose(user, "firealarm")
- else
- A = A.loc
- if (A.fire)
- d1 = text("[]", src, stars("Reset - Lockdown"))
- else
- d1 = text("[]", src, stars("Alarm - Lockdown"))
- if (src.timing)
- d2 = text("[]", src, stars("Stop Time Lock"))
- else
- d2 = text("[]", src, stars("Initiate Time Lock"))
- var/second = round(src.time) % 60
- var/minute = (round(src.time) - second) / 60
- var/dat = "[stars("Fire alarm")] [d1]\n
The current alert level is: [stars(get_security_level())]
\nTimer System: [d2]
\nTime Left: [(minute ? text("[]:", minute) : null)][second] - - + +\n"
- user << browse(dat, "window=firealarm")
- onclose(user, "firealarm")
- return
-
-/obj/machinery/firealarm/Topic(href, href_list)
- ..()
- if (usr.stat || stat & (BROKEN|NOPOWER))
- return
-
- if (buildstage != 2)
- return
-
- if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
- usr.set_machine(src)
- if (href_list["reset"])
- src.reset()
- else if (href_list["alarm"])
- src.alarm()
- else if (href_list["time"])
- src.timing = text2num(href_list["time"])
- last_process = world.timeofday
- processing_objects.Add(src)
- else if (href_list["tp"])
- var/tp = text2num(href_list["tp"])
- src.time += tp
- src.time = min(max(round(src.time), 0), 120)
-
- src.updateUsrDialog()
-
- src.add_fingerprint(usr)
- else
- usr << browse(null, "window=firealarm")
- return
- return
-
-/obj/machinery/firealarm/proc/reset()
- if (!( src.working ))
- return
- var/area/area = get_area(src)
- for(var/obj/machinery/firealarm/FA in area)
- fire_alarm.clearAlarm(loc, FA)
- update_icon()
- return
-
-/obj/machinery/firealarm/proc/alarm(var/duration = 0)
- if (!( src.working))
- return
- var/area/area = get_area(src)
- for(var/obj/machinery/firealarm/FA in area)
- fire_alarm.triggerAlarm(loc, FA, duration)
- update_icon()
- //playsound(src.loc, 'sound/ambience/signal.ogg', 75, 0)
- return
-
-
-
-/obj/machinery/firealarm/New(loc, dir, building)
- ..()
-
- if(loc)
- src.loc = loc
-
- if(dir)
- src.set_dir(dir)
-
- if(building)
- buildstage = 0
- wiresexposed = 1
- pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24)
- pixel_y = (dir & 3)? (dir ==1 ? -24 : 24) : 0
-
-/obj/machinery/firealarm/proc/set_security_level(var/newlevel)
- if(seclevel != newlevel)
- seclevel = newlevel
- update_icon()
-
-/obj/machinery/firealarm/initialize()
- if(z in config.contact_levels)
- set_security_level(security_level? get_security_level() : "green")
-
-/*
-FIRE ALARM CIRCUIT
-Just a object used in constructing fire alarms
-*/
-/obj/item/weapon/firealarm_electronics
- name = "fire alarm electronics"
- icon = 'icons/obj/doors/door_assembly.dmi'
- icon_state = "door_electronics"
- desc = "A circuit. It has a label on it, it says \"Can handle heat levels up to 40 degrees celsius!\""
- w_class = 2.0
- matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
-
-/obj/machinery/partyalarm
- name = "\improper PARTY BUTTON"
- desc = "Cuban Pete is in the house!"
- icon = 'icons/obj/monitors.dmi'
- icon_state = "fire0"
- var/detecting = 1.0
- var/working = 1.0
- var/time = 10.0
- var/timing = 0.0
- var/lockdownbyai = 0
- anchored = 1.0
- use_power = 1
- idle_power_usage = 2
- active_power_usage = 6
-
-/obj/machinery/partyalarm/attack_hand(mob/user as mob)
- if(user.stat || stat & (NOPOWER|BROKEN))
- return
-
- user.machine = src
- var/area/A = get_area(src)
- ASSERT(isarea(A))
- var/d1
- var/d2
- if (istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon/ai))
-
- if (A.party)
- d1 = text("No Party :(", src)
- else
- d1 = text("PARTY!!!", src)
- if (timing)
- d2 = text("Stop Time Lock", src)
- else
- d2 = text("Initiate Time Lock", src)
- var/second = time % 60
- var/minute = (time - second) / 60
- var/dat = text("Party Button []\n
\nTimer System: []
\nTime Left: [][] - - + +\n", d1, d2, (minute ? text("[]:", minute) : null), second, src, src, src, src)
- user << browse(dat, "window=partyalarm")
- onclose(user, "partyalarm")
- else
- if (A.fire)
- d1 = text("[]", src, stars("No Party :("))
- else
- d1 = text("[]", src, stars("PARTY!!!"))
- if (timing)
- d2 = text("[]", src, stars("Stop Time Lock"))
- else
- d2 = text("[]", src, stars("Initiate Time Lock"))
- var/second = time % 60
- var/minute = (time - second) / 60
- var/dat = text("[] []\n
\nTimer System: []
\nTime Left: [][] - - + +\n", stars("Party Button"), d1, d2, (minute ? text("[]:", minute) : null), second, src, src, src, src)
- user << browse(dat, "window=partyalarm")
- onclose(user, "partyalarm")
- return
-
-/obj/machinery/partyalarm/proc/reset()
- if (!( working ))
- return
- var/area/A = get_area(src)
- ASSERT(isarea(A))
- A.partyreset()
- return
-
-/obj/machinery/partyalarm/proc/alarm()
- if (!( working ))
- return
- var/area/A = get_area(src)
- ASSERT(isarea(A))
- A.partyalert()
- return
-
-/obj/machinery/partyalarm/Topic(href, href_list)
- ..()
- if (usr.stat || stat & (BROKEN|NOPOWER))
- return
- if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon/ai)))
- usr.machine = src
- if (href_list["reset"])
- reset()
- else
- if (href_list["alarm"])
- alarm()
- else
- if (href_list["time"])
- timing = text2num(href_list["time"])
- else
- if (href_list["tp"])
- var/tp = text2num(href_list["tp"])
- time += tp
- time = min(max(round(time), 0), 120)
- updateUsrDialog()
-
- add_fingerprint(usr)
- else
- usr << browse(null, "window=partyalarm")
- return
- return
+// Fire Alarms moved to firealarm.dm
\ No newline at end of file
diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm
new file mode 100644
index 00000000000..7131cbac3cd
--- /dev/null
+++ b/code/game/machinery/firealarm.dm
@@ -0,0 +1,282 @@
+/obj/machinery/firealarm
+ name = "fire alarm"
+ desc = "\"Pull this in case of emergency\". Thus, keep pulling it forever."
+ icon = 'icons/obj/monitors.dmi'
+ icon_state = "fire0"
+ var/detecting = 1
+ var/working = 1
+ var/time = 10
+ var/timing = 0
+ var/lockdownbyai = 0
+ anchored = 1
+ use_power = 1
+ idle_power_usage = 2
+ active_power_usage = 6
+ power_channel = ENVIRON
+ var/last_process = 0
+ var/wiresexposed = 0
+ var/buildstage = 2 // 2 = complete, 1 = no wires, 0 = circuit gone
+ var/seclevel
+
+/obj/machinery/firealarm/update_icon()
+ overlays.Cut()
+
+ if(wiresexposed)
+ switch(buildstage)
+ if(2)
+ icon_state="fire_b2"
+ if(1)
+ icon_state="fire_b1"
+ if(0)
+ icon_state="fire_b0"
+ set_light(0)
+ return
+
+ if(stat & BROKEN)
+ icon_state = "firex"
+ set_light(0)
+ else if(stat & NOPOWER)
+ icon_state = "firep"
+ set_light(0)
+ else
+ var/area/A = get_area(src)
+ if(A.fire)
+ icon_state = "fire1"
+ set_light(l_range = 4, l_power = 2, l_color = COLOR_RED)
+ else
+ icon_state = "fire0"
+ switch(seclevel)
+ if("green") set_light(l_range = 2, l_power = 0.5, l_color = COLOR_LIME)
+ if("blue") set_light(l_range = 2, l_power = 0.5, l_color = "#1024A9")
+ if("red") set_light(l_range = 4, l_power = 2, l_color = COLOR_RED)
+ if("delta") set_light(l_range = 4, l_power = 2, l_color = "#FF6633")
+
+ src.overlays += image('icons/obj/monitors.dmi', "overlay_[seclevel]")
+
+/obj/machinery/firealarm/fire_act(datum/gas_mixture/air, temperature, volume)
+ if(src.detecting)
+ if(temperature > T0C+200)
+ src.alarm() // added check of detector status here
+ return
+
+/obj/machinery/firealarm/attack_ai(mob/user as mob)
+ return src.attack_hand(user)
+
+/obj/machinery/firealarm/bullet_act()
+ return src.alarm()
+
+/obj/machinery/firealarm/emp_act(severity)
+ if(prob(50/severity))
+ alarm(rand(30/severity, 60/severity))
+ ..()
+
+/obj/machinery/firealarm/attackby(obj/item/W as obj, mob/user as mob)
+ src.add_fingerprint(user)
+
+ if (istype(W, /obj/item/weapon/screwdriver) && buildstage == 2)
+ wiresexposed = !wiresexposed
+ update_icon()
+ return
+
+ if(wiresexposed)
+ switch(buildstage)
+ if(2)
+ if (istype(W, /obj/item/device/multitool))
+ src.detecting = !( src.detecting )
+ if (src.detecting)
+ user.visible_message("\The [user] has reconnected [src]'s detecting unit!", "You have reconnected [src]'s detecting unit.")
+ else
+ user.visible_message("\The [user] has disconnected [src]'s detecting unit!", "You have disconnected [src]'s detecting unit.")
+ else if (istype(W, /obj/item/weapon/wirecutters))
+ user.visible_message("\The [user] has cut the wires inside \the [src]!", "You have cut the wires inside \the [src].")
+ new/obj/item/stack/cable_coil(get_turf(src), 5)
+ playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
+ buildstage = 1
+ update_icon()
+ if(1)
+ if(istype(W, /obj/item/stack/cable_coil))
+ var/obj/item/stack/cable_coil/C = W
+ if (C.use(5))
+ user << "You wire \the [src]."
+ buildstage = 2
+ return
+ else
+ user << "You need 5 pieces of cable to wire \the [src]."
+ return
+ else if(istype(W, /obj/item/weapon/crowbar))
+ user << "You pry out the circuit!"
+ playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
+ spawn(20)
+ var/obj/item/weapon/firealarm_electronics/circuit = new /obj/item/weapon/firealarm_electronics()
+ circuit.loc = user.loc
+ buildstage = 0
+ update_icon()
+ if(0)
+ if(istype(W, /obj/item/weapon/firealarm_electronics))
+ user << "You insert the circuit!"
+ qdel(W)
+ buildstage = 1
+ update_icon()
+
+ else if(istype(W, /obj/item/weapon/wrench))
+ user << "You remove the fire alarm assembly from the wall!"
+ new /obj/item/frame/fire_alarm(get_turf(user))
+ playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ qdel(src)
+ return
+
+ src.alarm()
+ return
+
+/obj/machinery/firealarm/process()//Note: this processing was mostly phased out due to other code, and only runs when needed
+ if(stat & (NOPOWER|BROKEN))
+ return
+
+ if(src.timing)
+ if(src.time > 0)
+ src.time = src.time - ((world.timeofday - last_process)/10)
+ else
+ src.alarm()
+ src.time = 0
+ src.timing = 0
+ processing_objects.Remove(src)
+ src.updateDialog()
+ last_process = world.timeofday
+
+ if(locate(/obj/fire) in loc)
+ alarm()
+
+ return
+
+/obj/machinery/firealarm/power_change()
+ ..()
+ spawn(rand(0,15))
+ update_icon()
+
+/obj/machinery/firealarm/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state)
+ var/data[0]
+ data["alertLevel"] = get_security_level()
+ data["time"] = src.time
+ var/area/A = get_area(src)
+ data["active"] = A.fire
+
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ if (!ui)
+ ui = new(user, src, ui_key, "firealarm.tmpl", "Fire Alarm", 325, 325, state = state)
+ ui.set_initial_data(data)
+ ui.open()
+ ui.set_auto_update(1)
+
+/obj/machinery/firealarm/attack_hand(mob/user as mob)
+ if (buildstage != 2 || stat & (NOPOWER|BROKEN))
+ return
+
+ ui_interact(user)
+ return
+
+/obj/machinery/firealarm/Topic(href, href_list)
+ ..()
+
+ if (href_list["state"] == "active")
+ src.alarm()
+ else if (href_list["state"] == "inactive")
+ src.reset()
+ if (href_list["tmr"] == "set")
+ time = max(0, input(usr, "Enter time delay", "Fire Alarm Delayed Activation", time) as num)
+ else if (href_list["tmr"] == "start")
+ src.timing = 1
+ else if (href_list["tmr"] == "stop")
+ src.timing = 0
+
+/obj/machinery/firealarm/proc/reset()
+ if (!( src.working ))
+ return
+ var/area/area = get_area(src)
+ for(var/obj/machinery/firealarm/FA in area)
+ fire_alarm.clearAlarm(loc, FA)
+ update_icon()
+ return
+
+/obj/machinery/firealarm/proc/alarm(var/duration = 0)
+ if (!( src.working))
+ return
+ var/area/area = get_area(src)
+ for(var/obj/machinery/firealarm/FA in area)
+ fire_alarm.triggerAlarm(loc, FA, duration)
+ update_icon()
+ //playsound(src.loc, 'sound/ambience/signal.ogg', 75, 0)
+ return
+
+
+
+/obj/machinery/firealarm/New(loc, dir, building)
+ ..()
+
+ if(loc)
+ src.loc = loc
+
+ if(dir)
+ src.set_dir(dir)
+
+ if(building)
+ buildstage = 0
+ wiresexposed = 1
+ icon_state = "fire_b0"
+ pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24)
+ pixel_y = (dir & 3)? (dir ==1 ? -24 : 24) : 0
+
+/obj/machinery/firealarm/proc/set_security_level(var/newlevel)
+ if(seclevel != newlevel)
+ seclevel = newlevel
+ update_icon()
+
+/obj/machinery/firealarm/initialize()
+ if(z in config.contact_levels)
+ set_security_level(security_level? get_security_level() : "green")
+
+/*
+FIRE ALARM CIRCUIT
+Just a object used in constructing fire alarms
+*/
+/obj/item/weapon/firealarm_electronics
+ name = "fire alarm electronics"
+ icon = 'icons/obj/doors/door_assembly.dmi'
+ icon_state = "door_electronics"
+ desc = "A circuit. It has a label on it, it says \"Can handle heat levels up to 40 degrees celsius!\""
+ w_class = 2.0
+ matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
+
+
+/obj/machinery/firealarm/partyalarm
+ name = "\improper PARTY BUTTON"
+ desc = "Cuban Pete is in the house!"
+
+/obj/machinery/firealarm/partyalarm/alarm(var/duration = 0)
+ if (!( working ))
+ return
+ var/area/A = get_area(src)
+ ASSERT(isarea(A))
+ A.partyalert()
+ return
+
+/obj/machinery/firealarm/partyalarm/reset()
+ if (!( working ))
+ return
+ var/area/A = get_area(src)
+ ASSERT(isarea(A))
+ A.partyreset()
+ return
+
+/obj/machinery/firealarm/partyalarm/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state)
+ var/data[0]
+ data["alertLevel"] = get_security_level()
+ data["time"] = src.time
+ var/area/A = get_area(src)
+ data["active"] = A.party
+
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ if (!ui)
+ ui = new(user, src, ui_key, "partyalarm.tmpl", "PARTY ALARM", 325, 325, state = state)
+ ui.set_initial_data(data)
+ ui.open()
+ ui.set_auto_update(1)
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 804b3c703b9..c75dab8920e 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -944,7 +944,7 @@
icon_state = "engivend"
icon_deny = "engivend-deny"
req_access = list(access_engine_equip)
- products = list(/obj/item/clothing/glasses/meson = 2,/obj/item/device/multitool = 4,/obj/item/weapon/airlock_electronics = 10,/obj/item/weapon/module/power_control = 10,/obj/item/weapon/airalarm_electronics = 10,/obj/item/weapon/cell/high = 10)
+ products = list(/obj/item/clothing/glasses/meson = 2,/obj/item/device/multitool = 4,/obj/item/weapon/airlock_electronics = 10,/obj/item/weapon/module/power_control = 10,/obj/item/weapon/airalarm_electronics = 10,/obj/item/weapon/firealarm_electronics = 10,/obj/item/weapon/cell/high = 10)
contraband = list(/obj/item/weapon/cell/potato = 3)
premium = list(/obj/item/weapon/storage/belt/utility = 3)
diff --git a/code/game/objects/structures/lamarr_cage.dm b/code/game/objects/structures/lamarr_cage.dm
index ade6807dcb3..69d7480583b 100644
--- a/code/game/objects/structures/lamarr_cage.dm
+++ b/code/game/objects/structures/lamarr_cage.dm
@@ -65,8 +65,8 @@
usr << "You kick the lab cage."
for(var/mob/O in oviewers())
if ((O.client && !( O.blinded )))
- O << "[] kicks the lab cage."
-
+ O << "[user] kicks the lab cage."
+
src.health -= 2
healthcheck()
return
@@ -182,7 +182,7 @@ var/const/MAX_ACTIVE_TIME = 400
if(stat != CONSCIOUS) return
if(!sterile) L.take_organ_damage(strength,0) //done here so that even borgs and humans in helmets take damage
- L.visible_message("\[src] leaps at [L]'s face!")
+ L.visible_message("[src] leaps at [L]'s face!")
if(ishuman(L))
diff --git a/html/changelogs/Lohikar-PR1342.yml b/html/changelogs/Lohikar-PR1342.yml
new file mode 100644
index 00000000000..fa97ac8d897
--- /dev/null
+++ b/html/changelogs/Lohikar-PR1342.yml
@@ -0,0 +1,38 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Lohikar
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - bugfix: "Fire alarms are constructable again."
+ - rscadd: "Fire alarms now use NanoUI."
+ - tweak: "Fire alarms now indicate on the alarm sprite when they're activated."
diff --git a/nano/templates/firealarm.tmpl b/nano/templates/firealarm.tmpl
new file mode 100644
index 00000000000..d8f5be8c98d
--- /dev/null
+++ b/nano/templates/firealarm.tmpl
@@ -0,0 +1,24 @@
+The current alert level is:
+{{if data.alertLevel == 'green'}}
+ Green
+{{/if}}
+{{if data.alertLevel == 'blue'}}
+ Blue
+{{/if}}
+{{if data.alertLevel == 'red'}}
+ Red
+{{/if}}
+{{if data.alertLevel == 'delta'}}
+ DELTA
+{{/if}}
+
+State
+{{:helper.link('Normal', '', {'state': 'inactive'}, data.active ? null : 'selected')}}
+{{:helper.link('Lockdown', '', {'state': 'active'}, data.active ? 'selected' : null)}}
+Timed Lockdown
+{{:helper.link('Set', '', {'tmr' : 'set'})}}
+{{if data.timing}}
+{{:helper.link('Stop', '', {'tmr' : 'stop'})}}
+{{/if}}
+{{if !(data.timing)}}{{:helper.link('Start', '', {'tmr' : 'start'})}}{{/if}}
+{{if data.time}}Time Left: {{:data.time}} seconds.{{/if}}
\ No newline at end of file
diff --git a/nano/templates/partyalarm.tmpl b/nano/templates/partyalarm.tmpl
new file mode 100644
index 00000000000..e3adb80ffdd
--- /dev/null
+++ b/nano/templates/partyalarm.tmpl
@@ -0,0 +1,24 @@
+The current alert level is:
+{{if data.alertLevel == 'green'}}
+ Green
+{{/if}}
+{{if data.alertLevel == 'blue'}}
+ Blue
+{{/if}}
+{{if data.alertLevel == 'red'}}
+ Red
+{{/if}}
+{{if data.alertLevel == 'delta'}}
+ DELTA
+{{/if}}
+
+State
+{{:helper.link('No Party :(', '', {'state': 'inactive'}, data.active ? null : 'selected')}}
+{{:helper.link('PARTY!!!', '', {'state': 'active'}, data.active ? 'selected' : null)}}
+Timed Lockdown
+{{:helper.link('Set', '', {'tmr' : 'set'})}}
+{{if data.timing}}
+{{:helper.link('Stop', '', {'tmr' : 'stop'})}}
+{{/if}}
+{{if !(data.timing)}}{{:helper.link('Start', '', {'tmr' : 'start'})}}{{/if}}
+{{if data.time}}Time Left: {{:data.time}} seconds.{{/if}}
\ No newline at end of file