diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm
index 381d2768bc5..c1f145182e8 100644
--- a/code/game/machinery/buttons.dm
+++ b/code/game/machinery/buttons.dm
@@ -5,6 +5,7 @@
desc = "A remote control switch for something."
var/id = null
var/active = 0
+ var/operating = 0
anchored = 1.0
use_power = 1
idle_power_usage = 2
@@ -31,10 +32,13 @@
/obj/machinery/button/attack_hand(mob/living/user)
..()
+ activate(user)
- if(!wifi_sender)
+/obj/machinery/button/proc/activate(mob/living/user)
+ if(operating || !wifi_sender)
return
+ operating = 1
use_power(5)
if(_wifi_toggle)
@@ -51,6 +55,7 @@
sleep(10)
active = 0
update_icon()
+ operating = 0
/obj/machinery/button/update_icon()
if(active)
@@ -58,10 +63,54 @@
else
icon_state = "launcherbtt"
-/obj/machinery/button/toggle
+/obj/machinery/button/alternate
icon = 'icons/obj/power.dmi'
icon_state = "light0"
- _wifi_toggle = 1
-/obj/machinery/button/toggle/update_icon()
+/obj/machinery/button/alternate/update_icon()
icon_state = "light[active]"
+
+//-------------------------------
+// Mass Driver Button
+// Passes the activate call to a mass driver wifi sender
+//-------------------------------
+/obj/machinery/button/mass_driver
+ var/datum/wifi/sender/mass_driver/sender
+
+/obj/machinery/button/mass_driver/initialize()
+ ..()
+ sender = new(_wifi_id, src)
+
+/obj/machinery/button/mass_driver/activate(mob/living/user)
+ if(active || !wifi_sender)
+ return
+ use_power(5)
+ active = 1
+ update_icon()
+ sender.cycle()
+ active = 0
+ update_icon()
+
+//-------------------------------
+// Door Button
+//-------------------------------
+/obj/machinery/button/door
+ var/datum/wifi/sender/door/sender
+
+/obj/machinery/button/door/initialize()
+ ..()
+ sender = new(_wifi_id, src)
+
+/obj/machinery/button/door/activate(mob/living/user)
+ if(operating || !wifi_sender)
+ return
+
+ operating = 1
+ use_power(5)
+ active = !active
+ update_icon()
+ if(!active)
+ sender.open()
+ else
+ sender.close()
+ operating = 0
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index dabe11853f1..3888686821a 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -34,6 +34,9 @@
var/open_sound_powered = 'sound/machines/airlock.ogg'
var/open_sound_unpowered = 'sound/machines/airlock_creaking.ogg'
+ var/_wifi_id
+ var/datum/wifi/receiver/button/door/wifi_receiver
+
/obj/machinery/door/airlock/attack_generic(var/mob/user, var/damage)
if(stat & (BROKEN|NOPOWER))
if(damage >= 10)
@@ -1040,9 +1043,15 @@ About the new airlock wires panel:
src.closeOther = A
break
+ //wireless connection
+ if(_wifi_id)
+ wifi_receiver = new(_wifi_id, src)
+
/obj/machinery/door/airlock/Destroy()
qdel(wires)
wires = null
+ qdel(wifi_receiver)
+ wifi_receiver = null
return ..()
// Most doors will never be deconstructed over the course of a round,
diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm
index 8c960e7bdf4..145bb63ab0c 100644
--- a/code/game/machinery/doors/blast_door.dm
+++ b/code/game/machinery/doors/blast_door.dm
@@ -28,6 +28,19 @@
//turning this off prevents awkward zone geometry in places like medbay lobby, for example.
block_air_zones = 0
+ var/_wifi_id
+ var/datum/wifi/receiver/button/door/wifi_receiver
+
+/obj/machinery/door/blast/initialize()
+ ..()
+ if(_wifi_id)
+ wifi_receiver = new(_wifi_id, src)
+
+/obj/machinery/door/airlock/Destroy()
+ qdel(wifi_receiver)
+ wifi_receiver = null
+ return ..()
+
// Proc: Bumped()
// Parameters: 1 (AM - Atom that tried to walk through this object)
// Description: If we are open returns zero, otherwise returns result of parent function.
@@ -144,7 +157,7 @@
if(stat & BROKEN)
stat &= ~BROKEN
-
+
/obj/machinery/door/blast/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
if(air_group) return 1
return ..()
diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm
index 5fd791843d9..70527609282 100755
--- a/code/game/machinery/igniter.dm
+++ b/code/game/machinery/igniter.dm
@@ -4,11 +4,32 @@
icon = 'icons/obj/stationobjs.dmi'
icon_state = "igniter1"
var/id = null
- var/on = 1.0
- anchored = 1.0
+ var/on = 0
+ anchored = 1
use_power = 1
idle_power_usage = 2
active_power_usage = 4
+ var/_wifi_id
+ var/datum/wifi/receiver/button/igniter/wifi_receiver
+
+/obj/machinery/igniter/New()
+ ..()
+ update_icon()
+
+/obj/machinery/igniter/initialize()
+ ..()
+ update_icon()
+ if(_wifi_id)
+ wifi_receiver = new(_wifi_id, src)
+
+/obj/machinery/igniter/update_icon()
+ ..()
+ icon_state = "igniter[on]"
+
+/obj/machinery/igniter/Destroy()
+ qdel(wifi_receiver)
+ wifi_receiver = null
+ return ..()
/obj/machinery/igniter/attack_ai(mob/user as mob)
return src.attack_hand(user)
@@ -17,29 +38,25 @@
if(..())
return
add_fingerprint(user)
-
- use_power(50)
- src.on = !( src.on )
- src.icon_state = text("igniter[]", src.on)
+ ignite()
return
/obj/machinery/igniter/process() //ugh why is this even in process()?
- if (src.on && !(stat & NOPOWER) )
+ if (on && powered() )
var/turf/location = src.loc
if (isturf(location))
location.hotspot_expose(1000,500,1)
return 1
-/obj/machinery/igniter/New()
- ..()
- icon_state = "igniter[on]"
-
/obj/machinery/igniter/power_change()
..()
- if(!( stat & NOPOWER) )
- icon_state = "igniter[src.on]"
- else
- icon_state = "igniter0"
+ update_icon()
+
+/obj/machinery/igniter/proc/ignite()
+ use_power(50)
+ on = !on
+ update_icon()
+
// Wall mounted remote-control igniter.
@@ -56,50 +73,59 @@
use_power = 1
idle_power_usage = 2
active_power_usage = 4
+ var/_wifi_id
+ var/datum/wifi/receiver/button/sparker/wifi_receiver
-
-/obj/machinery/sparker/New()
+/obj/machinery/sparker/initialize()
..()
+ if(_wifi_id)
+ wifi_receiver = new(_wifi_id, src)
+
+/obj/machinery/sparker/Destroy()
+ qdel(wifi_receiver)
+ wifi_receiver = null
+ return ..()
+
+/obj/machinery/sparker/update_icon()
+ ..()
+ if(disable)
+ icon_state = "migniter-d"
+ else if(powered())
+ icon_state = "migniter"
+// src.sd_SetLuminosity(2)
+ else
+ icon_state = "migniter-p"
+// src.sd_SetLuminosity(0)
/obj/machinery/sparker/power_change()
..()
- if ( !(stat & NOPOWER) && disable == 0 )
-
- icon_state = "[base_state]"
-// src.sd_SetLuminosity(2)
- else
- icon_state = "[base_state]-p"
-// src.sd_SetLuminosity(0)
+ update_icon()
/obj/machinery/sparker/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/screwdriver))
add_fingerprint(user)
- src.disable = !src.disable
- if (src.disable)
+ disable = !disable
+ if(disable)
user.visible_message("[user] has disabled the [src]!", "You disable the connection to the [src].")
- icon_state = "[base_state]-d"
- if (!src.disable)
+ else if(!disable)
user.visible_message("[user] has reconnected the [src]!", "You fix the connection to the [src].")
- if(src.powered())
- icon_state = "[base_state]"
- else
- icon_state = "[base_state]-p"
+ update_icon()
/obj/machinery/sparker/attack_ai()
- if (src.anchored)
- return src.ignite()
+ if (anchored)
+ return ignite()
else
return
/obj/machinery/sparker/proc/ignite()
- if (!(powered()))
+ if (!powered())
return
- if ((src.disable) || (src.last_spark && world.time < src.last_spark + 50))
+ if (disable || (last_spark && world.time < last_spark + 50))
return
- flick("[base_state]-spark", src)
+ flick("migniter-spark", src)
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(2, 1, src)
s.start()
@@ -132,15 +158,13 @@
icon_state = "launcheract"
for(var/obj/machinery/sparker/M in machines)
- if (M.id == src.id)
+ if (M.id == id)
spawn( 0 )
M.ignite()
for(var/obj/machinery/igniter/M in machines)
- if(M.id == src.id)
- use_power(50)
- M.on = !( M.on )
- M.icon_state = text("igniter[]", M.on)
+ if(M.id == id)
+ M.ignite()
sleep(50)
diff --git a/code/game/machinery/mass_driver.dm b/code/game/machinery/mass_driver.dm
index abd98091760..7b2775d9547 100644
--- a/code/game/machinery/mass_driver.dm
+++ b/code/game/machinery/mass_driver.dm
@@ -14,7 +14,18 @@
var/code = 1.0
var/id = 1.0
var/drive_range = 50 //this is mostly irrelevant since current mass drivers throw into space, but you could make a lower-range mass driver for interstation transport or something I guess.
+ var/_wifi_id
+ var/datum/wifi/receiver/button/mass_driver/wifi_receiver
+/obj/machinery/mass_driver/initialize()
+ ..()
+ if(_wifi_id)
+ wifi_receiver = new(_wifi_id, src)
+
+/obj/machinery/mass_driver/Destroy()
+ qdel(wifi_receiver)
+ wifi_receiver = null
+ return ..()
/obj/machinery/mass_driver/proc/drive(amount)
if(stat & (BROKEN|NOPOWER))
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index 084f9ef55f2..53668d80de7 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -51,7 +51,7 @@
investigate_log("deleted at ([x],[y],[z])","singulo")
qdel(wifi_receiver)
wifi_receiver = null
- ..()
+ return ..()
/obj/machinery/power/emitter/update_icon()
if (active && powernet && avail(active_power_usage))
diff --git a/code/modules/wireless/devices.dm b/code/modules/wireless/devices.dm
index 96400eb9941..201fcde30cf 100644
--- a/code/modules/wireless/devices.dm
+++ b/code/modules/wireless/devices.dm
@@ -1,9 +1,58 @@
+//-------------------------------
+// Doors
+//-------------------------------
+/datum/wifi/receiver/button/door/activate()
+ var/obj/machinery/door/D = parent
+ if(istype(D) && D.can_open())
+ D.open()
+
+/datum/wifi/receiver/button/door/deactivate()
+ var/obj/machinery/door/D = parent
+ if(istype(D) && D.can_close())
+ D.close()
+
+/datum/wifi/sender/door/proc/open()
+ var/datum/spawn_sync/S = new()
+
+ for(var/datum/wifi/receiver/button/door/D in connected_devices)
+ S.open()
+ spawn()
+ try
+ D.activate()
+ catch
+
+ S.close()
+ S.finalize()
+
+ while(S.check())
+ sleep(1)
+ return
+
+/datum/wifi/sender/door/proc/close()
+ var/datum/spawn_sync/S = new()
+
+ for(var/datum/wifi/receiver/button/door/D in connected_devices)
+ S.open()
+ spawn()
+ try
+ D.deactivate()
+ catch
+
+ S.close()
+ S.finalize()
+
+ while(S.check())
+ sleep(1)
+ return
+
+
//-------------------------------
// Buttons
//-------------------------------
/datum/wifi/receiver/button/proc/activate(mob/living/user)
/datum/wifi/receiver/button/proc/deactivate(mob/living/user)
+ activate(user) //override this if you want deactivate to actually do something
/datum/wifi/sender/button/proc/activate(mob/living/user)
for(var/datum/wifi/receiver/button/B in connected_devices)
@@ -23,7 +72,6 @@
E.activate(user) //if the emitter is not active, trigger the activate proc to toggle it
/datum/wifi/receiver/button/emitter/deactivate(mob/living/user)
- ..()
var/obj/machinery/power/emitter/E = parent
if(istype(E) && E.active)
E.activate(user) //if the emitter is active, trigger the activate proc to toggle it
@@ -56,7 +104,86 @@
H.toggle()
/datum/wifi/receiver/button/holosign/deactivate(mob/living/user)
- ..()
var/obj/machinery/holosign/H = parent
if(istype(H) && H.lit)
H.toggle()
+
+//-------------------------------
+// Igniter
+//-------------------------------
+/datum/wifi/receiver/button/igniter/activate(mob/living/user)
+ ..()
+ var/obj/machinery/igniter/I = parent
+ if(istype(I))
+ if(!I.on)
+ I.ignite()
+
+/datum/wifi/receiver/button/igniter/deactivate(mob/living/user)
+ if(istype(parent, /obj/machinery/igniter))
+ var/obj/machinery/igniter/I = parent
+ if(I.on)
+ I.ignite()
+
+//-------------------------------
+// Sparker
+//-------------------------------
+/datum/wifi/receiver/button/sparker/activate(mob/living/user)
+ ..()
+ var/obj/machinery/sparker/S = parent
+ if(istype(S))
+ S.ignite()
+
+//-------------------------------
+// Mass Driver Button
+//-------------------------------
+/datum/wifi/receiver/button/mass_driver/activate(mob/living/user)
+ ..()
+ var/obj/machinery/mass_driver/M = parent
+ if(istype(M))
+ M.drive()
+
+//-------------------------------
+// Mass Driver Process
+//-------------------------------
+/datum/wifi/sender/mass_driver/proc/cycle()
+ var/datum/spawn_sync/S = new()
+
+ //tell all doors to open
+ for(var/datum/wifi/receiver/button/door/D in connected_devices)
+ S.open()
+ spawn()
+ try
+ D.activate()
+ catch
+
+ S.close()
+ S.finalize()
+
+ //wait until they have all opened to continue
+ while(S.check())
+ sleep(1)
+
+ //tell all mass drivers to launch
+ for(var/datum/wifi/receiver/button/mass_driver/M in connected_devices)
+ if(istype(M))
+ spawn()
+ M.activate()
+
+ sleep(20)
+
+ //tell all doors to close
+ S.reset()
+ for(var/datum/wifi/receiver/button/door/D in connected_devices)
+ S.open()
+ spawn()
+ try
+ D.deactivate()
+ catch
+
+ S.close()
+ S.finalize()
+
+ //wait until they have all closed to continue
+ while(S.check())
+ sleep(1)
+ return