diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 652a413707..c8c7dbbbfc 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -85,7 +85,7 @@
// Works similarly to worn sprite_sheets, except the alternate sprites are used when the clothing/refit_for_species() proc is called.
var/list/sprite_sheets_obj
- var/toolspeed = 1.0 // This is a multipler on how 'fast' a tool works. e.g. setting this to 0.5 will make the tool work twice as fast.
+ var/toolspeed = 1 // This is a multipler on how 'fast' a tool works. e.g. setting this to 0.5 will make the tool work twice as fast.
var/attackspeed = DEFAULT_ATTACK_COOLDOWN // How long click delay will be when using this, in 1/10ths of a second. Checked in the user's get_attack_speed().
var/reach = 1 // Length of tiles it can reach, 1 is adjacent.
var/addblends // Icon overlay for ADD highlights when applicable.
diff --git a/code/game/objects/items/weapons/material/misc.dm b/code/game/objects/items/weapons/material/misc.dm
index da1ba64a59..333064c3f6 100644
--- a/code/game/objects/items/weapons/material/misc.dm
+++ b/code/game/objects/items/weapons/material/misc.dm
@@ -23,7 +23,20 @@
applies_material_colour = 0
drop_sound = 'sound/items/drop/axe.ogg'
pickup_sound = 'sound/items/pickup/axe.ogg'
+/* VOREStation Removal - We have one already
+/obj/item/weapon/material/knife/machete/hatchet/stone
+ name = "sharp rock"
+ desc = "The secret is to bang the rocks together, guys."
+ force_divisor = 0.2
+ icon_state = "rock"
+ item_state = "rock"
+ attack_verb = list("chopped", "torn", "cut")
+/obj/item/weapon/material/knife/machete/hatchet/stone/set_material(var/new_material)
+ var/old_name = name
+ . = ..()
+ name = old_name
+*/
/obj/item/weapon/material/knife/machete/hatchet/unathiknife
name = "duelling knife"
desc = "A length of leather-bound wood studded with razor-sharp teeth. How crude."
diff --git a/code/game/objects/structures/flora/flora.dm b/code/game/objects/structures/flora/flora.dm
index 96795f446d..8a130c91f5 100644
--- a/code/game/objects/structures/flora/flora.dm
+++ b/code/game/objects/structures/flora/flora.dm
@@ -13,6 +13,7 @@
var/min_x_scale = 0.9
var/min_y_scale = 0.9
+ var/removal_tool = /obj/item/weapon/shovel
var/harvest_tool = null // The type of item used to harvest the plant.
var/harvest_count = 0
var/destroy_on_harvest = FALSE
@@ -40,23 +41,34 @@
. = ..()
if(harvest_count < max_harvests)
. += get_harvestable_desc()
+ if(harvest_tool)
+ var/obj/item/tool = harvest_tool
+ . += SPAN_NOTICE("\The [src] can be harvested with \a [initial(tool.name)].")
+
+ if(removal_tool)
+ var/obj/item/tool = removal_tool
+ . += SPAN_NOTICE("\The [src] can be removed with \a [initial(tool.name)].")
/obj/structure/flora/proc/get_harvestable_desc()
return "\The [src] seems to have something hanging from it."
/obj/structure/flora/attackby(var/obj/item/weapon/W, var/mob/living/user)
+
if(can_harvest(W))
var/harvest_spawn = pickweight(harvest_loot)
var/atom/movable/AM = spawn_harvest(harvest_spawn, user)
-
- if(!AM)
- to_chat(user, "You fail to harvest anything from \the [src].")
-
+ if(AM)
+ to_chat(user, SPAN_NOTICE("You harvest \the [AM] from \the [src]."))
else
- to_chat(user, "You harvest \the [AM] from \the [src].")
- if(harvest_count >= max_harvests && destroy_on_harvest)
- qdel(src)
- return
+ to_chat(user, SPAN_NOTICE("You fail to harvest anything from \the [src]."))
+ return
+
+ if(removal_tool && istype(W, removal_tool))
+ to_chat(user, SPAN_WARNING("You start uprooting \the [src]..."))
+ if(do_after(user, 30))
+ visible_message(SPAN_NOTICE("\The [user] uproots and discards \the [src]!"))
+ qdel(src)
+ return
..(W, user)
@@ -450,19 +462,28 @@
desc = "This is a tiny well lit decorative christmas tree."
icon_state = "plant-xmas"
+/obj/structure/flora/mushroom
+ name = "mushroom"
+ desc = "Hey, this one seems like a fun guy."
+ icon_state = "mush1"
+ icon = 'icons/obj/flora/mushrooms.dmi'
+ harvest_loot = list(/obj/item/weapon/reagent_containers/food/snacks/mushroomslice = 1)
+ harvest_tool = /obj/item/weapon/material/knife
+ max_harvests = 2
+ min_harvests = 0
+
+/obj/structure/flora/mushroom/Initialize()
+ . = ..()
+ icon_state = "mush[rand(1,4)]"
+ if(prob(50))
+ adjust_scale(-1, 1)
+ pixel_x = rand(-4, 4)
+
/obj/structure/flora/sif
icon = 'icons/obj/flora/sifflora.dmi'
-/obj/structure/flora/sif/attack_hand(mob/user)
- if (user.a_intent == I_HURT)
- if(do_after(user, 5 SECONDS))
- user.visible_message("\The [user] digs up \the [src.name].", "You dig up \the [src.name].")
- qdel(src)
- else
- user.visible_message("\The [user] pokes \the [src.name].", "You poke \the [src.name].")
-
/datum/category_item/catalogue/flora/subterranean_bulbs
- name = "Sivian Flora - Subterranean Bulbs"
+ name = "Sivian Flora - Cavebulbs"
desc = "A plant which is native to Sif, it continues the trend of being a bioluminescent specimen. These plants \
are generally suited for conditions experienced in caverns, which are generally dark and cold. It is not \
known why this plant evolved to be bioluminescent, however this property has, unintentionally, allowed for \
@@ -475,7 +496,7 @@
value = CATALOGUER_REWARD_EASY
/obj/structure/flora/sif/subterranean
- name = "subterranean plant"
+ name = "subterranean bulbs"
desc = "This is a subterranean plant. It's bulbous ends glow faintly."
icon_state = "glowplant"
light_range = 2
@@ -483,12 +504,15 @@
light_color = "#FF6633"
light_on = TRUE
catalogue_data = list(/datum/category_item/catalogue/flora/subterranean_bulbs)
+ harvest_loot = list(/obj/item/weapon/reagent_containers/food/snacks/grown/sif/cavebulbs = 1)
+ harvest_tool = /obj/item/weapon/material/knife
+ max_harvests = 2
+ min_harvests = 0
/obj/structure/flora/sif/subterranean/Initialize()
icon_state = "[initial(icon_state)][rand(1,2)]"
. = ..()
-
/datum/category_item/catalogue/flora/eyebulbs
name = "Sivian Flora - Eyebulbs"
desc = "A plant native to Sif. On the end of its stems are bulbs which visually resemble \
@@ -497,10 +521,14 @@
value = CATALOGUER_REWARD_EASY
/obj/structure/flora/sif/eyes
- name = "mysterious bulbs"
- desc = "This is a mysterious looking plant. They kind of look like eyeballs. Creepy."
+ name = "eyebulbs"
+ desc = "This is a mysterious-looking plant. They kind of look like eyeballs. Creepy."
icon_state = "eyeplant"
catalogue_data = list(/datum/category_item/catalogue/flora/eyebulbs)
+ harvest_tool = /obj/item/weapon/material/knife
+ max_harvests = 2
+ min_harvests = 0
+ harvest_loot = list(/obj/item/weapon/reagent_containers/food/snacks/grown/sif/eyebulbs = 1)
/obj/structure/flora/sif/eyes/Initialize()
icon_state = "[initial(icon_state)][rand(1,3)]"
@@ -514,20 +542,20 @@
value = CATALOGUER_REWARD_TRIVIAL
/obj/structure/flora/sif/tendrils
- name = "stocky tendrils"
+ name = "wabback tendrils"
desc = "A 'plant' made up of hardened moss. It has tiny hairs that bunch together to look like snow."
icon_state = "grass"
randomize_size = TRUE
catalogue_data = list(/datum/category_item/catalogue/flora/mosstendrils)
harvest_tool = /obj/item/weapon/material/knife
- max_harvests = 1
- min_harvests = -4
+ max_harvests = 3
+ min_harvests = 0
harvest_loot = list(
- /obj/item/seeds/wabback = 15,
- /obj/item/seeds/blackwabback = 1,
- /obj/item/seeds/wildwabback = 30
- )
+ /obj/item/weapon/reagent_containers/food/snacks/grown/sif/wabback = 15,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/sif/blackwabback = 1,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/sif/wildwabback = 30
+ )
/obj/structure/flora/sif/tendrils/Initialize()
icon_state = "[initial(icon_state)][rand(1,3)]"
@@ -546,26 +574,24 @@
value = CATALOGUER_REWARD_HARD
/obj/structure/flora/sif/frostbelle
- name = "gnarly shrub"
+ name = "frostbelle shrub"
desc = "A stocky plant with fins bearing luminescent veins along its branches."
- icon_state = "grass"
+ icon_state = "frostbelle"
randomize_size = TRUE
catalogue_data = list(/datum/category_item/catalogue/flora/frostbelle)
harvest_tool = /obj/item/weapon/material/knife
max_harvests = 2
- min_harvests = -4
+ min_harvests = 0
harvest_loot = list(
/obj/item/weapon/reagent_containers/food/snacks/frostbelle = 1
- )
+ )
var/variantnum = null
/obj/structure/flora/sif/frostbelle/Initialize()
. = ..()
-
variantnum = rand(1,3)
-
update_icon()
/obj/structure/flora/sif/frostbelle/update_icon()
@@ -573,7 +599,6 @@
if(max_harvests > 0 && harvest_count < max_harvests)
icon_state = "[initial(icon_state)][variantnum]"
-
else
icon_state = initial(icon_state)
diff --git a/code/game/objects/structures/flora/trees.dm b/code/game/objects/structures/flora/trees.dm
index 3598523671..ff1a99cd0c 100644
--- a/code/game/objects/structures/flora/trees.dm
+++ b/code/game/objects/structures/flora/trees.dm
@@ -272,12 +272,12 @@
harvest_tool = /obj/item/weapon/material/knife
max_harvests = 2
- min_harvests = -4
+ min_harvests = 0
harvest_loot = list(
/obj/item/weapon/reagent_containers/food/snacks/siffruit = 20,
- /obj/item/weapon/reagent_containers/food/snacks/grown/sifpod = 5,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/sif/sifpod = 5,
/obj/item/seeds/sifbulb = 1
- )
+ )
var/light_shift = 0
diff --git a/code/game/turfs/flooring/flooring.dm b/code/game/turfs/flooring/flooring.dm
index 4f83f297c7..ba7429eec4 100644
--- a/code/game/turfs/flooring/flooring.dm
+++ b/code/game/turfs/flooring/flooring.dm
@@ -143,7 +143,7 @@ var/list/flooring_types
/decl/flooring/grass/sif // Subtype for Sif's grass.
name = "growth"
desc = "A natural moss that has adapted to the sheer cold climate."
- flags = TURF_REMOVE_SHOVEL
+ flags = 0
icon = 'icons/turf/outdoors.dmi'
icon_base = "grass_sif"
build_type = /obj/item/stack/tile/grass/sif
@@ -152,7 +152,7 @@ var/list/flooring_types
/decl/flooring/grass/sif/forest
name = "thick growth"
desc = "A natural moss that has adapted to the sheer cold climate."
- flags = TURF_REMOVE_SHOVEL
+ flags = 0
icon = 'icons/turf/outdoors.dmi'
icon_base = "grass_sif_dark"
build_type = /obj/item/stack/tile/grass/sif/forest
diff --git a/code/game/turfs/simulated/outdoors/dirt.dm b/code/game/turfs/simulated/outdoors/dirt.dm
index b02bbdd9f0..e4e97388f9 100644
--- a/code/game/turfs/simulated/outdoors/dirt.dm
+++ b/code/game/turfs/simulated/outdoors/dirt.dm
@@ -1,7 +1,8 @@
-/turf/simulated/floor/outdoors/dirt
- name = "dirt"
- desc = "Quite dirty!"
- icon_state = "dirt-dark"
- edge_blending_priority = 2
- turf_layers = list(/turf/simulated/floor/outdoors/rocks)
- initial_flooring = /decl/flooring/dirt
+/turf/simulated/floor/outdoors/dirt
+ name = "dirt"
+ desc = "Quite dirty!"
+ icon_state = "dirt-dark"
+ edge_blending_priority = 2
+ turf_layers = list(/turf/simulated/floor/outdoors/rocks)
+ initial_flooring = /decl/flooring/dirt
+ can_dig = TRUE
diff --git a/code/game/turfs/simulated/outdoors/grass.dm b/code/game/turfs/simulated/outdoors/grass.dm
index 65d0e472f1..41aa084773 100644
--- a/code/game/turfs/simulated/outdoors/grass.dm
+++ b/code/game/turfs/simulated/outdoors/grass.dm
@@ -7,6 +7,7 @@ var/list/grass_types = list(
icon_state = "grass0"
edge_blending_priority = 4
initial_flooring = /decl/flooring/grass/outdoors // VOREStation Edit
+ can_dig = TRUE
turf_layers = list(
/turf/simulated/floor/outdoors/rocks,
/turf/simulated/floor/outdoors/dirt
@@ -42,7 +43,6 @@ var/list/grass_types = list(
var/tree_chance = 2
/*
animal_chance = 0.5
-
animal_types = list(
/mob/living/simple_mob/animal/sif/diyaab = 10,
/mob/living/simple_mob/animal/sif/glitterfly = 2,
@@ -96,4 +96,3 @@ var/list/grass_types = list(
/obj/structure/flora/sif/eyes = 5,
/obj/structure/flora/sif/tendrils = 30
)
-
diff --git a/code/game/turfs/simulated/outdoors/outdoors.dm b/code/game/turfs/simulated/outdoors/outdoors.dm
index 84c91366f1..07d382a161 100644
--- a/code/game/turfs/simulated/outdoors/outdoors.dm
+++ b/code/game/turfs/simulated/outdoors/outdoors.dm
@@ -24,6 +24,42 @@ var/list/turf_edge_cache = list()
// When a turf gets demoted or promoted, this list gets adjusted. The top-most layer is the layer on the bottom of the list, due to how pop() works.
var/list/turf_layers = list(/turf/simulated/floor/outdoors/rocks)
+ var/can_dig = FALSE
+ var/loot_count
+
+/turf/simulated/floor/outdoors/proc/get_loot_type()
+ if(loot_count && prob(60))
+ return pick( \
+ 12;/obj/item/weapon/reagent_containers/food/snacks/worm, \
+ 1;/obj/item/weapon/material/knife/machete/hatchet/stone \
+ )
+
+/turf/simulated/floor/outdoors/Initialize(mapload)
+ . = ..()
+ if(can_dig && prob(33))
+ loot_count = rand(1,3)
+
+/turf/simulated/floor/outdoors/attackby(obj/item/C, mob/user)
+
+ if(can_dig && istype(C, /obj/item/weapon/shovel))
+ to_chat(user, SPAN_NOTICE("\The [user] begins digging into \the [src] with \the [C]."))
+ var/delay = (3 SECONDS * C.toolspeed)
+ user.setClickCooldown(delay)
+ if(do_after(user, delay, src))
+ if(!(locate(/obj/machinery/portable_atmospherics/hydroponics/soil) in contents))
+ var/obj/machinery/portable_atmospherics/hydroponics/soil/soil = new(src)
+ user.visible_message(SPAN_NOTICE("\The [src] digs \a [soil] into \the [src]."))
+ else
+ var/loot_type = get_loot_type()
+ if(loot_type)
+ loot_count--
+ var/obj/item/loot = new loot_type(src)
+ to_chat(user, SPAN_NOTICE("You dug up \a [loot]!"))
+ else
+ to_chat(user, SPAN_NOTICE("You didn't find anything of note in \the [src]."))
+ return
+
+ . = ..()
/turf/simulated/floor/Initialize(mapload)
if(is_outdoors())
@@ -80,6 +116,7 @@ var/list/turf_edge_cache = list()
icon_state = "mud_dark"
edge_blending_priority = 3
initial_flooring = /decl/flooring/mud
+ can_dig = TRUE
/turf/simulated/floor/outdoors/rocks
name = "rocks"
diff --git a/code/game/turfs/simulated/outdoors/outdoors_attackby.dm b/code/game/turfs/simulated/outdoors/outdoors_attackby.dm
index a59676834f..1a969fee98 100644
--- a/code/game/turfs/simulated/outdoors/outdoors_attackby.dm
+++ b/code/game/turfs/simulated/outdoors/outdoors_attackby.dm
@@ -1,15 +1,7 @@
// 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 if(istype(S, /obj/item/stack/tile/floor))
+ if(istype(S, /obj/item/stack/tile/floor))
ChangeTurf(/turf/simulated/floor, preserve_outdoors = TRUE)
return
- else
- ..()
\ No newline at end of file
+ . = ..()
\ No newline at end of file
diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm
index 300b8d87f9..d92499f29b 100644
--- a/code/modules/food/food/snacks.dm
+++ b/code/modules/food/food/snacks.dm
@@ -842,47 +842,18 @@
/obj/item/weapon/reagent_containers/food/snacks/carpmeat/Initialize()
. = ..()
- reagents.add_reagent("protein", 3)
- reagents.add_reagent(toxin_type, toxin_amount)
-
-/obj/item/weapon/reagent_containers/food/snacks/crabmeat
- name = "crab legs"
- desc = "... Coffee? Is that you?"
- icon_state = "crabmeat"
- bitesize = 1
-
-/obj/item/weapon/reagent_containers/food/snacks/crabmeat/Initialize()
- . = ..()
- reagents.add_reagent("seafood", 2)
-
-/obj/item/weapon/reagent_containers/food/snacks/crab_legs
- name = "steamed crab legs"
- desc = "Crab legs steamed and buttered to perfection. One day when the boss gets hungry..."
- icon_state = "crablegs"
- nutriment_amt = 2
- nutriment_desc = list("savory butter" = 2)
- bitesize = 2
- trash = /obj/item/trash/plate
-
-/obj/item/weapon/reagent_containers/food/snacks/crab_legs/Initialize()
- . = ..()
- reagents.add_reagent("seafood", 6)
- reagents.add_reagent("sodiumchloride", 1)
-
-/obj/item/weapon/reagent_containers/food/snacks/carpmeat/sif
- desc = "A fillet of sivian fish meat."
- filling_color = "#2c2cff"
- color = "#2c2cff"
- toxin_type = "neurotoxic_protein"
- toxin_amount = 2
-
-/obj/item/weapon/reagent_containers/food/snacks/carpmeat/sif/murkfish
- toxin_type = "murk_protein"
+ reagents.add_reagent("seafood", 3)
+ if(toxin_type && toxin_amount)
+ reagents.add_reagent(toxin_type, toxin_amount)
/obj/item/weapon/reagent_containers/food/snacks/carpmeat/fish
desc = "A fillet of fish meat."
- toxin_type = "neurotoxic_protein"
- toxin_amount = 1
+ toxin_type = null
+
+/obj/item/weapon/reagent_containers/food/snacks/carpmeat/fish/sif
+ desc = "A fillet of sivian fish meat."
+ filling_color = "#2c2cff"
+ color = "#2c2cff"
/obj/item/weapon/reagent_containers/food/snacks/fishfingers
name = "Fish Fingers"
@@ -894,7 +865,7 @@
/obj/item/weapon/reagent_containers/food/snacks/fishfingers/Initialize()
. = ..()
- reagents.add_reagent("protein", 4)
+ reagents.add_reagent("seafood", 4)
/obj/item/weapon/reagent_containers/food/snacks/zestfish
name = "Zesty Fish"
@@ -906,11 +877,11 @@
/obj/item/weapon/reagent_containers/food/snacks/zestfish/Initialize()
. = ..()
- reagents.add_reagent("protein", 4)
+ reagents.add_reagent("seafood", 4)
-/obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice
- name = "huge mushroom slice"
- desc = "A slice from a huge mushroom."
+/obj/item/weapon/reagent_containers/food/snacks/mushroomslice
+ name = "mushroom slice"
+ desc = "A slice of mushroom."
icon_state = "hugemushroomslice"
filling_color = "#E0D7C5"
center_of_mass = list("x"=17, "y"=16)
@@ -918,7 +889,7 @@
nutriment_desc = list("raw" = 2, "mushroom" = 2)
bitesize = 6
-/obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice/Initialize()
+/obj/item/weapon/reagent_containers/food/snacks/mushroomslice/Initialize()
. = ..()
reagents.add_reagent("psilocybin", 3)
@@ -3941,7 +3912,8 @@
/obj/item/weapon/reagent_containers/food/snacks/rawcutlet/Initialize()
. = ..()
- reagents.add_reagent("protein", 1)
+ reagents.add_reagent("fishbait", 9)
+ reagents.add_reagent("protein", 3)
/obj/item/weapon/reagent_containers/food/snacks/cutlet
name = "cutlet"
@@ -3953,7 +3925,8 @@
/obj/item/weapon/reagent_containers/food/snacks/cutlet/Initialize()
. = ..()
- reagents.add_reagent("protein", 2)
+ reagents.add_reagent("fishbait", 15)
+ reagents.add_reagent("protein", 5)
/obj/item/weapon/reagent_containers/food/snacks/rawmeatball
name = "raw meatball"
@@ -3965,7 +3938,8 @@
/obj/item/weapon/reagent_containers/food/snacks/rawmeatball/Initialize()
. = ..()
- reagents.add_reagent("protein", 2)
+ reagents.add_reagent("fishbait", 30)
+ reagents.add_reagent("protein", 10)
/obj/item/weapon/reagent_containers/food/snacks/hotdog
name = "hotdog"
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index bf83e28bf7..24c5ca9b46 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -185,13 +185,17 @@
pocell.charge = pocell.maxcharge
qdel(src)
return
- else if(W.sharp)
+
+ if(W.sharp)
+
if(seed.kitchen_tag == "pumpkin") // Ugggh these checks are awful.
user.show_message("You carve a face into [src]!", 1)
new /obj/item/clothing/head/pumpkinhead (user.loc)
qdel(src)
return
- else if(seed.chems)
+
+ if(seed.chems)
+
if(W.sharp && W.edge && !isnull(seed.chems["woodpulp"]))
user.show_message("You make planks out of \the [src]!", 1)
playsound(src, 'sound/effects/woodcutting.ogg', 50, 1)
@@ -209,36 +213,49 @@
to_chat(user, "You add the newly-formed wood to the stack. It now contains [NG.amount] planks.")
qdel(src)
return
- else if(!isnull(seed.chems["potato"]))
+
+ if(seed.kitchen_tag == "sunflower")
+ new /obj/item/weapon/reagent_containers/food/snacks/rawsunflower(get_turf(src))
+ to_chat(user, SPAN_NOTICE("You remove the seeds from the flower, slightly damaging them."))
+ qdel(src)
+ return
+
+ if(seed.kitchen_tag == "potato" || !isnull(seed.chems["potato"]))
to_chat(user, "You slice \the [src] into sticks.")
new /obj/item/weapon/reagent_containers/food/snacks/rawsticks(get_turf(src))
qdel(src)
return
- else if(!isnull(seed.chems["carrotjuice"]))
+
+ if(!isnull(seed.chems["carrotjuice"]))
to_chat(user, "You slice \the [src] into sticks.")
new /obj/item/weapon/reagent_containers/food/snacks/carrotfries(get_turf(src))
qdel(src)
return
- else if(!isnull(seed.chems["pineapplejuice"]))
+
+ if(!isnull(seed.chems["pineapplejuice"]))
to_chat(user, "You slice \the [src] into rings.")
new /obj/item/weapon/reagent_containers/food/snacks/pineapple_ring(get_turf(src))
qdel(src)
return
- else if(!isnull(seed.chems["soymilk"]))
+
+ if(!isnull(seed.chems["soymilk"]))
to_chat(user, "You roughly chop up \the [src].")
new /obj/item/weapon/reagent_containers/food/snacks/soydope(get_turf(src))
qdel(src)
return
- else if(seed.get_trait(TRAIT_FLESH_COLOUR))
+
+ if(seed.get_trait(TRAIT_FLESH_COLOUR))
to_chat(user, "You slice up \the [src].")
var/slices = rand(3,5)
var/reagents_to_transfer = round(reagents.total_volume/slices)
for(var/i=1; i<=slices; i++)
var/obj/item/weapon/reagent_containers/food/snacks/fruit_slice/F = new(get_turf(src),seed)
- if(reagents_to_transfer) reagents.trans_to_obj(F,reagents_to_transfer)
+ if(reagents_to_transfer)
+ reagents.trans_to_obj(F,reagents_to_transfer)
qdel(src)
return
- ..()
+
+ . = ..()
/obj/item/weapon/reagent_containers/food/snacks/grown/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone)
. = ..()
diff --git a/code/modules/hydroponics/grown_predefined.dm b/code/modules/hydroponics/grown_predefined.dm
index d8187fb24e..643d27030a 100644
--- a/code/modules/hydroponics/grown_predefined.dm
+++ b/code/modules/hydroponics/grown_predefined.dm
@@ -3,6 +3,3 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiadeus
plantname = "ambrosiadeus"
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/sifpod
- plantname = "sifbulb"
diff --git a/code/modules/hydroponics/grown_sif.dm b/code/modules/hydroponics/grown_sif.dm
new file mode 100644
index 0000000000..3075fc148f
--- /dev/null
+++ b/code/modules/hydroponics/grown_sif.dm
@@ -0,0 +1,39 @@
+/obj/item/weapon/reagent_containers/food/snacks/grown/sif
+ var/seeds = 0
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/sif/Initialize(mapload, planttype) // Wild Sifplants have some seeds you can extract with a knife.
+ . = ..()
+ seeds = rand(1, 2)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/sif/examine(mob/user)
+ . = ..()
+ if(seeds)
+ to_chat(user, SPAN_NOTICE("You can see [seeds] seed\s in \the [src]. You might be able to extract them with a sharp object."))
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/sif/attackby(var/obj/item/weapon/W, var/mob/living/user)
+ if(seed && W.sharp && seeds > 0)
+ var/take_seeds = min(seeds, rand(1,2))
+ seeds -= take_seeds
+ to_chat(user, SPAN_NOTICE("You stick \the [W] into \the [src] and lever out [take_seeds] seed\s."))
+ for(var/i = 1 to take_seeds)
+ new /obj/item/seeds(get_turf(src), seed.name)
+ return
+ . = ..()
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/sif/sifpod
+ plantname = "sifbulb"
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/sif/wabback
+ plantname = "wabback"
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/sif/blackwabback
+ plantname = "blackwabback"
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/sif/wildwabback
+ plantname = "wildwabback"
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/sif/eyebulbs
+ plantname = "eyebulbs"
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/sif/cavebulbs
+ plantname = "cavebulbs"
diff --git a/code/modules/hydroponics/seed_packets.dm b/code/modules/hydroponics/seed_packets.dm
index 08eea609bf..c228617712 100644
--- a/code/modules/hydroponics/seed_packets.dm
+++ b/code/modules/hydroponics/seed_packets.dm
@@ -13,7 +13,9 @@ GLOBAL_LIST_BOILERPLATE(all_seed_packs, /obj/item/seeds)
var/datum/seed/seed
var/modified = 0
-/obj/item/seeds/Initialize()
+/obj/item/seeds/Initialize(var/ml, var/_seed_type)
+ if(_seed_type in SSplants.seeds)
+ seed_type = _seed_type
update_seed()
. = ..()
diff --git a/code/modules/hydroponics/seedtypes/apples.dm b/code/modules/hydroponics/seedtypes/apples.dm
index 7044a0c6dc..4bd8a0bade 100644
--- a/code/modules/hydroponics/seedtypes/apples.dm
+++ b/code/modules/hydroponics/seedtypes/apples.dm
@@ -43,7 +43,7 @@
/datum/seed/apple/sif
name = "sifbulb"
- seed_name = "sivian tree"
+ seed_name = "sivian pod"
display_name = "sivian pod"
kitchen_tag = "apple"
chems = list("nutriment" = list(1,5),"sifsap" = list(10,20))
diff --git a/code/modules/hydroponics/trays/tray_soil.dm b/code/modules/hydroponics/trays/tray_soil.dm
index f396b00dbf..43c918507b 100644
--- a/code/modules/hydroponics/trays/tray_soil.dm
+++ b/code/modules/hydroponics/trays/tray_soil.dm
@@ -32,6 +32,16 @@
/obj/machinery/portable_atmospherics/hydroponics/soil/CanPass()
return 1
+/obj/machinery/portable_atmospherics/hydroponics/soil/attackby(obj/item/O, mob/user)
+ if(istype(O, /obj/item/weapon/shovel) && user.a_intent == I_HURT)
+ user.visible_message(SPAN_NOTICE("\The [user] begins filling in \the [src]."))
+ if(do_after(user, 3 SECONDS) && !QDELETED(src))
+ user.visible_message(SPAN_NOTICE("\The [user] fills in \the [src]."))
+ qdel(src)
+ return
+ . = ..()
+
+
// Holder for vine plants.
// Icons for plants are generated as overlays, so setting it to invisible wouldn't work.
// Hence using a blank icon.
diff --git a/code/modules/materials/materials/organic/wood.dm b/code/modules/materials/materials/organic/wood.dm
index 6b2fb2ca06..93b642af74 100644
--- a/code/modules/materials/materials/organic/wood.dm
+++ b/code/modules/materials/materials/organic/wood.dm
@@ -45,7 +45,9 @@
new /datum/stack_recipe("noticeboard", /obj/structure/noticeboard, 1, recycle_material = "[name]"),
new /datum/stack_recipe("tanning rack", /obj/structure/tanning_rack, 3, one_per_turf = TRUE, time = 20, on_floor = TRUE, supplied_material = "[name]"),
new /datum/stack_recipe("painting easel", /obj/structure/easel, 5, one_per_turf = TRUE, time = 20, on_floor = TRUE, supplied_material = "[name]"),
- new /datum/stack_recipe("painting frame", /obj/item/frame/painting, 5, one_per_turf = TRUE, time = 20, on_floor = TRUE, supplied_material = "[name]")
+ new /datum/stack_recipe("painting frame", /obj/item/frame/painting, 5, one_per_turf = TRUE, time = 20, on_floor = TRUE, supplied_material = "[name]"),
+ new /datum/stack_recipe("roofing tile", /obj/item/stack/tile/roofing, 3, 4, 20, recycle_material = "[name]"),
+ new /datum/stack_recipe("shovel", /obj/item/weapon/shovel/wood, 2, time = 10, on_floor = TRUE, supplied_material = "[name]")
)
/datum/material/wood/sif
diff --git a/code/modules/materials/sheets/organic/tanning/hide.dm b/code/modules/materials/sheets/organic/tanning/hide.dm
index e9617ba921..26894dcaf6 100644
--- a/code/modules/materials/sheets/organic/tanning/hide.dm
+++ b/code/modules/materials/sheets/organic/tanning/hide.dm
@@ -20,7 +20,7 @@
//visible message on mobs is defined as visible_message(var/message, var/self_message, var/blind_message)
user.visible_message("\The [user] starts cutting hair off \the [src]", "You start cutting the hair off \the [src]", "You hear the sound of a knife rubbing against flesh")
var/scraped = 0
- while(amount > 0 && do_after(user, 2.5 SECONDS)) // 2.5s per hide
+ while(amount > 0 && do_after(user, 2.5 SECONDS, user))
//Try locating an exisitng stack on the tile and add to there if possible
var/obj/item/stack/hairlesshide/H = null
for(var/obj/item/stack/hairlesshide/HS in user.loc) // Could be scraping something inside a locker, hence the .loc, not get_turf
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index 2f744ac7c5..2c661ba062 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -128,6 +128,26 @@
edge = TRUE
var/digspeed = 40
+/obj/item/weapon/shovel/wood
+ icon_state = "whiteshovel"
+ item_state = "whiteshovel"
+ var/datum/material/material
+
+/obj/item/weapon/shovel/wood/Initialize(var/ml, var/_mat)
+ . = ..()
+ material = get_material_by_name(_mat)
+ if(!istype(material))
+ material = null
+ else
+ name = "[material.display_name] shovel"
+ matter = list("[material.name]" = 50)
+ update_icon()
+
+/obj/item/weapon/shovel/wood/update_icon()
+ . = ..()
+ color = material ? material.icon_colour : initial(color)
+ alpha = min(max(255 * material.opacity, 80), 255)
+
/obj/item/weapon/shovel/spade
name = "spade"
desc = "A small tool for digging and moving dirt."
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index aea40de035..0c6c8b44ad 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -6,24 +6,25 @@ var/list/mining_overlay_cache = list()
icon = 'icons/turf/walls.dmi'
icon_state = "rock-dark"
density = TRUE
-
+
/turf/simulated/mineral //wall piece
name = "rock"
icon = 'icons/turf/walls.dmi'
icon_state = "rock"
- var/rock_side_icon_state = "rock_side"
- var/sand_icon_state = "asteroid"
- var/rock_icon_state = "rock"
- var/random_icon = 0
oxygen = 0
nitrogen = 0
opacity = 1
density = TRUE
blocks_air = 1
temperature = T0C
-
can_dirty = FALSE
+ var/floor_name = "sand"
+ var/rock_side_icon_state = "rock_side"
+ var/sand_icon_state = "asteroid"
+ var/rock_icon_state = "rock"
+ var/random_icon = 0
+
var/ore/mineral
var/sand_dug
var/mined_ore = 0
@@ -65,6 +66,10 @@ var/list/mining_overlay_cache = list()
has_resources = 1
+/turf/simulated/mineral/ChangeTurf(turf/N, tell_universe, force_lighting_update, preserve_outdoors)
+ clear_ore_effects()
+ . = ..()
+
// Alternative rock wall sprites.
/turf/simulated/mineral/light
icon_state = "rock-light"
@@ -109,6 +114,14 @@ var/list/mining_overlay_cache = list()
blocks_air = 0
can_build_into_floor = TRUE
+/turf/simulated/mineral/floor/mud
+ icon_state = "mud"
+ sand_icon_state = "mud"
+
+/turf/simulated/mineral/floor/dirt
+ icon_state = "dirt"
+ sand_icon_state = "dirt"
+
//Alternative sand floor sprite.
/turf/simulated/mineral/floor/light
icon_state = "sand-light"
@@ -140,6 +153,7 @@ var/list/mining_overlay_cache = list()
opacity = 0
blocks_air = 0
can_build_into_floor = TRUE
+ clear_ore_effects()
update_general()
/turf/simulated/mineral/proc/make_wall()
@@ -223,7 +237,7 @@ var/list/mining_overlay_cache = list()
//We are a sand floor
else
- name = "sand"
+ name = floor_name
icon = 'icons/turf/flooring/asteroid.dmi'
icon_state = sand_icon_state
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm
index a4fb4f4078..408969d16a 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm
@@ -129,7 +129,7 @@
catalogue_data = list(/datum/category_item/catalogue/fauna/javelin)
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat/sif
+ meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat/fish/sif
/datum/category_item/catalogue/fauna/icebass
name = "Sivian Fauna - Glitter Bass"
@@ -156,7 +156,7 @@
catalogue_data = list(/datum/category_item/catalogue/fauna/icebass)
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat/sif
+ meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat/fish/sif
var/max_red = 150
var/min_red = 50
@@ -245,7 +245,7 @@
var/image/head_image
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat/sif
+ meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat/fish/sif
/mob/living/simple_mob/animal/passive/fish/rockfish/Initialize()
. = ..()
@@ -292,7 +292,7 @@
has_eye_glow = TRUE
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat/sif
+ meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat/fish/sif
/datum/category_item/catalogue/fauna/murkin
name = "Sivian Fauna - Murkfish"
@@ -319,4 +319,4 @@
catalogue_data = list(/datum/category_item/catalogue/fauna/murkin)
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat/sif/murkfish
+ meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat/fish/sif
diff --git a/code/modules/random_map/random_map.dm b/code/modules/random_map/random_map.dm
index d36e7a80a1..a563f16c11 100644
--- a/code/modules/random_map/random_map.dm
+++ b/code/modules/random_map/random_map.dm
@@ -24,6 +24,9 @@ var/global/list/map_count = list()
var/floor_type = /turf/simulated/floor
var/target_turf_type
+ var/skip_dense = FALSE
+ var/keep_outside = FALSE
+
// Storage for the final iteration of the map.
var/list/map = list() // Actual map.
@@ -61,11 +64,16 @@ var/global/list/map_count = list()
rand_seed(seed)
priority_process = 1
+ var/failed = FALSE
for(var/i = 0;i[capitalize(name)] generation completed in [round(0.1*(world.timeofday-start_time),0.1)] seconds.", R_DEBUG)
- return
- if(!do_not_announce) admin_notice("[capitalize(name)] failed to generate ([round(0.1*(world.timeofday-start_time),0.1)] seconds): could not produce sane map.", R_DEBUG)
+ if(!generate())
+ failed = TRUE
+
+ if(!do_not_announce)
+ if(!failed)
+ admin_notice("[capitalize(name)] generation completed in [round(0.1*(world.timeofday-start_time),0.1)] seconds.", R_DEBUG)
+ else
+ admin_notice("[capitalize(name)] failed to generate ([round(0.1*(world.timeofday-start_time),0.1)] seconds): could not produce sane map.", R_DEBUG)
/datum/random_map/proc/get_map_cell(var/x,var/y)
if(!map)
@@ -162,11 +170,11 @@ var/global/list/map_count = list()
if(!current_cell)
return 0
var/turf/T = locate((origin_x-1)+x,(origin_y-1)+y,origin_z)
- if(!T || (target_turf_type && !istype(T,target_turf_type)))
+ if(!T || (skip_dense && T.density) || (target_turf_type && !istype(T,target_turf_type)))
return 0
var/newpath = get_appropriate_path(map[current_cell])
if(newpath)
- T.ChangeTurf(newpath)
+ T.ChangeTurf(newpath, preserve_outdoors = keep_outside)
get_additional_spawns(map[current_cell],T,get_spawn_dir(x, y))
return T
diff --git a/code/modules/reagents/reactions/instant/instant.dm b/code/modules/reagents/reactions/instant/instant.dm
index bb9e443f59..6f49a56ef3 100644
--- a/code/modules/reagents/reactions/instant/instant.dm
+++ b/code/modules/reagents/reactions/instant/instant.dm
@@ -1122,14 +1122,12 @@
name = "Neutralize Carpotoxin"
id = "carpotoxin_neutral"
result = "protein"
- required_reagents = list("radium" = 1, "carpotoxin" = 1, "sifsap" = 1)
- catalysts = list("sifsap" = 10)
- result_amount = 2
+ required_reagents = list("enzyme" = 1, "carpotoxin" = 1, "sifsap" = 1)
+ result_amount = 1
/decl/chemical_reaction/instant/neutralize_spidertoxin
name = "Neutralize Spidertoxin"
id = "spidertoxin_neutral"
result = "protein"
- required_reagents = list("radium" = 1, "spidertoxin" = 1, "sifsap" = 1)
- catalysts = list("sifsap" = 10)
- result_amount = 2
\ No newline at end of file
+ required_reagents = list("enzyme" = 1, "spidertoxin" = 1, "sifsap" = 1)
+ result_amount = 1
\ No newline at end of file
diff --git a/code/modules/reagents/reagents/food_drinks.dm b/code/modules/reagents/reagents/food_drinks.dm
index 457a73b01e..eac9d25471 100644
--- a/code/modules/reagents/reagents/food_drinks.dm
+++ b/code/modules/reagents/reagents/food_drinks.dm
@@ -309,13 +309,6 @@
color = "#FFFFAA"
allergen_type = ALLERGEN_EGGS //Eggs contain egg
-/datum/reagent/nutriment/protein/murk
- name = "murkfin protein"
- id = "murk_protein"
- taste_description = "mud"
- color = "#664330"
- allergen_type = ALLERGEN_FISH //Murkfin is fish
-
/datum/reagent/nutriment/honey
name = "Honey"
id = "honey"
diff --git a/code/modules/reagents/reagents/other.dm b/code/modules/reagents/reagents/other.dm
index b6775e1759..722fcbd59c 100644
--- a/code/modules/reagents/reagents/other.dm
+++ b/code/modules/reagents/reagents/other.dm
@@ -631,10 +631,11 @@
M.adjustToxLoss(2 * removed)
M.adjustCloneLoss(2 * removed)
-/datum/reagent/fishbait
+/datum/reagent/nutriment/fishbait
name = "Fish Bait"
id = "fishbait"
description = "A natural slurry that particularily appeals to fish."
- taste_description = "earthy"
+ taste_description = "slimy dirt"
reagent_state = LIQUID
- color = "#62764E"
\ No newline at end of file
+ color = "#62764E"
+ nutriment_factor = 15
diff --git a/code/modules/reagents/reagents/toxins.dm b/code/modules/reagents/reagents/toxins.dm
index dde7bf21a9..b59be5c7d1 100644
--- a/code/modules/reagents/reagents/toxins.dm
+++ b/code/modules/reagents/reagents/toxins.dm
@@ -67,7 +67,7 @@
/datum/reagent/toxin/neurotoxic_protein
name = "toxic protein"
id = "neurotoxic_protein"
- description = "A weak neurotoxic chemical commonly found in Sivian fish meat."
+ description = "A weak neurotoxic chemical."
taste_description = "fish"
reagent_state = LIQUID
color = "#005555"
diff --git a/icons/obj/flora/mushrooms.dmi b/icons/obj/flora/mushrooms.dmi
new file mode 100644
index 0000000000..755acb8d64
Binary files /dev/null and b/icons/obj/flora/mushrooms.dmi differ
diff --git a/icons/turf/flooring/asteroid.dmi b/icons/turf/flooring/asteroid.dmi
index 9df9089658..c7f2b12948 100644
Binary files a/icons/turf/flooring/asteroid.dmi and b/icons/turf/flooring/asteroid.dmi differ
diff --git a/vorestation.dme b/vorestation.dme
index bc2acf45d1..971cb08c2f 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -2354,6 +2354,7 @@
#include "code\modules\hydroponics\grown.dm"
#include "code\modules\hydroponics\grown_inedible.dm"
#include "code\modules\hydroponics\grown_predefined.dm"
+#include "code\modules\hydroponics\grown_sif.dm"
#include "code\modules\hydroponics\seed.dm"
#include "code\modules\hydroponics\seed_datums_vr.dm"
#include "code\modules\hydroponics\seed_gene_mut.dm"