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