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