mirror of
https://github.com/goonstation/goonstation-2016.git
synced 2026-08-26 07:26:11 +01:00
Initial Commit
This commit is contained in:
@@ -0,0 +1,197 @@
|
||||
/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("<A href='?src=\ref[];time=0'>Timing</A>", src) : text("<A href='?src=\ref[];time=1'>Not Timing</A>", src))
|
||||
var/timing_text = (src.timing ? "Timing - controls locked" : "Not timing - controls unlocked")
|
||||
var/dat = text("<TT><B>Timing Unit</B><br>[] []:[]<br><A href='?src=\ref[];tp=-30'>-</A> <A href='?src=\ref[];tp=-1'>-</A> <A href='?src=\ref[];tp=1'>+</A> <A href='?src=\ref[];tp=30'>+</A><br></TT>", detonator_trigger ? timing_text : timing_links, minute, second, src, src, src, src)
|
||||
dat += "<BR><BR><A href='?src=\ref[src];close=1'>Close</A>"
|
||||
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
|
||||
Reference in New Issue
Block a user