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"