mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 18:22:39 +00:00
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:
@@ -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)
|
||||
*/
|
||||
|
||||
172
code/modules/assembly/holder.dm
Normal file
172
code/modules/assembly/holder.dm
Normal 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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
110
code/modules/assembly/igniter.dm
Normal file
110
code/modules/assembly/igniter.dm
Normal 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
|
||||
338
code/modules/assembly/infrared.dm
Normal file
338
code/modules/assembly/infrared.dm
Normal 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
|
||||
217
code/modules/assembly/proximity.dm
Normal file
217
code/modules/assembly/proximity.dm
Normal 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
|
||||
2
code/modules/assembly/signaler.dm
Normal file
2
code/modules/assembly/signaler.dm
Normal 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
|
||||
180
code/modules/assembly/timer.dm
Normal file
180
code/modules/assembly/timer.dm
Normal 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
|
||||
Reference in New Issue
Block a user