From 408acdd66d77beb4f43faa851fb28a731c0243a0 Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Tue, 29 Aug 2017 22:05:16 -0700 Subject: [PATCH] sync --- code/game/machinery/vending.dm | 4 +- .../objects/items/grenades/chem_grenade.dm | 1116 +++++++++-------- code/game/objects/items/storage/boxes.dm | 38 +- code/game/turfs/simulated/floor.dm | 2 +- .../chemistry/reagents/other_reagents.dm | 27 + .../reagents/chemistry/recipes/others.dm | 21 + icons/turf/floors.dmi | Bin 449436 -> 452516 bytes 7 files changed, 642 insertions(+), 566 deletions(-) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 6b3be49653..427bc95253 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -1067,9 +1067,9 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C icon_state = "engivend" icon_deny = "engivend-deny" req_access_txt = "11" //Engineering Equipment access - products = list(/obj/item/clothing/glasses/meson/engine = 2, /obj/item/device/multitool = 4, /obj/item/electronics/airlock = 10, /obj/item/electronics/apc = 10, /obj/item/electronics/airalarm = 10, /obj/item/stock_parts/cell/high = 10, /obj/item/construction/rcd/loaded = 3, /obj/item/device/geiger_counter = 5) + products = list(/obj/item/clothing/glasses/meson/engine = 2, /obj/item/device/multitool = 4, /obj/item/electronics/airlock = 10, /obj/item/electronics/apc = 10, /obj/item/electronics/airalarm = 10, /obj/item/stock_parts/cell/high = 10, /obj/item/construction/rcd/loaded = 3, /obj/item/device/geiger_counter = 5, /obj/item/grenade/chem_grenade/smart_metal_foam = 10) contraband = list(/obj/item/stock_parts/cell/potato = 3) - premium = list(/obj/item/storage/belt/utility = 3) + premium = list(/obj/item/storage/belt/utility = 3, /obj/item/storage/box/smart_metal_foam = 1) armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50) resistance_flags = FIRE_PROOF diff --git a/code/game/objects/items/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm index 07da20f615..b352596e2f 100644 --- a/code/game/objects/items/grenades/chem_grenade.dm +++ b/code/game/objects/items/grenades/chem_grenade.dm @@ -1,549 +1,567 @@ -#define EMPTY 1 -#define WIRED 2 -#define READY 3 - -/obj/item/grenade/chem_grenade - name = "chemical grenade" - desc = "A custom made grenade." - icon_state = "chemg" - item_state = "flashbang" - w_class = WEIGHT_CLASS_SMALL - force = 2 - var/stage = EMPTY - var/list/beakers = list() - var/list/allowed_containers = list(/obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/glass/bottle) - var/affected_area = 3 - var/obj/item/device/assembly_holder/nadeassembly = 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/grenade/chem_grenade/Initialize() - . = ..() - create_reagents(1000) - stage_change() // If no argument is set, it will change the stage to the current stage, useful for stock grenades that start READY. - -/obj/item/grenade/chem_grenade/examine(mob/user) - display_timer = (stage == READY && !nadeassembly) //show/hide the timer based on assembly state - ..() - - -/obj/item/grenade/chem_grenade/attack_self(mob/user) - if(stage == READY && !active) - if(nadeassembly) - nadeassembly.attack_self(user) - else if(clown_check(user)) - var/turf/bombturf = get_turf(src) - var/area/A = get_area(bombturf) - message_admins("[ADMIN_LOOKUPFLW(usr)] has primed a [name] for detonation at [A.name][ADMIN_JMP(bombturf)].") - log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] [COORD(bombturf)].") - to_chat(user, "You prime the [name]! [det_time / 10] second\s!") - playsound(user.loc, 'sound/weapons/armbomb.ogg', 60, 1) - active = 1 - icon_state = initial(icon_state) + "_active" - if(iscarbon(user)) - var/mob/living/carbon/C = user - C.throw_mode_on() - - addtimer(CALLBACK(src, .proc/prime), det_time) - - -/obj/item/grenade/chem_grenade/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/screwdriver)) - if(stage == WIRED) - if(beakers.len) - stage_change(READY) - to_chat(user, "You lock the [initial(name)] assembly.") - playsound(loc, I.usesound, 25, -3) - else - to_chat(user, "You need to add at least one beaker before locking the [initial(name)] assembly!") - else if(stage == READY && !nadeassembly) - det_time = det_time == 50 ? 30 : 50 //toggle between 30 and 50 - to_chat(user, "You modify the time delay. It's set for [det_time / 10] second\s.") - else if(stage == EMPTY) - to_chat(user, "You need to add an activation mechanism!") - - else if(stage == WIRED && is_type_in_list(I, allowed_containers)) - . = 1 //no afterattack - if(beakers.len == 2) - to_chat(user, "[src] can not hold more containers!") - return - else - if(I.reagents.total_volume) - if(!user.transferItemToLoc(I, src)) - return - to_chat(user, "You add [I] to the [initial(name)] assembly.") - beakers += I - else - to_chat(user, "[I] is empty!") - - else if(stage == EMPTY && istype(I, /obj/item/device/assembly_holder)) - . = 1 // no afterattack - var/obj/item/device/assembly_holder/A = I - if(isigniter(A.a_left) == isigniter(A.a_right)) //Check if either part of the assembly has an igniter, but if both parts are igniters, then fuck it - return - if(!user.transferItemToLoc(I, src)) - return - - nadeassembly = A - A.master = src - assemblyattacher = user.ckey - - stage_change(WIRED) - to_chat(user, "You add [A] to the [initial(name)] assembly.") - - else if(stage == EMPTY && istype(I, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/C = I - if (C.use(1)) - det_time = 50 // In case the cable_coil was removed and readded. - stage_change(WIRED) - to_chat(user, "You rig the [initial(name)] assembly.") - else - to_chat(user, "You need one length of coil to wire the assembly!") - return - - else if(stage == READY && istype(I, /obj/item/wirecutters) && !active) - stage_change(WIRED) - to_chat(user, "You unlock the [initial(name)] assembly.") - - else if(stage == WIRED && istype(I, /obj/item/wrench)) - if(beakers.len) - for(var/obj/O in beakers) - O.loc = get_turf(src) - beakers = list() - to_chat(user, "You open the [initial(name)] assembly and remove the payload.") - return // First use of the wrench remove beakers, then use the wrench to remove the activation mechanism. - if(nadeassembly) - nadeassembly.loc = get_turf(src) - nadeassembly.master = null - nadeassembly = null - else // If "nadeassembly = null && stage == WIRED", then it most have been cable_coil that was used. - new /obj/item/stack/cable_coil(get_turf(src),1) - stage_change(EMPTY) - to_chat(user, "You remove the activation mechanism from the [initial(name)] assembly.") - else - return ..() - -/obj/item/grenade/chem_grenade/proc/stage_change(N) - if(N) - stage = N - if(stage == EMPTY) - name = "[initial(name)] casing" - desc = "A do it yourself [initial(name)]!" - icon_state = initial(icon_state) - else if(stage == WIRED) - name = "unsecured [initial(name)]" - desc = "An unsecured [initial(name)] assembly." - icon_state = "[initial(icon_state)]_ass" - else if(stage == READY) - name = initial(name) - desc = initial(desc) - icon_state = "[initial(icon_state)]_locked" - - -//assembly stuff -/obj/item/grenade/chem_grenade/receive_signal() - prime() - - -/obj/item/grenade/chem_grenade/Crossed(atom/movable/AM) - if(nadeassembly) - nadeassembly.Crossed(AM) - -/obj/item/grenade/chem_grenade/on_found(mob/finder) - if(nadeassembly) - nadeassembly.on_found(finder) - -/obj/item/grenade/chem_grenade/prime() - if(stage != READY) - return - - var/list/datum/reagents/reactants = list() - for(var/obj/item/reagent_containers/glass/G in beakers) - reactants += G.reagents - - 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.loc = get_turf(src) - beakers = list() - stage_change(EMPTY) - return - - 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 [ADMIN_LOOKUPFLW(M)] and last touched by [ADMIN_LOOKUPFLW(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] [ADMIN_JMP(T)].") - 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] [COORD(T)]") - - var/turf/DT = get_turf(src) - var/area/DA = get_area(DT) - log_game("A grenade detonated at [DA.name] [COORD(DT)]") - - update_mob() - - qdel(src) - -//Large chem grenades accept slime cores and use the appropriately. -/obj/item/grenade/chem_grenade/large - name = "large grenade" - desc = "A custom made large grenade. It affects a larger area." - icon_state = "large_grenade" - allowed_containers = list(/obj/item/reagent_containers/glass, /obj/item/reagent_containers/food/condiment, - /obj/item/reagent_containers/food/drinks) - origin_tech = "combat=3;engineering=3" - 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/grenade/chem_grenade/large/prime() - if(stage != READY) - return - - for(var/obj/item/slime_extract/S in beakers) - if(S.Uses) - for(var/obj/item/reagent_containers/glass/G in beakers) - G.reagents.trans_to(S, G.reagents.total_volume) - - //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(S) - if(S.reagents && S.reagents.total_volume) - for(var/obj/item/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 - //if you do that it must have reagents. If you're going to - //make a special case you might as well do it explicitly. -Sayu -/obj/item/grenade/chem_grenade/large/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/slime_extract) && stage == WIRED) - if(!user.transferItemToLoc(I, src)) - return - to_chat(user, "You add [I] to the [initial(name)] assembly.") - beakers += I - else - return ..() - -/obj/item/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/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/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/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/grenade/chem_grenade/adv_release/prime() - if(stage != READY) - return - - var/total_volume = 0 - for(var/obj/item/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/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(CALLBACK(src, .proc/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])") - - - - - -////////////////////////////// -////// PREMADE GRENADES ////// -////////////////////////////// - -/obj/item/grenade/chem_grenade/metalfoam - name = "metal foam grenade" - desc = "Used for emergency sealing of air breaches." - stage = READY - -/obj/item/grenade/chem_grenade/metalfoam/Initialize() - . = ..() - var/obj/item/reagent_containers/glass/beaker/B1 = new(src) - var/obj/item/reagent_containers/glass/beaker/B2 = new(src) - - B1.reagents.add_reagent("aluminium", 30) - B2.reagents.add_reagent("foaming_agent", 10) - B2.reagents.add_reagent("facid", 10) - - beakers += B1 - beakers += B2 - - -/obj/item/grenade/chem_grenade/incendiary - name = "incendiary grenade" - desc = "Used for clearing rooms of living things." - stage = READY - -/obj/item/grenade/chem_grenade/incendiary/Initialize() - . = ..() - var/obj/item/reagent_containers/glass/beaker/B1 = new(src) - var/obj/item/reagent_containers/glass/beaker/B2 = new(src) - - B1.reagents.add_reagent("phosphorus", 25) - B2.reagents.add_reagent("stable_plasma", 25) - B2.reagents.add_reagent("sacid", 25) - - beakers += B1 - beakers += B2 - - -/obj/item/grenade/chem_grenade/antiweed - name = "weedkiller grenade" - desc = "Used for purging large areas of invasive plant species. Contents under pressure. Do not directly inhale contents." - stage = READY - -/obj/item/grenade/chem_grenade/antiweed/Initialize() - . = ..() - var/obj/item/reagent_containers/glass/beaker/B1 = new(src) - var/obj/item/reagent_containers/glass/beaker/B2 = new(src) - - B1.reagents.add_reagent("plantbgone", 25) - B1.reagents.add_reagent("potassium", 25) - B2.reagents.add_reagent("phosphorus", 25) - B2.reagents.add_reagent("sugar", 25) - - beakers += B1 - beakers += B2 - - -/obj/item/grenade/chem_grenade/cleaner - name = "cleaner grenade" - desc = "BLAM!-brand foaming space cleaner. In a special applicator for rapid cleaning of wide areas." - stage = READY - -/obj/item/grenade/chem_grenade/cleaner/Initialize() - . = ..() - var/obj/item/reagent_containers/glass/beaker/B1 = new(src) - var/obj/item/reagent_containers/glass/beaker/B2 = new(src) - - B1.reagents.add_reagent("fluorosurfactant", 40) - B2.reagents.add_reagent("water", 40) - B2.reagents.add_reagent("cleaner", 10) - - beakers += B1 - beakers += B2 - - -/obj/item/grenade/chem_grenade/ez_clean - name = "cleaner grenade" - desc = "Waffle Co.-brand foaming space cleaner. In a special applicator for rapid cleaning of wide areas." - stage = READY - -/obj/item/grenade/chem_grenade/ez_clean/Initialize() - . = ..() - var/obj/item/reagent_containers/glass/beaker/large/B1 = new(src) - var/obj/item/reagent_containers/glass/beaker/large/B2 = new(src) - - B1.reagents.add_reagent("fluorosurfactant", 40) - B2.reagents.add_reagent("water", 40) - B2.reagents.add_reagent("ez_clean", 60) //ensures a t h i c c distribution - - beakers += B1 - beakers += B2 - - - -/obj/item/grenade/chem_grenade/teargas - name = "teargas grenade" - desc = "Used for nonlethal riot control. Contents under pressure. Do not directly inhale contents." - stage = READY - -/obj/item/grenade/chem_grenade/teargas/Initialize() - . = ..() - var/obj/item/reagent_containers/glass/beaker/large/B1 = new(src) - var/obj/item/reagent_containers/glass/beaker/large/B2 = new(src) - - B1.reagents.add_reagent("condensedcapsaicin", 60) - B1.reagents.add_reagent("potassium", 40) - B2.reagents.add_reagent("phosphorus", 40) - B2.reagents.add_reagent("sugar", 40) - - beakers += B1 - beakers += B2 - - -/obj/item/grenade/chem_grenade/facid - name = "acid grenade" - desc = "Used for melting armoured opponents." - stage = READY - -/obj/item/grenade/chem_grenade/facid/Initialize() - . = ..() - var/obj/item/reagent_containers/glass/beaker/bluespace/B1 = new(src) - var/obj/item/reagent_containers/glass/beaker/bluespace/B2 = new(src) - - B1.reagents.add_reagent("facid", 290) - B1.reagents.add_reagent("potassium", 10) - B2.reagents.add_reagent("phosphorus", 10) - B2.reagents.add_reagent("sugar", 10) - B2.reagents.add_reagent("facid", 280) - - beakers += B1 - beakers += B2 - - -/obj/item/grenade/chem_grenade/colorful - name = "colorful grenade" - desc = "Used for wide scale painting projects." - stage = READY - -/obj/item/grenade/chem_grenade/colorful/Initialize() - . = ..() - var/obj/item/reagent_containers/glass/beaker/B1 = new(src) - var/obj/item/reagent_containers/glass/beaker/B2 = new(src) - - B1.reagents.add_reagent("colorful_reagent", 25) - B1.reagents.add_reagent("potassium", 25) - B2.reagents.add_reagent("phosphorus", 25) - B2.reagents.add_reagent("sugar", 25) - - beakers += B1 - beakers += B2 - -/obj/item/grenade/chem_grenade/glitter - name = "generic glitter grenade" - desc = "You shouldn't see this description." - stage = READY - var/glitter_type = "glitter" - -/obj/item/grenade/chem_grenade/glitter/Initialize() - . = ..() - var/obj/item/reagent_containers/glass/beaker/B1 = new(src) - var/obj/item/reagent_containers/glass/beaker/B2 = new(src) - - B1.reagents.add_reagent(glitter_type, 25) - B1.reagents.add_reagent("potassium", 25) - B2.reagents.add_reagent("phosphorus", 25) - B2.reagents.add_reagent("sugar", 25) - - beakers += B1 - beakers += B2 - -/obj/item/grenade/chem_grenade/glitter/pink - name = "pink glitter bomb" - desc = "For that HOT glittery look." - glitter_type = "pink_glitter" - -/obj/item/grenade/chem_grenade/glitter/blue - name = "blue glitter bomb" - desc = "For that COOL glittery look." - glitter_type = "blue_glitter" - -/obj/item/grenade/chem_grenade/glitter/white - name = "white glitter bomb" - desc = "For that somnolent glittery look." - glitter_type = "white_glitter" - -/obj/item/grenade/chem_grenade/clf3 - name = "clf3 grenade" - desc = "BURN!-brand foaming clf3. In a special applicator for rapid purging of wide areas." - stage = READY - -/obj/item/grenade/chem_grenade/clf3/Initialize() - . = ..() - var/obj/item/reagent_containers/glass/beaker/bluespace/B1 = new(src) - var/obj/item/reagent_containers/glass/beaker/bluespace/B2 = new(src) - - B1.reagents.add_reagent("fluorosurfactant", 250) - B1.reagents.add_reagent("clf3", 50) - B2.reagents.add_reagent("water", 250) - B2.reagents.add_reagent("clf3", 50) - - beakers += B1 - beakers += B2 - -/obj/item/grenade/chem_grenade/bioterrorfoam - name = "Bio terror foam grenade" - desc = "Tiger Cooperative chemical foam grenade. Causes temporary irration, blindness, confusion, mutism, and mutations to carbon based life forms. Contains additional spore toxin" - stage = READY - -/obj/item/grenade/chem_grenade/bioterrorfoam/Initialize() - . = ..() - var/obj/item/reagent_containers/glass/beaker/bluespace/B1 = new(src) - var/obj/item/reagent_containers/glass/beaker/bluespace/B2 = new(src) - - B1.reagents.add_reagent("cryptobiolin", 75) - B1.reagents.add_reagent("water", 50) - B1.reagents.add_reagent("mutetoxin", 50) - B1.reagents.add_reagent("spore", 75) - B1.reagents.add_reagent("itching_powder", 50) - B2.reagents.add_reagent("fluorosurfactant", 150) - B2.reagents.add_reagent("mutagen", 150) - beakers += B1 - beakers += B2 - -/obj/item/grenade/chem_grenade/tuberculosis - name = "Fungal tuberculosis grenade" - desc = "WARNING: GRENADE WILL RELEASE DEADLY SPORES CONTAINING ACTIVE AGENTS. SEAL SUIT AND AIRFLOW BEFORE USE." - stage = READY - -/obj/item/grenade/chem_grenade/tuberculosis/Initialize() - . = ..() - var/obj/item/reagent_containers/glass/beaker/bluespace/B1 = new(src) - var/obj/item/reagent_containers/glass/beaker/bluespace/B2 = new(src) - - B1.reagents.add_reagent("potassium", 50) - B1.reagents.add_reagent("phosphorus", 50) - B1.reagents.add_reagent("fungalspores", 200) - B2.reagents.add_reagent("blood", 250) - B2.reagents.add_reagent("sugar", 50) - - beakers += B1 - beakers += B2 +#define EMPTY 1 +#define WIRED 2 +#define READY 3 + +/obj/item/grenade/chem_grenade + name = "chemical grenade" + desc = "A custom made grenade." + icon_state = "chemg" + item_state = "flashbang" + w_class = WEIGHT_CLASS_SMALL + force = 2 + var/stage = EMPTY + var/list/beakers = list() + var/list/allowed_containers = list(/obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/glass/bottle) + var/affected_area = 3 + var/obj/item/device/assembly_holder/nadeassembly = 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/grenade/chem_grenade/Initialize() + . = ..() + create_reagents(1000) + stage_change() // If no argument is set, it will change the stage to the current stage, useful for stock grenades that start READY. + +/obj/item/grenade/chem_grenade/examine(mob/user) + display_timer = (stage == READY && !nadeassembly) //show/hide the timer based on assembly state + ..() + + +/obj/item/grenade/chem_grenade/attack_self(mob/user) + if(stage == READY && !active) + if(nadeassembly) + nadeassembly.attack_self(user) + else if(clown_check(user)) + var/turf/bombturf = get_turf(src) + var/area/A = get_area(bombturf) + message_admins("[ADMIN_LOOKUPFLW(usr)] has primed a [name] for detonation at [A.name][ADMIN_JMP(bombturf)].") + log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] [COORD(bombturf)].") + to_chat(user, "You prime the [name]! [det_time / 10] second\s!") + playsound(user.loc, 'sound/weapons/armbomb.ogg', 60, 1) + active = 1 + icon_state = initial(icon_state) + "_active" + if(iscarbon(user)) + var/mob/living/carbon/C = user + C.throw_mode_on() + + addtimer(CALLBACK(src, .proc/prime), det_time) + + +/obj/item/grenade/chem_grenade/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/screwdriver)) + if(stage == WIRED) + if(beakers.len) + stage_change(READY) + to_chat(user, "You lock the [initial(name)] assembly.") + playsound(loc, I.usesound, 25, -3) + else + to_chat(user, "You need to add at least one beaker before locking the [initial(name)] assembly!") + else if(stage == READY && !nadeassembly) + det_time = det_time == 50 ? 30 : 50 //toggle between 30 and 50 + to_chat(user, "You modify the time delay. It's set for [det_time / 10] second\s.") + else if(stage == EMPTY) + to_chat(user, "You need to add an activation mechanism!") + + else if(stage == WIRED && is_type_in_list(I, allowed_containers)) + . = 1 //no afterattack + if(beakers.len == 2) + to_chat(user, "[src] can not hold more containers!") + return + else + if(I.reagents.total_volume) + if(!user.transferItemToLoc(I, src)) + return + to_chat(user, "You add [I] to the [initial(name)] assembly.") + beakers += I + else + to_chat(user, "[I] is empty!") + + else if(stage == EMPTY && istype(I, /obj/item/device/assembly_holder)) + . = 1 // no afterattack + var/obj/item/device/assembly_holder/A = I + if(isigniter(A.a_left) == isigniter(A.a_right)) //Check if either part of the assembly has an igniter, but if both parts are igniters, then fuck it + return + if(!user.transferItemToLoc(I, src)) + return + + nadeassembly = A + A.master = src + assemblyattacher = user.ckey + + stage_change(WIRED) + to_chat(user, "You add [A] to the [initial(name)] assembly.") + + else if(stage == EMPTY && istype(I, /obj/item/stack/cable_coil)) + var/obj/item/stack/cable_coil/C = I + if (C.use(1)) + det_time = 50 // In case the cable_coil was removed and readded. + stage_change(WIRED) + to_chat(user, "You rig the [initial(name)] assembly.") + else + to_chat(user, "You need one length of coil to wire the assembly!") + return + + else if(stage == READY && istype(I, /obj/item/wirecutters) && !active) + stage_change(WIRED) + to_chat(user, "You unlock the [initial(name)] assembly.") + + else if(stage == WIRED && istype(I, /obj/item/wrench)) + if(beakers.len) + for(var/obj/O in beakers) + O.loc = get_turf(src) + beakers = list() + to_chat(user, "You open the [initial(name)] assembly and remove the payload.") + return // First use of the wrench remove beakers, then use the wrench to remove the activation mechanism. + if(nadeassembly) + nadeassembly.loc = get_turf(src) + nadeassembly.master = null + nadeassembly = null + else // If "nadeassembly = null && stage == WIRED", then it most have been cable_coil that was used. + new /obj/item/stack/cable_coil(get_turf(src),1) + stage_change(EMPTY) + to_chat(user, "You remove the activation mechanism from the [initial(name)] assembly.") + else + return ..() + +/obj/item/grenade/chem_grenade/proc/stage_change(N) + if(N) + stage = N + if(stage == EMPTY) + name = "[initial(name)] casing" + desc = "A do it yourself [initial(name)]!" + icon_state = initial(icon_state) + else if(stage == WIRED) + name = "unsecured [initial(name)]" + desc = "An unsecured [initial(name)] assembly." + icon_state = "[initial(icon_state)]_ass" + else if(stage == READY) + name = initial(name) + desc = initial(desc) + icon_state = "[initial(icon_state)]_locked" + + +//assembly stuff +/obj/item/grenade/chem_grenade/receive_signal() + prime() + + +/obj/item/grenade/chem_grenade/Crossed(atom/movable/AM) + if(nadeassembly) + nadeassembly.Crossed(AM) + +/obj/item/grenade/chem_grenade/on_found(mob/finder) + if(nadeassembly) + nadeassembly.on_found(finder) + +/obj/item/grenade/chem_grenade/prime() + if(stage != READY) + return + + var/list/datum/reagents/reactants = list() + for(var/obj/item/reagent_containers/glass/G in beakers) + reactants += G.reagents + + 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.loc = get_turf(src) + beakers = list() + stage_change(EMPTY) + return + + 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 [ADMIN_LOOKUPFLW(M)] and last touched by [ADMIN_LOOKUPFLW(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] [ADMIN_JMP(T)].") + 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] [COORD(T)]") + + var/turf/DT = get_turf(src) + var/area/DA = get_area(DT) + log_game("A grenade detonated at [DA.name] [COORD(DT)]") + + update_mob() + + qdel(src) + +//Large chem grenades accept slime cores and use the appropriately. +/obj/item/grenade/chem_grenade/large + name = "large grenade" + desc = "A custom made large grenade. It affects a larger area." + icon_state = "large_grenade" + allowed_containers = list(/obj/item/reagent_containers/glass, /obj/item/reagent_containers/food/condiment, + /obj/item/reagent_containers/food/drinks) + origin_tech = "combat=3;engineering=3" + 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/grenade/chem_grenade/large/prime() + if(stage != READY) + return + + for(var/obj/item/slime_extract/S in beakers) + if(S.Uses) + for(var/obj/item/reagent_containers/glass/G in beakers) + G.reagents.trans_to(S, G.reagents.total_volume) + + //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(S) + if(S.reagents && S.reagents.total_volume) + for(var/obj/item/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 + //if you do that it must have reagents. If you're going to + //make a special case you might as well do it explicitly. -Sayu +/obj/item/grenade/chem_grenade/large/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/slime_extract) && stage == WIRED) + if(!user.transferItemToLoc(I, src)) + return + to_chat(user, "You add [I] to the [initial(name)] assembly.") + beakers += I + else + return ..() + +/obj/item/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/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/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/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/grenade/chem_grenade/adv_release/prime() + if(stage != READY) + return + + var/total_volume = 0 + for(var/obj/item/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/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(CALLBACK(src, .proc/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])") + + + + + +////////////////////////////// +////// PREMADE GRENADES ////// +////////////////////////////// + +/obj/item/grenade/chem_grenade/metalfoam + name = "metal foam grenade" + desc = "Used for emergency sealing of air breaches." + stage = READY + +/obj/item/grenade/chem_grenade/metalfoam/Initialize() + . = ..() + var/obj/item/reagent_containers/glass/beaker/B1 = new(src) + var/obj/item/reagent_containers/glass/beaker/B2 = new(src) + + B1.reagents.add_reagent("aluminium", 30) + B2.reagents.add_reagent("foaming_agent", 10) + B2.reagents.add_reagent("facid", 10) + + beakers += B1 + beakers += B2 + + +/obj/item/grenade/chem_grenade/smart_metal_foam + name = "smart metal foam grenade" + desc = "Used for sealing and reconstruction of air breaches." + stage = READY + +/obj/item/grenade/chem_grenade/smart_metal_foam/Initialize() + . = ..() + var/obj/item/reagent_containers/glass/beaker/large/B1 = new(src) + var/obj/item/reagent_containers/glass/beaker/B2 = new(src) + + B1.reagents.add_reagent("aluminium", 75) + B2.reagents.add_reagent("smart_foaming_agent", 25) + B2.reagents.add_reagent("facid", 25) + + beakers += B1 + beakers += B2 + + +/obj/item/grenade/chem_grenade/incendiary + name = "incendiary grenade" + desc = "Used for clearing rooms of living things." + stage = READY + +/obj/item/grenade/chem_grenade/incendiary/Initialize() + . = ..() + var/obj/item/reagent_containers/glass/beaker/B1 = new(src) + var/obj/item/reagent_containers/glass/beaker/B2 = new(src) + + B1.reagents.add_reagent("phosphorus", 25) + B2.reagents.add_reagent("stable_plasma", 25) + B2.reagents.add_reagent("sacid", 25) + + beakers += B1 + beakers += B2 + + +/obj/item/grenade/chem_grenade/antiweed + name = "weedkiller grenade" + desc = "Used for purging large areas of invasive plant species. Contents under pressure. Do not directly inhale contents." + stage = READY + +/obj/item/grenade/chem_grenade/antiweed/Initialize() + . = ..() + var/obj/item/reagent_containers/glass/beaker/B1 = new(src) + var/obj/item/reagent_containers/glass/beaker/B2 = new(src) + + B1.reagents.add_reagent("plantbgone", 25) + B1.reagents.add_reagent("potassium", 25) + B2.reagents.add_reagent("phosphorus", 25) + B2.reagents.add_reagent("sugar", 25) + + beakers += B1 + beakers += B2 + + +/obj/item/grenade/chem_grenade/cleaner + name = "cleaner grenade" + desc = "BLAM!-brand foaming space cleaner. In a special applicator for rapid cleaning of wide areas." + stage = READY + +/obj/item/grenade/chem_grenade/cleaner/Initialize() + . = ..() + var/obj/item/reagent_containers/glass/beaker/B1 = new(src) + var/obj/item/reagent_containers/glass/beaker/B2 = new(src) + + B1.reagents.add_reagent("fluorosurfactant", 40) + B2.reagents.add_reagent("water", 40) + B2.reagents.add_reagent("cleaner", 10) + + beakers += B1 + beakers += B2 + + +/obj/item/grenade/chem_grenade/ez_clean + name = "cleaner grenade" + desc = "Waffle Co.-brand foaming space cleaner. In a special applicator for rapid cleaning of wide areas." + stage = READY + +/obj/item/grenade/chem_grenade/ez_clean/Initialize() + . = ..() + var/obj/item/reagent_containers/glass/beaker/large/B1 = new(src) + var/obj/item/reagent_containers/glass/beaker/large/B2 = new(src) + + B1.reagents.add_reagent("fluorosurfactant", 40) + B2.reagents.add_reagent("water", 40) + B2.reagents.add_reagent("ez_clean", 60) //ensures a t h i c c distribution + + beakers += B1 + beakers += B2 + + + +/obj/item/grenade/chem_grenade/teargas + name = "teargas grenade" + desc = "Used for nonlethal riot control. Contents under pressure. Do not directly inhale contents." + stage = READY + +/obj/item/grenade/chem_grenade/teargas/Initialize() + . = ..() + var/obj/item/reagent_containers/glass/beaker/large/B1 = new(src) + var/obj/item/reagent_containers/glass/beaker/large/B2 = new(src) + + B1.reagents.add_reagent("condensedcapsaicin", 60) + B1.reagents.add_reagent("potassium", 40) + B2.reagents.add_reagent("phosphorus", 40) + B2.reagents.add_reagent("sugar", 40) + + beakers += B1 + beakers += B2 + + +/obj/item/grenade/chem_grenade/facid + name = "acid grenade" + desc = "Used for melting armoured opponents." + stage = READY + +/obj/item/grenade/chem_grenade/facid/Initialize() + . = ..() + var/obj/item/reagent_containers/glass/beaker/bluespace/B1 = new(src) + var/obj/item/reagent_containers/glass/beaker/bluespace/B2 = new(src) + + B1.reagents.add_reagent("facid", 290) + B1.reagents.add_reagent("potassium", 10) + B2.reagents.add_reagent("phosphorus", 10) + B2.reagents.add_reagent("sugar", 10) + B2.reagents.add_reagent("facid", 280) + + beakers += B1 + beakers += B2 + + +/obj/item/grenade/chem_grenade/colorful + name = "colorful grenade" + desc = "Used for wide scale painting projects." + stage = READY + +/obj/item/grenade/chem_grenade/colorful/Initialize() + . = ..() + var/obj/item/reagent_containers/glass/beaker/B1 = new(src) + var/obj/item/reagent_containers/glass/beaker/B2 = new(src) + + B1.reagents.add_reagent("colorful_reagent", 25) + B1.reagents.add_reagent("potassium", 25) + B2.reagents.add_reagent("phosphorus", 25) + B2.reagents.add_reagent("sugar", 25) + + beakers += B1 + beakers += B2 + +/obj/item/grenade/chem_grenade/glitter + name = "generic glitter grenade" + desc = "You shouldn't see this description." + stage = READY + var/glitter_type = "glitter" + +/obj/item/grenade/chem_grenade/glitter/Initialize() + . = ..() + var/obj/item/reagent_containers/glass/beaker/B1 = new(src) + var/obj/item/reagent_containers/glass/beaker/B2 = new(src) + + B1.reagents.add_reagent(glitter_type, 25) + B1.reagents.add_reagent("potassium", 25) + B2.reagents.add_reagent("phosphorus", 25) + B2.reagents.add_reagent("sugar", 25) + + beakers += B1 + beakers += B2 + +/obj/item/grenade/chem_grenade/glitter/pink + name = "pink glitter bomb" + desc = "For that HOT glittery look." + glitter_type = "pink_glitter" + +/obj/item/grenade/chem_grenade/glitter/blue + name = "blue glitter bomb" + desc = "For that COOL glittery look." + glitter_type = "blue_glitter" + +/obj/item/grenade/chem_grenade/glitter/white + name = "white glitter bomb" + desc = "For that somnolent glittery look." + glitter_type = "white_glitter" + +/obj/item/grenade/chem_grenade/clf3 + name = "clf3 grenade" + desc = "BURN!-brand foaming clf3. In a special applicator for rapid purging of wide areas." + stage = READY + +/obj/item/grenade/chem_grenade/clf3/Initialize() + . = ..() + var/obj/item/reagent_containers/glass/beaker/bluespace/B1 = new(src) + var/obj/item/reagent_containers/glass/beaker/bluespace/B2 = new(src) + + B1.reagents.add_reagent("fluorosurfactant", 250) + B1.reagents.add_reagent("clf3", 50) + B2.reagents.add_reagent("water", 250) + B2.reagents.add_reagent("clf3", 50) + + beakers += B1 + beakers += B2 + +/obj/item/grenade/chem_grenade/bioterrorfoam + name = "Bio terror foam grenade" + desc = "Tiger Cooperative chemical foam grenade. Causes temporary irration, blindness, confusion, mutism, and mutations to carbon based life forms. Contains additional spore toxin" + stage = READY + +/obj/item/grenade/chem_grenade/bioterrorfoam/Initialize() + . = ..() + var/obj/item/reagent_containers/glass/beaker/bluespace/B1 = new(src) + var/obj/item/reagent_containers/glass/beaker/bluespace/B2 = new(src) + + B1.reagents.add_reagent("cryptobiolin", 75) + B1.reagents.add_reagent("water", 50) + B1.reagents.add_reagent("mutetoxin", 50) + B1.reagents.add_reagent("spore", 75) + B1.reagents.add_reagent("itching_powder", 50) + B2.reagents.add_reagent("fluorosurfactant", 150) + B2.reagents.add_reagent("mutagen", 150) + beakers += B1 + beakers += B2 + +/obj/item/grenade/chem_grenade/tuberculosis + name = "Fungal tuberculosis grenade" + desc = "WARNING: GRENADE WILL RELEASE DEADLY SPORES CONTAINING ACTIVE AGENTS. SEAL SUIT AND AIRFLOW BEFORE USE." + stage = READY + +/obj/item/grenade/chem_grenade/tuberculosis/Initialize() + . = ..() + var/obj/item/reagent_containers/glass/beaker/bluespace/B1 = new(src) + var/obj/item/reagent_containers/glass/beaker/bluespace/B2 = new(src) + + B1.reagents.add_reagent("potassium", 50) + B1.reagents.add_reagent("phosphorus", 50) + B1.reagents.add_reagent("fungalspores", 200) + B2.reagents.add_reagent("blood", 250) + B2.reagents.add_reagent("sugar", 50) + + beakers += B1 + beakers += B2 diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index 7b8b6c385c..cc60c9ba9c 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -583,6 +583,15 @@ for(var/i in 1 to 7) new /obj/item/grenade/chem_grenade/metalfoam(src) +/obj/item/storage/box/smart_metal_foam + name = "box of smart metal foam grenades" + desc = "Used to rapidly seal hull breaches. This variety conforms to the walls of its area." + illustration = "flashbang" + +/obj/item/storage/box/smart_metal_foam/PopulateContents() + for(var/i in 1 to 7) + new/obj/item/grenade/chem_grenade/smart_metal_foam(src) + /obj/item/storage/box/hug name = "box of hugs" desc = "A special box for sensitive people." @@ -726,12 +735,13 @@ /obj/item/storage/box/ingredients/Initialize() ..() - if(item_state) - name = "[name] ([item_state])" - desc = "A box containing supplementary ingredients for the aspiring chef. This box's theme is '[item_state]'." + if(icon_state) + name = "[name] ([icon_state])" + desc = "A box containing supplementary ingredients for the aspiring chef. This box's theme is '[icon_state]'." + item_state = "syringe_kit" /obj/item/storage/box/ingredients/wildcard - item_state = "wildcard" + icon_state = "wildcard" /obj/item/storage/box/ingredients/wildcard/PopulateContents() for(var/i in 1 to 7) @@ -752,7 +762,7 @@ new randomFood(src) /obj/item/storage/box/ingredients/fiesta - item_state = "fiesta" + icon_state = "fiesta" /obj/item/storage/box/ingredients/fiesta/PopulateContents() new /obj/item/reagent_containers/food/snacks/tortilla(src) @@ -762,7 +772,7 @@ new /obj/item/reagent_containers/food/snacks/grown/chili(src) /obj/item/storage/box/ingredients/italian - item_state = "italian" + icon_state = "italian" /obj/item/storage/box/ingredients/italian/PopulateContents() for(var/i in 1 to 3) @@ -771,7 +781,7 @@ new /obj/item/reagent_containers/food/drinks/bottle/wine(src) /obj/item/storage/box/ingredients/vegetarian - item_state = "vegetarian" + icon_state = "vegetarian" /obj/item/storage/box/ingredients/vegetarian/PopulateContents() for(var/i in 1 to 2) @@ -783,7 +793,7 @@ new /obj/item/reagent_containers/food/snacks/grown/tomato(src) /obj/item/storage/box/ingredients/american - item_state = "american" + icon_state = "american" /obj/item/storage/box/ingredients/american/PopulateContents() for(var/i in 1 to 2) @@ -793,7 +803,7 @@ new /obj/item/reagent_containers/food/snacks/faggot(src) /obj/item/storage/box/ingredients/fruity - item_state = "fruity" + icon_state = "fruity" /obj/item/storage/box/ingredients/fruity/PopulateContents() for(var/i in 1 to 2) @@ -804,7 +814,7 @@ new /obj/item/reagent_containers/food/snacks/grown/watermelon(src) /obj/item/storage/box/ingredients/sweets - item_state = "sweets" + icon_state = "sweets" /obj/item/storage/box/ingredients/sweets/PopulateContents() for(var/i in 1 to 2) @@ -815,7 +825,7 @@ new /obj/item/reagent_containers/food/snacks/grown/apple(src) /obj/item/storage/box/ingredients/delights - item_state = "delights" + icon_state = "delights" /obj/item/storage/box/ingredients/delights/PopulateContents() for(var/i in 1 to 2) @@ -826,7 +836,7 @@ new /obj/item/reagent_containers/food/snacks/grown/berries(src) /obj/item/storage/box/ingredients/grains - item_state = "grains" + icon_state = "grains" /obj/item/storage/box/ingredients/grains/PopulateContents() for(var/i in 1 to 3) @@ -837,7 +847,7 @@ new /obj/item/seeds/poppy(src) /obj/item/storage/box/ingredients/carnivore - item_state = "carnivore" + icon_state = "carnivore" /obj/item/storage/box/ingredients/carnivore/PopulateContents() new /obj/item/reagent_containers/food/snacks/meat/slab/bear(src) @@ -849,7 +859,7 @@ new /obj/item/reagent_containers/food/snacks/faggot(src) /obj/item/storage/box/ingredients/exotic - item_state = "exotic" + icon_state = "exotic" /obj/item/storage/box/ingredients/exotic/PopulateContents() for(var/i in 1 to 2) diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 1fae8ed2c0..c13def9897 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -24,7 +24,7 @@ ..() //This is so damaged or burnt tiles or platings don't get remembered as the default tile var/static/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","damaged4", - "damaged5","panelscorched","floorscorched1","floorscorched2","platingdmg1","platingdmg2", + "damaged5","panelscorched","floorscorched1","floorscorched2","platingdmg1","platingdmg2", "foam_plating", "platingdmg3","plating","light_on","light_on_flicker1","light_on_flicker2", "light_on_clicker3","light_on_clicker4","light_on_clicker5","light_broken", "light_on_broken","light_off","wall_thermite","grass", "sand", diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 3247b273ae..ffc24882fd 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -62,6 +62,13 @@ data["viruses"] = preserve return 1 +/datum/reagent/blood/proc/get_diseases() + . = list() + if(data && data["viruses"]) + for(var/thing in data["viruses"]) + var/datum/disease/D = thing + . += D + /datum/reagent/blood/reaction_turf(turf/T, reac_volume)//splash the blood all over the place if(!istype(T)) return @@ -1079,6 +1086,14 @@ color = "#664B63" // rgb: 102, 75, 99 taste_description = "metal" +/datum/reagent/smart_foaming_agent //Smart foaming agent. Functions similarly to metal foam, but conforms to walls. + name = "Smart foaming agent" + id = "smart_foaming_agent" + description = "A agent that yields metallic foam which conforms to area boundaries when mixed with light metal and a strong acid." + reagent_state = SOLID + color = "#664B63" // rgb: 102, 75, 99 + taste_description = "metal" + /datum/reagent/ammonia name = "Ammonia" id = "ammonia" @@ -1558,6 +1573,18 @@ ZI.Insert(H) ..() +/datum/reagent/magillitis + name = "Magillitis" + id = "magillitis" + description = "An experimental serum which causes rapid muscular growth in basic primates. Side-affects may include hypertrichosis, violent outbursts, and an unending affinity for bananas." + reagent_state = LIQUID + color = "#00f041" + +/datum/reagent/magillitis/on_mob_life(mob/living/carbon/M) + ..() + if(ismonkey(M) && current_cycle >= 10) + return M.gorillize() + /datum/reagent/growthserum name = "Growth Serum" id = "growthserum" diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index 173bcbcacc..222f88ba8b 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -466,6 +466,20 @@ s.start() holder.clear_reagents() +/datum/chemical_reaction/smart_foam + name = "Smart Metal Foam" + id = "smart_metal_foam" + required_reagents = list("aluminium" = 3, "smart_foaming_agent" = 1, "facid" = 1) + mob_react = TRUE + +/datum/chemical_reaction/smart_foam/on_reaction(datum/reagents/holder, created_volume) + var/turf/location = get_turf(holder.my_atom) + location.visible_message("The solution spews out metallic foam!") + var/datum/effect_system/foam_spread/metal/smart/s = new() + s.set_up(created_volume * 5, location, holder, TRUE) + s.start() + holder.clear_reagents() + /datum/chemical_reaction/ironfoam name = "Iron Foam" id = "ironlfoam" @@ -487,6 +501,13 @@ results = list("foaming_agent" = 1) required_reagents = list("lithium" = 1, "hydrogen" = 1) +/datum/chemical_reaction/smart_foaming_agent + name = "Smart foaming Agent" + id = "smart_foaming_agent" + results = list("smart_foaming_agent" = 3) + required_reagents = list("foaming_agent" = 3, "acetone" = 1, "iron" = 1) + mix_message = "The solution mixes into a frothy metal foam and conforms to the walls of its container." + /////////////////////////////// Cleaning and hydroponics ///////////////////////////////////////////////// diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi index ee1d186509222283019a59cec895723e88d20923..a0521414f19b06fc00757b0cca1aa98fd3c52dd1 100644 GIT binary patch delta 15915 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