The various assemblies should be working now.

Old style bombs and suicide vests temporarily removed.
Players can now be job banned from being a pAI.
Added null checks to explosion() due to runtime errors. 
Changelog updated


git-svn-id: http://tgstation13.googlecode.com/svn/trunk@1980 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
mport2004@gmail.com
2011-08-05 07:42:24 +00:00
parent 247ac0b197
commit e98a7893fa
40 changed files with 2440 additions and 2327 deletions

View File

@@ -0,0 +1,102 @@
/*
Desc: Sorta a hack/workaround to get interfaceish things into this engine.
To use an interface just override the proc in your object and set it to return true.
If an object returns true for one of these it should have ALL of the commented out procs and vars defined in its class.
*/
/*
Name: IsAssembly
Desc: If true is an assembly that can work with the holder
*/
/obj/proc/IsAssembly()
return 0
/*
var
secured = 1
small_icon_state_left = null
small_icon_state_right = null
list/small_icon_state_overlays = null
obj/holder = null
cooldown = 0//To prevent spam
proc
Activate()//Called when this assembly is pulsed by another one
Secure()//Code that has to happen when the assembly is ready goes here
Unsecure()//Code that has to happen when the assembly is taken off of the ready state goes here
Attach_Assembly(var/obj/A, var/mob/user)//Called when an assembly is attacked by another
Process_cooldown()//Call this via spawn(10) to have it count down the cooldown var
IsAssembly()
return 1
Process_cooldown()
cooldown--
if(cooldown <= 0) return 0
spawn(10)
Process_cooldown()
return 1
Activate()
if((!secured) || (cooldown > 0))//Make sure to add something using cooldown or such to prevent spam
return 0
cooldown = 2
spawn(10)
Process_cooldown()
return 0
Secure()
if(secured)
return 0
secured = 1
return 1
Unsecure()
if(!secured)
return 0
secured = 0
return 1
Attach_Assembly(var/obj/A, var/mob/user)
holder = new/obj/item/device/assembly_holder(get_turf(src))
if(holder:attach(A,src,user))
user.show_message("\blue You attach the [A.name] to the [src.name]!")
return 1
return 0
attackby(obj/item/weapon/W as obj, mob/user as mob)
if(W.IsAssembly())
var/obj/item/device/D = W
if((!D:secured) && (!src.secured))
Attach_Assembly(D,user)
if(isscrewdriver(W))
if(src.secured)
Unsecure()
user.show_message("\blue The [src.name] can now be attached!")
else
Secure()
user.show_message("\blue The [src.name] is ready!")
return
else
..()
return
*/
/*
Name: IsAssemblyHolder
Desc: If true is an object that can hold an assemblyholder object
*/
/obj/proc/IsAssemblyHolder()
return 0
/*
proc
Process_Activation(var/obj/item/device/D)
*/

View File

