diff --git a/code/game/objects/items/weapons/grenades/custom_grenades.dm b/code/game/objects/items/weapons/grenades/custom_grenades.dm index 82252c3a340..e9b78bbe90d 100644 --- a/code/game/objects/items/weapons/grenades/custom_grenades.dm +++ b/code/game/objects/items/weapons/grenades/custom_grenades.dm @@ -111,23 +111,23 @@ payload_name = "lubricant" stage = 2 - New() - ..() - var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src) - B1.reagents.add_reagent("lube",50) - beakers += B1 -/obj/item/weapon/grenade/chem_grenade/lube/remote - New() - ..() - CreateDefaultTrigger(/obj/item/device/assembly/signaler) -/obj/item/weapon/grenade/chem_grenade/lube/prox - New() - ..() - CreateDefaultTrigger(/obj/item/device/assembly/prox_sensor) -/obj/item/weapon/grenade/chem_grenade/lube/tripwire - New() - ..() - CreateDefaultTrigger(/obj/item/device/assembly/infra) +/obj/item/weapon/grenade/chem_grenade/lube/New() + ..() + var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src) + B1.reagents.add_reagent("lube",50) + beakers += B1 + +/obj/item/weapon/grenade/chem_grenade/lube/remote/New() + ..() + CreateDefaultTrigger(/obj/item/device/assembly/signaler) + +/obj/item/weapon/grenade/chem_grenade/lube/prox/New() + ..() + CreateDefaultTrigger(/obj/item/device/assembly/prox_sensor) + +/obj/item/weapon/grenade/chem_grenade/lube/tripwire/New() + ..() + CreateDefaultTrigger(/obj/item/device/assembly/infra) // Basic explosion grenade @@ -135,32 +135,68 @@ payload_name = "conventional" stage = 2 - New() - ..() - var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src) - var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src) - B1.reagents.add_reagent("glycerol",30) // todo: someone says NG is overpowered, test. - B1.reagents.add_reagent("sacid",15) - B2.reagents.add_reagent("sacid",15) - B2.reagents.add_reagent("facid",30) - beakers += B1 - beakers += B2 +/obj/item/weapon/grenade/chem_grenade/explosion/New() + ..() + var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src) + var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src) + B1.reagents.add_reagent("glycerol",30) // todo: someone says NG is overpowered, test. + B1.reagents.add_reagent("sacid",15) + B2.reagents.add_reagent("sacid",15) + B2.reagents.add_reagent("facid",30) + beakers += B1 + beakers += B2 // Assembly Variants -/obj/item/weapon/grenade/chem_grenade/explosion/remote - New() - ..() - CreateDefaultTrigger(/obj/item/device/assembly/signaler) +/obj/item/weapon/grenade/chem_grenade/explosion/remote/New() + ..() + CreateDefaultTrigger(/obj/item/device/assembly/signaler) + +/obj/item/weapon/grenade/chem_grenade/explosion/prox/New() + ..() + CreateDefaultTrigger(/obj/item/device/assembly/prox_sensor) + +/obj/item/weapon/grenade/chem_grenade/explosion/mine/New() + ..() + CreateDefaultTrigger(/obj/item/device/assembly/mousetrap) + + +// Water + Potassium = Boom + +/obj/item/weapon/grenade/chem_grenade/waterpotassium + payload_name = "chem explosive" + stage = 2 + +/obj/item/weapon/grenade/chem_grenade/waterpotassium/New() + ..() + var/obj/item/weapon/reagent_containers/glass/beaker/large/B1 = new(src) + var/obj/item/weapon/reagent_containers/glass/beaker/large/B2 = new(src) + B1.reagents.add_reagent("water",100) + B2.reagents.add_reagent("potassium",100) + beakers += B1 + beakers += B2 + +/obj/item/weapon/grenade/chem_grenade/waterpotassium/remote/New() + ..() + CreateDefaultTrigger(/obj/item/device/assembly/signaler) + +/obj/item/weapon/grenade/chem_grenade/waterpotassium/prox/New() + ..() + CreateDefaultTrigger(/obj/item/device/assembly/prox_sensor) + + +/obj/item/weapon/grenade/chem_grenade/waterpotassium/tripwire/New() + ..() + CreateDefaultTrigger(/obj/item/device/assembly/infra) + +/obj/item/weapon/grenade/chem_grenade/waterpotassium/tripwire_armed/New() + ..() + CreateDefaultTrigger(/obj/item/device/assembly/infra/armed) + +/obj/item/weapon/grenade/chem_grenade/waterpotassium/tripwire_armed_stealth/New() + ..() + CreateDefaultTrigger(/obj/item/device/assembly/infra/armed/stealth) -/obj/item/weapon/grenade/chem_grenade/explosion/prox - New() - ..() - CreateDefaultTrigger(/obj/item/device/assembly/prox_sensor) -/obj/item/weapon/grenade/chem_grenade/explosion/mine - New() - ..() - CreateDefaultTrigger(/obj/item/device/assembly/mousetrap) // Basic EMP grenade /obj/item/weapon/grenade/chem_grenade/emp diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index 16b047ab1f0..5ac461c563b 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -7,12 +7,16 @@ bomb_name = "tripwire mine" + secured = 0 // toggle_secure()'ed in New() for correct adding to processing_objects, won't work otherwise + dir = EAST var/on = 0 - var/visible = 0 + var/visible = 1 var/obj/effect/beam/i_beam/first = null var/obj/effect/beam/i_beam/last = null var/max_nesting_level = 10 var/turf/fire_location + var/emission_cycles = 0 + var/emission_cap = 20 /obj/item/device/assembly/infra/Destroy() if(first) @@ -22,7 +26,11 @@ return ..() /obj/item/device/assembly/infra/describe() - return "The infrared trigger is [on?"on":"off"]." + return "The assembly is [secured?"secure":"not secure"]. The infrared trigger is [on?"on":"off"]." + +/obj/item/device/assembly/infra/examine(mob/user) + ..() + to_chat(user, describe()) /obj/item/device/assembly/infra/activate() if(!..()) return 0//Cooldown check @@ -36,11 +44,22 @@ processing_objects.Add(src) else on = 0 - if(first) qdel(first) + if(first) + qdel(first) processing_objects.Remove(src) update_icon() return secured +/obj/item/device/assembly/infra/New() + ..() + if (!secured) + toggle_secure() + +/obj/item/device/assembly/infra/proc/arm() // Forces the device to arm no matter its current state. + if (!secured) // Checked because arm() might be called sometime after the object is spawned. + toggle_secure() + on = 1 + /obj/item/device/assembly/infra/update_icon() overlays.Cut() attached_overlays = list() @@ -71,18 +90,21 @@ return null /obj/item/device/assembly/infra/process() - if(!on || fire_location != get_turf(loc)) - if(first) - qdel(first) - return + var/turf/T = get_turf(src) + if(first && (!on || !fire_location || fire_location != T || emission_cycles >= emission_cap)) + qdel(first) + return + if(!on) + return if(!secured) return if(first && last) last.process() + emission_cycles++ return - var/turf/T = get_valid_loc() if(T) fire_location = T + emission_cycles = 0 var/obj/effect/beam/i_beam/I = new /obj/effect/beam/i_beam(T) I.master = src I.density = 1 @@ -124,6 +146,8 @@ return 0 pulse(0) audible_message("[bicon(src)] *beep* *beep*", null, 3) + if(first) + qdel(first) cooldown = 2 spawn(10) process_cooldown() @@ -177,6 +201,21 @@ if(usr.machine == src) interact(usr) + if(first) + qdel(first) + + + +/obj/item/device/assembly/infra/armed/New() + ..() + spawn(3) + if(holder) + if(holder.master) + dir = holder.master.dir + arm() + +/obj/item/device/assembly/infra/armed/stealth + visible = 0 /***************************IBeam*********************************/ @@ -191,6 +230,8 @@ var/limit = null var/visible = 0.0 var/left = null + var/life_cycles = 0 + var/life_cap = 20 anchored = 1.0 pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE @@ -209,7 +250,8 @@ transform = turn(matrix(), dir2angle(dir)) /obj/effect/beam/i_beam/process() - if((loc.density || !(master))) + life_cycles++ + if(loc.density || !master || life_cycles >= life_cap) qdel(src) return if(left > 0)