diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 9033a74526a..f1c79744698 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -977,12 +977,12 @@
/obj/item/seeds/cabbage = 3,/obj/item/seeds/carrot = 3,/obj/item/seeds/cherry = 3,/obj/item/seeds/chanter = 3,
/obj/item/seeds/chili = 3,/obj/item/seeds/cocoapod = 3,/obj/item/seeds/coffee = 3, /obj/item/seeds/comfrey =3, /obj/item/seeds/corn = 3,
/obj/item/seeds/nymph =3, /obj/item/seeds/eggplant = 3,/obj/item/seeds/grape = 3,/obj/item/seeds/grass = 3,/obj/item/seeds/lemon = 3,
- /obj/item/seeds/lime = 3,/obj/item/seeds/orange = 3, /obj/item/seeds/peanuts = 3, /obj/item/seeds/potato = 3,/obj/item/seeds/poppy = 3,
+ /obj/item/seeds/lime = 3,/obj/item/seeds/onion = 3,/obj/item/seeds/orange = 3, /obj/item/seeds/peanuts = 3, /obj/item/seeds/potato = 3,/obj/item/seeds/poppy = 3,
/obj/item/seeds/pumpkin = 3,/obj/item/seeds/replicapod = 3,/obj/item/seeds/wheat/rice = 3,/obj/item/seeds/soya = 3,/obj/item/seeds/sunflower = 3,
/obj/item/seeds/tea = 3,/obj/item/seeds/tobacco = 3,/obj/item/seeds/tomato = 3,
/obj/item/seeds/tower = 3,/obj/item/seeds/watermelon = 3,/obj/item/seeds/wheat = 3,/obj/item/seeds/whitebeet = 3)
contraband = list(/obj/item/seeds/amanita = 2,/obj/item/seeds/glowshroom = 2,/obj/item/seeds/liberty = 2,/obj/item/seeds/nettle = 2,
- /obj/item/seeds/plump = 2,/obj/item/seeds/reishi = 2,/obj/item/seeds/cannabis = 3, /obj/item/seeds/fungus = 3, /obj/item/seeds/random = 2)
+ /obj/item/seeds/plump = 2,/obj/item/seeds/reishi = 2,/obj/item/seeds/cannabis = 3,/obj/item/seeds/starthistle = 2,/obj/item/seeds/fungus = 3, /obj/item/seeds/random = 2)
premium = list(/obj/item/weapon/reagent_containers/spray/waterflower = 1)
/**
diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
index eb62395c82a..d22d4eb2c93 100644
--- a/code/modules/food_and_drinks/food/snacks.dm
+++ b/code/modules/food_and_drinks/food/snacks.dm
@@ -2490,3 +2490,11 @@
icon_state = "tatortot"
list_reagents = list("nutriment" = 4)
filling_color = "FFD700"
+
+/obj/item/weapon/reagent_containers/food/snacks/onionrings
+ name = "onion rings"
+ desc = "Onion slices coated in batter."
+ icon_state = "onionrings"
+ list_reagents = list("nutriment" = 3)
+ filling_color = "#C0C9A0"
+ gender = PLURAL
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/recipes/recipes_microwave.dm b/code/modules/food_and_drinks/recipes/recipes_microwave.dm
index a0998a67a58..329e39011eb 100644
--- a/code/modules/food_and_drinks/recipes/recipes_microwave.dm
+++ b/code/modules/food_and_drinks/recipes/recipes_microwave.dm
@@ -541,6 +541,10 @@ datum/recipe/microwave/slimesandwich
being_cooked.reagents.del_reagent("toxin")
return being_cooked
+/datum/recipe/microwave/onionrings
+ items = list(/obj/item/weapon/reagent_containers/food/snacks/onion_slice)
+ result = /obj/item/weapon/reagent_containers/food/snacks/onionrings
+
////////////////////////////FOOD ADDITTIONS///////////////////////////////
/datum/recipe/microwave/wrap
diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm
index bade37d1b3a..1656e4d327f 100644
--- a/code/modules/hydroponics/gene_modder.dm
+++ b/code/modules/hydroponics/gene_modder.dm
@@ -15,11 +15,12 @@
var/datum/plant_gene/target
var/operation = ""
- var/rating = 0
- var/max_extract_pot = 50
- // The cap on potency gene extraction.
- // This number is for T1, each upgraded part adds 5% for a tech level above T1.
- // At T4, it reaches 95%.
+ var/max_potency = 50 // See RefreshParts() for how these work
+ var/max_yield = 2
+ var/min_production = 12
+ var/max_endurance = 10 // IMPT: ALSO AFFECTS LIFESPAN
+ var/min_wchance = 67
+ var/min_wrate = 10
/obj/machinery/plantgenes/New()
..()
@@ -40,13 +41,27 @@
QDEL_NULL(disk)
return ..()
-/obj/machinery/plantgenes/RefreshParts()
- rating = 0
- for(var/I in component_parts)
- if(istype(I, /obj/item/weapon/stock_parts))
- var/obj/item/weapon/stock_parts/S = I
- rating += S.rating-1
- max_extract_pot = initial(max_extract_pot) + rating*5
+/obj/machinery/plantgenes/RefreshParts() // Comments represent the max you can set per tier, respectively. seeds.dm [219] clamps these for us but we don't want to mislead the viewer.
+ for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
+ if(M.rating > 3)
+ max_potency = 95
+ else
+ max_potency = initial(max_potency) + (M.rating**3) // 53,59,77,95 Clamps at 100
+
+ max_yield = initial(max_yield) + (M.rating*2) // 4,6,8,10 Clamps at 10
+
+ for(var/obj/item/weapon/stock_parts/scanning_module/SM in component_parts)
+ if(SM.rating > 3) //If you create t5 parts I'm a step ahead mwahahaha!
+ min_production = 1
+ else
+ min_production = 12 - (SM.rating * 3) //9,6,3,1. Requires if to avoid going below clamp [1]
+
+ max_endurance = initial(max_endurance) + (SM.rating * 25) // 35,60,85,100 Clamps at 10min 100max
+
+ for(var/obj/item/weapon/stock_parts/micro_laser/ML in component_parts)
+ var/wratemod = ML.rating * 2.5
+ min_wrate = Floor(10-wratemod) // 7,5,2,0 Clamps at 0 and 10 You want this low
+ min_wchance = 67-(ML.rating*16) // 48,35,19,3 Clamps at 0 and 67 You want this low
/obj/machinery/plantgenes/update_icon()
..()
@@ -133,11 +148,36 @@
if("extract")
dat += "[target.get_name()] gene from \the [seed]?
"
dat += "The sample will be destroyed in process!"
- if(istype(target, /datum/plant_gene/core/potency))
+ if(istype(target, /datum/plant_gene/core))
var/datum/plant_gene/core/gene = target
- if(gene.value > max_extract_pot)
- dat += "
This device's extraction capabilities are currently limited to [max_extract_pot] potency. "
- dat += "Target gene will be degraded to [max_extract_pot] potency on extraction."
+ if(istype(target, /datum/plant_gene/core/potency))
+ if(gene.value > max_potency)
+ dat += "
This device's extraction capabilities are currently limited to [max_potency] potency. "
+ dat += "Target gene will be degraded to [max_potency] potency on extraction."
+ else if(istype(target, /datum/plant_gene/core/lifespan))
+ if(gene.value > max_endurance)
+ dat += "
This device's extraction capabilities are currently limited to [max_endurance] lifespan. "
+ dat += "Target gene will be degraded to [max_endurance] Lifespan on extraction."
+ else if(istype(target, /datum/plant_gene/core/endurance))
+ if(gene.value > max_endurance)
+ dat += "
This device's extraction capabilities are currently limited to [max_endurance] endurance. "
+ dat += "Target gene will be degraded to [max_endurance] endurance on extraction."
+ else if(istype(target, /datum/plant_gene/core/yield))
+ if(gene.value > max_yield)
+ dat += "
This device's extraction capabilities are currently limited to [max_yield] yield. "
+ dat += "Target gene will be degraded to [max_yield] yield on extraction."
+ else if(istype(target, /datum/plant_gene/core/production))
+ if(gene.value < min_production)
+ dat += "
This device's extraction capabilities are currently limited to [min_production] production. "
+ dat += "Target gene will be degraded to [min_production] production on extraction."
+ else if(istype(target, /datum/plant_gene/core/weed_rate))
+ if(gene.value < min_wrate)
+ dat += "
This device's extraction capabilities are currently limited to [min_wrate] weed rate. "
+ dat += "Target gene will be degraded to [min_wrate] weed rate on extraction."
+ else if(istype(target, /datum/plant_gene/core/weed_chance))
+ if(gene.value < min_wchance)
+ dat += "
This device's extraction capabilities are currently limited to [min_wchance] weed chance. "
+ dat += "Target gene will be degraded to [min_wchance] weed chance on extraction."
if("replace")
dat += "[target.get_name()] gene with [disk.gene.get_name()]?
"
if("insert")
@@ -292,9 +332,22 @@
if("extract")
if(disk && !disk.read_only)
disk.gene = G.Copy()
- if(istype(disk.gene, /datum/plant_gene/core/potency))
+ if(istype(disk.gene, /datum/plant_gene/core))
var/datum/plant_gene/core/gene = disk.gene
- gene.value = min(gene.value, max_extract_pot)
+ if(istype(disk.gene, /datum/plant_gene/core/potency))
+ gene.value = min(gene.value, max_potency)
+ else if(istype(disk.gene, /datum/plant_gene/core/lifespan))
+ gene.value = min(gene.value, max_endurance) //INTENDED
+ else if(istype(disk.gene, /datum/plant_gene/core/endurance))
+ gene.value = min(gene.value, max_endurance)
+ else if(istype(disk.gene, /datum/plant_gene/core/production))
+ gene.value = max(gene.value, min_production)
+ else if(istype(disk.gene, /datum/plant_gene/core/yield))
+ gene.value = min(gene.value, max_yield)
+ else if(istype(disk.gene, /datum/plant_gene/core/weed_rate))
+ gene.value = max(gene.value, min_wrate)
+ else if(istype(disk.gene, /datum/plant_gene/core/weed_chance))
+ gene.value = max(gene.value, min_wchance)
disk.update_name()
QDEL_NULL(seed)
update_icon()
@@ -397,7 +450,7 @@
/obj/item/weapon/disk/plantgene/proc/update_name()
if(gene)
- name = "plant data disk - '[gene.get_name()]'"
+ name = "[gene.get_name()] (Plant Data Disk)"
else
name = "plant data disk"
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index 82abda8e7d6..8e2e83675e0 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -112,6 +112,7 @@
for(var/datum/plant_gene/trait/trait in seed.genes)
trait.on_squash(src, target)
+ reagents.reaction(T)
for(var/A in T)
if(reagents)
reagents.reaction(A)
diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm
index 2e05e3f18a0..1aa5e2048c4 100644
--- a/code/modules/hydroponics/grown/misc.dm
+++ b/code/modules/hydroponics/grown/misc.dm
@@ -1,18 +1,32 @@
-// Weeds
-/obj/item/seeds/weeds
- name = "pack of weed seeds"
- desc = "Yo mang, want some weeds?"
- icon_state = "seed"
- species = "weeds"
+// Starthistle
+/obj/item/seeds/starthistle
+ name = "pack of starthistle seeds"
+ desc = "A robust species of weed that often springs up in-between the cracks of spaceship parking lots"
+ icon_state = "seed-starthistle"
+ species = "starthistle"
plantname = "Starthistle"
- lifespan = 100
+ lifespan = 70
endurance = 50 // damm pesky weeds
maturation = 5
production = 1
- yield = -1
- potency = -1
- growthstages = 4
+ yield = 2
+ potency = 10
+ growthstages = 3
+ growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi'
genes = list(/datum/plant_gene/trait/plant_type/weed_hardy)
+ mutatelist = list(/obj/item/seeds/harebell)
+
+/obj/item/seeds/starthistle/harvest(mob/user)
+ var/obj/machinery/hydroponics/parent = loc
+ var/seed_count = yield
+ if(prob(getYield() * 20))
+ seed_count++
+ var/output_loc = parent.Adjacent(user) ? user.loc : parent.loc
+ for(var/i in 1 to seed_count)
+ var/obj/item/seeds/starthistle/harvestseeds = Copy()
+ harvestseeds.forceMove(output_loc)
+
+ parent.update_tray()
// Cabbage
diff --git a/code/modules/hydroponics/grown/onion.dm b/code/modules/hydroponics/grown/onion.dm
new file mode 100644
index 00000000000..41229481d8d
--- /dev/null
+++ b/code/modules/hydroponics/grown/onion.dm
@@ -0,0 +1,61 @@
+/obj/item/seeds/onion
+ name = "pack of onion seeds"
+ desc = "These seeds grow into onions."
+ icon_state = "seed-onion"
+ species = "onion"
+ plantname = "Onion Sprouts"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/onion
+ lifespan = 20
+ maturation = 3
+ production = 4
+ yield = 6
+ endurance = 25
+ growthstages = 3
+ weed_chance = 3
+ growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi'
+ reagents_add = list("vitamin" = 0.04, "plantmatter" = 0.1)
+ mutatelist = list(/obj/item/seeds/onion/red)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/onion
+ seed = /obj/item/seeds/onion
+ name = "onion"
+ desc = "Nothing to cry over."
+ icon_state = "onion"
+ filling_color = "#C0C9A0"
+ bitesize_mod = 2
+ slice_path = /obj/item/weapon/reagent_containers/food/snacks/onion_slice
+ slices_num = 2
+
+/obj/item/seeds/onion/red
+ name = "pack of red onion seeds"
+ desc = "For growing exceptionally potent onions."
+ icon_state = "seed-onionred"
+ species = "onion_red"
+ plantname = "Red Onion Sprouts"
+ weed_chance = 1
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/onion/red
+ reagents_add = list("vitamin" = 0.04, "plantmatter" = 0.1, "onionjuice" = 0.05)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/onion/red
+ seed = /obj/item/seeds/onion/red
+ name = "red onion"
+ desc = "Purple despite the name."
+ icon_state = "onion_red"
+ filling_color = "#C29ACF"
+ slice_path = /obj/item/weapon/reagent_containers/food/snacks/onion_slice/red
+
+/obj/item/weapon/reagent_containers/food/snacks/onion_slice
+ name = "onion slices"
+ desc = "Rings, not for wearing."
+ icon_state = "onionslice"
+ list_reagents = list("plantmatter" = 5, "vitamin" = 2)
+ filling_color = "#C0C9A0"
+ gender = PLURAL
+ cooked_type = /obj/item/weapon/reagent_containers/food/snacks/onionrings
+
+/obj/item/weapon/reagent_containers/food/snacks/onion_slice/red
+ name = "red onion slices"
+ desc = "They shine like exceptionally low quality amethyst."
+ icon_state = "onionslice_red"
+ filling_color = "#C29ACF"
+ list_reagents = list("plantmatter" = 5, "vitamin" = 2, "onionjuice" = 2.5)
\ No newline at end of file
diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm
index 339459669be..c70def96fde 100644
--- a/code/modules/hydroponics/grown/towercap.dm
+++ b/code/modules/hydroponics/grown/towercap.dm
@@ -50,6 +50,9 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/deus,
/obj/item/weapon/reagent_containers/food/snacks/grown/wheat)
+/obj/item/weapon/grown/log/New()
+ ..()
+ accepted = typecacheof(accepted)
/obj/item/weapon/grown/log/attackby(obj/item/weapon/W, mob/user, params)
if(is_sharp(W))
@@ -66,7 +69,7 @@
to_chat(user, "You add the newly-formed [plank_name] to the stack. It now contains [plank.amount] [plank_name].")
qdel(src)
- if(is_type_in_list(W,accepted))
+ if(is_type_in_typecache(W, accepted))
var/obj/item/weapon/reagent_containers/food/snacks/grown/leaf = W
if(leaf.dry)
user.show_message("You wrap \the [W] around the log, turning it into a torch!")
@@ -138,7 +141,7 @@
/obj/structure/bonfire/proc/CheckOxygen()
var/datum/gas_mixture/G = loc.return_air() // Check if we're standing in an oxygenless environment
- if(G.oxygen > 16)
+ if(G.oxygen > 13)
return 1
return 0
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index c3449514edc..6bac2fc70e8 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -30,6 +30,8 @@
var/lid_state = 0
var/recent_bee_visit = FALSE //Have we been visited by a bee recently, so bees dont overpollinate one plant
var/using_irrigation = FALSE //If the tray is connected to other trays via irrigation hoses
+ var/self_sufficiency_req = 20 //Required total dose to make a self-sufficient hydro tray. 1:1 with earthsblood.
+ var/self_sufficiency_progress = 0
var/self_sustaining = FALSE //If the tray generates nutrients and water on its own
hud_possible = list (PLANT_NUTRIENT_HUD, PLANT_WATER_HUD, PLANT_STATUS_HUD, PLANT_HEALTH_HUD, PLANT_TOXIN_HUD, PLANT_PEST_HUD, PLANT_WEED_HUD)
@@ -358,6 +360,9 @@
if(!self_sustaining)
to_chat(user, "Water: [waterlevel]/[maxwater]")
to_chat(user, "Nutrient: [nutrilevel]/[maxnutri]")
+ if(self_sufficiency_progress > 0)
+ var/percent_progress = round(self_sufficiency_progress * 100 / self_sufficiency_req)
+ to_chat(user, "Treatment for self-sustenance are [percent_progress]% complete.")
else
to_chat(user, "It doesn't require any water or nutrients.")
@@ -392,7 +397,7 @@
if(4 to 5)
myseed = new /obj/item/seeds/plump(src)
else
- myseed = new /obj/item/seeds/weeds(src)
+ myseed = new /obj/item/seeds/starthistle(src)
age = 0
plant_health = myseed.endurance
lastcycle = world.time
@@ -546,6 +551,14 @@
adjustNutri(round(S.get_reagent_amount("fishwater") * 0.75))
adjustWater(round(S.get_reagent_amount("fishwater") * 1))
+ // Ambrosia Gaia produces earthsblood.
+ if(S.has_reagent("earthsblood"))
+ self_sufficiency_progress += S.get_reagent_amount("earthsblood")
+ if(self_sufficiency_progress >= self_sufficiency_req)
+ become_self_sufficient()
+ else if(!self_sustaining)
+ to_chat(user, "[src] warms as it might on a spring day under a genuine Sun.")
+
// Antitoxin binds shit pretty well. So the tox goes significantly down
if(S.has_reagent("charcoal", 1))
adjustToxic(-round(S.get_reagent_amount("charcoal") * 2))
@@ -720,33 +733,7 @@
/obj/machinery/hydroponics/attackby(obj/item/O, mob/user, params)
//Called when mob user "attacks" it with object O
- if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/gaia)) //Checked early on so it doesn't have to deal with composting checks
- if(self_sustaining)
- to_chat(user, "This [name] is already self-sustaining!")
- return
- if(myseed || weedlevel)
- to_chat(user, "[src] needs to be clear of plants and weeds!")
- return
- if(alert(user, "This will make [src] self-sustaining but consume [O] forever. Are you sure?", "[name]", "I'm Sure", "Abort") == "Abort" || !user)
- return
- if(!O || qdeleted(O))
- return
- if(!Adjacent(user))
- return
- if(self_sustaining)
- to_chat(user, "This [name] is already self-sustaining!")
- return
- if(myseed || weedlevel)
- to_chat(user, "[src] needs to be clear of plants and weeds!")
- return
- user.visible_message("[user] gently pulls open the soil for [O] and places it inside.", "You tenderly root [O] into [src].")
- user.drop_item()
- qdel(O)
- visible_message("[src] begins to glow with a beautiful light!")
- self_sustaining = TRUE
- update_icon()
-
- else if(istype(O, /obj/item/weapon/reagent_containers) ) // Syringe stuff (and other reagent containers now too)
+ if(istype(O, /obj/item/weapon/reagent_containers) ) // Syringe stuff (and other reagent containers now too)
var/obj/item/weapon/reagent_containers/reagent_source = O
if(istype(reagent_source, /obj/item/weapon/reagent_containers/syringe))
@@ -988,6 +975,11 @@
var/mob/living/simple_animal/hostile/C = new chosen
C.faction = list("plants")
+/obj/machinery/hydroponics/proc/become_self_sufficient() // Ambrosia Gaia effect
+ visible_message("[src] begins to glow with a beautiful light!")
+ self_sustaining = TRUE
+ update_icon()
+
///Diona Nymph Related Procs///
/obj/machinery/hydroponics/CanPass(atom/movable/mover, turf/target, height=0) //So nymphs can climb over top of trays.
if(height==0)
diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm
index b9b1c8efcc6..efc3d0f594f 100644
--- a/code/modules/hydroponics/plant_genes.dm
+++ b/code/modules/hydroponics/plant_genes.dm
@@ -267,7 +267,7 @@
rate = 0.03
examine_line = "It emits a soft glow."
trait_id = "glow"
- var/glow_color = "#AAD84B"
+ var/glow_color = "#C3E381"
/datum/plant_gene/trait/glow/proc/glow_range(obj/item/seeds/S)
return 1.4 + S.potency*rate
@@ -284,6 +284,7 @@
//adds -potency*(rate*0.05) light power to products
name = "Shadow Emission"
rate = 0.04
+ glow_color = "#AAD84B"
/datum/plant_gene/trait/glow/shadow/glow_power(obj/item/seeds/S)
return -max(S.potency*(rate*0.05), 0.075)
diff --git a/code/modules/mob/living/carbon/carbon_defenses.dm b/code/modules/mob/living/carbon/carbon_defenses.dm
index a570ad50cb3..6878a0f28f7 100644
--- a/code/modules/mob/living/carbon/carbon_defenses.dm
+++ b/code/modules/mob/living/carbon/carbon_defenses.dm
@@ -40,3 +40,7 @@
if(D.IsSpreadByTouch())
ContractDisease(D)
return 0
+
+/mob/living/carbon/is_mouth_covered(head_only = FALSE, mask_only = FALSE)
+ if((!mask_only && head && (head.flags_cover & HEADCOVERSMOUTH)) || (!head_only && wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH)))
+ return TRUE
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 02b87dde494..9783673bc33 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -393,3 +393,10 @@ emp_act
..()
species.water_act(src,volume,temperature,source)
+/mob/living/carbon/human/is_eyes_covered(check_glasses = TRUE, check_head = TRUE, check_mask = TRUE)
+ if(check_glasses && glasses && (glasses.flags_cover & GLASSESCOVERSEYES))
+ return TRUE
+ if(check_head && head && (head.flags_cover & HEADCOVERSEYES))
+ return TRUE
+ if(check_mask && wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH))
+ return TRUE
\ No newline at end of file
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index fa9624aa036..d757aff3ada 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -37,6 +37,11 @@
/mob/living/proc/getarmor(var/def_zone, var/type)
return 0
+/mob/living/proc/is_mouth_covered(head_only = FALSE, mask_only = FALSE)
+ return FALSE
+
+/mob/living/proc/is_eyes_covered(check_glasses = TRUE, check_head = TRUE, check_mask = TRUE)
+ return FALSE
/mob/living/bullet_act(var/obj/item/projectile/P, var/def_zone)
//Armor
diff --git a/code/modules/reagents/chemistry/reagents/food.dm b/code/modules/reagents/chemistry/reagents/food.dm
index db574418725..9b4ffbad1c4 100644
--- a/code/modules/reagents/chemistry/reagents/food.dm
+++ b/code/modules/reagents/chemistry/reagents/food.dm
@@ -492,6 +492,25 @@
M.adjustFireLoss(-1)
..()
+/datum/reagent/consumable/onion
+ name = "Concentrated Onion Juice"
+ id = "onionjuice"
+ description = "A strong tasting substance that can induce partial blindness."
+ color = "#c0c9a0"
+ taste_message = "bitterness"
+
+/datum/reagent/consumable/onion/reaction_mob(mob/living/M, method = TOUCH, volume)
+ if(method == TOUCH)
+ if(!M.is_mouth_covered() && !M.is_eyes_covered())
+ if(!M.get_organ_slot("eyes")) //can't blind somebody with no eyes
+ to_chat(M, "Your eye sockets feel wet.")
+ else
+ if(!M.eye_blurry)
+ to_chat(M, "Tears well up in your eyes!")
+ M.EyeBlind(2)
+ M.EyeBlurry(5)
+ ..()
+
/datum/reagent/consumable/chocolate
name = "Chocolate"
id = "chocolate"
diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi
index d90a19f00b1..2fe44fcddd1 100644
Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ
diff --git a/icons/obj/hydroponics/growing_flowers.dmi b/icons/obj/hydroponics/growing_flowers.dmi
index e1f308c87b4..cceb7491212 100644
Binary files a/icons/obj/hydroponics/growing_flowers.dmi and b/icons/obj/hydroponics/growing_flowers.dmi differ
diff --git a/icons/obj/hydroponics/growing_vegetables.dmi b/icons/obj/hydroponics/growing_vegetables.dmi
index 070d3531a21..9fc1520175e 100644
Binary files a/icons/obj/hydroponics/growing_vegetables.dmi and b/icons/obj/hydroponics/growing_vegetables.dmi differ
diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi
index d5bb7d48acb..bd596597624 100644
Binary files a/icons/obj/hydroponics/harvest.dmi and b/icons/obj/hydroponics/harvest.dmi differ
diff --git a/icons/obj/hydroponics/seeds.dmi b/icons/obj/hydroponics/seeds.dmi
index edc0ee4894f..a84ed3dd730 100644
Binary files a/icons/obj/hydroponics/seeds.dmi and b/icons/obj/hydroponics/seeds.dmi differ
diff --git a/paradise.dme b/paradise.dme
index 1e66e3547b5..1f36a1269a0 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -1399,6 +1399,7 @@
#include "code\modules\hydroponics\grown\mushrooms.dm"
#include "code\modules\hydroponics\grown\nettle.dm"
#include "code\modules\hydroponics\grown\nymph.dm"
+#include "code\modules\hydroponics\grown\onion.dm"
#include "code\modules\hydroponics\grown\peanut.dm"
#include "code\modules\hydroponics\grown\potato.dm"
#include "code\modules\hydroponics\grown\pumpkin.dm"