@@ -0,0 +1,172 @@
/obj/item/device/assembly_holder
name = "Assembly"
desc = "Holds various devices"//Fix this by adding dynamic desc
icon = 'new_assemblies.dmi'
icon_state = "holder"
flags = FPRINT | TABLEPASS| CONDUCT
item_state = "electronic"
m_amt = 100
throwforce = 5
w_class = 1.0
throw_speed = 3
throw_range = 10
var
secured = 0
obj/item/device/assembly_left = null
obj/item/device/assembly_right = null
//The "other" thing will go here
proc
attach(var/obj/item/device/D, var/obj/item/device/D2, var/mob/user)
Process_Activation(var/obj/item/device/D)
IsAssemblyHolder()
return 1
attach(var/obj/item/device/D, var/obj/item/device/D2, var/mob/user)
if((!D)||(!D2)) return 0
if((!D.IsAssembly())||(!D2.IsAssembly())) return 0
if((D:secured)||(D2:secured)) return 0
if(user)
user.remove_from_mob(D)
user.remove_from_mob(D2)
D:holder = src
D2:holder = src
D.loc = src
D2.loc = src
assembly_left = D
assembly_right = D2
src.name = "[D.name] [D2.name] assembly"
update_icon()
return 1
update_icon()
src.overlays = null
if(assembly_left)
src.overlays += assembly_left:small_icon_state_left
for(var/O in assembly_left:small_icon_state_overlays)
src.overlays += text("[]_l", O)
if(assembly_right)
src.overlays += assembly_right:small_icon_state_right
for(var/O in assembly_right:small_icon_state_overlays)
src.overlays += text("[]_r", O)
// if(other)
// other.update_icon()
examine()
set src in view()
..()
if ((in_range(src, usr) || src.loc == usr))
if (src.secured)
usr.show_message("The [src.name] is ready!")
else
usr.show_message("The [src.name] can be attached!")
return
HasProximity(atom/movable/AM as mob|obj)
if(!assembly_left || !assembly_right) return 0
assembly_left.HasProximity(AM)
assembly_right.HasProximity(AM)
Move()//I dont like this but it will do for now
var/t = src.dir
..()
if(istype(assembly_left,/obj/item/device/infra))
assembly_left.dir = t
del(assembly_left:first)
if(istype(assembly_right,/obj/item/device/infra))
assembly_right.dir = t
del(assembly_right:first)
return
attack_hand()//I dont like this one either
if(istype(assembly_left,/obj/item/device/infra))
del(assembly_left:first)
if(istype(assembly_right,/obj/item/device/infra))
del(assembly_right:first)
..()
return
attackby(obj/item/weapon/W as obj, mob/user as mob)
if(isscrewdriver(W))
if(!assembly_left || !assembly_right)
user.show_message("\red Assembly part missing!")
return
if(src.secured)
src.secured = 0
assembly_left:Unsecure()
assembly_right:Unsecure()
user.show_message("\blue The [src.name] can now be taken apart!")
else
src.secured = 1
assembly_left:Secure()
assembly_right:Secure()
user.show_message("\blue The [src.name] is ready!")
update_icon()
return
else
..()
return
attack_self(mob/user as mob)
src.add_fingerprint(user)
if(src.secured)
if(!assembly_left || !assembly_right)
user.show_message("\red Assembly part missing!")
return
if(istype(assembly_left,assembly_right.type))//If they are the same type it causes issues due to window code
switch(alert("Which side would you like to use?",,"Left","Right"))
if("Left")
assembly_left.attack_self(user)
if("Right")
assembly_right.attack_self(user)
return
else
assembly_left.attack_self(user)
assembly_right.attack_self(user)
else
var/turf/T = get_turf(src)
if(!T) return 0
if(assembly_left)
assembly_left:holder = null
assembly_left.loc = T
if(assembly_right)
assembly_right:holder = null
assembly_right.loc = T
spawn(0)
del(src)
return
Process_Activation(var/obj/item/device/D)
if(!D) return 0
if(assembly_left == D)
assembly_right:Activate()
//If anymore things can be on a holder this will have to be edited
else if(assembly_right == D)
assembly_left:Activate()
// else if(assemblyother == D)
// assembly_left.Activate()
// assembly_right.Activate()
return 1

View File

