diff --git a/code/WorkInProgress/Chemistry-Tools.dm b/code/WorkInProgress/Chemistry-Tools.dm index 0cbcc2701f6..02f70efd72e 100644 --- a/code/WorkInProgress/Chemistry-Tools.dm +++ b/code/WorkInProgress/Chemistry-Tools.dm @@ -4,8 +4,8 @@ ///////////////////////////////Grenades /obj/item/weapon/chem_grenade - name = "metal casing" - icon_state = "chemg1" + name = "grenade" + icon_state = "chemg" icon = 'chemical.dmi' item_state = "flashbang" w_class = 2.0 @@ -13,10 +13,12 @@ var/stage = 0 var/state = 0 var/list/beakers = new/list() + var/list/allowed_containers = list("/obj/item/weapon/reagent_containers/glass/beaker", "/obj/item/weapon/reagent_containers/glass/dispenser") + var/list/disallowed_container = "/obj/item/weapon/reagent_containers/glass/large" + var/affected_area = 3 throw_speed = 4 throw_range = 20 flags = FPRINT | TABLEPASS | CONDUCT | ONBELT | USEDELAY - New() var/datum/reagents/R = new/datum/reagents(1000) reagents = R @@ -27,54 +29,65 @@ user << "\blue You add [W] to the metal casing." playsound(src.loc, 'Screwdriver2.ogg', 25, -3) del(W) //Okay so we're not really adding anything here. cheating. - icon_state = "chemg2" - name = "unsecured grenade" + icon_state = initial(icon_state)+"_ass" stage = 1 else if(istype(W,/obj/item/weapon/screwdriver) && stage == 1) if(beakers.len) user << "\blue You lock the assembly." playsound(src.loc, 'Screwdriver.ogg', 25, -3) - name = "grenade" - icon_state = "chemg3" + 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 ((istype(W,/obj/item/weapon/reagent_containers/glass/beaker) || istype(W, /obj/item/weapon/reagent_containers/glass/dispenser)) && stage == 1) - if(beakers.len == 2) - user << "\red The grenade can not hold more containers." - return - else - if(W.reagents.total_volume) - user << "\blue You add \the [W] to the assembly." - user.drop_item() - W.loc = src - beakers += W + else + var/found = 0 + for(var/container_type in allowed_containers) + if(istype(W, text2path(container_type))) + found = 1 + break + if(disallowed_container) + if(istype(W, disallowed_container)) + return + if(found) + if(beakers.len == 2) + user << "\red The grenade can not hold more containers." + return else - user << "\red \the [W] is empty." + if(W.reagents.total_volume) + user << "\blue You add \the [W] to the assembly." + user.drop_item() + W.loc = src + beakers += W + else + user << "\red \the [W] is empty." afterattack(atom/target as mob|obj|turf|area, mob/user as mob) if (istype(target, /obj/item/weapon/storage)) return ..() - if (!src.state && stage == 2) + if (!src.state && stage == 2 && !crit_fail) user << "\red You prime the grenade! 3 seconds!" message_admins("[key_name_admin(user)] used a chemistry grenade ([src.name]).") src.state = 1 - src.icon_state = "chemg4" + src.icon_state = initial(icon_state)+"_armed" playsound(src.loc, 'armbomb.ogg', 75, 1, -3) spawn(30) explode() user.drop_item() var/t = (isturf(target) ? target : target.loc) walk_towards(src, t, 3) + else if(crit_fail) + user << "\red This grenade is a dud and unusable!" attack_self(mob/user as mob) - if (!src.state && stage == 2) + if (!src.state && stage == 2 && !crit_fail) user << "\red You prime the grenade! 3 seconds!" message_admins("[key_name_admin(user)] used a chemistry grenade ([src.name]).") src.state = 1 - src.icon_state = "chemg4" + src.icon_state = initial(icon_state)+"_armed" playsound(src.loc, 'armbomb.ogg', 75, 1, -3) spawn(30) explode() + else if(crit_fail) + user << "\red This grenade is a dud and unusable!" attack_hand() walk(src,0) @@ -84,46 +97,59 @@ proc explode() - var/has_reagents = 0 - for(var/obj/item/weapon/reagent_containers/glass/G in beakers) - if(G.reagents.total_volume) has_reagents = 1 + if(reliability) + var/has_reagents = 0 + for(var/obj/item/weapon/reagent_containers/glass/G in beakers) + if(G.reagents.total_volume) has_reagents = 1 - if(!has_reagents) - playsound(src.loc, 'Screwdriver2.ogg', 50, 1) - state = 0 - return + if(!has_reagents) + playsound(src.loc, 'Screwdriver2.ogg', 50, 1) + state = 0 + return - playsound(src.loc, 'bamf.ogg', 50, 1) + playsound(src.loc, 'bamf.ogg', 50, 1) - for(var/obj/item/weapon/reagent_containers/glass/G in beakers) - G.reagents.trans_to(src, G.reagents.total_volume) + for(var/obj/item/weapon/reagent_containers/glass/G in beakers) + G.reagents.trans_to(src, G.reagents.total_volume) - if(src.reagents.total_volume) //The possible reactions didnt use up all reagents. - var/datum/effects/system/steam_spread/steam = new /datum/effects/system/steam_spread() - steam.set_up(10, 0, get_turf(src)) - steam.attach(src) - steam.start() + if(src.reagents.total_volume) //The possible reactions didnt use up all reagents. + var/datum/effects/system/steam_spread/steam = new /datum/effects/system/steam_spread() + steam.set_up(10, 0, get_turf(src)) + steam.attach(src) + steam.start() - for(var/atom/A in view(3, src.loc)) - if( A == src ) continue - src.reagents.reaction(A, 1, 10) + for(var/atom/A in view(affected_area, src.loc)) + if( A == src ) continue + src.reagents.reaction(A, 1, 10) - invisibility = 100 //Why am i doing this? - spawn(50) //To make sure all reagents can work - del(src) //correctly before deleting the grenade. + invisibility = 100 //Why am i doing this? + spawn(50) //To make sure all reagents can work + del(src) //correctly before deleting the grenade. + else + icon_state = initial(icon_state) + "_locked" + crit_fail = 1 + for(var/obj/item/weapon/reagent_containers/glass/G in beakers) + G.loc = get_turf(src.loc) +/obj/item/weapon/chem_grenade/large + name = "Large Chem Grenade" + desc = "An oversized grenade that affects a larger area." + icon_state = "large_grenade" + allowed_containers = list("/obj/item/weapon/reagent_containers/glass") + disallowed_container = "/obj/item/weapon/reagent_containers/glass/blender_jug" + origin_tech = "combat=3;materials=3" + affected_area = 4 /obj/item/weapon/chem_grenade/metalfoam name = "Metal-Foam Grenade" desc = "Used for emergency sealing of air breaches." - icon_state = "chemg3" stage = 2 New() ..() - var/obj/item/weapon/reagent_containers/glass/B1 = new(src) - var/obj/item/weapon/reagent_containers/glass/B2 = new(src) + 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("aluminium", 30) B2.reagents.add_reagent("foaming_agent", 10) @@ -131,17 +157,17 @@ beakers += B1 beakers += B2 + icon_state = "chemg_locked" /obj/item/weapon/chem_grenade/incendiary name = "Incendiary Grenade" desc = "Used for clearing rooms of living things." - icon_state = "chemg3" stage = 2 New() ..() - var/obj/item/weapon/reagent_containers/glass/B1 = new(src) - var/obj/item/weapon/reagent_containers/glass/B2 = new(src) + 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("aluminium", 25) B2.reagents.add_reagent("plasma", 25) @@ -149,17 +175,17 @@ beakers += B1 beakers += B2 + icon_state = "chemg_locked" /obj/item/weapon/chem_grenade/cleaner name = "Cleaner Grenade" desc = "BLAM!-brand foaming space cleaner. In a special applicator for rapid cleaning of wide areas." - icon_state = "chemg3" stage = 2 New() ..() - var/obj/item/weapon/reagent_containers/glass/B1 = new(src) - var/obj/item/weapon/reagent_containers/glass/B2 = new(src) + 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("fluorosurfactant", 30) B2.reagents.add_reagent("water", 10) @@ -167,6 +193,7 @@ beakers += B1 beakers += B2 + icon_state = "chemg_locked" /* /obj/item/weapon/chem_grenade/poo name = "poo grenade" diff --git a/code/defines/obj/machinery.dm b/code/defines/obj/machinery.dm index f7c996dc5d3..84079d5e123 100644 --- a/code/defines/obj/machinery.dm +++ b/code/defines/obj/machinery.dm @@ -64,11 +64,11 @@ anchored = 1.0 var/invuln = null var/bugged = 0 + var/hardened = 0 use_power = 2 idle_power_usage = 5 active_power_usage = 10 - /obj/machinery/dispenser desc = "A simple yet bulky one-way storage device for gas tanks. Holds 10 plasma and 10 oxygen tanks." name = "Tank Storage Unit" diff --git a/code/game/machinery/camera.dm b/code/game/machinery/camera.dm index 8a5d38cb49d..9fdd5c16c8f 100644 --- a/code/game/machinery/camera.dm +++ b/code/game/machinery/camera.dm @@ -232,24 +232,25 @@ return /obj/machinery/camera/emp_act(severity) - icon_state = "cameraemp" - network = null //Not the best way but it will do. I think. - spawn(900) - network = initial(network) - icon_state = initial(icon_state) - for(var/mob/living/silicon/ai/O in world) - if (O.current == src) - O.cancel_camera() - O << "Your connection to the camera has been lost." - for(var/mob/O in world) - if (istype(O.machine, /obj/machinery/computer/security)) - var/obj/machinery/computer/security/S = O.machine - if (S.current == src) - O.machine = null - S.current = null - O.reset_view(null) - O << "The screen bursts into static." - ..() + if(prob(100/(hardened + severity))) + icon_state = "cameraemp" + network = null //Not the best way but it will do. I think. + spawn(900) + network = initial(network) + icon_state = initial(icon_state) + for(var/mob/living/silicon/ai/O in world) + if (O.current == src) + O.cancel_camera() + O << "Your connection to the camera has been lost." + for(var/mob/O in world) + if (istype(O.machine, /obj/machinery/computer/security)) + var/obj/machinery/computer/security/S = O.machine + if (S.current == src) + O.machine = null + S.current = null + O.reset_view(null) + O << "The screen bursts into static." + ..() /obj/machinery/camera/ex_act(severity) if(src.invuln) diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 7b1915c290d..a8fec98642d 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -25,6 +25,7 @@ list/req_components = null powernet = null list/records = null + frame_desc = null /obj/item/weapon/circuitboard/security name = "Circuit board (Security)" diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 5c8b2593dfc..76fdc97239e 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -11,10 +11,6 @@ list/req_components = null state = 1 -/* -To Do: Add deconstruct code to constructable machines. A marvelous idea, I know. -*/ - /obj/machinery/constructable_frame/machine_frame attackby(obj/item/P as obj, mob/user as mob) if(P.crit_fail) @@ -52,6 +48,7 @@ To Do: Add deconstruct code to constructable machines. A marvelous idea, I know. req_components = circuit.req_components.Copy() for(var/A in circuit.req_components) req_components[A] = circuit.req_components[A] + if(circuit.frame_desc) desc = circuit.frame_desc else user << "\red This frame does not accept circuit boards of this type!" if(istype(P, /obj/item/weapon/wirecutters)) @@ -74,6 +71,7 @@ To Do: Add deconstruct code to constructable machines. A marvelous idea, I know. user << "\blue You remove the circuit board and other components." for(var/obj/item/weapon/W in components) W.loc = src.loc + desc = initial(desc) req_components = null components = null icon_state = "box_1" @@ -128,6 +126,7 @@ to destroy them and players will be able to make replacements. build_path = "/obj/machinery/r_n_d/destructive_analyzer" board_type = "machine" origin_tech = "magnets=2;materials=2" + frame_desc = "Requires 2 Scanning Modules, 1 Manipulator, and 1 Micro-Laser." req_components = list( "/obj/item/weapon/stock_parts/scanning_module" = 1, "/obj/item/weapon/stock_parts/manipulator" = 1, @@ -138,6 +137,7 @@ to destroy them and players will be able to make replacements. build_path = "/obj/machinery/autolathe" board_type = "machine" origin_tech = "materials=3" + frame_desc = "Requires 3 Matter Bins, 1 Manipulator, and 1 Console Screen." req_components = list( "/obj/item/weapon/stock_parts/matter_bin" = 3, "/obj/item/weapon/stock_parts/manipulator" = 1, @@ -148,6 +148,7 @@ to destroy them and players will be able to make replacements. build_path = "/obj/machinery/r_n_d/protolathe" board_type = "machine" origin_tech = "materials=2" + frame_desc = "Requires 2 Matter Bins, 2 Manipulators, and 2 Beakers." req_components = list( "/obj/item/weapon/stock_parts/matter_bin" = 2, "/obj/item/weapon/stock_parts/manipulator" = 2, @@ -159,6 +160,7 @@ to destroy them and players will be able to make replacements. build_path = "/obj/machinery/r_n_d/circuit_imprinter" board_type = "machine" origin_tech = "materials=2;programming=2" + frame_desc = "Requires 1 Matter Bin, 1 Manipulator, and 2 Beakers." req_components = list( "/obj/item/weapon/stock_parts/matter_bin" = 1, "/obj/item/weapon/stock_parts/manipulator" = 1, @@ -169,6 +171,7 @@ to destroy them and players will be able to make replacements. build_path = "/obj/machinery/power/port_gen/pacman" board_type = "machine" origin_tech = "powerstorage=3;plasmatech=3" + frame_desc = "Requires 1 Matter Bin, 1 Micro-Laser, 2 Pieces of Cable, and 1 Capacitor." req_components = list( "/obj/item/weapon/stock_parts/matter_bin" = 1, "/obj/item/weapon/stock_parts/micro_laser" = 1, @@ -188,6 +191,7 @@ obj/item/weapon/circuitboard/rdserver build_path = "/obj/machinery/r_n_d/server" board_type = "machine" origin_tech = "programming=3" + frame_desc = "Requires 2 pieces of cable, and 1 Scanning Module." req_components = list( "/obj/item/weapon/cable_coil" = 2, "/obj/item/weapon/stock_parts/scanning_module" = 1) \ No newline at end of file diff --git a/code/game/research/designs.dm b/code/game/research/designs.dm index 879e273d085..67cb6dace0c 100644 --- a/code/game/research/designs.dm +++ b/code/game/research/designs.dm @@ -775,7 +775,15 @@ datum reliability_base = 76 build_path = "/obj/item/weapon/gun/energy/general/nuclear" - + large_grenade + name = "Large Grenade" + desc = "A grenade that affects a larger area and use larger containers." + id = "large_Grenade" + req_tech = list("combat" = 3, "materials" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 3000) + reliability_base = 79 + build_path = "/obj/item/weapon/chem_grenade/large" ///////////////////////////////////////// //////////////////Test/////////////////// diff --git a/code/game/research/rd-readme.dm b/code/game/research/rd-readme.dm index 1038939472c..f8ee6744d90 100644 --- a/code/game/research/rd-readme.dm +++ b/code/game/research/rd-readme.dm @@ -189,7 +189,7 @@ When thinking about new stuff, check here to see if there are any slots unfilled //SYNDICATE 1 | Sleepypen 2 | TYRANT Module, Emag -3 | Cloaking Device, Powre Sink +3 | Cloaking Device, Power Sink 4 | 5 | 6 | diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi index 371f4992f38..2a0a8578077 100644 Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ diff --git a/icons/obj/grenade.dmi b/icons/obj/grenade.dmi index 948e73688d1..4a1369f69fa 100644 Binary files a/icons/obj/grenade.dmi and b/icons/obj/grenade.dmi differ