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