mirror of
https://github.com/goonstation/goonstation-2016.git
synced 2026-07-09 16:12:21 +01:00
479 lines
9.8 KiB
Plaintext
479 lines
9.8 KiB
Plaintext
//DEFINES ETC
|
|
|
|
/obj/machinery/engine_laser_spawner
|
|
name = "Engine Laser Emitter"
|
|
desc = "This is what it is."
|
|
icon = 'engine_stuff.dmi'
|
|
icon_state = "engine_laser_spawner0"
|
|
var/obj/beam/engine_laser/first = null
|
|
var/id = 1
|
|
var/state = 0.0
|
|
var/energy = 0
|
|
var/health = 100
|
|
flags = FPRINT | TABLEPASS | CONDUCT
|
|
m_amt = 150
|
|
|
|
/obj/beam/engine_laser
|
|
name = "engine laser"
|
|
icon = 'engine_stuff.dmi'
|
|
icon_state = "engine_laser"
|
|
var/obj/beam/engine_laser/next = null
|
|
var/obj/machinery/engine_laser_spawner/master = null
|
|
var/limit = null
|
|
var/visible = 0.0
|
|
var/left = null
|
|
var/energy = 20
|
|
anchored = 1.0
|
|
flags = TABLEPASS
|
|
|
|
/obj/beam/focused_laser
|
|
name = "focused laser"
|
|
icon = 'engine_stuff.dmi'
|
|
icon_state = "focused_laser"
|
|
var/obj/beam/focused_laser/next = null
|
|
var/obj/machinery/focusing_mirror/master = null
|
|
var/limit = null
|
|
var/visible = 0.0
|
|
var/left = null
|
|
var/energy = 0
|
|
anchored = 1.0
|
|
flags = TABLEPASS
|
|
|
|
/obj/machinery/focusing_mirror
|
|
name = "focusing mirror"
|
|
icon = 'engine_stuff.dmi'
|
|
icon_state = "focus_mirror"
|
|
var/obj/beam/focused_laser/first = null
|
|
var/b_number = 0
|
|
var/energy = 0
|
|
var/on = 1
|
|
density = 0
|
|
|
|
/obj/machinery/computer/laser_computer
|
|
name = "laser computer"
|
|
icon = 'engine_stuff.dmi'
|
|
icon_state = "laser_computer"
|
|
var/id = 1
|
|
var/list/emitters = list()
|
|
var/pattern = "Single"
|
|
var/started = 0
|
|
|
|
|
|
///////////////////////////////////////////////
|
|
// MIRROR STUFF
|
|
//////////////////////////////////////////////
|
|
|
|
/obj/machinery/focusing_mirror/proc/opp_dir(var/dir)
|
|
if(dir == 1)
|
|
return 2
|
|
if(dir == 2)
|
|
return 1
|
|
if(dir == 3)
|
|
return 4
|
|
if(dir == 4)
|
|
return 3
|
|
if(dir == 5)
|
|
return 8
|
|
if(dir == 6)
|
|
return 7
|
|
if(dir == 7)
|
|
return 6
|
|
if(dir == 8)
|
|
return 5
|
|
|
|
/obj/machinery/focusing_mirror/process()
|
|
if(src.on && src.b_number)
|
|
src.shoot()
|
|
src.b_number = 0
|
|
src.energy = 0
|
|
return
|
|
else
|
|
qdel(src.first)
|
|
|
|
|
|
|
|
/obj/machinery/focusing_mirror/proc/shoot()
|
|
if(!b_number)
|
|
qdel(src.first)
|
|
return null
|
|
if(src.first)
|
|
return
|
|
var/obj/beam/focused_laser/I = new /obj/beam/focused_laser( (src.loc) )
|
|
I.master = src
|
|
I.density = 1
|
|
I.dir = opp_dir(src.dir)
|
|
I.energy = src.energy
|
|
step(I, I.dir)
|
|
if (I)
|
|
I.dir = opp_dir(src.dir)
|
|
I.density = 0
|
|
src.first = I
|
|
I.vis_spread(1)
|
|
spawn( 0 )
|
|
if (I)
|
|
I.limit = 20
|
|
I.process()
|
|
return
|
|
if (!( b_number ))
|
|
qdel(src.first)
|
|
src.b_number = 0
|
|
return
|
|
|
|
|
|
/obj/machinery/focusing_mirror/proc/hit()
|
|
return
|
|
|
|
/////////////////////////////////////////////
|
|
// MIRROR LASER BEAM STUFF
|
|
/////////////////////////////////////////////
|
|
|
|
|
|
/obj/beam/focused_laser/proc/hit()
|
|
if (src.master)
|
|
src.master.hit()
|
|
qdel(src)
|
|
return
|
|
|
|
/obj/beam/focused_laser/proc/vis_spread(v)
|
|
src.visible = v
|
|
spawn( 0 )
|
|
if (src.next)
|
|
src.next.vis_spread(v)
|
|
return
|
|
return
|
|
|
|
/obj/beam/focused_laser/proc/process()
|
|
if ((src.loc.density || !( src.master )))
|
|
qdel(src)
|
|
return
|
|
|
|
if (src.left > 0)
|
|
src.left--
|
|
if (src.left < 1)
|
|
if (!( src.visible ))
|
|
src.invisibility = 101
|
|
else
|
|
src.invisibility = 0
|
|
else
|
|
src.invisibility = 0
|
|
|
|
var/obj/beam/focused_laser/I = new /obj/beam/focused_laser( src.loc )
|
|
I.master = src.master
|
|
//I.density = 1
|
|
I.dir = src.dir
|
|
I.energy = src.energy
|
|
step(I, I.dir)
|
|
|
|
if (I)
|
|
if (!( src.next ) && I)
|
|
I.dir = src.dir
|
|
I.density = 0
|
|
I.vis_spread(src.visible)
|
|
src.next = I
|
|
spawn( 0 )
|
|
if ((I && src.limit > 0))
|
|
I.limit = src.limit - 1
|
|
I.process()
|
|
return
|
|
else
|
|
if(I)
|
|
qdel(I)
|
|
else
|
|
qdel(src.next)
|
|
spawn( 10 )
|
|
src.process()
|
|
return
|
|
return
|
|
|
|
/obj/beam/focused_laser/Bump()
|
|
qdel(src)
|
|
return
|
|
|
|
/obj/beam/focused_laser/Bumped()
|
|
src.hit()
|
|
return
|
|
|
|
/obj/beam/focused_laser/HasEntered(atom/movable/AM as mob|obj)
|
|
if (istype(AM, /obj/beam))
|
|
return
|
|
spawn( 0 )
|
|
src.hit()
|
|
return
|
|
return
|
|
|
|
/obj/beam/focused_laser/disposing()
|
|
if (src.next)
|
|
src.next.dispose()
|
|
src.next = null
|
|
..()
|
|
return
|
|
|
|
|
|
|
|
/////////////////////////////////////////////
|
|
// ENGINE LASER BEAM STUFF
|
|
/////////////////////////////////////////////
|
|
|
|
|
|
/obj/beam/engine_laser/proc/hit()
|
|
if (src.master)
|
|
src.master.hit()
|
|
qdel(src)
|
|
return
|
|
|
|
/obj/beam/engine_laser/proc/vis_spread(v)
|
|
src.visible = v
|
|
spawn( 0 )
|
|
if (src.next)
|
|
src.next.vis_spread(v)
|
|
return
|
|
return
|
|
|
|
/obj/beam/engine_laser/proc/process()
|
|
|
|
if ((src.loc.density || !( src.master )))
|
|
qdel(src)
|
|
return
|
|
|
|
if (src.left > 0)
|
|
src.left--
|
|
if (src.left < 1)
|
|
if (!( src.visible ))
|
|
src.invisibility = 101
|
|
else
|
|
src.invisibility = 0
|
|
else
|
|
src.invisibility = 0
|
|
|
|
var/obj/beam/engine_laser/I = new /obj/beam/engine_laser( src.loc )
|
|
I.master = src.master
|
|
//I.density = 1
|
|
I.dir = src.dir
|
|
I.energy = src.energy
|
|
step(I, I.dir)
|
|
|
|
if (I)
|
|
for(var/obj/machinery/focusing_mirror/M in I.loc)
|
|
if(I.dir != M.dir)
|
|
M.b_number++
|
|
M.energy += I.energy
|
|
qdel(src.next)
|
|
qdel(I)
|
|
break
|
|
if (!( src.next ) && I)
|
|
I.dir = src.dir
|
|
I.density = 0
|
|
I.vis_spread(src.visible)
|
|
src.next = I
|
|
spawn( 0 )
|
|
if ((I && src.limit > 0))
|
|
I.limit = src.limit - 1
|
|
I.process()
|
|
return
|
|
else
|
|
if(I)
|
|
qdel(I)
|
|
else
|
|
qdel(src.next)
|
|
spawn( 10 )
|
|
src.process()
|
|
return
|
|
return
|
|
|
|
/obj/beam/engine_laser/Bump()
|
|
qdel(src)
|
|
return
|
|
|
|
/obj/beam/engine_laser/Bumped()
|
|
src.hit()
|
|
return
|
|
|
|
/obj/beam/engine_laser/HasEntered(atom/movable/AM as mob|obj)
|
|
if (istype(AM, /obj/beam))
|
|
return
|
|
spawn( 0 )
|
|
src.hit()
|
|
return
|
|
return
|
|
|
|
/obj/beam/engine_laser/Del()
|
|
if (src.next)
|
|
src.next.dispose()
|
|
src.next = null
|
|
..()
|
|
return
|
|
|
|
|
|
//////////////////////////////////////////
|
|
// LASER SPAWNER STUFF
|
|
//////////////////////////////////////////
|
|
|
|
/obj/machinery/engine_laser_spawner/proc/hit()
|
|
return
|
|
|
|
/obj/machinery/engine_laser_spawner/process()
|
|
if(!state)
|
|
qdel(src.first)
|
|
return null
|
|
|
|
if ((!( src.first ) && (src.state && (istype(src.loc, /turf)))))
|
|
var/obj/beam/engine_laser/I = new /obj/beam/engine_laser( (src.loc) )
|
|
I.master = src
|
|
I.density = 1
|
|
I.dir = src.dir
|
|
step(I, I.dir)
|
|
if (I)
|
|
I.dir = src.dir
|
|
I.density = 0
|
|
src.first = I
|
|
I.vis_spread(1)
|
|
spawn( 0 )
|
|
if (I)
|
|
I.limit = 20
|
|
I.process()
|
|
return
|
|
if (!( src.state ))
|
|
qdel(src.first)
|
|
spawn(3)
|
|
src.state = 0
|
|
return
|
|
|
|
/obj/machinery/engine_laser_spawner/attack_hand()
|
|
qdel(src.first)
|
|
..()
|
|
return
|
|
|
|
/obj/machinery/engine_laser_spawner/Move()
|
|
var/t = src.dir
|
|
..()
|
|
src.dir = t
|
|
qdel(src.first)
|
|
return
|
|
|
|
/obj/machinery/engine_laser_spawner/verb/rotate()
|
|
set src in usr
|
|
|
|
src.dir = turn(src.dir, 45)
|
|
return
|
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////
|
|
// COMPUTER STUFF
|
|
//////////////////////////////////////////
|
|
|
|
|
|
|
|
/obj/machinery/computer/laser_computer/New()
|
|
..()
|
|
spawn(100)
|
|
for(var/obj/machinery/engine_laser_spawner/M in machines)
|
|
if(src.id == M.id)
|
|
src.emitters += M
|
|
|
|
/obj/machinery/computer/laser_computer/attack_ai(mob/user)
|
|
add_fingerprint(user)
|
|
if(stat & (BROKEN|NOPOWER))
|
|
return
|
|
interact(user)
|
|
|
|
/obj/machinery/computer/laser_computer/attack_hand(mob/user)
|
|
add_fingerprint(user)
|
|
if(stat & (BROKEN|NOPOWER))
|
|
return
|
|
interact(user)
|
|
|
|
/obj/machinery/computer/laser_computer/proc/interact(mob/user)
|
|
user.machine = src
|
|
var/polledemitters
|
|
for(var/obj/machinery/engine_laser_spawner/M in src.emitters)
|
|
if(M.health < 20)
|
|
polledemitters += "<FONT color = 'red'>"
|
|
polledemitters += "<BR>[M]<FONT color = 'black'>"
|
|
if(M.state)
|
|
polledemitters += "<FONT color = 'red'> Firing<FONT color = 'black'>"
|
|
var/dat = text({"<TT>
|
|
<TT><B><FONT color = 'blue'>Loaded Laser Emitter Control Computer</B></TT><BR><BR>
|
|
<B><FONT color = 'black'>Emitters: [polledemitters] </B><BR>
|
|
Test: []<BR>
|
|
Start Pattern: []<BR>
|
|
Stop Pattern: []<BR>
|
|
Firing Pattern: []"},
|
|
text("<A href='?src=\ref[];testfire=1'>Fire</A>", src),
|
|
text("<A href='?src=\ref[];realfire=1'>Fire</A>", src),
|
|
text("<A href='?src=\ref[];stop=1'>Stop</A>", src),
|
|
text("<A href='?src=\ref[];pattern=1'>[src.pattern]</A>", src))
|
|
user << browse("<HEAD><TITLE>Laser Emitter Control Computer</TITLE></HEAD>[dat]", "window=lasercomputer")
|
|
onclose(user, "lasercomputer")
|
|
return
|
|
|
|
/obj/machinery/computer/laser_computer/Topic(href, href_list)
|
|
boutput(world, "Topic, [href_list]")
|
|
usr.machine = src
|
|
if (href_list["testfire"])
|
|
if(!src.started)
|
|
src.testfire()
|
|
if (href_list["realfire"])
|
|
src.started = 1
|
|
src.realfire()
|
|
if (href_list["stop"])
|
|
src.started = 0
|
|
if (href_list["pattern"])
|
|
if(src.pattern == "Single")
|
|
src.pattern = "Double"
|
|
else if(src.pattern == "Double")
|
|
src.pattern = "Quad"
|
|
else
|
|
src.pattern = "Single"
|
|
if (istype(src.loc, /mob))
|
|
attack_hand(src.loc)
|
|
return
|
|
|
|
/obj/machinery/computer/laser_computer/proc/testfire()
|
|
spawn(0)
|
|
if(src.pattern == "Single")
|
|
for(var/obj/machinery/engine_laser_spawner/M in src.emitters)
|
|
M.state = 1
|
|
sleep(30)
|
|
else if(src.pattern == "Double")
|
|
var/double = 0
|
|
for(var/obj/machinery/engine_laser_spawner/M in src.emitters)
|
|
M.state = 1
|
|
if(double)
|
|
sleep(20)
|
|
double = 0
|
|
else
|
|
double = 1
|
|
else
|
|
for(var/obj/machinery/engine_laser_spawner/M in src.emitters)
|
|
M.state = 1
|
|
|
|
/obj/machinery/computer/laser_computer/proc/realfire()
|
|
spawn(0)
|
|
while(src.started)
|
|
if(src.pattern == "Single")
|
|
for(var/obj/machinery/engine_laser_spawner/M in src.emitters)
|
|
M.state = 1
|
|
sleep(30)
|
|
else if(src.pattern == "Double")
|
|
var/double = 0
|
|
for(var/obj/machinery/engine_laser_spawner/M in src.emitters)
|
|
M.state = 1
|
|
if(double)
|
|
sleep(30)
|
|
double = 0
|
|
else
|
|
double = 1
|
|
else
|
|
for(var/obj/machinery/engine_laser_spawner/M in src.emitters)
|
|
M.state = 1
|
|
sleep(30)
|
|
|
|
|
|
/obj/machinery/computer/laser_computer/process()
|
|
spawn(2)
|
|
src.updateDialog()
|
|
|