diff --git a/code/modules/assembly/igniter.dm b/code/modules/assembly/igniter.dm
index 7021deb3613..49cfe687eb1 100644
--- a/code/modules/assembly/igniter.dm
+++ b/code/modules/assembly/igniter.dm
@@ -19,6 +19,10 @@
var/obj/structure/reagent_dispensers/fueltank/tank = src.loc.loc
if (tank)
tank.explode()
+ if (istype(src.loc.loc, /obj/item/weapon/reagent_containers/glass/beaker/))
+ var/obj/item/weapon/reagent_containers/glass/beaker/beakerbomb = src.loc.loc
+ if(beakerbomb)
+ beakerbomb.ignite()
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(3, 1, src)
diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm
index e6a1bc6f322..0a8a9f6a0c0 100644
--- a/code/modules/assembly/infrared.dm
+++ b/code/modules/assembly/infrared.dm
@@ -1,5 +1,3 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
-
/obj/item/device/assembly/infra
name = "infrared emitter"
desc = "Emits a visible or invisible beam and is triggered when the beam is interrupted."
@@ -10,173 +8,133 @@
bomb_name = "tripwire mine"
- secured = 0
-
var/on = 0
var/visible = 0
var/obj/effect/beam/i_beam/first = null
+ var/obj/effect/beam/i_beam/last = null
- proc
- trigger_beam()
-
- describe()
- return "The infrared trigger is [on?"on":"off"]."
-
- activate()
- if(!..()) return 0//Cooldown check
- on = !on
- update_icon()
- return 1
-
-
- toggle_secure()
- secured = !secured
- if(secured)
- processing_objects.Add(src)
- else
- on = 0
- if(first) del(first)
- processing_objects.Remove(src)
- update_icon()
- return secured
-
+/obj/item/device/assembly/infra/describe()
+ return "The infrared trigger is [on?"on":"off"]."
+/obj/item/device/assembly/infra/activate()
+ if(!..()) return 0//Cooldown check
+ on = !on
update_icon()
- overlays.Cut()
- attached_overlays = list()
- if(on)
- overlays += "infrared_on"
- attached_overlays += "infrared_on"
+ return 1
- if(holder)
- holder.update_icon()
- return
+/obj/item/device/assembly/infra/toggle_secure()
+ secured = !secured
+ if(secured)
+ processing_objects.Add(src)
+ else
+ on = 0
+ if(first) qdel(first)
+ processing_objects.Remove(src)
+ update_icon()
+ return secured
+/obj/item/device/assembly/infra/update_icon()
+ overlays.Cut()
+ attached_overlays = list()
+ if(on)
+ overlays += "infrared_on"
+ attached_overlays += "infrared_on"
- process()//Old code
- if(!on)
- if(first)
- del(first)
- return
- if(first || !secured) return
- var/turf/T = null
- if(istype(loc,/turf))
- T = loc
- else if (holder)
- if (istype(holder.loc,/turf))
- T = holder.loc
- else if (holder.master && istype(holder.master.loc,/turf)) //for onetankbombs and other tertiary builds with assemblies
- T = holder.loc.loc
- else if(istype(loc,/obj/item/weapon/grenade) && istype(loc.loc,/turf))
- T = loc.loc
- if(T)
- var/obj/effect/beam/i_beam/I = new /obj/effect/beam/i_beam(T)
- I.master = src
- I.density = 1
- I.dir = dir
- step(I, I.dir)
- if(I)
- I.density = 0
- first = I
- I.vis_spread(visible)
- spawn(0)
- if(I)
- //world << "infra: setting limit"
- I.limit = 8
- //world << "infra: processing beam \ref[I]"
- I.process()
- return
- return
+ if(holder)
+ holder.update_icon()
+ return
-
- attack_hand()
- del(first)
- ..()
- return
-
-
- Move()
- var/t = dir
- ..()
- dir = t
- del(first)
- return
-
-
- holder_movement()
- if(!holder) return 0
- del(first)
- return 1
-
-
- trigger_beam()
- if((!secured)||(!on)||(cooldown > 0)) return 0
- pulse(0)
- visible_message("\icon[src] *beep* *beep*")
- cooldown = 2
- spawn(10)
- process_cooldown()
- return
-
-
- interact(mob/user as mob)//TODO: change this this to the wire control panel
- if(!secured) return
- user.set_machine(src)
- var/dat = text("Infrared Laser\nStatus: []
\nVisibility: []
\n", (on ? text("On", src) : text("Off", src)), (src.visible ? text("Visible", src) : text("Invisible", src)))
- if(holder)
- dat += "
Beam direction: [dir2text(dir)] Counter-clockwise | Clockwise"
- dat += "
Refresh"
- dat += "
Close"
- user << browse(dat, "window=infra")
- onclose(user, "infra")
- return
-
-
- Topic(href, href_list)
- ..()
- if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr))
- usr << browse(null, "window=infra")
- onclose(usr, "infra")
+/obj/item/device/assembly/infra/process()
+ if(!on)
+ if(first)
+ qdel(first)
return
+ if(!secured)
+ return
+ if(first && last)
+ last.process()
+ return
+ var/turf/T = get_turf(src)
+ if(T)
+ var/obj/effect/beam/i_beam/I = new /obj/effect/beam/i_beam(T)
+ I.master = src
+ I.density = 1
+ I.dir = dir
+ first = I
+ step(I, I.dir)
+ if(first)
+ I.density = 0
+ I.vis_spread(visible)
+ I.limit = 8
+ I.process()
- if(href_list["rotate"])
- switch(href_list["rotate"])
- if("-1")
- dir = turn(dir,90)
- update_icon()
- del(first)
- if("1")
- dir = turn(dir,-90)
- update_icon()
- del(first)
+/obj/item/device/assembly/infra/attack_hand()
+ qdel(first)
+ ..()
+ return
- if(href_list["state"])
- on = !(on)
- update_icon()
+/obj/item/device/assembly/infra/Move()
+ var/t = dir
+ ..()
+ dir = t
+ qdel(first)
+ return
- if(href_list["visible"])
- visible = !(visible)
- spawn(0)
- if(first)
- first.vis_spread(visible)
+/obj/item/device/assembly/infra/holder_movement()
+ if(!holder) return 0
+// dir = holder.dir
+ qdel(first)
+ return 1
- if(href_list["close"])
- usr << browse(null, "window=infra")
- return
+/obj/item/device/assembly/infra/proc/trigger_beam()
+ if((!secured)||(!on)||(cooldown > 0))
+ return 0
+ pulse(0)
+ audible_message("\icon[src] *beep* *beep*", null, 3)
+ cooldown = 2
+ spawn(10)
+ process_cooldown()
+ return
- if(usr)
- attack_self(usr)
+/obj/item/device/assembly/infra/interact(mob/user as mob)//TODO: change this this to the wire control panel
+ if(!secured) return
+ user.set_machine(src)
+ var/dat = text("Infrared Laser\nStatus: []
\nVisibility: []
\n", (on ? text("On", src) : text("Off", src)), (src.visible ? text("Visible", src) : text("Invisible", src)))
+ dat += "
Refresh"
+ dat += "
Close"
+ user << browse(dat, "window=infra")
+ onclose(user, "infra")
+ return
+/obj/item/device/assembly/infra/Topic(href, href_list)
+ ..()
+ if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr))
+ usr << browse(null, "window=infra")
+ onclose(usr, "infra")
+ return
+ if(href_list["state"])
+ on = !(on)
+ update_icon()
+ if(href_list["visible"])
+ visible = !(visible)
+ if(first)
+ first.vis_spread(visible)
+ if(href_list["close"])
+ usr << browse(null, "window=infra")
+ return
+ if(usr)
+ attack_self(usr)
+
+/obj/item/device/assembly/infra/verb/rotate()//This could likely be better
+ set name = "Rotate Infrared Laser"
+ set category = "Object"
+ set src in usr
+
+ if(usr.stat || !usr.canmove || usr.restrained())
return
-
- verb/rotate()//This could likely be better
- set name = "Rotate Infrared Laser"
- set category = "Object"
- set src in usr
-
- dir = turn(dir, 90)
- return
+ dir = turn(dir, 90)
+ return
@@ -187,41 +145,30 @@
icon = 'icons/obj/projectiles.dmi'
icon_state = "ibeam"
var/obj/effect/beam/i_beam/next = null
+ var/obj/effect/beam/i_beam/previous = null
var/obj/item/device/assembly/infra/master = null
var/limit = null
var/visible = 0.0
var/left = null
anchored = 1.0
- flags = 0
/obj/effect/beam/i_beam/proc/hit()
- //world << "beam \ref[src]: hit"
if(master)
- //world << "beam hit \ref[src]: calling master \ref[master].hit"
master.trigger_beam()
- del(src)
+ qdel(src)
return
/obj/effect/beam/i_beam/proc/vis_spread(v)
- //world << "i_beam \ref[src] : vis_spread"
visible = v
- spawn(0)
- if(next)
- //world << "i_beam \ref[src] : is next [next.type] \ref[next], calling spread"
- next.vis_spread(v)
- return
- return
+ if(next)
+ next.vis_spread(v)
+
/obj/effect/beam/i_beam/process()
- //world << "i_beam \ref[src] : process"
-
if((loc.density || !(master)))
- // world << "beam hit loc [loc] or no master [master], deleting"
- del(src)
+ qdel(src)
return
- //world << "proccess: [src.left] left"
-
if(left > 0)
left--
if(left < 1)
@@ -232,58 +179,40 @@
else
invisibility = 0
-
- //world << "now [src.left] left"
- var/obj/effect/beam/i_beam/I = new /obj/effect/beam/i_beam(loc)
- I.master = master
- I.density = 1
- I.dir = 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(!(next))
- //world << "no next"
+ if(!next && (limit > 0))
+ var/obj/effect/beam/i_beam/I = new /obj/effect/beam/i_beam(loc)
+ I.master = master
+ I.density = 1
+ I.dir = dir
+ I.previous = src
+ next = I
+ step(I, I.dir)
+ if(next)
I.density = 0
- //world << "spreading"
I.vis_spread(visible)
- next = I
- spawn(0)
- //world << "limit = [limit] "
- if((I && limit > 0))
- I.limit = limit - 1
- //world << "calling next process"
- I.process()
- return
- else
- //world << "is a next: \ref[next], deleting beam \ref[I]"
- del(I)
- else
- //world << "step failed, deleting \ref[next]"
- del(next)
- spawn(10)
- process()
- return
- return
+ I.limit = limit - 1
+ master.last = I
+ I.process()
/obj/effect/beam/i_beam/Bump()
- del(src)
+ qdel(src)
return
/obj/effect/beam/i_beam/Bumped()
hit()
- return
/obj/effect/beam/i_beam/Crossed(atom/movable/AM as mob|obj)
if(istype(AM, /obj/effect/beam))
return
- spawn(0)
- hit()
- return
- return
+ hit()
/obj/effect/beam/i_beam/Destroy()
- del(next)
- ..()
- return
+ if(master.first == src)
+ master.first = null
+ if(next)
+ qdel(next)
+ next = null
+ if(previous)
+ previous.next = null
+ master.last = previous
+ ..()
\ No newline at end of file
diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm
index df5eb1a35cb..d207130aeee 100644
--- a/code/modules/assembly/mousetrap.dm
+++ b/code/modules/assembly/mousetrap.dm
@@ -53,6 +53,7 @@
affecting = H.get_organ(type)
H.Stun(3)
if(affecting)
+ affecting.take_damage(1, 0)
H.updatehealth()
else if(ismouse(target))
var/mob/living/simple_animal/mouse/M = target
diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm
index e88c22556f5..04c9f14e092 100644
--- a/code/modules/reagents/reagent_containers/glass_containers.dm
+++ b/code/modules/reagents/reagent_containers/glass_containers.dm
@@ -1,4 +1,4 @@
-////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
/// (Mixing)Glass.
////////////////////////////////////////////////////////////////////////////////
/obj/item/weapon/reagent_containers/glass
@@ -190,6 +190,7 @@
item_state = "beaker"
m_amt = 0
g_amt = 500
+ var/obj/item/device/assembly_holder/assembly = null
on_reagent_change()
update_icon()
@@ -228,6 +229,55 @@
if (!is_open_container())
var/image/lid = image(icon, src, "lid_[initial(icon_state)]")
overlays += lid
+ if(assembly)
+ overlays += "assembly"
+
+/obj/item/weapon/reagent_containers/glass/beaker/verb/remove_assembly()
+ set name = "Remove Assembly"
+ set category = "Object"
+ set src in usr
+ if(usr.stat || !usr.canmove || usr.restrained())
+ return
+ if (assembly)
+ usr << "You detach [assembly] from \the [src]"
+ usr.put_in_hands(assembly)
+ assembly = null
+ update_icon()
+ else
+ usr << "There is no assembly to remove."
+
+/obj/item/weapon/reagent_containers/glass/beaker/ignite()
+ if(reagents)
+ reagents.chem_temp += 30
+ reagents.handle_reactions()
+
+/obj/item/weapon/reagent_containers/glass/beaker/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
+ if (istype(W,/obj/item/device/assembly_holder))
+ if (assembly)
+ usr << "The [src] already has an assembly."
+ return ..()
+ assembly = W
+ user.drop_item()
+ W.loc = src
+ overlays += "assembly"
+ else
+ ..()
+
+/obj/item/weapon/reagent_containers/glass/beaker/HasProximity(atom/movable/AM)
+ if(assembly)
+ assembly.HasProximity(AM)
+
+/obj/item/weapon/reagent_containers/glass/beaker/Crossed(atom/movable/AM)
+ if(assembly)
+ assembly.Crossed(AM)
+
+/obj/item/weapon/reagent_containers/glass/beaker/on_found(mob/finder as mob) //for mousetraps
+ if(assembly)
+ assembly.on_found(finder)
+
+/obj/item/weapon/reagent_containers/glass/beaker/hear_talk(mob/living/M, msg)
+ if(assembly)
+ assembly.hear_talk(M, msg)
/obj/item/weapon/reagent_containers/glass/beaker/large
name = "large beaker"
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index 2c5c73f5374..b3efb13975a 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -178,6 +178,14 @@
build_path = /obj/item/device/assembly/prox_sensor
category = list("initial", "Miscellaneous")
+/datum/design/mousetrap
+ name = "Mousetrap"
+ id = "mousetrap"
+ build_type = AUTOLATHE
+ materials = list("$metal" = 800, "$glass" = 200)
+ build_path = /obj/item/device/assembly/mousetrap
+ category = list("initial", "Miscellaneous")
+
/datum/design/timer
name = "Timer"
id = "timer"
diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi
index db617d819bf..b67e0602781 100644
Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