From 6337048aad6d9522f20c360fd955c02a29e4f803 Mon Sep 17 00:00:00 2001 From: Ater Ignis Date: Thu, 25 Oct 2012 19:56:32 +0400 Subject: [PATCH] updated grenades, now with remote control, proximity control and timer control for your choosing --- .../items/weapons/grenades/chem_grenade.dm | 110 +++++++++++++++--- code/modules/assembly/holder.dm | 10 +- code/modules/assembly/igniter.dm | 30 +++-- code/modules/assembly/infrared.dm | 5 +- code/modules/assembly/proximity.dm | 29 ++++- code/modules/assembly/signaler.dm | 9 +- code/modules/assembly/timer.dm | 5 +- icons/obj/grenade.dmi | Bin 4763 -> 3346 bytes 8 files changed, 160 insertions(+), 38 deletions(-) diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 022d415d3e..f862ef4f9a 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 030e9402d5..e021cd4158 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 181d8d6c6f..390372211a 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 45861f3840..4ce70a164e 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 235869667d..07411198af 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 a626ffeddc..6f70ad1a87 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 3cce208ebe..fc7c65b39b 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 d548e040c65a9ed92ad4961f6c4cf214648d8a5c..d7586a9e82d39ab5f01a1f618f079dc4a1811d20 100644 GIT binary patch delta 3189 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 b{`nRDKrJl7sAYQq015yANkvXXu0mjf!iyp< delta 4633 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 P00000NkvXXu0mjfQuV-X