/obj/item/device/timer name = "timer" icon_state = "timer0" item_state = "electronic" var/timing = 0.0 var/time = null var/last_tick = 0 flags = FPRINT | TABLEPASS| CONDUCT w_class = 2.0 m_amt = 100 mats = 2 desc = "A device that emits a signal when the time reaches 0." module_research = list("devices" = 1, "miniaturization" = 4) /obj/item/device/timer/proc/time() src.c_state(0) if (src.master) spawn( 0 ) var/datum/signal/signal = get_free_signal() signal.source = src signal.data["message"] = "ACTIVATE" src.master.receive_signal(signal) //qdel(signal) return else for(var/mob/O in hearers(null, null)) O.show_message("[bicon(src)] *beep* *beep*", 3, "*beep* *beep*", 2) return //*****RM /obj/item/device/timer/proc/c_state(n) //src.icon_state = text("timer[]", n) if(src.master) src.master:c_state(n) return //***** /obj/item/device/timer/process() if (src.timing) if (!last_tick) last_tick = world.time var/passed_time = round(max(round(world.time - last_tick),10) / 10) if (src.time > 0) src.time -= passed_time if(time<5) src.c_state(2) else // they might increase the time while it is timing src.c_state(1) else time() src.time = 0 src.timing = 0 last_tick = 0 last_tick = world.time if (!src.master) if (istype(src.loc, /mob)) attack_self(src.loc) else for(var/mob/M in viewers(1, src)) if (M.client && (M.machine == src.master || M.machine == src)) src.attack_self(M) else if (istype(src.master.loc, /mob)) src.attack_self(src.master.loc) else for(var/mob/M in viewers(1, src.master)) if (M.client && (M.machine == src.master || M.machine == src)) src.attack_self(M) else // If it's not timing, reset the icon so it doesn't look like it's still about to go off. src.c_state(0) processing_items.Remove(src) last_tick = 0 return /obj/item/device/timer/attackby(obj/item/W as obj, mob/user as mob) if (istype(W, /obj/item/device/radio/signaler) ) var/obj/item/device/radio/signaler/S = W if(!S.b_stat) return var/obj/item/assembly/rad_time/R = new /obj/item/assembly/rad_time( user ) S.set_loc(R) R.part1 = S S.layer = initial(S.layer) user.u_equip(S) user.put_in_hand_or_drop(R) S.master = R src.master = R src.layer = initial(src.layer) user.u_equip(src) src.set_loc(R) R.part2 = src R.dir = src.dir src.add_fingerprint(user) return /obj/item/device/timer/attack_self(mob/user as mob) ..() if (user.stat || user.restrained() || user.lying) return if ((src in user) || (src.master && (src.master in user)) || (get_dist(src, user) <= 1 && istype(src.loc, /turf)) || src.is_detonator_trigger()) user.machine = src var/second = src.time % 60 var/minute = (src.time - second) / 60 var/detonator_trigger = src.is_detonator_trigger() var/timing_links = (src.timing ? text("Timing", src) : text("Not Timing", src)) var/timing_text = (src.timing ? "Timing - controls locked" : "Not timing - controls unlocked") var/dat = text("Timing Unit
[] []:[]
- - + +
", detonator_trigger ? timing_text : timing_links, minute, second, src, src, src, src) dat += "

Close" user << browse(dat, "window=timer") onclose(user, "timer") else user << browse(null, "window=timer") user.machine = null return /obj/item/device/timer/proc/is_detonator_trigger() if (src.master) if (istype(src.master, /obj/item/assembly/detonator/) && src.master.master) if (istype(src.master.master, /obj/machinery/portable_atmospherics/canister/) && in_range(src.master.master, usr)) return 1 return 0 /obj/item/device/timer/Topic(href, href_list) ..() if (usr.stat || usr.restrained() || usr.lying) return var/can_use_detonator = src.is_detonator_trigger() && !src.timing if (can_use_detonator || (src in usr) || (src.master && src.master in usr) || in_range(src, usr) && istype(src.loc, /turf)) usr.machine = src if (href_list["time"]) src.timing = text2num(href_list["time"]) if(timing) src.c_state(1) if (!(src in processing_items)) processing_items.Add(src) if (src.master && istype(master, /obj/item/device/transfer_valve)) logTheThing("bombing", usr, null, "[timing ? "initiated" : "defused"] a timer on a transfer valve at [log_loc(src.master)].") message_admins("[key_name(usr)] [timing ? "initiated" : "defused"] a timer on a transfer valve at [log_loc(src.master)].") else if (src.master && istype(src.master, /obj/item/assembly/time_ignite)) //Timer-detonated beaker assemblies var/obj/item/assembly/rad_ignite/RI = src.master logTheThing("bombing", usr, null, "[timing ? "initiated" : "defused"] a timer on a timer-igniter assembly at [log_loc(src.master)]. Contents: [log_reagents(RI.part3)]") else if(src.master && istype(src.master, /obj/item/assembly/time_bomb)) //Timer-detonated single-tank bombs logTheThing("bombing", usr, null, "[timing ? "initiated" : "defused"] a timer on a single-tank bomb at [log_loc(src.master)].") message_admins("[key_name(usr)] [timing ? "initiated" : "defused"] a timer on a single-tank bomb at [log_loc(src.master)].") else if (src.master && istype(src.master, /obj/item/mine)) // Land mine. logTheThing("bombing", usr, null, "[timing ? "initiated" : "defused"] a timer on a [src.master.name] at [log_loc(src.master)].") if (href_list["tp"]) var/tp = text2num(href_list["tp"]) src.time += tp src.time = min(max(round(src.time), 0), 600) if (can_use_detonator && src.time < 90) src.time = 90 if (href_list["close"]) usr << browse(null, "window=timer") usr.machine = null return if (!src.master) if (istype(src.loc, /mob)) attack_self(src.loc) else for(var/mob/M in viewers(1, src)) if (M.client && (M.machine == src.master || M.machine == src)) src.attack_self(M) else if (can_use_detonator) src.attack_self(usr) if (istype(src.master.loc, /mob)) src.attack_self(src.master.loc) else for(var/mob/M in viewers(1, src.master)) if (M.client && (M.machine == src.master || M.machine == src)) src.attack_self(M) src.add_fingerprint(usr) else usr << browse(null, "window=timer") return return