@@ -0,0 +1,110 @@
/obj/item/device/igniter
name = "igniter"
desc = "A small electronic device able to ignite combustable substances. Does not function well as a lighter."
icon = 'new_assemblies.dmi'
icon_state = "igniter"
flags = FPRINT | TABLEPASS| CONDUCT
item_state = "electronic"
m_amt = 100
throwforce = 5
w_class = 1.0
throw_speed = 3
throw_range = 10
var
secured = 1
small_icon_state_left = "igniter_left"
small_icon_state_right = "igniter_right"
list/small_icon_state_overlays = null
obj/holder = null
cooldown = 0
proc
Activate()//Called when this assembly is pulsed by another one
Secure()
Unsecure()
Attach_Assembly(var/obj/A, var/mob/user)
Process_cooldown()
IsAssembly()
return 1
Process_cooldown()
src.cooldown--
if(src.cooldown <= 0) return 0
spawn(10)
src.Process_cooldown()
return 1
Activate()
if((!secured) || (cooldown > 0))
return 0
var/turf/location = get_turf(src.loc)
if(location)
location.hotspot_expose(1000,1000)
cooldown = 2
spawn(10)
Process_cooldown()
return 1
Secure()
if(secured)
return 0
secured = 1
return 1
Unsecure()
if(!secured)
return 0
secured = 0
return 1
Attach_Assembly(var/obj/A, var/mob/user)
holder = new/obj/item/device/assembly_holder(get_turf(src))
if(holder:attach(A,src,user))
user.show_message("\blue You attach the [A.name] to the [src.name]!")
return 1
return 0
attackby(obj/item/weapon/W as obj, mob/user as mob)
if(W.IsAssembly())
var/obj/item/device/D = W
if((!D:secured) && (!src.secured))
Attach_Assembly(D,user)
if(isscrewdriver(W))
if(src.secured)
Unsecure()
user.show_message("\blue The [src.name] can now be attached!")
else
Secure()
user.show_message("\blue The [src.name] is ready!")
return
else
..()
return
attack_self(mob/user as mob)
src.add_fingerprint(user)
spawn( 5 )
Activate()
return
return
examine()
set src in view()
..()
if ((in_range(src, usr) || src.loc == usr))
if (src.secured)
usr.show_message("The [src.name] is ready!")
else
usr.show_message("The [src.name] can be attached!")
return

View File

