diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm
index 022d415d3e7..f862ef4f9ac 100644
--- a/code/game/objects/items/weapons/grenades/chem_grenade.dm
+++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm
@@ -2,12 +2,13 @@
name = "Grenade Casing"
icon_state = "chemg"
item_state = "flashbang"
+ desc = "A hand made chemical grenade."
w_class = 2.0
force = 2.0
var/stage = 0
var/state = 0
var/path = 0
- var/obj/item/weapon/circuitboard/circuit = null
+ var/obj/item/device/assembly_holder/detonator = null
var/list/beakers = new/list()
var/list/allowed_containers = list(/obj/item/weapon/reagent_containers/glass/beaker, /obj/item/weapon/reagent_containers/glass/bottle)
var/affected_area = 3
@@ -18,30 +19,75 @@
R.my_atom = src
attack_self(mob/user as mob)
- if(stage > 1)
- ..()
+ if(!stage || stage==1)
+ if(detonator)
+// detonator.loc=src.loc
+ usr.put_in_hands(detonator)
+ detonator=null
+ stage=0
+ icon_state = initial(icon_state)
+ else if(beakers.len)
+ for(var/obj/B in beakers)
+ if(istype(B))
+ beakers -= B
+ user.put_in_hands(B)
+ name = "unsecured grenade with [beakers.len] containers[stage?" and detonator":""]"
+ if(stage > 1 && !active && clown_check(user))
+ user << "You prime \the [name]!"
+
+ log_attack("[user.name] ([user.ckey]) primed \a [src].")
+ log_admin("ATTACK: [user] ([user.ckey]) primed \a [src].")
+ message_admins("ATTACK: [user] ([user.ckey]) primed \a [src].")
+
+ activate()
+ add_fingerprint(user)
+ if(iscarbon(user))
+ var/mob/living/carbon/C = user
+ C.throw_mode_on()
attackby(obj/item/weapon/W as obj, mob/user as mob)//TODO:Have grenades use the new assembly things
- if(istype(W,/obj/item/device/assembly_holder) && !stage && path != 2)
+ if(istype(W,/obj/item/device/assembly_holder) && (!stage || stage==1) && path != 2)
+ var/obj/item/device/assembly_holder/det = W
+ if(istype(det.a_left,det.a_right.type) || (!isigniter(det.a_left) && !isigniter(det.a_right)))
+ user << "\red Assembly must contain one igniter."
+ return
+ if(!det.secured)
+ user << "\red Assembly must be secured with screwdriver."
+ return
path = 1
user << "\blue You add [W] to the metal casing."
playsound(src.loc, 'sound/items/Screwdriver2.ogg', 25, -3)
- del(W) //Okay so we're not really adding anything here. cheating.
+ user.remove_from_mob(det)
+ det.loc = src
+ detonator = det
icon_state = initial(icon_state) +"_ass"
- name = "unsecured grenade"
+ name = "unsecured grenade with [beakers.len] containers[stage?" and detonator":""]"
stage = 1
- else if(istype(W,/obj/item/weapon/screwdriver) && stage == 1 && path != 2)
- path = 1
- if(beakers.len)
- user << "\blue You lock the assembly."
+ else if(istype(W,/obj/item/weapon/screwdriver) && path != 2)
+ if(stage == 1)
+ path = 1
+ if(beakers.len)
+ user << "\blue You lock the assembly."
+ playsound(src.loc, 'sound/items/Screwdriver.ogg', 25, -3)
+ name = "grenade"
+ icon_state = initial(icon_state) +"_locked"
+ stage = 2
+ else
+// user << "\red You need to add at least one beaker before locking the assembly."
+ user << "\blue You lock the empty assembly."
+ playsound(src.loc, 'sound/items/Screwdriver.ogg', 25, -3)
+ name = "fake grenade"
+ icon_state = initial(icon_state) +"_locked"
+ stage = 2
+ else if(stage == 2)
+ user << "\blue You unlock the assembly."
playsound(src.loc, 'sound/items/Screwdriver.ogg', 25, -3)
- name = "grenade"
- icon_state = initial(icon_state) +"_locked"
- stage = 2
- else
- user << "\red You need to add at least one beaker before locking the assembly."
- else if(is_type_in_list(W, allowed_containers) && stage == 1 && path != 2)
+ name = "unsecured grenade with [beakers.len] containers[stage?" and detonator":""]"
+ icon_state = initial(icon_state) + (detonator?"_ass":"")
+ stage = 1
+ active = 0
+ else if(is_type_in_list(W, allowed_containers) && (!stage || stage==1) && path != 2)
path = 1
if(beakers.len == 2)
user << "\red The grenade can not hold more containers."
@@ -52,18 +98,47 @@
user.drop_item()
W.loc = src
beakers += W
+ stage = 1
+ name = "unsecured grenade with [beakers.len] containers[stage?" and detonator":""]"
else
user << "\red \the [W] is empty."
+ examine()
+ set src in usr
+ usr << desc
+ if(detonator)
+ usr << "With attached [detonator.name]"
+
+ activate()
+ if(active) return
+ if(detonator)
+ if(!isigniter(detonator.a_left))
+ detonator.a_left.activate()
+ active = 1
+ if(!isigniter(detonator.a_right))
+ detonator.a_right.activate()
+ active = 1
+ if(active)
+ icon_state = initial(icon_state) + "_active"
+
+ return
+
+ proc/primed(var/primed = 1)
+ if(active)
+ icon_state = initial(icon_state) + (primed?"_primed":"_active")
+
prime()
+ if(!stage || stage<2) return
+
//if(prob(reliability))
var/has_reagents = 0
for(var/obj/item/weapon/reagent_containers/glass/G in beakers)
if(G.reagents.total_volume) has_reagents = 1
+ active = 0
if(!has_reagents)
+ icon_state = initial(icon_state) +"_locked"
playsound(src.loc, 'sound/items/Screwdriver2.ogg', 50, 1)
- state = 0
return
playsound(src.loc, 'sound/effects/bamf.ogg', 50, 1)
@@ -91,6 +166,7 @@
for(var/obj/item/weapon/reagent_containers/glass/G in beakers)
G.loc = get_turf(src.loc)*/
+
/obj/item/weapon/grenade/chem_grenade/large
name = "Large Chem Grenade"
desc = "An oversized grenade that affects a larger area."
diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm
index 030e9402d55..e021cd41585 100644
--- a/code/modules/assembly/holder.dm
+++ b/code/modules/assembly/holder.dm
@@ -44,6 +44,8 @@
a_right = D2
name = "[D.name]-[D2.name] assembly"
update_icon()
+ usr.put_in_hands(src)
+
return 1
@@ -154,8 +156,10 @@
if("Right") a_right.attack_self(user)
return
else
- a_left.attack_self(user)
- a_right.attack_self(user)
+ if(!istype(a_left,/obj/item/device/assembly/igniter))
+ a_left.attack_self(user)
+ if(!istype(a_right,/obj/item/device/assembly/igniter))
+ a_right.attack_self(user)
else
var/turf/T = get_turf(src)
if(!T) return 0
@@ -172,6 +176,8 @@
process_activation(var/obj/D, var/normal = 1, var/special = 1)
if(!D) return 0
+ if(!secured)
+ visible_message("\icon[src] *beep* *beep*", "*beep* *beep*")
if((normal) && (a_right) && (a_left))
if(a_right != D)
a_right.pulsed(0)
diff --git a/code/modules/assembly/igniter.dm b/code/modules/assembly/igniter.dm
index 181d8d6c6f7..390372211a6 100644
--- a/code/modules/assembly/igniter.dm
+++ b/code/modules/assembly/igniter.dm
@@ -7,23 +7,31 @@
w_amt = 10
origin_tech = "magnets=1"
+ wires = WIRE_RECEIVE
+
secured = 1
activate()
if(!..()) return 0//Cooldown check
- var/turf/location = get_turf(loc)
- if(location)
- location.hotspot_expose(1000,1000)
- if (istype(src.loc,/obj/item/device/assembly_holder))
- if (istype(src.loc.loc, /obj/structure/reagent_dispensers/fueltank/))
- var/obj/structure/reagent_dispensers/fueltank/tank = src.loc.loc
- if (tank && tank.modded)
- tank.explode()
- var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
- s.set_up(3, 1, src)
- s.start()
+ if(holder && istype(holder.loc,/obj/item/weapon/grenade/chem_grenade))
+ var/obj/item/weapon/grenade/chem_grenade/grenade = holder.loc
+ grenade.prime()
+ else
+ var/turf/location = get_turf(loc)
+ if(location)
+ location.hotspot_expose(1000,1000)
+ if (istype(src.loc,/obj/item/device/assembly_holder))
+ if (istype(src.loc.loc, /obj/structure/reagent_dispensers/fueltank/))
+ var/obj/structure/reagent_dispensers/fueltank/tank = src.loc.loc
+ if (tank && tank.modded)
+ tank.explode()
+
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(3, 1, src)
+ s.start()
+
return 1
diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm
index 45861f38401..4ce70a164eb 100644
--- a/code/modules/assembly/infrared.dm
+++ b/code/modules/assembly/infrared.dm
@@ -9,6 +9,8 @@
w_amt = 100
origin_tech = "magnets=2"
+ wires = WIRE_PULSE
+
secured = 0
var/on = 0
@@ -100,7 +102,8 @@
trigger_beam()
if((!secured)||(!on)||(cooldown > 0)) return 0
pulse(0)
- visible_message("\icon[src] *beep* *beep*")
+ if(!holder)
+ visible_message("\icon[src] *beep* *beep*")
cooldown = 2
spawn(10)
process_cooldown()
diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm
index 235869667d6..07411198afd 100644
--- a/code/modules/assembly/proximity.dm
+++ b/code/modules/assembly/proximity.dm
@@ -7,12 +7,16 @@
w_amt = 50
origin_tech = "magnets=1"
+ wires = WIRE_PULSE
+
secured = 0
var/scanning = 0
var/timing = 0
var/time = 10
+ var/range = 1
+
proc
toggle_scan()
sense()
@@ -44,9 +48,14 @@
sense()
- if((!secured)||(!scanning)||(cooldown > 0)) return 0
+ var/obj/mainloc = loc
+ if(holder) mainloc=holder.loc
+// if(scanning && cooldown <= 0)
+// mainloc.visible_message("\icon[src] *boop* *boop*", "*boop* *boop*")
+ if((!holder && !secured)||(!scanning)||(cooldown > 0)) return 0
pulse(0)
- visible_message("\icon[src] *beep* *beep*", "*beep* *beep*")
+ if(!holder)
+ mainloc.visible_message("\icon[src] *beep* *beep*", "*beep* *beep*")
cooldown = 2
spawn(10)
process_cooldown()
@@ -54,6 +63,13 @@
process()
+ if(scanning)
+ var/obj/mainloc = loc
+ if(holder) mainloc=holder.loc
+ for(var/mob/living/A in range(range,mainloc))
+ if (A.move_speed < 12)
+ sense()
+
if(timing && (time >= 0))
time--
if(timing && time <= 0)
@@ -88,6 +104,9 @@
attached_overlays += "prox_scanning"
if(holder)
holder.update_icon()
+ if(holder && istype(holder.loc,/obj/item/weapon/grenade/chem_grenade))
+ var/obj/item/weapon/grenade/chem_grenade/grenade = holder.loc
+ grenade.primed(scanning)
return
@@ -104,6 +123,7 @@
var/second = time % 60
var/minute = (time - second) / 60
var/dat = text("Proximity Sensor\n[] []:[]\n- - + +\n", (timing ? text("Arming", src) : text("Not Arming", src)), minute, second, src, src, src, src)
+ dat += text("
Range: - [] +", src, range, src)
dat += "
[scanning?"Armed":"Unarmed"] (Movement sensor active when armed!)"
dat += "
Refresh"
dat += "
Close"
@@ -131,6 +151,11 @@
time += tp
time = min(max(round(time), 0), 600)
+ if(href_list["range"])
+ var/r = text2num(href_list["range"])
+ range += r
+ range = min(max(range, 1), 5)
+
if(href_list["close"])
usr << browse(null, "window=prox")
return
diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm
index a626ffeddcc..6f70ad1a875 100644
--- a/code/modules/assembly/signaler.dm
+++ b/code/modules/assembly/signaler.dm
@@ -31,7 +31,7 @@
spawn(10)
process_cooldown()
- signal()
+// signal()
return 1
update_icon()
@@ -126,7 +126,7 @@
else if(holder)
holder.process_activation(src, 1, 0)
else
- ..()
+ ..(radio)
return 1
@@ -136,8 +136,9 @@
if(!(src.wires & WIRE_RADIO_RECEIVE)) return 0
pulse(1)
- for(var/mob/O in hearers(1, src.loc))
- O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2)
+ if(!holder)
+ for(var/mob/O in hearers(1, src.loc))
+ O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2)
return
diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm
index 3cce208ebe7..fc7c65b39bf 100644
--- a/code/modules/assembly/timer.dm
+++ b/code/modules/assembly/timer.dm
@@ -7,6 +7,8 @@
w_amt = 10
origin_tech = "magnets=1"
+ wires = WIRE_PULSE
+
secured = 0
var/timing = 0
@@ -37,7 +39,8 @@
timer_end()
if((!secured)||(cooldown > 0)) return 0
pulse(0)
- visible_message("\icon[src] *beep* *beep*", "*beep* *beep*")
+ if(!holder)
+ visible_message("\icon[src] *beep* *beep*", "*beep* *beep*")
cooldown = 2
spawn(10)
process_cooldown()
diff --git a/icons/obj/grenade.dmi b/icons/obj/grenade.dmi
index d548e040c65..d7586a9e82d 100644
Binary files a/icons/obj/grenade.dmi and b/icons/obj/grenade.dmi differ