diff --git a/data/json/furniture_and_terrain/furniture-flora_marine.json b/data/json/furniture_and_terrain/furniture-flora_marine.json new file mode 100644 index 0000000000000..f33a6a5fb3d66 --- /dev/null +++ b/data/json/furniture_and_terrain/furniture-flora_marine.json @@ -0,0 +1,96 @@ +[ + { + "type": "furniture", + "id": "f_algae_red", + "name": "red algae", + "description": "One of the thousands of species of grassy reddish marine plants that inhabit intertidal zones the world over. Its rubbery little fronds don't look particularly edible.", + "symbol": ",", + "color": "red", + "move_cost_mod": 0, + "required_str": -1, + "flags": [ "TRANSPARENT", "TINY", "FLAMMABLE_ASH", "NOCOLLIDE", "ORGANIC" ], + "examine_action": "harvest_furn", + "harvest_by_season": [ { "seasons": [ "spring", "summer", "autumn", "winter" ], "id": "seaweed_harv" } ], + "bash": { "str_min": 2, "str_max": 6, "sound": "splat.", "sound_fail": "squelch." } + }, + { + "type": "furniture", + "id": "f_algae_green", + "name": "green algae", + "description": "A short patch of grassy green seaweed, wholly unremarkable.", + "symbol": ",", + "color": "green", + "move_cost_mod": 0, + "required_str": -1, + "flags": [ "TRANSPARENT", "TINY", "FLAMMABLE_ASH", "NOCOLLIDE", "ORGANIC" ], + "examine_action": "harvest_furn", + "harvest_by_season": [ { "seasons": [ "spring", "summer", "autumn", "winter" ], "id": "seaweed_harv" } ], + "bash": { "str_min": 2, "str_max": 6, "sound": "splat.", "sound_fail": "squelch." } + }, + { + "type": "furniture", + "id": "f_kelp_sugar", + "name": "sugar kelp", + "description": "Also known as kombu, this brown algae grows in a single leaflike blade that can reach more than twice the height of a man. Young fronds make for excellent soup stock and can even be eaten raw.", + "symbol": "i", + "color": "brown", + "move_cost_mod": 0, + "required_str": -1, + "flags": [ "FLAMMABLE_ASH", "ORGANIC", "SMALL_HIDE", "HARVEST_REQ_CUT1" ], + "examine_action": "harvest_furn", + "harvest_by_season": [ { "seasons": [ "spring", "summer" ], "id": "kelp_sugar_harv" } ], + "bash": { "str_min": 8, "str_max": 16, "sound": "splat.", "sound_fail": "squelch." } + }, + { + "type": "furniture", + "id": "f_sea_lettuce", + "name": "sea lettuce", + "description": "Sometimes known as green laver, this leafy algae from the Ulva genus grows in leafy little patches around shallows and tide pools. Though small, it makes a tasty snack.", + "looks_like": "f_algae_green", + "symbol": ",", + "color": "green", + "move_cost_mod": 0, + "required_str": -1, + "flags": [ "TRANSPARENT", "TINY", "FLAMMABLE_ASH", "NOCOLLIDE", "ORGANIC" ], + "harvest_by_season": [ { "seasons": [ "spring", "summer", "autumn", "winter" ], "id": "sea_lettuce_harv" } ], + "bash": { "str_min": 2, "str_max": 6, "sound": "splat.", "sound_fail": "squelch." } + }, + { + "type": "furniture", + "id": "f_bladderwrack", + "name": "bladderwrack", + "description": "Named for the air bladders that grow all over its leafy fronds, this leafy seaweed is technically edible and has a long history of use in folk medicine.", + "looks_like": "f_algae_green", + "symbol": ",", + "color": "green", + "move_cost_mod": 0, + "required_str": -1, + "flags": [ "TRANSPARENT", "TINY", "FLAMMABLE_ASH", "NOCOLLIDE", "ORGANIC" ], + "harvest_by_season": [ { "seasons": [ "spring", "summer", "autumn", "winter" ], "id": "bladderwrack_harv" } ], + "bash": { "str_min": 2, "str_max": 6, "sound": "splat.", "sound_fail": "squelch." } + }, + { + "type": "furniture", + "id": "f_sea_anemone", + "name": "sea anemone", + "description": "This sessile polyp waves its stinging tentacles with the motion of the tides, hoping to capture a tiny fish or crab. It's wholly inedible and poses no danger to anything bigger than a shrimp.", + "symbol": "f", + "color": "pink", + "move_cost_mod": 0, + "required_str": -1, + "flags": [ "TRANSPARENT", "TINY", "FLAMMABLE_ASH", "NOCOLLIDE", "GRAZER_INEDIBLE", "ORGANIC" ], + "bash": { "str_min": 2, "str_max": 6, "sound": "splat.", "sound_fail": "squelch." } + }, + { + "type": "furniture", + "id": "f_sea_sponge", + "name": "sea sponge", + "description": "An immobile, lumpy little creature that looks nothing like a square kitchen sponge. Anchored to the sea floor, its porous body passively filters plankton from the water that freely passes through it.", + "symbol": "f", + "color": "brown", + "move_cost_mod": 0, + "required_str": -1, + "flags": [ "TRANSPARENT", "TINY", "FLAMMABLE_ASH", "NOCOLLIDE", "GRAZER_INEDIBLE", "ORGANIC" ], + "bash": { "str_min": 6, "str_max": 12, "sound": "splat.", "sound_fail": "squelch." } + } +] diff --git a/data/json/harvest.json b/data/json/harvest.json index f398599762f39..4b7fd6ddd2f68 100644 --- a/data/json/harvest.json +++ b/data/json/harvest.json @@ -387,6 +387,26 @@ "type": "harvest", "entries": [ { "drop": "wintergreen_berry", "base_num": [ 1, 4 ] }, { "drop": "wintergreen_leaves", "base_num": [ 1, 2 ] } ] }, + { + "id": "seaweed_harv", + "type": "harvest", + "entries": [ { "drop": "seaweed" } ] + }, + { + "id": "kelp_sugar_harv", + "type": "harvest", + "entries": [ { "drop": "kelp_sugar" } ] + }, + { + "id": "bladderwrack_harv", + "type": "harvest", + "entries": [ { "drop": "bladderwrack" } ] + }, + { + "id": "sea_lettuce_harv", + "type": "harvest", + "entries": [ { "drop": "sea_lettuce" } ] + }, { "id": "fish_tiny", "type": "harvest", diff --git a/data/json/items/comestibles/raw_veggy.json b/data/json/items/comestibles/raw_veggy.json index 72ed8899d1bdc..afd03c8a157ab 100644 --- a/data/json/items/comestibles/raw_veggy.json +++ b/data/json/items/comestibles/raw_veggy.json @@ -1257,5 +1257,92 @@ "flags": [ "RAW" ], "vitamins": [ [ "vitC", "60500 μg" ], [ "iron", "650 μg" ], [ "calcium", "24650 μg" ] ], "fun": -5 + }, + { + "type": "COMESTIBLE", + "id": "seaweed", + "name": { "str_sp": "seaweed" }, + "weight": "30 g", + "color": "green", + "spoils_in": "2 days", + "comestible_type": "FOOD", + "symbol": "%", + "description": "A handful of slimy seaweed. It doesn't look edible, but properly dried, it might make for decent kindling.", + "material": [ "veggy" ], + "volume": "30 ml", + "flags": [ "SMOKABLE", "INEDIBLE" ], + "smoking_result": "dry_seaweed" + }, + { + "type": "COMESTIBLE", + "id": "seaweed_pile", + "name": { "str_sp": "pile of seaweed" }, + "weight": "600 g", + "color": "green", + "spoils_in": "2 days", + "comestible_type": "FOOD", + "symbol": "%", + "description": "A slimy heap of seaweed. It doesn't look edible, but properly dried, it might make for decent kindling.", + "material": [ "veggy" ], + "volume": "600 ml", + "flags": [ "SMOKABLE", "INEDIBLE" ], + "smoking_result": "dry_seaweed_pile" + }, + { + "type": "COMESTIBLE", + "id": "sea_lettuce", + "name": { "str_sp": "sea lettuce" }, + "weight": "100 g", + "color": "green", + "spoils_in": "2 days", + "comestible_type": "FOOD", + "symbol": "%", + "calories": 12, + "description": "A handful of edible green seaweed. It makes a good snack as-is, but can be dried or prepared in a number of ways.", + "price": 10, + "price_postapoc": 10, + "material": [ "veggy" ], + "volume": "250 ml", + "flags": [ "FREEZERBURN", "SMOKABLE" ], + "smoking_result": "dry_veggy", + "vitamins": [ [ "calcium", 3 ], [ "iron", 3 ], [ "vitC", 1 ] ] + }, + { + "type": "COMESTIBLE", + "id": "kelp_sugar", + "name": { "str_sp": "sugar kelp" }, + "weight": "100 g", + "color": "brown", + "spoils_in": "2 days", + "comestible_type": "FOOD", + "symbol": "%", + "calories": 17, + "description": "A sizable strip of new growth harvested from a sugar kelp. While these are most often dried, it seems edible enough as is.", + "price": 10, + "price_postapoc": 10, + "material": [ "veggy" ], + "volume": "250 ml", + "flags": [ "FREEZERBURN", "SMOKABLE" ], + "smoking_result": "kombu", + "vitamins": [ [ "calcium", 3 ], [ "iron", 3 ], [ "vitC", 1 ] ] + }, + { + "type": "COMESTIBLE", + "id": "bladderwrack", + "name": { "str_sp": "bladderwrack" }, + "weight": "100 g", + "color": "brown", + "spoils_in": "2 days", + "comestible_type": "FOOD", + "symbol": "%", + "calories": 17, + "description": "A leafy bunch of seaweed covered in air bladders. Many claims are made about its health benefits, but at least as a foodstuff, it's no better or worse than other edible seaweed.", + "price": 10, + "price_postapoc": 10, + "material": [ "veggy" ], + "volume": "250 ml", + "flags": [ "FREEZERBURN", "SMOKABLE" ], + "smoking_result": "dry_veggy", + "vitamins": [ [ "calcium", 2 ], [ "iron", 4 ], [ "vitC", 1 ] ] } ] diff --git a/data/json/items/comestibles/veggy_dishes.json b/data/json/items/comestibles/veggy_dishes.json index edbf392b84af1..de997699f2222 100644 --- a/data/json/items/comestibles/veggy_dishes.json +++ b/data/json/items/comestibles/veggy_dishes.json @@ -1626,5 +1626,24 @@ "flags": [ "EATEN_HOT", "EDIBLE_FROZEN", "FREEZERBURN" ], "fun": 6, "vitamins": [ [ "vitC", 12 ], [ "calcium", 4 ], [ "iron", 2 ] ] + }, + { + "type": "COMESTIBLE", + "id": "kombu", + "name": { "str_sp": "kombu" }, + "weight": "10 g", + "color": "brown", + "spoils_in": "2 days", + "comestible_type": "FOOD", + "symbol": "%", + "calories": 17, + "description": "An essential component of Japanese cuisine, this dried sheet of seaweed has hardened to the point of inedibility. Boiled in water, it should make an excellent broth.", + "price": 10, + "price_postapoc": 10, + "material": [ "veggy" ], + "volume": "25 ml", + "flags": [ "INEDIBLE" ], + "smoking_result": "kombu", + "vitamins": [ [ "calcium", 3 ], [ "iron", 3 ], [ "vitC", 1 ] ] } ] diff --git a/data/json/items/generic.json b/data/json/items/generic.json index 2d6c7813074b9..9a594f08fa3a6 100644 --- a/data/json/items/generic.json +++ b/data/json/items/generic.json @@ -285,6 +285,32 @@ "to_hit": -2, "flags": [ "TRADER_AVOID", "TINDER" ] }, + { + "type": "GENERIC", + "id": "dry_seaweed", + "name": { "str_sp": "dried seaweed" }, + "looks_like": "withered", + "description": "A bit of dried seaweed. It's tough, inedible, and possibly poisonous, but it could be burned or used for crafts.", + "weight": "10 g", + "color": "green", + "symbol": ",", + "material": [ "dry_plant" ], + "volume": "10 ml", + "flags": [ "TRADER_AVOID", "FIREWOOD", "TINDER" ] + }, + { + "type": "GENERIC", + "id": "dry_seaweed_pile", + "name": { "str_sp": "pile of dried seaweed" }, + "looks_like": "withered", + "description": "A big heap of dried seaweed. It's tough, inedible, and possibly poisonous, but it could be burned or used for crafts.", + "weight": "200 g", + "color": "green", + "symbol": ",", + "material": [ "dry_plant" ], + "volume": "200 ml", + "flags": [ "TRADER_AVOID", "FIREWOOD", "TINDER" ] + }, { "type": "GENERIC", "id": "superglue", diff --git a/data/json/mapgen/kelp_forest.json b/data/json/mapgen/kelp_forest.json new file mode 100644 index 0000000000000..569ad76c60a78 --- /dev/null +++ b/data/json/mapgen/kelp_forest.json @@ -0,0 +1,178 @@ +[ + { + "type": "palette", + "id": "kelp_forest_palette", + "nested": { + "1": { "chunks": [ [ "kelp_forest", 8 ], [ "null", 1 ] ] }, + "2": { "chunks": [ [ "kelp_forest", 2 ], [ "null", 1 ] ] } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "kelp_forest", + "object": { + "mapgensize": [ 1, 1 ], + "furniture": { + " ": [ + [ "f_kelp_sugar", 270 ], + [ "f_algae_red", 5 ], + [ "f_algae_green", 5 ], + [ "f_boulder_small", 5 ], + [ "f_boulder_medium", 3 ], + [ "f_boulder_large", 2 ], + [ "f_sea_anemone", 5 ], + [ "f_sea_sponge", 5 ] + ] + }, + "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ] + } + }, + { + "om_terrain": "kelp_forest_core", + "type": "mapgen", + "method": "json", + "object": { + "fallback_predecessor_mapgen": "ocean_bed", + "rows": [ + "111111111111111111111111", + "111111111111111111111111", + "111111111111111111111111", + "111111111111111111111111", + "111111111111111111111111", + "111111111111111111111111", + "111111111111111111111111", + "111111111111111111111111", + "111111111111111111111111", + "111111111111111111111111", + "111111111111111111111111", + "111111111111111111111111", + "111111111111111111111111", + "111111111111111111111111", + "111111111111111111111111", + "111111111111111111111111", + "111111111111111111111111", + "111111111111111111111111", + "111111111111111111111111", + "111111111111111111111111", + "111111111111111111111111", + "111111111111111111111111", + "111111111111111111111111", + "111111111111111111111111" + ], + "flags": [ "ERASE_ALL_BEFORE_PLACING_TERRAIN" ], + "palettes": [ "kelp_forest_palette" ] + } + }, + { + "om_terrain": "kelp_forest_end", + "type": "mapgen", + "method": "json", + "weight": 10, + "object": { + "fallback_predecessor_mapgen": "ocean_bed", + "rows": [ + "111111111111111111111111", + "211111111111111111111112", + "222211111111111111112222", + " 2222222222222222222222 ", + " 222222222222222 ", + " 2 2222 ", + " 222 2222222 ", + " 222 2 22222 ", + " 2222 ", + "222222 2222222 ", + " 22222 2222 ", + " 22222 2 ", + " ", + " 222 2 ", + " 2222 22 ", + " 22 222 ", + " ", + " 22 22 ", + " 22 22 ", + " 22 ", + " 22 ", + " ", + " ", + " " + ], + "flags": [ "ERASE_ALL_BEFORE_PLACING_TERRAIN" ], + "palettes": [ "kelp_forest_palette" ] + } + }, + { + "om_terrain": "kelp_forest_end", + "type": "mapgen", + "method": "json", + "weight": 2, + "object": { + "fallback_predecessor_mapgen": "ocean_bed", + "rows": [ + "111111111111111111111111", + "211111111111111111111112", + "222211111111111111112222", + "22222221111111111222222 ", + " 222222222222222222222 ", + " 2222222222222222222 ", + " 222222222222222222 ", + " 22222222 222222 ", + " 222222 22 22", + " 2222 22 22", + " 2 2222 ", + " 222 222222 2 ", + " 2 2222 222 ", + " 22 22 22", + " 22 2222 22 222 ", + " 22 22 2222 2 ", + " 2222 ", + " 2 22 ", + " 22 2 22 ", + " 22 22 ", + "2 2", + "2 2", + " ", + " " + ], + "flags": [ "ERASE_ALL_BEFORE_PLACING_TERRAIN" ], + "palettes": [ "kelp_forest_palette" ] + } + }, + { + "om_terrain": "kelp_forest_end", + "type": "mapgen", + "method": "json", + "weight": 2, + "object": { + "fallback_predecessor_mapgen": "ocean_bed", + "rows": [ + "111111111111111111111111", + "211111111111111111111112", + " 222111111122221111222 ", + " 2222221112222211222 ", + " 222 222222 222222 2 ", + "2222 2 222 222222 ", + " 2 2 22 222 2 22 2 ", + " 222 222 ", + " 22222 ", + " 2 2222", + "22 2 22", + "22 222 ", + "2 22 2222 ", + " 222 2222 ", + " 2222 ", + " 22 ", + " 22 ", + " 212 ", + " 2 ", + " ", + " ", + " 22 ", + " 2 ", + " " + ], + "flags": [ "ERASE_ALL_BEFORE_PLACING_TERRAIN" ], + "palettes": [ "kelp_forest_palette" ] + } + } +] diff --git a/data/json/mapgen/map_extras/kelp_patch.json b/data/json/mapgen/map_extras/kelp_patch.json new file mode 100644 index 0000000000000..56420f1d6a22f --- /dev/null +++ b/data/json/mapgen/map_extras/kelp_patch.json @@ -0,0 +1,36 @@ +[ + { + "type": "mapgen", + "method": "json", + "update_mapgen_id": "mx_kelp_patch", + "object": { + "rows": [ + " 222222 ", + " 2222222222 ", + " 22222222222222 ", + " 2222221111222222 ", + " 222221111111122222 ", + " 22221111111111112222 ", + " 22211111111111111222 ", + " 2222111111111111112222 ", + " 2221111111111111111222 ", + "222211111111111111112222", + "222111111111111111111222", + "222111111111111111111222", + "222111111111111111111222", + "222111111111111111111222", + "222211111111111111112222", + " 2221111111111111111222 ", + " 2222111111111111112222 ", + " 22211111111111111222 ", + " 22221111111111112222 ", + " 222221111111122222 ", + " 2222221111222222 ", + " 22222222222222 ", + " 2222222222 ", + " 222222 " + ], + "palettes": [ "kelp_forest_palette" ] + } + } +] diff --git a/data/json/mapgen/ocean.json b/data/json/mapgen/ocean.json index 9f31150360cdd..385a29db3c513 100644 --- a/data/json/mapgen/ocean.json +++ b/data/json/mapgen/ocean.json @@ -15,6 +15,31 @@ "type": "mapgen", "method": "json", "om_terrain": [ "ocean_bed" ], - "object": { "fill_ter": "t_ocean_bed" } + "object": { + "fill_ter": "t_ocean_bed", + "//": "Should be converted to a region setting entry in #73602/once it merges", + "nested": { " ": { "chunks": [ [ "tmp_nest_f_region_ocean_bed", 1 ], [ "null", 99 ] ] } } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "tmp_nest_f_region_ocean_bed", + "object": { + "mapgensize": [ 1, 1 ], + "furniture": { + " ": [ + [ "f_algae_red", 4 ], + [ "f_algae_green", 3 ], + [ "f_kelp_sugar", 1 ], + [ "f_boulder_small", 8 ], + [ "f_boulder_medium", 4 ], + [ "f_boulder_large", 2 ], + [ "f_sea_anemone", 1 ], + [ "f_sea_sponge", 1 ] + ] + }, + "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ] + } } ] diff --git a/data/json/overmap/map_extras.json b/data/json/overmap/map_extras.json index 4451dfca9797b..353cbf11480b5 100644 --- a/data/json/overmap/map_extras.json +++ b/data/json/overmap/map_extras.json @@ -485,6 +485,17 @@ "color": "light_gray", "autonote": true }, + { + "id": "mx_kelp_patch", + "type": "map_extra", + "name": { "str": "Kelp Patch" }, + "description": "A patch of kelp.", + "generator": { "generator_method": "update_mapgen", "generator_id": "mx_kelp_patch" }, + "min_max_zlevel": [ -9, -9 ], + "sym": "~", + "color": "green", + "autonote": true + }, { "id": "mx_marloss_pilgrimage", "type": "map_extra", diff --git a/data/json/overmap/overmap_mutable/kelp_forest_mutable.json b/data/json/overmap/overmap_mutable/kelp_forest_mutable.json new file mode 100644 index 0000000000000..7b2915c56eaae --- /dev/null +++ b/data/json/overmap/overmap_mutable/kelp_forest_mutable.json @@ -0,0 +1,47 @@ +[ + { + "type": "overmap_special", + "id": "kelp_forest_mutable", + "subtype": "mutable", + "locations": [ "ocean_bed" ], + "occurrences": [ 1, 2 ], + "flags": [ "OCEAN", "WILDERNESS" ], + "check_for_locations": [ [ [ 0, 0, 0 ], [ "ocean_surface" ] ], [ [ 0, 0, 1 ], [ "open_air" ] ] ], + "check_for_locations_area": [ { "type": [ "ocean_bed" ], "from": [ 2, 2, -9 ], "to": [ -2, -2, -9 ] } ], + "joins": [ "kelp_to_kelp", "root_to_kelp" ], + "overmaps": { + "root": { "overmap": "ocean_surface", "above": "root_to_kelp", "locations": [ "ocean_surface" ] }, + "root_to_forest": { "overmap": "open_air", "below": "root_to_kelp", "locations": [ "open_air" ] }, + "kelp_forest_core": { + "overmap": "kelp_forest_core", + "north": "kelp_to_kelp", + "east": "kelp_to_kelp", + "south": "kelp_to_kelp", + "west": "kelp_to_kelp" + }, + "kelp_forest_end": { "overmap": "kelp_forest_end_north", "north": "kelp_to_kelp" }, + "kelp_forest_fill": { + "overmap": "kelp_forest_end_north", + "north": { "id": "kelp_to_kelp", "type": "available" }, + "east": { "id": "kelp_to_kelp", "type": "available" }, + "west": { "id": "kelp_to_kelp", "type": "available" } + } + }, + "root": "root", + "phases": [ + [ + { + "name": "root_to_forest", + "//": "Connects the z0 root to the z9 ocean bed", + "chunk": [ { "overmap": "root_to_forest", "pos": [ 0, 0, 1 ] }, { "overmap": "kelp_forest_core", "pos": [ 0, 0, -9 ] } ], + "max": 1 + } + ], + [ + { "overmap": "kelp_forest_core", "weight": 400 }, + { "overmap": "kelp_forest_end", "weight": 100 }, + { "overmap": "kelp_forest_fill", "weight": 1 } + ] + ] + } +] diff --git a/data/json/overmap/overmap_terrain/overmap_terrain_kelp_forest.json b/data/json/overmap/overmap_terrain/overmap_terrain_kelp_forest.json new file mode 100644 index 0000000000000..0c320fa0802d6 --- /dev/null +++ b/data/json/overmap/overmap_terrain/overmap_terrain_kelp_forest.json @@ -0,0 +1,22 @@ +[ + { + "type": "overmap_terrain", + "abstract": "generic_kelp_forest", + "copy-from": "generic_ocean", + "name": "kelp forest", + "sym": "~", + "color": "green", + "extend": { "flags": [ "REQUIRES_PREDECESSOR" ] } + }, + { + "type": "overmap_terrain", + "id": "kelp_forest_core", + "copy-from": "generic_kelp_forest" + }, + { + "type": "overmap_terrain", + "id": "kelp_forest_end", + "copy-from": "generic_kelp_forest", + "delete": { "flags": [ "NO_ROTATE" ] } + } +] diff --git a/data/json/overmap/overmap_terrain/overmap_terrain_waterbody.json b/data/json/overmap/overmap_terrain/overmap_terrain_waterbody.json index 1567a26741362..99ec72599e70b 100644 --- a/data/json/overmap/overmap_terrain/overmap_terrain_waterbody.json +++ b/data/json/overmap/overmap_terrain/overmap_terrain_waterbody.json @@ -77,6 +77,7 @@ "type": "overmap_terrain", "id": "ocean_bed", "copy-from": "generic_ocean", - "name": "ocean bed (submerged)" + "name": "ocean bed (submerged)", + "extras": "ocean_bed" } ] diff --git a/data/json/recipes/food/dry.json b/data/json/recipes/food/dry.json index 6c3b750e7ff96..f9f30264cf0a1 100644 --- a/data/json/recipes/food/dry.json +++ b/data/json/recipes/food/dry.json @@ -313,6 +313,68 @@ "//": "69g of stuff, 2u to cook", "components": [ [ [ "mushroom", 1 ], [ "mushroom_morel", 1 ] ] ] }, + { + "type": "recipe", + "activity_level": "NO_EXERCISE", + "result": "kombu", + "charges": 1, + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_DRY", + "skill_used": "cooking", + "difficulty": 2, + "time": "20 m", + "autolearn": true, + "batch_time_factors": [ 67, 5 ], + "tools": [ [ [ "dehydrating_heat", 7, "LIST" ] ] ], + "components": [ [ [ "kelp_sugar", 1 ] ] ] + }, + { + "type": "recipe", + "activity_level": "NO_EXERCISE", + "result": "kombu", + "charges": 1, + "category": "CC_FOOD", + "id_suffix": "frozen_ingredients", + "subcategory": "CSC_FOOD_DRY", + "skill_used": "cooking", + "difficulty": 2, + "time": "22 m", + "autolearn": true, + "batch_time_factors": [ 67, 5 ], + "tools": [ [ [ "dehydrating_heat", 7, "LIST" ] ], [ [ "surface_heat", 2, "LIST" ] ] ], + "components": [ [ [ "kelp_sugar", 1 ] ] ] + }, + { + "type": "recipe", + "activity_level": "NO_EXERCISE", + "result": "dry_seaweed", + "charges": 1, + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_DRY", + "skill_used": "cooking", + "difficulty": 2, + "time": "6 m", + "autolearn": true, + "batch_time_factors": [ 67, 5 ], + "tools": [ [ [ "dehydrating_heat", 5, "LIST" ] ] ], + "components": [ [ [ "seaweed", 1 ] ] ] + }, + { + "type": "recipe", + "activity_level": "NO_EXERCISE", + "result": "dry_seaweed", + "charges": 1, + "category": "CC_FOOD", + "id_suffix": "frozen_ingredients", + "subcategory": "CSC_FOOD_DRY", + "skill_used": "cooking", + "difficulty": 2, + "time": "8 m", + "autolearn": true, + "batch_time_factors": [ 67, 5 ], + "tools": [ [ [ "dehydrating_heat", 5, "LIST" ] ], [ [ "surface_heat", 2, "LIST" ] ] ], + "components": [ [ [ "seaweed", 1 ] ] ] + }, { "type": "recipe", "activity_level": "NO_EXERCISE", diff --git a/data/json/recipes/nested.json b/data/json/recipes/nested.json index 43382963ad00d..c386d4417c9b2 100644 --- a/data/json/recipes/nested.json +++ b/data/json/recipes/nested.json @@ -3833,7 +3833,9 @@ "bundle_copper_pipe", "bundle_branch", "bundle_branch_long", - "bundle_javelin" + "bundle_javelin", + "seaweed_pile", + "dry_seaweed_pile" ], "difficulty": 1 }, diff --git a/data/json/recipes/recipe_others.json b/data/json/recipes/recipe_others.json index 3d49695b218e3..902ea583036d1 100644 --- a/data/json/recipes/recipe_others.json +++ b/data/json/recipes/recipe_others.json @@ -3387,6 +3387,30 @@ [ [ "nails", 40, "LIST" ] ] ] }, + { + "result": "seaweed_pile", + "type": "recipe", + "activity_level": "NO_EXERCISE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", + "skill_used": "fabrication", + "time": "10 s", + "autolearn": true, + "components": [ [ [ "seaweed", 20 ] ] ], + "flags": [ "BLIND_EASY" ] + }, + { + "result": "dry_seaweed_pile", + "type": "recipe", + "activity_level": "NO_EXERCISE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", + "skill_used": "fabrication", + "time": "10 s", + "autolearn": true, + "components": [ [ [ "dry_seaweed", 20 ] ] ], + "flags": [ "BLIND_EASY" ] + }, { "type": "recipe", "activity_level": "LIGHT_EXERCISE", diff --git a/data/json/regional_map_settings.json b/data/json/regional_map_settings.json index 3b00c52e7fbb8..99c4a568720f9 100644 --- a/data/json/regional_map_settings.json +++ b/data/json/regional_map_settings.json @@ -650,6 +650,7 @@ "mx_golden_monoliths": 1 } }, + "ocean_bed": { "chance": 30, "extras": { "mx_kelp_patch": 1 } }, "road": { "chance": 100, "extras": { diff --git a/data/json/requirements/cooking_components.json b/data/json/requirements/cooking_components.json index 4785409edee0e..9bea2d347be5b 100644 --- a/data/json/requirements/cooking_components.json +++ b/data/json/requirements/cooking_components.json @@ -1141,7 +1141,10 @@ [ "veggy", 1 ], [ "veggy_wild", 1 ], [ "veggy_salted", 1 ], - [ "spinach", 1 ] + [ "spinach", 1 ], + [ "sea_lettuce", 1 ], + [ "bladderwrack", 1 ], + [ "kelp_sugar", 1 ] ] ] }, @@ -1249,7 +1252,8 @@ [ "mushroom_cooked", 1 ], [ "morel_cooked", 1 ], [ "mushroom", 1 ], - [ "dry_mushroom", 1 ] + [ "dry_mushroom", 1 ], + [ "kombu", 1 ] ], [ [ "hot_sauce", 1 ], diff --git a/data/json/uncraft/generic.json b/data/json/uncraft/generic.json index 8511ec29a9952..4093936c345d9 100644 --- a/data/json/uncraft/generic.json +++ b/data/json/uncraft/generic.json @@ -759,6 +759,20 @@ "qualities": [ { "id": "CUT", "level": 1 } ], "components": [ [ [ "zipper_long_plastic", 1 ] ], [ [ "plastic_sheet", 4 ] ] ] }, + { + "result": "dry_seaweed_pile", + "type": "uncraft", + "activity_level": "NO_EXERCISE", + "time": "10 s", + "components": [ [ [ "dry_seaweed", 20 ] ] ] + }, + { + "result": "seaweed_pile", + "type": "uncraft", + "activity_level": "NO_EXERCISE", + "time": "10 s", + "components": [ [ [ "seaweed", 20 ] ] ] + }, { "result": "butterfly_net_makeshift", "type": "uncraft", diff --git a/data/mods/TEST_DATA/overmap_terrain_coverage_test/overmap_terrain_coverage_whitelist.json b/data/mods/TEST_DATA/overmap_terrain_coverage_test/overmap_terrain_coverage_whitelist.json index 355311be67aa7..62c4be029485e 100644 --- a/data/mods/TEST_DATA/overmap_terrain_coverage_test/overmap_terrain_coverage_whitelist.json +++ b/data/mods/TEST_DATA/overmap_terrain_coverage_test/overmap_terrain_coverage_whitelist.json @@ -47,10 +47,7 @@ "karting_2_2_0", "karting_2_2_1", "karting_2_2_2", - "ocean_bed", "ocean_shore", - "ocean_surface", - "ocean_water_cube", "ravine", "ravine_edge", "ravine_floor", @@ -64,139 +61,7 @@ "unvitrified_farm_1", "unvitrified_farm_2", "unvitrified_farm_neg_1", - "unvitrified_orchard", - "oil_platform_1a_2", - "oil_platform_1b_2", - "oil_platform_1c_2", - "oil_platform_2a_2", - "oil_platform_2b_2", - "oil_platform_2c_2", - "oil_platform_3a_2", - "oil_platform_3b_2", - "oil_platform_3c_2", - "oil_platform_4a_2", - "oil_platform_4b_2", - "oil_platform_4c_2", - "oil_platform_1a_3", - "oil_platform_1b_3", - "oil_platform_1c_3", - "oil_platform_4a_3", - "oil_platform_4b_3", - "oil_platform_4c_3", - "oil_platform_1a_4", - "oil_platform_1b_4", - "oil_platform_1c_4", - "oil_platform_4a_4", - "oil_platform_4b_4", - "oil_platform_4c_4", - "oil_platform_1a_5", - "oil_platform_1b_5", - "oil_platform_1c_5", - "oil_platform_3a_5", - "oil_platform_3b_5", - "oil_platform_3c_5", - "oil_platform_4a_5", - "oil_platform_4b_5", - "oil_platform_4c_5", - "oil_platform_3a_3", - "oil_platform_3b_3", - "oil_platform_3c_3", - "oil_platform_3a_4", - "oil_platform_3b_4", - "oil_platform_3c_4", - "oil_platform_1a_0", - "oil_platform_1b_0", - "oil_platform_1c_0", - "oil_platform_2a_0", - "oil_platform_2b_0", - "oil_platform_2c_0", - "oil_platform_3a_0", - "oil_platform_3b_0", - "oil_platform_3c_0", - "oil_platform_4a_0", - "oil_platform_4b_0", - "oil_platform_4c_0", - "oil_platform_1a_1", - "oil_platform_1b_1", - "oil_platform_1c_1", - "oil_platform_2a_1", - "oil_platform_2b_1", - "oil_platform_2c_1", - "oil_platform_3a_1", - "oil_platform_3b_1", - "oil_platform_3c_1", - "oil_platform_4a_1", - "oil_platform_4b_1", - "oil_platform_4c_1", - "oil_platform_2a_3", - "oil_platform_2b_3", - "oil_platform_2c_3", - "oil_platform_2a_4", - "oil_platform_2b_4", - "oil_platform_2c_4", - "oil_platform_2a_5", - "oil_platform_2b_5", - "oil_platform_2c_5", - "oil_platform_1a_6", - "oil_platform_1b_6", - "oil_platform_1c_6", - "oil_platform_2a_6", - "oil_platform_2b_6", - "oil_platform_2c_6", - "oil_platform_3a_6", - "oil_platform_3b_6", - "oil_platform_3c_6", - "oil_platform_4a_6", - "oil_platform_4b_6", - "oil_platform_4c_6", - "oil_platform_1a_7", - "oil_platform_1b_7", - "oil_platform_1c_7", - "oil_platform_2a_7", - "oil_platform_2b_7", - "oil_platform_2c_7", - "oil_platform_3a_7", - "oil_platform_3b_7", - "oil_platform_3c_7", - "oil_platform_4a_7", - "oil_platform_4b_7", - "oil_platform_4c_7", - "oil_platform_1a_uw", - "oil_platform_1b_uw", - "oil_platform_1c_uw", - "oil_platform_2a_uw", - "oil_platform_2b_uw", - "oil_platform_2c_uw", - "oil_platform_3a_uw", - "oil_platform_3b_uw", - "oil_platform_3c_uw", - "oil_platform_4a_uw", - "oil_platform_4b_uw", - "oil_platform_4c_uw", - "oil_platform_1a_z-8", - "oil_platform_1b_z-8", - "oil_platform_1c_z-8", - "oil_platform_2a_z-8", - "oil_platform_2b_z-8", - "oil_platform_2c_z-8", - "oil_platform_3a_z-8", - "oil_platform_3b_z-8", - "oil_platform_3c_z-8", - "oil_platform_4a_z-8", - "oil_platform_4b_z-8", - "oil_platform_4c_z-8", - "oil_platform_1a_z-9", - "oil_platform_1b_z-9", - "oil_platform_1c_z-9", - "oil_platform_2a_z-9", - "oil_platform_2b_z-9", - "oil_platform_2c_z-9", - "oil_platform_3a_z-9", - "oil_platform_3b_z-9", - "oil_platform_3c_z-9", - "oil_platform_4a_z-9", - "oil_platform_4b_z-9", - "oil_platform_4c_z-9" + "unvitrified_orchard" ] } ] diff --git a/src/activity_actor.cpp b/src/activity_actor.cpp index 04ebe30eaa1bc..d637cbc6679b5 100644 --- a/src/activity_actor.cpp +++ b/src/activity_actor.cpp @@ -233,6 +233,7 @@ static const proficiency_id proficiency_prof_lockpicking( "prof_lockpicking" ); static const proficiency_id proficiency_prof_lockpicking_expert( "prof_lockpicking_expert" ); static const proficiency_id proficiency_prof_safecracking( "prof_safecracking" ); +static const quality_id qual_CUT( "CUT" ); static const quality_id qual_HACK( "HACK" ); static const quality_id qual_LOCKPICK( "LOCKPICK" ); static const quality_id qual_PRY( "PRY" ); @@ -4207,6 +4208,15 @@ void harvest_activity_actor::start( player_activity &act, Character &who ) const furn_id furn = here.furn( target ); if( furn->has_examine( iexamine::harvest_furn ) ) { + // TODO: Should be generified as a harvest field + if( furn->has_flag( ter_furn_flag::TFLAG_HARVEST_REQ_CUT1 ) && who.max_quality( qual_CUT ) < 1 ) { + if( !auto_forage ) { + who.add_msg_if_player( m_info, + _( "You'll need a cutting tool to harvest this." ) ); + } + act.set_to_null(); + return; + } exam_furn = true; } else if( furn->has_examine( iexamine::harvest_furn_nectar ) ) { exam_furn = true; diff --git a/src/mapdata.cpp b/src/mapdata.cpp index 54bbd23ac4ef6..3872a50a7c7c5 100644 --- a/src/mapdata.cpp +++ b/src/mapdata.cpp @@ -268,6 +268,7 @@ std::string enum_to_string( ter_furn_flag data ) case ter_furn_flag::TFLAG_SINGLE_SUPPORT: return "SINGLE_SUPPORT"; case ter_furn_flag::TFLAG_CLIMB_ADJACENT: return "CLIMB_ADJACENT"; case ter_furn_flag::TFLAG_FLOATS_IN_AIR: return "FLOATS_IN_AIR"; + case ter_furn_flag::TFLAG_HARVEST_REQ_CUT1: return "HARVEST_REQ_CUT1"; // *INDENT-ON* case ter_furn_flag::NUM_TFLAG_FLAGS: diff --git a/src/mapdata.h b/src/mapdata.h index cef92f682fd69..0092233e0d735 100644 --- a/src/mapdata.h +++ b/src/mapdata.h @@ -325,6 +325,7 @@ enum class ter_furn_flag : int { TFLAG_SINGLE_SUPPORT, TFLAG_CLIMB_ADJACENT, TFLAG_FLOATS_IN_AIR, + TFLAG_HARVEST_REQ_CUT1, NUM_TFLAG_FLAGS }; diff --git a/tests/overmap_test.cpp b/tests/overmap_test.cpp index 37a5c270c4abc..5c676fd12d529 100644 --- a/tests/overmap_test.cpp +++ b/tests/overmap_test.cpp @@ -499,7 +499,8 @@ TEST_CASE( "overmap_terrain_coverage", "[overmap][slow]" ) if( found ) { FAIL( "oter_type_id was found in map but had SHOULD_NOT_SPAWN flag" ); - } else if( !test_data::overmap_terrain_coverage_whitelist.count( id ) ) { + } else if( !test_data::overmap_terrain_coverage_whitelist.count( id ) && + !id->has_flag( oter_flags::ocean ) ) { missing.push_back( id ); } } @@ -520,11 +521,12 @@ TEST_CASE( "overmap_terrain_coverage", "[overmap][slow]" ) } ); CAPTURE( missing_oter_type_ids ); INFO( "To resolve errors about missing terrains you can either give the terrain the " - "SHOULD_NOT_SPAWN flag (intended for terrains that should never spawn, for example " - "test terrains or work in progress), or tweak the constraints so that the terrain " - "can spawn more reliably, or add them to the whitelist above in this function " - "(inteded for terrains that sometimes spawn, but cannot be expected to spawn " - "reliably enough for this test)" ); + "SHOULD_NOT_SPAWN flag, intended for terrains that should never spawn, for example " + "test terrains or work in progress, or tweak the constraints so that the terrain " + "can spawn more reliably, or add them to the whitelist at " + "/data/mods/TEST_DATA/overmap_terrain_coverage_test/overmap_terrain_coverage_whitelist.json " + "intended for terrains that sometimes spawn, but cannot be expected to spawn " + "reliably enough for this test." ); CHECK( num_missing == 0 ); } diff --git a/tools/spell_checker/dictionary.txt b/tools/spell_checker/dictionary.txt index 88cb3f1d830c4..c59c50310e91d 100644 --- a/tools/spell_checker/dictionary.txt +++ b/tools/spell_checker/dictionary.txt @@ -676,6 +676,8 @@ blacksmithy Blackstone blackwood Blacky +bladderwrack +bladelike bladesmithing blam Blandford @@ -3175,6 +3177,7 @@ Kohler koi koji Kojiki +kombu komodo kompot Kool