@@ -0,0 +1,338 @@
/obj/item/device/infra
name = "Infrared Beam"
desc = "Emits a visible or invisible beam and is triggered when the beam is interrupted."
icon = 'new_assemblies.dmi'
icon_state = "infrared_old"
flags = FPRINT | TABLEPASS| CONDUCT
w_class = 2.0
item_state = "electronic"
m_amt = 150
origin_tech = "magnets=2"
var
secured = 0
small_icon_state_left = "infrared_left"
small_icon_state_right = "infrared_right"
list/small_icon_state_overlays = null
obj/holder = null
cooldown = 0//To prevent spam
scanning = 0
visible = 0
obj/beam/i_beam/first = null
proc
Activate()//Called when this assembly is pulsed by another one
Secure()//Code that has to happen when the assembly is ready goes here
Unsecure()//Code that has to happen when the assembly is taken off of the ready state goes here
Attach_Assembly(var/obj/A, var/mob/user)//Called when an assembly is attacked by another
Process_cooldown()//Call this via spawn(10) to have it count down the cooldown var
beam_trigger()
IsAssembly()
return 1
Process_cooldown()
cooldown--
if(cooldown <= 0) return 0
spawn(10)
Process_cooldown()
return 1
Activate()
if((!secured) || (cooldown > 0))
return 0
cooldown = 2
src.scanning = !src.scanning
update_icon()
spawn(10)
Process_cooldown()
return 0
Secure()
if(secured)
return 0
secured = 1
processing_items.Add(src)//removal is taken care of it process()
return 1
Unsecure()
if(!secured)
return 0
secured = 0
return 1
Attach_Assembly(var/obj/A, var/mob/user)
holder = new/obj/item/device/assembly_holder(get_turf(src))
if(holder:attach(A,src,user))
user.show_message("\blue You attach the [A.name] to the [src.name]!")
return 1
return 0
attackby(obj/item/weapon/W as obj, mob/user as mob)
if(W.IsAssembly())
var/obj/item/device/D = W
if((!D:secured) && (!src.secured))
Attach_Assembly(D,user)
if(isscrewdriver(W))
if(src.secured)
Unsecure()
user.show_message("\blue The [src.name] can now be attached!")
else
Secure()
user.show_message("\blue The [src.name] is ready!")
return
else
..()
return
update_icon()
src.overlays = null
src.small_icon_state_overlays = list()
if(scanning)
src.overlays += text("infrared_old2")
src.small_icon_state_overlays += text("infrared_on")
if(holder)
holder.update_icon()
return
process()
if(!scanning)
if(!src.first)
del(src.first)
if ((!( src.first ) && (src.secured && (istype(src.loc, /turf) || (src.holder && istype(src.holder.loc, /turf))))))
var/obj/beam/i_beam/I = new /obj/beam/i_beam( (src.holder ? src.holder.loc : src.loc) )
I.master = src
I.density = 1
I.dir = src.dir
step(I, I.dir)
if (I)
I.density = 0
src.first = I
I.vis_spread(src.visible)
spawn( 0 )
if (I)
//world << "infra: setting limit"
I.limit = 8
//world << "infra: processing beam \ref[I]"
I.process()
return
if(!secured)
processing_items.Remove(src)
return
attack_hand()
del(src.first)
..()
return
Move()
var/t = src.dir
..()
src.dir = t
del(src.first)
return
beam_trigger()
if((!secured)||(!scanning)||(cooldown > 0)) return 0
if((holder)&&(holder.IsAssemblyHolder()))
spawn(0)
holder:Process_Activation(src)
return
for(var/mob/O in hearers(null, null))
O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2)
cooldown = 2
spawn(10)
Process_cooldown()
return
attack_self(mob/user as mob)
if(!secured) return
user.machine = src
var/dat = text("<TT><B>Infrared Laser</B>\n<B>Status</B>: []<BR>\n<B>Visibility</B>: []<BR>\n</TT>", (src.scanning ? text("<A href='?src=\ref[];state=0'>On</A>", src) : text("<A href='?src=\ref[];state=1'>Off</A>", src)), (src.visible ? text("<A href='?src=\ref[];visible=0'>Visible</A>", src) : text("<A href='?src=\ref[];visible=1'>Invisible</A>", src)))
dat += "<BR><BR><A href='?src=\ref[src];refresh=1'>Refresh</A>"
dat += "<BR><BR><A href='?src=\ref[src];close=1'>Close</A>"
user << browse(dat, "window=infra")
onclose(user, "infra")
return
Topic(href, href_list)
..()
if(get_dist(src, usr) <= 1)
if (href_list["state"])
src.scanning = !(src.scanning)
update_icon()
if (href_list["visible"])
src.visible = !(src.visible)
spawn( 0 )
if (src.first)
src.first.vis_spread(src.visible)
if (href_list["close"])
usr << browse(null, "window=infra")
return
if(usr)
src.attack_self(usr)
else
usr << browse(null, "window=infra")
onclose(usr, "infra")
return
return
verb/rotate()//This really could be better but I dont want to redo it right now
set name = "Rotate Infrared Laser"
set category = "Object"
set src in usr
src.dir = turn(src.dir, 90)
return
examine()
set src in view()
..()
if ((in_range(src, usr) || src.loc == usr))
if (src.secured)
usr.show_message("The [src.name] is ready!")
else
usr.show_message("The [src.name] can be attached!")
return
/***************************IBeam*********************************/
/obj/beam/i_beam
name = "i beam"
icon = 'projectiles.dmi'
icon_state = "ibeam"
var/obj/beam/i_beam/next = null
var/obj/item/device/infra/master = null
var/limit = null
var/visible = 0.0
var/left = null
// var/master = null
anchored = 1.0
flags = TABLEPASS
/obj/beam/i_beam/proc/hit()
//world << "beam \ref[src]: hit"
if (src.master)
//world << "beam hit \ref[src]: calling master \ref[master].hit"
src.master.beam_trigger()
//SN src = null
del(src)
return
/obj/beam/i_beam/proc/vis_spread(v)
//world << "i_beam \ref[src] : vis_spread"
src.visible = v
spawn( 0 )
if (src.next)
//world << "i_beam \ref[src] : is next [next.type] \ref[next], calling spread"
src.next.vis_spread(v)
return
return
/obj/beam/i_beam/proc/process()
//world << "i_beam \ref[src] : process"
if ((src.loc.density || !( src.master )))
//SN src = null
// world << "beam hit loc [loc] or no master [master], deleting"
del(src)
return
//world << "proccess: [src.left] left"
if (src.left > 0)
src.left--
if (src.left < 1)
if (!( src.visible ))
src.invisibility = 101
else
src.invisibility = 0
else
src.invisibility = 0
//world << "now [src.left] left"
var/obj/beam/i_beam/I = new /obj/beam/i_beam( src.loc )
I.master = src.master
I.density = 1
I.dir = src.dir
//world << "created new beam \ref[I] at [I.x] [I.y] [I.z]"
step(I, I.dir)
if (I)
//world << "step worked, now at [I.x] [I.y] [I.z]"
if (!( src.next ))
//world << "no src.next"
I.density = 0
//world << "spreading"
I.vis_spread(src.visible)
src.next = I
spawn( 0 )
//world << "limit = [src.limit] "
if ((I && src.limit > 0))
I.limit = src.limit - 1
//world << "calling next process"
I.process()
return
else
//world << "is a next: \ref[next], deleting beam \ref[I]"
//I = null
del(I)
else
//src.next = null
//world << "step failed, deleting \ref[src.next]"
del(src.next)
spawn( 10 )
src.process()
return
return
/obj/beam/i_beam/Bump()
del(src)
return
/obj/beam/i_beam/Bumped()
src.hit()
return
/obj/beam/i_beam/HasEntered(atom/movable/AM as mob|obj)
if (istype(AM, /obj/beam))
return
spawn( 0 )
src.hit()
return
return
/obj/beam/i_beam/Del()
del(src.next)
..()
return

