diff --git a/code/datums/supplypacks/recreation.dm b/code/datums/supplypacks/recreation.dm
index 684ef962f4..7059e43755 100644
--- a/code/datums/supplypacks/recreation.dm
+++ b/code/datums/supplypacks/recreation.dm
@@ -67,4 +67,24 @@
/obj/item/device/pipe_painter = 2,
/obj/item/device/floor_painter = 2,
/obj/item/device/closet_painter = 2
+ )
+
+/datum/supply_pack/recreation/cheapbait
+ name = "Cheap Fishing Bait"
+ cost = 10
+ containername = "cheap bait crate"
+ containertype = /obj/structure/closet/crate/freezer
+ contains = list(
+ /obj/item/weapon/storage/box/wormcan/sickly = 5
+ )
+
+/datum/supply_pack/randomised/recreation/cheapbait
+ name = "Deluxe Fishing Bait"
+ cost = 40
+ containername = "deluxe bait crate"
+ containertype = /obj/structure/closet/crate/freezer
+ num_contained = 8
+ contains = list(
+ /obj/item/weapon/storage/box/wormcan,
+ /obj/item/weapon/storage/box/wormcan/deluxe
)
\ No newline at end of file
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 6801ba303e..29d1108b4e 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -1150,3 +1150,21 @@
/obj/item/toy/plushie/carp = 50,
/obj/item/toy/plushie/deer = 50,
/obj/item/toy/plushie/tabby_cat = 50)
+
+/obj/machinery/vending/fishing
+ name = "loot trawler"
+ desc = "A special vendor for fishing equipment."
+ product_ads = "Tired of trawling across the ocean floor? Get our loot!;Chum and rods.;Don't get baited into fishing without us!;Baby is your star-sign pisces? We'd make a perfect match.;Do not fear, plenty to catch around here.;Don't get reeled in helplessly, get your own rod today!"
+ icon_state = "fishvendor"
+ products = list(/obj/item/weapon/material/fishing_rod/modern/cheap = 6,
+ /obj/item/weapon/storage/box/wormcan = 4,
+ /obj/item/weapon/storage/box/wormcan/sickly = 10,
+ /obj/item/weapon/material/fishing_net = 2,
+ /obj/item/stack/cable_coil/random = 6)
+ prices = list(/obj/item/weapon/material/fishing_rod/modern/cheap = 50,
+ /obj/item/weapon/storage/box/wormcan = 12,
+ /obj/item/weapon/storage/box/wormcan/sickly = 6,
+ /obj/item/weapon/material/fishing_net = 40,
+ /obj/item/stack/cable_coil/random = 4)
+ premium = list(/obj/item/weapon/storage/box/wormcan/deluxe = 1)
+ contraband = list(/obj/item/weapon/storage/box/wormcan/deluxe = 1)
diff --git a/code/game/objects/items/weapons/storage/misc.dm b/code/game/objects/items/weapons/storage/misc.dm
index 9dca5c3edd..b22ef4166f 100644
--- a/code/game/objects/items/weapons/storage/misc.dm
+++ b/code/game/objects/items/weapons/storage/misc.dm
@@ -24,3 +24,46 @@
/obj/item/weapon/storage/box/donut/empty
empty = TRUE
+
+/obj/item/weapon/storage/box/wormcan
+ icon = 'icons/obj/food.dmi'
+ icon_state = "wormcan"
+ name = "can of worms"
+ desc = "You probably do want to open this can of worms."
+ max_storage_space = ITEMSIZE_COST_TINY * 6
+ can_hold = list(
+ /obj/item/weapon/reagent_containers/food/snacks/wormsickly,
+ /obj/item/weapon/reagent_containers/food/snacks/worm,
+ /obj/item/weapon/reagent_containers/food/snacks/wormdeluxe
+ )
+ starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/worm = 6)
+
+/obj/item/weapon/storage/box/wormcan/Initialize()
+ . = ..()
+ update_icon()
+
+/obj/item/weapon/storage/box/wormcan/update_icon(var/itemremoved = 0)
+ if (contents.len == 0)
+ icon_state = "wormcan_empty"
+
+/obj/item/weapon/storage/box/wormcan/sickly
+ icon_state = "wormcan_sickly"
+ name = "can of sickly worms"
+ desc = "You probably don't want to open this can of worms."
+ max_storage_space = ITEMSIZE_COST_TINY * 6
+ starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/wormsickly = 6)
+
+/obj/item/weapon/storage/box/wormcan/sickly/update_icon(var/itemremoved = 0)
+ if (contents.len == 0)
+ icon_state = "wormcan_empty_sickly"
+
+/obj/item/weapon/storage/box/wormcan/deluxe
+ icon_state = "wormcan_deluxe"
+ name = "can of deluxe worms"
+ desc = "You absolutely want to open this can of worms."
+ max_storage_space = ITEMSIZE_COST_TINY * 6
+ starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/wormdeluxe = 6)
+
+/obj/item/weapon/storage/box/wormcan/deluxe/update_icon(var/itemremoved = 0)
+ if (contents.len == 0)
+ icon_state = "wormcan_empty_deluxe"
\ No newline at end of file
diff --git a/code/game/turfs/simulated/outdoors/outdoors_attackby.dm b/code/game/turfs/simulated/outdoors/outdoors_attackby.dm
new file mode 100644
index 0000000000..e38f601b8b
--- /dev/null
+++ b/code/game/turfs/simulated/outdoors/outdoors_attackby.dm
@@ -0,0 +1,12 @@
+// this code here enables people to dig up worms from certain tiles.
+
+/turf/simulated/floor/outdoors/grass/attackby(obj/item/weapon/S as obj, mob/user as mob)
+ if(istype(S, /obj/item/weapon/shovel))
+ to_chat(user, "You begin to dig in \the [src] with your [S].")
+ if(do_after(user, 4 SECONDS * S.toolspeed))
+ to_chat(user, "\The [src] has been dug up, a worm pops from the ground.")
+ new /obj/item/weapon/reagent_containers/food/snacks/worm(src)
+ else
+ to_chat(user, "You decide to not finish digging in \the [src].")
+ else
+ ..()
\ No newline at end of file
diff --git a/code/modules/fishing/fishing_rod.dm b/code/modules/fishing/fishing_rod.dm
index 7cf6f7457c..6cb8c267fb 100644
--- a/code/modules/fishing/fishing_rod.dm
+++ b/code/modules/fishing/fishing_rod.dm
@@ -87,7 +87,7 @@
if(istype(Bait, bait_type))
var/foodvolume
for(var/datum/reagent/re in Bait.reagents.reagent_list)
- if(re.id == "nutriment" || re.id == "protein" || re.id == "glucose")
+ if(re.id == "nutriment" || re.id == "protein" || re.id == "glucose" || re.id == "fishbait")
foodvolume += re.volume
toolspeed = initial(toolspeed) * min(0.75, (0.5 / max(0.5, (foodvolume / Bait.reagents.maximum_volume))))
@@ -122,3 +122,10 @@
/obj/item/weapon/material/fishing_rod/modern/built
strung = FALSE
+
+/obj/item/weapon/material/fishing_rod/modern/cheap //A rod sold by the fishing vendor. Done so that the rod sold by mining reward vendors doesn't loose its value.
+ name = "cheap fishing rod"
+ desc = "Mass produced, but somewhat reliable."
+ default_material = "plastic"
+
+ toolspeed = 0.9
\ No newline at end of file
diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm
index 0df763fa35..f0c5725aa1 100644
--- a/code/modules/food/food/snacks.dm
+++ b/code/modules/food/food/snacks.dm
@@ -3913,3 +3913,55 @@
reagents.add_reagent("nutriment", 6)
reagents.add_reagent("protein", 4)
bitesize = 3
+
+/obj/item/weapon/reagent_containers/food/snacks/piginblanket
+ name = "pig in a blanket"
+ desc = "A sausage embedded in soft, fluffy pastry. Free this pig from its blanket prison by eating it."
+ icon_state = "piginblanket"
+ nutriment_amt = 6
+ nutriment_desc = list("meat" = 3, "pastry" = 3)
+
+/obj/item/weapon/reagent_containers/food/snacks/piginblanket/Initialize()
+ . = ..()
+ reagents.add_reagent("nutriment", 6)
+ reagents.add_reagent("protein", 4)
+ bitesize = 3
+
+/obj/item/weapon/reagent_containers/food/snacks/wormsickly
+ name = "sickly worm"
+ desc = "A worm, it doesn't look particularily healthy, but it will still serve as good fishing bait."
+ icon_state = "worm_sickly"
+ nutriment_amt = 1
+ nutriment_desc = list("bugflesh" = 1)
+ w_class = ITEMSIZE_TINY
+
+/obj/item/weapon/reagent_containers/food/snacks/wormsickly/Initialize()
+ . = ..()
+ reagents.add_reagent("fishbait", 10)
+ bitesize = 5
+
+/obj/item/weapon/reagent_containers/food/snacks/worm
+ name = "strange worm"
+ desc = "A peculiar worm, freshly plucked from the earth."
+ icon_state = "worm"
+ nutriment_amt = 1
+ nutriment_desc = list("bugflesh" = 1)
+ w_class = ITEMSIZE_TINY
+
+/obj/item/weapon/reagent_containers/food/snacks/worm/Initialize()
+ . = ..()
+ reagents.add_reagent("fishbait", 20)
+ bitesize = 5
+
+/obj/item/weapon/reagent_containers/food/snacks/wormdeluxe
+ name = "deluxe worm"
+ desc = "A fancy worm, genetically engineered to appeal to fish."
+ icon_state = "worm_deluxe"
+ nutriment_amt = 5
+ nutriment_desc = list("bugflesh" = 1)
+ w_class = ITEMSIZE_TINY
+
+/obj/item/weapon/reagent_containers/food/snacks/wormdeluxe/Initialize()
+ . = ..()
+ reagents.add_reagent("fishbait", 40)
+ bitesize = 5
\ No newline at end of file
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm
index ad150f1b4f..dea0a6a987 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm
@@ -529,4 +529,12 @@
M.take_organ_damage(2 * removed, 2 * removed)
M.adjustOxyLoss(4 * removed)
M.adjustToxLoss(2 * removed)
- M.adjustCloneLoss(2 * removed)
\ No newline at end of file
+ M.adjustCloneLoss(2 * removed)
+
+/datum/reagent/fishbait
+ name = "Fish Bait"
+ id = "fishbait"
+ description = "A natural slurry that particularily appeals to fish."
+ taste_description = "earthy"
+ reagent_state = LIQUID
+ color = "#62764E"
\ No newline at end of file
diff --git a/icons/obj/food.dmi b/icons/obj/food.dmi
index ea59c54077..bb1f398a79 100644
Binary files a/icons/obj/food.dmi and b/icons/obj/food.dmi differ
diff --git a/icons/obj/vending.dmi b/icons/obj/vending.dmi
index 962648392c..f77a777e9c 100755
Binary files a/icons/obj/vending.dmi and b/icons/obj/vending.dmi differ
diff --git a/vorestation.dme b/vorestation.dme
index fcdc86702f..72bbd1f10a 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -1322,6 +1322,7 @@
#include "code\game\turfs\simulated\outdoors\dirt.dm"
#include "code\game\turfs\simulated\outdoors\grass.dm"
#include "code\game\turfs\simulated\outdoors\outdoors.dm"
+#include "code\game\turfs\simulated\outdoors\outdoors_attackby.dm"
#include "code\game\turfs\simulated\outdoors\sky.dm"
#include "code\game\turfs\simulated\outdoors\snow.dm"
#include "code\game\turfs\snow\snow.dm"