From bcda610cc07f075fec7c2fc938ec3e3331dd065f Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Thu, 29 Jun 2017 18:10:58 -0400 Subject: [PATCH 1/4] Refactors Syndicate Bombs --- code/datums/wires/syndicatebomb.dm | 111 ++++++------ code/game/machinery/syndicatebomb.dm | 254 +++++++++++++++++++-------- code/modules/countdown/countdown.dm | 27 ++- icons/obj/assemblies.dmi | Bin 27808 -> 29711 bytes 4 files changed, 261 insertions(+), 131 deletions(-) diff --git a/code/datums/wires/syndicatebomb.dm b/code/datums/wires/syndicatebomb.dm index d1fe6217058..616429b8cd8 100644 --- a/code/datums/wires/syndicatebomb.dm +++ b/code/datums/wires/syndicatebomb.dm @@ -1,5 +1,5 @@ /datum/wires/syndicatebomb - random = 1 + random = TRUE holder_type = /obj/machinery/syndicatebomb wire_count = 5 @@ -13,83 +13,90 @@ var/const/WIRE_ACTIVATE = 16 // Will start a bombs timer if pulsed, will hint if switch(index) if(WIRE_BOOM) return "Explode" - + if(WIRE_UNBOLT) return "Unbolt" - + if(WIRE_DELAY) return "Delay" - + if(WIRE_PROCEED) return "Proceed" - + if(WIRE_ACTIVATE) return "Activate" /datum/wires/syndicatebomb/CanUse(mob/living/L) var/obj/machinery/syndicatebomb/P = holder if(P.open_panel) - return 1 - return 0 + return TRUE + return FALSE /datum/wires/syndicatebomb/UpdatePulsed(index) - var/obj/machinery/syndicatebomb/P = holder + var/obj/machinery/syndicatebomb/B = holder switch(index) if(WIRE_BOOM) - if(P.active) - P.loc.visible_message("[bicon(holder)] An alarm sounds! It's go-") - P.timer = 0 + if(B.active) + holder.visible_message("[bicon(B)] An alarm sounds! It's go-") + B.explode_now = TRUE if(WIRE_UNBOLT) - P.loc.visible_message("[bicon(holder)] The bolts spin in place for a moment.") + holder.visible_message("[bicon(holder)] The bolts spin in place for a moment.") if(WIRE_DELAY) - playsound(P.loc, 'sound/machines/chime.ogg', 30, 1) - P.loc.visible_message("[bicon(holder)] The bomb chirps.") - P.timer += 10 - if(WIRE_PROCEED) - playsound(P.loc, 'sound/machines/buzz-sigh.ogg', 30, 1) - P.loc.visible_message("[bicon(holder)] The bomb buzzes ominously!") - if(P.timer >= 61) //Long fuse bombs can suddenly become more dangerous if you tinker with them - P.timer = 60 - if(P.timer >= 21) - P.timer -= 10 - else if(P.timer >= 11) //both to prevent negative timers and to have a little mercy - P.timer = 10 - if(WIRE_ACTIVATE) - if(!P.active && !P.defused) - playsound(P.loc, 'sound/machines/click.ogg', 30, 1) - P.loc.visible_message("[bicon(holder)] You hear the bomb start ticking!") - P.active = 1 - P.icon_state = "[initial(P.icon_state)]-active[P.open_panel ? "-wires" : ""]" + if(B.delayedbig) + holder.visible_message("[bicon(B)] The bomb has already been delayed.") else - P.loc.visible_message("[bicon(holder)] The bomb seems to hesitate for a moment.") - P.timer += 5 + holder.visible_message("[bicon(B)] The bomb chirps.") + playsound(B, 'sound/machines/chime.ogg', 30, 1) + B.detonation_timer += 300 + B.delayedbig = TRUE + if(WIRE_PROCEED) + holder.visible_message("[bicon(B)] The bomb buzzes ominously!") + playsound(B, 'sound/machines/buzz-sigh.ogg', 30, 1) + var/seconds = B.seconds_remaining() + if(seconds >= 61) // Long fuse bombs can suddenly become more dangerous if you tinker with them. + B.detonation_timer = world.time + 600 + else if(seconds >= 21) + B.detonation_timer -= 100 + else if(seconds >= 11) // Both to prevent negative timers and to have a little mercy. + B.detonation_timer = world.time + 100 + if(WIRE_ACTIVATE) + if(!B.active && !B.defused) + holder.visible_message("[bicon(B)] You hear the bomb start ticking!") + B.activate() + B.update_icon() + else if(B.delayedlittle) + holder.visible_message("[bicon(B)] Nothing happens.") + else + holder.visible_message("[bicon(B)] The bomb seems to hesitate for a moment.") + B.detonation_timer += 100 + B.delayedlittle = TRUE ..() /datum/wires/syndicatebomb/UpdateCut(index, mended) - var/obj/machinery/syndicatebomb/P = holder + var/obj/machinery/syndicatebomb/B = holder switch(index) if(WIRE_EXPLODE) - if(!mended) - if(P.active) - P.loc.visible_message("[bicon(holder)] An alarm sounds! It's go-") - P.timer = 0 - else - P.defused = 1 + if(mended) + B.defused = FALSE // Cutting and mending all the wires of an inactive bomb will thus cure any sabotage. else - P.defused = 0 //cutting and mending all the wires of an inactive bomb will thus cure any sabotage + if(B.active) + holder.visible_message("[bicon(B)] An alarm sounds! It's go-") + B.explode_now = TRUE + else + B.defused = TRUE if(WIRE_UNBOLT) - if(!mended && P.anchored) - playsound(P.loc, 'sound/effects/stealthoff.ogg', 30, 1) - P.loc.visible_message("[bicon(holder)] The bolts lift out of the ground!") - P.anchored = 0 + if(!mended && B.anchored) + holder.visible_message("[bicon(B)] The bolts lift out of the ground!") + playsound(B, 'sound/effects/stealthoff.ogg', 30, 1) + B.anchored = FALSE if(WIRE_PROCEED) - if(!mended && P.active) - P.loc.visible_message("[bicon(holder)] An alarm sounds! It's go-") - P.timer = 0 + if(!mended && B.active) + holder.visible_message("[bicon(B)] An alarm sounds! It's go-") + B.explode_now = TRUE if(WIRE_ACTIVATE) - if(!mended && P.active) - P.loc.visible_message("[bicon(holder)] The timer stops! The bomb has been defused!") - P.icon_state = "[initial(P.icon_state)]-inactive[P.open_panel ? "-wires" : ""]" - P.active = 0 - P.defused = 1 + if(!mended && B.active) + holder.visible_message("[bicon(B)] The timer stops! The bomb has been defused!") + B.active = FALSE + B.defused = TRUE + B.update_icon() ..() \ No newline at end of file diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 10f6fc1c8c5..ba3ed604e00 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -1,3 +1,6 @@ +#define BUTTON_COOLDOWN 60 // cant delay the bomb forever +#define BUTTON_DELAY 50 //five seconds + /obj/machinery/syndicatebomb icon = 'icons/obj/assemblies.dmi' name = "syndicate bomb" @@ -6,71 +9,119 @@ anchored = 0 density = 0 - layer = MOB_LAYER - 0.1 //so people can't hide it and it's REALLY OBVIOUS + layer = BELOW_MOB_LAYER //so people can't hide it and it's REALLY OBVIOUS unacidable = 1 var/datum/wires/syndicatebomb/wires = null - var/timer = 120 - var/open_panel = 0 //are the wires exposed? - var/active = 0 //is the bomb counting down? - var/defused = 0 //is the bomb capable of exploding? - var/obj/item/weapon/bombcore/payload = /obj/item/weapon/bombcore/ + var/minimum_timer = 90 + var/timer_set = 90 + var/maximum_timer = 60000 + + var/can_unanchor = TRUE + + var/open_panel = FALSE //are the wires exposed? + var/active = FALSE //is the bomb counting down? + var/defused = FALSE //is the bomb capable of exploding? + var/obj/item/weapon/bombcore/payload = /obj/item/weapon/bombcore var/beepsound = 'sound/items/timer.ogg' + var/delayedbig = FALSE //delay wire pulsed? + var/delayedlittle = FALSE //activation wire pulsed? + var/obj/effect/countdown/syndicatebomb/countdown + + var/next_beep + var/detonation_timer + var/explode_now = FALSE + +/obj/machinery/syndicatebomb/proc/try_detonate(ignore_active = FALSE) + . = (payload in src) && (active || ignore_active) && !defused + if(.) + payload.detonate() /obj/machinery/syndicatebomb/process() - if(active && !defused && (timer > 0)) //Tick Tock - var/volume = (timer <= 20 ? 40 : 10) // Tick louder when the bomb is closer to being detonated. - playsound(loc, beepsound, volume, 0) - timer = max(timer - 2,0) // 2 seconds per process() - if(active && !defused && (timer <= 0)) //Boom - active = 0 - timer = 120 - update_icon() - if(payload in src) - payload.detonate() + if(!active) + fast_processing -= src + detonation_timer = null + next_beep = null + countdown.stop() return - if(!active || defused) //Counter terrorists win + + if(!isnull(next_beep) && (next_beep <= world.time)) + var/volume + switch(seconds_remaining()) + if(0 to 5) + volume = 50 + if(5 to 10) + volume = 40 + if(10 to 15) + volume = 30 + if(15 to 20) + volume = 20 + if(20 to 25) + volume = 10 + else + volume = 5 + playsound(loc, beepsound, volume, 0) + next_beep = world.time + 10 + + if(active && !defused && ((detonation_timer <= world.time) || explode_now)) + active = FALSE + timer_set = initial(timer_set) + update_icon() + try_detonate(TRUE) + //Counter terrorists win + else if(!active || defused) if(defused && payload in src) payload.defuse() - return + countdown.stop() + fast_processing -= src /obj/machinery/syndicatebomb/New() wires = new(src) - payload = new payload(src) + if(payload) + payload = new payload(src) update_icon() + countdown = new(src) ..() /obj/machinery/syndicatebomb/Destroy() QDEL_NULL(wires) + QDEL_NULL(countdown) + fast_processing -= src return ..() /obj/machinery/syndicatebomb/examine(mob/user) ..(user) - to_chat(user, "A digital display on it reads \"[timer]\".") + to_chat(user, "A digital display on it reads \"[seconds_remaining()]\".") /obj/machinery/syndicatebomb/update_icon() icon_state = "[initial(icon_state)][active ? "-active" : "-inactive"][open_panel ? "-wires" : ""]" -/obj/machinery/syndicatebomb/attackby(var/obj/item/I, var/mob/user, params) - if(istype(I, /obj/item/weapon/wrench)) +/obj/machinery/syndicatebomb/proc/seconds_remaining() + if(active) + . = max(0, round((detonation_timer - world.time) / 10)) + else + . = timer_set + +/obj/machinery/syndicatebomb/attackby(obj/item/I, mob/user, params) + if(iswrench(I) && can_unanchor) if(!anchored) - if(!isturf(src.loc) || istype(src.loc, /turf/space)) - to_chat(user, "The bomb must be placed on solid ground to attach it") + if(!isturf(loc) || isspaceturf(loc)) + to_chat(user, "The bomb must be placed on solid ground to attach it.") else - to_chat(user, "You firmly wrench the bomb to the floor") + to_chat(user, "You firmly wrench the bomb to the floor.") playsound(loc, I.usesound, 50, 1) anchored = 1 if(active) - to_chat(user, "The bolts lock in place") + to_chat(user, "The bolts lock in place.") else if(!active) - to_chat(user, "You wrench the bomb from the floor") + to_chat(user, "You wrench the bomb from the floor.") playsound(loc, I.usesound, 50, 1) anchored = 0 else to_chat(user, "The bolts are locked down!") - else if(istype(I, /obj/item/weapon/screwdriver)) + else if(isscrewdriver(I)) open_panel = !open_panel update_icon() to_chat(user, "You [open_panel ? "open" : "close"] the wire panel.") @@ -79,28 +130,47 @@ if(open_panel) wires.Interact(user) - else if(istype(I, /obj/item/weapon/crowbar)) - if(open_panel && isWireCut(WIRE_BOOM) && isWireCut(WIRE_UNBOLT) && isWireCut(WIRE_DELAY) && isWireCut(WIRE_PROCEED) && isWireCut(WIRE_ACTIVATE)) + else if(iscrowbar(I)) + if(open_panel && wires.IsAllCut()) if(payload) to_chat(user, "You carefully pry out [payload].") payload.loc = user.loc payload = null else - to_chat(user, "There isn't anything in here to remove!") + to_chat(user, "There isn't anything in here to remove!") else if(open_panel) - to_chat(user, "The wires connecting the shell to the explosives are holding it down!") + to_chat(user, "The wires connecting the shell to the explosives are holding it down!") else - to_chat(user, "The cover is screwed on, it won't pry off!") + to_chat(user, "The cover is screwed on, it won't pry off!") else if(istype(I, /obj/item/weapon/bombcore)) if(!payload) + if(!user.drop_item()) + return payload = I to_chat(user, "You place [payload] into [src].") - user.drop_item() - payload.loc = src + payload.forceMove(src) else to_chat(user, "[payload] is already loaded into [src], you'll have to remove it first.") + else if(iswelder(I)) + if(payload || !wires.IsAllCut() || !open_panel) + return + var/obj/item/weapon/weldingtool/WT = I + if(!WT.isOn()) + return + if(WT.get_fuel() < 5) //uses up 5 fuel. + to_chat(user, "You need more fuel to complete this task!") + return + + playsound(loc, WT.usesound, 50, 1) + to_chat(user, "You start to cut the [src] apart...") + if(do_after(user, 20*I.toolspeed, target = src)) + if(!WT.isOn() || !WT.remove_fuel(5, user)) + return + to_chat(user, "You cut the [src] apart.") + new /obj/item/stack/sheet/plasteel(loc, 5) + qdel(src) else - ..() + return ..() /obj/machinery/syndicatebomb/attack_ghost(mob/user) interact(user) @@ -133,21 +203,27 @@ return FALSE return TRUE +/obj/machinery/syndicatebomb/proc/activate() + active = TRUE + fast_processing += src + countdown.start() + next_beep = world.time + 10 + detonation_timer = world.time + (timer_set * 10) + playsound(loc, 'sound/machines/click.ogg', 30, 1) + /obj/machinery/syndicatebomb/proc/settings(mob/user) - var/newtime = input(user, "Please set the timer.", "Timer", "[timer]") as num - newtime = Clamp(newtime, 120, 60000) + var/new_timer = input(user, "Please set the timer.", "Timer", "[timer_set]") as num if(can_interact(user)) //No running off and setting bombs from across the station - timer = newtime - loc.visible_message("[bicon(src)] timer set for [timer] seconds.") + timer_set = Clamp(new_timer, minimum_timer, maximum_timer) + loc.visible_message("[bicon(src)] timer set for [timer_set] seconds.") if(alert(user,"Would you like to start the countdown now?",,"Yes","No") == "Yes" && can_interact(user)) if(defused || active) if(defused) loc.visible_message("[bicon(src)] Device error: User intervention required.") return else - loc.visible_message("[bicon(src)] [timer] seconds until detonation, please clear the area.") - playsound(loc, 'sound/machines/click.ogg', 30, 1) - active = 1 + loc.visible_message("[bicon(src)] [timer_set] seconds until detonation, please clear the area.") + activate() update_icon() add_fingerprint(user) @@ -167,12 +243,12 @@ name = "training bomb" icon_state = "training-bomb" desc = "A salvaged syndicate device gutted of its explosives to be used as a training aid for aspiring bomb defusers." - payload = /obj/item/weapon/bombcore/training/ + payload = /obj/item/weapon/bombcore/training /obj/machinery/syndicatebomb/badmin name = "generic summoning badmin bomb" desc = "Oh god what is in this thing?" - payload = /obj/item/weapon/bombcore/badmin/summon/ + payload = /obj/item/weapon/bombcore/badmin/summon /obj/machinery/syndicatebomb/badmin/clown name = "clown bomb" @@ -181,8 +257,23 @@ payload = /obj/item/weapon/bombcore/badmin/summon/clown beepsound = 'sound/items/bikehorn.ogg' -/obj/machinery/syndicatebomb/badmin/varplosion - payload = /obj/item/weapon/bombcore/badmin/explosion/ +/obj/machinery/syndicatebomb/empty + name = "bomb" + icon_state = "base-bomb" + desc = "An ominous looking device designed to detonate an explosive payload. Can be bolted down using a wrench." + payload = null + open_panel = TRUE + timer_set = 120 + +/obj/machinery/syndicatebomb/empty/New() + ..() + wires.CutAll() + +/obj/machinery/syndicatebomb/self_destruct + name = "self destruct device" + desc = "Do not taunt. Warranty invalid if exposed to high temperature. Not suitable for agents under 3 years of age." + payload = /obj/item/weapon/bombcore/large + can_unanchor = FALSE ///Bomb Cores/// @@ -196,17 +287,26 @@ origin_tech = "syndicate=5;combat=6" burn_state = FLAMMABLE //Burnable (but the casing isn't) var/adminlog = null + var/range_heavy = 3 + var/range_medium = 9 + var/range_light = 17 + var/range_flame = 17 /obj/item/weapon/bombcore/ex_act(severity) //Little boom can chain a big boom - src.detonate() + detonate() + + +/obj/item/weapon/bombcore/burn() + detonate() + ..() /obj/item/weapon/bombcore/proc/detonate() if(adminlog) message_admins(adminlog) log_game(adminlog) - explosion(get_turf(src),3,9,17, flame_range = 17) - if(src.loc && istype(src.loc,/obj/machinery/syndicatebomb/)) - qdel(src.loc) + explosion(get_turf(src), range_heavy, range_medium, range_light, flame_range = range_flame) + if(loc && istype(loc,/obj/machinery/syndicatebomb/)) + qdel(loc) qdel(src) /obj/item/weapon/bombcore/proc/defuse() @@ -223,17 +323,20 @@ var/attempts = 0 /obj/item/weapon/bombcore/training/proc/reset() - var/obj/machinery/syndicatebomb/holder = src.loc + var/obj/machinery/syndicatebomb/holder = loc if(istype(holder)) if(holder.wires) holder.wires.Shuffle() holder.defused = 0 holder.open_panel = 0 + holder.delayedbig = FALSE + holder.delayedlittle = FALSE + holder.explode_now = FALSE holder.update_icon() holder.updateDialog() /obj/item/weapon/bombcore/training/detonate() - var/obj/machinery/syndicatebomb/holder = src.loc + var/obj/machinery/syndicatebomb/holder = loc if(istype(holder)) attempts++ holder.loc.visible_message("[bicon(holder)] Alert: Bomb has detonated. Your score is now [defusals] for [attempts]. Resetting wires...") @@ -242,7 +345,7 @@ qdel(src) /obj/item/weapon/bombcore/training/defuse() - var/obj/machinery/syndicatebomb/holder = src.loc + var/obj/machinery/syndicatebomb/holder = loc if(istype(holder)) attempts++ defusals++ @@ -257,11 +360,11 @@ origin_tech = null /obj/item/weapon/bombcore/badmin/defuse() //because we wouldn't want them being harvested by players - var/obj/machinery/syndicatebomb/B = src.loc + var/obj/machinery/syndicatebomb/B = loc qdel(B) qdel(src) -/obj/item/weapon/bombcore/badmin/summon/ +/obj/item/weapon/bombcore/badmin/summon var/summon_path = /obj/item/weapon/reagent_containers/food/snacks/cookie var/amt_summon = 1 @@ -285,42 +388,43 @@ playsound(src.loc, 'sound/misc/sadtrombone.ogg', 50) ..() -/obj/item/weapon/bombcore/badmin/explosion/ - var/HeavyExplosion = 2 - var/MediumExplosion = 5 - var/LightExplosion = 11 - var/Flames = 11 +/obj/item/weapon/bombcore/large + name = "large bomb payload" + range_heavy = 5 + range_medium = 10 + range_light = 20 + range_flame = 20 -/obj/item/weapon/bombcore/badmin/explosion/detonate() - explosion(get_turf(src),HeavyExplosion,MediumExplosion,LightExplosion, flame_range = Flames) +/obj/item/weapon/bombcore/large/underwall + layer = ABOVE_OPEN_TURF_LAYER /obj/item/weapon/bombcore/miniature name = "small bomb core" w_class = WEIGHT_CLASS_SMALL - -/obj/item/weapon/bombcore/miniature/detonate() - explosion(src.loc,1,2,4,flame_range = 2) //Identical to a minibomb - qdel(src) + range_heavy = 1 + range_medium = 2 + range_light = 4 + range_flame = 2 ///Syndicate Detonator (aka the big red button)/// /obj/item/device/syndicatedetonator name = "big red button" - desc = "Nothing good can come of pressing a button this garish..." + desc = "Your standard issue bomb synchronizing button. Five second safety delay to prevent 'accidents'" icon = 'icons/obj/assemblies.dmi' icon_state = "bigred" item_state = "electronic" w_class = WEIGHT_CLASS_TINY origin_tech = "syndicate=3" - var/cooldown = 0 + var/timer = 0 var/detonated = 0 var/existant = 0 -/obj/item/device/syndicatedetonator/attack_self(mob/user as mob) - if(!cooldown) +/obj/item/device/syndicatedetonator/attack_self(mob/user) + if(timer < world.time) for(var/obj/machinery/syndicatebomb/B in machines) if(B.active) - B.timer = 0 + B.detonation_timer = world.time + BUTTON_DELAY detonated++ existant++ playsound(user, 'sound/machines/click.ogg', 20, 1) @@ -334,5 +438,7 @@ log_game("[key_name(user)] has remotely detonated [detonated ? "syndicate bombs" : "a syndicate bomb"] using a [name] at [A.name] ([T.x],[T.y],[T.z])") detonated = 0 existant = 0 - cooldown = 1 - spawn(30) cooldown = 0 + timer = world.time + BUTTON_COOLDOWN + +#undef BUTTON_COOLDOWN +#undef BUTTON_DELAY \ No newline at end of file diff --git a/code/modules/countdown/countdown.dm b/code/modules/countdown/countdown.dm index 2ef85d6a9d7..7e651fb910f 100644 --- a/code/modules/countdown/countdown.dm +++ b/code/modules/countdown/countdown.dm @@ -9,15 +9,19 @@ var/atom/attached_to color = "#ff0000" var/text_size = 4 - var/started = 0 + var/started = FALSE invisibility = INVISIBILITY_OBSERVER - anchored = 1 - layer = 5 + anchored = TRUE + layer = GHOST_LAYER /obj/effect/countdown/New(atom/A) . = ..() attach(A) +/obj/effect/countdown/examine(mob/user) + . = ..() + to_chat(user, "This countdown is displaying: [displayed_text]") + /obj/effect/countdown/proc/attach(atom/A) attached_to = A loc = get_turf(A) @@ -25,13 +29,13 @@ /obj/effect/countdown/proc/start() if(!started) fast_processing += src - started = 1 + started = TRUE /obj/effect/countdown/proc/stop() if(started) maptext = null fast_processing -= src - started = 0 + started = FALSE /obj/effect/countdown/proc/get_value() // Get the value from our atom @@ -56,6 +60,19 @@ fast_processing -= src return ..() +/obj/effect/countdown/ex_act(severity) //immune to explosions + return + +/obj/effect/countdown/syndicatebomb + name = "syndicate bomb countdown" + +/obj/effect/countdown/syndicatebomb/get_value() + var/obj/machinery/syndicatebomb/S = attached_to + if(!istype(S)) + return + else if(S.active) + return S.seconds_remaining() + /obj/effect/countdown/clonepod name = "cloning pod countdown" text_size = 1 diff --git a/icons/obj/assemblies.dmi b/icons/obj/assemblies.dmi index 2fd457f56382ff9460492de243114a14fb766a20..62a1c3143886f47a94005c4ad6679d6f969707e1 100644 GIT binary patch literal 29711 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 Date: Thu, 29 Jun 2017 20:02:27 -0400 Subject: [PATCH 2/4] chemical bombs --- code/game/machinery/syndicatebomb.dm | 122 ++++++++++++ .../items/weapons/grenades/chem_grenade.dm | 173 ++++++++++-------- code/modules/crafting/recipes.dm | 24 +++ code/modules/reagents/chem_splash.dm | 78 ++++++++ code/modules/reagents/chemistry/holder.dm | 17 +- .../reagent_containers/glass_containers.dm | 3 +- code/modules/reagents/reagent_dispenser.dm | 10 +- .../research/designs/weapon_designs.dm | 30 +++ icons/obj/grenade.dmi | Bin 4597 -> 4872 bytes paradise.dme | 1 + 10 files changed, 367 insertions(+), 91 deletions(-) create mode 100644 code/modules/reagents/chem_splash.dm diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index ba3ed604e00..a4503e427d8 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -406,6 +406,128 @@ range_light = 4 range_flame = 2 +/obj/item/weapon/bombcore/chemical + name = "chemical payload" + desc = "An explosive payload designed to spread chemicals, dangerous or otherwise, across a large area. It is able to hold up to four chemical containers, and must be loaded before use." + origin_tech = "combat=4;materials=3" + icon_state = "chemcore" + var/list/beakers = list() + var/max_beakers = 1 + var/spread_range = 5 + var/temp_boost = 50 + var/time_release = 0 + +/obj/item/weapon/bombcore/chemical/detonate() + + if(time_release > 0) + var/total_volume = 0 + for(var/obj/item/weapon/reagent_containers/RC in beakers) + total_volume += RC.reagents.total_volume + + if(total_volume < time_release) // If it's empty, the detonation is complete. + if(loc && istype(loc, /obj/machinery/syndicatebomb)) + qdel(loc) + qdel(src) + return + + var/fraction = time_release/total_volume + var/datum/reagents/reactants = new(time_release) + reactants.my_atom = src + for(var/obj/item/weapon/reagent_containers/RC in beakers) + RC.reagents.trans_to(reactants, RC.reagents.total_volume*fraction, 1, 1, 1) + chem_splash(get_turf(src), spread_range, list(reactants), temp_boost) + + // Detonate it again in one second, until it's out of juice. + addtimer(src, "detonate", 10) + + // If it's not a time release bomb, do normal explosion + + var/list/reactants = list() + + for(var/obj/item/weapon/reagent_containers/glass/G in beakers) + reactants += G.reagents + + for(var/obj/item/slime_extract/S in beakers) + if(S.Uses) + for(var/obj/item/weapon/reagent_containers/glass/G in beakers) + G.reagents.trans_to(S, G.reagents.total_volume) + + if(S && S.reagents && S.reagents.total_volume) + reactants += S.reagents + + if(!chem_splash(get_turf(src), spread_range, reactants, temp_boost)) + playsound(loc, 'sound/items/Screwdriver2.ogg', 50, 1) + return // The Explosion didn't do anything. No need to log, or disappear. + + if(adminlog) + message_admins(adminlog) + log_game(adminlog) + + playsound(loc, 'sound/effects/bamf.ogg', 75, 1, 5) + + if(loc && istype(loc, /obj/machinery/syndicatebomb)) + qdel(loc) + qdel(src) + +/obj/item/weapon/bombcore/chemical/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/weapon/crowbar) && beakers.len > 0) + playsound(loc, I.usesound, 50, 1) + for (var/obj/item/B in beakers) + B.loc = get_turf(src) + beakers -= B + return + else if(istype(I, /obj/item/weapon/reagent_containers/glass/beaker) || istype(I, /obj/item/weapon/reagent_containers/glass/bottle)) + if(beakers.len < max_beakers) + if(!user.drop_item()) + return + beakers += I + to_chat(user, "You load [src] with [I].") + I.loc = src + else + to_chat(user, "The [I] wont fit! The [src] can only hold up to [max_beakers] containers.") + return + ..() + +/obj/item/weapon/bombcore/chemical/CheckParts(list/parts_list) + ..() + // Using different grenade casings, causes the payload to have different properties. + var/obj/item/weapon/stock_parts/matter_bin/MB = locate(/obj/item/weapon/stock_parts/matter_bin) in src + if(MB) + max_beakers += MB.rating // max beakers = 2-5. + qdel(MB) + for(var/obj/item/weapon/grenade/chem_grenade/G in src) + + if(istype(G, /obj/item/weapon/grenade/chem_grenade/large)) + var/obj/item/weapon/grenade/chem_grenade/large/LG = G + max_beakers += 1 // Adding two large grenades only allows for a maximum of 7 beakers. + spread_range += 2 // Extra range, reduced density. + temp_boost += 50 // maximum of +150K blast using only large beakers. Not enough to self ignite. + for(var/obj/item/slime_extract/S in LG.beakers) // And slime cores. + if(beakers.len < max_beakers) + beakers += S + S.loc = src + else + S.loc = get_turf(src) + + if(istype(G, /obj/item/weapon/grenade/chem_grenade/cryo)) + spread_range -= 1 // Reduced range, but increased density. + temp_boost -= 100 // minimum of -150K blast. + + if(istype(G, /obj/item/weapon/grenade/chem_grenade/pyro)) + temp_boost += 150 // maximum of +350K blast, which is enough to self ignite. Which means a self igniting bomb can't take advantage of other grenade casing properties. Sorry? + + if(istype(G, /obj/item/weapon/grenade/chem_grenade/adv_release)) + time_release += 50 // A typical bomb, using basic beakers, will explode over 2-4 seconds. Using two will make the reaction last for less time, but it will be more dangerous overall. + + for(var/obj/item/weapon/reagent_containers/glass/B in G) + if(beakers.len < max_beakers) + beakers += B + B.loc = src + else + B.loc = get_turf(src) + + qdel(G) + ///Syndicate Detonator (aka the big red button)/// /obj/item/device/syndicatedetonator diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index f21914a7c32..9ba1950d2a0 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -19,6 +19,9 @@ var/obj/item/device/assembly_holder/nadeassembly = null var/label = null var/assemblyattacher + var/ignition_temp = 10 // The amount of heat added to the reagents when this grenade goes off. + var/threatscale = 1 // Used by advanced grenades to make them slightly more worthy. + var/no_splash = FALSE //If the grenade deletes even if it has no reagents to splash with. Used for slime core reactions. /obj/item/weapon/grenade/chem_grenade/New() create_reagents(1000) @@ -99,6 +102,7 @@ log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z])") bombers += "[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z])" to_chat(user, "You prime the [name]! [det_time / 10] second\s!") + playsound(user.loc, 'sound/weapons/armbomb.ogg', 60, 1) active = 1 update_icon() if(iscarbon(user)) @@ -264,13 +268,18 @@ if(stage != READY) return - var/has_reagents = 0 + var/list/datum/reagents/reactants = list() for(var/obj/item/weapon/reagent_containers/glass/G in beakers) - if(G.reagents.total_volume) - has_reagents = 1 + reactants += G.reagents - if(!has_reagents) - playsound(loc, usesound, 50, 1) + if(!chem_splash(get_turf(src), affected_area, reactants, ignition_temp, threatscale) && !no_splash) + playsound(loc, 'sound/items/Screwdriver2.ogg', 50, 1) + if(beakers.len) + for(var/obj/O in beakers) + O.forceMove(get_turf(src)) + beakers = list() + stage = EMPTY + update_icon() return if(nadeassembly) @@ -281,31 +290,9 @@ message_admins("grenade primed by an assembly, attached by [key_name_admin(M)](?) ([admin_jump_link(M)]) and last touched by [key_name_admin(last)](?) ([admin_jump_link(last)]) ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] (JMP).") log_game("grenade primed by an assembly, attached by [key_name(M)] and last touched by [key_name(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] ([T.x], [T.y], [T.z])") - playsound(loc, 'sound/effects/bamf.ogg', 50, 1) - update_mob() - invisibility = INVISIBILITY_MAXIMUM //kaboom - qdel(nadeassembly) // do this now to stop infrared beams - var/end_temp = 0 - for(var/obj/item/weapon/reagent_containers/glass/G in beakers) - G.reagents.trans_to(src, G.reagents.total_volume) - end_temp += G.reagents.chem_temp - reagents.chem_temp = end_temp - if(reagents.total_volume) //The possible reactions didnt use up all reagents. - var/datum/effect/system/steam_spread/steam = new /datum/effect/system/steam_spread() - steam.set_up(10, 0, get_turf(src)) - steam.attach(src) - steam.start() - - for(var/atom/A in view(affected_area, loc)) - if(A == src) - continue - reagents.reaction(A, 1, 10) - - - spawn(15) //Making sure all reagents can work - qdel(src) //correctly before deleting the grenade. + qdel(src) /obj/item/weapon/grenade/chem_grenade/proc/CreateDefaultTrigger(var/typekey) if(ispath(typekey,/obj/item/device/assembly)) @@ -327,64 +314,37 @@ //Large chem grenades accept slime cores and use the appropriately. /obj/item/weapon/grenade/chem_grenade/large name = "large grenade casing" - desc = "For oversized grenades; fits additional contents and affects a greater area." + desc = "A custom made large grenade. It affects a larger area." icon_state = "large_grenade" bomb_state = "largebomb" allowed_containers = list(/obj/item/weapon/reagent_containers/glass,/obj/item/weapon/reagent_containers/food/condiment, /obj/item/weapon/reagent_containers/food/drinks) origin_tech = "combat=3;engineering=3" - affected_area = 4 - + affected_area = 5 + ignition_temp = 25 // Large grenades are slightly more effective at setting off heat-sensitive mixtures than smaller grenades. + threatscale = 1.1 // 10% more effective. /obj/item/weapon/grenade/chem_grenade/large/prime() if(stage != READY) return - var/has_reagents = 0 - var/obj/item/slime_extract/valid_core = null + for(var/obj/item/slime_extract/S in beakers) + if(S.Uses) + for(var/obj/item/weapon/reagent_containers/glass/G in beakers) + G.reagents.trans_to(S, G.reagents.total_volume) - for(var/obj/item/weapon/reagent_containers/glass/G in beakers) - if(!istype(G)) continue - if(G.reagents.total_volume) has_reagents = 1 - for(var/obj/item/slime_extract/E in beakers) - if(!istype(E)) continue - if(E.Uses) valid_core = E - if(E.reagents.total_volume) has_reagents = 1 + //If there is still a core (sometimes it's used up) + //and there are reagents left, behave normally, + //otherwise drop it on the ground for timed reactions like gold. - if(!has_reagents) - playsound(loc, prime_sound, 50, 1) - return - - playsound(loc, 'sound/effects/bamf.ogg', 50, 1) - - update_mob() - - if(valid_core) - for(var/obj/item/weapon/reagent_containers/glass/G in beakers) - G.reagents.trans_to(valid_core, G.reagents.total_volume) - - //If there is still a core (sometimes it's used up) - //and there are reagents left, behave normally - - if(valid_core && valid_core.reagents && valid_core.reagents.total_volume) - valid_core.reagents.trans_to(src,valid_core.reagents.total_volume) - else - for(var/obj/item/weapon/reagent_containers/glass/G in beakers) - G.reagents.trans_to(src, G.reagents.total_volume) - - if(reagents.total_volume) //The possible reactions didnt use up all reagents. - var/datum/effect/system/steam_spread/steam = new /datum/effect/system/steam_spread() - steam.set_up(10, 0, get_turf(src)) - steam.attach(src) - steam.start() - - for(var/atom/A in view(affected_area, loc)) - if( A == src ) continue - reagents.reaction(A, 1, 10) - - invisibility = INVISIBILITY_MAXIMUM //Why am i doing this? - spawn(50) //To make sure all reagents can work - qdel(src) //correctly before deleting the grenade. + if(S) + if(S.reagents && S.reagents.total_volume) + for(var/obj/item/weapon/reagent_containers/glass/G in beakers) + S.reagents.trans_to(G, S.reagents.total_volume) + else + S.forceMove(get_turf(src)) + no_splash = TRUE + ..() //I tried to just put it in the allowed_containers list but @@ -399,6 +359,71 @@ else return ..() +/obj/item/weapon/grenade/chem_grenade/cryo // Intended for rare cryogenic mixes. Cools the area moderately upon detonation. + name = "cryo grenade" + desc = "A custom made cryogenic grenade. It rapidly cools its contents upon detonation." + icon_state = "cryog" + affected_area = 2 + ignition_temp = -100 + +/obj/item/weapon/grenade/chem_grenade/pyro // Intended for pyrotechnical mixes. Produces a small fire upon detonation, igniting potentially flammable mixtures. + name = "pyro grenade" + desc = "A custom made pyrotechnical grenade. It heats up and ignites its contents upon detonation." + icon_state = "pyrog" + origin_tech = "combat=4;engineering=4" + affected_area = 3 + ignition_temp = 500 // This is enough to expose a hotspot. + +/obj/item/weapon/grenade/chem_grenade/adv_release // Intended for weaker, but longer lasting effects. Could have some interesting uses. + name = "advanced release grenade" + desc = "A custom made advanced release grenade. It is able to be detonated more than once. Can be configured using a multitool." + icon_state = "timeg" + origin_tech = "combat=3;engineering=4" + var/unit_spread = 10 // Amount of units per repeat. Can be altered with a multitool. + +/obj/item/weapon/grenade/chem_grenade/adv_release/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/device/multitool)) + switch(unit_spread) + if(0 to 24) + unit_spread += 5 + if(25 to 99) + unit_spread += 25 + else + unit_spread = 5 + to_chat(user, " You set the time release to [unit_spread] units per detonation.") + return + ..() + +/obj/item/weapon/grenade/chem_grenade/adv_release/prime() + if(stage != READY) + return + + var/total_volume = 0 + for(var/obj/item/weapon/reagent_containers/RC in beakers) + total_volume += RC.reagents.total_volume + if(!total_volume) + qdel(src) + qdel(nadeassembly) + return + var/fraction = unit_spread/total_volume + var/datum/reagents/reactants = new(unit_spread) + reactants.my_atom = src + for(var/obj/item/weapon/reagent_containers/RC in beakers) + RC.reagents.trans_to(reactants, RC.reagents.total_volume*fraction, threatscale, 1, 1) + chem_splash(get_turf(src), affected_area, list(reactants), ignition_temp, threatscale) + + if(nadeassembly) + var/mob/M = get_mob_by_ckey(assemblyattacher) + var/mob/last = get_mob_by_ckey(nadeassembly.fingerprintslast) + var/turf/T = get_turf(src) + var/area/A = get_area(T) + message_admins("grenade primed by an assembly, attached by [key_name_admin(M)](?) (FLW) and last touched by [key_name_admin(last)](?) (FLW) ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] (JMP).") + log_game("grenade primed by an assembly, attached by [key_name(M)] and last touched by [key_name(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] ([T.x], [T.y], [T.z])") + else + addtimer(src, "prime", det_time) + var/turf/DT = get_turf(src) + var/area/DA = get_area(DT) + log_game("A grenade detonated at [DA.name] ([DT.x], [DT.y], [DT.z])") /obj/item/weapon/grenade/chem_grenade/metalfoam payload_name = "metal foam" diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index 6f266c121e1..3fbcf39ed08 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -324,6 +324,30 @@ /obj/item/stack/rods = 1) category = CAT_MISC +/datum/crafting_recipe/chemical_payload + name = "Chemical Payload (C4)" + result = /obj/item/weapon/bombcore/chemical + reqs = list( + /obj/item/weapon/stock_parts/matter_bin = 1, + /obj/item/weapon/grenade/plastic/c4 = 1, + /obj/item/weapon/grenade/chem_grenade = 2 + ) + parts = list(/obj/item/weapon/stock_parts/matter_bin = 1, /obj/item/weapon/grenade/chem_grenade = 2) + time = 30 + category = CAT_WEAPON + +/datum/crafting_recipe/chemical_payload2 + name = "Chemical Payload (gibtonite)" + result = /obj/item/weapon/bombcore/chemical + reqs = list( + /obj/item/weapon/stock_parts/matter_bin = 1, + /obj/item/weapon/twohanded/required/gibtonite = 1, + /obj/item/weapon/grenade/chem_grenade = 2 + ) + parts = list(/obj/item/weapon/stock_parts/matter_bin = 1, /obj/item/weapon/grenade/chem_grenade = 2) + time = 50 + category = CAT_WEAPON + /datum/crafting_recipe/bonfire name = "Bonfire" time = 60 diff --git a/code/modules/reagents/chem_splash.dm b/code/modules/reagents/chem_splash.dm new file mode 100644 index 00000000000..7c16bf1ab9a --- /dev/null +++ b/code/modules/reagents/chem_splash.dm @@ -0,0 +1,78 @@ +// Replaces chemgrenade stuff, allowing reagent explosions to be called from anywhere. +// It should be called using a location, the range, and a list of reagents involved. + +// Threatscale is a multiplier for the 'threat' of the grenade. If you're increasing the affected range drastically, you might want to improve this. +// Extra heat affects the temperature of the mixture, and may cause it to react in different ways. + + +/proc/chem_splash(turf/epicenter, affected_range = 3, list/datum/reagents/reactants = list(), extra_heat = 0, threatscale = 1, adminlog = 1) + if(!isturf(epicenter) || !reactants.len || threatscale <= 0) + return + var/has_reagents + var/total_reagents + for(var/datum/reagents/R in reactants) + if(R.total_volume) + has_reagents = 1 + total_reagents += R.total_volume + + if(!has_reagents) + return + + var/datum/reagents/splash_holder = new/datum/reagents(total_reagents*threatscale) + splash_holder.my_atom = epicenter // For some reason this is setting my_atom to null, and causing runtime errors. + var/total_temp = 0 + + for(var/datum/reagents/R in reactants) + R.trans_to(splash_holder, R.total_volume, threatscale, 1, 1) + total_temp += R.chem_temp + splash_holder.chem_temp = (total_temp/reactants.len) + extra_heat // Average temperature of reagents + extra heat. + splash_holder.handle_reactions() // React them now. + + if(splash_holder.total_volume && affected_range >= 0) //The possible reactions didnt use up all reagents, so we spread it around. + var/datum/effect/system/steam_spread/steam = new /datum/effect/system/steam_spread() + steam.set_up(10, 0, epicenter) + steam.attach(epicenter) + steam.start() + + var/list/viewable = view(affected_range, epicenter) + + var/list/accessible = list(epicenter) + for(var/i=1; i<=affected_range; i++) + var/list/turflist = list() + for(var/turf/T in (orange(i, epicenter) - orange(i-1, epicenter))) + turflist |= T + for(var/turf/T in turflist) + if( !(get_dir(T,epicenter) in cardinal) && (abs(T.x - epicenter.x) == abs(T.y - epicenter.y) )) + turflist.Remove(T) + turflist.Add(T) // we move the purely diagonal turfs to the end of the list. + for(var/turf/T in turflist) + if(accessible[T]) + continue + for(var/thing in T.GetAtmosAdjacentTurfs(alldir = TRUE)) + var/turf/NT = thing + if(!(NT in accessible)) + continue + if(!(get_dir(T,NT) in cardinal)) + continue + accessible[T] = 1 + break + var/list/reactable = accessible + for(var/turf/T in accessible) + for(var/atom/A in T.GetAllContents()) + if(!(A in viewable)) + continue + reactable |= A + if(extra_heat >= 300) + T.hotspot_expose(extra_heat*2, 5) + if(!reactable.len) //Nothing to react with. Probably means we're in nullspace. + return + for(var/thing in reactable) + var/atom/A = thing + var/distance = max(1,get_dist(A, epicenter)) + var/fraction = 0.5/(2 ** distance) //50/25/12/6... for a 200u splash, 25/12/6/3... for a 100u, 12/6/3/1 for a 50u + splash_holder.reaction(A, TOUCH, fraction) + + qdel(splash_holder) + return 1 + + diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index c65c628353b..662843e337a 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -108,7 +108,7 @@ var/const/INGEST = 2 return the_id -/datum/reagents/proc/trans_to(target, amount=1, multiplier=1, preserve_data=1)//if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred. +/datum/reagents/proc/trans_to(target, amount=1, multiplier=1, preserve_data=1, no_react = 0)//if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred. if(!target) return if(total_volume <= 0) @@ -143,13 +143,14 @@ var/const/INGEST = 2 if(preserve_data) trans_data = copy_data(current_reagent) - R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data, chem_temp) + R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data, chem_temp, no_react = 1) remove_reagent(current_reagent.id, current_reagent_transfer) update_total() R.update_total() - R.handle_reactions() - handle_reactions() + if(!no_react) + R.handle_reactions() + handle_reactions() return amount /datum/reagents/proc/copy_to(obj/target, amount=1, multiplier=1, preserve_data=1, safety = 0) @@ -537,7 +538,7 @@ var/const/INGEST = 2 var/amt = list_reagents[r_id] add_reagent(r_id, amt, data) -/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300) +/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300, no_react = 0) if(!isnum(amount)) return 1 update_total() @@ -554,7 +555,8 @@ var/const/INGEST = 2 update_total() my_atom.on_reagent_change() R.on_merge(data) - handle_reactions() + if(!no_react) + handle_reactions() return 0 var/datum/reagent/D = chemical_reagents_list[reagent] @@ -570,7 +572,8 @@ var/const/INGEST = 2 update_total() my_atom.on_reagent_change() - handle_reactions() + if(!no_react) + handle_reactions() return 0 else warning("[my_atom] attempted to add a reagent called '[reagent]' which doesn't exist. ([usr])") diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm index f60efa3b784..63db086cef8 100644 --- a/code/modules/reagents/reagent_containers/glass_containers.dm +++ b/code/modules/reagents/reagent_containers/glass_containers.dm @@ -40,7 +40,8 @@ /obj/machinery/biogenerator, /obj/machinery/hydroponics, /obj/machinery/constructable_frame, - /obj/machinery/icemachine) + /obj/machinery/icemachine, + /obj/item/weapon/bombcore/chemical) /obj/item/weapon/reagent_containers/glass/New() ..() diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index d406dcaf0ef..eb43698d451 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -29,6 +29,7 @@ /obj/structure/reagent_dispensers/proc/boom() visible_message("[src] ruptures!") + chem_splash(loc, 5, list(reagents)) qdel(src) /obj/structure/reagent_dispensers/ex_act(severity) @@ -53,15 +54,6 @@ desc = "A water tank." icon_state = "water" -/obj/structure/reagent_dispensers/watertank/boom() - playsound(loc, 'sound/effects/spray2.ogg', 50, 1, -6) - new /obj/effect/effect/water(loc) - for(var/turf/simulated/T in view(5, loc)) - T.MakeSlippery() - for(var/mob/living/L in T) - L.adjust_fire_stacks(-20) - ..() - /obj/structure/reagent_dispensers/watertank/high name = "high-capacity water tank" desc = "A highly-pressurized water tank made to hold gargantuan amounts of water.." diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index 9391af77424..09b17748dfd 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -80,6 +80,36 @@ build_path = /obj/item/weapon/grenade/chem_grenade/large category = list("Weapons") +/datum/design/pyro_grenade + name = "Pyro Grenade" + desc = "An advanced grenade that is able to self ignite its mixture." + id = "pyro_Grenade" + req_tech = list("combat" = 4, "engineering" = 4) + build_type = PROTOLATHE + materials = list(MAT_METAL = 2000, MAT_PLASMA = 500) + build_path = /obj/item/weapon/grenade/chem_grenade/pyro + category = list("Weapons") + +/datum/design/cryo_grenade + name = "Cryo Grenade" + desc = "An advanced grenade that rapidly cools its contents upon detonation." + id = "cryo_Grenade" + req_tech = list("combat" = 3, "materials" = 3) + build_type = PROTOLATHE + materials = list(MAT_METAL = 2000, MAT_SILVER = 500) + build_path = /obj/item/weapon/grenade/chem_grenade/cryo + category = list("Weapons") + +/datum/design/adv_grenade + name = "Advanced Release Grenade" + desc = "An advanced grenade that can be detonated several times, best used with a repeating igniter." + id = "adv_Grenade" + req_tech = list("combat" = 3, "engineering" = 4) + build_type = PROTOLATHE + materials = list(MAT_METAL = 3000, MAT_GLASS = 500) + build_path = /obj/item/weapon/grenade/chem_grenade/adv_release + category = list("Weapons") + /datum/design/tele_shield name = "Telescopic Riot Shield" desc = "An advanced riot shield made of lightweight materials that collapses for easy storage." diff --git a/icons/obj/grenade.dmi b/icons/obj/grenade.dmi index ad8268ad59dac163681ac1710bcef5c578d09864..f33135baec632b21c8229bcddbc360d2f3bda207 100644 GIT binary patch literal 4872 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 diff --git a/paradise.dme b/paradise.dme index 0775e9b2577..0f7332878f4 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1948,6 +1948,7 @@ #include "code\modules\projectiles\projectile\magic.dm" #include "code\modules\projectiles\projectile\reusable.dm" #include "code\modules\projectiles\projectile\special.dm" +#include "code\modules\reagents\chem_splash.dm" #include "code\modules\reagents\reagent_containers.dm" #include "code\modules\reagents\reagent_dispenser.dm" #include "code\modules\reagents\chemistry\colors.dm" From d3b04e26384e5ae56879f96e3a316fd23f069571 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Thu, 29 Jun 2017 20:10:13 -0400 Subject: [PATCH 3/4] oops --- code/game/machinery/syndicatebomb.dm | 4 ++-- code/game/objects/items/stacks/sheets/sheet_types.dm | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index a4503e427d8..c652615bc9a 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -305,7 +305,7 @@ message_admins(adminlog) log_game(adminlog) explosion(get_turf(src), range_heavy, range_medium, range_light, flame_range = range_flame) - if(loc && istype(loc,/obj/machinery/syndicatebomb/)) + if(loc && istype(loc, /obj/machinery/syndicatebomb)) qdel(loc) qdel(src) @@ -532,7 +532,7 @@ /obj/item/device/syndicatedetonator name = "big red button" - desc = "Your standard issue bomb synchronizing button. Five second safety delay to prevent 'accidents'" + desc = "Your standard issue bomb synchronizing button. Five second safety delay to prevent 'accidents'." icon = 'icons/obj/assemblies.dmi' icon_state = "bigred" item_state = "electronic" diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 67755655fe3..029cb8cd4a5 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -123,6 +123,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list( */ var/global/list/datum/stack_recipe/plasteel_recipes = list( new /datum/stack_recipe("AI core", /obj/structure/AIcore, 4, time = 50, one_per_turf = 1), + new /datum/stack_recipe("bomb assembly", /obj/machinery/syndicatebomb/empty, 10, time = 50), new /datum/stack_recipe("Surgery Table", /obj/machinery/optable, 5, time = 50, one_per_turf = 1, on_floor = 1), new /datum/stack_recipe("Metal crate", /obj/structure/closet/crate, 10, time = 50, one_per_turf = 1), new /datum/stack_recipe("Mass Driver frame", /obj/machinery/mass_driver_frame, 3, time = 50, one_per_turf = 1) From 5bc6e36756618fbdb7916baea519847e34fd80c2 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Thu, 29 Jun 2017 20:14:29 -0400 Subject: [PATCH 4/4] helpers --- code/game/machinery/syndicatebomb.dm | 2 +- code/game/objects/items/weapons/grenades/chem_grenade.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index c652615bc9a..153fc50bf91 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -470,7 +470,7 @@ qdel(src) /obj/item/weapon/bombcore/chemical/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/weapon/crowbar) && beakers.len > 0) + if(iscrowbar(I) && beakers.len > 0) playsound(loc, I.usesound, 50, 1) for (var/obj/item/B in beakers) B.loc = get_turf(src) diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 9ba1950d2a0..707eac2fbce 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -382,7 +382,7 @@ var/unit_spread = 10 // Amount of units per repeat. Can be altered with a multitool. /obj/item/weapon/grenade/chem_grenade/adv_release/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/device/multitool)) + if(ismultitool(I)) switch(unit_spread) if(0 to 24) unit_spread += 5