View File

@@ -0,0 +1,217 @@
/obj/item/device/prox_sensor
name = "proximity sensor"
desc = "Used for scanning and alerting when someone enters a certain proximity."
icon = 'new_assemblies.dmi'
icon_state = "prox"
flags = FPRINT | TABLEPASS| CONDUCT
w_class = 2.0
item_state = "electronic"
m_amt = 300
origin_tech = "magnets=1"
var
secured = 0
small_icon_state_left = "prox_left"
small_icon_state_right = "prox_right"
list/small_icon_state_overlays = null
obj/holder = null
scanning = 0
cooldown = 0//To prevent spam
timing = 0
time = 0
proc
Activate()//Called when this assembly is pulsed by another one
Secure()//Code that has to happen when the assembly is ready goes here
Unsecure()//Code that has to happen when the assembly is taken off of the ready state goes here
Attach_Assembly(var/obj/A, var/mob/user)//Called when an assembly is attacked by another
Process_cooldown()//Call this via spawn(10) to have it count down the cooldown var
toggle_scan()
sense()
IsAssembly()
return 1
Process_cooldown()
src.cooldown--
if(src.cooldown <= 0) return 0
spawn(10)
src.Process_cooldown()
return 1
Activate()
if((!secured) || (cooldown > 0))
return 0
cooldown = 2
src.timing = !src.timing
update_icon()
spawn(10)
Process_cooldown()
return 0
Secure()
if(secured) return 0
secured = 1
processing_items.Add(src)//removal is taken care of it process()
return 1
Unsecure()
if(!secured) return 0
secured = 0
return 1
Attach_Assembly(var/obj/A, var/mob/user)
holder = new/obj/item/device/assembly_holder(get_turf(src))
if(holder:attach(A,src,user))
user.show_message("\blue You attach the [A.name] to the [src.name]!")
return 1
return 0
attackby(obj/item/weapon/W as obj, mob/user as mob)
if(W.IsAssembly())
var/obj/item/device/D = W
if((!D:secured) && (!src.secured))
Attach_Assembly(D,user)
if(isscrewdriver(W))
if(src.secured)
Unsecure()
user.show_message("\blue The [src.name] can now be attached!")
else
Secure()
user.show_message("\blue The [src.name] is ready!")
return
else
..()
return
HasProximity(atom/movable/AM as mob|obj)
if (istype(AM, /obj/beam))
return
if (AM.move_speed < 12)
src.sense()
return
sense()
if((!secured)||(!scanning)||(cooldown > 0)) return 0
if((holder)&&(holder.IsAssemblyHolder()))
spawn(0)
holder:Process_Activation(src)
return
for(var/mob/O in hearers(null, null))
O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2)
cooldown = 2
spawn(10)
Process_cooldown()
return
process()
if((src.timing) && (src.time >= 0))
src.time--
if(src.time <= 0)
src.timing = 0
src.time = 0
toggle_scan()
if(!secured)
if(scanning)
scanning = 0
src.timing = 0
processing_items.Remove(src)
update_icon()
return
dropped()
spawn(0)
src.sense()
return
return
toggle_scan()
if(!secured) return 0
scanning = !scanning
update_icon()
update_icon()
src.overlays = null
src.small_icon_state_overlays = list()
if(timing)
src.overlays += text("prox_timing")
src.small_icon_state_overlays += text("prox_timing")
if(scanning)
src.overlays += text("prox_scanning")
src.small_icon_state_overlays += text("prox_scanning")
if(holder)
holder.update_icon()
return
Move()
..()
src.sense()
return
examine()
set src in view()
..()
if ((in_range(src, usr) || src.loc == usr))
if (src.secured)
usr.show_message("The [src.name] is ready!")
else
usr.show_message("The [src.name] can be attached!")
return
attack_self(mob/user as mob)
if(!secured)
user.show_message("\red The [src.name] is unsecured!")
return 0
var/second = src.time % 60
var/minute = (src.time - second) / 60
var/dat = text("<TT><B>Proximity Sensor</B>\n[] []:[]\n<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>\n</TT>", (src.timing ? text("<A href='?src=\ref[];time=0'>Arming</A>", src) : text("<A href='?src=\ref[];time=1'>Not Arming</A>", src)), minute, second, src, src, src, src)
dat += "<BR><A href='?src=\ref[src];scanning=1'>[scanning?"Armed":"Unarmed"]</A> (Movement sensor active when armed!)"
dat += "<BR><BR><A href='?src=\ref[src];refresh=1'>Refresh</A>"
dat += "<BR><BR><A href='?src=\ref[src];close=1'>Close</A>"
user << browse(dat, "window=prox")
onclose(user, "prox")
return
Topic(href, href_list)
..()
if(get_dist(src, usr) <= 1)
if (href_list["scanning"])
toggle_scan()
if (href_list["time"])
src.timing = text2num(href_list["time"])
update_icon()
if (href_list["tp"])
var/tp = text2num(href_list["tp"])
src.time += tp
src.time = min(max(round(src.time), 0), 600)
if (href_list["close"])
usr << browse(null, "window=prox")
return
if(usr)
src.attack_self(usr)
else
usr << browse(null, "window=prox")
return

View File

@@ -0,0 +1,2 @@
//Signalers are now an assembly item, not sure if I should put it in here.
//Currently in game/objects/radio/signaler.dm

View File

@@ -0,0 +1,180 @@
/obj/item/device/timer
name = "timer"
desc = "Used to time things. Works well with contraptions which has to count down. Tick tock."
icon = 'new_assemblies.dmi'
icon_state = "timer"
item_state = "electronic"
flags = FPRINT | TABLEPASS| CONDUCT
w_class = 2.0
m_amt = 100
var
secured = 0
small_icon_state_left = "timer_left"
small_icon_state_right = "timer_right"
list/small_icon_state_overlays = null
obj/holder = null
cooldown = 0//To prevent spam
timing = 0
time = 0
proc
Activate()//Called when this assembly is pulsed by another one
Secure()//Code that has to happen when the assembly is ready goes here
Unsecure()//Code that has to happen when the assembly is taken off of the ready state goes here
Attach_Assembly(var/obj/A, var/mob/user)//Called when an assembly is attacked by another
Process_cooldown()//Call this via spawn(10) to have it count down the cooldown var
timer_end()
IsAssembly()
return 1
Process_cooldown()
cooldown--
if(cooldown <= 0) return 0
spawn(10)
Process_cooldown()
return 1
Activate()
if((!secured) || (cooldown > 0))
return 0
cooldown = 2
src.timing = !src.timing
update_icon()
spawn(10)
Process_cooldown()
return 0
Secure()
if(secured)
return 0
processing_items.Add(src)//removal is taken care of it process()
secured = 1
return 1
Unsecure()
if(!secured)
return 0
secured = 0
return 1
Attach_Assembly(var/obj/A, var/mob/user)
holder = new/obj/item/device/assembly_holder(get_turf(src))
if(holder:attach(A,src,user))
user.show_message("\blue You attach the [A.name] to the [src.name]!")
return 1
return 0
attackby(obj/item/weapon/W as obj, mob/user as mob)
if(W.IsAssembly())
var/obj/item/device/D = W
if((!D:secured) && (!src.secured))
Attach_Assembly(D,user)
if(isscrewdriver(W))
if(src.secured)
Unsecure()
user.show_message("\blue The [src.name] can now be attached!")
else
Secure()
user.show_message("\blue The [src.name] is ready!")
return
else
..()
return
timer_end()
if((!secured)||(cooldown > 0)) return 0
if((holder)&&(holder.IsAssemblyHolder()))
spawn(0)
holder:Process_Activation(src)
return
for(var/mob/O in hearers(null, null))
O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2)
cooldown = 2
spawn(10)
Process_cooldown()
return
process()
if((src.timing) && (src.time >= 0))
src.time--
if(src.time <= 0)
src.timing = 0
src.time = 0
timer_end()
update_icon()
if(!secured)
src.timing = 0
processing_items.Remove(src)
update_icon()
return
update_icon()
src.overlays = null
src.small_icon_state_overlays = list()
if(timing)
src.overlays += text("timer_timing")
src.small_icon_state_overlays += text("timer_timing")
if(holder)
holder.update_icon()
return
examine()
set src in view()
..()
if ((in_range(src, usr) || src.loc == usr))
if (src.secured)
usr.show_message("The [src.name] is ready!")
else
usr.show_message("The [src.name] can be attached!")
return
attack_self(mob/user as mob)
if(!secured)
user.show_message("\red The [src.name] is unsecured!")
return 0
var/second = src.time % 60
var/minute = (src.time - second) / 60
var/dat = text("<TT><B>Timing Unit</B>\n[] []:[]\n<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>\n</TT>", (src.timing ? text("<A href='?src=\ref[];time=0'>Timing</A>", src) : text("<A href='?src=\ref[];time=1'>Not Timing</A>", src)), minute, second, src, src, src, src)
dat += "<BR><BR><A href='?src=\ref[src];refresh=1'>Refresh</A>"
dat += "<BR><BR><A href='?src=\ref[src];close=1'>Close</A>"
user << browse(dat, "window=timer")
onclose(user, "timer")
return
Topic(href, href_list)
..()
if(get_dist(src, usr) <= 1)
if (href_list["time"])
src.timing = text2num(href_list["time"])
update_icon()
if (href_list["tp"])
var/tp = text2num(href_list["tp"])
src.time += tp
src.time = min(max(round(src.time), 0), 600)
if (href_list["close"])
usr << browse(null, "window=timer")
return
if(usr)
src.attack_self(usr)
else
usr << browse(null, "window=timer")
return