From 492ffd4e2003a6eb0dc9f5a74b6930c2cdc989af Mon Sep 17 00:00:00 2001 From: LyleSY Date: Mon, 13 Dec 2021 11:27:07 -0500 Subject: [PATCH 01/39] [DinoMod] fix coelophysis drops --- data/mods/DinoMod/monsters/dinosaur.json | 1 + 1 file changed, 1 insertion(+) diff --git a/data/mods/DinoMod/monsters/dinosaur.json b/data/mods/DinoMod/monsters/dinosaur.json index 76a3e7160f85f..739e7fab1417b 100644 --- a/data/mods/DinoMod/monsters/dinosaur.json +++ b/data/mods/DinoMod/monsters/dinosaur.json @@ -41,6 +41,7 @@ "GROUP_MORALE" ], "vision_day": 50, + "death_drops": { }, "harvest": "dino_feather_leather" }, { From 796170792749d3a3be31504cfeb642234bd16459 Mon Sep 17 00:00:00 2001 From: Hirmuolio Date: Mon, 13 Dec 2021 22:30:24 +0200 Subject: [PATCH 02/39] obsolete lajatang functions --- data/json/item_actions.json | 20 ------------------- src/item_factory.cpp | 4 ---- src/iuse.cpp | 38 ------------------------------------- src/iuse.h | 4 ---- 4 files changed, 66 deletions(-) diff --git a/data/json/item_actions.json b/data/json/item_actions.json index 97295b7aa9308..4c7c6a73f5f2e 100644 --- a/data/json/item_actions.json +++ b/data/json/item_actions.json @@ -399,26 +399,6 @@ "id": "CONTACTS", "name": { "str": "Put in eyes" } }, - { - "type": "item_action", - "id": "CS_LAJATANG_OFF", - "name": { "str": "Turn on" } - }, - { - "type": "item_action", - "id": "CS_LAJATANG_ON", - "name": { "str": "Turn off" } - }, - { - "type": "item_action", - "id": "ECS_LAJATANG_OFF", - "name": { "str": "Turn on" } - }, - { - "type": "item_action", - "id": "ECS_LAJATANG_ON", - "name": { "str": "Turn off" } - }, { "type": "item_action", "id": "DATURA", diff --git a/src/item_factory.cpp b/src/item_factory.cpp index 04197983a5c9e..e0032ae6aa03e 100644 --- a/src/item_factory.cpp +++ b/src/item_factory.cpp @@ -1200,10 +1200,6 @@ void Item_factory::init() add_iuse( "E_COMBATSAW_ON", &iuse::e_combatsaw_on ); add_iuse( "CONTACTS", &iuse::contacts ); add_iuse( "CROWBAR", &iuse::crowbar ); - add_iuse( "CS_LAJATANG_OFF", &iuse::cs_lajatang_off ); - add_iuse( "CS_LAJATANG_ON", &iuse::cs_lajatang_on ); - add_iuse( "ECS_LAJATANG_OFF", &iuse::ecs_lajatang_off ); - add_iuse( "ECS_LAJATANG_ON", &iuse::ecs_lajatang_on ); add_iuse( "DATURA", &iuse::datura ); add_iuse( "DIG", &iuse::dig ); add_iuse( "DIVE_TANK", &iuse::dive_tank ); diff --git a/src/iuse.cpp b/src/iuse.cpp index 37dcaadbdeaec..d61309f222970 100644 --- a/src/iuse.cpp +++ b/src/iuse.cpp @@ -3017,24 +3017,6 @@ cata::optional iuse::chainsaw_off( Character *p, item *it, bool, const trip _( "You yank the cord, but nothing happens." ) ); } -cata::optional iuse::elec_chainsaw_off( Character *p, item *it, bool, const tripoint & ) -{ - return toolweapon_off( *p, *it, - false, - rng( 0, 10 ) - it->damage_level() > 5 && !p->is_underwater(), - 20, _( "With a roar, the electric chainsaw screams to life!" ), - _( "You flip the switch, but nothing happens." ) ); -} - -cata::optional iuse::cs_lajatang_off( Character *p, item *it, bool, const tripoint & ) -{ - return toolweapon_off( *p, *it, - false, - rng( 0, 10 ) - it->damage_level() > 5 && it->ammo_remaining() > 1 && !p->is_underwater(), - 40, _( "With a roar, the chainsaws scream to life!" ), - _( "You yank the cords, but nothing happens." ) ); -} - cata::optional iuse::ecs_lajatang_off( Character *p, item *it, bool, const tripoint & ) { return toolweapon_off( *p, *it, @@ -3122,26 +3104,6 @@ cata::optional iuse::elec_chainsaw_on( Character *p, item *it, bool t, cons 15, 12, _( "Your electric chainsaw rumbles." ) ); } -cata::optional iuse::cs_lajatang_on( Character *p, item *it, bool t, const tripoint & ) -{ - return toolweapon_on( *p, *it, t, _( "chainsaw lajatang" ), - false, - 15, 12, _( "Your chainsaws rumble." ), - true ); - // The chainsaw lajatang drains 2 charges per turn, since - // there are two chainsaws. -} - -cata::optional iuse::ecs_lajatang_on( Character *p, item *it, bool t, const tripoint & ) -{ - return toolweapon_on( *p, *it, t, _( "electric chainsaw lajatang" ), - false, - 15, 12, _( "Your chainsaws buzz." ), - true ); - // The chainsaw lajatang drains 2 charges per turn, since - // there are two chainsaws. -} - cata::optional iuse::carver_on( Character *p, item *it, bool t, const tripoint & ) { return toolweapon_on( *p, *it, t, _( "electric carver" ), diff --git a/src/iuse.h b/src/iuse.h index 9d65de13ca707..623aed4f2cc9b 100644 --- a/src/iuse.h +++ b/src/iuse.h @@ -95,8 +95,6 @@ cata::optional combatsaw_off( Character *, item *, bool, const tripoint & ) cata::optional combatsaw_on( Character *, item *, bool, const tripoint & ); cata::optional contacts( Character *, item *, bool, const tripoint & ); cata::optional crowbar( Character *, item *, bool, const tripoint & ); -cata::optional cs_lajatang_off( Character *, item *, bool, const tripoint & ); -cata::optional cs_lajatang_on( Character *, item *, bool, const tripoint & ); cata::optional dig( Character *, item *, bool, const tripoint & ); cata::optional dig_channel( Character *, item *, bool, const tripoint & ); cata::optional directional_antenna( Character *, item *, bool, const tripoint & ); @@ -105,8 +103,6 @@ cata::optional dive_tank( Character *, item *, bool, const tripoint & ); cata::optional dog_whistle( Character *, item *, bool, const tripoint & ); cata::optional e_combatsaw_off( Character *, item *, bool, const tripoint & ); cata::optional e_combatsaw_on( Character *, item *, bool, const tripoint & ); -cata::optional ecs_lajatang_off( Character *, item *, bool, const tripoint & ); -cata::optional ecs_lajatang_on( Character *, item *, bool, const tripoint & ); cata::optional ehandcuffs( Character *, item *, bool, const tripoint & ); cata::optional einktabletpc( Character *, item *, bool, const tripoint & ); cata::optional elec_chainsaw_off( Character *, item *, bool, const tripoint & ); From 234fdbd53d6eaa2edd1c6dd8f113cb31997c14ad Mon Sep 17 00:00:00 2001 From: Hirmuolio Date: Mon, 13 Dec 2021 22:30:34 +0200 Subject: [PATCH 03/39] obsolete mre test --- tests/clzones_test.cpp | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/tests/clzones_test.cpp b/tests/clzones_test.cpp index ab01ccaf78a4f..84337a48c928d 100644 --- a/tests/clzones_test.cpp +++ b/tests/clzones_test.cpp @@ -223,18 +223,5 @@ TEST_CASE( "zone sorting comestibles ", "[zones][items][food][activities]" ) } } } - - // MREs are under the food category but are not directly edible. - GIVEN( "a non-comestible food" ) { - item noncomestible_food( "mre_dessert" ); - REQUIRE( noncomestible_food.get_category_shallow().get_id() == item_category_food ); - REQUIRE_FALSE( noncomestible_food.is_comestible() ); - - WHEN( "sorting" ) { - THEN( "should put in the food zone" ) { - CHECK( zm.get_near_zone_type_for_item( noncomestible_food, origin_pos ) == zone_type_LOOT_FOOD ); - } - } - } } } From 9668d0afc9aed45ef7d88705b561bd5757f726d6 Mon Sep 17 00:00:00 2001 From: Hirmuolio Date: Mon, 13 Dec 2021 22:43:54 +0200 Subject: [PATCH 04/39] fix mistake --- src/iuse.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/iuse.cpp b/src/iuse.cpp index d61309f222970..e389adf0e084f 100644 --- a/src/iuse.cpp +++ b/src/iuse.cpp @@ -3017,12 +3017,12 @@ cata::optional iuse::chainsaw_off( Character *p, item *it, bool, const trip _( "You yank the cord, but nothing happens." ) ); } -cata::optional iuse::ecs_lajatang_off( Character *p, item *it, bool, const tripoint & ) +cata::optional iuse::elec_chainsaw_off( Character *p, item *it, bool, const tripoint & ) { return toolweapon_off( *p, *it, false, - rng( 0, 10 ) - it->damage_level() > 5 && it->ammo_remaining() > 1 && !p->is_underwater(), - 40, _( "With a buzz, the chainsaws scream to life!" ), + rng( 0, 10 ) - it->damage_level() > 5 && !p->is_underwater(), + 20, _( "With a roar, the electric chainsaw screams to life!" ), _( "You flip the switch, but nothing happens." ) ); } From f321e2f1a0106208b3fe0b9179a23e3ade7f42d5 Mon Sep 17 00:00:00 2001 From: Hirmuolio <22011552+Hirmuolio@users.noreply.github.com> Date: Mon, 13 Dec 2021 23:12:31 +0200 Subject: [PATCH 05/39] unused variable --- tests/clzones_test.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/clzones_test.cpp b/tests/clzones_test.cpp index 84337a48c928d..ffb36644e26bd 100644 --- a/tests/clzones_test.cpp +++ b/tests/clzones_test.cpp @@ -13,8 +13,6 @@ static const faction_id faction_your_followers( "your_followers" ); -static const item_category_id item_category_food( "food" ); - static const zone_type_id zone_type_LOOT_DRINK( "LOOT_DRINK" ); static const zone_type_id zone_type_LOOT_FOOD( "LOOT_FOOD" ); static const zone_type_id zone_type_LOOT_PDRINK( "LOOT_PDRINK" ); From 83d3de81f196f8be5fc4c4fcbf6c51018cfd6404 Mon Sep 17 00:00:00 2001 From: ChucklesTheBeard Date: Tue, 14 Dec 2021 05:40:13 -0500 Subject: [PATCH 06/39] Remove remaining spawns for afs_electric_semi (#53400) --- data/mods/Aftershock/vehicles/vehicle_groups.json | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/data/mods/Aftershock/vehicles/vehicle_groups.json b/data/mods/Aftershock/vehicles/vehicle_groups.json index 5b76e7599794b..f1d6a669ed3ee 100644 --- a/data/mods/Aftershock/vehicles/vehicle_groups.json +++ b/data/mods/Aftershock/vehicles/vehicle_groups.json @@ -7,13 +7,7 @@ { "id": "parkinglot", "type": "vehicle_group", - "vehicles": [ - [ "afs_electric_semi", 300 ], - [ "car_atomic", 1000 ], - [ "car_sports_atomic", 100 ], - [ "suv_atomic", 1000 ], - [ "compact_atomic", 300 ] - ] + "vehicles": [ [ "car_atomic", 1000 ], [ "car_sports_atomic", 100 ], [ "suv_atomic", 1000 ], [ "compact_atomic", 300 ] ] }, { "id": "parkinglotbasic", @@ -36,11 +30,6 @@ "//": "For cs_car_showroom", "vehicles": [ [ "bubble_car", 60 ] ] }, - { - "id": "highway", - "type": "vehicle_group", - "vehicles": [ [ "afs_electric_semi", 300 ] ] - }, { "id": "afs_lab_cars", "type": "vehicle_group", From 158eb7a8ea44320deb9288926e90998af6af0130 Mon Sep 17 00:00:00 2001 From: Maleclypse <54345792+Maleclypse@users.noreply.github.com> Date: Tue, 14 Dec 2021 15:06:50 -0600 Subject: [PATCH 07/39] Basecamp Obstacle course (#53205) * Basecamp Obstacle course Moves to proper place Update construction.json * Update terrain-walls.json * fixes fixes fix * Update data/json/recipes/other/materials.json * Update modular_field_common.json * Update modular_field_common.json * Updating fbmh_2 * Parkour Practice complete * Update modular_field_common.json * Update modular_field_common.json * update for latest suggestions * Update harvest.json * Revert "Update harvest.json" This reverts commit 902c74672eea14869774b00185f35e5258ec264c. --- data/json/construction.json | 50 +++++++++++++++++ data/json/construction_group.json | 20 +++++++ .../furniture-recreation.json | 20 +++++++ .../terrain-floors-outdoors.json | 12 ++++ .../furniture_and_terrain/terrain-walls.json | 21 +++++++ data/json/items/basecamp.json | 7 +++ data/json/items/chemicals_and_resources.json | 17 ++++++ .../version_2/modular_field_common.json | 55 ++++++++++++++++--- .../recipe_modular_field_common.json | 13 +++++ data/json/recipes/other/materials.json | 14 +++++ data/json/recipes/practice/athletics.json | 16 ++++++ src/mapdata.cpp | 1 + src/mapdata.h | 1 + 13 files changed, 239 insertions(+), 8 deletions(-) diff --git a/data/json/construction.json b/data/json/construction.json index c18b50d938280..9b8e5215538ff 100644 --- a/data/json/construction.json +++ b/data/json/construction.json @@ -1055,6 +1055,18 @@ "pre_special": "check_empty", "post_terrain": "t_railroad_rubble" }, + { + "type": "construction", + "id": "constr_rubber_mulch", + "group": "make_rubber_mulch", + "//": "Covers the floor with rubber mulch. Used for constructing exercise spaces.", + "category": "CONSTRUCT", + "required_skills": [ [ "fabrication", 1 ] ], + "time": "40 m", + "components": [ [ [ "shredded_rubber", 200 ] ] ], + "pre_special": "check_empty", + "post_terrain": "t_rubber_mulch" + }, { "type": "construction", "id": "constr_railroad_track_small", @@ -1133,6 +1145,18 @@ "pre_terrain": "t_pit", "post_terrain": "t_reb_cage" }, + { + "type": "construction", + "id": "constr_parkour_bars", + "group": "build_parkour_bars", + "category": "CONSTRUCT", + "required_skills": [ [ "fabrication", 6 ] ], + "time": "420 m", + "using": [ [ "welding_standard", 2 ] ], + "components": [ [ [ "pipe", 36 ] ] ], + "pre_terrain": "t_pit", + "post_terrain": "f_parkour_bars" + }, { "type": "construction", "id": "constr_strconc_wall_halfway", @@ -1161,6 +1185,20 @@ "pre_terrain": "t_strconc_wall_halfway", "post_terrain": "t_strconc_wall" }, + { + "type": "construction", + "id": "constr_strconc_wall_rope", + "group": "build_reinforced_concrete_wall_ropes", + "//": "Step 3: finish wall", + "category": "CONSTRUCT", + "required_skills": [ [ "fabrication", 6 ] ], + "time": "120 m", + "tools": [ [ [ "con_mix", 50 ] ] ], + "qualities": [ [ { "id": "SMOOTH", "level": 2 } ] ], + "components": [ [ [ "concrete", 6 ] ], [ [ "2x4", 12 ] ], [ [ "rope_6", 8 ] ], [ [ "water", 4 ], [ "water_clean", 4 ] ] ], + "pre_terrain": "t_strconc_wall_halfway", + "post_terrain": "t_concrete_wall_rope" + }, { "type": "construction", "id": "constr_reb_cage_column", @@ -4537,6 +4575,18 @@ "pre_terrain": "t_railroad_rubble", "post_terrain": "t_dirt" }, + { + "type": "construction", + "id": "constr_remove_rubber_mulch", + "group": "remove_rubber_mulch", + "category": "OTHER", + "required_skills": [ [ "survival", 0 ] ], + "time": "60 m", + "qualities": [ [ { "id": "DIG", "level": 1 } ] ], + "byproducts": [ { "item": "shredded_rubber", "count": [ 150, 200 ] } ], + "pre_terrain": "t_rubber_mulch", + "post_terrain": "t_dirt" + }, { "type": "construction", "id": "constr_mechanical_winch", diff --git a/data/json/construction_group.json b/data/json/construction_group.json index 5175d5d2265da..f1896eba33db5 100644 --- a/data/json/construction_group.json +++ b/data/json/construction_group.json @@ -274,6 +274,11 @@ "id": "build_exercise_machine", "name": "Build Exercise Machine" }, + { + "type": "construction_group", + "id": "build_parkour_bars", + "name": "Build Parkour Bars" + }, { "type": "construction_group", "id": "build_fence", @@ -509,6 +514,11 @@ "id": "build_reinforced_concrete_wall", "name": "Build Reinforced Concrete Wall" }, + { + "type": "construction_group", + "id": "build_reinforced_concrete_wall_ropes", + "name": "Build Reinforced Concrete Wall with Ropes" + }, { "type": "construction_group", "id": "build_brick_wall_embrasure", @@ -1004,6 +1014,11 @@ "id": "make_gravel_floor", "name": "Make Gravel Floor" }, + { + "type": "construction_group", + "id": "make_rubber_mulch", + "name": "Make Rubber Mulch Floor" + }, { "type": "construction_group", "id": "make_woodchip_floor", @@ -1214,6 +1229,11 @@ "id": "remove_gravel", "name": "Remove Gravel" }, + { + "type": "construction_group", + "id": "remove_rubber_mulch", + "name": "Remove Rubber Mulch" + }, { "type": "construction_group", "id": "remove_empty_window", diff --git a/data/json/furniture_and_terrain/furniture-recreation.json b/data/json/furniture_and_terrain/furniture-recreation.json index e06c182c7d8e3..df406865daf1d 100644 --- a/data/json/furniture_and_terrain/furniture-recreation.json +++ b/data/json/furniture_and_terrain/furniture-recreation.json @@ -51,6 +51,26 @@ "items": [ { "item": "scrap", "count": [ 2, 6 ] }, { "item": "steel_chunk", "prob": 50 }, { "item": "pipe", "count": 1 } ] } }, + { + "type": "furniture", + "id": "f_parkour_bars", + "name": "parkour bars", + "looks_like": "t_monkey_bars", + "description": "A complicated set of monkey bars, to be used by adults to train parkour.", + "symbol": "#", + "color": "cyan", + "move_cost_mod": 6, + "required_str": -1, + "flags": [ "TRANSPARENT", "MOUNTABLE" ], + "crafting_pseudo_item": "parkour_practice", + "bash": { + "str_min": 16, + "str_max": 40, + "sound": "crack!", + "sound_fail": "ping.", + "items": [ { "item": "pipe", "count": [ 4, 8 ] }, { "item": "scrap", "count": [ 1, 4 ] } ] + } + }, { "type": "furniture", "id": "f_pool_table", diff --git a/data/json/furniture_and_terrain/terrain-floors-outdoors.json b/data/json/furniture_and_terrain/terrain-floors-outdoors.json index 3041d735febd6..78570201f513c 100644 --- a/data/json/furniture_and_terrain/terrain-floors-outdoors.json +++ b/data/json/furniture_and_terrain/terrain-floors-outdoors.json @@ -199,6 +199,18 @@ "flags": [ "TRANSPARENT", "FLAT", "ROAD" ], "bash": { "ter_set": "t_null", "str_min": 75, "str_max": 400, "str_min_supported": 100, "bash_below": true } }, + { + "type": "terrain", + "id": "t_rubber_mulch", + "name": "rubber mulch", + "description": "A large area mulched with shredded rubber. It's a softer place to land than regular dirt.", + "symbol": ".", + "color": "dark_gray", + "move_cost": 3, + "connects_to": "MULCHFLOOR", + "flags": [ "TRANSPARENT", "DIGGABLE", "FLAT" ], + "bash": { "sound": "thump", "ter_set": "t_null", "str_min": 50, "str_max": 100, "str_min_supported": 100, "bash_below": true } + }, { "type": "terrain", "id": "t_pavement", diff --git a/data/json/furniture_and_terrain/terrain-walls.json b/data/json/furniture_and_terrain/terrain-walls.json index a6997f8e54f06..17e7db0b1ee17 100644 --- a/data/json/furniture_and_terrain/terrain-walls.json +++ b/data/json/furniture_and_terrain/terrain-walls.json @@ -410,6 +410,27 @@ "items": [ { "item": "rock", "count": [ 10, 22 ] } ] } }, + { + "type": "terrain", + "id": "t_concrete_wall_rope", + "name": "concrete wall with ropes", + "looks_like": "t_rock", + "description": "A boxlike wall of concrete with ropes attached to the exterior edges. Used to train parkour.", + "symbol": "LINE_OXOX", + "color": "dark_gray", + "move_cost": 10, + "coverage": 100, + "roof": "t_flat_roof", + "flags": [ "NOITEM", "WALL", "NO_SCENT", "AUTO_WALL_SYMBOL", "MINEABLE", "BLOCK_WIND", "MOUNTABLE" ], + "bash": { + "str_min": 70, + "str_max": 300, + "sound": "crash!", + "sound_fail": "whump!", + "ter_set": "t_reb_cage", + "items": [ { "item": "rock", "count": [ 10, 22 ] }, { "item": "rope_6", "count": [ 2, 4 ] } ] + } + }, { "type": "terrain", "id": "t_wall_metal", diff --git a/data/json/items/basecamp.json b/data/json/items/basecamp.json index 2a2ce6a8ccec0..10454fc807831 100644 --- a/data/json/items/basecamp.json +++ b/data/json/items/basecamp.json @@ -70,5 +70,12 @@ "name": { "str": "basecamp drop hammer" }, "description": "A fake drop hammer used for basecamps.", "qualities": [ [ "HAMMER", 5 ] ] + }, + { + "id": "parkour_practice", + "type": "TOOL", + "copy-from": "fake_item", + "name": { "str": "basecamp parkour gym" }, + "description": "A fake parkour gym used for parkour training in basecamps." } ] diff --git a/data/json/items/chemicals_and_resources.json b/data/json/items/chemicals_and_resources.json index b36576c3ae1ae..fb5dcb6ce7428 100644 --- a/data/json/items/chemicals_and_resources.json +++ b/data/json/items/chemicals_and_resources.json @@ -88,6 +88,23 @@ "ammo_type": "components", "count": 50 }, + { + "type": "AMMO", + "id": "shredded_rubber", + "category": "spare_parts", + "price": 0, + "price_postapoc": 0, + "name": { "str_sp": "shredded rubber" }, + "symbol": "=", + "color": "dark_gray", + "description": "A handful of shredded rubber, usable as a mulch now.", + "material": [ "rubber" ], + "volume": "250 ml", + "weight": "6 g", + "bashing": 1, + "ammo_type": "components", + "count": 50 + }, { "type": "AMMO", "id": "material_limestone", diff --git a/data/json/mapgen/basecamps/base/modular_hub/version_2/modular_field_common.json b/data/json/mapgen/basecamps/base/modular_hub/version_2/modular_field_common.json index 73653d8b01088..36a590745c333 100644 --- a/data/json/mapgen/basecamps/base/modular_hub/version_2/modular_field_common.json +++ b/data/json/mapgen/basecamps/base/modular_hub/version_2/modular_field_common.json @@ -2,8 +2,24 @@ { "type": "palette", "id": "fbmh_2_palette_common", - "terrain": { ",": "t_dirt", ";": "t_dirt" }, - "furniture": { ",": "f_clear", ";": "f_bulletin" } + "terrain": { + ",": "t_dirt", + ";": "t_dirt", + ".": "t_rubber_mulch", + "x": "t_concrete_wall_rope", + "#": "t_rubber_mulch", + "c": "t_rubber_mulch", + "e": "t_rubber_mulch", + "E": "t_rubber_mulch" + }, + "furniture": { + ",": "f_clear", + "#": "f_parkour_bars", + ";": "f_bulletin", + "c": "f_counter", + "e": "f_earthbag_half", + "E": "f_earthbag_wall" + } }, { "type": "mapgen", @@ -12,12 +28,12 @@ "object": { "rows": [ ",,,,,,,,,,,,,,,,,,,,,,,,", - ",,,,, ,,,,,", - ",,,,, ,,,,,", - ",,,,, ,,,,,", - ",,,,, ,,,,,", - ",,,,, ,,,,,", - ",,,,, ,,,,,", + ",,,,,,,,,,, ,,,,,", + ",,,,,,,,,,, ,,,,,", + ",,,,,,,,,,, ,,,,,", + ",,,,,,,,,,, ,,,,,", + ",,,,,,,,,,, ,,,,,", + ",,,,,,,,,,, ,,,,,", ",,,,, ,,,,,", ",,,,, ,; , ,, ,,,,,", ",,,,,,,,,,,,,,,,,,,,,,,,", @@ -342,5 +358,28 @@ "update_mapgen_id": "fbmh_2_radio_console", "method": "json", "object": { "set": [ { "point": "terrain", "id": "t_radio_controls", "x": 16, "y": 8 } ] } + }, + { + "type": "mapgen", + "update_mapgen_id": "fbmh_2_parkour", + "method": "json", + "object": { "place_nested": [ { "chunks": [ "fbmh_2_parkour" ], "x": 5, "y": 1 } ] } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "fbmh_2_parkour", + "object": { + "mapgensize": [ 6, 6 ], + "rows": [ + ".cc...", + "....#.", + "..x.#.", + "...x..", + "......", + ".eEe.." + ], + "palettes": [ "fbmh_2_palette_common" ] + } } ] diff --git a/data/json/recipes/basecamps/base/recipe_modular_hub/version_2/recipe_modular_field_common.json b/data/json/recipes/basecamps/base/recipe_modular_hub/version_2/recipe_modular_field_common.json index 55c14d2792124..16fa1b2efe185 100644 --- a/data/json/recipes/basecamps/base/recipe_modular_hub/version_2/recipe_modular_field_common.json +++ b/data/json/recipes/basecamps/base/recipe_modular_hub/version_2/recipe_modular_field_common.json @@ -539,5 +539,18 @@ [ [ "motor_small", 1 ], [ "motor_tiny", 2 ] ] ], "check_blueprint_needs": false + }, + { + "type": "recipe", + "result": "fbmh_2_parkour", + "description": "Let's build a parkour obstacle training course in the northern courtyard.", + "category": "CC_BUILDING", + "subcategory": "CSC_BUILDING_BASES", + "autolearn": false, + "never_learn": true, + "construction_blueprint": "fbmh_2_parkour", + "blueprint_name": "build an obstacle course", + "blueprint_provides": [ { "id": "fbmh_2_parkour" } ], + "blueprint_excludes": [ { "id": "fbmh_2_parkour" } ] } ] diff --git a/data/json/recipes/other/materials.json b/data/json/recipes/other/materials.json index 1ff3ca9f0497a..1eba088e4fdec 100644 --- a/data/json/recipes/other/materials.json +++ b/data/json/recipes/other/materials.json @@ -45,6 +45,20 @@ "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "ANVIL", "level": 1 } ], "components": [ [ [ "pebble", 10 ] ] ] }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "result": "shredded_rubber", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "survival", + "skills_required": [ "survival", 1 ], + "difficulty": 1, + "time": "10m", + "autolearn": true, + "qualities": [ { "id": "CUT", "level": 1 } ], + "components": [ [ [ "chunk_rubber", 2 ] ] ] + }, { "type": "recipe", "activity_level": "MODERATE_EXERCISE", diff --git a/data/json/recipes/practice/athletics.json b/data/json/recipes/practice/athletics.json index c5689d43749cb..027cd57a595ad 100644 --- a/data/json/recipes/practice/athletics.json +++ b/data/json/recipes/practice/athletics.json @@ -27,5 +27,21 @@ "autolearn": [ [ "swimming", 2 ] ], "flags": [ "BLIND_EASY" ], "tools": [ [ "pseudo_exercise_machine", "pseudo_punching_bag", "pseudo_ergometer_mechanical", "pseudo_treadmill_mechanical" ] ] + }, + { + "id": "prac_parkour", + "type": "practice", + "activity_level": "BRISK_EXERCISE", + "category": "CC_PRACTICE", + "subcategory": "CSC_PRACTICE_ATHLETICS", + "name": "parkour", + "description": "Practice parkour using a complex obstacle course.", + "skill_used": "swimming", + "autolearn": [ [ "swimming", 5 ] ], + "time": "1 h", + "practice_data": { "min_difficulty": 3, "max_difficulty": 6, "skill_limit": 5 }, + "proficiencies": [ { "proficiency": "prof_parkour", "fail_multiplier": 3, "time_multiplier": 2 } ], + "flags": [ "BLIND_EASY" ], + "tools": [ [ "parkour_practice" ] ] } ] diff --git a/src/mapdata.cpp b/src/mapdata.cpp index 101429816f17b..59b162ea26017 100644 --- a/src/mapdata.cpp +++ b/src/mapdata.cpp @@ -278,6 +278,7 @@ static const std::unordered_map ter_connects_map = { { "CLAY", TERCONN_CLAY }, { "DIRT", TERCONN_DIRT }, { "ROCKFLOOR", TERCONN_ROCKFLOOR }, + { "MULCHFLOOR", TERCONN_MULCHFLOOR }, { "METALFLOOR", TERCONN_METALFLOOR }, { "WOODFLOOR", TERCONN_WOODFLOOR }, } diff --git a/src/mapdata.h b/src/mapdata.h index e73ec0507d452..99d3b6b42c385 100644 --- a/src/mapdata.h +++ b/src/mapdata.h @@ -326,6 +326,7 @@ enum ter_connects : int { TERCONN_CLAY, TERCONN_DIRT, TERCONN_ROCKFLOOR, + TERCONN_MULCHFLOOR, TERCONN_METALFLOOR, TERCONN_WOODFLOOR, }; From 7f8f86901b0f46cf663a7a16e71def0658e26fc4 Mon Sep 17 00:00:00 2001 From: Adam Chirnside Date: Tue, 14 Dec 2021 17:25:09 -0400 Subject: [PATCH 08/39] A few small changes to exodii guns (#53328) * A few small changes to exodii guns Adds PA md 68 and Rubik variant to vehicle turret mount. Makes 68 actually reliable, clean up formatting somewhat * linting * change turrets file to accept only modified 68s * Made recipe for altering PA md 68 In order to render the battle rifle usable on Earth vehicle turrets, a little welding and metalworking is required. * fix missing comma * lint ranged.json * type * JSON style * add to Generic Guns migration file * make names more meaningful * add a missing space * variants * LINT * Update exodii.json * Update ranged.json * Update ranged.json --- data/json/items/gun/exodii.json | 51 ++++++++++++++++--- data/json/recipes/weapon/ranged.json | 17 +++++++ data/json/vehicleparts/turret.json | 11 ++++ .../firearms/gg_firearms_migration.json | 2 +- 4 files changed, 72 insertions(+), 9 deletions(-) diff --git a/data/json/items/gun/exodii.json b/data/json/items/gun/exodii.json index 2dae628b86e7e..fdaa5e14cb14b 100644 --- a/data/json/items/gun/exodii.json +++ b/data/json/items/gun/exodii.json @@ -1,10 +1,10 @@ [ { "id": "pamd68", + "copy-from": "rifle_manual", "looks_like": "ar15", "type": "GUN", - "reload_noise_volume": 10, - "name": { "str": "PA md. 68 Battle Rifle" }, + "name": { "str": "Exodii Battle Rifle" }, "description": "The most popular gun to use the 12.3ln cartridge was, of course, the PA md. 71. Its predecessor, the md. 68, was viewed by many as a sort of failure: although it was reliable and powerful, it was too heavy to be used as a good infantry weapon, and not really heavy enough to be a good support gun. Enough were made, though, that during the zombie apocalypse, it gained a great deal of resurgent popularity as a light emplacement gun that used readily available ammunition. It perfectly served the purposes of the Exodii, who had far less concern about its unwieldiness.", "weight": "9480 g", "volume": "2800 ml", @@ -12,19 +12,26 @@ "longest_side": "1000 mm", "price": 350000, "price_postapoc": 4000, + "variant_type": "gun", + "variants": [ + { + "id": "pamd68", + "name": { "str": "PA md. 68" }, + "description": "The most popular gun to use the 12.3ln cartridge was, of course, the PA md. 71. Its predecessor, the md. 68, was viewed by many as a sort of failure: although it was reliable and powerful, it was too heavy to be used as a good infantry weapon, and not really heavy enough to be a good support gun. Enough were made, though, that during the zombie apocalypse, it gained a great deal of resurgent popularity as a light emplacement gun that used readily available ammunition. It perfectly served the purposes of the Exodii, who had far less concern about its unwieldiness.", + "weight": 1 + } + ], "to_hit": -3, "bashing": 12, "material": [ "steel", "aluminum" ], "symbol": "(", "color": "dark_gray", "ammo": [ "123ln" ], - "skill": "rifle", "dispersion": 190, "durability": 9, - "min_cycle_recoil": 3820, - "modes": [ [ "DEFAULT", "auto", 2 ], [ "AUTO", "auto", 5 ] ], + "modes": [ [ "DEFAULT", "burst", 2 ], [ "SEMI", "semi-auto", 1 ], [ "AUTO", "auto", 5 ] ], "barrel_volume": "1200 ml", - "faults": [ "fault_gun_blackpowder", "fault_gun_dirt", "fault_gun_chamber_spent" ], + "faults": [ "fault_gun_dirt", "fault_gun_chamber_spent" ], "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", "item_restriction": [ "exodiiBRmag" ] } ] }, { @@ -32,14 +39,23 @@ "copy-from": "rifle_manual", "looks_like": "ar15", "type": "GUN", - "name": { "str": "PA md. 71 zombie hunting rifle" }, - "description": "This extremely popular Romanian assault rifle, made famous in the third Carpachian War, has been redesigned slightly by the Exodii to serve as a sniper weapon. It is well suited to precision shots against high-priority targets. This modified design fires an extremely rapid 5-shot burst, with the goal of shredding the target and preventing revivification.", + "name": { "str": "Exodii zombie hunting rifle" }, + "description": "This extremely popular Romanian assault rifle, made famous in the third Carpathian War, has been redesigned slightly by the Exodii to serve as a sniper weapon. It is well suited to precision shots against high-priority targets. This modified design fires an extremely rapid 5-shot burst, with the goal of shredding the target and preventing revivification.", "weight": "3910 g", "volume": "3 L", "//": "around the length of other long 30-06 rifles and heavier AR's", "longest_side": "1100 mm", "price": 80000, "price_postapoc": 3250, + "variant_type": "gun", + "variants": [ + { + "id": "pamd71z", + "name": { "str": "PA md. 71z" }, + "description": "This extremely popular Romanian assault rifle, made famous in the third Carpathian War, has been redesigned slightly by the Exodii to serve as a sniper weapon. It is well suited to precision shots against high-priority targets. This modified design fires an extremely rapid 5-shot burst, with the goal of shredding the target and preventing revivification.", + "weight": 1 + } + ], "to_hit": -1, "bashing": 12, "material": [ "steel", "aluminum" ], @@ -49,6 +65,25 @@ "durability": 8, "modes": [ [ "DEFAULT", "auto", 5 ] ], "barrel_volume": "250 ml", + "faults": [ "fault_gun_dirt", "fault_gun_chamber_spent" ], "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", "item_restriction": [ "exodiiminimag" ] } ] + }, + { + "id": "pamd68mountable", + "copy-from": "pamd68", + "type": "GUN", + "name": { "str": "Mountable PA md. 68 Battle Rifle" }, + "description": "The most popular gun to use the 12.3ln cartridge was, of course, the PA md. 71. Its predecessor, the md. 68, was viewed by many as a sort of failure: although it was reliable and powerful, it was too heavy to be used as a good infantry weapon, and not really heavy enough to be a good support gun. Enough were made, though, that during the zombie apocalypse, it gained a great deal of resurgent popularity as a light emplacement gun that used readily available ammunition. It perfectly served the purposes of the Exodii, who had far less concern about its unwieldiness. This one has been modified for use in vehicle turrets on Earth.", + "weight": "9630 g", + "volume": "2865 ml", + "variant_type": "gun", + "variants": [ + { + "id": "pamd68mountable", + "name": { "str": "Mountable PA md. 68" }, + "description": "The most popular gun to use the 12.3ln cartridge was, of course, the PA md. 71. Its predecessor, the md. 68, was viewed by many as a sort of failure: although it was reliable and powerful, it was too heavy to be used as a good infantry weapon, and not really heavy enough to be a good support gun. Enough were made, though, that during the zombie apocalypse, it gained a great deal of resurgent popularity as a light emplacement gun that used readily available ammunition. It perfectly served the purposes of the Exodii, who had far less concern about its unwieldiness. This one has been modified for use in vehicle turrets on Earth.", + "weight": 1 + } + ] } ] diff --git a/data/json/recipes/weapon/ranged.json b/data/json/recipes/weapon/ranged.json index f4a3cbff10a4e..f5050fe031af2 100644 --- a/data/json/recipes/weapon/ranged.json +++ b/data/json/recipes/weapon/ranged.json @@ -1332,5 +1332,22 @@ [ [ "scrap", 10 ] ], [ [ "cable", 100 ] ] ] + }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "result": "pamd68mountable", + "category": "CC_WEAPON", + "subcategory": "CSC_WEAPON_RANGED", + "skill_used": "fabrication", + "skills_required": [ [ "mechanics", 2 ], [ "rifle", 3 ] ], + "difficulty": 3, + "time": "25 m", + "using": [ [ "welding_standard", 10 ] ], + "autolearn": true, + "qualities": [ { "id": "HAMMER", "level": 2 } ], + "proficiencies": [ { "proficiency": "prof_metalworking" }, { "proficiency": "prof_welding_basic" } ], + "tools": [ [ [ "drift", -1 ] ] ], + "components": [ [ [ "scrap", 3 ] ], [ [ "pamd68", 1 ] ] ] } ] diff --git a/data/json/vehicleparts/turret.json b/data/json/vehicleparts/turret.json index dfce3ef6594f4..de2979762bbe5 100644 --- a/data/json/vehicleparts/turret.json +++ b/data/json/vehicleparts/turret.json @@ -313,5 +313,16 @@ "name": { "str": "plugged 3-inch ordnance rifle" }, "flags": [ ], "description": "Unfortunately, some responsible killjoy poured concrete in the barrel of this historic cannon to make it safe for display." + }, + { + "id": "mounted_pamd68", + "copy-from": "turret", + "type": "vehicle_part", + "name": { "str": "mounted PA md. 68" }, + "item": "pamd68mountable", + "color": "dark_gray", + "broken_color": "dark_gray", + "breaks_into": [ { "item": "scrap", "count": 11 }, { "item": "steel_chunk", "count": 6 }, { "item": "steel_lump", "count": 2 } ], + "requirements": { "install": { "skills": [ [ "mechanics", 4 ], [ "rifle", 2 ] ] }, "removal": { "skills": [ [ "mechanics", 2 ] ] } } } ] diff --git a/data/mods/Generic_Guns/firearms/gg_firearms_migration.json b/data/mods/Generic_Guns/firearms/gg_firearms_migration.json index cf3ef23505ec0..4c9a377a23a14 100644 --- a/data/mods/Generic_Guns/firearms/gg_firearms_migration.json +++ b/data/mods/Generic_Guns/firearms/gg_firearms_migration.json @@ -295,7 +295,7 @@ "replace": "rifle_sporter" }, { - "id": [ "pamd68", "pamd71z", "pamd68rubik" ], + "id": [ "pamd68", "pamd71z", "pamd68rubik", "pamd68mountable" ], "type": "MIGRATION", "replace": "rifle_assault_foreign" }, From 2e6d9c41a9dd28197b3db5a7ba549b345b03fc54 Mon Sep 17 00:00:00 2001 From: Termineitor244 Date: Tue, 14 Dec 2021 15:36:42 -0600 Subject: [PATCH 09/39] Santa costumes! 2 (#53159) * Santa Costume * More santas Santa dresses and beard Sexy santas * Grammar adjustmens * Update torso_clothes.json * Christmas drops * Update spawn probability * Apply suggestions from code review Co-authored-by: I-am-Erk <45136638+I-am-Erk@users.noreply.github.com> * Fix spaces Co-authored-by: I-am-Erk <45136638+I-am-Erk@users.noreply.github.com> --- .../itemgroups/Clothing_Gear/clothing.json | 163 +++++++++++++--- data/json/items/armor/belts.json | 28 +++ data/json/items/armor/coats.json | 59 ++++++ data/json/items/armor/gloves.json | 30 +++ data/json/items/armor/hats.json | 18 ++ data/json/items/armor/legs_clothes.json | 77 ++++++++ data/json/items/armor/masks.json | 19 ++ data/json/items/armor/torso_clothes.json | 83 ++++++++ .../json/monsterdrops/clothing_christmas.json | 177 ++++++++++++++++++ data/json/monsterdrops/zombie_default.json | 17 +- 10 files changed, 648 insertions(+), 23 deletions(-) create mode 100644 data/json/monsterdrops/clothing_christmas.json diff --git a/data/json/itemgroups/Clothing_Gear/clothing.json b/data/json/itemgroups/Clothing_Gear/clothing.json index e93f88305ee42..23b066349648e 100644 --- a/data/json/itemgroups/Clothing_Gear/clothing.json +++ b/data/json/itemgroups/Clothing_Gear/clothing.json @@ -1158,7 +1158,8 @@ { "item": "hot_pants_fur", "prob": 5 }, { "item": "hot_pants_leather", "prob": 25 }, { "item": "breeches", "prob": 25 }, - { "group": "pants_mens", "prob": 10 } + { "group": "pants_mens", "prob": 10 }, + { "group": "christmas_pants_male", "prob": 150, "event": "christmas" } ] }, { @@ -1308,7 +1309,19 @@ [ "hakama", 4 ], [ "eclipse_glasses", 1 ], [ "thermos", 20 ], - [ "camera_bag", 5 ] + [ "camera_bag", 5 ], + [ "santa_jacket", 1 ], + [ "santa_jacket_short", 1 ], + [ "santa_shorts", 1 ], + [ "santa_pants", 1 ], + [ "santa_gloves", 1 ], + [ "gloves_white", 5 ], + [ "santa_hat", 1 ], + [ "santa_belt", 1 ], + [ "santa_beard", 1 ], + [ "santa_dress", 1 ], + [ "santa_dress_long", 1 ], + [ "santa_dress_short", 1 ] ] }, { @@ -1359,9 +1372,17 @@ [ "postman_shorts", 5 ], [ "b_shorts", 15 ], [ "kilt", 2 ], - [ "nanoskirt", 10 ] + [ "nanoskirt", 10 ], + { "group": "costume_pants", "prob": 1 } ] }, + { + "type": "item_group", + "id": "costume_pants", + "//": "pants for costumes, cosplay and costume parties ", + "subtype": "distribution", + "entries": [ { "item": "santa_pants", "prob": 10 }, { "item": "santa_shorts", "prob": 5 } ] + }, { "type": "item_group", "id": "shirts", @@ -1406,9 +1427,17 @@ { "group": "neckties", "prob": 5 }, [ "tieclip", 2 ], [ "collarpin", 2 ], - [ "apron_leather", 1 ] + [ "apron_leather", 1 ], + { "group": "costume_jackets", "prob": 1 } ] }, + { + "type": "item_group", + "id": "costume_jackets", + "//": "jackets for costumes, cosplay and costume parties ", + "subtype": "distribution", + "entries": [ { "item": "santa_jacket", "prob": 10 }, { "item": "santa_jacket_short", "prob": 5 } ] + }, { "type": "item_group", "id": "suits", @@ -1466,7 +1495,19 @@ [ "tights", 20 ], [ "arm_warmers", 20 ], [ "leg_warmers", 20 ], - [ "balclava", 15 ] + [ "balclava", 15 ], + [ "santa_jacket", 1 ], + [ "santa_jacket_short", 1 ], + [ "santa_shorts", 1 ], + [ "santa_pants", 1 ], + [ "santa_gloves", 1 ], + [ "gloves_white", 1 ], + [ "santa_hat", 1 ], + [ "santa_belt", 1 ], + [ "santa_beard", 1 ], + [ "santa_dress", 1 ], + [ "santa_dress_long", 1 ], + [ "santa_dress_short", 1 ] ] }, { @@ -1558,7 +1599,8 @@ [ "kippah", 30 ], [ "eboshi", 30 ], [ "balclava", 20 ], - [ "porkpie", 30 ] + [ "porkpie", 30 ], + { "group": "christmas_hats", "prob": 850, "event": "christmas" } ] }, { @@ -1866,7 +1908,19 @@ { "item": "kimono", "prob": 2 }, { "item": "yukata", "prob": 4 }, { "item": "haori", "prob": 1 }, - { "item": "hakama", "prob": 2 } + { "item": "hakama", "prob": 2 }, + { "item": "santa_jacket", "prob": 1 }, + { "item": "santa_jacket_short", "prob": 1 }, + { "item": "santa_shorts", "prob": 1 }, + { "item": "santa_pants", "prob": 1 }, + { "item": "santa_gloves", "prob": 1 }, + { "item": "gloves_white", "prob": 5 }, + { "item": "santa_hat", "prob": 1 }, + { "item": "santa_belt", "prob": 1 }, + { "item": "santa_beard", "prob": 1 }, + { "item": "santa_dress", "prob": 1 }, + { "item": "santa_dress_long", "prob": 1 }, + { "item": "santa_dress_short", "prob": 1 } ] }, { @@ -2739,7 +2793,19 @@ [ "linuxtshirt", 20 ], [ "kilt", 2 ], [ "nanoskirt", 10 ], - [ "robe", 50 ] + [ "robe", 50 ], + [ "santa_jacket", 1 ], + [ "santa_jacket_short", 1 ], + [ "santa_shorts", 1 ], + [ "santa_pants", 1 ], + [ "santa_gloves", 1 ], + [ "gloves_white", 5 ], + [ "santa_hat", 1 ], + [ "santa_belt", 1 ], + [ "santa_beard", 1 ], + [ "santa_dress", 1 ], + [ "santa_dress_long", 1 ], + [ "santa_dress_short", 1 ] ] }, { @@ -2754,8 +2820,10 @@ { "item": "gloves_winter", "prob": 10 }, { "item": "gloves_fingerless", "prob": 15 }, { "item": "gloves_liner", "prob": 15 }, + { "item": "gloves_white", "prob": 10 }, { "item": "mittens", "prob": 5 }, - { "item": "thermal_gloves", "prob": 2 } + { "item": "thermal_gloves", "prob": 2 }, + { "group": "christmas_common_gloves", "prob": 70, "event": "christmas" } ] }, { @@ -2774,7 +2842,9 @@ [ "copper_bracelet", 10 ], [ "sunglasses", 25 ], [ "tieclip", 15 ], - [ "hairpin", 15 ] + [ "hairpin", 15 ], + [ "santa_beard", 5 ], + [ "santa_hat", 4 ] ] }, { @@ -2846,7 +2916,20 @@ }, { "item": "hat_knit", "prob": 30 }, { "item": "hat_cotton", "prob": 40 }, - { "item": "hat_ball", "prob": 50 } + { "item": "hat_ball", "prob": 50 }, + { "group": "costume_hats_unisex", "prob": 1 } + ] + }, + { + "type": "item_group", + "id": "costume_hats_unisex", + "//": "hats for costumes, cosplay and costume parties ", + "subtype": "distribution", + "entries": [ + { "item": "santa_hat", "prob": 10 }, + { "item": "hat_sombrero", "prob": 5 }, + { "item": "cowboy_hat", "prob": 5 }, + { "item": "tricorne", "prob": 1 } ] }, { @@ -2855,12 +2938,25 @@ "//": "unisex masks for domestic locations", "subtype": "distribution", "items": [ - { "item": "bondage_mask", "prob": 10 }, + { "item": "bondage_mask", "prob": 5 }, { "item": "mask_dust", "prob": 15 }, - { "item": "mask_guy_fawkes", "prob": 10 }, - { "item": "mask_hockey", "prob": 15 }, + { "item": "mask_guy_fawkes", "prob": 1 }, + { "item": "mask_hockey", "prob": 10 }, { "item": "mouthpiece", "prob": 5 }, - { "item": "mask_filter", "prob": 5, "charges": [ 0, 100 ] } + { "item": "mask_filter", "prob": 5, "charges": [ 0, 100 ] }, + { "group": "costume_masks_unisex", "prob": 10 } + ] + }, + { + "type": "item_group", + "id": "costume_masks_unisex", + "//": "masks for costumes, cosplay and costume parties ", + "subtype": "distribution", + "entries": [ + { "item": "santa_beard", "prob": 10 }, + { "item": "mask_guy_fawkes", "prob": 10 }, + { "item": "mask_hockey", "prob": 10 }, + { "item": "bondage_mask", "prob": 5 } ] }, { @@ -3051,7 +3147,19 @@ { "item": "gloves_golf", "prob": 10 }, { "item": "wetsuit_gloves", "prob": 5 }, { "item": "gloves_fur", "prob": 5 }, - { "item": "thermal_gloves", "prob": 2 } + { "item": "thermal_gloves", "prob": 2 }, + { "group": "costume_gloves_unisex", "prob": 1 } + ] + }, + { + "type": "item_group", + "id": "costume_gloves_unisex", + "//": "gloves for costumes, cosplay and costume parties ", + "subtype": "distribution", + "entries": [ + { "item": "gloves_white", "prob": 10 }, + { "item": "santa_gloves", "prob": 5 }, + { "item": "gloves_leather", "prob": 5 } ] }, { @@ -3147,10 +3255,22 @@ "id": "dresses_womens", "subtype": "distribution", "entries": [ - { "item": "dress", "prob": 5 }, - { "item": "sundress", "prob": 5 }, - { "item": "gown", "prob": 2 }, - { "item": "dress_wedding", "prob": 1 } + { "item": "dress", "prob": 10 }, + { "item": "sundress", "prob": 10 }, + { "item": "gown", "prob": 4 }, + { "item": "dress_wedding", "prob": 2 }, + { "group": "costume_dresses_womens", "prob": 1 } + ] + }, + { + "type": "item_group", + "id": "costume_dresses_womens", + "//": "dresses for costumes, cosplay and costume parties ", + "subtype": "distribution", + "entries": [ + { "item": "santa_dress", "prob": 10 }, + { "item": "santa_dress_short", "prob": 5 }, + { "item": "santa_dress_long", "prob": 1 } ] }, { @@ -3276,7 +3396,8 @@ { "item": "blazer", "prob": 70 } ], "prob": 40 - } + }, + { "group": "christmas_coats_unisex", "prob": 80, "event": "christmas" } ] }, { diff --git a/data/json/items/armor/belts.json b/data/json/items/armor/belts.json index 541ee98e2e91b..fb039ed02acf9 100644 --- a/data/json/items/armor/belts.json +++ b/data/json/items/armor/belts.json @@ -175,6 +175,34 @@ "flags": [ "WAIST", "WATER_FRIENDLY" ], "armor": [ { "encumbrance": [ 2, 5 ], "coverage": 5, "covers": [ "torso" ] } ] }, + { + "id": "santa_belt", + "type": "ARMOR", + "name": { "str": "broad belt" }, + "description": "A broad, buckled leather belt, commonly used by bearded men on Christmas. Usually worn over a red jacket.", + "weight": "150 g", + "volume": "350 ml", + "price": 9000, + "price_postapoc": 250, + "bashing": 5, + "material": [ "leather", "steel" ], + "symbol": "[", + "color": "dark_gray", + "material_thickness": 1.5, + "pocket_data": [ + { + "holster": true, + "max_contains_volume": "1200 ml", + "max_contains_weight": "800 g", + "max_item_length": "90 cm", + "moves": 60, + "flag_restriction": [ "BELT_CLIP" ] + } + ], + "use_action": { "type": "holster", "holster_prompt": "Stick what into your belt", "holster_msg": "You tuck your %s into your %s" }, + "flags": [ "WAIST", "WATER_FRIENDLY" ], + "armor": [ { "coverage": 15, "covers": [ "torso" ] } ] + }, { "id": "tool_belt", "type": "ARMOR", diff --git a/data/json/items/armor/coats.json b/data/json/items/armor/coats.json index 5f76ab12396bf..7d4ba4c508c23 100644 --- a/data/json/items/armor/coats.json +++ b/data/json/items/armor/coats.json @@ -1565,6 +1565,65 @@ "flags": [ "VARSIZE", "OUTER" ], "armor": [ { "encumbrance": 2, "coverage": 90, "covers": [ "leg_l", "leg_r", "torso" ] } ] }, + { + "id": "santa_jacket", + "type": "ARMOR", + "name": { "str": "santa jacket" }, + "description": "A red jacket, trimmed with white faux fur, commonly used by bearded men on Christmas. Warm and has a couple of small pockets.", + "weight": "1500 g", + "volume": "4500 ml", + "price": 45000, + "price_postapoc": 500, + "to_hit": -5, + "material": [ "cotton", "faux_fur" ], + "symbol": "[", + "looks_like": "coat_winter", + "color": "red", + "armor": [ + { "covers": [ "torso" ], "coverage": 95, "encumbrance": [ 20, 25 ] }, + { "covers": [ "arm_l", "arm_r" ], "coverage": 95, "encumbrance": [ 18, 18 ] } + ], + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "max_contains_volume": "500 ml", + "max_contains_weight": "2 kg", + "max_item_length": "16 cm", + "moves": 80 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "500 ml", + "max_contains_weight": "2 kg", + "max_item_length": "16 cm", + "moves": 80 + } + ], + "warmth": 40, + "material_thickness": 2, + "environmental_protection": 2, + "flags": [ "VARSIZE", "POCKETS", "OUTER" ] + }, + { + "id": "santa_jacket_short", + "type": "ARMOR", + "name": { "str": "short santa jacket" }, + "description": "A short red jacket with white faux fur as trim, similar to a Santa jacket but sleeveless, for a more revealing look on Christmas.", + "weight": "1200 g", + "volume": "2000 ml", + "price": 18000, + "price_postapoc": 70, + "to_hit": -5, + "material": [ "cotton", "faux_fur" ], + "symbol": "[", + "looks_like": "jacket_leather_red", + "color": "red", + "armor": [ { "covers": [ "torso" ], "coverage": 75, "encumbrance": 6 } ], + "warmth": 15, + "material_thickness": 1, + "environmental_protection": 1, + "flags": [ "VARSIZE", "OUTER" ] + }, { "id": "ski_jacket", "repairs_like": "trenchcoat", diff --git a/data/json/items/armor/gloves.json b/data/json/items/armor/gloves.json index 16efc8f3de8fe..0368bf54352f9 100644 --- a/data/json/items/armor/gloves.json +++ b/data/json/items/armor/gloves.json @@ -719,6 +719,25 @@ "flags": [ "VARSIZE", "WATER_FRIENDLY", "SKINTIGHT", "STURDY" ], "armor": [ { "encumbrance": 6, "coverage": 100, "covers": [ "hand_l", "hand_r" ] } ] }, + { + "id": "santa_gloves", + "type": "ARMOR", + "name": { "str": "pair of santa gloves", "str_pl": "pairs of santa gloves" }, + "description": "A pair of red gloves with white faux fur trim. Keeps your hands warm and your holiday spirit bright.", + "weight": "400 g", + "volume": "1 L", + "price": 4000, + "price_postapoc": 250, + "to_hit": 1, + "material": [ "cotton", "faux_fur" ], + "repairs_like": "gloves_light", + "symbol": "[", + "looks_like": "gloves_fur", + "color": "red", + "warmth": 30, + "material_thickness": 0.5, + "armor": [ { "encumbrance": 10, "coverage": 95, "covers": [ "hand_l", "hand_r" ] } ] + }, { "id": "sockmitts", "type": "ARMOR", @@ -774,6 +793,17 @@ "material_thickness": 2, "armor": [ { "encumbrance": 20, "coverage": 100, "covers": [ "hand_l", "hand_r" ] } ] }, + { + "id": "gloves_white", + "type": "ARMOR", + "name": { "str": "pair of white gloves", "str_pl": "pairs of white gloves" }, + "description": "A pair of white costume gloves made out of cotton.", + "copy-from": "gloves_liner", + "color": "white", + "material_thickness": 0.2, + "flags": [ "VARSIZE", "SKINTIGHT" ], + "armor": [ { "encumbrance": 5, "coverage": 95, "covers": [ "hand_l", "hand_r" ] } ] + }, { "id": "gloves_golf", "repairs_like": "gloves_light", diff --git a/data/json/items/armor/hats.json b/data/json/items/armor/hats.json index 14e2fd68074dd..b2c5ed64126b2 100644 --- a/data/json/items/armor/hats.json +++ b/data/json/items/armor/hats.json @@ -509,6 +509,24 @@ "flags": [ "SUN_GLASSES" ], "armor": [ { "encumbrance": 10, "coverage": 60, "covers": [ "head" ] } ] }, + { + "id": "santa_hat", + "type": "ARMOR", + "name": { "str": "santa hat" }, + "description": "A red hat with white faux fur trim, commonly used by bearded men on Christmas.", + "weight": "200 g", + "volume": "500 ml", + "price": 5000, + "price_postapoc": 500, + "material": [ "cotton", "faux_fur" ], + "symbol": "[", + "looks_like": "hat_knit", + "color": "red", + "warmth": 25, + "material_thickness": 0.3, + "flags": [ "VARSIZE", "OVERSIZE", "ALLOWS_NATURAL_ATTACKS" ], + "armor": [ { "encumbrance": 10, "coverage": 80, "covers": [ "head" ] } ] + }, { "id": "straw_hat", "type": "ARMOR", diff --git a/data/json/items/armor/legs_clothes.json b/data/json/items/armor/legs_clothes.json index c46823d6d7b7b..ab2367b33d7ef 100644 --- a/data/json/items/armor/legs_clothes.json +++ b/data/json/items/armor/legs_clothes.json @@ -917,6 +917,83 @@ { "coverage": 50, "covers": [ "leg_l", "leg_r" ], "specifically_covers": [ "leg_upper_l", "leg_upper_r" ] } ] }, + { + "id": "santa_shorts", + "type": "ARMOR", + "name": { "str_sp": "shorts" }, + "description": "A pair of red shorts with a white trim. For when Santa is on summer vacation.", + "weight": "230 g", + "volume": "1 L", + "price": 2200, + "price_postapoc": 50, + "to_hit": 1, + "material": [ "cotton" ], + "symbol": "[", + "looks_like": "shorts", + "color": "red", + "warmth": 5, + "material_thickness": 0.2, + "flags": [ "VARSIZE" ], + "armor": [ + { + "encumbrance": 2, + "coverage": 100, + "covers": [ "leg_l", "leg_r" ], + "specifically_covers": [ "leg_hip_l", "leg_hip_r" ] + }, + { "coverage": 40, "covers": [ "leg_l", "leg_r" ], "specifically_covers": [ "leg_upper_l", "leg_upper_r" ] } + ] + }, + { + "id": "santa_pants", + "type": "ARMOR", + "name": { "str_sp": "santa pants" }, + "description": "A pair of red pants with white faux fur trim, commonly used by bearded men on Christmas. Somewhat warm and has two deep pockets.", + "weight": "800 g", + "volume": "3 L", + "price": 20000, + "price_postapoc": 100, + "to_hit": 1, + "material": [ "cotton", "faux_fur" ], + "symbol": "[", + "looks_like": "pants", + "color": "red", + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "max_contains_volume": "1250 ml", + "max_contains_weight": "4 kg", + "max_item_length": "19 cm", + "moves": 80 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "1250 ml", + "max_contains_weight": "4 kg", + "max_item_length": "19 cm", + "moves": 80 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "1080 ml", + "max_contains_weight": "4 kg", + "max_item_length": "165 mm", + "moves": 100 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "1080 ml", + "max_contains_weight": "4 kg", + "max_item_length": "165 mm", + "moves": 100 + } + ], + "warmth": 30, + "material_thickness": 1, + "environmental_protection": 2, + "flags": [ "VARSIZE", "POCKETS" ], + "armor": [ { "encumbrance": [ 13, 17 ], "coverage": 95, "covers": [ "leg_l", "leg_r" ] } ] + }, { "id": "shorts", "type": "ARMOR", diff --git a/data/json/items/armor/masks.json b/data/json/items/armor/masks.json index 9b72be428c0ad..b1cd4a351e4e7 100644 --- a/data/json/items/armor/masks.json +++ b/data/json/items/armor/masks.json @@ -219,5 +219,24 @@ "environmental_protection": 1, "flags": [ "HELMET_COMPAT" ], "armor": [ { "encumbrance": 8, "coverage": 90, "covers": [ "head", "mouth" ] } ] + }, + { + "id": "santa_beard", + "type": "ARMOR", + "name": { "str": "white beard" }, + "description": "A fake white beard that straps over the mouth. Perfect for your Santa costume!", + "weight": "200 g", + "volume": "150 ml", + "price": 800, + "price_postapoc": 10, + "to_hit": -3, + "material": [ "cotton" ], + "symbol": "[", + "looks_like": "scarf", + "color": "white", + "warmth": 8, + "material_thickness": 0.1, + "flags": [ "OUTER" ], + "armor": [ { "encumbrance": 8, "coverage": 95, "covers": [ "mouth" ] } ] } ] diff --git a/data/json/items/armor/torso_clothes.json b/data/json/items/armor/torso_clothes.json index d4886e593b441..5dd191c05316e 100644 --- a/data/json/items/armor/torso_clothes.json +++ b/data/json/items/armor/torso_clothes.json @@ -609,6 +609,89 @@ "flags": [ "VARSIZE" ], "armor": [ { "coverage": 90, "covers": [ "torso" ] } ] }, + { + "id": "santa_dress", + "repairs_like": "jeans", + "type": "ARMOR", + "name": { "str": "santa dress", "str_pl": "santa dresses" }, + "description": "A red sleeved dress with white faux fur as trim. For when you want to be Mrs. Claus on Christmas, or perhaps Santa going clubbing.", + "weight": "800 g", + "volume": "3500 ml", + "price": 18000, + "price_postapoc": 60, + "to_hit": -5, + "material": [ "cotton", "faux_fur" ], + "symbol": "[", + "looks_like": "robe", + "color": "red", + "warmth": 25, + "material_thickness": 0.4, + "flags": [ "VARSIZE" ], + "armor": [ + { "covers": [ "torso" ], "coverage": 95, "encumbrance": 10 }, + { "covers": [ "arm_l", "arm_r" ], "coverage": 95, "encumbrance": 8 }, + { + "covers": [ "leg_l", "leg_r" ], + "specifically_covers": [ "leg_hip_l", "leg_hip_r" ], + "coverage": 100, + "encumbrance": 5 + }, + { "covers": [ "leg_l", "leg_r" ], "specifically_covers": [ "leg_upper_l", "leg_upper_r" ], "coverage": 50 } + ] + }, + { + "id": "santa_dress_long", + "repairs_like": "jeans", + "type": "ARMOR", + "name": { "str": "luxury santa dress", "str_pl": "luxury santa dresses" }, + "description": "A red sleeved long dress with white faux fur as trim. This is a fancy version for a queen of the north pole.", + "weight": "1200 g", + "volume": "3850 ml", + "price": 25000, + "price_postapoc": 90, + "to_hit": -5, + "material": [ "cotton", "faux_fur" ], + "symbol": "[", + "looks_like": "santa_dress", + "color": "red", + "warmth": 30, + "material_thickness": 0.8, + "flags": [ "VARSIZE", "SUPER_FANCY" ], + "armor": [ + { "covers": [ "torso" ], "coverage": 85, "encumbrance": 8 }, + { "covers": [ "arm_l", "arm_r" ], "coverage": 85, "encumbrance": 6 }, + { "covers": [ "leg_l", "leg_r" ], "coverage": 100, "encumbrance": 8 } + ] + }, + { + "id": "santa_dress_short", + "repairs_like": "jeans", + "type": "ARMOR", + "name": { "str": "short santa dress", "str_pl": "short santa dresses" }, + "description": "A short red dress with white faux fur as trim. Looks like something Mrs. Claus might wear on Christmas night.", + "weight": "600 g", + "volume": "2000 ml", + "price": 16000, + "price_postapoc": 50, + "to_hit": -5, + "material": [ "cotton", "faux_fur" ], + "symbol": "[", + "looks_like": "sundress", + "color": "red", + "warmth": 15, + "material_thickness": 0.2, + "flags": [ "VARSIZE", "FANCY" ], + "armor": [ + { "covers": [ "torso" ], "coverage": 75, "encumbrance": 4 }, + { + "covers": [ "leg_l", "leg_r" ], + "specifically_covers": [ "leg_hip_l", "leg_hip_r" ], + "coverage": 100, + "encumbrance": 4 + }, + { "covers": [ "leg_l", "leg_r" ], "specifically_covers": [ "leg_upper_l", "leg_upper_r" ], "coverage": 40 } + ] + }, { "id": "sheriffshirt", "repairs_like": "tshirt", diff --git a/data/json/monsterdrops/clothing_christmas.json b/data/json/monsterdrops/clothing_christmas.json new file mode 100644 index 0000000000000..0e4eb6025e045 --- /dev/null +++ b/data/json/monsterdrops/clothing_christmas.json @@ -0,0 +1,177 @@ +[ + { + "id": "christmas_coats_unisex", + "type": "item_group", + "//": "For use in christmas with the group coats_unisex", + "subtype": "distribution", + "entries": [ { "item": "santa_jacket", "prob": 80 }, { "item": "santa_jacket_short", "prob": 20 } ] + }, + { + "id": "christmas_common_gloves", + "type": "item_group", + "//": "For use in christmas with the group common_gloves", + "subtype": "distribution", + "entries": [ { "item": "santa_gloves", "prob": 50 }, { "item": "gloves_white", "prob": 50 } ] + }, + { + "id": "christmas_hats", + "type": "item_group", + "//": "For use in christmas as substitute of any group of normal hats", + "subtype": "distribution", + "entries": [ { "item": "santa_hat", "prob": 100 } ] + }, + { + "id": "christmas_accesories_personal_unisex", + "type": "item_group", + "//": "For use in christmas for all miscellaneous accessories", + "subtype": "distribution", + "entries": [ { "item": "santa_beard" } ] + }, + { + "id": "christmas_belts", + "type": "item_group", + "//": "For use in christmas for all kind of belts, used as alternative of a leather belt", + "subtype": "distribution", + "entries": [ { "item": "santa_belt" } ] + }, + { + "id": "christmas_pants_male", + "type": "item_group", + "//": "For use in christmas with the group pants_male", + "subtype": "distribution", + "entries": [ { "item": "santa_pants", "prob": 80 }, { "item": "santa_shorts", "prob": 20 } ] + }, + { + "id": "christmas_dresses", + "type": "item_group", + "//": "For use in christmas with the zombie drops for female zombies", + "subtype": "distribution", + "entries": [ + { "item": "santa_dress", "prob": 70 }, + { "item": "santa_dress_long", "prob": 20 }, + { "item": "santa_dress_short", "prob": 10 } + ] + }, + { + "id": "default_zombie_clothes_christmas", + "type": "item_group", + "//": "For use in christmas as special sets of zombie cloth drops, for now it only includes santas, but it can be used for elves and christmas reindeer cosplays too.", + "subtype": "distribution", + "entries": [ { "group": "santa_male" }, { "group": "santa_female" } ] + }, + { + "id": "santa_male", + "type": "item_group", + "//": "For use in christmas as a set of zombie cloth drops for male santa zombies", + "subtype": "distribution", + "entries": [ + { + "collection": [ + { "item": "santa_hat", "damage": [ 1, 4 ] }, + { "item": "santa_belt", "damage": [ 1, 4 ] }, + { + "distribution": [ + { "item": "santa_beard", "prob": 80, "damage": [ 1, 4 ] }, + { "group": "scarfs_unisex", "prob": 20, "damage": [ 1, 4 ] } + ], + "prob": 90 + }, + { + "distribution": [ + { "item": "gloves_white", "prob": 80, "damage": [ 1, 4 ] }, + { "item": "santa_gloves", "prob": 20, "damage": [ 1, 4 ] } + ], + "prob": 90 + }, + { + "distribution": [ + { "item": "santa_jacket", "prob": 80, "damage": [ 1, 4 ] }, + { "item": "santa_jacket_short", "prob": 20, "damage": [ 1, 4 ] } + ] + }, + { + "distribution": [ + { "item": "santa_pants", "prob": 80, "damage": [ 1, 4 ] }, + { "item": "santa_shorts", "prob": 20, "damage": [ 1, 4 ] } + ] + }, + { + "distribution": [ + { "item": "boots_winter", "prob": 70, "damage": [ 1, 4 ] }, + { "item": "boots_fur", "prob": 20, "damage": [ 1, 4 ] }, + { "item": "boots", "prob": 10, "damage": [ 1, 4 ] } + ] + }, + { + "distribution": [ + { "group": "male_underwear", "prob": 80, "damage": [ 1, 4 ] }, + { "item": "union_suit", "prob": 20, "damage": [ 1, 4 ] } + ] + }, + { "group": "shirts_unisex", "prob": 60, "damage": [ 1, 4 ] }, + { "group": "socks_unisex", "damage": [ 1, 4 ] }, + { "group": "accesories_personal_unisex", "prob": 20, "damage": [ 1, 4 ] } + ] + } + ] + }, + { + "id": "santa_female", + "type": "item_group", + "//": "For use in christmas as a set of zombie cloth drops for female santa zombies", + "subtype": "distribution", + "entries": [ + { + "collection": [ + { "item": "santa_hat", "damage": [ 1, 4 ] }, + { "item": "santa_belt", "prob": 75, "damage": [ 1, 4 ] }, + { + "distribution": [ + { "item": "santa_beard", "prob": 20, "damage": [ 1, 4 ] }, + { "group": "scarfs_unisex", "prob": 80, "damage": [ 1, 4 ] } + ], + "prob": 20 + }, + { + "distribution": [ + { "item": "gloves_white", "prob": 60, "damage": [ 1, 4 ] }, + { "item": "santa_gloves", "prob": 20, "damage": [ 1, 4 ] }, + { "item": "long_glove_white", "prob": 20, "damage": [ 1, 4 ] } + ], + "prob": 90 + }, + { + "distribution": [ + { "item": "santa_dress", "prob": 60, "damage": [ 1, 4 ] }, + { "item": "santa_dress_long", "prob": 25, "damage": [ 1, 4 ] }, + { "item": "santa_dress_short", "prob": 15, "damage": [ 1, 4 ] } + ] + }, + { + "distribution": [ + { "item": "boots_winter", "prob": 20, "damage": [ 1, 4 ] }, + { "item": "dress_shoes", "prob": 40, "damage": [ 1, 4 ] }, + { "item": "heels", "prob": 40, "damage": [ 1, 4 ] } + ] + }, + { "group": "female_underwear", "damage": [ 1, 4 ] }, + { "group": "shirts_unisex", "prob": 60, "damage": [ 1, 4 ] }, + { "group": "accesories_personal_womens", "prob": 20, "damage": [ 1, 4 ] }, + { + "distribution": [ + { + "collection": [ + { + "distribution": [ { "item": "stockings", "prob": 50, "damage": [ 1, 4 ] }, { "item": "tights", "prob": 50, "damage": [ 1, 4 ] } ] + }, + { "item": "garter_belt", "prob": 10, "damage": [ 1, 4 ] } + ] + }, + { "group": "socks_unisex", "prob": 50, "damage": [ 1, 4 ] } + ] + } + ] + } + ] + } +] diff --git a/data/json/monsterdrops/zombie_default.json b/data/json/monsterdrops/zombie_default.json index 20744801120ac..4bca64799b084 100644 --- a/data/json/monsterdrops/zombie_default.json +++ b/data/json/monsterdrops/zombie_default.json @@ -10,6 +10,7 @@ { "group": "hatstore_hats", "damage": [ 1, 4 ], "prob": 20 }, { "group": "scarfs_unisex", "damage": [ 1, 4 ], "prob": 20 }, { "group": "accesories_personal_unisex", "damage": [ 1, 4 ], "prob": 15 }, + { "group": "christmas_accesories_personal_unisex", "damage": [ 1, 4 ], "prob": 25, "event": "christmas" }, { "distribution": [ { @@ -26,7 +27,13 @@ "collection": [ { "group": "pants_male", "prob": 60, "damage": [ 1, 4 ] }, { "group": "shirts_unisex", "prob": 60, "damage": [ 1, 4 ] }, - { "item": "leather_belt", "prob": 30, "damage": [ 1, 4 ] } + { + "distribution": [ + { "item": "leather_belt", "prob": 85, "damage": [ 1, 4 ] }, + { "group": "christmas_belts", "prob": 25, "damage": [ 1, 4 ], "event": "christmas" } + ], + "prob": 30 + } ] }, { "item": "suit", "prob": 5, "damage": [ 1, 4 ] }, @@ -76,6 +83,7 @@ { "item": "gown", "prob": 10, "damage": [ 1, 4 ] }, { "item": "dress", "prob": 70, "damage": [ 1, 4 ] }, { "item": "sundress", "prob": 45, "damage": [ 1, 4 ] }, + { "group": "christmas_dresses", "prob": 50, "damage": [ 1, 4 ], "event": "christmas" }, { "collection": [ { "item": "dress_wedding", "damage": [ 1, 4 ] }, { "item": "veil_wedding", "damage": [ 1, 4 ] } ], "prob": 5 @@ -250,7 +258,12 @@ "//": "contains cloth (always), a wallet (30% chance), and a random item (50% chance)", "id": "default_zombie_death_drops", "entries": [ - { "group": "default_zombie_clothes" }, + { + "distribution": [ + { "group": "default_zombie_clothes", "prob": 90 }, + { "group": "default_zombie_clothes_christmas", "event": "christmas", "prob": 10 } + ] + }, { "group": "default_zombie_items", "prob": 50 }, { "group": "wallets", "damage": [ 1, 4 ], "prob": 30 } ] From 5b1e05e4c22617fbc8f4cdd83f7da6b772b9e4ee Mon Sep 17 00:00:00 2001 From: Nabo92 <37299923+Nabo92@users.noreply.github.com> Date: Tue, 14 Dec 2021 21:41:49 -0300 Subject: [PATCH 10/39] Small drug synthesis rework (#51409) * Small drug synthesis rework following up on PR #50511, added proper heroin recipe with the item added on previous PR. Also correcting typo on red phosphorous, correcting weight of acetic anhydride to match it's density. Also deleted the item match head powder and changed all the recipes associated to it to the proper element * further fixing of typos --- data/json/items/chemicals_and_resources.json | 20 +----------- data/json/items/obsolete.json | 18 +++++++++++ data/json/recipes/other/materials.json | 2 +- .../json/recipes/recipe_medsandchemicals.json | 31 ++++++------------- data/json/requirements/explosives.json | 2 +- 5 files changed, 30 insertions(+), 43 deletions(-) diff --git a/data/json/items/chemicals_and_resources.json b/data/json/items/chemicals_and_resources.json index fb5dcb6ce7428..1d4f0e2949f5c 100644 --- a/data/json/items/chemicals_and_resources.json +++ b/data/json/items/chemicals_and_resources.json @@ -902,24 +902,6 @@ "container": "bag_plastic", "count": 1000 }, - { - "type": "AMMO", - "id": "chem_match_head_powder", - "category": "chems", - "price": 50, - "price_postapoc": 10, - "name": { "str_sp": "match head powder" }, - "symbol": "=", - "color": "light_red", - "description": "Some match head powder from match heads, similar to black gunpowder but a bit weaker. It can be used in crafting explosives and fuses when other, more suitable candidates are less available.", - "material": [ "powder" ], - "volume": "10 ml", - "weight": "2050 mg", - "bashing": 1, - "ammo_type": "components", - "container": "bag_plastic", - "count": 10 - }, { "type": "AMMO", "id": "chem_rdx", @@ -1729,7 +1711,7 @@ "name": { "str_sp": "acetic anhydride" }, "description": "This is a bottle of acetic anhydride, if you have enough chemical knowledge, you could use it to easily convert morphine into heroin.", "container": "bottle_glass", - "weight": "100 g", + "weight": "107 g", "use_action": [ "POISON", "BLECH" ], "fatigue_mod": -20, "volume": "100 ml", diff --git a/data/json/items/obsolete.json b/data/json/items/obsolete.json index 7fc4438edc014..64ac675aa13ff 100644 --- a/data/json/items/obsolete.json +++ b/data/json/items/obsolete.json @@ -392,6 +392,24 @@ "use_action": [ "HEAT_FOOD" ], "flags": [ "ALLOWS_REMOTE_USE" ] }, + { + "type": "AMMO", + "id": "chem_match_head_powder", + "category": "chems", + "price": 50, + "price_postapoc": 10, + "name": { "str_sp": "match head powder" }, + "symbol": "=", + "color": "light_red", + "description": "Some match head powder from match heads, similar to black gunpowder but a bit weaker. It can be used in crafting explosives and fuses when other, more suitable candidates are less available.", + "material": [ "powder" ], + "volume": "10 ml", + "weight": "2050 mg", + "bashing": 1, + "ammo_type": "components", + "container": "bag_plastic", + "count": 10 + }, { "id": "nato_assault_rifle", "copy-from": "rifle_auto", diff --git a/data/json/recipes/other/materials.json b/data/json/recipes/other/materials.json index 1eba088e4fdec..34b08adf4ba0a 100644 --- a/data/json/recipes/other/materials.json +++ b/data/json/recipes/other/materials.json @@ -604,7 +604,7 @@ "time": "4 m", "charges": 3, "batch_time_factors": [ 30, 2 ], - "components": [ [ [ "rolling_paper", 1 ] ], [ [ "chem_black_powder", 3 ], [ "chem_match_head_powder", 3 ], [ "gunpowder", 30 ] ] ] + "components": [ [ [ "rolling_paper", 1 ] ], [ [ "chem_black_powder", 3 ], [ "red_phosphorous", 3 ], [ "gunpowder", 30 ] ] ] }, { "result": "wire", diff --git a/data/json/recipes/recipe_medsandchemicals.json b/data/json/recipes/recipe_medsandchemicals.json index f376f4210c840..8f8178e0c252f 100644 --- a/data/json/recipes/recipe_medsandchemicals.json +++ b/data/json/recipes/recipe_medsandchemicals.json @@ -100,20 +100,6 @@ "flags": [ "BLIND_HARD" ], "components": [ [ [ "rolling_paper", 1 ] ], [ [ "weed", 1 ], [ "joint_roach", 5 ] ] ] }, - { - "type": "recipe", - "activity_level": "LIGHT_EXERCISE", - "result": "meth", - "category": "CC_CHEM", - "subcategory": "CSC_CHEM_DRUGS", - "skill_used": "chemistry", - "difficulty": 5, - "time": "20 m", - "book_learn": [ [ "textbook_chemistry", 5 ], [ "adv_chemistry", 5 ], [ "recipe_labchem", 5 ] ], - "qualities": [ { "id": "CHEM", "level": 3 } ], - "tools": [ [ [ "surface_heat", 15, "LIST" ] ] ], - "components": [ [ [ "dayquil", 2 ] ], [ [ "aspirin", 40 ] ], [ [ "caffeine", 20 ], [ "adderall", 5 ], [ "energy_drink", 2 ] ] ] - }, { "type": "recipe", "activity_level": "LIGHT_EXERCISE", @@ -381,14 +367,13 @@ "subcategory": "CSC_CHEM_DRUGS", "skill_used": "chemistry", "difficulty": 6, - "time": "2 m", + "batch_time_factors": [ 40, 6 ], + "charges": 3, + "time": "2 h", "book_learn": [ [ "textbook_chemistry", 7 ], [ "adv_chemistry", 7 ], [ "atomic_survival", 6 ], [ "recipe_labchem", 6 ] ], - "qualities": [ { "id": "CHEM", "level": 2 } ], + "qualities": [ { "id": "CHEM", "level": 1 } ], "tools": [ [ [ "surface_heat", 3, "LIST" ] ] ], - "components": [ - [ [ "salt_water", 1 ], [ "salt", 10 ], [ "saline", 5 ] ], - [ [ "codeine", 25 ], [ "morphine", 3 ], [ "oxycodone", 2 ] ] - ] + "components": [ [ [ "acetic_anhydride", 1 ] ], [ [ "morphine", 3 ] ] ] }, { "type": "recipe", @@ -1009,11 +994,13 @@ { "type": "recipe", "activity_level": "LIGHT_EXERCISE", - "result": "chem_match_head_powder", + "result": "red_phosphorous", + "charges": 5, + "batch_time_factors": [ 60, 5 ], "category": "CC_CHEM", "subcategory": "CSC_CHEM_OTHER", "skill_used": "fabrication", - "time": "8 m", + "time": "10 m", "autolearn": true, "tools": [ [ [ "matches", 20 ] ], [ [ "mortar_pestle", -1 ] ] ] }, diff --git a/data/json/requirements/explosives.json b/data/json/requirements/explosives.json index 0abc714dd5e35..f0050c4787740 100644 --- a/data/json/requirements/explosives.json +++ b/data/json/requirements/explosives.json @@ -48,7 +48,7 @@ [ [ "chem_black_powder", 90 ], [ "gunpowder", 90 ], - [ "chem_match_head_powder", 18 ], + [ "red_phosphorous", 18 ], [ "gunpowder_pistol", 90 ], [ "gunpowder_shotgun", 90 ], [ "gunpowder_magnum_pistol", 80 ], From 2412241239c66881223cbc85ad029e0863260c7a Mon Sep 17 00:00:00 2001 From: Ola Tuvesson <196348+clickworkorange@users.noreply.github.com> Date: Wed, 15 Dec 2021 00:52:19 +0000 Subject: [PATCH 11/39] [CR] Tweaks to turret mounts and turret controls for foldable vehicles (#51745) * Turret controls to require TURRET_MOUNT instead of TURRET I imagine it is the turret mount itself and not the weapon mounted to it that is motorised and automated when turret controls are installed (the TURRET flag indicates the mounted weapon, TURRET_MOUNT is the actual mount). * Make turret controls foldable If a turret mount can be made foldable, it seems reasonable that its control system could fold as well. * Make drive by wire controls foldable If anything it ought to be easier to add remote control functionality to a lightweight foldable vehicle than it would be to an atomic tank. --- data/json/vehicleparts/vehicle_parts.json | 5 +++-- data/json/vehicleparts/vp_flags.json | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/data/json/vehicleparts/vehicle_parts.json b/data/json/vehicleparts/vehicle_parts.json index 469e30af3dd70..9eae4635edc37 100644 --- a/data/json/vehicleparts/vehicle_parts.json +++ b/data/json/vehicleparts/vehicle_parts.json @@ -2663,13 +2663,14 @@ "damage_modifier": 10, "durability": 200, "description": "A sophisticated set of electronic controls that allow you to control the vehicle from a vehicle remote while you are not in it. You can 'e'xamine the tile to access the controls, or use the vehicle control key (default '^').", + "folded_volume": "2500 ml", "item": "drive_by_wire_controls", "requirements": { "install": { "skills": [ [ "mechanics", 3 ] ], "time": "60 m", "using": [ [ "welding_standard", 5 ] ] }, "removal": { "skills": [ [ "mechanics", 2 ] ], "time": "30 m", "using": [ [ "vehicle_weld_removal", 1 ] ] }, "repair": { "skills": [ [ "mechanics", 4 ] ], "time": "60 m", "using": [ [ "welding_standard", 5 ] ] } }, - "flags": [ "CONTROLS", "REMOTE_CONTROLS" ], + "flags": [ "CONTROLS", "REMOTE_CONTROLS", "FOLDABLE" ], "breaks_into": [ { "item": "motor_tiny" }, { "item": "steel_chunk", "count": [ 1, 3 ] }, { "item": "scrap", "count": [ 1, 3 ] } ] }, { @@ -3142,7 +3143,7 @@ "item": "turret_controls", "description": "A set of motor, camera, and an AI unit which allows for tracking targets, friend-or-foe identification, and firing the connected turret in full automatic mode. When installed over the turret, it will enable auto targeting mode for said turret.", "folded_volume": "750 ml", - "flags": [ "ENABLED_DRAINS_EPOWER", "TURRET_CONTROLS", "UNMOUNT_ON_DAMAGE" ], + "flags": [ "ENABLED_DRAINS_EPOWER", "TURRET_CONTROLS", "UNMOUNT_ON_DAMAGE", "FOLDABLE" ], "requirements": { "install": { "time": "40 m", diff --git a/data/json/vehicleparts/vp_flags.json b/data/json/vehicleparts/vp_flags.json index 7f3cf3604a188..e3be2716c34de 100644 --- a/data/json/vehicleparts/vp_flags.json +++ b/data/json/vehicleparts/vp_flags.json @@ -150,7 +150,7 @@ { "id": "TURRET_CONTROLS", "type": "json_flag", - "requires_flag": "TURRET" + "requires_flag": "TURRET_MOUNT" }, { "id": "WHEEL", From ba383160cb6419574a6e947ec9f9dd4195d54c2b Mon Sep 17 00:00:00 2001 From: anoobindisguise <56016372+anoobindisguise@users.noreply.github.com> Date: Tue, 14 Dec 2021 17:01:04 -0800 Subject: [PATCH 12/39] Harvestable mechguns (#52772) * standalone mechguns, vehicle only * RMES/CMES turrets * looks like * salvage mechguns * mechsuits accept storage battery * Undo; mechs are hardcoded to only take one battery * Update ups.json * turret changes * lint * lint2 * fix my error * stylefix? * copy-from * flags end my suffering * capital letters, longest_side * name correction * copy-from * remove default mods from lasers * json stylecheck is EVIL and I hate it --- data/json/items/gun/ups.json | 24 ++++++++++++++++ data/json/recipes/recipe_deconstruction.json | 2 ++ data/json/vehicleparts/turret.json | 30 ++++++++++++++++++++ 3 files changed, 56 insertions(+) diff --git a/data/json/items/gun/ups.json b/data/json/items/gun/ups.json index cc865c68ca622..bc0fee24ef6e8 100644 --- a/data/json/items/gun/ups.json +++ b/data/json/items/gun/ups.json @@ -48,6 +48,7 @@ "volume": "11 L", "price": 9500000, "price_postapoc": 8000, + "longest_side": "1086 mm", "to_hit": -4, "bashing": 8, "material": [ "superalloy", "plastic" ], @@ -75,6 +76,7 @@ "volume": "5500 ml", "price": 9500000, "price_postapoc": 8000, + "longest_side": "1228 mm", "to_hit": -2, "bashing": 6, "material": [ "superalloy", "plastic" ], @@ -190,5 +192,27 @@ ], "ammo_effects": [ "LASER", "INCENDIARY" ], "flags": [ "NEVER_JAMS", "NO_UNLOAD", "NON_FOULING", "NEEDS_NO_LUBE" ] + }, + { + "id": "gatling_mech_laser_single", + "copy-from": "gatling_mech_laser", + "looks_like": "m134", + "type": "GUN", + "name": { "str": "salvaged CMES laser cannon" }, + "description": "This gatling-laser has been stripped from its CMES mech-suit and is far too heavy to use on its own. You will need to deploy it or mount it to a vehicle, but it could be devastating if you have deep battery reserves.", + "valid_mod_locations": [ [ "accessories", 4 ], [ "emitter", 1 ], [ "lens", 1 ], [ "sling", 1 ] ], + "extend": { "flags": [ "MOUNTED_GUN" ] }, + "delete": { "flags": [ "UNBREAKABLE_MELEE", "NO_REPAIR", "NO_SALVAGE", "NO_UNWIELD" ] } + }, + { + "id": "recon_mech_laser_single", + "copy-from": "recon_mech_laser", + "looks_like": "m107a1", + "type": "GUN", + "name": { "str": "salvaged RMES marksman laser" }, + "description": "Formerly belonging to the RMES mech-suit, this powerful long-range laser rifle was never designed for human hands. You might be able to make it work if you deployed it or mounted it to a vehicle, though, and its long range and potency could be pretty handy if you can keep it powered.", + "valid_mod_locations": [ [ "accessories", 4 ], [ "emitter", 1 ], [ "lens", 1 ], [ "sling", 1 ] ], + "extend": { "flags": [ "MOUNTED_GUN" ] }, + "delete": { "flags": [ "UNBREAKABLE_MELEE", "NO_REPAIR", "NO_SALVAGE", "NO_UNWIELD" ] } } ] diff --git a/data/json/recipes/recipe_deconstruction.json b/data/json/recipes/recipe_deconstruction.json index c4d071522a706..50b0bfcb8bc16 100644 --- a/data/json/recipes/recipe_deconstruction.json +++ b/data/json/recipes/recipe_deconstruction.json @@ -1427,6 +1427,7 @@ "using": [ [ "soldering_standard", 30 ], [ "welding_standard", 20 ] ], "qualities": [ { "id": "SCREW", "level": 1 }, { "id": "WRENCH", "level": 1 }, { "id": "SAW_M", "level": 1 } ], "components": [ + [ [ "recon_mech_laser_single", 1 ] ], [ [ "ai_module", 1 ] ], [ [ "sensor_module", 1 ] ], [ [ "memory_module", 1 ] ], @@ -1471,6 +1472,7 @@ "using": [ [ "soldering_standard", 30 ], [ "welding_standard", 20 ] ], "qualities": [ { "id": "SCREW", "level": 1 }, { "id": "WRENCH", "level": 1 }, { "id": "SAW_M", "level": 1 } ], "components": [ + [ [ "gatling_mech_laser_single", 1 ] ], [ [ "ai_module", 1 ] ], [ [ "sensor_module", 1 ] ], [ [ "memory_module", 1 ] ], diff --git a/data/json/vehicleparts/turret.json b/data/json/vehicleparts/turret.json index de2979762bbe5..76eea6e6c3391 100644 --- a/data/json/vehicleparts/turret.json +++ b/data/json/vehicleparts/turret.json @@ -91,6 +91,36 @@ "removal": { "skills": [ [ "mechanics", 3 ] ] } } }, + { + "id": "mounted_cmes_gun", + "copy-from": "turret", + "looks_like": "mounted_m134", + "type": "vehicle_part", + "name": { "str": "mounted CMES laser cannon" }, + "item": "gatling_mech_laser_single", + "color": "magenta", + "broken_color": "magenta", + "breaks_into": [ { "item": "scrap", "count": 20 }, { "item": "steel_chunk", "count": 10 }, { "item": "steel_lump", "count": 6 } ], + "requirements": { + "install": { "skills": [ [ "mechanics", 8 ], [ "electronics", 8 ] ] }, + "removal": { "skills": [ [ "mechanics", 8 ] ] } + } + }, + { + "id": "mounted_rmes_gun", + "copy-from": "turret", + "type": "vehicle_part", + "looks_like": "mounted_plasma_gun", + "name": { "str": "mounted RMES marksman laser" }, + "item": "recon_mech_laser_single", + "color": "magenta", + "broken_color": "magenta", + "breaks_into": [ { "item": "scrap", "count": 20 }, { "item": "steel_chunk", "count": 10 }, { "item": "steel_lump", "count": 6 } ], + "requirements": { + "install": { "skills": [ [ "mechanics", 7 ], [ "electronics", 7 ] ] }, + "removal": { "skills": [ [ "mechanics", 7 ] ] } + } + }, { "id": "m249", "copy-from": "turret", From cb48879106c2194b7620cc9e390ddcc8a8e4ede5 Mon Sep 17 00:00:00 2001 From: Dillon Matchett Date: Wed, 15 Dec 2021 00:22:15 -0400 Subject: [PATCH 13/39] "Personal" Sorting Zones (#53307) * localization sorta working * In a decent place * everything appears to now be working * calm clang down * clang will be appeased --- data/json/loot_zones.json | 34 ++++++++++++++++++ data/raw/keybindings.json | 11 ++++++ src/clzones.cpp | 74 +++++++++++++++++++++++++++++---------- src/clzones.h | 39 +++++++++++++++++++-- src/game.cpp | 61 ++++++++++++++++++++++++++++++-- src/handle_action.cpp | 5 +++ 6 files changed, 200 insertions(+), 24 deletions(-) diff --git a/data/json/loot_zones.json b/data/json/loot_zones.json index d044e5b9c727c..f0eb27bdbc791 100644 --- a/data/json/loot_zones.json +++ b/data/json/loot_zones.json @@ -3,204 +3,238 @@ "id": "LOOT_UNSORTED", "type": "LOOT_ZONE", "name": "Loot: Unsorted", + "can_be_personal": true, "description": "Place to drop unsorted loot. You can use \"sort out loot\" zone-action to sort items inside. It can overlap with Loot zones of different types." }, { "id": "LOOT_FOOD", "type": "LOOT_ZONE", "name": "Loot: Food", + "can_be_personal": true, "description": "Destination for comestibles. If more specific food zone is not defined, all food is moved here." }, { "id": "LOOT_PFOOD", "type": "LOOT_ZONE", "name": "Loot: P.Food", + "can_be_personal": true, "description": "Destination for perishable comestibles. Does include perishable drinks if such zone is not specified." }, { "id": "LOOT_DRINK", "type": "LOOT_ZONE", "name": "Loot: Drink", + "can_be_personal": true, "description": "Destination for drinks. Does include perishable drinks if such zone is not specified." }, { "id": "LOOT_PDRINK", "type": "LOOT_ZONE", "name": "Loot: P.Drink", + "can_be_personal": true, "description": "Destination for perishable drinks." }, { "id": "LOOT_CONTAINERS", "type": "LOOT_ZONE", "name": "Loot: Containers", + "can_be_personal": true, "description": "Destination for empty containers." }, { "id": "LOOT_GUNS", "type": "LOOT_ZONE", "name": "Loot: Guns", + "can_be_personal": true, "description": "Destination for guns, bows and similar weapons." }, { "id": "LOOT_MAGAZINES", "type": "LOOT_ZONE", "name": "Loot: Magazines", + "can_be_personal": true, "description": "Destination for gun magazines." }, { "id": "LOOT_AMMO", "type": "LOOT_ZONE", "name": "Loot: Ammo", + "can_be_personal": true, "description": "Destination for ammo." }, { "id": "LOOT_WEAPONS", "type": "LOOT_ZONE", "name": "Loot: Weapons", + "can_be_personal": true, "description": "Destination for melee weapons." }, { "id": "LOOT_TOOLS", "type": "LOOT_ZONE", "name": "Loot: Tools", + "can_be_personal": true, "description": "Destination for tools." }, { "id": "LOOT_CLOTHING", "type": "LOOT_ZONE", "name": "Loot: Clothing", + "can_be_personal": true, "description": "Destination for clothing. Does include filthy clothing if such zone is not specified." }, { "id": "LOOT_FCLOTHING", "type": "LOOT_ZONE", "name": "Loot: F.Clothing", + "can_be_personal": true, "description": "Destination for filthy clothing." }, { "id": "LOOT_DRUGS", "type": "LOOT_ZONE", "name": "Loot: Drugs", + "can_be_personal": true, "description": "Destination for drugs and other medical items." }, { "id": "LOOT_BOOKS", "type": "LOOT_ZONE", "name": "Loot: Books", + "can_be_personal": true, "description": "Destination for books and magazines." }, { "id": "LOOT_MODS", "type": "LOOT_ZONE", "name": "Loot: Mods", + "can_be_personal": true, "description": "Destination for firearm modifications and similar items." }, { "id": "LOOT_MUTAGENS", "type": "LOOT_ZONE", "name": "Loot: Mutagens", + "can_be_personal": true, "description": "Destination for mutagens, serums, and purifiers." }, { "id": "LOOT_BIONICS", "type": "LOOT_ZONE", "name": "Loot: Bionics", + "can_be_personal": true, "description": "Destination for Compact Bionics Modules, a.k.a. CBMS." }, { "id": "LOOT_VEHICLE_PARTS", "type": "LOOT_ZONE", "name": "Loot: V.Parts", + "can_be_personal": true, "description": "Destination for vehicle parts." }, { "id": "LOOT_OTHER", "type": "LOOT_ZONE", "name": "Loot: Other", + "can_be_personal": true, "description": "Destination for other miscellaneous items." }, { "id": "LOOT_MAPS", "type": "LOOT_ZONE", "name": "Loot: Maps", + "can_be_personal": true, "description": "Destination for maps." }, { "id": "LOOT_CURRENCY", "type": "LOOT_ZONE", "name": "Loot: Currency", + "can_be_personal": true, "description": "Destination for currency." }, { "id": "LOOT_FUEL", "type": "LOOT_ZONE", "name": "Loot: Fuel", + "can_be_personal": true, "description": "Destination for gasoline, diesel, lamp oil and other substances used as a fuel." }, { "id": "LOOT_SEEDS", "type": "LOOT_ZONE", "name": "Loot: Seeds", + "can_be_personal": true, "description": "Destination for seeds, stems and similar items." }, { "id": "LOOT_CHEMICAL", "type": "LOOT_ZONE", "name": "Loot: Chemical", + "can_be_personal": true, "description": "Destination for chemicals." }, { "id": "LOOT_SPARE_PARTS", "type": "LOOT_ZONE", "name": "Loot: S.Parts", + "can_be_personal": true, "description": "Destination for spare parts." }, { "id": "LOOT_ARTIFACTS", "type": "LOOT_ZONE", "name": "Loot: Artifacts", + "can_be_personal": true, "description": "Destination for artifacts" }, { "id": "LOOT_CORPSE", "type": "LOOT_ZONE", "name": "Loot: Corpses", + "can_be_personal": true, "description": "Destination for corpses" }, { "id": "LOOT_ARMOR", "type": "LOOT_ZONE", "name": "Loot: Armor", + "can_be_personal": true, "description": "Destination for armor. Does include filthy armor if such zone is not specified." }, { "id": "LOOT_FARMOR", "type": "LOOT_ZONE", "name": "Loot: F.Armor", + "can_be_personal": true, "description": "Destination for filthy armor." }, { "id": "LOOT_WOOD", "type": "LOOT_ZONE", "name": "Loot: Wood", + "can_be_personal": true, "description": "Destination for firewood and items that can be used as such." }, { "id": "LOOT_CUSTOM", "type": "LOOT_ZONE", "name": "Loot: Custom", + "can_be_personal": true, "description": "Destination for loot with a custom filter that you can modify" }, { "id": "LOOT_IGNORE", "type": "LOOT_ZONE", "name": "Loot: Ignore", + "can_be_personal": true, "description": "Items inside of this zone are ignored by \"sort out loot\" zone-action." }, { "id": "LOOT_IGNORE_FAVORITES", "type": "LOOT_ZONE", "name": "Loot: Ignore Favorites", + "can_be_personal": true, "description": "Favorite items inside of this zone are ignored by \"sort out loot\" zone-action." }, { diff --git a/data/raw/keybindings.json b/data/raw/keybindings.json index f6a371525c09e..41b16f2696adb 100644 --- a/data/raw/keybindings.json +++ b/data/raw/keybindings.json @@ -2866,6 +2866,17 @@ { "input_method": "keyboard_code", "key": "a", "mod": [ "shift" ] } ] }, + { + "type": "keybinding", + "id": "ADD_PERSONAL_ZONE", + "category": "ZONES_MANAGER", + "name": "Add personal zone", + "bindings": [ + { "input_method": "keyboard_any", "key": "p" }, + { "input_method": "keyboard_char", "key": "P" }, + { "input_method": "keyboard_code", "key": "p", "mod": [ "shift" ] } + ] + }, { "type": "keybinding", "id": "REMOVE_ZONE", diff --git a/src/clzones.cpp b/src/clzones.cpp index 71974ac260bd1..08da208f15659 100644 --- a/src/clzones.cpp +++ b/src/clzones.cpp @@ -181,6 +181,7 @@ void zone_type::load( const JsonObject &jo, const std::string & ) mandatory( jo, was_loaded, "name", name_ ); mandatory( jo, was_loaded, "id", id ); optional( jo, was_loaded, "description", desc_, translation() ); + optional( jo, was_loaded, "can_be_personal", can_be_personal ); } shared_ptr_fast zone_options::create( const zone_type_id &type ) @@ -485,14 +486,23 @@ cata::optional zone_manager::query_name( const std::string &default } } -cata::optional zone_manager::query_type() const +cata::optional zone_manager::query_type( bool personal ) const { const auto &types = get_manager().get_types(); // Copy zone types into an array and sort by name std::vector> types_vec; - std::copy( types.begin(), types.end(), - std::back_inserter>>( types_vec ) ); + // only add personal functioning zones for personal + if( personal ) { + for( auto &tmp : types ) { + if( tmp.second.can_be_personal ) { + types_vec.emplace_back( tmp ); + } + } + } else { + std::copy( types.begin(), types.end(), + std::back_inserter>>( types_vec ) ); + } std::sort( types_vec.begin(), types_vec.end(), []( const std::pair &lhs, const std::pair &rhs ) { return localized_compare( lhs.second.name(), rhs.second.name() ); @@ -540,7 +550,7 @@ bool zone_data::set_name() bool zone_data::set_type() { - const auto maybe_type = zone_manager::get_manager().query_type(); + const auto maybe_type = zone_manager::get_manager().query_type( is_personal ); if( maybe_type.has_value() && maybe_type.value() != type ) { shared_ptr_fast new_options = zone_options::create( maybe_type.value() ); if( new_options->query_at_creation() ) { @@ -582,7 +592,9 @@ void zone_data::set_is_vehicle( const bool is_vehicle_arg ) tripoint zone_data::get_center_point() const { - return tripoint( ( start.x + end.x ) / 2, ( start.y + end.y ) / 2, ( start.z + end.z ) / 2 ); + return tripoint( ( get_start_point().x + get_end_point().x ) / 2, + ( get_start_point().y + get_end_point().y ) / 2, + ( get_start_point().z + get_end_point().z ) / 2 ); } std::string zone_manager::get_name_from_type( const zone_type_id &type ) const @@ -1008,28 +1020,34 @@ void zone_manager::create_vehicle_loot_zone( vehicle &vehicle, const point &moun void zone_manager::add( const std::string &name, const zone_type_id &type, const faction_id &fac, const bool invert, const bool enabled, const tripoint &start, - const tripoint &end, const shared_ptr_fast &options ) + const tripoint &end, const shared_ptr_fast &options, const bool personal ) { - zone_data new_zone = zone_data( name, type, fac, invert, enabled, start, end, options ); - //the start is a vehicle tile with cargo space map &here = get_map(); - if( const cata::optional vp = here.veh_at( here.getlocal( - start ) ).part_with_feature( "CARGO", false ) ) { - // TODO:Allow for loot zones on vehicles to be larger than 1x1 - if( start == end && query_yn( _( "Bind this zone to the cargo part here?" ) ) ) { - // TODO: refactor zone options for proper validation code - if( type == zone_type_FARM_PLOT || type == zone_type_CONSTRUCTION_BLUEPRINT ) { - popup( _( "You cannot add that type of zone to a vehicle." ), PF_NONE ); + zone_data new_zone = zone_data( name, type, fac, invert, enabled, start, end, options, personal ); + // only non personal zones can be vehicle zones + if( !personal ) { + //the start is a vehicle tile with cargo space + if( const cata::optional vp = here.veh_at( here.getlocal( + start ) ).part_with_feature( "CARGO", false ) ) { + // TODO:Allow for loot zones on vehicles to be larger than 1x1 + if( start == end && query_yn( _( "Bind this zone to the cargo part here?" ) ) ) { + // TODO: refactor zone options for proper validation code + if( type == zone_type_FARM_PLOT || type == zone_type_CONSTRUCTION_BLUEPRINT ) { + popup( _( "You cannot add that type of zone to a vehicle." ), PF_NONE ); + return; + } + + create_vehicle_loot_zone( vp->vehicle(), vp->mount(), new_zone ); return; } - - create_vehicle_loot_zone( vp->vehicle(), vp->mount(), new_zone ); - return; } } //Create a regular zone zones.push_back( new_zone ); + if( personal ) { + num_personal_zones++; + } cache_data(); } @@ -1037,6 +1055,10 @@ bool zone_manager::remove( zone_data &zone ) { for( auto it = zones.begin(); it != zones.end(); ++it ) { if( &zone == &*it ) { + // if removing a personal zone reduce the number of counted personal zones + if( it->get_is_personal() ) { + num_personal_zones--; + } zones.erase( it ); return true; } @@ -1163,6 +1185,12 @@ std::vector zone_manager::get_zones( return zones; } +bool zone_manager::has_personal_zones() const +{ + // if there are more than 0 personal zones + return num_personal_zones > 0; +} + void zone_manager::serialize( JsonOut &json ) const { json.write( zones ); @@ -1172,6 +1200,10 @@ void zone_manager::deserialize( const JsonValue &jv ) { jv.read( zones ); for( auto it = zones.begin(); it != zones.end(); ++it ) { + // need to keep track of number of personal zones on reload + if( it->get_is_personal() ) { + num_personal_zones++; + } const zone_type_id zone_type = it->get_type(); if( !has_type( zone_type ) ) { zones.erase( it ); @@ -1189,6 +1221,7 @@ void zone_data::serialize( JsonOut &json ) const json.member( "invert", invert ); json.member( "enabled", enabled ); json.member( "is_vehicle", is_vehicle ); + json.member( "is_personal", is_personal ); json.member( "start", start ); json.member( "end", end ); options->serialize( json ); @@ -1213,6 +1246,11 @@ void zone_data::deserialize( const JsonObject &data ) } else { is_vehicle = false; } + if( data.has_member( "is_personal" ) ) { + data.read( "is_personal", is_personal ); + } else { + is_personal = false; + } //Legacy support if( data.has_member( "start_x" ) ) { tripoint s; diff --git a/src/clzones.h b/src/clzones.h index 79f47b1328de8..094b40413128d 100644 --- a/src/clzones.h +++ b/src/clzones.h @@ -19,6 +19,8 @@ #include "point.h" #include "translations.h" #include "type_id.h" +#include "avatar.h" +#include "map.h" class JsonObject; class JsonOut; @@ -52,6 +54,8 @@ class zone_type std::string name() const; std::string desc() const; + bool can_be_personal = false; + static void load_zones( const JsonObject &jo, const std::string &src ); void load( const JsonObject &jo, const std::string & ); /** @@ -239,6 +243,8 @@ class zone_data bool invert; bool enabled; bool is_vehicle; + //centered on the player + bool is_personal; tripoint start; tripoint end; shared_ptr_fast options; @@ -249,6 +255,7 @@ class zone_data invert = false; enabled = false; is_vehicle = false; + is_personal = false; start = tripoint_zero; end = tripoint_zero; options = nullptr; @@ -257,13 +264,14 @@ class zone_data zone_data( const std::string &_name, const zone_type_id &_type, const faction_id &_faction, bool _invert, const bool _enabled, const tripoint &_start, const tripoint &_end, - const shared_ptr_fast &_options = nullptr ) { + const shared_ptr_fast &_options = nullptr, bool personal = false ) { name = _name; type = _type; faction = _faction; invert = _invert; enabled = _enabled; is_vehicle = false; + is_personal = personal; start = _start; end = _end; @@ -314,10 +322,21 @@ class zone_data bool get_is_vehicle() const { return is_vehicle; } + bool get_is_personal() const { + return is_personal; + } tripoint get_start_point() const { + if( is_personal ) { + avatar &player_character = get_avatar(); + return start + get_map().getabs( player_character.pos() ); + } return start; } tripoint get_end_point() const { + if( is_personal ) { + avatar &player_character = get_avatar(); + return end + get_map().getabs( player_character.pos() ); + } return end; } tripoint get_center_point() const; @@ -331,6 +350,14 @@ class zone_data return *options; } bool has_inside( const tripoint &p ) const { + // if it is personal then the zone is local + if( is_personal ) { + avatar &player_character = get_avatar(); + const tripoint &shift = get_map().getabs( player_character.pos() ); + return p.x >= start.x + shift.x && p.x <= end.x + shift.x && + p.y >= start.y + shift.y && p.y <= end.y + shift.y && + p.z >= start.z + shift.z && p.z <= end.z + shift.z; + } return p.x >= start.x && p.x <= end.x && p.y >= start.y && p.y <= end.y && p.z >= start.z && p.z <= end.z; @@ -357,6 +384,10 @@ class zone_manager std::vector removed_vzones; // NOLINT(cata-serialize) std::map types; // NOLINT(cata-serialize) + + // a count of the number of personal zones the character has + int num_personal_zones = 0; // NOLINT(cata-serialize) + // NOLINTNEXTLINE(cata-serialize) std::unordered_map> area_cache; // NOLINTNEXTLINE(cata-serialize) @@ -384,7 +415,7 @@ class zone_manager void add( const std::string &name, const zone_type_id &type, const faction_id &faction, bool invert, bool enabled, const tripoint &start, const tripoint &end, - const shared_ptr_fast &options = nullptr ); + const shared_ptr_fast &options = nullptr, const bool personal = false ); const zone_data *get_zone_at( const tripoint &where, const zone_type_id &type ) const; void create_vehicle_loot_zone( class vehicle &vehicle, const point &mount_point, zone_data &new_zone ); @@ -420,7 +451,7 @@ class zone_manager const zone_data *get_bottom_zone( const tripoint &where, const faction_id &fac = your_fac ) const; cata::optional query_name( const std::string &default_name = "" ) const; - cata::optional query_type() const; + cata::optional query_type( bool personal = false ) const; void swap( zone_data &a, zone_data &b ); void rotate_zones( map &target_map, int turns ); // list of tripoints of zones that are loot zones only @@ -433,6 +464,8 @@ class zone_manager std::vector get_zones( const faction_id &fac = your_fac ); std::vector get_zones( const faction_id &fac = your_fac ) const; + bool has_personal_zones() const; + bool save_zones(); void load_zones(); void zone_edited( zone_data &zone ); diff --git a/src/game.cpp b/src/game.cpp index da060becf69c9..dcebf65355ae6 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -5859,6 +5859,7 @@ static void zones_manager_shortcuts( const catacurses::window &w_info ) int tmpx = 1; tmpx += shortcut_print( w_info, point( tmpx, 1 ), c_white, c_light_green, _( "dd" ) ) + 2; + tmpx += shortcut_print( w_info, point( tmpx, 1 ), c_white, c_light_green, _( "

ersonal" ) ) + 2; tmpx += shortcut_print( w_info, point( tmpx, 1 ), c_white, c_light_green, _( "emove" ) ) + 2; tmpx += shortcut_print( w_info, point( tmpx, 1 ), c_white, c_light_green, _( "nable" ) ) + 2; shortcut_print( w_info, point( tmpx, 1 ), c_white, c_light_green, _( "isable" ) ); @@ -5973,6 +5974,7 @@ void game::zones_manager() ctxt.register_action( "CONFIRM" ); ctxt.register_action( "QUIT" ); ctxt.register_action( "ADD_ZONE" ); + ctxt.register_action( "ADD_PERSONAL_ZONE" ); ctxt.register_action( "REMOVE_ZONE" ); ctxt.register_action( "MOVE_ZONE_UP" ); ctxt.register_action( "MOVE_ZONE_DOWN" ); @@ -6044,7 +6046,7 @@ void game::zones_manager() add_draw_callback( zone_cb ); auto query_position = - [&]() -> cata::optional> { + [&]( bool personal = false ) -> cata::optional> { on_out_of_scope invalidate_current_ui( [&]() { ui.mark_resize(); @@ -6072,6 +6074,19 @@ void game::zones_manager() const look_around_result second = look_around( /*show_window=*/false, center, *first.position, true, true, false ); if( second.position ) { + if( personal ) { + tripoint first_abs = tripoint( std::min( first.position->x - u.posx(), + second.position->x - u.posx() ), + std::min( first.position->y - u.posy(), second.position->y - u.posy() ), + std::min( first.position->z - u.posz(), + second.position->z - u.posz() ) ) ; + tripoint second_abs = tripoint( std::max( first.position->x - u.posx(), + second.position->x - u.posx() ), + std::max( first.position->y - u.posy(), second.position->y - u.posy() ), + std::max( first.position->z - u.posz(), + second.position->z - u.posz() ) ) ; + return std::pair( first_abs, second_abs ); + } tripoint first_abs = m.getabs( tripoint( std::min( first.position->x, second.position->x ), std::min( first.position->y, second.position->y ), @@ -6082,6 +6097,7 @@ void game::zones_manager() std::max( first.position->y, second.position->y ), std::max( first.position->z, second.position->z ) ) ); + return std::pair( first_abs, second_abs ); } } @@ -6188,8 +6204,47 @@ void game::zones_manager() } mgr.add( name, id, get_player_character().get_faction()->id, false, true, - position->first, position->second, options ); + position->first, position->second, options, false ); + + zones = get_zones(); + active_index = zone_cnt - 1; + + stuff_changed = true; + } while( false ); + + blink = false; + } else if( action == "ADD_PERSONAL_ZONE" ) { + do { // not a loop, just for quick bailing out if canceled + const auto maybe_id = mgr.query_type( true ); + if( !maybe_id.has_value() ) { + break; + } + + const zone_type_id &id = maybe_id.value(); + auto options = zone_options::create( id ); + + if( !options->query_at_creation() ) { + break; + } + + auto default_name = options->get_zone_name_suggestion(); + if( default_name.empty() ) { + default_name = mgr.get_name_from_type( id ); + } + const auto maybe_name = mgr.query_name( default_name ); + if( !maybe_name.has_value() ) { + break; + } + const std::string &name = maybe_name.value(); + const auto position = query_position( true ); + if( !position ) { + break; + } + + //add a zone that is relative to the avatar position + mgr.add( name, id, get_player_character().get_faction()->id, false, true, + position->first, position->second, options, true ); zones = get_zones(); active_index = zone_cnt - 1; @@ -6274,7 +6329,7 @@ void game::zones_manager() } break; case 4: { - const auto pos = query_position(); + const auto pos = query_position( zone.get_is_personal() ); if( pos && ( pos->first != zone.get_start_point() || pos->second != zone.get_end_point() ) ) { zone.set_position( *pos ); diff --git a/src/handle_action.cpp b/src/handle_action.cpp index 0150841b5c833..00cc3ad7bd7a6 100644 --- a/src/handle_action.cpp +++ b/src/handle_action.cpp @@ -1172,6 +1172,11 @@ static void loot() auto &mgr = zone_manager::get_manager(); const bool has_fertilizer = player_character.has_item_with_flag( flag_FERTILIZER ); + // cache should only happen if we have personal zones defined + if( mgr.has_personal_zones() ) { + mgr.cache_data(); + } + // Manually update vehicle cache. // In theory this would be handled by the related activity (activity_on_turn_move_loot()) // but with a stale cache we never get that far. From f7d3a10c15d1510b5ebeb4bd8df3518972371e46 Mon Sep 17 00:00:00 2001 From: Maleclypse <54345792+Maleclypse@users.noreply.github.com> Date: Tue, 14 Dec 2021 22:43:37 -0600 Subject: [PATCH 14/39] Longest side for torso armor (#53398) --- data/json/items/armor/suits_protection.json | 15 +++++++++++++++ data/json/items/armor/torso_armor.json | 10 ++++++++++ 2 files changed, 25 insertions(+) diff --git a/data/json/items/armor/suits_protection.json b/data/json/items/armor/suits_protection.json index cf50f3c14b9cd..f672c006f1a08 100644 --- a/data/json/items/armor/suits_protection.json +++ b/data/json/items/armor/suits_protection.json @@ -13,6 +13,7 @@ "bashing": 2, "material": [ "leather" ], "symbol": "[", + "longest_side": "60 cm", "looks_like": "armor_larmor", "color": "brown", "armor": [ @@ -58,6 +59,7 @@ "looks_like": "armor_larmor", "color": "green", "warmth": 10, + "longest_side": "60 cm", "material_thickness": 4, "flags": [ "STURDY" ], "armor": [ { "encumbrance": 10, "coverage": 90, "covers": [ "torso", "leg_l", "leg_r" ] } ] @@ -107,6 +109,7 @@ "bashing": 2, "material": [ "fur" ], "symbol": "[", + "longest_side": "30 cm", "looks_like": "armor_larmor", "color": "brown", "armor": [ @@ -157,6 +160,7 @@ "bashing": 2, "material": [ "leather" ], "symbol": "[", + "longest_side": "60 cm", "looks_like": "touring_suit", "color": "brown", "armor": [ @@ -209,6 +213,7 @@ "looks_like": "armor_larmor", "color": "light_gray", "warmth": 20, + "longest_side": "60 cm", "material_thickness": 4, "flags": [ "VARSIZE", "OUTER", "STURDY" ], "armor": [ { "encumbrance": 20, "coverage": 95, "covers": [ "torso", "leg_l", "leg_r", "arm_l", "arm_r" ] } ] @@ -236,6 +241,7 @@ "material": [ "leather", "iron" ], "symbol": "[", "color": "brown", + "longest_side": "60 cm", "looks_like": "armor_larmor", "armor": [ { "covers": [ "torso" ], "coverage": 90, "encumbrance": [ 17, 22 ] }, @@ -302,6 +308,7 @@ "looks_like": "armor_lightplate", "color": "light_gray", "warmth": 20, + "longest_side": "60 cm", "material_thickness": 5, "flags": [ "VARSIZE", "OUTER" ], "armor": [ { "encumbrance": 45, "coverage": 90, "covers": [ "torso", "leg_l", "leg_r", "arm_l", "arm_r" ] } ] @@ -331,6 +338,7 @@ "looks_like": "kevlar", "color": "light_gray", "warmth": 10, + "longest_side": "60 cm", "material_thickness": 2.5, "flags": [ "STURDY", "OUTER" ], "armor": [ @@ -355,6 +363,7 @@ "looks_like": "armor_lightplate", "color": "dark_gray", "warmth": 25, + "longest_side": "60 cm", "material_thickness": 4, "flags": [ "VARSIZE", "STURDY", "OUTER" ], "armor": [ { "encumbrance": 15, "coverage": 85, "covers": [ "torso", "leg_l", "leg_r", "arm_l", "arm_r", "hand_l", "hand_r" ] } ] @@ -377,6 +386,7 @@ "looks_like": "armor_lightplate", "color": "light_gray", "warmth": 10, + "longest_side": "40 cm", "material_thickness": 2, "flags": [ "OUTER" ], "armor": [ { "encumbrance": 18, "coverage": 80, "covers": [ "torso", "leg_l", "leg_r", "arm_l", "arm_r" ] } ] @@ -397,6 +407,7 @@ "looks_like": "armor_scrapsuit", "color": "light_gray", "warmth": 10, + "longest_side": "40 cm", "material_thickness": 4, "flags": [ "OUTER", "NONCONDUCTIVE" ], "armor": [ { "encumbrance": 18, "coverage": 80, "covers": [ "torso", "leg_l", "leg_r", "arm_l", "arm_r" ] } ] @@ -416,6 +427,7 @@ "symbol": "[", "looks_like": "hazmat_suit", "color": "white", + "longest_side": "12 cm", "armor": [ { "covers": [ "torso" ], "coverage": 100, "encumbrance": [ 10, 15 ] }, { "covers": [ "leg_l", "leg_r" ], "coverage": 100, "encumbrance": [ 10, 12 ] }, @@ -530,6 +542,7 @@ "looks_like": "jumpsuit", "color": "white", "warmth": 10, + "longest_side": "12 cm", "material_thickness": 1, "environmental_protection": 10, "flags": [ "VARSIZE", "WATERPROOF", "HOOD", "RAINPROOF", "RAD_RESIST", "OUTER" ], @@ -555,6 +568,7 @@ "looks_like": "jumpsuit", "color": "light_gray", "warmth": 30, + "longest_side": "30 cm", "material_thickness": 5, "environmental_protection": 20, "flags": [ "VARSIZE", "WATERPROOF", "RAINPROOF", "GAS_PROOF", "STURDY", "OUTER" ], @@ -869,6 +883,7 @@ "to_hit": -3, "material": [ "kevlar_layered", "thermo_resin", "plastic" ], "symbol": "[", + "longest_side": "40 cm", "looks_like": "armor_riot", "color": "dark_gray", "armor": [ diff --git a/data/json/items/armor/torso_armor.json b/data/json/items/armor/torso_armor.json index ce9bf29447608..e89721a567fdd 100644 --- a/data/json/items/armor/torso_armor.json +++ b/data/json/items/armor/torso_armor.json @@ -15,6 +15,7 @@ "symbol": "[", "looks_like": "cuirass_lightplate", "color": "yellow", + "longest_side": "60 cm", "warmth": 15, "material_thickness": 3, "flags": [ "VARSIZE", "OUTER", "STURDY" ], @@ -42,6 +43,7 @@ "looks_like": "vest_leather", "copy-from": "armor_chitin", "color": "brown", + "longest_side": "60 cm", "warmth": 20, "material_thickness": 8, "flags": [ "VARSIZE", "STURDY" ], @@ -68,6 +70,7 @@ "bashing": 6, "material": [ "iron", "leather" ], "symbol": "[", + "longest_side": "60 cm", "looks_like": "armor_lamellar", "color": "light_gray", "warmth": 15, @@ -104,6 +107,7 @@ "bashing": 6, "material": [ "fancy_bronze", "leather" ], "symbol": "[", + "longest_side": "60 cm", "looks_like": "armor_lorica", "color": "brown", "warmth": 18, @@ -146,6 +150,7 @@ "looks_like": "armor_scrapsuit", "color": "light_gray", "warmth": 10, + "longest_side": "60 cm", "material_thickness": 12, "flags": [ "OUTER" ], "armor": [ { "encumbrance": 20, "coverage": 80, "covers": [ "torso" ] } ] @@ -166,6 +171,7 @@ "looks_like": "armor_scrapsuit", "color": "light_gray", "warmth": 10, + "longest_side": "40 cm", "material_thickness": 4, "flags": [ "OUTER", "NONCONDUCTIVE" ], "armor": [ { "encumbrance": 20, "coverage": 80, "covers": [ "torso" ] } ] @@ -214,6 +220,7 @@ "looks_like": "cuirass_lightplate", "color": "dark_gray", "warmth": 20, + "longest_side": "20 cm", "material_thickness": 3, "environmental_protection": 1, "flags": [ "WATER_FRIENDLY", "STURDY", "OUTER" ], @@ -235,6 +242,7 @@ "looks_like": "chestguard_hard", "color": "light_gray", "warmth": 20, + "longest_side": "60 cm", "material_thickness": 4, "flags": [ "VARSIZE", "OUTER", "STURDY" ], "armor": [ @@ -278,6 +286,7 @@ "symbol": "[", "looks_like": "cuirass_lightplate", "color": "light_gray", + "longest_side": "40 cm", "warmth": 10, "material_thickness": 2, "flags": [ "OUTER" ], @@ -306,6 +315,7 @@ "symbol": "[", "looks_like": "cuirass_lightplate", "color": "light_gray", + "longest_side": "40 cm", "warmth": 10, "material_thickness": 4, "flags": [ "OUTER", "NONCONDUCTIVE" ], From 035a789a6299f8f150c4b0efaa762fd0bb706e1f Mon Sep 17 00:00:00 2001 From: ISuckM8 <87550905+ISuckM8@users.noreply.github.com> Date: Wed, 15 Dec 2021 13:04:37 +0800 Subject: [PATCH 15/39] Feral sapien enemy --- data/json/monsterdrops/feral_humans.json | 14 ++++++ data/json/monstergroups/zombies.json | 7 +++ data/json/monsters/feral_humans.json | 60 ++++++++++++++++++++++++ data/json/speech.json | 36 ++++++++++++++ 4 files changed, 117 insertions(+) diff --git a/data/json/monsterdrops/feral_humans.json b/data/json/monsterdrops/feral_humans.json index aab82036e0c2a..89826ffa1cb74 100644 --- a/data/json/monsterdrops/feral_humans.json +++ b/data/json/monsterdrops/feral_humans.json @@ -17,6 +17,20 @@ "id": "feral_humans_death_drops_crowbar", "entries": [ { "item": "crowbar", "prob": 100, "damage": [ 1, 3 ] }, { "group": "default_zombie_clothes", "prob": 100 } ] }, + { + "type": "item_group", + "subtype": "collection", + "id": "feral_sapien_death_drops_spear", + "entries": [ + { "group": "survivor_stabbing", "prob": 100, "damage": [ 0, 3 ] }, + { "group": "mon_zombie_survivor_death_drops", "prob": 100 }, + { "item": "spearsling", "prob": 100, "damage": [ 0, 3 ] }, + { "item": "survivor_belt_notools", "prob": 30, "damage": [ 0, 3 ] }, + { "item": "duster_leather", "prob": 25, "damage": [ 0, 3 ] }, + { "item": "kevlar", "prob": 25, "damage": [ 0, 3 ] }, + { "item": "tac_helmet", "prob": 10, "damage": [ 0, 3 ] } + ] + }, { "type": "item_group", "subtype": "collection", diff --git a/data/json/monstergroups/zombies.json b/data/json/monstergroups/zombies.json index 289d43d3c2ef7..adda06cb3b88c 100644 --- a/data/json/monstergroups/zombies.json +++ b/data/json/monstergroups/zombies.json @@ -12,6 +12,7 @@ { "monster": "mon_feral_human_pipe", "weight": 40 }, { "monster": "mon_feral_human_crowbar", "weight": 40 }, { "monster": "mon_feral_human_axe", "weight": 20, "cost_multiplier": 2 }, + { "monster": "mon_feral_sapien_spear", "weight": 14, "cost_multiplier": 2 }, { "monster": "mon_zombie_crawler", "weight": 25 }, { "monster": "mon_zombie_brainless", "weight": 25 }, { "monster": "mon_zombie_dog", "weight": 25, "pack_size": [ 1, 2 ] } @@ -62,6 +63,7 @@ { "monster": "mon_feral_human_pipe", "weight": 20 }, { "monster": "mon_feral_human_crowbar", "weight": 20 }, { "monster": "mon_feral_human_axe", "weight": 10, "cost_multiplier": 2 }, + { "monster": "mon_feral_sapien_spear", "weight": 5, "cost_multiplier": 2 }, { "monster": "mon_zombie_crawler", "weight": 25 }, { "monster": "mon_zombie_brainless", "weight": 25 } ] @@ -111,6 +113,7 @@ { "monster": "mon_feral_human_pipe", "weight": 4, "pack_size": [ 2, 3 ] }, { "monster": "mon_feral_human_crowbar", "weight": 4, "pack_size": [ 2, 3 ] }, { "monster": "mon_feral_human_axe", "weight": 2, "cost_multiplier": 2, "pack_size": [ 1, 2 ] }, + { "monster": "mon_feral_sapien_spear", "weight": 1, "cost_multiplier": 2 }, { "monster": "mon_zombie_brainless", "weight": 65 } ] }, @@ -135,6 +138,7 @@ { "monster": "mon_feral_human_pipe", "weight": 40, "cost_multiplier": 0 }, { "monster": "mon_feral_human_crowbar", "weight": 40, "cost_multiplier": 0 }, { "monster": "mon_feral_human_axe", "weight": 20, "cost_multiplier": 0 }, + { "monster": "mon_feral_sapien_spear", "weight": 9, "cost_multiplier": 2 }, { "monster": "mon_zombie_brainless", "weight": 30, "cost_multiplier": 0 } ] }, @@ -433,6 +437,7 @@ { "monster": "mon_feral_human_pipe", "weight": 4, "pack_size": [ 5, 9 ] }, { "monster": "mon_feral_human_crowbar", "weight": 4, "pack_size": [ 4, 7 ] }, { "monster": "mon_feral_human_axe", "weight": 2, "cost_multiplier": 2, "pack_size": [ 2, 4 ] }, + { "monster": "mon_feral_sapien_spear", "weight": 1, "cost_multiplier": 2 }, { "monster": "mon_zombie", "weight": 75, "cost_multiplier": 2 }, { "monster": "mon_zombie_medical", "weight": 200, "cost_multiplier": 2 }, { "monster": "mon_zombie_fat", "weight": 75, "cost_multiplier": 2 }, @@ -526,6 +531,8 @@ { "monster": "mon_feral_human_pipe", "weight": 840 }, { "monster": "mon_feral_human_pipe", "weight": 100, "pack_size": [ 3, 8 ] }, { "monster": "mon_feral_human_crowbar", "weight": 40, "pack_size": [ 2, 6 ] }, + { "monster": "mon_feral_human_axe", "weight": 20, "cost_multiplier": 2, "pack_size": [ 1, 4 ] }, + { "monster": "mon_feral_sapien_spear", "weight": 14, "cost_multiplier": 2 }, { "monster": "mon_feral_human_axe", "weight": 20, "cost_multiplier": 2, "pack_size": [ 1, 4 ] } ] }, diff --git a/data/json/monsters/feral_humans.json b/data/json/monsters/feral_humans.json index debf7114f557d..403b101e11eb6 100644 --- a/data/json/monsters/feral_humans.json +++ b/data/json/monsters/feral_humans.json @@ -58,6 +58,66 @@ "DROPS_AMMO" ] }, + { + "id": "mon_feral_sapien_spear", + "type": "MONSTER", + "name": { "str": "cunning feral" }, + "description": "In this feral human's eyes is more intelligence than in those of most of their kind. They're carrying a crude spear, and have assembled some basic armor from scavenged clothing and bits of riot armour, leaving several gaps. Although a bit more together, this creature is still only a few steps away from being a living zombie themself.", + "default_faction": "zombie", + "bodytype": "human", + "species": [ "HUMAN" ], + "volume": "62500 ml", + "weight": "81500 g", + "hp": 80, + "speed": 100, + "material": [ "flesh" ], + "symbol": "@", + "color": "magenta", + "aggression": 30, + "morale": 100, + "melee_skill": 3, + "melee_dice": 4, + "melee_dice_sides": 6, + "melee_cut": 2, + "dodge": 3, + "armor_bash": 9, + "armor_cut": 7, + "armor_bullet": 12, + "special_attacks": [ + [ "PARROT_AT_DANGER", 0 ], + { + "id": "stretch_attack", + "cooldown": 5, + "range": 2, + "hit_dmg_u": "The %1$s thrusts a spear at your %2$s, slashing it!", + "hit_dmg_npc": "The %1$s thrusts a spear at 's %2$s, slashing it!", + "no_dmg_msg_u": "The %1$s thrusts a spear at your %2$s, but glances off your armor!", + "no_dmg_msg_npc": "The %1$s thrusts a spear at 's %2$s, but glances off armor!", + "miss_msg_u": "The %s thrusts a spear at you, but you evade it!", + "miss_msg_npc": "The %s thrusts a spear at , but they evade it!" + } + ], + "armor_acid": 4, + "harvest": "human", + "vision_day": 50, + "vision_night": 3, + "path_settings": { "max_dist": 30, "allow_open_doors": true, "avoid_traps": true, "avoid_sharp": true }, + "death_drops": "feral_sapien_death_drops_spear", + "zombify_into": "mon_zombie_survivor", + "anger_triggers": [ "FRIEND_DIED", "FRIEND_ATTACKED", "HURT" ], + "flags": [ + "SEES", + "HEARS", + "SMELLS", + "WARM", + "BASHES", + "GROUP_BASH", + "HUMAN", + "CAN_OPEN_DOORS", + "PATH_AVOID_DANGER_1", + "PRIORITIZE_TARGETS" + ] + }, { "id": "mon_chud", "type": "MONSTER", diff --git a/data/json/speech.json b/data/json/speech.json index 5f7f932d1b2f8..511bb8e5ddae1 100644 --- a/data/json/speech.json +++ b/data/json/speech.json @@ -2262,6 +2262,42 @@ "sound": "\"Wanna play with me?\"", "volume": 10 }, + { + "type": "speech", + "speaker": [ "mon_feral_sapien_spear" ], + "sound": "\"You!\"", + "volume": 10 + }, + { + "type": "speech", + "speaker": [ "mon_feral_sapien_spear" ], + "sound": "\"Food!\"", + "volume": 15 + }, + { + "type": "speech", + "speaker": [ "mon_feral_sapien_spear" ], + "sound": "\"Raagh!\"", + "volume": 10 + }, + { + "type": "speech", + "speaker": [ "mon_feral_sapien_spear" ], + "sound": "\"Hunger…\"", + "volume": 10 + }, + { + "type": "speech", + "speaker": [ "mon_feral_sapien_spear" ], + "sound": "\"Hate…\"", + "volume": 10 + }, + { + "type": "speech", + "speaker": [ "mon_feral_sapien_spear" ], + "sound": "\"Hate… you…\"", + "volume": 10 + }, { "type": "speech", "speaker": [ "talking_doll", "mon_mi_go", "mon_mi_go_slaver", "mon_mannequin_decoy" ], From cd497393a2e253dd9735f5b6e904b4d3d898b1ad Mon Sep 17 00:00:00 2001 From: Binrui Dong Date: Wed, 15 Dec 2021 13:43:19 +0800 Subject: [PATCH 16/39] Fix typo in base camp recipes --- .../version_2/recipe_modular_field_migo_resin.json | 2 +- .../version_2/recipe_modular_field_rammed_earth.json | 2 +- .../recipe_modular_hub/version_2/recipe_modular_field_tent.json | 2 +- .../recipe_modular_hub/version_2/recipe_modular_field_wad.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/data/json/recipes/basecamps/base/recipe_modular_hub/version_2/recipe_modular_field_migo_resin.json b/data/json/recipes/basecamps/base/recipe_modular_hub/version_2/recipe_modular_field_migo_resin.json index 285ca440d1729..5cc03303f3ce3 100644 --- a/data/json/recipes/basecamps/base/recipe_modular_hub/version_2/recipe_modular_field_migo_resin.json +++ b/data/json/recipes/basecamps/base/recipe_modular_hub/version_2/recipe_modular_field_migo_resin.json @@ -48,7 +48,7 @@ "type": "recipe", "activity_level": "MODERATE_EXERCISE", "result": "fbmh_2_resin_room_2", - "description": "We should expand our housing by adding a mi-go resin room immediatey south of the shack.", + "description": "We should expand our housing by adding a mi-go resin room immediately south of the shack.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, diff --git a/data/json/recipes/basecamps/base/recipe_modular_hub/version_2/recipe_modular_field_rammed_earth.json b/data/json/recipes/basecamps/base/recipe_modular_hub/version_2/recipe_modular_field_rammed_earth.json index f6025268ba3aa..8d653cd461450 100644 --- a/data/json/recipes/basecamps/base/recipe_modular_hub/version_2/recipe_modular_field_rammed_earth.json +++ b/data/json/recipes/basecamps/base/recipe_modular_hub/version_2/recipe_modular_field_rammed_earth.json @@ -48,7 +48,7 @@ "type": "recipe", "activity_level": "MODERATE_EXERCISE", "result": "fbmh_2_rammed_earth_room_2", - "description": "We should expand our housing by adding a rammed earth room immediatey south of the shack.", + "description": "We should expand our housing by adding a rammed earth room immediately south of the shack.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, diff --git a/data/json/recipes/basecamps/base/recipe_modular_hub/version_2/recipe_modular_field_tent.json b/data/json/recipes/basecamps/base/recipe_modular_hub/version_2/recipe_modular_field_tent.json index c9d09456657c2..0887c9f437b4b 100644 --- a/data/json/recipes/basecamps/base/recipe_modular_hub/version_2/recipe_modular_field_tent.json +++ b/data/json/recipes/basecamps/base/recipe_modular_hub/version_2/recipe_modular_field_tent.json @@ -21,7 +21,7 @@ "type": "recipe", "activity_level": "MODERATE_EXERCISE", "result": "fbmh_2_tent_room_2", - "description": "We should expand our housing by adding a tent immediatey south of the previous shelter, though you'll probably want to replace the tent wall for the central building later.", + "description": "We should expand our housing by adding a tent immediately south of the previous shelter, though you'll probably want to replace the tent wall for the central building later.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, diff --git a/data/json/recipes/basecamps/base/recipe_modular_hub/version_2/recipe_modular_field_wad.json b/data/json/recipes/basecamps/base/recipe_modular_hub/version_2/recipe_modular_field_wad.json index db0095a58716e..b0a403cd0de47 100644 --- a/data/json/recipes/basecamps/base/recipe_modular_hub/version_2/recipe_modular_field_wad.json +++ b/data/json/recipes/basecamps/base/recipe_modular_hub/version_2/recipe_modular_field_wad.json @@ -48,7 +48,7 @@ "type": "recipe", "activity_level": "MODERATE_EXERCISE", "result": "fbmh_2_wad_room_2", - "description": "We should expand our housing by adding a wattle-and-daub room immediatey south of the shack.", + "description": "We should expand our housing by adding a wattle-and-daub room immediately south of the shack.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", "autolearn": false, From 6c63550d543eb6229846d348f124d287b6a0740f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro?= Date: Wed, 15 Dec 2021 08:09:27 +0100 Subject: [PATCH 17/39] Rework electricity fields & damage (#53135) * Rework electricity fields & damage * Update more attacks/effects --- data/json/ammo_effects.json | 2 +- data/json/field_type.json | 35 ++++++- data/json/items/tool/explosives.json | 6 +- src/cata_utility.cpp | 19 ++++ src/cata_utility.h | 7 ++ src/creature.cpp | 4 +- src/field_type.cpp | 1 + src/field_type.h | 1 + src/map.cpp | 8 +- src/map.h | 5 + src/map_field.cpp | 134 ++++++++++++++++++--------- src/monattack.cpp | 9 +- 12 files changed, 175 insertions(+), 56 deletions(-) diff --git a/data/json/ammo_effects.json b/data/json/ammo_effects.json index d052266b34231..226be57f2cee8 100644 --- a/data/json/ammo_effects.json +++ b/data/json/ammo_effects.json @@ -89,7 +89,7 @@ { "id": "LIGHTNING", "type": "ammo_effect", - "aoe": { "field_type": "fd_electricity", "intensity_min": 3, "intensity_max": 3 } + "aoe": { "field_type": "fd_electricity", "intensity_min": 6, "intensity_max": 10, "chance": 25 } }, { "id": "PLASMA", diff --git a/data/json/field_type.json b/data/json/field_type.json index 10f74aa8121b5..3d256dcdffa9d 100644 --- a/data/json/field_type.json +++ b/data/json/field_type.json @@ -740,13 +740,20 @@ "legacy_enum_id": 19, "intensity_levels": [ { "name": "sparks", "sym": "9", "dangerous": true, "light_emitted": 0.01 }, + { "//": "repeat last entry", "light_emitted": 1 }, + { "//": "repeat last entry", "light_emitted": 2.5 }, { "name": "electric crackle", "color": "cyan", "light_emitted": 4 }, - { "name": "electric cloud", "color": "blue", "light_emitted": 20 } + { "//": "repeat last entry", "light_emitted": 7.5 }, + { "//": "repeat last entry", "light_emitted": 11 }, + { "name": "electric cloud", "color": "blue", "light_emitted": 14.5 }, + { "//": "repeat last entry", "light_emitted": 18 }, + { "//": "repeat last entry", "light_emitted": 21.5 }, + { "//": "repeat last entry", "light_emitted": 25 } ], "description_affix": "illuminated_by", "has_elec": true, "priority": 4, - "half_life": "2 turns", + "half_life": "4 turns", "phase": "plasma", "display_items": false, "display_field": true @@ -1560,5 +1567,29 @@ "phase": "liquid", "display_field": true, "looks_like": "fd_sludge" + }, + { + "id": "fd_electricity_unlit", + "type": "field_type", + "intensity_levels": [ + { "name": "sparks", "sym": "9", "dangerous": true }, + { "//": "repeat last entry" }, + { "//": "repeat last entry" }, + { "name": "electric crackle", "color": "cyan" }, + { "//": "repeat last entry" }, + { "//": "repeat last entry" }, + { "name": "electric cloud", "color": "blue", "light_emitted": 5 }, + { "//": "repeat last entry" }, + { "//": "repeat last entry" }, + { "//": "repeat last entry" } + ], + "description_affix": "illuminated_by", + "has_elec": true, + "priority": 4, + "half_life": "4 turns", + "phase": "plasma", + "display_items": false, + "display_field": false, + "looks_like": "fd_electricity" } ] diff --git a/data/json/items/tool/explosives.json b/data/json/items/tool/explosives.json index 7555e28a1497f..79a9216723d6f 100644 --- a/data/json/items/tool/explosives.json +++ b/data/json/items/tool/explosives.json @@ -554,9 +554,9 @@ "use_action": { "type": "explosion", "fields_type": "fd_electricity", - "fields_radius": 2, - "fields_min_intensity": 3, - "fields_max_intensity": 3, + "fields_radius": 1, + "fields_min_intensity": 2, + "fields_max_intensity": 10, "emp_blast_radius": 4, "sound_volume": 0, "sound_msg": "Tick.", diff --git a/src/cata_utility.cpp b/src/cata_utility.cpp index 9564c6bb5507f..693caf502280b 100644 --- a/src/cata_utility.cpp +++ b/src/cata_utility.cpp @@ -661,3 +661,22 @@ holiday get_holiday_from_time( std::time_t time, bool force_refresh ) cached_holiday = holiday::none; return cached_holiday; } + +int bucket_index_from_weight_list( const std::vector &weights ) +{ + int total_weight = std::accumulate( weights.begin(), weights.end(), int( 0 ) ); + if( total_weight < 1 ) { + return 0; + } + const int roll = rng( 0, total_weight - 1 ); + int index = 0; + int accum = 0; + for( int w : weights ) { + accum += w; + if( accum > roll ) { + break; + } + index++; + } + return index; +} diff --git a/src/cata_utility.h b/src/cata_utility.h index 2c8be139e35a4..c0db4e148cbc5 100644 --- a/src/cata_utility.h +++ b/src/cata_utility.h @@ -645,4 +645,11 @@ std::unordered_set &operator<<( std::unordered_set &lhv, std::unordered_se */ holiday get_holiday_from_time( std::time_t time = 0, bool force_refresh = false ); +/** + * Returns a random (weighted) bucket index from a list of weights + * @param weights vector with a list of int weights + * @return random bucket index + */ +int bucket_index_from_weight_list( const std::vector &weights ); + #endif // CATA_SRC_CATA_UTILITY_H diff --git a/src/creature.cpp b/src/creature.cpp index b856f12574321..83e7bb7dcec14 100644 --- a/src/creature.cpp +++ b/src/creature.cpp @@ -1210,7 +1210,9 @@ void Creature::deal_damage_handle_type( const effect_source &source, const damag case damage_type::ELECTRIC: // Electrical damage adds a major speed/dex debuff - add_effect( source, effect_zapped, 1_turns * std::max( adjusted_damage, 2 ) ); + if( x_in_y( std::max( adjusted_damage, 2 ), 5 ) ) { + add_effect( source, effect_zapped, 1_turns * std::max( adjusted_damage, 2 ) ); + } break; case damage_type::ACID: diff --git a/src/field_type.cpp b/src/field_type.cpp index 59cd2932ec5f0..a8f46c96c2123 100644 --- a/src/field_type.cpp +++ b/src/field_type.cpp @@ -22,6 +22,7 @@ const field_type_str_id fd_cold_air3( "fd_cold_air3" ); const field_type_str_id fd_cold_air4( "fd_cold_air4" ); const field_type_str_id fd_dazzling( "fd_dazzling" ); const field_type_str_id fd_electricity( "fd_electricity" ); +const field_type_str_id fd_electricity_unlit( "fd_electricity_unlit" ); const field_type_str_id fd_extinguisher( "fd_extinguisher" ); const field_type_str_id fd_fatigue( "fd_fatigue" ); const field_type_str_id fd_fire( "fd_fire" ); diff --git a/src/field_type.h b/src/field_type.h index d36437bb3277b..ee829a38de8c1 100644 --- a/src/field_type.h +++ b/src/field_type.h @@ -133,6 +133,7 @@ extern const field_type_str_id fd_gas_vent; extern const field_type_str_id fd_fire_vent; extern const field_type_str_id fd_flame_burst; extern const field_type_str_id fd_electricity; +extern const field_type_str_id fd_electricity_unlit; extern const field_type_str_id fd_fatigue; extern const field_type_str_id fd_push_items; extern const field_type_str_id fd_shock_vent; diff --git a/src/map.cpp b/src/map.cpp index 4a6d37db8df9b..d5b7410383f89 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -5466,7 +5466,11 @@ bool map::add_field( const tripoint &p, const field_type_id &type_id, int intens return false; } - const field_type &fd_type = *type_id; + // Hacky way to force electricity fields to become unlit electricity fields + const field_type_id &converted_type_id = ( type_id == fd_electricity || + type_id == fd_electricity_unlit ) ? get_applicable_electricity_field( p ) : type_id; + const field_type &fd_type = *converted_type_id; + intensity = std::min( intensity, fd_type.get_max_intensity() ); if( intensity <= 0 ) { return false; @@ -5481,7 +5485,7 @@ bool map::add_field( const tripoint &p, const field_type_id &type_id, int intens current_submap->is_uniform = false; invalidate_max_populated_zlev( p.z ); - if( current_submap->get_field( l ).add_field( type_id, intensity, age ) ) { + if( current_submap->get_field( l ).add_field( converted_type_id, intensity, age ) ) { //Only adding it to the count if it doesn't exist. if( !current_submap->field_count++ ) { get_cache( p.z ).field_cache.set( static_cast( p.x / SEEX + ( ( diff --git a/src/map.h b/src/map.h index 20ac122f10cdf..33c97c3815359 100644 --- a/src/map.h +++ b/src/map.h @@ -1481,6 +1481,11 @@ class map */ void remove_field( const tripoint &p, const field_type_id &field_to_remove ); + /** + * Get applicable fd_electricity field type for a given point + */ + const field_type_str_id &get_applicable_electricity_field( const tripoint &p ); + private: // Is called when field intensity is changed. // Invalidates relevan map caches, such as transparency cache. diff --git a/src/map_field.cpp b/src/map_field.cpp index 00111ad9d1d2a..ff0fd4829152b 100644 --- a/src/map_field.cpp +++ b/src/map_field.cpp @@ -631,51 +631,94 @@ void field_processor_fd_flame_burst( const tripoint &p, field_entry &cur, field_ static void field_processor_fd_electricity( const tripoint &p, field_entry &cur, field_proc_data &pd ) { - // 4 in 5 chance to spread - if( !one_in( 5 ) ) { - std::vector valid; - // We're grounded - if( pd.here.impassable( p ) && cur.get_field_intensity() > 1 ) { - int tries = 0; - tripoint pnt; - pnt.z = p.z; - while( tries < 10 && cur.get_field_age() < 5_minutes && cur.get_field_intensity() > 1 ) { - pnt.x = p.x + rng( -1, 1 ); - pnt.y = p.y + rng( -1, 1 ); - if( pd.here.passable( pnt ) ) { - pd.here.add_field( pnt, fd_electricity, 1, cur.get_field_age() + 1_turns ); - cur.set_field_intensity( cur.get_field_intensity() - 1 ); - tries = 0; - } else { - tries++; - } + // Higher chance of spreading for intense fields + int current_intensity = cur.get_field_intensity(); + if( one_in( current_intensity * 2 ) ) { + return; + } + + const int spread_intensity_cap = std::max( current_intensity / 2, 3 ); + + std::vector grounded_tiles; + std::vector tiles_with_creatures; + std::vector other_tiles; + + bool valid_candidates = false; + for( const tripoint &dst : points_in_radius( p, 1 ) ) { + // Skip tiles with intense fields + auto &field_type = pd.here.get_applicable_electricity_field( dst ); + if( field_entry *field = pd.here.get_field( dst, field_type ) ) { + if( field->get_field_intensity() >= spread_intensity_cap ) { + continue; } - // We're not grounded; attempt to ground + } + + if( pd.here.impassable( dst ) ) { + grounded_tiles.push_back( dst ); } else { - for( const tripoint &dst : points_in_radius( p, 1 ) ) { - // Grounded tiles first - if( pd.here.impassable( dst ) ) { - valid.push_back( dst ); - } - } - // Spread to adjacent space, then - if( valid.empty() ) { - tripoint dst( p + point( rng( -1, 1 ), rng( -1, 1 ) ) ); - field_entry *elec = pd.here.get_field( dst, fd_electricity ); - if( pd.here.passable( dst ) && elec != nullptr && - elec->get_field_intensity() < 3 ) { - pd.here.mod_field_intensity( dst, fd_electricity, 1 ); - cur.set_field_intensity( cur.get_field_intensity() - 1 ); - } else if( pd.here.passable( dst ) ) { - pd.here.add_field( dst, fd_electricity, 1, cur.get_field_age() + 1_turns ); - } - cur.set_field_intensity( cur.get_field_intensity() - 1 ); + if( get_creature_tracker().creature_at( dst ) ) { + tiles_with_creatures.push_back( dst ); + } else { + other_tiles.push_back( dst ); } - while( !valid.empty() && cur.get_field_intensity() > 1 ) { - const tripoint target = random_entry_removed( valid ); - pd.here.add_field( target, fd_electricity, 1, cur.get_field_age() + 1_turns ); - cur.set_field_intensity( cur.get_field_intensity() - 1 ); + } + valid_candidates = true; + } + + if( !valid_candidates ) { + return; + } + + int grounded_weight = pd.here.impassable( p ) ? 2 : 6; + int creature_weight = pd.here.impassable( p ) ? 8 : 6; + int other_weight = pd.here.impassable( p ) ? 0 : 1; + + std::vector &target_vector = grounded_tiles; + while( current_intensity > 0 ) { + const int vector_choice = bucket_index_from_weight_list( std::vector( { + grounded_tiles.empty() ? 0 : grounded_weight, + tiles_with_creatures.empty() ? 0 : creature_weight, + other_tiles.empty() ? 0 : other_weight + } ) ); + + switch( vector_choice ) { + default: + case 0: + target_vector = grounded_tiles; + break; + case 1: + target_vector = tiles_with_creatures; + break; + case 2: + target_vector = other_tiles; + break; + } + + if( target_vector.empty() ) { + return; + } + + int vector_index = rng( 0, target_vector.size() - 1 ); + tripoint &target_point = target_vector[vector_index]; + + auto &field_type = pd.here.get_applicable_electricity_field( target_point ); + + // Intensify target field if it exists, create a new one otherwise + if( field_entry *target_field = pd.here.get_field( target_point, field_type ) ) { + int target_field_intensity = target_field->get_field_intensity(); + target_field->set_field_intensity( ++target_field_intensity ); + if( target_field_intensity >= spread_intensity_cap ) { + target_vector.erase( target_vector.begin() + vector_index ); } + } else { + pd.here.add_field( target_point, field_type, 1, cur.get_field_age() + 1_turns ); + } + + cur.set_field_intensity( --current_intensity ); + + if( one_in( current_intensity * 2 ) ) { + // Weaker fields have a harder time spreading + break; } } } @@ -1621,7 +1664,7 @@ void map::player_in_field( Character &you ) int total_damage = 0; for( const bodypart_id &bp : you.get_all_body_parts( get_body_part_flags::only_main ) ) { - const int dmg = rng( 1, cur.get_field_intensity() ); + const int dmg = rng( 1, std::max( cur.get_field_intensity(), 4 ) ); total_damage += you.deal_damage( nullptr, bp, damage_instance( damage_type::ELECTRIC, dmg ) ).total_damage(); } @@ -2238,7 +2281,7 @@ std::vector map_field_processing::processors_for_type( const if( ft.id == fd_flame_burst ) { processors.push_back( &field_processor_fd_flame_burst ); } - if( ft.id == fd_electricity ) { + if( ft.id == fd_electricity || ft.id == fd_electricity_unlit ) { processors.push_back( &field_processor_fd_electricity ); } if( ft.id == fd_push_items ) { @@ -2262,3 +2305,8 @@ std::vector map_field_processing::processors_for_type( const return processors; } + +const field_type_str_id &map::get_applicable_electricity_field( const tripoint &p ) +{ + return is_transparent( p ) ? fd_electricity : fd_electricity_unlit; +} diff --git a/src/monattack.cpp b/src/monattack.cpp index 39bcebef4af1d..92546b8ae9dd6 100644 --- a/src/monattack.cpp +++ b/src/monattack.cpp @@ -765,10 +765,11 @@ bool mattack::shockstorm( monster *z ) here.add_field( i, fd_electricity, rng( 1, 3 ) ); } } - // 5x5 cloud of electricity at the square hit - for( const auto &dest : here.points_in_radius( tarp, 2 ) ) { - if( !one_in( 4 ) ) { - here.add_field( dest, fd_electricity, rng( 1, 3 ) ); + + // 3x3 cloud of electricity at the square hit + for( const auto &dest : here.points_in_radius( tarp, 1 ) ) { + if( one_in( 3 ) ) { + here.add_field( dest, fd_electricity, rng( 4, 10 ) ); } } From 80f376fff30d459b2fcce32e6db5c8ccc8c7bcf9 Mon Sep 17 00:00:00 2001 From: NetSysFire <59517351+NetSysFire@users.noreply.github.com> Date: Wed, 15 Dec 2021 16:17:44 +0100 Subject: [PATCH 18/39] Cutting quality overhaul (#53385) * first batch of cutting quality modifications * The rest of all the non-mod stuff * corn kernels are actually easy to make * Modify tool cutting qualities * add missing comma * Actually add CUT 1 to sharp_rock * All the mod tool stuff * Amend all the mod recipes, too * survival 3 -> 2 for stone chopper as a stone adze, which is arguably more difficult, is already on that level * CUT 1 should suffice for an extremely simple bow * You can already make pointy sticks with CUT 1, so crude wooden arrows will work, too * Lower needed cutting quality to 1 for the frame loom and shed stick as these items are simple enough to carve * Please the linter * Lint the json for the store houses since the regex replace made the lines too long * Please the linter, for real this time * Attempt to fix a part of the test by applying the suggestion from it * specify CUT 2 in the recipe test * amend the cutting quality in iteminfo_test.cpp, too --- data/json/construction.json | 26 +- data/json/items/fake.json | 4 +- data/json/items/melee/fake.json | 4 +- data/json/items/melee/knives_kitchen.json | 16 +- data/json/items/melee/swords_and_blades.json | 36 +-- data/json/items/resources/misc.json | 2 +- data/json/items/tool/cooking.json | 4 +- data/json/items/tool/knives.json | 12 +- data/json/items/tool/landscaping.json | 2 +- data/json/items/tool/med.json | 2 +- data/json/items/tool/stationary.json | 2 +- data/json/items/tool/tailoring.json | 2 +- data/json/items/tool/woodworking.json | 8 +- data/json/items/tool/workshop.json | 6 +- data/json/recipes/ammo/40x46mm.json | 24 +- data/json/recipes/ammo/40x53mm.json | 12 +- data/json/recipes/ammo/cannon.json | 2 +- data/json/recipes/ammo/pistol.json | 4 +- data/json/recipes/ammo/rifle.json | 4 +- data/json/recipes/ammo/shot.json | 8 +- data/json/recipes/armor/arms.json | 6 +- data/json/recipes/armor/feet.json | 8 +- data/json/recipes/armor/hands.json | 10 +- data/json/recipes/armor/head.json | 12 +- data/json/recipes/armor/legs.json | 6 +- data/json/recipes/armor/other.json | 2 +- data/json/recipes/armor/pets_dog.json | 6 +- data/json/recipes/armor/pets_horse.json | 4 +- data/json/recipes/armor/storage.json | 12 +- data/json/recipes/armor/suit.json | 4 +- data/json/recipes/armor/torso.json | 38 +-- .../recipe_modular_field_common.json | 2 +- .../version_1/recipe_modular_field_wad.json | 44 +-- .../version_1/recipe_primitive_field.json | 4 +- .../recipe_modular_shelter_wad.json | 10 +- .../recipe_modular_shelter_1_wad.json | 8 +- .../recipe_modular_canteen_common.json | 4 +- .../version_1/recipe_modular_canteen_wad.json | 14 +- .../recipe_modular_saltworks_wad.json | 11 +- .../recipe_modular_storehouse_wad.json | 16 +- .../recipe_modular_workshop_wad.json | 19 +- data/json/recipes/chem/chemicals.json | 2 +- data/json/recipes/chem/fuel.json | 2 +- data/json/recipes/chem/mutagens.json | 2 +- data/json/recipes/electronics/parts.json | 2 +- data/json/recipes/food/brewing.json | 4 +- data/json/recipes/food/canned.json | 84 +++--- data/json/recipes/food/casseroles.json | 4 +- data/json/recipes/food/corn.json | 2 +- data/json/recipes/food/offal_dishes.json | 28 +- data/json/recipes/food/pasta.json | 6 +- data/json/recipes/food/vegetable_dishes.json | 2 +- data/json/recipes/other/cords_and_ropes.json | 4 +- data/json/recipes/other/materials.json | 32 +-- data/json/recipes/other/medical.json | 12 +- data/json/recipes/other/parts.json | 6 +- .../recipes/other/parts_construction.json | 4 +- data/json/recipes/other/vehicle.json | 6 +- data/json/recipes/practice/fabrication.json | 6 +- data/json/recipes/recipe_ammo.json | 50 ++-- data/json/recipes/recipe_deconstruction.json | 90 +++--- data/json/recipes/recipe_food.json | 260 +++++++++--------- .../json/recipes/recipe_medsandchemicals.json | 2 +- data/json/recipes/recipe_others.json | 64 ++--- data/json/recipes/recipe_traps.json | 2 +- data/json/recipes/recipe_vehicle.json | 2 +- data/json/recipes/recipes_holiday.json | 6 +- data/json/recipes/tools/containers.json | 24 +- data/json/recipes/tools/lights.json | 6 +- data/json/recipes/tools/tool.json | 22 +- data/json/recipes/tools/tools_electronic.json | 4 +- data/json/recipes/tools/tools_hand.json | 14 +- data/json/recipes/tools/tools_primitive.json | 16 +- data/json/recipes/weapon/bashing.json | 18 +- data/json/recipes/weapon/cutting.json | 2 +- data/json/recipes/weapon/explosive.json | 4 +- data/json/recipes/weapon/mods.json | 16 +- data/json/recipes/weapon/piercing.json | 20 +- data/json/recipes/weapon/ranged.json | 40 +-- data/json/requirements/butchery.json | 20 +- data/json/requirements/tailoring.json | 60 ++-- data/json/requirements/toolsets.json | 2 +- data/json/uncraft/armor.json | 4 +- data/json/uncraft/armor/pets_dog.json | 2 +- data/json/uncraft/armor/storage.json | 4 +- data/json/uncraft/armor/suit.json | 4 +- data/json/uncraft/generic.json | 26 +- data/json/uncraft/tools.json | 14 +- data/json/vehicleparts/vehicle_parts.json | 4 +- .../items/comestibles/bug_brew.json | 2 +- data/mods/Aftershock/items/tools.json | 4 +- data/mods/Aftershock/items/weapons.json | 2 +- .../recipes/comestible_recipes.json | 8 +- .../Aftershock/recipes/recipe_overrides.json | 8 +- data/mods/Aftershock/recipes/recipes.json | 2 +- data/mods/CRT_EXPANSION/items/crt_tools.json | 6 +- data/mods/Dark-Skies-Above/obsolete.json | 4 +- data/mods/DinoMod/recipes/pets_elephant.json | 4 +- data/mods/DinoMod/recipes/pets_ostrich.json | 4 +- .../recipes/recipes_grenade_propelled.json | 4 +- .../Generic_Guns/recipes/recipes_rifle.json | 4 +- .../mods/Magiclysm/items/enchanted_tools.json | 24 +- data/mods/Magiclysm/items/ethereal_items.json | 2 +- data/mods/Magiclysm/recipes/dragon_black.json | 2 +- data/mods/Magiclysm/recipes/tailoring.json | 2 +- data/mods/Magiclysm/recipes/weapons.json | 18 +- data/mods/TEST_DATA/basecamp.json | 6 +- data/mods/TEST_DATA/recipes.json | 2 +- tests/iteminfo_test.cpp | 2 +- tests/recipe_test.cpp | 4 +- 110 files changed, 777 insertions(+), 767 deletions(-) diff --git a/data/json/construction.json b/data/json/construction.json index 9b8e5215538ff..2c8b3c35c9267 100644 --- a/data/json/construction.json +++ b/data/json/construction.json @@ -148,7 +148,7 @@ "category": "CONSTRUCT", "required_skills": [ [ "fabrication", 2 ] ], "time": "30 m", - "qualities": [ [ { "id": "CUT", "level": 1 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ] ], "components": [ [ [ "2x4", 6 ], [ "stick", 6 ], [ "wood_panel", 1 ] ], [ [ "rope_makeshift_6", 2 ], [ "rope_6", 2 ] ] ], "pre_note": "Can be deconstructed without tools.", "pre_terrain": "t_door_frame", @@ -664,7 +664,7 @@ "category": "CONSTRUCT", "required_skills": [ [ "fabrication", 0 ], [ "survival", 1 ] ], "time": "20 m", - "qualities": [ [ { "id": "CUT", "level": 1 } ], [ { "id": "HAMMER", "level": 1 } ], [ { "id": "DIG", "level": 1 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 1 } ], [ { "id": "DIG", "level": 1 } ] ], "components": [ [ [ "stick", 4 ], [ "pointy_stick", 4 ] ] ], "pre_flags": "DIGGABLE", "pre_special": "check_empty", @@ -677,7 +677,7 @@ "category": "CONSTRUCT", "required_skills": [ [ "fabrication", 2 ], [ "survival", 2 ] ], "time": "50 m", - "qualities": [ [ { "id": "CUT", "level": 1 } ], [ { "id": "HAMMER", "level": 1 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 1 } ] ], "components": [ [ [ "stick", 10 ] ] ], "pre_terrain": "t_wattle_fence_posts", "post_terrain": "t_wattle_fence" @@ -690,7 +690,7 @@ "category": "CONSTRUCT", "required_skills": [ [ "fabrication", 3 ], [ "survival", 3 ] ], "time": "50 m", - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "HAMMER", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "HAMMER", "level": 1 } ], "components": [ [ [ "2x4", 5 ], [ "stick", 10 ] ], [ [ "material_quicklime", 4 ], [ "material_limestone", 4 ], [ "clay_lump", 4 ] ], @@ -709,7 +709,7 @@ "category": "CONSTRUCT", "required_skills": [ [ "fabrication", 3 ], [ "survival", 3 ] ], "time": "50 m", - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "HAMMER", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "HAMMER", "level": 1 } ], "components": [ [ [ "2x4", 5 ], [ "stick", 10 ] ], [ [ "material_quicklime", 4 ], [ "material_limestone", 4 ], [ "clay_lump", 4 ] ], @@ -728,7 +728,7 @@ "category": "CONSTRUCT", "required_skills": [ [ "fabrication", 3 ], [ "survival", 3 ] ], "time": "60 m", - "qualities": [ [ { "id": "CUT", "level": 1 } ], [ { "id": "HAMMER", "level": 1 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 1 } ] ], "components": [ [ [ "2x4", 5 ], [ "stick", 10 ] ], [ [ "material_quicklime", 8 ], [ "material_limestone", 8 ], [ "clay_lump", 8 ] ], @@ -746,7 +746,7 @@ "category": "REPAIR", "required_skills": [ [ "fabrication", 2 ], [ "survival", 2 ] ], "time": "30 m", - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "HAMMER", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "HAMMER", "level": 1 } ], "components": [ [ [ "2x4", 2 ], [ "stick", 4 ] ], [ [ "material_quicklime", 2 ], [ "material_limestone", 2 ], [ "clay_lump", 2 ] ], @@ -1429,7 +1429,7 @@ "category": "CONSTRUCT", "required_skills": [ [ "fabrication", 3 ], [ "survival", 7 ] ], "time": "360 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "2x4", 5 ], [ "stick", 10 ] ], [ [ "straw_pile", 60 ], [ "withered", 60 ] ], [ [ "cordage", 8, "LIST" ] ] ], "pre_special": "check_support", "post_terrain": "t_dirtfloor_thatchroof" @@ -2370,7 +2370,7 @@ "category": "FURN", "required_skills": [ [ "fabrication", 4 ] ], "time": "90 m", - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 1 } ], [ { "id": "CUT", "level": 1 } ] ], + "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 1 } ], [ { "id": "CUT", "level": 2 } ] ], "components": [ [ [ "2x4", 8 ] ], [ [ "wood_sheet", 1 ], [ "wood_panel", 2 ] ], [ [ "nail", 24 ] ] ], "pre_special": "check_empty", "post_terrain": "f_desk" @@ -3307,7 +3307,7 @@ "qualities": [ [ { "id": "DIG", "level": 1 } ], [ { "id": "HAMMER", "level": 2 } ], - [ { "id": "CUT", "level": 1 } ], + [ { "id": "CUT", "level": 2 } ], [ { "id": "SAW_W", "level": 1 } ] ], "components": [ [ [ "stick", 16 ], [ "2x4", 16 ] ], [ [ "rock", 8 ] ] ], @@ -3430,7 +3430,7 @@ "category": "FURN", "required_skills": [ [ "fabrication", 1 ], [ "survival", 3 ] ], "time": "45 m", - "qualities": [ [ { "id": "CUT", "level": 1 } ], [ { "id": "SAW_W", "level": 1 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "SAW_W", "level": 1 } ] ], "components": [ [ [ "stick_long", 6 ] ], [ [ "rope_natural_short", 1, "LIST" ], [ "cordage", 2, "LIST" ], [ "wire", 8 ] ], @@ -3920,7 +3920,7 @@ "category": "CONSTRUCT", "difficulty": 2, "time": "90m", - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "HAMMER", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "HAMMER", "level": 1 } ], "components": [ [ [ "stick", 6 ], [ "2x4", 3 ] ] ], "pre_terrain": "t_tree_pine", "post_terrain": "t_leanto" @@ -4088,7 +4088,7 @@ "category": "FURN", "required_skills": [ [ "survival", 1 ] ], "time": "10 m", - "qualities": [ [ { "id": "CUT", "level": 1 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ] ], "components": [ [ [ "log", 1 ] ] ], "pre_special": "check_empty", "post_terrain": "f_logstool" diff --git a/data/json/items/fake.json b/data/json/items/fake.json index 9a61dd659d775..ff48e4b2a1468 100644 --- a/data/json/items/fake.json +++ b/data/json/items/fake.json @@ -39,7 +39,7 @@ [ "WRENCH_FINE", 1 ], [ "SCREW", 1 ], [ "SCREW_FINE", 1 ], - [ "CUT", 1 ], + [ "CUT", 2 ], [ "PRY", 1 ], [ "PRYING_NAIL", 1 ], [ "BUTCHER", -55 ] @@ -62,7 +62,7 @@ "cutting": 8, "techniques": [ "PRECISE" ], "flags": [ "TRADER_AVOID", "NO_UNWIELD", "UNBREAKABLE_MELEE", "SPEAR" ], - "qualities": [ [ "CUT", 1 ], [ "CUT_FINE", 5 ], [ "BUTCHER", 14 ] ] + "qualities": [ [ "CUT", 2 ], [ "CUT_FINE", 5 ], [ "BUTCHER", 14 ] ] }, { "id": "fake_razor", diff --git a/data/json/items/melee/fake.json b/data/json/items/melee/fake.json index 8848886e5b6a7..290372768342d 100644 --- a/data/json/items/melee/fake.json +++ b/data/json/items/melee/fake.json @@ -13,7 +13,7 @@ "cutting": 16, "flags": [ "STAB", "NO_UNWIELD", "UNBREAKABLE_MELEE", "TRADER_AVOID" ], "weapon_category": [ "BIONIC_WEAPONRY", "CLAWS" ], - "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 12 ] ] + "qualities": [ [ "CUT", 2 ], [ "BUTCHER", 12 ] ] }, { "type": "GENERIC", @@ -31,6 +31,6 @@ "cutting": 28, "flags": [ "NO_UNWIELD", "UNBREAKABLE_MELEE", "TRADER_AVOID" ], "weapon_category": [ "BIONIC_WEAPONRY" ], - "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 22 ] ] + "qualities": [ [ "CUT", 2 ], [ "BUTCHER", 22 ] ] } ] diff --git a/data/json/items/melee/knives_kitchen.json b/data/json/items/melee/knives_kitchen.json index 5d3d485a94920..73fb39e8c56b1 100644 --- a/data/json/items/melee/knives_kitchen.json +++ b/data/json/items/melee/knives_kitchen.json @@ -24,7 +24,7 @@ "to_hit": { "grip": "weapon", "length": "short", "surface": "point", "balance": "neutral" }, "bashing": 2, "cutting": 10, - "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 25 ] ], + "qualities": [ [ "CUT", 2 ], [ "BUTCHER", 25 ] ], "flags": [ "STAB", "SHEATH_KNIFE" ], "weapon_category": [ "KNIVES" ] }, @@ -44,7 +44,7 @@ "to_hit": { "grip": "weapon", "length": "hand", "surface": "point", "balance": "neutral" }, "bashing": 2, "cutting": 7, - "qualities": [ [ "CUT", 1 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 15 ] ], + "qualities": [ [ "CUT", 2 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 15 ] ], "flags": [ "STAB", "SHEATH_KNIFE" ], "weapon_category": [ "KNIVES" ] }, @@ -65,7 +65,7 @@ "to_hit": { "grip": "weapon", "length": "hand", "surface": "point", "balance": "neutral" }, "bashing": 1, "cutting": 6, - "qualities": [ [ "CUT", 1 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 10 ] ], + "qualities": [ [ "CUT", 2 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 10 ] ], "flags": [ "STAB", "SHEATH_KNIFE" ] }, { @@ -85,7 +85,7 @@ "to_hit": { "grip": "weapon", "length": "short", "surface": "point", "balance": "neutral" }, "bashing": 1, "cutting": 10, - "qualities": [ [ "CUT", 1 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 10 ] ], + "qualities": [ [ "CUT", 2 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 10 ] ], "flags": [ "STAB", "SHEATH_KNIFE" ], "weapon_category": [ "KNIVES" ] }, @@ -106,7 +106,7 @@ "to_hit": { "grip": "weapon", "length": "short", "surface": "point", "balance": "neutral" }, "bashing": 1, "cutting": 8, - "qualities": [ [ "CUT", 1 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 22 ] ], + "qualities": [ [ "CUT", 2 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 22 ] ], "flags": [ "STAB", "SHEATH_KNIFE" ], "weapon_category": [ "KNIVES" ] }, @@ -127,7 +127,7 @@ "bashing": 4, "cutting": 6, "to_hit": { "grip": "weapon", "length": "hand", "surface": "any", "balance": "neutral" }, - "qualities": [ [ "CUT", 1 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 8 ] ], + "qualities": [ [ "CUT", 2 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 8 ] ], "flags": [ "SHEATH_KNIFE" ] }, { @@ -147,7 +147,7 @@ "to_hit": { "grip": "weapon", "length": "short", "surface": "line", "balance": "neutral" }, "bashing": 2, "cutting": 10, - "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 15 ] ], + "qualities": [ [ "CUT", 2 ], [ "BUTCHER", 15 ] ], "flags": [ "SHEATH_KNIFE" ] }, { @@ -167,7 +167,7 @@ "to_hit": { "grip": "weapon", "length": "short", "surface": "line", "balance": "uneven" }, "bashing": 2, "cutting": 12, - "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 25 ] ], + "qualities": [ [ "CUT", 2 ], [ "BUTCHER", 25 ] ], "flags": [ "SHEATH_KNIFE" ] } ] diff --git a/data/json/items/melee/swords_and_blades.json b/data/json/items/melee/swords_and_blades.json index 758e6b876c861..d8e190ecef5ea 100644 --- a/data/json/items/melee/swords_and_blades.json +++ b/data/json/items/melee/swords_and_blades.json @@ -93,7 +93,7 @@ "material": [ "steel", "plastic" ], "symbol": ";", "color": "dark_gray", - "qualities": [ [ "CUT", 1 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 14 ] ], + "qualities": [ [ "CUT", 2 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 14 ] ], "techniques": [ "RAPID" ], "flags": [ "STAB" ], "weapon_category": [ "KNIVES" ] @@ -114,7 +114,7 @@ "material": [ "steel", "plastic" ], "symbol": ";", "color": "light_gray", - "qualities": [ [ "CUT", 1 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 12 ] ], + "qualities": [ [ "CUT", 2 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 12 ] ], "flags": [ "STAB", "BELT_CLIP" ], "weapon_category": [ "KNIVES" ] }, @@ -143,7 +143,7 @@ }, "min_skills": [ [ "weapon", 2 ], [ "melee", 1 ] ], "techniques": [ "RAPID" ], - "qualities": [ [ "CUT", 1 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 19 ] ], + "qualities": [ [ "CUT", 2 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 19 ] ], "thrown_damage": [ { "damage_type": "stab", "amount": 14 } ], "flags": [ "STAB", "DURABLE_MELEE", "SHEATH_KNIFE", "NPC_THROWN" ], "weapon_category": [ "KNIVES" ] @@ -179,7 +179,7 @@ "material": [ "steel", "leather" ], "symbol": "/", "color": "dark_gray", - "qualities": [ [ "CUT", 1 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 30 ] ], + "qualities": [ [ "CUT", 2 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 30 ] ], "flags": [ "SHEATH_KNIFE" ], "weapon_category": [ "KNIVES" ] }, @@ -202,7 +202,7 @@ "symbol": ";", "color": "dark_gray", "techniques": [ "WBLOCK_1" ], - "qualities": [ [ "CUT", 1 ], [ "SAW_W", 1 ], [ "SAW_M", 1 ], [ "BUTCHER", 7 ] ], + "qualities": [ [ "CUT", 2 ], [ "SAW_W", 1 ], [ "SAW_M", 1 ], [ "BUTCHER", 7 ] ], "flags": [ "STAB", "SHEATH_SWORD" ], "weapon_category": [ "KNIVES" ] }, @@ -231,7 +231,7 @@ }, "min_skills": [ [ "weapon", 2 ], [ "melee", 1 ] ], "techniques": [ "RAPID", "WBLOCK_1" ], - "qualities": [ [ "CUT", 1 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 19 ] ], + "qualities": [ [ "CUT", 2 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 19 ] ], "thrown_damage": [ { "damage_type": "stab", "amount": 14 } ], "flags": [ "STAB", "DURABLE_MELEE", "SHEATH_KNIFE", "NO_CVD" ], "weapon_category": [ "KNIVES" ] @@ -252,7 +252,7 @@ "material": [ "steel", "plastic" ], "symbol": ";", "color": "red", - "qualities": [ [ "CUT", 1 ], [ "SAW_W", 1 ], [ "SAW_M", 1 ], [ "SCREW", 1 ], [ "BUTCHER", 8 ] ], + "qualities": [ [ "CUT", 2 ], [ "SAW_W", 1 ], [ "SAW_M", 1 ], [ "SCREW", 1 ], [ "BUTCHER", 8 ] ], "flags": [ "STAB" ] }, { @@ -273,7 +273,7 @@ "symbol": ";", "color": "dark_gray", "techniques": [ "WBLOCK_1" ], - "qualities": [ [ "CUT", 1 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 19 ] ], + "qualities": [ [ "CUT", 2 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 19 ] ], "flags": [ "DURABLE_MELEE", "STAB", "SHEATH_KNIFE" ], "weapon_category": [ "KNIVES" ] }, @@ -293,7 +293,7 @@ "material": [ "steel" ], "symbol": ";", "color": "dark_gray", - "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 11 ] ], + "qualities": [ [ "CUT", 2 ], [ "BUTCHER", 11 ] ], "flags": [ "STAB", "SHEATH_KNIFE" ], "weapon_category": [ "KNIVES" ] }, @@ -314,7 +314,7 @@ "cutting": 12, "to_hit": { "grip": "weapon", "length": "hand", "surface": "line", "balance": "good" }, "material": [ "bone" ], - "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 12 ] ], + "qualities": [ [ "CUT", 2 ], [ "BUTCHER", 12 ] ], "flags": [ "STAB", "SHEATH_KNIFE", "FRAGILE_MELEE" ], "weapon_category": [ "KNIVES" ] }, @@ -333,7 +333,7 @@ "material": [ "iron" ], "symbol": ";", "color": "dark_gray", - "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 15 ] ], + "qualities": [ [ "CUT", 2 ], [ "BUTCHER", 15 ] ], "flags": [ "STAB", "SHEATH_KNIFE" ], "weapon_category": [ "KNIVES" ] }, @@ -354,7 +354,7 @@ "material": [ "steel" ], "symbol": "/", "color": "light_gray", - "qualities": [ [ "CUT", 1 ], [ "BUTCHER", -27 ] ], + "qualities": [ [ "CUT", 2 ], [ "BUTCHER", -27 ] ], "techniques": [ "WBLOCK_1" ], "flags": [ "SHEATH_SWORD" ], "weapon_category": [ "BLADED_FARMING" ] @@ -377,7 +377,7 @@ "symbol": "/", "color": "dark_gray", "techniques": [ "WBLOCK_2" ], - "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 15 ] ], + "qualities": [ [ "CUT", 2 ], [ "BUTCHER", 15 ] ], "flags": [ "DURABLE_MELEE", "SHEATH_SWORD" ], "weapon_category": [ "BLADED_FARMING" ] }, @@ -397,7 +397,7 @@ "cutting": 15, "to_hit": { "grip": "weapon", "length": "short", "surface": "line", "balance": "good" }, "material": [ "steel" ], - "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 8 ], [ "SAW_W", 1 ], [ "DIG", 1 ], [ "PRY", 1 ] ], + "qualities": [ [ "CUT", 2 ], [ "BUTCHER", 8 ], [ "SAW_W", 1 ], [ "DIG", 1 ], [ "PRY", 1 ] ], "flags": [ "SHEATH_SWORD", "FRAGILE_MELEE" ], "weapon_category": [ "BLADED_FARMING" ] }, @@ -418,7 +418,7 @@ "symbol": "/", "color": "dark_gray", "techniques": [ "WBLOCK_2", "RAPID" ], - "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 8 ] ], + "qualities": [ [ "CUT", 2 ], [ "BUTCHER", 8 ] ], "flags": [ "DURABLE_MELEE", "SHEATH_SWORD" ], "weapon_category": [ "MEDIUM_SWORDS", "FENCING_WEAPONRY" ], "category": "weapons" @@ -440,7 +440,7 @@ "symbol": "/", "color": "dark_gray", "techniques": [ "WBLOCK_1", "RAPID" ], - "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 12 ] ], + "qualities": [ [ "CUT", 2 ], [ "BUTCHER", 12 ] ], "flags": [ "STAB", "DURABLE_MELEE", "SHEATH_SWORD" ], "weapon_category": [ "KNIVES" ], "category": "weapons" @@ -796,7 +796,7 @@ "symbol": "/", "color": "dark_gray", "techniques": [ "WBLOCK_2", "RAPID" ], - "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 10 ] ], + "qualities": [ [ "CUT", 2 ], [ "BUTCHER", 10 ] ], "flags": [ "DURABLE_MELEE", "SHEATH_SWORD" ], "weapon_category": [ "BLADED_FARMING" ] }, @@ -1629,7 +1629,7 @@ "flags": [ "STAB", "DURABLE_MELEE", "SHEATH_KNIFE" ], "weapon_category": [ "KNIVES" ], "price": 10000, - "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 14 ] ] + "qualities": [ [ "CUT", 2 ], [ "BUTCHER", 14 ] ] }, { "type": "GENERIC", diff --git a/data/json/items/resources/misc.json b/data/json/items/resources/misc.json index 607a748da3c51..c71b5daca8c02 100644 --- a/data/json/items/resources/misc.json +++ b/data/json/items/resources/misc.json @@ -147,7 +147,7 @@ "bashing": 5, "cutting": 3, "to_hit": -3, - "qualities": [ [ "BUTCHER", -50 ] ] + "qualities": [ [ "CUT", 1 ], [ "BUTCHER", -50 ] ] }, { "id": "sole_rubber", diff --git a/data/json/items/tool/cooking.json b/data/json/items/tool/cooking.json index 76f0c1e5ed8c7..2d20c56950e53 100644 --- a/data/json/items/tool/cooking.json +++ b/data/json/items/tool/cooking.json @@ -32,7 +32,7 @@ "//": "butcher knives and carving knives are between 30-40cm.", "price": 8000, "price_postapoc": 150, - "qualities": [ [ "CUT", 1 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 37 ] ] + "qualities": [ [ "CUT", 2 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 37 ] ] }, { "id": "butter_churn", @@ -107,7 +107,7 @@ "power_draw": 150000, "charges_per_use": 0, "revert_to": "carver_off", - "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 25 ] ], + "qualities": [ [ "CUT", 2 ], [ "BUTCHER", 25 ] ], "use_action": [ "CARVER_ON" ], "flags": [ "MESSY", "TRADER_AVOID", "NONCONDUCTIVE" ] }, diff --git a/data/json/items/tool/knives.json b/data/json/items/tool/knives.json index 5e804c9e7a46a..1495887de3df5 100644 --- a/data/json/items/tool/knives.json +++ b/data/json/items/tool/knives.json @@ -15,7 +15,7 @@ "material": [ "copper" ], "symbol": ";", "color": "brown", - "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 11 ] ], + "qualities": [ [ "CUT", 2 ], [ "BUTCHER", 11 ] ], "flags": [ "STAB", "SHEATH_KNIFE" ], "weapon_category": [ "KNIVES" ] }, @@ -35,7 +35,7 @@ "material": [ "steel", "plastic" ], "symbol": ";", "color": "yellow", - "qualities": [ [ "CUT", 1 ], [ "PRY", 1 ], [ "BUTCHER", 15 ] ], + "qualities": [ [ "CUT", 2 ], [ "PRY", 1 ], [ "BUTCHER", 15 ] ], "use_action": [ "CROWBAR" ], "flags": [ "SHEATH_KNIFE" ], "weapon_category": [ "KNIVES" ] @@ -74,7 +74,7 @@ "material": [ "steel", "plastic" ], "symbol": ";", "color": "brown", - "qualities": [ [ "CUT", 1 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 11 ] ], + "qualities": [ [ "CUT", 2 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 11 ] ], "flags": [ "STAB" ], "weapon_category": [ "KNIVES" ] }, @@ -94,7 +94,7 @@ "material": [ "wood", "stone" ], "symbol": ";", "color": "light_gray", - "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 11 ] ], + "qualities": [ [ "CUT", 2 ], [ "BUTCHER", 11 ] ], "flags": [ "STAB", "SHEATH_KNIFE" ], "weapon_category": [ "KNIVES" ] }, @@ -113,7 +113,7 @@ "material": [ "steel", "plastic" ], "symbol": ";", "color": "light_gray", - "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 8 ] ] + "qualities": [ [ "CUT", 2 ], [ "BUTCHER", 8 ] ] }, { "type": "TOOL", @@ -129,6 +129,6 @@ "bashing": 5, "cutting": 3, "to_hit": -3, - "qualities": [ [ "CUT", 1 ], [ "BUTCHER", -18 ] ] + "qualities": [ [ "CUT", 2 ], [ "BUTCHER", -18 ] ] } ] diff --git a/data/json/items/tool/landscaping.json b/data/json/items/tool/landscaping.json index 6426418a7b82d..9ba8a20538381 100644 --- a/data/json/items/tool/landscaping.json +++ b/data/json/items/tool/landscaping.json @@ -34,7 +34,7 @@ "material": [ "steel" ], "symbol": "/", "color": "dark_gray", - "qualities": [ [ "DIG", 1 ], [ "BUTCHER", -4 ], [ "CUT", 1 ] ] + "qualities": [ [ "DIG", 1 ], [ "BUTCHER", -4 ], [ "CUT", 2 ] ] }, { "id": "hoe", diff --git a/data/json/items/tool/med.json b/data/json/items/tool/med.json index e21ed30ef05ad..abd214d8406a1 100644 --- a/data/json/items/tool/med.json +++ b/data/json/items/tool/med.json @@ -109,7 +109,7 @@ "material": [ "steel" ], "symbol": ",", "color": "light_gray", - "qualities": [ [ "CUT", 1 ], [ "CUT_FINE", 3 ], [ "BUTCHER", 8 ] ], + "qualities": [ [ "CUT", 2 ], [ "CUT_FINE", 3 ], [ "BUTCHER", 8 ] ], "flags": [ "FRAGILE_MELEE" ] }, { diff --git a/data/json/items/tool/stationary.json b/data/json/items/tool/stationary.json index 83000c119126b..7500d6040dd8c 100644 --- a/data/json/items/tool/stationary.json +++ b/data/json/items/tool/stationary.json @@ -62,7 +62,7 @@ "material": [ "aluminum", "plastic" ], "symbol": ",", "color": "light_red", - "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 3 ] ], + "qualities": [ [ "CUT", 2 ], [ "BUTCHER", 3 ] ], "flags": [ "STAB", "BELT_CLIP", "SHEATH_KNIFE" ], "weapon_category": [ "SHIVS" ] }, diff --git a/data/json/items/tool/tailoring.json b/data/json/items/tool/tailoring.json index 9f0cdf1baa5ee..115ae3f6d3ed7 100644 --- a/data/json/items/tool/tailoring.json +++ b/data/json/items/tool/tailoring.json @@ -271,7 +271,7 @@ "ammo": [ "thread" ], "sub": "sewing_kit", "charges_per_use": 1, - "qualities": [ [ "SEW", 4 ], [ "SEW_CURVED", 1 ], [ "KNIT", 1 ], [ "LEATHER_AWL", 2 ], [ "CUT", 1 ] ], + "qualities": [ [ "SEW", 4 ], [ "SEW_CURVED", 1 ], [ "KNIT", 1 ], [ "LEATHER_AWL", 2 ], [ "CUT", 2 ] ], "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "thread": 400 } } ], "use_action": [ { diff --git a/data/json/items/tool/woodworking.json b/data/json/items/tool/woodworking.json index 2000366a57e0f..4c887676aec93 100644 --- a/data/json/items/tool/woodworking.json +++ b/data/json/items/tool/woodworking.json @@ -14,7 +14,7 @@ "material": [ "wood", "steel" ], "symbol": "/", "color": "light_gray", - "qualities": [ [ "AXE", 2 ], [ "BUTCHER", -36 ] ], + "qualities": [ [ "CUT", 1 ], [ "AXE", 2 ], [ "BUTCHER", -36 ] ], "techniques": [ "WBLOCK_1", "BRUTAL", "SWEEP" ], "flags": [ "NONCONDUCTIVE", "SHEATH_AXE" ], "weapon_category": [ "HOOKING_WEAPONRY" ] @@ -135,7 +135,7 @@ "material": [ "wood", "copper" ], "symbol": "/", "color": "brown", - "qualities": [ [ "AXE", 1 ], [ "BUTCHER", -44 ] ], + "qualities": [ [ "CUT", 1 ], [ "AXE", 1 ], [ "BUTCHER", -44 ] ], "techniques": [ "WBLOCK_1", "BRUTAL", "SWEEP" ], "flags": [ "NONCONDUCTIVE", "SHEATH_AXE" ], "weapon_category": [ "HOOKING_WEAPONRY" ] @@ -221,7 +221,7 @@ "material": [ "stone" ], "symbol": ";", "color": "light_gray", - "qualities": [ [ "BUTCHER", -50 ], [ "AXE", 1 ], [ "HAMMER", 1 ] ], + "qualities": [ [ "CUT", 1 ], [ "BUTCHER", -50 ], [ "AXE", 1 ], [ "HAMMER", 1 ] ], "flags": [ "SHEATH_AXE" ] }, { @@ -270,7 +270,7 @@ "material": [ "wood", "stone" ], "symbol": "/", "color": "light_gray", - "qualities": [ [ "AXE", 1 ], [ "BUTCHER", -70 ], [ "HAMMER", 1 ] ], + "qualities": [ [ "CUT", 1 ], [ "AXE", 1 ], [ "BUTCHER", -70 ], [ "HAMMER", 1 ] ], "flags": [ "BELT_CLIP", "SHEATH_AXE" ], "weapon_category": [ "HOOKING_WEAPONRY" ] }, diff --git a/data/json/items/tool/workshop.json b/data/json/items/tool/workshop.json index 53f3215383585..79ad243c21a05 100644 --- a/data/json/items/tool/workshop.json +++ b/data/json/items/tool/workshop.json @@ -640,7 +640,7 @@ "ammo": [ "tape" ], "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "tape": 200 } } ], "charges_per_use": 5, - "qualities": [ [ "CUT", 1 ], [ "CUT_FINE", 2 ], [ "AXE", 1 ], [ "SAW_W", 2 ], [ "BUTCHER", 7 ] ], + "qualities": [ [ "CUT", 2 ], [ "CUT_FINE", 2 ], [ "AXE", 1 ], [ "SAW_W", 2 ], [ "BUTCHER", 7 ] ], "use_action": [ { "type": "repair_item", @@ -688,7 +688,7 @@ "material": [ "steel" ], "symbol": ";", "color": "light_gray", - "qualities": [ [ "CUT", 1 ], [ "SAW_W", 1 ], [ "SAW_M", 1 ], [ "WRENCH", 1 ], [ "SCREW", 1 ], [ "SCREW_FINE", 1 ], [ "BUTCHER", 7 ] ], + "qualities": [ [ "CUT", 2 ], [ "SAW_W", 1 ], [ "SAW_M", 1 ], [ "WRENCH", 1 ], [ "SCREW", 1 ], [ "SCREW_FINE", 1 ], [ "BUTCHER", 7 ] ], "flags": [ "STAB", "SHEATH_KNIFE" ] }, { @@ -1246,7 +1246,7 @@ "material": [ "steel", "plastic" ], "symbol": ";", "color": "light_gray", - "qualities": [ [ "CUT", 1 ], [ "CUT_FINE", 2 ], [ "BUTCHER", 7 ] ], + "qualities": [ [ "CUT", 2 ], [ "CUT_FINE", 2 ], [ "BUTCHER", 7 ] ], "flags": [ "FRAGILE_MELEE" ] }, { diff --git a/data/json/recipes/ammo/40x46mm.json b/data/json/recipes/ammo/40x46mm.json index c6e064027ef14..279f0acd3a786 100644 --- a/data/json/recipes/ammo/40x46mm.json +++ b/data/json/recipes/ammo/40x46mm.json @@ -17,7 +17,7 @@ "using": [ [ "shot_forming", 1 ], [ "ammo_bullet", 8 ] ], "proficiencies": [ { "proficiency": "prof_handloading" } ], "tools": [ [ [ "press", -1 ] ], [ [ "swage", -1 ] ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "sheet_metal_small", 1 ] ], [ [ "paper", 1 ], [ "wax", 1 ] ], @@ -43,7 +43,7 @@ "using": [ [ "shot_forming", 1 ], [ "ammo_bullet", 8 ] ], "proficiencies": [ { "proficiency": "prof_handloading" } ], "tools": [ [ [ "press", -1 ] ], [ [ "swage", -1 ] ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "//": "186 mg gunpowder rounded to 2 100 mg 'pieces', same as factory M576 load.", "components": [ [ [ "sheet_metal_small", 1 ] ], @@ -104,7 +104,7 @@ "using": [ [ "bullet_forming", 1 ], [ "ammo_bullet", 8 ] ], "proficiencies": [ { "proficiency": "prof_handloading" } ], "tools": [ [ [ "press", -1 ] ], [ [ "swage", -1 ] ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "//": "186 mg gunpowder rounded to 2 100 mg 'pieces', same as factory M576 load.", "components": [ [ [ "sheet_metal_small", 1 ] ], @@ -131,7 +131,7 @@ "using": [ [ "bullet_forming", 1 ], [ "ammo_bullet", 8 ] ], "proficiencies": [ { "proficiency": "prof_handloading" } ], "tools": [ [ [ "press", -1 ] ], [ [ "swage", -1 ] ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "//": "186 mg gunpowder rounded to 2 100 mg 'pieces', same as factory M576 load.", "components": [ [ [ "sheet_metal_small", 1 ] ], @@ -156,7 +156,7 @@ "charges": 1, "reversible": true, "tools": [ [ [ "press", -1 ] ], [ [ "swage", -1 ] ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "//": "186 mg gunpowder rounded to 2 100 mg 'pieces', same as factory M576 load.", "proficiencies": [ { "proficiency": "prof_handloading" } ], "components": [ @@ -183,7 +183,7 @@ "charges": 1, "reversible": true, "tools": [ [ [ "press", -1 ] ], [ [ "swage", -1 ] ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "//": "186 mg gunpowder rounded to 2 100 mg 'pieces', same as factory M576 load.", "proficiencies": [ { "proficiency": "prof_handloading" } ], "components": [ @@ -212,7 +212,7 @@ "using": [ [ "shot_forming", 1 ], [ "ammo_bullet", 8 ] ], "proficiencies": [ { "proficiency": "prof_handloading" } ], "tools": [ [ [ "press", -1 ] ], [ [ "swage", -1 ] ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "sheet_metal_small", 1 ] ], [ [ "paper", 1 ], [ "wax", 1 ] ], @@ -238,7 +238,7 @@ "using": [ [ "shot_forming", 1 ], [ "ammo_bullet", 8 ] ], "proficiencies": [ { "proficiency": "prof_handloading" } ], "tools": [ [ [ "press", -1 ] ], [ [ "swage", -1 ] ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "sheet_metal_small", 1 ] ], [ [ "paper", 1 ], [ "wax", 1 ] ], @@ -264,7 +264,7 @@ "using": [ [ "bullet_forming", 1 ], [ "ammo_bullet", 8 ] ], "proficiencies": [ { "proficiency": "prof_handloading" } ], "tools": [ [ [ "press", -1 ] ], [ [ "swage", -1 ] ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "sheet_metal_small", 1 ] ], [ [ "paper", 1 ], [ "wax", 1 ] ], @@ -290,7 +290,7 @@ "using": [ [ "bullet_forming", 1 ], [ "ammo_bullet", 8 ] ], "proficiencies": [ { "proficiency": "prof_handloading" } ], "tools": [ [ [ "press", -1 ] ], [ [ "swage", -1 ] ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "sheet_metal_small", 1 ] ], [ [ "paper", 1 ], [ "wax", 1 ] ], @@ -314,7 +314,7 @@ "charges": 1, "reversible": true, "tools": [ [ [ "press", -1 ] ], [ [ "swage", -1 ] ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_handloading" } ], "components": [ [ [ "sheet_metal_small", 1 ] ], @@ -340,7 +340,7 @@ "charges": 1, "reversible": true, "tools": [ [ [ "press", -1 ] ], [ [ "swage", -1 ] ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_handloading" } ], "components": [ [ [ "sheet_metal_small", 1 ] ], diff --git a/data/json/recipes/ammo/40x53mm.json b/data/json/recipes/ammo/40x53mm.json index e03a7bc5438e3..165654c505b21 100644 --- a/data/json/recipes/ammo/40x53mm.json +++ b/data/json/recipes/ammo/40x53mm.json @@ -16,7 +16,7 @@ "using": [ [ "shot_forming", 12 ], [ "ammo_bullet", 126 ] ], "proficiencies": [ { "proficiency": "prof_handloading" } ], "tools": [ [ [ "press", -1 ] ], [ [ "swage", -1 ] ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "//": "11.5x the propellant and 11.5x the payload of 12 gauge 00 shot load. 13409 mg gunpowder rounded to 134 100 mg 'pieces'", "components": [ [ [ "sheet_metal_small", 1 ] ], @@ -43,7 +43,7 @@ "using": [ [ "bullet_forming", 12 ], [ "ammo_bullet", 115 ] ], "proficiencies": [ { "proficiency": "prof_handloading" } ], "tools": [ [ [ "press", -1 ] ], [ [ "swage", -1 ] ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "//": "11.5x the propellant and 11.5x the payload of 12 gauge slug load. 19366 mg gunpowder rounded to 194 100 mg 'pieces'", "components": [ [ [ "sheet_metal_small", 1 ] ], @@ -68,7 +68,7 @@ "charges": 1, "reversible": true, "tools": [ [ [ "press", -1 ] ], [ [ "swage", -1 ] ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "//": "11.5x the propellant and 11.5x the payload of 12 gauge flechette load. 8625 mg gunpowder rounded to 86 100 mg 'pieces'", "proficiencies": [ { "proficiency": "prof_handloading" } ], "components": [ @@ -97,7 +97,7 @@ "using": [ [ "shot_forming", 12 ], [ "ammo_bullet", 126 ] ], "proficiencies": [ { "proficiency": "prof_handloading" } ], "tools": [ [ [ "press", -1 ] ], [ [ "swage", -1 ] ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "sheet_metal_small", 1 ] ], [ [ "paper", 1 ], [ "wax", 1 ] ], @@ -123,7 +123,7 @@ "using": [ [ "bullet_forming", 12 ], [ "ammo_bullet", 115 ] ], "proficiencies": [ { "proficiency": "prof_handloading" } ], "tools": [ [ [ "press", -1 ] ], [ [ "swage", -1 ] ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "sheet_metal_small", 1 ] ], [ [ "paper", 1 ], [ "wax", 1 ] ], @@ -147,7 +147,7 @@ "charges": 1, "reversible": true, "tools": [ [ [ "press", -1 ] ], [ [ "swage", -1 ] ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_handloading" } ], "components": [ [ [ "sheet_metal_small", 1 ] ], diff --git a/data/json/recipes/ammo/cannon.json b/data/json/recipes/ammo/cannon.json index 3c1a7f42ec855..23df7887f152a 100644 --- a/data/json/recipes/ammo/cannon.json +++ b/data/json/recipes/ammo/cannon.json @@ -13,7 +13,7 @@ "autolearn": true, "charges": 1, "reversible": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "cannonball_4lb", 1 ] ], [ [ "rag", 1 ] ], [ [ "chem_black_powder", 3000 ] ], [ [ "fuse", 1 ] ] ], "//": "Powder load for round shot was roughly 1/4 to 1/3 the weight of the cannonball" } diff --git a/data/json/recipes/ammo/pistol.json b/data/json/recipes/ammo/pistol.json index 6f1669fb514b7..b123950136de0 100644 --- a/data/json/recipes/ammo/pistol.json +++ b/data/json/recipes/ammo/pistol.json @@ -356,7 +356,7 @@ "charges": 1, "reversible": true, "using": [ [ "ammo_bullet", 1 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_handloading" } ], "components": [ [ [ "chem_black_powder", 4 ] ], [ [ "smpistol_primer", 1 ] ], [ [ "paper", 1 ], [ "aluminum_foil", 1 ] ] ] }, @@ -375,7 +375,7 @@ "charges": 1, "reversible": true, "using": [ [ "ammo_bullet", 2 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_handloading" } ], "components": [ [ [ "chem_black_powder", 4 ] ], [ [ "lgpistol_primer", 1 ] ], [ [ "paper", 1 ], [ "aluminum_foil", 1 ] ] ] }, diff --git a/data/json/recipes/ammo/rifle.json b/data/json/recipes/ammo/rifle.json index 5507ed71d8990..f4abc186e8d84 100644 --- a/data/json/recipes/ammo/rifle.json +++ b/data/json/recipes/ammo/rifle.json @@ -14,7 +14,7 @@ "charges": 1, "reversible": true, "using": [ [ "ammo_bullet", 10 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_handloading" } ], "components": [ [ [ "chem_black_powder", 30 ] ], [ [ "paper", 1 ] ] ] }, @@ -33,7 +33,7 @@ "charges": 1, "reversible": true, "using": [ [ "ammo_bullet", 10 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_handloading" } ], "components": [ [ [ "chem_black_powder", 30 ] ], [ [ "paper", 1 ] ] ] }, diff --git a/data/json/recipes/ammo/shot.json b/data/json/recipes/ammo/shot.json index 81f5a7e544f77..ea36fb9a54a25 100644 --- a/data/json/recipes/ammo/shot.json +++ b/data/json/recipes/ammo/shot.json @@ -398,7 +398,7 @@ "reversible": true, "using": [ [ "ammo_bullet", 8 ] ], "proficiencies": [ { "proficiency": "prof_handloading" } ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "chem_black_powder", 15 ] ], [ [ "shotgun_primer", 1 ] ], [ [ "paper", 1 ], [ "aluminum_foil", 1 ] ] ] }, { @@ -417,7 +417,7 @@ "reversible": true, "using": [ [ "ammo_bullet", 16 ] ], "proficiencies": [ { "proficiency": "prof_handloading" } ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "chem_black_powder", 15 ] ], [ [ "shotgun_primer", 1 ] ], [ [ "paper", 1 ], [ "aluminum_foil", 1 ] ] ] }, { @@ -436,7 +436,7 @@ "reversible": true, "using": [ [ "ammo_bullet", 16 ] ], "proficiencies": [ { "proficiency": "prof_handloading" } ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "chem_black_powder", 12 ] ], [ [ "magnesium", 4 ] ], @@ -460,7 +460,7 @@ "reversible": true, "using": [ [ "ammo_bullet", 8 ] ], "proficiencies": [ { "proficiency": "prof_handloading" } ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "chem_black_powder", 15 ] ], [ [ "shotgun_primer", 1 ] ], [ [ "paper", 1 ], [ "aluminum_foil", 1 ] ] ] } ] diff --git a/data/json/recipes/armor/arms.json b/data/json/recipes/armor/arms.json index e0d47c7d2a8c3..16b5eabcb05a3 100644 --- a/data/json/recipes/armor/arms.json +++ b/data/json/recipes/armor/arms.json @@ -11,7 +11,7 @@ "autolearn": true, "reversible": true, "using": [ [ "cordage_short", 2 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "2x4", 1 ] ], [ [ "rag", 1 ] ] ] }, { @@ -258,7 +258,7 @@ "book_learn": [ [ "dieselpunk_tailor", 2 ] ], "using": [ [ "cordage", 3 ] ], "proficiencies": [ { "proficiency": "prof_closures" }, { "proficiency": "prof_leatherworking_basic" } ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "LEATHER_AWL", "level": 1 }, { "id": "SEW_CURVED", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "LEATHER_AWL", "level": 1 }, { "id": "SEW_CURVED", "level": 1 } ], "components": [ [ [ "rubber_tire_chunk", 8 ] ] ] }, { @@ -269,7 +269,7 @@ "book_learn": [ [ "dieselpunk_tailor", 2 ] ], "using": [ [ "cordage", 3 ] ], "proficiencies": [ { "proficiency": "prof_closures" }, { "proficiency": "prof_leatherworking_basic" } ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "LEATHER_AWL", "level": 1 }, { "id": "SEW_CURVED", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "LEATHER_AWL", "level": 1 }, { "id": "SEW_CURVED", "level": 1 } ], "components": [ [ [ "rubber_tire_chunk", 10 ] ] ] }, { diff --git a/data/json/recipes/armor/feet.json b/data/json/recipes/armor/feet.json index e387c7cd9fdd6..da4b447c033c7 100644 --- a/data/json/recipes/armor/feet.json +++ b/data/json/recipes/armor/feet.json @@ -9,7 +9,7 @@ "difficulty": 2, "time": "1 h", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_basketweaving" } ], "components": [ [ [ "filament", 140, "LIST" ] ] ] }, @@ -536,7 +536,7 @@ "difficulty": 3, "time": "1 h 20 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_carving" } ], "components": [ [ [ "2x4", 2 ], [ "stick", 2 ] ] ] }, @@ -551,7 +551,7 @@ "time": "40 m", "book_learn": [ [ "tailor_japanese", 2 ] ], "proficiencies": [ { "proficiency": "prof_carving" } ], - "qualities": [ { "id": "SAW_W", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SAW_W", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "2x4", 1 ] ], [ [ "strap_small", 2, "LIST" ] ] ] }, { @@ -691,7 +691,7 @@ "autolearn": true, "proficiencies": [ { "proficiency": "prof_basketweaving" } ], "book_learn": [ [ "textbook_survival", 1 ], [ "pocket_survival", 1 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "birchbark", 3 ] ] ] }, { diff --git a/data/json/recipes/armor/hands.json b/data/json/recipes/armor/hands.json index 792c7bf4c96e7..35b41ebcdfac7 100644 --- a/data/json/recipes/armor/hands.json +++ b/data/json/recipes/armor/hands.json @@ -104,7 +104,7 @@ "skill_used": "tailor", "time": "16 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "gloves_leather", 1 ] ] ] }, { @@ -415,7 +415,7 @@ "skill_used": "tailor", "time": "30 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "gloves_survivor", 1 ] ] ] }, { @@ -423,7 +423,7 @@ "type": "recipe", "copy-from": "gloves_survivor_fingerless", "time": "40 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "xl_gloves_survivor", 1 ] ] ] }, { @@ -435,7 +435,7 @@ "skill_used": "tailor", "time": "30 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "gloves_lsurvivor", 1 ] ] ] }, { @@ -443,7 +443,7 @@ "type": "recipe", "copy-from": "gloves_lsurvivor_fingerless", "time": "40 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "xl_gloves_lsurvivor", 1 ] ] ] }, { diff --git a/data/json/recipes/armor/head.json b/data/json/recipes/armor/head.json index 61c12e6968b5d..9958bc0f68fe4 100644 --- a/data/json/recipes/armor/head.json +++ b/data/json/recipes/armor/head.json @@ -269,7 +269,7 @@ "difficulty": 1, "time": "2 h", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "cordage", 1, "LIST" ] ], [ [ "bottle_plastic", 1 ], [ "bottle_plastic_small", 2 ] ] ], "proficiencies": [ { "proficiency": "prof_plasticworking" } ] }, @@ -768,7 +768,7 @@ "autolearn": true, "book_learn": [ [ "recipe_melee", 2 ] ], "using": [ [ "cordage", 1 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "HAMMER", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "HAMMER", "level": 1 } ], "components": [ [ [ "scrap", 30 ] ] ], "proficiencies": [ { "proficiency": "prof_armorsmithing", "fail_multiplier": 1 } ] }, @@ -778,7 +778,7 @@ "copy-from": "helmet_scrap", "time": "1 h 40 m", "using": [ [ "cordage", 2 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "HAMMER", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "HAMMER", "level": 1 } ], "components": [ [ [ "scrap", 45 ] ] ] }, { @@ -1030,7 +1030,7 @@ "difficulty": 2, "time": "3 h", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "cordage_short", 2, "LIST" ], [ "filament", 100, "LIST" ] ], [ [ "2x4", 1 ], [ "stick", 1 ], [ "bone_sturdy", 1, "LIST" ] ] @@ -1287,7 +1287,7 @@ "time": "4 h", "autolearn": true, "using": [ [ "adhesive", 1 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "tools": [ [ [ "welder", 56 ], [ "welder_crude", 84 ], [ "soldering_iron", 84 ], [ "toolset", 84 ] ] ], "components": [ [ [ "mask_filter", 2 ], [ "mask_gas", 1 ], [ "mask_bunker", 1 ] ], @@ -1956,7 +1956,7 @@ "difficulty": 5, "time": "3 h", "autolearn": true, - "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 2 } ], "book_learn": [ [ "trappers_companion", 6 ], [ "survival_book", 4 ] ], "components": [ [ [ "stomach_sealed", 3 ], [ "large_stomach_sealed", 2 ] ], [ [ "filament", 12, "LIST" ] ] ], "proficiencies": [ { "proficiency": "prof_closures_waterproofing" }, { "proficiency": "prof_leatherworking_basic" } ] diff --git a/data/json/recipes/armor/legs.json b/data/json/recipes/armor/legs.json index f89ea2f028d45..43d3a05ceba41 100644 --- a/data/json/recipes/armor/legs.json +++ b/data/json/recipes/armor/legs.json @@ -11,7 +11,7 @@ "reversible": true, "autolearn": true, "using": [ [ "cordage", 2 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "2x4", 1 ] ], [ [ "rag", 4 ] ] ] }, { @@ -474,7 +474,7 @@ "book_learn": [ [ "dieselpunk_tailor", 2 ] ], "using": [ [ "strap_large", 3 ], [ "cordage", 3 ] ], "proficiencies": [ { "proficiency": "prof_closures" }, { "proficiency": "prof_leatherworking_basic" } ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "LEATHER_AWL", "level": 1 }, { "id": "SEW_CURVED", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "LEATHER_AWL", "level": 1 }, { "id": "SEW_CURVED", "level": 1 } ], "components": [ [ [ "rubber_tire_chunk", 8 ] ] ] }, { @@ -484,7 +484,7 @@ "time": "1 h", "using": [ [ "strap_large", 3 ], [ "cordage", 3 ] ], "proficiencies": [ { "proficiency": "prof_closures" }, { "proficiency": "prof_leatherworking_basic" } ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "LEATHER_AWL", "level": 1 }, { "id": "SEW_CURVED", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "LEATHER_AWL", "level": 1 }, { "id": "SEW_CURVED", "level": 1 } ], "components": [ [ [ "rubber_tire_chunk", 10 ] ] ] }, { diff --git a/data/json/recipes/armor/other.json b/data/json/recipes/armor/other.json index 1f9ba9144c94c..203b7fb1fe792 100644 --- a/data/json/recipes/armor/other.json +++ b/data/json/recipes/armor/other.json @@ -222,7 +222,7 @@ "difficulty": 4, "time": "60 m", "book_learn": [ [ "textbook_fabrication", 4 ], [ "welding_book", 4 ] ], - "qualities": [ { "id": "ANVIL", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "ANVIL", "level": 1 }, { "id": "CUT", "level": 2 } ], "using": [ [ "welding_standard", 1 ] ], "proficiencies": [ { "proficiency": "prof_plasticworking" } ], "tools": [ [ [ "surface_heat", 5, "LIST" ] ] ], diff --git a/data/json/recipes/armor/pets_dog.json b/data/json/recipes/armor/pets_dog.json index 15cb51a09dcec..88935e486176f 100644 --- a/data/json/recipes/armor/pets_dog.json +++ b/data/json/recipes/armor/pets_dog.json @@ -66,7 +66,7 @@ "difficulty": 1, "time": "4 h", "byproducts": [ [ "leather", 3 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "vest_leather", 1 ] ] ], "proficiencies": [ { "proficiency": "prof_leatherworking_basic", "time_multiplier": 2, "fail_multiplier": 1.2 } ] }, @@ -160,7 +160,7 @@ "time": "5 h", "autolearn": true, "using": [ [ "clasps", 3 ] ], - "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "duct_tape", 25 ] ], [ [ "coat_rain", 1 ] ] ], "proficiencies": [ { "proficiency": "prof_closures" } ] }, @@ -177,7 +177,7 @@ "time": "30 m", "autolearn": true, "using": [ [ "clasps", 3 ] ], - "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "duct_tape", 50 ] ], [ [ "bag_plastic", 10 ] ], [ [ "rag", 10 ] ] ], "proficiencies": [ { "proficiency": "prof_closures" } ] } diff --git a/data/json/recipes/armor/pets_horse.json b/data/json/recipes/armor/pets_horse.json index 42558a78337bb..bd6122a769323 100644 --- a/data/json/recipes/armor/pets_horse.json +++ b/data/json/recipes/armor/pets_horse.json @@ -203,7 +203,7 @@ "time": "2 h", "autolearn": true, "using": [ [ "clasps", 4 ] ], - "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "duct_tape", 175 ] ], [ [ "coat_rain", 7 ] ] ], "proficiencies": [ { "proficiency": "prof_closures_waterproofing" }, { "proficiency": "prof_closures" } ] }, @@ -220,7 +220,7 @@ "time": "3 h", "autolearn": true, "using": [ [ "clasps", 4 ] ], - "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "duct_tape", 350 ] ], [ [ "bag_plastic", 70 ] ], [ [ "rag", 70 ] ] ], "proficiencies": [ { "proficiency": "prof_closures_waterproofing" }, { "proficiency": "prof_closures" } ] }, diff --git a/data/json/recipes/armor/storage.json b/data/json/recipes/armor/storage.json index dd81075948d50..0724041b1a978 100644 --- a/data/json/recipes/armor/storage.json +++ b/data/json/recipes/armor/storage.json @@ -341,7 +341,7 @@ "time": "20 m", "autolearn": true, "proficiencies": [ { "proficiency": "prof_basketweaving" } ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "birchbark", 1 ] ], [ [ "cordage_short", 1, "LIST" ] ] ] }, { @@ -743,7 +743,7 @@ "time": "1 h", "autolearn": true, "reversible": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "cordage_superior", 6, "LIST" ] ] ] }, { @@ -778,7 +778,7 @@ "decomp_learn": 3, "autolearn": true, "book_learn": [ [ "recipe_arrows", 2 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_basketweaving" } ], "components": [ [ [ "birchbark", 3 ] ], [ [ "cordage_short", 2, "LIST" ] ] ] }, @@ -815,7 +815,7 @@ "decomp_learn": 4, "autolearn": true, "book_learn": [ [ "recipe_arrows", 3 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_basketweaving" } ], "components": [ [ [ "birchbark", 10 ] ], [ [ "strap_large", 1, "LIST" ] ] ] }, @@ -883,7 +883,7 @@ "time": "30 m", "autolearn": true, "proficiencies": [ { "proficiency": "prof_basketweaving" } ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "birchbark", 1 ] ], [ [ "cordage_short", 1, "LIST" ] ] ] }, { @@ -1236,7 +1236,7 @@ "time": "16 h", "autolearn": true, "proficiencies": [ { "proficiency": "prof_basketweaving" } ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "plant_cordage", 16, "LIST" ] ], [ [ "cordage", 2, "LIST" ] ] ] }, { diff --git a/data/json/recipes/armor/suit.json b/data/json/recipes/armor/suit.json index bcbcdd6dd30be..456ef209a0d53 100644 --- a/data/json/recipes/armor/suit.json +++ b/data/json/recipes/armor/suit.json @@ -430,7 +430,7 @@ "book_learn": [ [ "recipe_melee", 2 ] ], "using": [ [ "cordage", 4 ] ], "proficiencies": [ { "proficiency": "prof_closures" }, { "proficiency": "prof_articulation" } ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "HAMMER", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "HAMMER", "level": 1 } ], "components": [ [ [ "scrap", 170 ] ] ] }, { @@ -485,7 +485,7 @@ "book_learn": [ [ "dieselpunk_tailor", 2 ] ], "using": [ [ "cordage", 8 ] ], "proficiencies": [ { "proficiency": "prof_closures" }, { "proficiency": "prof_leatherworking_basic" } ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "LEATHER_AWL", "level": 1 }, { "id": "SEW_CURVED", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "LEATHER_AWL", "level": 1 }, { "id": "SEW_CURVED", "level": 1 } ], "components": [ [ [ "rubber_tire_chunk", 24 ] ] ] }, { diff --git a/data/json/recipes/armor/torso.json b/data/json/recipes/armor/torso.json index 3a3f05c3dfd7b..e831c1a9d7d33 100644 --- a/data/json/recipes/armor/torso.json +++ b/data/json/recipes/armor/torso.json @@ -107,7 +107,7 @@ "time": "2 h", "autolearn": true, "book_learn": [ [ "recipe_melee", 2 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "paper", 1200 ] ], [ [ "duct_tape", 150 ] ] ] }, { @@ -284,7 +284,7 @@ "difficulty": 5, "time": "10 h", "autolearn": true, - "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 2 } ], "book_learn": [ [ "trappers_companion", 6 ], [ "survival_book", 4 ] ], "components": [ [ [ "stomach_sealed", 16 ], [ "large_stomach_sealed", 10 ] ], [ [ "filament", 60, "LIST" ] ] ], "proficiencies": [ { "proficiency": "prof_closures_waterproofing" }, { "proficiency": "prof_leatherworking_basic" } ] @@ -315,7 +315,7 @@ "time": "8 d", "book_learn": [ [ "tailor_japanese", 6 ] ], "proficiencies": [ { "proficiency": "prof_basketweaving" } ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "HAMMER", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "HAMMER", "level": 1 } ], "components": [ [ [ "straw_pile", 40 ] ], [ [ "cordage", 3, "LIST" ] ] ] }, { @@ -360,7 +360,7 @@ "autolearn": true, "book_learn": [ [ "recipe_melee", 2 ] ], "using": [ [ "cordage", 1 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "HAMMER", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "HAMMER", "level": 1 } ], "components": [ [ [ "scrap", 80 ] ] ], "proficiencies": [ { "proficiency": "prof_closures", "time_multiplier": 1.25, "fail_multiplier": 1.15 }, @@ -373,7 +373,7 @@ "copy-from": "cuirass_scrap", "time": "3 h 20 m", "using": [ [ "cordage", 3 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "HAMMER", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "HAMMER", "level": 1 } ], "components": [ [ [ "scrap", 120 ] ] ] }, { @@ -390,7 +390,7 @@ "book_learn": [ [ "dieselpunk_tailor", 2 ] ], "using": [ [ "cordage", 3 ] ], "proficiencies": [ { "proficiency": "prof_closures" }, { "proficiency": "prof_leatherworking_basic" } ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "LEATHER_AWL", "level": 1 }, { "id": "SEW_CURVED", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "LEATHER_AWL", "level": 1 }, { "id": "SEW_CURVED", "level": 1 } ], "components": [ [ [ "rubber_tire_chunk", 8 ] ] ] }, { @@ -401,7 +401,7 @@ "book_learn": [ [ "dieselpunk_tailor", 2 ] ], "using": [ [ "cordage", 3 ] ], "proficiencies": [ { "proficiency": "prof_closures" }, { "proficiency": "prof_leatherworking_basic" } ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "LEATHER_AWL", "level": 1 }, { "id": "SEW_CURVED", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "LEATHER_AWL", "level": 1 }, { "id": "SEW_CURVED", "level": 1 } ], "components": [ [ [ "rubber_tire_chunk", 10 ] ] ] }, { @@ -710,7 +710,7 @@ "using": [ [ "sewing_standard", 30 ], [ "fastener_large", 1 ], [ "cordage", 4 ] ], "qualities": [ { "id": "HAMMER", "level": 2 }, - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "LEATHER_AWL", "level": 1 }, { "id": "SEW_CURVED", "level": 1 } ], @@ -932,7 +932,7 @@ "autolearn": true, "proficiencies": [ { "proficiency": "prof_weaving" } ], "tools": [ [ [ "loom_frame", -1 ] ], [ [ "shed_stick", -1 ] ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "grass_yarn", 5 ] ] ] }, { @@ -1046,7 +1046,7 @@ "time": "6 m", "autolearn": true, "byproducts": [ [ "fur", 6 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "flags": [ "NO_RESIZE" ], "components": [ [ [ "duster_fur", 1 ] ] ] }, @@ -1062,7 +1062,7 @@ "time": "6 m", "autolearn": true, "byproducts": [ [ "faux_fur", 6 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "flags": [ "NO_RESIZE" ], "components": [ [ [ "duster_faux_fur", 1 ] ] ] }, @@ -1099,7 +1099,7 @@ "time": "6 m", "autolearn": true, "byproducts": [ [ "leather", 4 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "flags": [ "NO_RESIZE" ], "components": [ [ [ "duster_leather", 1 ] ] ] }, @@ -1115,7 +1115,7 @@ "time": "6 m", "autolearn": true, "byproducts": [ [ "rag", 4 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "flags": [ "NO_RESIZE" ], "components": [ [ [ "duster_survivor", 1 ] ] ] }, @@ -1203,7 +1203,7 @@ "time": "6 m", "autolearn": true, "byproducts": [ [ "fur", 2 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "flags": [ "NO_RESIZE" ], "components": [ [ [ "trenchcoat_fur", 1 ] ] ] }, @@ -1219,7 +1219,7 @@ "time": "6 m", "autolearn": true, "byproducts": [ [ "faux_fur", 2 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "flags": [ "NO_RESIZE" ], "components": [ [ [ "trenchcoat_faux_fur", 1 ] ] ] }, @@ -1276,7 +1276,7 @@ "time": "6 m", "autolearn": true, "byproducts": [ [ "leather", 4 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "flags": [ "NO_RESIZE" ], "components": [ [ [ "trenchcoat_leather", 1 ] ] ] }, @@ -1354,7 +1354,7 @@ "time": "6 m", "autolearn": true, "byproducts": [ [ "rag", 4 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "flags": [ "NO_RESIZE" ], "components": [ [ [ "trenchcoat_survivor", 1 ] ] ] }, @@ -1518,7 +1518,7 @@ "difficulty": 3, "time": "2 h", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "rubber_tire_chunk", 16 ] ], [ [ "duct_tape", 16 ] ] ] }, { @@ -1771,7 +1771,7 @@ "time": "6 m", "autolearn": true, "byproducts": [ [ "leather", 5 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "flags": [ "NO_RESIZE" ], "components": [ [ [ "jacket_leather", 1 ] ] ] }, diff --git a/data/json/recipes/basecamps/base/recipe_modular_hub/version_1/recipe_modular_field_common.json b/data/json/recipes/basecamps/base/recipe_modular_hub/version_1/recipe_modular_field_common.json index 8de7afece93ad..0dd7be1f227b9 100644 --- a/data/json/recipes/basecamps/base/recipe_modular_hub/version_1/recipe_modular_field_common.json +++ b/data/json/recipes/basecamps/base/recipe_modular_hub/version_1/recipe_modular_field_common.json @@ -738,7 +738,7 @@ "skills": [ [ "survival", 3 ], [ "fabrication", 1 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "SAW_W" } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "SAW_W" } ] ], "components": [ [ [ "cordage_36", 2 ], diff --git a/data/json/recipes/basecamps/base/recipe_modular_hub/version_1/recipe_modular_field_wad.json b/data/json/recipes/basecamps/base/recipe_modular_hub/version_1/recipe_modular_field_wad.json index 2124af400ed55..c320d63a80a9b 100644 --- a/data/json/recipes/basecamps/base/recipe_modular_hub/version_1/recipe_modular_field_wad.json +++ b/data/json/recipes/basecamps/base/recipe_modular_hub/version_1/recipe_modular_field_wad.json @@ -18,7 +18,7 @@ "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 72 ], [ "stick", 96 ] ], [ [ "material_quicklime", 32 ], [ "material_limestone", 32 ], [ "clay_lump", 32 ] ], @@ -51,7 +51,7 @@ "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 75 ], [ "stick", 90 ] ], [ [ "material_quicklime", 28 ], [ "material_limestone", 28 ], [ "clay_lump", 28 ] ], @@ -85,7 +85,7 @@ "skills": [ [ "fabrication", 3 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 88 ] ], [ [ "nail", 24 ] ], @@ -117,7 +117,7 @@ "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 339 ] ], [ [ "nail", 48 ] ], @@ -153,7 +153,7 @@ "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 341 ] ], [ [ "nail", 48 ] ], @@ -188,7 +188,7 @@ "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 339 ] ], [ [ "nail", 48 ] ], @@ -224,7 +224,7 @@ "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 331 ] ], [ [ "nail", 48 ] ], @@ -259,7 +259,7 @@ "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 235 ] ], [ [ "nail", 24 ] ], @@ -294,7 +294,7 @@ "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 339 ] ], [ [ "nail", 48 ] ], @@ -329,7 +329,7 @@ "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 341 ] ], [ [ "nail", 48 ] ], @@ -364,7 +364,7 @@ "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 339 ] ], [ [ "nail", 48 ] ], @@ -399,7 +399,7 @@ "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 331 ] ], [ [ "nail", 48 ] ], @@ -434,7 +434,7 @@ "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 168 ] ], [ [ "nail", 24 ] ], @@ -469,7 +469,7 @@ "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 150 ], [ "stick", 120 ] ], [ [ "material_quicklime", 24 ], [ "material_limestone", 24 ], [ "clay_lump", 24 ] ], @@ -502,7 +502,7 @@ "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 176 ] ], [ [ "nail", 48 ] ], @@ -537,7 +537,7 @@ "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 158 ] ], [ [ "nail", 24 ] ], @@ -572,7 +572,7 @@ "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 308 ] ], [ [ "nail", 24 ] ], @@ -607,7 +607,7 @@ "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 176 ] ], [ [ "nail", 48 ] ], @@ -643,7 +643,7 @@ "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 158 ] ], [ [ "nail", 24 ] ], @@ -678,7 +678,7 @@ "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 168 ] ], [ [ "nail", 24 ] ], @@ -713,7 +713,7 @@ "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 150 ], [ "stick", 120 ] ], [ [ "material_quicklime", 24 ], [ "material_limestone", 24 ], [ "clay_lump", 24 ] ], @@ -751,7 +751,7 @@ "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 308 ] ], [ [ "nail", 24 ] ], diff --git a/data/json/recipes/basecamps/base/recipe_modular_hub/version_1/recipe_primitive_field.json b/data/json/recipes/basecamps/base/recipe_modular_hub/version_1/recipe_primitive_field.json index 3a22099001028..a5096130a422a 100644 --- a/data/json/recipes/basecamps/base/recipe_modular_hub/version_1/recipe_primitive_field.json +++ b/data/json/recipes/basecamps/base/recipe_modular_hub/version_1/recipe_primitive_field.json @@ -591,7 +591,7 @@ "qualities": [ [ { "id": "DIG", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ], - [ { "id": "CUT", "level": 1 } ], + [ { "id": "CUT", "level": 2 } ], [ { "id": "SAW_W", "level": 1 } ] ], "components": [ @@ -650,7 +650,7 @@ "qualities": [ [ { "id": "DIG", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ], - [ { "id": "CUT", "level": 1 } ], + [ { "id": "CUT", "level": 2 } ], [ { "id": "WRENCH", "level": 1 } ], [ { "id": "SAW_W", "level": 1 } ] ], diff --git a/data/json/recipes/basecamps/base/recipe_modular_shelter/recipe_modular_shelter_wad.json b/data/json/recipes/basecamps/base/recipe_modular_shelter/recipe_modular_shelter_wad.json index 28d72ba359c64..19ff51569c47d 100644 --- a/data/json/recipes/basecamps/base/recipe_modular_shelter/recipe_modular_shelter_wad.json +++ b/data/json/recipes/basecamps/base/recipe_modular_shelter/recipe_modular_shelter_wad.json @@ -18,7 +18,7 @@ "skills": [ [ "fabrication", 3 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 78 ] ], [ [ "nail", 24 ] ], @@ -50,7 +50,7 @@ "skills": [ [ "fabrication", 3 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 78 ] ], [ [ "nail", 24 ] ], @@ -82,7 +82,7 @@ "skills": [ [ "fabrication", 3 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 108 ] ], [ [ "nail", 24 ] ], @@ -114,7 +114,7 @@ "skills": [ [ "fabrication", 3 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 78 ] ], [ [ "nail", 24 ] ], @@ -146,7 +146,7 @@ "skills": [ [ "fabrication", 3 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 38 ] ], [ [ "nail", 24 ] ], diff --git a/data/json/recipes/basecamps/base/recipe_modular_shelter_1/recipe_modular_shelter_1_wad.json b/data/json/recipes/basecamps/base/recipe_modular_shelter_1/recipe_modular_shelter_1_wad.json index 9bb1dc6033bfe..62e58c9971e35 100644 --- a/data/json/recipes/basecamps/base/recipe_modular_shelter_1/recipe_modular_shelter_1_wad.json +++ b/data/json/recipes/basecamps/base/recipe_modular_shelter_1/recipe_modular_shelter_1_wad.json @@ -18,7 +18,7 @@ "skills": [ [ "fabrication", 3 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 58 ] ], [ [ "nail", 24 ] ], @@ -50,7 +50,7 @@ "skills": [ [ "fabrication", 3 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 58 ] ], [ [ "nail", 24 ] ], @@ -106,7 +106,7 @@ "skills": [ [ "fabrication", 3 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], "components": [ [ [ "2x4", 84 ] ], [ [ "nail", 64 ] ], @@ -139,7 +139,7 @@ "skills": [ [ "fabrication", 3 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 96 ] ], [ [ "nail", 48 ] ], diff --git a/data/json/recipes/basecamps/expansion/recipe_modular_canteen/version_1/recipe_modular_canteen_common.json b/data/json/recipes/basecamps/expansion/recipe_modular_canteen/version_1/recipe_modular_canteen_common.json index 5aa1b11f269cc..c227af149757c 100644 --- a/data/json/recipes/basecamps/expansion/recipe_modular_canteen/version_1/recipe_modular_canteen_common.json +++ b/data/json/recipes/basecamps/expansion/recipe_modular_canteen/version_1/recipe_modular_canteen_common.json @@ -155,7 +155,7 @@ "skills": [ [ "cooking", 2 ], [ "fabrication", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "DIG" } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W" } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "DIG" } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W" } ] ], "components": [ [ [ "2x4", 48 ], [ "stick", 48 ] ], [ [ "rock", 64 ] ] ] } } @@ -212,7 +212,7 @@ "skills": [ [ "fabrication", 1 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W" } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W" } ] ], "components": [ [ [ "2x4", 4 ] ], [ [ "wood_sheet", 1 ], [ "wood_panel", 1 ] ], diff --git a/data/json/recipes/basecamps/expansion/recipe_modular_canteen/version_1/recipe_modular_canteen_wad.json b/data/json/recipes/basecamps/expansion/recipe_modular_canteen/version_1/recipe_modular_canteen_wad.json index f6ae3a6b556da..200dc63d244ed 100644 --- a/data/json/recipes/basecamps/expansion/recipe_modular_canteen/version_1/recipe_modular_canteen_wad.json +++ b/data/json/recipes/basecamps/expansion/recipe_modular_canteen/version_1/recipe_modular_canteen_wad.json @@ -18,7 +18,7 @@ "skills": [ [ "fabrication", 3 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], "components": [ [ [ "2x4", 181 ] ], [ [ "nail", 244 ] ], @@ -51,7 +51,7 @@ "skills": [ [ "fabrication", 3 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], "components": [ [ [ "2x4", 259 ] ], [ [ "nail", 368 ] ], @@ -84,7 +84,7 @@ "skills": [ [ "fabrication", 3 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], "components": [ [ [ "2x4", 240 ] ], [ [ "nail", 448 ] ], @@ -116,7 +116,7 @@ "skills": [ [ "fabrication", 3 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], "components": [ [ [ "2x4", 360 ] ], [ [ "cattail_stalk", 128 ], [ "dogbane", 128 ], [ "pine_bough", 128 ], [ "straw_pile", 128 ] ], @@ -148,7 +148,7 @@ "skills": [ [ "fabrication", 3 ], [ "survival", 3 ] ], "inline": { "tools": [ [ [ "machete", -1 ], [ "makeshift_machete", -1 ], [ "scythe", -1 ], [ "sickle", -1 ], [ "survivor_machete", -1 ] ] ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], "components": [ [ [ "2x4", 188 ] ], [ [ "nail", 274 ] ], @@ -181,7 +181,7 @@ "skills": [ [ "fabrication", 3 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], "components": [ [ [ "2x4", 233 ] ], [ [ "nail", 370 ] ], @@ -213,7 +213,7 @@ "skills": [ [ "fabrication", 3 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], "components": [ [ [ "2x4", 235 ] ], [ [ "nail", 504 ] ], diff --git a/data/json/recipes/basecamps/expansion/recipe_modular_saltworks/version_1/recipe_modular_saltworks_wad.json b/data/json/recipes/basecamps/expansion/recipe_modular_saltworks/version_1/recipe_modular_saltworks_wad.json index 2014ad98f206e..993876a29f249 100644 --- a/data/json/recipes/basecamps/expansion/recipe_modular_saltworks/version_1/recipe_modular_saltworks_wad.json +++ b/data/json/recipes/basecamps/expansion/recipe_modular_saltworks/version_1/recipe_modular_saltworks_wad.json @@ -18,7 +18,7 @@ "skills": [ [ "fabrication", 3 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], "components": [ [ [ "2x4", 381 ] ], [ [ "cattail_stalk", 172 ], [ "dogbane", 172 ], [ "pine_bough", 172 ], [ "straw_pile", 172 ] ], @@ -51,7 +51,12 @@ "skills": [ [ "fabrication", 3 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ], [ { "id": "WRENCH" } ] ], + "qualities": [ + [ { "id": "CUT", "level": 2 } ], + [ { "id": "HAMMER", "level": 2 } ], + [ { "id": "SAW_W", "level": 2 } ], + [ { "id": "WRENCH" } ] + ], "components": [ [ [ "2x4", 168 ] ], [ [ "cattail_stalk", 104 ], [ "dogbane", 104 ], [ "pine_bough", 104 ], [ "straw_pile", 104 ] ], @@ -87,7 +92,7 @@ "inline": { "tools": [ ], "qualities": [ - [ { "id": "CUT" } ], + [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_M", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ], diff --git a/data/json/recipes/basecamps/expansion/recipe_modular_storehouse/version_1/recipe_modular_storehouse_wad.json b/data/json/recipes/basecamps/expansion/recipe_modular_storehouse/version_1/recipe_modular_storehouse_wad.json index 16cc560fe5dba..344d3c0488586 100644 --- a/data/json/recipes/basecamps/expansion/recipe_modular_storehouse/version_1/recipe_modular_storehouse_wad.json +++ b/data/json/recipes/basecamps/expansion/recipe_modular_storehouse/version_1/recipe_modular_storehouse_wad.json @@ -18,7 +18,7 @@ "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 216 ], [ "stick", 288 ] ], [ [ "material_quicklime", 96 ], [ "material_limestone", 96 ], [ "clay_lump", 96 ] ], @@ -51,7 +51,7 @@ "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 216 ], [ "stick", 288 ] ], [ [ "material_quicklime", 96 ], [ "material_limestone", 96 ], [ "clay_lump", 96 ] ], @@ -84,7 +84,7 @@ "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 77 ], [ "stick", 106 ] ], [ [ "material_quicklime", 36 ], [ "material_limestone", 36 ], [ "clay_lump", 36 ] ], @@ -117,7 +117,7 @@ "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 77 ], [ "stick", 106 ] ], [ [ "material_quicklime", 36 ], [ "material_limestone", 36 ], [ "clay_lump", 36 ] ], @@ -150,7 +150,7 @@ "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 77 ], [ "stick", 106 ] ], [ [ "material_quicklime", 36 ], [ "material_limestone", 36 ], [ "clay_lump", 36 ] ], @@ -183,7 +183,7 @@ "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 77 ], [ "stick", 106 ] ], [ [ "material_quicklime", 36 ], [ "material_limestone", 36 ], [ "clay_lump", 36 ] ], @@ -216,7 +216,7 @@ "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 278 ] ], [ [ "nail", 48 ] ], @@ -251,7 +251,7 @@ "skills": [ [ "fabrication", 4 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "2x4", 278 ] ], [ [ "nail", 48 ] ], diff --git a/data/json/recipes/basecamps/expansion/recipe_modular_workshop/version_1/recipe_modular_workshop_wad.json b/data/json/recipes/basecamps/expansion/recipe_modular_workshop/version_1/recipe_modular_workshop_wad.json index 11263a87575cb..1b83bb0e96c34 100644 --- a/data/json/recipes/basecamps/expansion/recipe_modular_workshop/version_1/recipe_modular_workshop_wad.json +++ b/data/json/recipes/basecamps/expansion/recipe_modular_workshop/version_1/recipe_modular_workshop_wad.json @@ -18,7 +18,7 @@ "skills": [ [ "fabrication", 3 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], "components": [ [ [ "2x4", 300 ] ], [ [ "cattail_stalk", 80 ], [ "dogbane", 80 ], [ "pine_bough", 80 ], [ "straw_pile", 80 ] ], @@ -50,7 +50,7 @@ "skills": [ [ "fabrication", 3 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], "components": [ [ [ "2x4", 185 ] ], [ [ "cattail_stalk", 52 ], [ "dogbane", 52 ], [ "pine_bough", 52 ], [ "straw_pile", 52 ] ], @@ -83,7 +83,12 @@ "skills": [ [ "fabrication", 3 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "DIG" } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], + "qualities": [ + [ { "id": "CUT", "level": 2 } ], + [ { "id": "DIG" } ], + [ { "id": "HAMMER", "level": 2 } ], + [ { "id": "SAW_W", "level": 2 } ] + ], "components": [ [ [ "2x4", 315 ] ], [ [ "cattail_stalk", 36 ], [ "dogbane", 36 ], [ "pine_bough", 36 ], [ "straw_pile", 36 ] ], @@ -117,7 +122,7 @@ "skills": [ [ "fabrication", 3 ], [ "survival", 3 ], [ "tailor", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], "components": [ [ [ "2x4", 172 ] ], [ [ "blanket", 1 ], [ "down_blanket", 1 ], [ "fur_blanket", 1 ] ], @@ -153,7 +158,7 @@ "inline": { "tools": [ [ [ "oxy_torch", 20 ], [ "toolset", 150 ], [ "welder", 100 ], [ "welder_crude", 150 ] ] ], "qualities": [ - [ { "id": "CUT" } ], + [ { "id": "CUT", "level": 2 } ], [ { "id": "GLARE", "level": 1 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] @@ -194,7 +199,7 @@ "skills": [ [ "fabrication", 3 ], [ "survival", 3 ] ], "inline": { "tools": [ [ [ "machete", -1 ], [ "makeshift_machete", -1 ], [ "scythe", -1 ], [ "sickle", -1 ], [ "survivor_machete", -1 ] ] ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], "components": [ [ [ "2x4", 260 ] ], [ [ "cattail_stalk", 96 ], [ "dogbane", 96 ], [ "pine_bough", 96 ], [ "straw_pile", 96 ] ], @@ -229,7 +234,7 @@ "skills": [ [ "fabrication", 3 ], [ "survival", 3 ] ], "inline": { "tools": [ ], - "qualities": [ [ { "id": "CUT" } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], + "qualities": [ [ { "id": "CUT", "level": 2 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], "components": [ [ [ "2x4", 452 ] ], [ [ "anvil", 1 ] ], diff --git a/data/json/recipes/chem/chemicals.json b/data/json/recipes/chem/chemicals.json index d2f077f825b4a..1516f002ca042 100644 --- a/data/json/recipes/chem/chemicals.json +++ b/data/json/recipes/chem/chemicals.json @@ -30,7 +30,7 @@ "batch_time_factors": [ 80, 2 ], "autolearn": true, "charges": 75, - "qualities": [ { "id": "CHEM", "level": 2 }, { "id": "CUT", "level": 1 }, { "id": "FINE_DISTILL", "level": 1 } ], + "qualities": [ { "id": "CHEM", "level": 2 }, { "id": "CUT", "level": 2 }, { "id": "FINE_DISTILL", "level": 1 } ], "tools": [ [ [ "surface_heat", 5, "LIST" ] ], [ [ "thermometer", -1 ] ] ], "components": [ [ [ "splinter", 3 ] ], diff --git a/data/json/recipes/chem/fuel.json b/data/json/recipes/chem/fuel.json index 1055b265b29b2..29de025f6cd98 100644 --- a/data/json/recipes/chem/fuel.json +++ b/data/json/recipes/chem/fuel.json @@ -87,7 +87,7 @@ "time": "30 m", "batch_time_factors": [ 80, 4 ], "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], "components": [ [ [ "water", 1 ], [ "water_clean", 1 ] ], diff --git a/data/json/recipes/chem/mutagens.json b/data/json/recipes/chem/mutagens.json index 0060baac80470..328d4aeb251ab 100644 --- a/data/json/recipes/chem/mutagens.json +++ b/data/json/recipes/chem/mutagens.json @@ -45,7 +45,7 @@ "difficulty": 2, "time": "5 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "jabberwock_heart", 1 ] ] ] }, { diff --git a/data/json/recipes/electronics/parts.json b/data/json/recipes/electronics/parts.json index 4aad1e13a4aa2..9f1df7915aead 100644 --- a/data/json/recipes/electronics/parts.json +++ b/data/json/recipes/electronics/parts.json @@ -133,7 +133,7 @@ "autolearn": true, "using": [ [ "surface_heat", 50 ] ], "charges": 50, - "qualities": [ { "id": "ANVIL", "level": 1 }, { "id": "HAMMER", "level": 2 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "ANVIL", "level": 1 }, { "id": "HAMMER", "level": 2 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "tongs", -1 ] ], [ [ "swage", -1 ] ], [ [ "surface_heat", 1, "LIST" ], [ "forge", 1 ], [ "oxy_torch", 1 ] ] ], "components": [ [ [ "lead", 25 ] ], [ [ "tin", 25 ] ], [ [ "rosin", 2 ] ] ] } diff --git a/data/json/recipes/food/brewing.json b/data/json/recipes/food/brewing.json index e90d5612fc96b..6c36476bf2e2f 100644 --- a/data/json/recipes/food/brewing.json +++ b/data/json/recipes/food/brewing.json @@ -287,7 +287,7 @@ [ "textbook_survival", 3 ], [ "manual_survival", 3 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "BOIL", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "BOIL", "level": 2 } ], "tools": [ [ [ "surface_heat", 6, "LIST" ] ] ], "components": [ [ [ "water", 3 ], [ "water_clean", 3 ] ], @@ -308,7 +308,7 @@ "time": "30 m", "batch_time_factors": [ 95, 4 ], "book_learn": [ [ "survival_book", 3 ], [ "textbook_survival", 3 ], [ "manual_survival", 3 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "BOIL", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "BOIL", "level": 2 } ], "tools": [ [ [ "surface_heat", 6, "LIST" ] ] ], "components": [ [ [ "water", 3 ], [ "water_clean", 3 ] ], diff --git a/data/json/recipes/food/canned.json b/data/json/recipes/food/canned.json index c6e3c23fd4863..ebc94e03052f2 100644 --- a/data/json/recipes/food/canned.json +++ b/data/json/recipes/food/canned.json @@ -14,7 +14,7 @@ "book_learn": [ [ "cookbook", 4 ], [ "manual_canning", 3 ] ], "container": "jar_glass_sealed", "result_mult": 2, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 100, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], "components": [ [ [ "water", 11 ], [ "water_clean", 11 ] ], [ [ "jar_glass", 1 ] ], [ [ "meat_offal", 2, "LIST" ] ] ] }, @@ -34,7 +34,7 @@ "qualities": [ { "id": "SAW_M", "level": 1 }, { "id": "HAMMER", "level": 1 }, - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ], [ [ "can_sealer", -1 ] ] ], @@ -59,7 +59,7 @@ "book_learn": [ [ "cookbook", 6 ], [ "manual_canning", 4 ] ], "container": "jar_glass_sealed", "result_mult": 2, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 20, "LIST" ] ] ], "components": [ [ [ "water", 1 ], [ "water_clean", 1 ], [ "salt_water", 1 ], [ "saline", 5 ] ], @@ -82,7 +82,7 @@ "book_learn": [ [ "cookbook", 6 ], [ "manual_canning", 4 ] ], "container": "jar_3l_glass_sealed", "result_mult": 12, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 100, "LIST" ] ] ], "components": [ [ [ "water", 6 ], [ "water_clean", 6 ], [ "salt_water", 6 ], [ "saline", 30 ] ], @@ -105,7 +105,7 @@ "time": "30 m", "book_learn": [ [ "manual_canning", 3 ] ], "batch_time_factors": [ 83, 5 ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 100, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], "components": [ [ [ "water", 11 ], [ "water_clean", 11 ] ], @@ -130,7 +130,7 @@ "qualities": [ { "id": "SAW_M", "level": 1 }, { "id": "HAMMER", "level": 1 }, - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ], [ [ "can_sealer", -1 ] ] ], @@ -157,7 +157,7 @@ "result_mult": 6, "book_learn": [ [ "manual_canning", 3 ] ], "batch_time_factors": [ 83, 5 ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 200, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], "components": [ [ [ "water", 16 ], [ "water_clean", 16 ] ], @@ -181,7 +181,7 @@ "book_learn": [ [ "manual_canning", 3 ] ], "batch_time_factors": [ 83, 5 ], "result_mult": 2, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 100, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], "components": [ [ [ "water", 11 ], [ "water_clean", 11 ] ], @@ -205,7 +205,7 @@ "qualities": [ { "id": "SAW_M", "level": 1 }, { "id": "HAMMER", "level": 1 }, - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ], [ [ "can_sealer", -1 ] ] ], @@ -231,7 +231,7 @@ "result_mult": 12, "book_learn": [ [ "manual_canning", 3 ] ], "batch_time_factors": [ 83, 5 ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 200, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], "components": [ [ [ "water", 16 ], [ "water_clean", 16 ] ], @@ -302,7 +302,7 @@ "qualities": [ { "id": "SAW_M", "level": 1 }, { "id": "HAMMER", "level": 1 }, - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ], [ [ "can_sealer", -1 ] ] ], @@ -345,7 +345,7 @@ "book_learn": [ [ "cookbook", 4 ], [ "manual_canning", 3 ] ], "batch_time_factors": [ 83, 5 ], "result_mult": 2, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 100, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], "components": [ [ [ "water", 11 ], [ "water_clean", 11 ] ], [ [ "jar_glass_sealed", 1 ] ], [ [ "meat_red_raw", 2, "LIST" ] ] ] }, @@ -364,7 +364,7 @@ "result_mult": 2, "book_learn": [ [ "manual_canning", 3 ] ], "batch_time_factors": [ 83, 5 ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 100, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], "components": [ [ [ "water", 11 ], [ "water_clean", 11 ] ], [ [ "jar_glass_sealed", 1 ] ], [ [ "fish", 2 ] ] ] }, @@ -383,7 +383,7 @@ "result_mult": 2, "book_learn": [ [ "cookbook", 4 ], [ "manual_canning", 3 ] ], "batch_time_factors": [ 83, 5 ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 100, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], "components": [ [ [ "water", 11 ], [ "water_clean", 11 ] ], @@ -406,7 +406,7 @@ "book_learn": [ [ "cookbook", 4 ], [ "manual_canning", 3 ] ], "result_mult": 4, "batch_time_factors": [ 83, 5 ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 100, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], "components": [ [ [ "water", 12 ], [ "water_clean", 12 ] ], @@ -628,7 +628,7 @@ "book_learn": [ [ "cookbook_italian", 4 ], [ "manual_canning", 3 ] ], "result_mult": 4, "batch_time_factors": [ 83, 5 ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 100, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], "components": [ [ [ "water", 12 ], [ "water_clean", 12 ] ], @@ -651,7 +651,7 @@ "charges": 2, "book_learn": [ [ "cookbook", 4 ], [ "manual_canning", 3 ] ], "batch_time_factors": [ 83, 5 ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 100, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], "components": [ [ [ "water", 11 ], [ "water_clean", 11 ] ], @@ -674,7 +674,7 @@ "qualities": [ { "id": "SAW_M", "level": 1 }, { "id": "HAMMER", "level": 1 }, - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ], [ [ "can_sealer", -1 ] ] ], @@ -700,7 +700,7 @@ "qualities": [ { "id": "SAW_M", "level": 1 }, { "id": "HAMMER", "level": 1 }, - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ], [ [ "can_sealer", -1 ] ] ], @@ -726,7 +726,7 @@ "qualities": [ { "id": "SAW_M", "level": 1 }, { "id": "HAMMER", "level": 1 }, - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ], [ [ "can_sealer", -1 ] ] ], @@ -753,7 +753,7 @@ "qualities": [ { "id": "SAW_M", "level": 1 }, { "id": "HAMMER", "level": 1 }, - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ], [ [ "can_sealer", -1 ] ] ], @@ -781,7 +781,7 @@ "qualities": [ { "id": "SAW_M", "level": 1 }, { "id": "HAMMER", "level": 1 }, - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ], [ [ "can_sealer", -1 ] ] ], @@ -807,7 +807,7 @@ "qualities": [ { "id": "SAW_M", "level": 1 }, { "id": "HAMMER", "level": 1 }, - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ], [ [ "can_sealer", -1 ] ] ], @@ -834,7 +834,7 @@ "qualities": [ { "id": "SAW_M", "level": 1 }, { "id": "HAMMER", "level": 1 }, - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ], [ [ "can_sealer", -1 ] ] ], @@ -857,7 +857,7 @@ "qualities": [ { "id": "SAW_M", "level": 1 }, { "id": "HAMMER", "level": 1 }, - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ], [ [ "can_sealer", -1 ] ] ], @@ -880,7 +880,7 @@ "qualities": [ { "id": "SAW_M", "level": 1 }, { "id": "HAMMER", "level": 1 }, - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ], [ [ "can_sealer", -1 ] ] ], @@ -903,7 +903,7 @@ "qualities": [ { "id": "SAW_M", "level": 1 }, { "id": "HAMMER", "level": 1 }, - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ], [ [ "can_sealer", -1 ] ] ], @@ -925,7 +925,7 @@ "result_mult": 12, "book_learn": [ [ "cookbook", 4 ], [ "manual_canning", 3 ] ], "batch_time_factors": [ 83, 5 ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 200, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], "components": [ [ [ "water", 16 ], [ "water_clean", 16 ] ], [ [ "jar_3l_glass_sealed", 1 ] ], [ [ "meat_red_raw", 12, "LIST" ] ] ] }, @@ -944,7 +944,7 @@ "result_mult": 12, "book_learn": [ [ "cookbook", 4 ], [ "manual_canning", 3 ] ], "batch_time_factors": [ 83, 5 ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 200, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], "components": [ [ [ "water", 16 ], [ "water_clean", 16 ] ], @@ -968,7 +968,7 @@ "result_mult": 24, "autolearn": true, "batch_time_factors": [ 83, 5 ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 200, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], "components": [ [ [ "water", 22 ], [ "water_clean", 22 ] ], @@ -992,7 +992,7 @@ "result_mult": 12, "book_learn": [ [ "manual_canning", 3 ] ], "batch_time_factors": [ 83, 5 ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 200, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], "components": [ [ [ "water", 16 ], [ "water_clean", 16 ] ], [ [ "jar_3l_glass_sealed", 1 ] ], [ [ "fish", 12 ] ] ] }, @@ -1011,7 +1011,7 @@ "batch_time_factors": [ 83, 5 ], "book_learn": [ [ "cookbook", 4 ], [ "manual_canning", 3 ] ], "container": "jar_3l_glass_sealed", - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 200, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], "components": [ [ [ "water", 16 ], [ "water_clean", 16 ] ], [ [ "jar_3l_glass_sealed", 1 ] ], [ [ "meat_offal", 12, "LIST" ] ] ] }, @@ -1030,7 +1030,7 @@ "book_learn": [ [ "cookbook_italian", 4 ], [ "manual_canning", 3 ] ], "batch_time_factors": [ 83, 5 ], "charges": 24, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 200, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], "components": [ [ [ "water", 22 ], [ "water_clean", 22 ] ], @@ -1053,7 +1053,7 @@ "book_learn": [ [ "cookbook", 4 ], [ "manual_canning", 3 ] ], "batch_time_factors": [ 83, 5 ], "charges": 12, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 200, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], "components": [ [ [ "water", 16 ], [ "water_clean", 16 ] ], @@ -1201,7 +1201,7 @@ "charges": 48, "book_learn": [ [ "cookbook_italian", 4 ], [ "manual_canning", 3 ] ], "batch_time_factors": [ 80, 4 ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 200, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], "components": [ [ [ "jar_3l_glass_sealed", 1 ] ], @@ -1224,7 +1224,7 @@ "charges": 8, "book_learn": [ [ "cookbook_italian", 4 ], [ "manual_canning", 3 ] ], "batch_time_factors": [ 80, 4 ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 200, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], "components": [ [ [ "jar_glass_sealed", 1 ] ], @@ -1248,7 +1248,7 @@ "qualities": [ { "id": "SAW_M", "level": 1 }, { "id": "HAMMER", "level": 1 }, - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ], [ [ "can_sealer", -1 ] ] ], @@ -1305,7 +1305,7 @@ [ "manual_canning", 2 ] ], "batch_time_factors": [ 80, 4 ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 200, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], "components": [ [ [ "jar_3l_glass_sealed", 1 ] ], @@ -1336,7 +1336,7 @@ [ "manual_canning", 2 ] ], "batch_time_factors": [ 80, 4 ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 200, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], "components": [ [ [ "jar_glass_sealed", 1 ] ], [ [ "milk_standard_raw_fresh", 4, "LIST" ] ], [ [ "sugar_standard", 6, "LIST" ] ] ] }, @@ -1363,7 +1363,7 @@ "qualities": [ { "id": "SAW_M", "level": 1 }, { "id": "HAMMER", "level": 1 }, - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ], [ [ "can_sealer", -1 ] ] ], @@ -1390,7 +1390,7 @@ "qualities": [ { "id": "SAW_M", "level": 1 }, { "id": "HAMMER", "level": 1 }, - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ], [ [ "can_sealer", -1 ] ] ], @@ -1413,7 +1413,7 @@ "qualities": [ { "id": "SAW_M", "level": 1 }, { "id": "HAMMER", "level": 1 }, - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ], [ [ "can_sealer", -1 ] ] ], diff --git a/data/json/recipes/food/casseroles.json b/data/json/recipes/food/casseroles.json index 73a581d012fe4..f2af736616073 100644 --- a/data/json/recipes/food/casseroles.json +++ b/data/json/recipes/food/casseroles.json @@ -11,7 +11,7 @@ "time": "40 m", "batch_time_factors": [ 50, 2 ], "book_learn": [ [ "mag_cooking", 1 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 6, "LIST" ] ], [ [ "casserole", -1 ] ] ], "components": [ [ [ "veggy_any_corn_uncooked", 8, "LIST" ] ], @@ -44,7 +44,7 @@ "time": "45 m", "batch_time_factors": [ 50, 2 ], "book_learn": [ [ "mag_cooking", 1 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 6, "LIST" ] ], [ [ "casserole", -1 ] ] ], "components": [ [ [ "fish", 2 ], [ "can_tuna", 2 ], [ "can_salmon", 2 ], [ "can_herring", 2 ], [ "fish_canned", 2 ] ], diff --git a/data/json/recipes/food/corn.json b/data/json/recipes/food/corn.json index 1c19df6c67c70..731b16ff75e2b 100644 --- a/data/json/recipes/food/corn.json +++ b/data/json/recipes/food/corn.json @@ -10,7 +10,7 @@ "time": "20 m", "batch_time_factors": [ 50, 2 ], "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 6, "LIST" ] ] ], "components": [ [ [ "veggy_any_corn_uncooked", 4, "LIST" ] ], diff --git a/data/json/recipes/food/offal_dishes.json b/data/json/recipes/food/offal_dishes.json index 8ea4a26f7c8cf..e62b6b71bdcdd 100644 --- a/data/json/recipes/food/offal_dishes.json +++ b/data/json/recipes/food/offal_dishes.json @@ -107,7 +107,7 @@ "charges": 1, "time": "30 m", "book_learn": { "mag_glam": { "skill_level": 5 }, "cookbook_liverforkids": { "skill_level": 5, "recipe_name": "Buttery Duck Bites" } }, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 50, "LIST" ] ] ], "components": [ [ [ "meat_liver", 3, "LIST" ] ], @@ -132,7 +132,7 @@ "cookbook": { "skill_level": 0 }, "cookbook_liverforkids": { "skill_level": 1, "recipe_name": "Candied Onions and Giblets" } }, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 50, "LIST" ] ] ], "components": [ [ [ "meat_liver", 8, "LIST" ] ], [ [ "onion", 1 ], [ "irradiated_onion", 1 ] ] ] }, @@ -147,7 +147,7 @@ "time": "15 m", "batch_time_factors": [ 83, 5 ], "book_learn": [ [ "family_cookbook", 2 ], [ "cookbook", 2 ], [ "cookbook_liverforkids", 1 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 25, "LIST" ] ] ], "components": [ [ [ "meat_liver", 3, "LIST" ] ], @@ -189,7 +189,7 @@ "charges": 2, "book_learn": [ [ "cookbook", 1 ], [ "scots_cookbook", 2 ] ], "difficulty": 3, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 100, "LIST" ] ] ], "components": [ [ [ "meat_stomach_boiled", 1, "LIST" ] ], @@ -228,7 +228,7 @@ "charges": 2, "book_learn": [ [ "cookbook", 1 ], [ "scots_cookbook", 2 ] ], "difficulty": 3, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], "//": "No frying_oil as a tool, so this must be pan fried, not deep fried", "components": [ [ [ "stewed_tripe", 1 ] ], [ [ "batter", 3, "LIST" ] ], [ [ "fry_oil", 1, "LIST" ] ] ] @@ -244,7 +244,7 @@ "time": "60 m", "batch_time_factors": [ 83, 5 ], "book_learn": [ [ "cookbook", 3 ], [ "family_cookbook", 3 ], [ "cookbook_liverforkids", 1 ] ], - "qualities": [ { "id": "COOK", "level": 3 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "COOK", "level": 3 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "surface_heat", 75, "LIST" ] ], [ [ "rock_quern", -1 ], [ "clay_quern", -1 ], [ "food_processor", 20 ] ] ], "components": [ [ [ "meat_liver", 8, "LIST" ] ], @@ -267,7 +267,7 @@ "time": "25 m", "batch_time_factors": [ 83, 5 ], "book_learn": [ [ "cookbook", 2 ], [ "scots_cookbook", 2 ] ], - "qualities": [ { "id": "COOK", "level": 2 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "COOK", "level": 2 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "surface_heat", 45, "LIST" ] ] ], "components": [ [ [ "meat_brain", 2, "LIST" ] ], @@ -289,7 +289,7 @@ "batch_time_factors": [ 83, 5 ], "charges": 1, "book_learn": [ [ "cookbook", 2 ], [ "family_cookbook", 2 ] ], - "qualities": [ { "id": "COOK", "level": 3 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "COOK", "level": 3 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "surface_heat", 50, "LIST" ] ] ], "components": [ [ [ "meat_kidney", 2, "LIST" ] ], @@ -329,7 +329,7 @@ "difficulty": 5, "time": "30 m", "batch_time_factors": [ 83, 5 ], - "qualities": [ { "id": "COOK", "level": 3 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "COOK", "level": 3 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "surface_heat", 100, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], "book_learn": [ [ "cookbook", 6 ], [ "manual_canning", 4 ] ], "container": "jar_glass_sealed", @@ -351,7 +351,7 @@ "qualities": [ { "id": "SAW_M", "level": 1 }, { "id": "HAMMER", "level": 1 }, - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ], [ [ "can_sealer", -1 ] ] ], @@ -371,7 +371,7 @@ "batch_time_factors": [ 83, 5 ], "charges": 8, "book_learn": [ [ "offalcooking", 2 ] ], - "qualities": [ { "id": "COOK", "level": 3 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "COOK", "level": 3 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "surface_heat", 50, "LIST" ] ] ], "components": [ [ [ "meat_lung", 4, "LIST" ] ], @@ -397,7 +397,7 @@ "batch_time_factors": [ 83, 5 ], "charges": 8, "book_learn": [ [ "offalcooking", 2 ] ], - "qualities": [ { "id": "COOK", "level": 3 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "COOK", "level": 3 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "surface_heat", 50, "LIST" ] ] ], "components": [ [ [ "meat_lung", 4, "LIST" ] ], @@ -425,7 +425,7 @@ "batch_time_factors": [ 83, 5 ], "charges": 3, "book_learn": [ [ "offalcooking", 2 ] ], - "qualities": [ { "id": "COOK", "level": 3 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "COOK", "level": 3 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "surface_heat", 50, "LIST" ] ] ], "components": [ [ [ "eggs_any_shape", 3, "LIST" ] ], @@ -483,7 +483,7 @@ "time": "10 m", "book_learn": [ [ "offalcooking", 3 ] ], "batch_time_factors": [ 50, 3 ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 1 } ], "tools": [ [ [ "funnel", -1 ], [ "makeshift_funnel", -1 ] ] ], "components": [ [ [ "meat_nofish", 2, "LIST" ] ], diff --git a/data/json/recipes/food/pasta.json b/data/json/recipes/food/pasta.json index 3896834b6826c..fadcafb4fa2a0 100644 --- a/data/json/recipes/food/pasta.json +++ b/data/json/recipes/food/pasta.json @@ -44,7 +44,7 @@ "time": "20 m", "charges": 3, "book_learn": [ [ "cookbook_italian", 3 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 6, "LIST" ] ] ], "components": [ [ [ "spaghetti_raw", 1 ] ], @@ -71,7 +71,7 @@ "time": "20 m", "charges": 4, "book_learn": [ [ "cookbook_italian", 3 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 6, "LIST" ] ] ], "components": [ [ [ "lasagne_raw", 1 ] ], @@ -102,7 +102,7 @@ "cookbook_italian": { "skill_level": 3 }, "cookbook_foodfashions": { "skill_level": 4, "recipe_name": "Spaghetti Luchetto" } }, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 4, "LIST" ] ] ], "components": [ [ [ "spaghetti_raw", 1 ] ], diff --git a/data/json/recipes/food/vegetable_dishes.json b/data/json/recipes/food/vegetable_dishes.json index 025699b956007..2dee172b625b9 100644 --- a/data/json/recipes/food/vegetable_dishes.json +++ b/data/json/recipes/food/vegetable_dishes.json @@ -11,7 +11,7 @@ "time": "5 m", "batch_time_factors": [ 80, 1 ], "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "CONTAIN", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "CONTAIN", "level": 1 } ], "tools": [ [ [ "food_processor", 10 ] ] ], "components": [ [ diff --git a/data/json/recipes/other/cords_and_ropes.json b/data/json/recipes/other/cords_and_ropes.json index 2ee862f7049b7..9bdbfc8313b99 100644 --- a/data/json/recipes/other/cords_and_ropes.json +++ b/data/json/recipes/other/cords_and_ropes.json @@ -64,7 +64,7 @@ "difficulty": 3, "time": "1 h", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_fibers" }, { "proficiency": "prof_fibers_rope" } ], "components": [ [ [ "rag", 30 ], [ "leather", 30 ], [ "felt_patch", 30 ], [ "tanned_hide", 5 ] ] ] }, @@ -92,7 +92,7 @@ "difficulty": 3, "time": "5 h", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_fibers" }, { "proficiency": "prof_fibers_rope" } ], "components": [ [ [ "rag", 150 ], [ "leather", 150 ], [ "felt_patch", 150 ], [ "tanned_hide", 25 ] ] ] }, diff --git a/data/json/recipes/other/materials.json b/data/json/recipes/other/materials.json index 34b08adf4ba0a..ea99461b0c761 100644 --- a/data/json/recipes/other/materials.json +++ b/data/json/recipes/other/materials.json @@ -71,7 +71,7 @@ "difficulty": 5, "time": "2 h", "autolearn": true, - "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "CONTAIN", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "CONTAIN", "level": 1 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "sheet_metal", -1 ] ] ], "components": [ [ [ "splinter", 10 ], [ "stick", 4 ], [ "2x4", 4 ], [ "withered", 20 ] ], [ [ "water", 4 ], [ "water_clean", 4 ] ] ] }, @@ -161,7 +161,7 @@ "autolearn": true, "batch_time_factors": [ 80, 4 ], "result_mult": 15, - "qualities": [ { "id": "CHEM", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CHEM", "level": 1 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "surface_heat", 15, "LIST" ] ] ], "//": "This recipe needs to include formaldehyde", "components": [ [ [ "milk_standard_raw", 15, "LIST" ] ], [ [ "bleach", 1 ], [ "vinegar", 4 ] ] ] @@ -249,7 +249,7 @@ "time": "1 m", "autolearn": true, "byproducts": [ [ "scrap_neoprene", 4 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "sheet_neoprene", 14 ] ] ] }, { @@ -326,7 +326,7 @@ "time": "30 m", "autolearn": true, "proficiencies": [ { "proficiency": "prof_spinning" }, { "proficiency": "prof_fibers" } ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "tools": [ [ [ "distaff_spindle", -1 ] ] ], "components": [ [ [ "straw_pile", 5 ], [ "withered", 5 ] ] ] }, @@ -341,7 +341,7 @@ "time": "30 m", "autolearn": true, "proficiencies": [ { "proficiency": "prof_spinning" }, { "proficiency": "prof_fibers" } ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "tools": [ [ [ "distaff_spindle", -1 ] ] ], "components": [ [ [ "wool_staple", 1 ] ] ] }, @@ -411,7 +411,7 @@ "autolearn": true, "proficiencies": [ { "proficiency": "prof_weaving" } ], "tools": [ [ [ "loom_frame", -1 ] ], [ [ "shed_stick", -1 ] ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "thread", 5 ] ] ] }, { @@ -427,7 +427,7 @@ "time": "270 m", "charges": 4, "autolearn": true, - "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "cotton_patchwork", 4 ] ], [ [ "filament", 15, "LIST" ] ] ] }, { @@ -440,7 +440,7 @@ "time": "270 m", "charges": 4, "autolearn": true, - "qualities": [ { "id": "SEW_CURVED", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SEW_CURVED", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "neoprene", 5 ] ], [ [ "filament", 15, "LIST" ] ] ] }, { @@ -453,7 +453,7 @@ "time": "270 m", "charges": 4, "autolearn": true, - "qualities": [ { "id": "SEW_CURVED", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SEW_CURVED", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "nomex", 5 ] ], [ [ "thread_nomex", 15 ] ] ] }, { @@ -466,7 +466,7 @@ "difficulty": 1, "time": "36 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "tanned_pelt", 1 ] ] ] }, { @@ -479,7 +479,7 @@ "skill_used": "tailor", "time": "90 m", "autolearn": true, - "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 1 }, { "id": "LEATHER_AWL", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 2 }, { "id": "LEATHER_AWL", "level": 1 } ], "components": [ [ [ "leather", 6 ] ], [ [ "filament", 4, "LIST" ] ] ] }, { @@ -492,7 +492,7 @@ "difficulty": 1, "time": "6 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "fur", 1 ] ] ] }, { @@ -568,7 +568,7 @@ "autolearn": true, "time": "40 m", "batch_time_factors": [ 50, 2 ], - "qualities": [ { "id": "CHEM", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CHEM", "level": 1 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "surface_heat", 7, "LIST" ] ] ], "components": [ [ [ "string_36", 4 ] ], [ [ "water", 1 ], [ "water_clean", 1 ] ], [ [ "chem_saltpetre", 7 ] ], [ [ "sugar", 5 ] ] ] }, @@ -584,7 +584,7 @@ "time": "10 m", "charges": 6, "batch_time_factors": [ 60, 2 ], - "qualities": [ { "id": "CONTAIN", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CONTAIN", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "string_36", 1 ] ], [ [ "water", 1 ], [ "water_clean", 1 ] ], @@ -683,7 +683,7 @@ "qualities": [ { "id": "SAW_W", "level": 1 }, [ { "id": "PUNCH", "level": 1 }, { "id": "DRILL", "level": 1 } ], - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "FILE", "level": 1 } ], "proficiencies": [ { "proficiency": "prof_carving", "time_multiplier": 1.25, "fail_multiplier": 1.125 } ], @@ -700,7 +700,7 @@ "time": "1 h 30 m", "charges": 25, "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, [ { "id": "PUNCH", "level": 1 }, { "id": "DRILL", "level": 1 } ] ], + "qualities": [ { "id": "CUT", "level": 2 }, [ { "id": "PUNCH", "level": 1 }, { "id": "DRILL", "level": 1 } ] ], "tools": [ [ [ "surface_heat", 5, "LIST" ] ] ], "proficiencies": [ { "proficiency": "prof_plasticworking" } ], "components": [ [ [ "plastic_chunk", 1 ] ] ] diff --git a/data/json/recipes/other/medical.json b/data/json/recipes/other/medical.json index cec87fd960c5d..0347f3949f5aa 100644 --- a/data/json/recipes/other/medical.json +++ b/data/json/recipes/other/medical.json @@ -67,7 +67,7 @@ "time": "5 m", "batch_time_factors": [ 50, 2 ], "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "medical_gauze", 5 ] ], [ [ "duct_tape", 20 ], [ "medical_tape", 10 ] ] ] }, { @@ -80,7 +80,7 @@ "difficulty": 1, "time": "1 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "leather_belt", 1 ], @@ -144,7 +144,7 @@ "time": "60 m", "autolearn": true, "book_learn": [ [ "isherwood_herbal_remedies", 3 ] ], - "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "CUT", "level": 1 }, { "id": "BOIL", "level": 2 } ], + "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "CUT", "level": 2 }, { "id": "BOIL", "level": 2 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], "components": [ [ [ "cooking_oil", 2 ], [ "cooking_oil2", 2 ] ], [ [ "mugwort", 2 ] ] ] }, @@ -160,7 +160,7 @@ "time": "60 m", "autolearn": true, "book_learn": [ [ "isherwood_herbal_remedies", 3 ] ], - "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "CUT", "level": 1 }, { "id": "BOIL", "level": 2 } ], + "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "CUT", "level": 2 }, { "id": "BOIL", "level": 2 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], "components": [ [ [ "cooking_oil", 2 ], [ "cooking_oil2", 2 ] ], [ [ "thyme", 2 ] ] ] }, @@ -182,7 +182,7 @@ [ "pocket_survival", 1 ], [ "isherwood_herbal_remedies", 1 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "cattail_stalk", 4 ] ] ] }, { @@ -274,7 +274,7 @@ [ "pocket_firstaid", 1 ] ], "time": "15 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "duct_tape", 30 ], [ "medical_tape", 30 ] ], [ [ "bottle_plastic_small", 2 ], [ "funnel", 2 ], [ "metal_funnel", 2 ], [ "makeshift_funnel", 2 ] ], diff --git a/data/json/recipes/other/parts.json b/data/json/recipes/other/parts.json index 4605e5576e16d..897c97e5f8cd8 100644 --- a/data/json/recipes/other/parts.json +++ b/data/json/recipes/other/parts.json @@ -485,7 +485,7 @@ "time": "1 m", "autolearn": true, "charges": 6, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "copper_wire", 6 ] ], [ [ "duct_tape", 1 ] ] ] }, { @@ -654,7 +654,7 @@ "time": "10 m", "reversible": true, "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "cable", 50 ], [ "jumper_cable", 1 ] ], [ [ "scrap", 2 ] ] ] }, { @@ -850,7 +850,7 @@ "autolearn": true, "proficiencies": [ { "proficiency": "prof_plasticworking", "time_multiplier": 1.25, "fail_multiplier": 1.125 } ], "using": [ [ "surface_heat", 10 ] ], - "qualities": [ { "id": "FILE", "level": 1 }, { "id": "CUT", "level": 1 }, { "id": "SAW_M", "level": 1 } ], + "qualities": [ { "id": "FILE", "level": 1 }, { "id": "CUT", "level": 2 }, { "id": "SAW_M", "level": 1 } ], "components": [ [ [ "chunk_rubber", 8 ] ], [ [ "superglue", 4 ], [ "bone_glue", 4 ] ], [ [ "wheel_caster", 1 ] ] ] }, { diff --git a/data/json/recipes/other/parts_construction.json b/data/json/recipes/other/parts_construction.json index 27b07d1a03c59..827dfbb0c6cdc 100644 --- a/data/json/recipes/other/parts_construction.json +++ b/data/json/recipes/other/parts_construction.json @@ -130,7 +130,7 @@ "time": "5 h 40 m", "book_learn": [ [ "textbook_weapeast", 4 ] ], "autolearn": true, - "qualities": [ { "id": "SAW_W", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SAW_W", "level": 1 }, { "id": "CUT", "level": 2 } ], "//": "a long pole is a single piece of wood, and the stout branch just isn't large enough.", "components": [ [ [ "wood_beam", 1 ] ], @@ -348,7 +348,7 @@ "difficulty": 2, "time": "10 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "CONTAIN", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "CONTAIN", "level": 1 } ], "tools": [ [ [ "frame_wood", -1 ], [ "frame_wood_light", -1 ] ] ], "batch_time_factors": [ 75, 4 ], "components": [ diff --git a/data/json/recipes/other/vehicle.json b/data/json/recipes/other/vehicle.json index 14437e4b3b08a..e411db694e574 100644 --- a/data/json/recipes/other/vehicle.json +++ b/data/json/recipes/other/vehicle.json @@ -55,7 +55,7 @@ "difficulty": 2, "time": "2 m", "book_learn": [ [ "mag_fieldrepair", 1 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "rag", 4 ], [ "leather_belt", 1 ], [ "rope_superior_short", 1, "LIST" ] ], [ [ "duct_tape", 20 ] ] ] }, { @@ -69,7 +69,7 @@ "difficulty": 2, "time": "2 m", "book_learn": [ [ "mag_fieldrepair", 2 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "bottle_plastic", 1 ] ], [ [ "paper", 50 ] ], [ [ "duct_tape", 20 ] ] ] }, { @@ -83,7 +83,7 @@ "difficulty": 2, "time": "2 m", "book_learn": [ [ "mag_fieldrepair", 2 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "can_drink", 1 ], [ "can_food", 1 ], [ "canister_empty", 1 ] ], [ [ "paper", 50 ] ], [ [ "duct_tape", 20 ] ] ] }, { diff --git a/data/json/recipes/practice/fabrication.json b/data/json/recipes/practice/fabrication.json index de38a22a8697d..491942a4b5489 100644 --- a/data/json/recipes/practice/fabrication.json +++ b/data/json/recipes/practice/fabrication.json @@ -12,7 +12,7 @@ "practice_data": { "min_difficulty": 1, "max_difficulty": 2, "skill_limit": 3 }, "proficiencies": [ { "proficiency": "prof_fletching", "fail_multiplier": 1, "time_multiplier": 1 } ], "time": "1 h", - "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "CUT", "level": 2 } ], "//": "Modifying so much the arrows/bolts will cause them to eventually lose their shape", "components": [ [ [ "arrow_fire_hardened_fletched", 4 ], [ "bolt_crude", 4 ] ], @@ -34,7 +34,7 @@ "practice_data": { "min_difficulty": 0, "max_difficulty": 1, "skill_limit": 2 }, "proficiencies": [ { "proficiency": "prof_carving", "fail_multiplier": 1, "time_multiplier": 1 } ], "time": "1 h", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "//": "One could use other wooden items to practice carving, but the stick and plank are the most easily adquired.", "components": [ [ [ "stick", 1 ], [ "2x4", 1 ] ] ], "byproducts": [ [ "splinter", 5 ] ], @@ -52,7 +52,7 @@ "practice_data": { "min_difficulty": 0, "max_difficulty": 1, "skill_limit": 2 }, "proficiencies": [ { "proficiency": "prof_carpentry_basic", "fail_multiplier": 1, "time_multiplier": 1 } ], "time": "1 h", - "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "CUT", "level": 2 } ], "//": "You destroy the wood with your practice, and the nails are now unusable.", "components": [ [ [ "stick", 4 ], [ "2x4", 2 ] ], [ [ "nail", 20 ] ] ], "byproducts": [ [ "splinter", 15 ] ], diff --git a/data/json/recipes/recipe_ammo.json b/data/json/recipes/recipe_ammo.json index d879ce899c1ba..aadd46ed5ecbc 100644 --- a/data/json/recipes/recipe_ammo.json +++ b/data/json/recipes/recipe_ammo.json @@ -83,7 +83,7 @@ "autolearn": true, "book_learn": [ [ "recipe_arrows", 1 ], [ "pocket_survival", 1 ], [ "book_archery", 2 ] ], "proficiencies": [ { "proficiency": "prof_fletching" }, { "proficiency": "prof_carving" } ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "adhesive", 1, "LIST" ], [ "filament", 20, "LIST" ] ], [ [ "stick", 1 ], [ "broom", 1 ], [ "2x4", 1 ], [ "bee_sting", 1 ], [ "mop", 1 ] ], @@ -120,7 +120,7 @@ "autolearn": true, "book_learn": [ [ "recipe_arrows", 3 ] ], "proficiencies": [ { "proficiency": "prof_fletching" }, { "proficiency": "prof_carving" } ], - "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "CUT", "level": 1 }, { "id": "ANVIL", "level": 3 } ], + "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "CUT", "level": 2 }, { "id": "ANVIL", "level": 3 } ], "tools": [ [ [ "tongs", -1 ] ] ], "components": [ [ [ "adhesive", 1, "LIST" ], [ "filament", 20, "LIST" ] ], @@ -143,7 +143,7 @@ "autolearn": true, "book_learn": [ [ "recipe_arrows", 3 ] ], "proficiencies": [ { "proficiency": "prof_fletching" }, { "proficiency": "prof_carving" } ], - "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "CUT", "level": 1 }, { "id": "ANVIL", "level": 3 } ], + "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "CUT", "level": 2 }, { "id": "ANVIL", "level": 3 } ], "tools": [ [ [ "tongs", -1 ] ] ], "components": [ [ [ "adhesive", 1, "LIST" ], [ "filament", 20, "LIST" ] ], @@ -166,7 +166,7 @@ "autolearn": true, "book_learn": [ [ "recipe_arrows", 3 ] ], "proficiencies": [ { "proficiency": "prof_fletching" }, { "proficiency": "prof_carving" } ], - "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "CUT", "level": 1 }, { "id": "ANVIL", "level": 3 } ], + "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "CUT", "level": 2 }, { "id": "ANVIL", "level": 3 } ], "tools": [ [ [ "tongs", -1 ] ] ], "components": [ [ [ "adhesive", 1, "LIST" ], [ "filament", 20, "LIST" ] ], @@ -188,7 +188,7 @@ "autolearn": true, "book_learn": [ [ "recipe_arrows", 3 ] ], "proficiencies": [ { "proficiency": "prof_fletching" }, { "proficiency": "prof_metalworking" } ], - "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "CUT", "level": 1 }, { "id": "SAW_M", "level": 1 } ], + "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "CUT", "level": 2 }, { "id": "SAW_M", "level": 1 } ], "components": [ [ [ "adhesive", 1, "LIST" ], [ "filament", 10, "LIST" ] ], [ [ "wire", 5 ], [ "pipe", 1 ] ], @@ -207,7 +207,7 @@ "time": "20 m", "autolearn": true, "proficiencies": [ { "proficiency": "prof_fletching" }, { "proficiency": "prof_carving" } ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "tools": [ [ [ "fire", -1 ] ] ], "components": [ [ [ "adhesive", 1, "LIST" ], [ "filament", 10, "LIST" ] ], @@ -228,7 +228,7 @@ "autolearn": true, "book_learn": [ [ "recipe_arrows", 2 ], [ "pocket_survival", 2 ] ], "proficiencies": [ { "proficiency": "prof_fletching" }, { "proficiency": "prof_carving" } ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "HAMMER", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "HAMMER", "level": 1 } ], "components": [ [ [ "adhesive", 1, "LIST" ], [ "filament", 20, "LIST" ] ], [ [ "stick", 2 ], [ "broom", 2 ], [ "2x4", 2 ], [ "bee_sting", 2 ], [ "mop", 2 ] ], @@ -257,7 +257,7 @@ "autolearn": true, "book_learn": [ [ "recipe_arrows", 3 ] ], "proficiencies": [ { "proficiency": "prof_fletching" }, { "proficiency": "prof_carving" } ], - "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "CUT", "level": 1 }, { "id": "ANVIL", "level": 3 } ], + "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "CUT", "level": 2 }, { "id": "ANVIL", "level": 3 } ], "tools": [ [ [ "tongs", -1 ] ] ], "components": [ [ [ "adhesive", 1, "LIST" ], [ "filament", 20, "LIST" ] ], @@ -280,7 +280,7 @@ "autolearn": true, "book_learn": [ [ "recipe_arrows", 3 ] ], "proficiencies": [ { "proficiency": "prof_fletching" }, { "proficiency": "prof_carving" } ], - "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "CUT", "level": 1 }, { "id": "ANVIL", "level": 3 } ], + "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "CUT", "level": 2 }, { "id": "ANVIL", "level": 3 } ], "tools": [ [ [ "tongs", -1 ] ] ], "components": [ [ [ "adhesive", 1, "LIST" ], [ "filament", 20, "LIST" ] ], @@ -303,7 +303,7 @@ "autolearn": true, "book_learn": [ [ "recipe_arrows", 3 ] ], "proficiencies": [ { "proficiency": "prof_fletching" }, { "proficiency": "prof_carving" } ], - "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "CUT", "level": 1 }, { "id": "ANVIL", "level": 3 } ], + "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "CUT", "level": 2 }, { "id": "ANVIL", "level": 3 } ], "tools": [ [ [ "tongs", -1 ] ] ], "components": [ [ [ "adhesive", 1, "LIST" ], [ "filament", 20, "LIST" ] ], @@ -325,7 +325,7 @@ "autolearn": true, "book_learn": [ [ "recipe_arrows", 3 ] ], "proficiencies": [ { "proficiency": "prof_fletching" }, { "proficiency": "prof_metalworking" } ], - "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "CUT", "level": 1 }, { "id": "SAW_M", "level": 1 } ], + "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "CUT", "level": 2 }, { "id": "SAW_M", "level": 1 } ], "components": [ [ [ "adhesive", 1, "LIST" ], [ "filament", 10, "LIST" ] ], [ [ "wire", 4 ], [ "pipe", 1 ] ], @@ -345,7 +345,7 @@ "autolearn": true, "book_learn": [ [ "recipe_arrows", 1 ], [ "book_archery", 1 ] ], "proficiencies": [ { "proficiency": "prof_carving" } ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "stick", 1 ], [ "broom", 1 ], [ "2x4", 1 ], [ "bee_sting", 1 ], [ "mop", 1 ] ] ] }, { @@ -359,7 +359,7 @@ "difficulty": 3, "time": "20 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_fletching" }, { "proficiency": "prof_carving" } ], "tools": [ [ [ "fire", -1 ] ] ], "components": [ @@ -381,7 +381,7 @@ "autolearn": true, "book_learn": [ [ "recipe_arrows", 1 ], [ "pocket_survival", 1 ], [ "book_archery", 2 ] ], "proficiencies": [ { "proficiency": "prof_fletching" }, { "proficiency": "prof_carving" } ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "adhesive", 1, "LIST" ], [ "filament", 20, "LIST" ] ], [ [ "stick", 1 ], [ "broom", 1 ], [ "2x4", 1 ], [ "bee_sting", 1 ], [ "mop", 1 ] ], @@ -401,7 +401,7 @@ "autolearn": true, "book_learn": [ [ "recipe_arrows", 2 ], [ "pocket_survival", 2 ] ], "proficiencies": [ { "proficiency": "prof_fletching" }, { "proficiency": "prof_carving" } ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "HAMMER", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "HAMMER", "level": 1 } ], "components": [ [ [ "adhesive", 1, "LIST" ], [ "filament", 20, "LIST" ] ], [ [ "stick", 2 ], [ "broom", 2 ], [ "2x4", 2 ], [ "bee_sting", 2 ], [ "mop", 2 ] ], @@ -428,7 +428,7 @@ "time": "5 m", "reversible": true, "book_learn": [ [ "recipe_arrows", 5 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "arrow_field_point_fletched", 5 ] ], [ [ "rag", 1, "NO_RECOVER" ] ], @@ -533,7 +533,7 @@ "time": "5 m", "autolearn": true, "proficiencies": [ { "proficiency": "prof_carving" } ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "HAMMER", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "HAMMER", "level": 1 } ], "components": [ [ [ "stick", 1 ], [ "broom", 1 ], [ "2x4", 1 ], [ "bee_sting", 1 ], [ "mop", 1 ] ], [ [ "scrap", 4 ] ] ] }, { @@ -561,7 +561,7 @@ "time": "30 s", "autolearn": true, "book_learn": [ [ "recipe_bullets", 2 ], [ "manual_shotgun", 2 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_handloading" } ], "components": [ [ [ "gunpowder", 20 ], [ "chem_black_powder", 20 ] ], [ [ "lead", 24 ] ], [ [ "paper", 1 ], [ "aluminum_foil", 1 ] ] ] }, @@ -577,7 +577,7 @@ "time": "30 s", "autolearn": true, "book_learn": [ [ "recipe_bullets", 2 ], [ "manual_shotgun", 2 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_handloading" } ], "components": [ [ [ "gunpowder", 20 ], [ "chem_black_powder", 20 ] ], @@ -598,7 +598,7 @@ "time": "50 s", "autolearn": true, "book_learn": [ [ "recipe_bullets", 2 ], [ "manual_shotgun", 2 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "SAW_M", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "SAW_M", "level": 1 } ], "proficiencies": [ { "proficiency": "prof_handloading" } ], "components": [ [ [ "gunpowder", 20 ], [ "chem_black_powder", 20 ] ], @@ -619,7 +619,7 @@ "time": "50 s", "autolearn": true, "book_learn": [ [ "recipe_bullets", 2 ], [ "manual_shotgun", 2 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "HAMMER", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "HAMMER", "level": 1 } ], "using": [ [ "surface_heat", 2 ] ], "proficiencies": [ { "proficiency": "prof_handloading" } ], "components": [ [ [ "gunpowder", 20 ], [ "chem_black_powder", 20 ] ], [ [ "lead", 24 ] ], [ [ "paper", 1 ], [ "aluminum_foil", 1 ] ] ] @@ -636,7 +636,7 @@ "time": "30 s", "autolearn": true, "book_learn": [ [ "recipe_bullets", 2 ], [ "manual_shotgun", 2 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_handloading" } ], "components": [ [ [ "gunpowder", 20 ], [ "chem_black_powder", 20 ] ], @@ -655,7 +655,7 @@ "difficulty": 5, "time": "56 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "book_learn": [ [ "plastics_book", 4 ] ], "proficiencies": [ { "proficiency": "prof_plasticworking" } ], "using": [ [ "plastic_molding", 1 ] ], @@ -739,7 +739,7 @@ "difficulty": 2, "time": "20 m", "batch_time_factors": [ 80, 5 ], - "qualities": [ { "id": "CONTAIN", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CONTAIN", "level": 1 }, { "id": "CUT", "level": 2 } ], "book_learn": { "textbook_gaswarfare": { "skill_level": 2 }, "textbook_anarch": { "skill_level": 2, "recipe_name": "Stuff THE MAN doesn't want you to know" } @@ -884,7 +884,7 @@ "difficulty": 1, "time": "1 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "stick", 1 ], diff --git a/data/json/recipes/recipe_deconstruction.json b/data/json/recipes/recipe_deconstruction.json index 50b0bfcb8bc16..a846ad084aec6 100644 --- a/data/json/recipes/recipe_deconstruction.json +++ b/data/json/recipes/recipe_deconstruction.json @@ -167,7 +167,7 @@ "type": "uncraft", "activity_level": "LIGHT_EXERCISE", "time": "6 s", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "plastic_chunk", 1 ] ] ] }, { @@ -399,7 +399,7 @@ "type": "uncraft", "time": "12 s", "activity_level": "NO_EXERCISE", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "leather", 1 ] ] ] }, { @@ -407,7 +407,7 @@ "type": "uncraft", "activity_level": "LIGHT_EXERCISE", "time": "12 s", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "plastic_chunk", 1 ] ] ] }, { @@ -415,7 +415,7 @@ "type": "uncraft", "activity_level": "LIGHT_EXERCISE", "time": "12 s", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "plastic_chunk", 1 ] ] ] }, { @@ -423,7 +423,7 @@ "type": "uncraft", "activity_level": "LIGHT_EXERCISE", "time": "12 s", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "plastic_chunk", 1 ] ] ] }, { @@ -431,7 +431,7 @@ "type": "uncraft", "time": "1 m", "activity_level": "NO_EXERCISE", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "fur", 1 ] ], [ [ "plastic_chunk", 1 ] ] ] }, { @@ -439,7 +439,7 @@ "type": "uncraft", "time": "1 m", "activity_level": "NO_EXERCISE", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "faux_fur", 1 ] ] ] }, { @@ -447,7 +447,7 @@ "type": "uncraft", "time": "2 m", "activity_level": "NO_EXERCISE", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "fur", 1 ] ], [ [ "plastic_chunk", 1 ] ] ] }, { @@ -455,7 +455,7 @@ "type": "uncraft", "time": "2 m", "activity_level": "NO_EXERCISE", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "faux_fur", 1 ] ] ] }, { @@ -463,7 +463,7 @@ "type": "uncraft", "time": "1 m", "activity_level": "NO_EXERCISE", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "fur", 1 ] ] ] }, { @@ -471,7 +471,7 @@ "type": "uncraft", "time": "1 m", "activity_level": "NO_EXERCISE", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "faux_fur", 1 ] ] ] }, { @@ -479,7 +479,7 @@ "type": "uncraft", "time": "1 m", "activity_level": "NO_EXERCISE", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "leather", 1 ] ], [ [ "buckle_steel", 1 ] ] ] }, { @@ -487,7 +487,7 @@ "type": "uncraft", "time": "1 m", "activity_level": "NO_EXERCISE", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "leather", 1 ] ] ] }, { @@ -495,7 +495,7 @@ "type": "uncraft", "time": "2 m", "activity_level": "NO_EXERCISE", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "leather", 1 ] ] ] }, { @@ -551,7 +551,7 @@ "type": "uncraft", "activity_level": "LIGHT_EXERCISE", "time": "1 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "leather", 2 ] ], [ [ "string_6", 2 ] ] ] }, { @@ -559,7 +559,7 @@ "type": "uncraft", "activity_level": "LIGHT_EXERCISE", "time": "5 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "chem_sulphuric_acid", 13 ] ], [ [ "lead", 2247 ] ], [ [ "plastic_chunk", 3 ] ] ] }, { @@ -567,7 +567,7 @@ "type": "uncraft", "activity_level": "LIGHT_EXERCISE", "time": "5 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "chem_sulphuric_acid", 3 ] ], [ [ "lead", 499 ] ], [ [ "plastic_chunk", 2 ] ] ] }, { @@ -575,7 +575,7 @@ "type": "uncraft", "activity_level": "LIGHT_EXERCISE", "time": "5 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "chem_sulphuric_acid", 1 ] ], [ [ "lead", 187 ] ], [ [ "plastic_chunk", 1 ] ] ] }, { @@ -692,7 +692,7 @@ "activity_level": "LIGHT_EXERCISE", "skill_used": "tailor", "time": "3 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "leather", 8 ] ], [ [ "scrap", 2 ] ], [ [ "sole_rubber", 2 ] ] ] }, { @@ -701,7 +701,7 @@ "activity_level": "LIGHT_EXERCISE", "skill_used": "tailor", "time": "4 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "leather", 2 ] ], [ [ "plastic_chunk", 2 ] ], @@ -2101,7 +2101,7 @@ "time": "2 m", "//": "This may need to be modified, a plastic sheath would give plastic chunks, but there already is a plastic sheathed cable", "activity_level": "LIGHT_EXERCISE", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "copper", 1 ] ] ], "flags": [ "UNCRAFT_SINGLE_CHARGE" ] }, @@ -2134,7 +2134,7 @@ "type": "uncraft", "activity_level": "LIGHT_EXERCISE", "time": "5 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "weed", 20 ] ], [ [ "plant_fibre", 100 ] ], [ [ "withered", 1 ] ] ], "flags": [ "BLIND_HARD" ] }, @@ -2423,7 +2423,7 @@ "type": "uncraft", "activity_level": "NO_EXERCISE", "time": "5 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "cotton_patchwork", 1 ] ], [ [ "filament", 2, "LIST" ] ] ] }, { @@ -2439,7 +2439,7 @@ "type": "uncraft", "activity_level": "NO_EXERCISE", "time": "1 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "neoprene", 1 ] ], [ [ "scrap_neoprene", 20 ] ] ] }, { @@ -2447,7 +2447,7 @@ "type": "uncraft", "activity_level": "NO_EXERCISE", "time": "1 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "nomex", 1 ] ], [ [ "scrap_nomex", 20 ] ] ] }, { @@ -2455,7 +2455,7 @@ "type": "uncraft", "time": "2 m", "activity_level": "LIGHT_EXERCISE", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "leather", 6 ] ] ] }, { @@ -2513,7 +2513,7 @@ "type": "uncraft", "time": "5 m", "activity_level": "NO_EXERCISE", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "yarn", 50 ] ] ] }, { @@ -2561,7 +2561,7 @@ "type": "uncraft", "activity_level": "LIGHT_EXERCISE", "time": "1 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "leather", 4 ] ], [ [ "string_6", 3 ] ] ] }, { @@ -3001,7 +3001,7 @@ "activity_level": "MODERATE_EXERCISE", "result": "knife_butcher", "time": "10 m", - "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "blade", 1 ], [ "steel_chunk", 4 ], [ "scrap", 20 ] ], [ [ "leather", 1 ], [ "fur", 1 ] ] ] }, { @@ -3102,7 +3102,7 @@ "type": "uncraft", "activity_level": "LIGHT_EXERCISE", "time": "5 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "plastic_chunk", 20 ] ] ] }, { @@ -3110,7 +3110,7 @@ "type": "uncraft", "activity_level": "LIGHT_EXERCISE", "time": "3 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "plastic_chunk", 3 ] ], [ [ "scrap", 1 ] ], [ [ "wire", 5 ] ] ] }, { @@ -3645,7 +3645,7 @@ "type": "uncraft", "activity_level": "LIGHT_EXERCISE", "time": "1 h", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "thread", 80 ] ] ] }, { @@ -3653,7 +3653,7 @@ "type": "uncraft", "activity_level": "LIGHT_EXERCISE", "time": "30 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "plant_fibre", 80 ] ] ] }, { @@ -4564,7 +4564,7 @@ "type": "uncraft", "activity_level": "LIGHT_EXERCISE", "time": "2 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "cardboard", 15 ] ] ] }, { @@ -4572,7 +4572,7 @@ "type": "uncraft", "time": "3 m 30 s", "activity_level": "LIGHT_EXERCISE", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "cardboard", 85 ] ] ] }, { @@ -4580,7 +4580,7 @@ "type": "uncraft", "activity_level": "LIGHT_EXERCISE", "time": "6 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "cardboard", 125 ] ] ] }, { @@ -4956,7 +4956,7 @@ "skill_used": "tailor", "time": "30 m", "difficulty": 1, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "rag", 25 ] ], [ [ "element", 5 ] ], [ [ "cable", 5 ] ] ] }, { @@ -4974,7 +4974,7 @@ "activity_level": "LIGHT_EXERCISE", "skill_used": "fabrication", "time": "3 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "hat_hard", 1 ], [ "helmet_bike", 1 ] ], [ [ "flashlight", 1 ] ], @@ -4998,7 +4998,7 @@ "skill_used": "electronics", "difficulty": 1, "time": "6 m", - "qualities": [ { "id": "SCREW", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SCREW", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "shoulder_strap", 1 ] ], [ [ "2x4", 1 ] ], @@ -5481,7 +5481,7 @@ "activity_level": "LIGHT_EXERCISE", "skill_used": "fabrication", "time": "12 s", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "plastic_chunk", 2 ] ], [ [ "splinter", 3 ] ] ] }, { @@ -5516,7 +5516,7 @@ "skill_used": "tailor", "time": "10 m", "difficulty": 1, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "tarp", 1 ] ], [ [ "tent_pole", 2 ] ], [ [ "plastic_sheet", 1 ] ], [ [ "bag_plastic", 1 ] ] ] }, { @@ -5526,7 +5526,7 @@ "skill_used": "tailor", "time": "30 m", "difficulty": 1, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "tarp", 4 ] ], [ [ "tent_pole", 5 ] ], [ [ "plastic_sheet", 3 ] ], [ [ "bag_plastic", 3 ] ] ] }, { @@ -5718,7 +5718,7 @@ "type": "uncraft", "activity_level": "MODERATE_EXERCISE", "time": "1 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "plastic_chunk", 2 ] ] ] }, { @@ -5733,7 +5733,7 @@ "type": "uncraft", "activity_level": "MODERATE_EXERCISE", "time": "12 s", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "plastic_chunk", 3 ] ] ] }, { @@ -5749,7 +5749,7 @@ "type": "uncraft", "activity_level": "LIGHT_EXERCISE", "time": "30 s", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "nylon", 3 ] ], [ [ "scrap", 1 ] ] ] } ] diff --git a/data/json/recipes/recipe_food.json b/data/json/recipes/recipe_food.json index 3f9a6b4d0c4cb..e1e4f02ee8975 100644 --- a/data/json/recipes/recipe_food.json +++ b/data/json/recipes/recipe_food.json @@ -33,7 +33,7 @@ "difficulty": 3, "time": "30 m", "book_learn": [ [ "cookbook_foodfashions", 5 ], [ "baking_book", 2 ] ], - "qualities": [ { "id": "COOK", "level": 2 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "COOK", "level": 2 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "surface_heat", 5, "LIST" ] ] ], "charges": 8, "proficiencies": [ @@ -155,7 +155,7 @@ "time": "10 m", "autolearn": true, "batch_time_factors": [ 67, 5 ], - "qualities": [ { "id": "COOK", "level": 2 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "COOK", "level": 2 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "surface_heat", 7, "LIST" ] ] ], "proficiencies": [ { "proficiency": "prof_food_prep" } ], "components": [ [ [ "bell_pepper", 1 ] ] ] @@ -249,7 +249,7 @@ "charges": 3, "autolearn": true, "flags": [ "BLIND_EASY" ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_knife_skills" } ], "components": [ [ [ "bacon_uncut", 1 ] ] ] }, @@ -402,7 +402,7 @@ "time": "10 m", "charges": 12, "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 7, "LIST" ] ] ], "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_knife_skills" } ], "components": [ [ [ "fat", 3 ] ], [ [ "water", 1 ], [ "water_clean", 1 ] ] ] @@ -419,7 +419,7 @@ "time": "10 m", "charges": 3, "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 7, "LIST" ] ] ], "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_knife_skills" } ], "components": [ [ [ "fat", 2 ] ] ] @@ -429,7 +429,7 @@ "activity_level": "LIGHT_EXERCISE", "result": "mutant_tallow", "copy-from": "tallow", - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 7, "LIST" ] ] ], "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_knife_skills" } ], "components": [ [ [ "mutant_fat", 3 ] ], [ [ "water", 1 ], [ "water_clean", 1 ] ] ] @@ -440,7 +440,7 @@ "result": "mutant_lard", "copy-from": "lard", "byproducts": [ [ "mutant_cracklins" ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 7, "LIST" ] ] ], "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_knife_skills" } ], "components": [ [ [ "mutant_fat", 2 ] ] ] @@ -450,7 +450,7 @@ "activity_level": "LIGHT_EXERCISE", "result": "mutant_human_tallow", "copy-from": "tallow", - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 7, "LIST" ] ] ], "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_knife_skills" } ], "components": [ [ [ "mutant_human_fat", 3 ] ], [ [ "water", 1 ], [ "water_clean", 1 ] ] ] @@ -461,7 +461,7 @@ "result": "mutant_human_lard", "byproducts": [ [ "mutant_human_cracklins" ] ], "copy-from": "lard", - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 7, "LIST" ] ] ], "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_knife_skills" } ], "components": [ [ [ "mutant_human_fat", 2 ] ] ] @@ -665,7 +665,7 @@ "charges": 1, "autolearn": true, "time": "16 m", - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 8, "LIST" ] ] ], "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_knife_skills" } ], "components": [ [ [ "fish", 2 ] ], [ [ "any_butter_or_oil", 1, "LIST" ] ], [ [ "batter", 1, "LIST" ] ] ] @@ -681,7 +681,7 @@ "charges": 5, "autolearn": true, "time": "16 m", - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 8, "LIST" ] ] ], "proficiencies": [ { "proficiency": "prof_food_prep" }, @@ -702,7 +702,7 @@ "time": "16 m", "charges": 1, "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 8, "LIST" ] ] ], "proficiencies": [ { "proficiency": "prof_food_prep" }, @@ -747,7 +747,7 @@ }, "time": "5 m", "charges": 3, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "CONTAIN", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "CONTAIN", "level": 1 } ], "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_knife_skills" } ], "components": [ [ [ "sushi_rice", 1 ] ], @@ -775,7 +775,7 @@ "book_learn": [ [ "cookbook_sushi", 3 ] ], "time": "8 m", "charges": 2, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "CONTAIN", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "CONTAIN", "level": 1 } ], "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_knife_skills" } ], "components": [ [ [ "sushi_rice", 1 ] ], @@ -891,7 +891,7 @@ "book_learn": [ [ "cookbook_sushi", 3 ] ], "time": "6 m", "charges": 2, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "CONTAIN", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "CONTAIN", "level": 1 } ], "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_knife_skills" } ], "components": [ [ [ "sushi_rice", 1 ] ], @@ -919,7 +919,7 @@ "difficulty": 3, "book_learn": [ [ "cookbook_sushi", 3 ] ], "time": "6 m", - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "CONTAIN", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "CONTAIN", "level": 1 } ], "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_knife_skills" } ], "components": [ [ [ "sushi_rice", 2 ] ], @@ -951,7 +951,7 @@ }, "time": "9 m", "charges": 2, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "CONTAIN", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "CONTAIN", "level": 1 } ], "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_knife_skills" } ], "components": [ [ [ "fish", 1 ] ], @@ -992,7 +992,7 @@ "skill_used": "cooking", "time": "4 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_knife_skills" } ], "components": [ [ [ "protein_powder", 1 ] ], @@ -1012,7 +1012,7 @@ "charges": 6, "book_learn": [ [ "family_cookbook", 2 ], [ "scots_cookbook", 2 ] ], "batch_time_factors": [ 83, 3 ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 1 } ], "tools": [ [ [ "char_smoker", 10 ] ], [ [ "funnel", -1 ], [ "makeshift_funnel", -1 ] ] ], "proficiencies": [ { "proficiency": "prof_food_prep" }, @@ -1045,7 +1045,7 @@ "time": "40 m", "book_learn": [ [ "cookbook_bloodforgood", 2 ] ], "batch_time_factors": [ 83, 3 ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 1 } ], "tools": [ [ [ "surface_heat", 7, "LIST" ] ] ], "charges": 8, "components": [ @@ -1074,7 +1074,7 @@ "time": "1 h", "book_learn": [ [ "family_cookbook", 2 ], [ "scots_cookbook", 2 ] ], "batch_time_factors": [ 83, 3 ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 1 } ], "tools": [ [ [ "surface_heat", 7, "LIST" ] ], [ [ "funnel", -1 ], [ "makeshift_funnel", -1 ] ] ], "charges": 8, "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_knife_skills" }, { "proficiency": "prof_preservation" } ], @@ -1104,7 +1104,7 @@ "charges": 6, "book_learn": [ [ "family_cookbook", 2 ], [ "scots_cookbook", 2 ] ], "batch_time_factors": [ 50, 3 ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 1 } ], "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_knife_skills" } ], "tools": [ [ [ "funnel", -1 ], [ "makeshift_funnel", -1 ] ] ], "components": [ @@ -1169,7 +1169,7 @@ "charges": 8, "autolearn": true, "batch_time_factors": [ 83, 3 ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 1 } ], "tools": [ [ [ "char_smoker", 5 ] ], [ [ "funnel", -1 ], [ "makeshift_funnel", -1 ] ] ], "proficiencies": [ { "proficiency": "prof_food_prep" }, @@ -1194,7 +1194,7 @@ "time": "10 m", "charges": 12, "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 7, "LIST" ] ] ], "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_knife_skills" } ], "components": [ [ [ "human_fat", 3 ] ], [ [ "water", 1 ], [ "water_clean", 1 ] ] ] @@ -1211,7 +1211,7 @@ "time": "10 m", "charges": 3, "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 7, "LIST" ] ] ], "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_knife_skills" } ], "components": [ [ [ "human_fat", 2 ] ] ] @@ -1241,7 +1241,7 @@ "difficulty": 3, "time": "10 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 6, "LIST" ] ] ], "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_knife_skills" } ], "components": [ @@ -1260,7 +1260,7 @@ "difficulty": 3, "time": "10 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 6, "LIST" ] ] ], "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_knife_skills" } ], "components": [ [ [ "meat_red", 2, "LIST" ], [ "fish", 2 ] ], [ [ "water", 1 ], [ "water_clean", 1 ] ] ] @@ -1544,7 +1544,7 @@ "time": "24 m", "autolearn": true, "batch_time_factors": [ 30, 1 ], - "qualities": [ { "id": "COOK", "level": 2 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "COOK", "level": 2 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "surface_heat", 5, "LIST" ] ], [ [ "rock_quern", -1 ], [ "clay_quern", -1 ], [ "food_processor", 20 ] ] ], "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_knife_skills" } ], "components": [ [ [ "acorns", 1 ] ], [ [ "water", 2 ], [ "water_clean", 2 ] ] ] @@ -1572,7 +1572,7 @@ "charges": 1, "time": "15 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 5, "LIST" ] ] ], "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_knife_skills" } ], "components": [ [ [ "pumpkin", 1 ], [ "irradiated_pumpkin", 1 ] ] ] @@ -1616,7 +1616,7 @@ "time": "16 m", "autolearn": true, "//": "Even assuming the crafter is reusing oil, some still gets absorbed into the potato.", - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 8, "LIST" ] ], [ [ "frying_oil", 1, "LIST" ] ] ], "proficiencies": [ { "proficiency": "prof_food_prep" }, @@ -1656,7 +1656,7 @@ "time": "16 m", "charges": 1, "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 8, "LIST" ] ], [ [ "frying_oil", 1, "LIST" ] ] ], "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_knife_skills" } ], "components": [ [ [ "tortilla_corn", 5 ] ], [ [ "fry_oil", 2, "LIST" ] ], [ [ "salt", 2 ], [ "seasoning_salt", 2 ] ] ] @@ -1671,7 +1671,7 @@ "time": "20 m", "charges": 3, "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 3, "LIST" ] ] ], "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_knife_skills" } ], "components": [ [ [ "cheese", 1 ], [ "cheese_hard", 1 ], [ "can_cheese", 1 ] ], [ [ "nachos", 3 ] ] ] @@ -1686,7 +1686,7 @@ "time": "20 m", "charges": 5, "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 3, "LIST" ] ] ], "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_knife_skills" } ], "components": [ [ [ "meat_red", 1, "LIST" ], [ "dry_meat", 1 ], [ "can_chicken", 1 ] ], [ [ "nachos", 3 ] ] ] @@ -1701,7 +1701,7 @@ "time": "20 m", "charges": 3, "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 3, "LIST" ] ] ], "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_knife_skills" } ], "components": [ @@ -1720,7 +1720,7 @@ "time": "20 m", "charges": 5, "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 3, "LIST" ] ] ], "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_knife_skills" } ], "components": [ [ [ "can_beans", 2 ], [ "beans_cooked", 2 ] ], [ [ "nachos", 3 ] ] ] @@ -1735,7 +1735,7 @@ "time": "20 m", "charges": 3, "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 3, "LIST" ] ] ], "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_knife_skills" } ], "components": [ @@ -1755,7 +1755,7 @@ "difficulty": 3, "time": "16 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 8, "LIST" ] ], [ [ "frying_oil", 1, "LIST" ] ] ], "proficiencies": [ { "proficiency": "prof_food_prep" }, @@ -1777,7 +1777,7 @@ "skill_used": "cooking", "time": "10 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "tools": [ [ [ "surface_heat", 3, "LIST" ] ] ], "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_knife_skills" } ], "components": [ [ [ "cheese", 1 ], [ "cheese_hard", 1 ], [ "can_cheese", 1 ] ], [ [ "fries", 1 ], [ "fresh_fries", 1 ] ] ] @@ -1920,7 +1920,7 @@ [ "mag_survival", 1 ], [ "family_cookbook", 1 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "BOIL", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "BOIL", "level": 1 } ], "tools": [ [ [ "water_boiling_heat", 2, "LIST" ] ] ], "components": [ [ [ "pine_bough", 1 ] ], [ [ "water", 1 ], [ "water_clean", 1 ] ] ] }, @@ -1988,7 +1988,7 @@ [ "mag_survival", 1 ], [ "family_cookbook", 1 ] ], - "qualities": [ { "id": "BOIL", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "BOIL", "level": 1 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "water_boiling_heat", 2, "LIST" ] ] ], "proficiencies": [ { "proficiency": "prof_food_prep" }, @@ -2308,7 +2308,7 @@ "difficulty": 1, "time": "15 m", "book_learn": [ [ "manual_sealing", 1 ] ], - "qualities": [ { "id": "CONTAIN", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CONTAIN", "level": 1 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "rag", -1 ] ] ], "proficiencies": [ { "proficiency": "prof_food_prep" }, @@ -2358,7 +2358,7 @@ "difficulty": 1, "time": "40 m", "autolearn": true, - "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "CUT", "level": 1 }, { "id": "CONTAIN", "level": 1 } ], + "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "CUT", "level": 2 }, { "id": "CONTAIN", "level": 1 } ], "components": [ [ [ "cattail_rhizome", 2 ] ] ] }, { @@ -2642,7 +2642,7 @@ "charges": 7, "time": "10 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], "components": [ [ [ "edible_fat", 1, "LIST" ] ] ] }, @@ -2658,7 +2658,7 @@ "time": "45 m", "batch_time_factors": [ 80, 1 ], "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "tools": [ [ [ "surface_heat", 20, "LIST" ] ] ], "components": [ [ [ "edible_tallow_lard", 2, "LIST" ] ], @@ -2714,7 +2714,7 @@ "batch_time_factors": [ 50, 5 ], "book_learn": [ [ "survival_book", 7 ], [ "dairy_book", 3 ] ], "qualities": [ - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 }, { "id": "BOIL", "level": 2 }, { "id": "CONTAIN", "level": 1 } @@ -3105,7 +3105,7 @@ "family_cookbook": { "skill_level": 5 }, "cookbook_daintydishes": { "skill_level": 5, "recipe_name": "Sir Tenderloin the Toothsome" } }, - "qualities": [ { "id": "BUTCHER", "level": 20 }, { "id": "COOK", "level": 3 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "BUTCHER", "level": 20 }, { "id": "COOK", "level": 3 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "surface_heat", 4, "LIST" ] ] ], "components": [ [ [ "sugar_standard", 2, "LIST" ], [ "honeycomb", 1 ] ], @@ -3127,7 +3127,7 @@ "time": "1 h", "book_learn": [ [ "family_cookbook", 4 ] ], "batch_time_factors": [ 83, 3 ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 1 } ], "tools": [ [ [ "char_smoker", 10 ] ], [ [ "funnel", -1 ], [ "makeshift_funnel", -1 ] ] ], "components": [ [ [ "syrup", 1 ] ], @@ -3155,7 +3155,7 @@ "charges": 8, "time": "20 m", "autolearn": true, - "qualities": [ { "id": "COOK", "level": 2 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "COOK", "level": 2 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "surface_heat", 8, "LIST" ] ] ], "components": [ [ [ "sugar_beet", 4 ] ], [ [ "water_clean", 1 ], [ "water", 1 ] ] ] }, @@ -3292,7 +3292,7 @@ "difficulty": 1, "time": "6 m", "autolearn": true, - "qualities": [ { "id": "COOK", "level": 2 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "COOK", "level": 2 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "surface_heat", 2, "LIST" ] ] ], "components": [ [ [ "can_beans", 1 ], [ "beans_cooked", 1 ] ], @@ -3310,7 +3310,7 @@ "difficulty": 1, "time": "6 m", "autolearn": true, - "qualities": [ { "id": "COOK", "level": 2 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "COOK", "level": 2 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "surface_heat", 2, "LIST" ] ] ], "components": [ [ [ "can_beans", 1 ], [ "beans_cooked", 1 ] ], [ [ "veggy_any", 1, "LIST" ] ], [ [ "sugar_standard", 1, "LIST" ] ] ] }, @@ -3338,7 +3338,7 @@ "difficulty": 1, "time": "3 m", "autolearn": true, - "qualities": [ { "id": "COOK", "level": 2 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "COOK", "level": 2 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "surface_heat", 2, "LIST" ] ] ], "components": [ [ [ "rice_cooked", 1 ] ], @@ -3357,7 +3357,7 @@ "difficulty": 1, "time": "3 m", "autolearn": true, - "qualities": [ { "id": "COOK", "level": 2 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "COOK", "level": 2 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "surface_heat", 2, "LIST" ] ] ], "components": [ [ [ "rice_cooked", 1 ], [ "dry_rice", 1 ] ], [ [ "tofu", 1 ], [ "dry_tofu", 1 ] ], [ [ "cooking_oil", 1 ] ] ] }, @@ -3371,7 +3371,7 @@ "difficulty": 1, "time": "18 s", "autolearn": true, - "qualities": [ { "id": "COOK", "level": 2 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "COOK", "level": 2 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "surface_heat", 2, "LIST" ] ] ], "components": [ [ [ "rice_cooked", 1 ] ], [ [ "veggy_any", 1, "LIST" ] ], [ [ "any_butter_or_oil", 1, "LIST" ] ] ] }, @@ -3404,7 +3404,7 @@ "difficulty": 2, "time": "9 m", "autolearn": true, - "qualities": [ { "id": "COOK", "level": 2 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "COOK", "level": 2 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "surface_heat", 2, "LIST" ] ] ], "components": [ [ [ "can_beans", 1 ], [ "dry_beans", 1 ], [ "raw_beans", 1 ] ], @@ -3444,7 +3444,7 @@ "difficulty": 2, "time": "9 m", "autolearn": true, - "qualities": [ { "id": "COOK", "level": 2 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "COOK", "level": 2 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "surface_heat", 2, "LIST" ] ] ], "components": [ [ [ "can_beans", 1 ], [ "dry_beans", 1 ], [ "raw_beans", 1 ] ], @@ -4137,7 +4137,7 @@ "charges": 1, "time": "18 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 8, "LIST" ] ] ], "components": [ [ [ "sweet_fruit", 1, "LIST" ] ], [ [ "sugar_standard_half", 1, "LIST" ] ] ] }, @@ -4263,7 +4263,7 @@ "result_mult": 2, "time": "8 m", "book_learn": [ [ "cookbook_italian", 2 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 2, "LIST" ] ] ], "components": [ [ [ "salt", 20 ] ], [ [ "garlic_clove", 6 ] ], [ [ "thyme", 2 ] ], [ [ "wild_herbs", 200 ] ] ] }, @@ -4659,7 +4659,7 @@ "difficulty": 2, "time": "48 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "BOIL", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "BOIL", "level": 2 } ], "tools": [ [ [ "surface_heat", 50, "LIST" ] ] ], "components": [ [ [ "hickory_root", 10 ] ], [ [ "water_clean", 1 ], [ "water", 1 ] ] ] }, @@ -4805,7 +4805,7 @@ "batch_time_factors": [ 10, 3 ], "autolearn": true, "book_learn": [ [ "vacuum_sealing", 1 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "vac_sealer", 10 ], [ "makeshift_sealer", 20 ] ] ], "components": [ [ [ "bag_plastic", 1 ], [ "plastic_bag_vac", 1 ] ], @@ -4828,7 +4828,7 @@ "batch_time_factors": [ 10, 3 ], "autolearn": true, "book_learn": [ [ "vacuum_sealing", 1 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "vac_sealer", 10 ], [ "makeshift_sealer", 20 ] ] ], "components": [ [ [ "bag_plastic", 1 ], [ "plastic_bag_vac", 1 ] ], [ [ "fish", 5 ] ], [ [ "salt_preservation", 5, "LIST" ] ] ] }, @@ -4847,7 +4847,7 @@ "batch_time_factors": [ 10, 3 ], "autolearn": true, "book_learn": [ [ "vacuum_sealing", 1 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "vac_sealer", 10 ], [ "makeshift_sealer", 20 ] ] ], "components": [ [ [ "bag_plastic", 1 ], [ "plastic_bag_vac", 1 ] ], @@ -4870,7 +4870,7 @@ "batch_time_factors": [ 10, 3 ], "autolearn": true, "book_learn": [ [ "vacuum_sealing", 1 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "vac_sealer", 5 ], [ "makeshift_sealer", 10 ] ] ], "components": [ [ [ "water", 1 ], [ "water_clean", 1 ] ], @@ -4891,7 +4891,7 @@ "time": "2 m 45 s", "batch_time_factors": [ 80, 2 ], "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 5, "LIST" ] ] ], "components": [ [ [ "can_spam", 1 ] ] ] }, @@ -5128,7 +5128,7 @@ "time": "9 m", "charges": 2, "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], "components": [ [ [ "meat_red", 1, "LIST" ] ], @@ -5168,7 +5168,7 @@ "time": "9 m", "charges": 2, "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], "components": [ [ [ "meat_red", 1, "LIST" ] ], @@ -5193,7 +5193,7 @@ "difficulty": 1, "time": "4 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "fish_cooked", 1 ], [ "fish_fried", 1 ] ], [ [ "bread_sandwich", 2, "LIST" ] ], @@ -5229,7 +5229,7 @@ "difficulty": 1, "time": "4 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "fish_cooked", 1 ], [ "fish_fried", 1 ] ], [ [ "bread_sandwich_wheat_free", 2, "LIST" ] ], @@ -5265,7 +5265,7 @@ "difficulty": 2, "time": "10 m", "book_learn": [ [ "family_cookbook", 2 ], [ "mag_cooking", 2 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "fish_cooked", 1 ], [ "can_salmon", 1 ] ], [ [ "bread_sandwich", 2, "LIST" ] ], @@ -5286,7 +5286,7 @@ "difficulty": 6, "time": "18 m", "book_learn": [ [ "cookbook", 4 ], [ "cookbook_foodfashions", 4 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], "components": [ [ [ "fish", 1 ] ], [ [ "water", 2 ], [ "water_clean", 2 ] ], [ [ "lye_powder", 5 ] ] ] }, @@ -5300,7 +5300,7 @@ "difficulty": 2, "time": "7 m 30 s", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "meat_cooked", 1, "LIST" ] ], [ [ "bread_sandwich", 2, "LIST" ] ], @@ -5372,7 +5372,7 @@ "difficulty": 2, "time": "7 m 30 s", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "meat_cooked", 1, "LIST" ] ], [ [ "bread_sandwich_wheat_free", 2, "LIST" ] ], @@ -5444,7 +5444,7 @@ "difficulty": 2, "time": "7 m 30 s", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], "components": [ [ [ "meat_cooked", 1, "LIST" ] ], @@ -5469,7 +5469,7 @@ "difficulty": 2, "time": "7 m 30 s", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], "components": [ [ [ "meat_cooked", 1, "LIST" ] ], @@ -5495,7 +5495,7 @@ "time": "8 m", "charges": 2, "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], "components": [ [ [ "meat_red", 1, "LIST" ] ], @@ -5534,7 +5534,7 @@ "time": "8 m", "charges": 2, "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], "components": [ [ [ "meat_red", 1, "LIST" ] ], @@ -5573,7 +5573,7 @@ "charges": 3, "time": "8 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], "components": [ [ [ "meat_red", 1, "LIST" ], [ "dry_meat", 1 ], [ "can_chicken", 1 ] ], @@ -5619,7 +5619,7 @@ "difficulty": 2, "time": "8 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], "components": [ [ [ "hotdogs_frozen", 1 ], [ "homemade_hotdogs", 1 ], [ "bratwurst_sausage", 1 ] ], @@ -5638,7 +5638,7 @@ "difficulty": 2, "time": "8 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], "components": [ [ [ "hotdogs_frozen", 1 ], [ "homemade_hotdogs", 1 ], [ "bratwurst_sausage", 1 ] ], @@ -5658,7 +5658,7 @@ "time": "4 m", "autolearn": false, "book_learn": [ [ "cookbook", 1 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 1 } ], "tools": [ [ [ "surface_heat", 5, "LIST" ] ] ], "components": [ [ [ "hotdogs_cooked", 1 ] ], @@ -5676,7 +5676,7 @@ "time": "4 m", "autolearn": false, "book_learn": [ [ "cookbook", 1 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 1 } ], "tools": [ [ [ "surface_heat", 5, "LIST" ] ] ], "components": [ [ [ "hotdogs_cooked_wheat_free", 1 ] ], @@ -5693,7 +5693,7 @@ "difficulty": 2, "time": "8 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], "components": [ [ [ "hotdogs_frozen", 2 ], [ "homemade_hotdogs", 2 ], [ "bratwurst_sausage", 2 ] ], @@ -5712,7 +5712,7 @@ "difficulty": 2, "time": "8 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], "components": [ [ [ "hotdogs_frozen", 2 ], [ "homemade_hotdogs", 2 ], [ "bratwurst_sausage", 2 ] ], @@ -5732,7 +5732,7 @@ "time": "25 m", "charges": 4, "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], "components": [ [ @@ -5758,7 +5758,7 @@ "difficulty": 2, "time": "8 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], "components": [ [ [ "sausage", 1 ], [ "sausage_cooked", 1 ], [ "bratwurst_sausage", 2 ] ], @@ -5811,7 +5811,7 @@ "difficulty": 2, "time": "6 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], "components": [ [ [ "bread_sandwich", 2, "LIST" ] ], @@ -5830,7 +5830,7 @@ "difficulty": 2, "time": "6 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], "components": [ [ [ "bread_sandwich_wheat_free", 2, "LIST" ] ], @@ -5850,7 +5850,7 @@ "difficulty": 1, "time": "8 m", "book_learn": [ [ "sweets_book", 1 ], [ "mag_cooking", 1 ], [ "family_cookbook", 1 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], "components": [ [ [ "bread_sandwich", 2, "LIST" ] ], @@ -5869,7 +5869,7 @@ "difficulty": 1, "time": "8 m", "book_learn": [ [ "sweets_book", 1 ], [ "mag_cooking", 1 ], [ "family_cookbook", 1 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], "components": [ [ [ "bread_sandwich_wheat_free", 2, "LIST" ] ], @@ -5886,7 +5886,7 @@ "skill_used": "cooking", "time": "3 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "bread_sandwich", 2, "LIST" ] ], [ [ "meat_cooked", 1, "LIST" ] ] ] }, { @@ -5898,7 +5898,7 @@ "skill_used": "cooking", "time": "3 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "bread_sandwich_wheat_free", 2, "LIST" ] ], [ [ "meat_cooked", 1, "LIST" ] ] ] }, { @@ -6029,7 +6029,7 @@ "time": "40 m", "charges": 6, "book_learn": [ [ "baking_book", 1 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 20, "LIST" ] ] ], "components": [ [ [ "flour", 12 ], [ "flour_wheat_free", 12 ] ], @@ -6102,7 +6102,7 @@ "charges": 2, "autolearn": true, "batch_time_factors": [ 67, 5 ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], "components": [ [ [ "can_tomato", 1 ], [ "irradiated_tomato", 1 ], [ "tomato", 1 ] ], @@ -6124,7 +6124,7 @@ "result_mult": 2, "book_learn": [ [ "manual_canning", 4 ] ], "batch_time_factors": [ 83, 5 ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 20, "LIST" ] ] ], "//": "Canned tomatoes aren't an option as they've already been preserved.", "components": [ @@ -6177,7 +6177,7 @@ "difficulty": 5, "time": "30 m", "book_learn": [ [ "fermenting_book", 2 ], [ "cookbook_foodfashions", 4 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 20, "LIST" ] ] ], "components": [ [ [ "water", 1 ], [ "water_clean", 1 ] ], @@ -6196,7 +6196,7 @@ "difficulty": 5, "time": "30 m", "book_learn": [ [ "fermenting_book", 3 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 20, "LIST" ] ] ], "components": [ [ [ "water", 1 ], [ "water_clean", 1 ] ], @@ -6255,7 +6255,7 @@ "result_mult": 2, "book_learn": [ [ "manual_canning", 4 ] ], "batch_time_factors": [ 83, 5 ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 20, "LIST" ] ] ], "components": [ [ [ "water", 1 ], [ "water_clean", 1 ], [ "salt_water", 1 ], [ "saline", 5 ] ], @@ -6278,7 +6278,7 @@ "result_mult": 2, "book_learn": [ [ "manual_canning", 4 ] ], "batch_time_factors": [ 83, 5 ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 20, "LIST" ] ] ], "components": [ [ [ "water", 1 ], [ "water_clean", 1 ], [ "salt_water", 1 ], [ "saline", 5 ] ], @@ -6423,7 +6423,7 @@ "difficulty": 1, "time": "20 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "CONTAIN", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "CONTAIN", "level": 1 } ], "components": [ [ [ "lettuce", 2 ], @@ -6482,7 +6482,7 @@ "time": "20 m", "charges": 10, "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "CONTAIN", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "CONTAIN", "level": 1 } ], "components": [ [ [ "boiled_egg", 6 ] ], [ [ "mustard", 1 ], [ "mustard_powder", 1 ] ], @@ -6583,7 +6583,7 @@ "difficulty": 5, "time": "1 h 30 m", "book_learn": [ [ "recipe_creepy", 5 ], [ "recipe_serum", 6 ] ], - "qualities": [ { "id": "CONTAIN", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CONTAIN", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "meat", 1 ], [ "mutant_meat", 1 ], [ "human_meat", 1, "LIST" ], [ "rehydrated_meat", 1 ] ], [ [ "slime_scrap", 2 ] ], @@ -6644,7 +6644,7 @@ "skill_used": "cooking", "time": "3 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "bread_sandwich", 2, "LIST" ] ], [ @@ -6705,7 +6705,7 @@ "skill_used": "cooking", "time": "3 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "bread_sandwich_wheat_free", 2, "LIST" ] ], [ @@ -6766,7 +6766,7 @@ "skill_used": "cooking", "time": "1 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "flatbread", 2 ], [ "bread", 2 ], [ "wastebread", 2 ], [ "sourdough_bread", 2 ] ], [ [ "cucumber", 1 ], [ "irradiated_cucumber", 1 ] ], @@ -6782,7 +6782,7 @@ "skill_used": "cooking", "time": "1 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "cornbread", 2 ] ], [ [ "cucumber", 1 ], [ "irradiated_cucumber", 1 ] ], @@ -6942,7 +6942,7 @@ "skill_used": "cooking", "time": "1 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "bread_sandwich", 2, "LIST" ] ], [ [ "cheese", 1 ], [ "cheese_hard", 1 ], [ "can_cheese", 1 ] ] ] }, { @@ -6954,7 +6954,7 @@ "skill_used": "cooking", "time": "1 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "bread_sandwich_wheat_free", 2, "LIST" ] ], [ [ "cheese", 1 ], [ "cheese_hard", 1 ], [ "can_cheese", 1 ] ] ] }, { @@ -6966,7 +6966,7 @@ "skill_used": "cooking", "time": "1 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "bread_sandwich", 2, "LIST" ] ], [ [ "egg_salad", 2 ] ] ] }, { @@ -6978,7 +6978,7 @@ "skill_used": "cooking", "time": "1 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "bread_sandwich_wheat_free", 2, "LIST" ] ], [ [ "egg_salad", 2 ] ] ] }, { @@ -7019,7 +7019,7 @@ "time": "12 m", "batch_time_factors": [ 20, 1 ], "book_learn": [ [ "textbook_survival", 5 ], [ "atomic_survival", 4 ], [ "survival_book", 3 ] ], - "qualities": [ { "id": "BOIL", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "BOIL", "level": 1 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "water_boiling_heat", 8, "LIST" ] ] ], "components": [ [ [ "water", 1 ], [ "water_clean", 1 ] ], [ [ "tanbark", 2 ] ] ] }, @@ -7175,7 +7175,7 @@ "difficulty": 3, "time": "40 m", "autolearn": true, - "qualities": [ { "id": "COOK", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "COOK", "level": 1 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "surface_heat", 12, "LIST" ] ] ], "components": [ [ [ "flour", 2 ], [ "flour_wheat_free", 2 ] ], @@ -7194,7 +7194,7 @@ "difficulty": 1, "time": "10 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "tools": [ [ [ "rag", -1 ] ] ], "components": [ [ [ "honeycomb", 1 ] ] ] }, @@ -7231,7 +7231,7 @@ }, "batch_time_factors": [ 50, 4 ], "using": [ [ "sewing_standard", 2 ] ], - "qualities": [ { "id": "BOIL", "level": 1 }, { "id": "COOK", "level": 3 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "BOIL", "level": 1 }, { "id": "COOK", "level": 3 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "surface_heat", 5, "LIST" ] ] ], "components": [ [ [ "water", 1 ], [ "water_clean", 1 ] ], @@ -7255,7 +7255,7 @@ "result_mult": 2, "batch_time_factors": [ 50, 4 ], "using": [ [ "sewing_standard", 4 ] ], - "qualities": [ { "id": "BOIL", "level": 1 }, { "id": "COOK", "level": 3 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "BOIL", "level": 1 }, { "id": "COOK", "level": 3 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], "components": [ [ [ "water", 2 ], [ "water_clean", 2 ] ], @@ -7276,7 +7276,7 @@ "time": "12 m", "book_learn": [ [ "family_cookbook", 4 ], [ "scots_cookbook", 2 ] ], "batch_time_factors": [ 50, 4 ], - "qualities": [ { "id": "COOK", "level": 3 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "COOK", "level": 3 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "surface_heat", 5, "LIST" ] ] ], "components": [ [ [ "water", 1 ], [ "water_clean", 1 ] ], @@ -7697,7 +7697,7 @@ "time": "1 h 10 m", "autolearn": true, "batch_time_factors": [ 83, 3 ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 1 } ], "tools": [ [ [ "char_smoker", 10 ] ], [ [ "funnel", -1 ], [ "makeshift_funnel", -1 ] ] ], "components": [ [ [ "offal", 4 ], [ "mutant_bug_organs", 4 ], [ "meat_nofish", 2, "LIST" ], [ "brain", 10 ] ], @@ -7729,7 +7729,7 @@ "time": "35 m", "autolearn": true, "batch_time_factors": [ 83, 6 ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 1 } ], "tools": [ [ [ "char_smoker", 5 ] ] ], "components": [ [ [ "sausage_wasteland_raw", 1 ] ] ] }, @@ -7745,7 +7745,7 @@ "time": "10 m", "autolearn": true, "batch_time_factors": [ 50, 3 ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 1 } ], "tools": [ [ [ "funnel", -1 ], [ "makeshift_funnel", -1 ] ] ], "components": [ [ [ "offal", 4 ], [ "mutant_bug_organs", 4 ], [ "meat_nofish", 2, "LIST" ], [ "brain", 10 ] ], @@ -7880,7 +7880,7 @@ "time": "1 h 7 m 30 s", "autolearn": true, "batch_time_factors": [ 30, 1 ], - "qualities": [ { "id": "COOK", "level": 2 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "COOK", "level": 2 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "surface_heat", 5, "LIST" ] ], [ [ "mortar_pestle", -1 ] ] ], "components": [ [ [ "acorns", 1 ] ], [ [ "water", 2 ], [ "water_clean", 2 ] ] ] }, @@ -7943,7 +7943,7 @@ "result_mult": 12, "book_learn": [ [ "manual_canning", 4 ] ], "batch_time_factors": [ 83, 5 ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 100, "LIST" ] ] ], "components": [ [ [ "water", 6 ], [ "water_clean", 6 ], [ "salt_water", 6 ], [ "saline", 30 ] ], @@ -7966,7 +7966,7 @@ "result_mult": 12, "book_learn": [ [ "manual_canning", 4 ] ], "batch_time_factors": [ 83, 5 ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 100, "LIST" ] ] ], "components": [ [ [ "water", 6 ], [ "water_clean", 6 ], [ "salt_water", 6 ], [ "saline", 30 ] ], @@ -7989,7 +7989,7 @@ "result_mult": 12, "book_learn": [ [ "manual_canning", 4 ] ], "batch_time_factors": [ 83, 5 ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 100, "LIST" ] ] ], "//": "Canned tomatoes aren't an option as they've already been preserved.", "components": [ @@ -8031,7 +8031,7 @@ "charges": 2, "time": "45 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], "components": [ [ [ "can_tomato", 1 ], [ "tomato", 1 ], [ "irradiated_tomato", 1 ] ], [ [ "water", 1 ], [ "water_clean", 1 ] ] ] }, @@ -8117,7 +8117,7 @@ "time": "25 m", "batch_time_factors": [ 80, 4 ], "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 1 } ], "tools": [ [ [ "surface_heat", 8, "LIST" ] ] ], "components": [ [ [ "cactus_pad", 3 ] ] ] }, @@ -8133,7 +8133,7 @@ "time": "30 m", "autolearn": true, "//": "Someone should make a Mexican cookbook", - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], "components": [ [ [ "meat_red", 1, "LIST" ], [ "dry_meat", 1 ], [ "can_chicken", 1 ], [ "meat_smoked", 1 ] ], @@ -8235,7 +8235,7 @@ "time": "10 m", "charges": 12, "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 7, "LIST" ] ] ], "components": [ [ [ "demihuman_fat", 3 ] ], [ [ "water", 1 ], [ "water_clean", 1 ] ] ] }, @@ -8251,7 +8251,7 @@ "time": "10 m", "charges": 3, "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 7, "LIST" ] ] ], "components": [ [ [ "demihuman_fat", 2 ] ] ] }, @@ -8329,7 +8329,7 @@ "charges": 8, "autolearn": true, "batch_time_factors": [ 67, 5 ], - "qualities": [ { "id": "BOIL", "level": 1 }, { "id": "CONTAIN", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "BOIL", "level": 1 }, { "id": "CONTAIN", "level": 1 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "water_boiling_heat", 2, "LIST" ] ] ], "components": [ [ [ "horseradish_root", 1 ] ], @@ -8553,7 +8553,7 @@ "charges": 6, "book_learn": [ [ "family_cookbook", 2 ], [ "cookbook_italian", 2 ] ], "batch_time_factors": [ 50, 3 ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 1 } ], "components": [ [ [ "meat_red", 2, "LIST" ] ], [ [ "bread", 1 ] ], @@ -8593,7 +8593,7 @@ "autolearn": true, "difficulty": 1, "batch_time_factors": [ 67, 5 ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 8, "LIST" ] ] ], "proficiencies": [ { "proficiency": "prof_food_prep" }, @@ -8623,7 +8623,7 @@ "skill_used": "cooking", "time": "6 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_knife_skills" } ], "components": [ [ [ "protein_powder", 1 ] ], diff --git a/data/json/recipes/recipe_medsandchemicals.json b/data/json/recipes/recipe_medsandchemicals.json index 8f8178e0c252f..5efc8ba4c1dd7 100644 --- a/data/json/recipes/recipe_medsandchemicals.json +++ b/data/json/recipes/recipe_medsandchemicals.json @@ -56,7 +56,7 @@ "difficulty": 2, "time": "15 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 7, "LIST" ] ] ], "components": [ [ [ "fat_tainted", 4 ] ], [ [ "water", 1 ], [ "water_clean", 1 ] ] ] }, diff --git a/data/json/recipes/recipe_others.json b/data/json/recipes/recipe_others.json index 12c0cb11a3d39..7adc27069e661 100644 --- a/data/json/recipes/recipe_others.json +++ b/data/json/recipes/recipe_others.json @@ -148,7 +148,7 @@ "skills_required": [ "survival", 2 ], "difficulty": 2, "book_learn": [ [ "fun_survival", 1 ], [ "manual_survival", 1 ], [ "textbook_survival", 1 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "SCREW", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "SCREW", "level": 1 } ], "time": "28 m", "autolearn": true, "using": [ [ "adhesive", 1 ] ], @@ -164,7 +164,7 @@ "skills_required": [ "survival", 2 ], "difficulty": 2, "book_learn": [ [ "fun_survival", 1 ], [ "manual_survival", 1 ], [ "textbook_survival", 1 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "SCREW", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "SCREW", "level": 1 } ], "proficiencies": [ { "proficiency": "prof_closures" }, { "proficiency": "prof_closures_waterproofing" } ], "time": "32 m", "autolearn": true, @@ -292,7 +292,7 @@ "difficulty": 3, "time": "30 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_carving" } ], "components": [ [ [ "stick", 1 ], [ "mop", 1 ], [ "broom", 1 ], [ "hoe", 1 ] ], @@ -372,7 +372,7 @@ "difficulty": 1, "time": "20 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_carving" } ], "components": [ [ [ "bone_sturdy", 1, "LIST" ], [ "skewer_bone", 1 ] ] ] }, @@ -386,7 +386,7 @@ "difficulty": 1, "time": "10 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_carving" } ], "components": [ [ [ "splinter", 1 ] ] ] }, @@ -401,7 +401,7 @@ "skills_required": [ "fabrication", 3 ], "time": "1 h", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_carving" } ], "components": [ [ [ "bone_sturdy", 1, "LIST" ] ] ] }, @@ -415,7 +415,7 @@ "difficulty": 1, "time": "3 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "skewer_bone", 2 ], [ "splinter", 2 ] ] ] }, { @@ -429,7 +429,7 @@ "time": "6 m", "autolearn": true, "proficiencies": [ { "proficiency": "prof_carving" } ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "stick", 1 ], [ "broom", 1 ], [ "2x4", 1 ], [ "pool_cue", 1 ], [ "mop", 1 ] ] ] }, { @@ -443,7 +443,7 @@ "time": "2 h", "autolearn": true, "proficiencies": [ { "proficiency": "prof_carving" } ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "stick", 2 ], [ "2x4", 1 ] ], [ [ "skewer_bone", 20 ], [ "splinter", 20 ] ] ] }, { @@ -456,7 +456,7 @@ "difficulty": 1, "time": "5 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "jug_plastic", 1 ], [ "bottle_plastic", 3 ], [ "bottle_plastic_small", 6 ], [ "aluminum_foil", 6 ] ] ] }, { @@ -470,7 +470,7 @@ "difficulty": 2, "time": "2 h", "autolearn": true, - "qualities": [ { "id": "SEW", "level": 1 }, { "id": "LEATHER_AWL", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "LEATHER_AWL", "level": 1 }, { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_leatherworking_basic", "required": false, "time_multiplier": 2, "fail_multiplier": 1.5 }, { "proficiency": "prof_leatherworking" }, @@ -490,7 +490,7 @@ "skills_required": [ "tailor", 1 ], "time": "20 m", "autolearn": true, - "qualities": [ { "id": "SEW", "level": 1 }, { "id": "LEATHER_AWL", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "LEATHER_AWL", "level": 1 }, { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_leatherworking_basic", "required": false, "time_multiplier": 2, "fail_multiplier": 1.5 }, { "proficiency": "prof_leatherworking" }, @@ -517,7 +517,7 @@ "reversible": true, "decomp_learn": 0, "autolearn": true, - "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_leatherworking_basic", "required": false, "time_multiplier": 2, "fail_multiplier": 1.5 }, { "proficiency": "prof_furriery" } @@ -627,7 +627,7 @@ "autolearn": true, "using": [ [ "cordage_short", 3 ] ], "proficiencies": [ { "proficiency": "prof_carving" } ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "splinter", 1 ], [ "stick", 1 ], [ "2x4", 1 ] ] ] }, { @@ -656,7 +656,7 @@ "time": "18 m", "book_learn": [ [ "textbook_fabrication", 3 ], [ "textbook_chemistry", 3 ], [ "adv_chemistry", 3 ], [ "textbook_mechanics", 5 ] ], "using": [ [ "filament", 50 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 5, "LIST" ] ] ], "components": [ [ [ "superglue", 1 ] ], [ [ "rag", 6 ] ], [ [ "plastic_chunk", 1 ] ] ] }, @@ -832,7 +832,7 @@ "difficulty": 1, "time": "20 m", "book_learn": [ [ "fun_survival", 1 ], [ "manual_fabrication", 1 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "can_drink", 2 ] ], [ [ "bottle_plastic", 1 ] ] ] }, { @@ -1256,7 +1256,7 @@ "difficulty": 2, "time": "30 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "jug_plastic", 1 ] ], [ [ "rag", 4 ] ], [ [ "charcoal", 75 ] ] ], "flags": [ "FULL_MAGAZINE" ] }, @@ -1270,7 +1270,7 @@ "difficulty": 2, "time": "30 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "clay_hydria", 1 ] ], [ [ "rag", 4 ] ], [ [ "charcoal", 300 ] ] ], "flags": [ "FULL_MAGAZINE" ] }, @@ -1285,7 +1285,7 @@ "reversible": true, "autolearn": true, "using": [ [ "cordage", 1 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_carving" } ], "components": [ [ [ "stick", 1 ], [ "2x4", 1 ] ], [ [ "rag", 4 ] ] ] }, @@ -1391,7 +1391,7 @@ "skill_used": "fabrication", "difficulty": 6, "time": "2 h", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "book_learn": [ [ "recipe_caseless", 5 ] ], "components": [ [ [ "rx12_injector", 1 ] ], @@ -1423,7 +1423,7 @@ "time": "2 m", "autolearn": true, "proficiencies": [ { "proficiency": "prof_carving" } ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "bone_sturdy", 1, "LIST" ], @@ -1458,7 +1458,7 @@ "difficulty": 2, "time": "10 m", "book_learn": [ [ "mag_survival", 2 ], [ "textbook_survival", 2 ], [ "survival_book", 1 ], [ "pocket_survival", 1 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "jug_plastic", 2 ], [ "bottle_plastic", 10 ], [ "bottle_plastic_small", 20 ] ], [ [ "cordage", 1, "LIST" ], [ "duct_tape", 50 ], [ "medical_tape", 25 ] ] @@ -1554,7 +1554,7 @@ "autolearn": true, "reversible": true, "using": [ [ "soldering_standard", 25 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "cable", 100 ] ], [ [ "scrap", 4 ] ], [ [ "duct_tape", 50 ] ] ] }, { @@ -1570,7 +1570,7 @@ "autolearn": true, "reversible": true, "using": [ [ "soldering_standard", 60 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "cable", 650 ] ], [ [ "scrap", 10 ] ], [ [ "duct_tape", 30 ] ], [ [ "hose", 2 ], [ "makeshift_hose", 2 ] ] ] }, { @@ -1662,7 +1662,7 @@ "difficulty": 1, "time": "5 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "salt_water", 1 ], [ "saline", 2 ], [ "salt", 2 ] ], [ [ "raw_leather", 1 ], [ "raw_tainted_leather", 1 ], [ "raw_hleather", 1 ], [ "raw_demihumanleather", 1 ] ] @@ -1679,7 +1679,7 @@ "difficulty": 1, "time": "5 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "cured_pelt", 1 ] ] ] }, { @@ -1695,7 +1695,7 @@ "batch_time_factors": [ 20, 10 ], "autolearn": true, "qualities": [ - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 }, { "id": "BOIL", "level": 1 }, { "id": "CONTAIN", "level": 1 } @@ -1720,7 +1720,7 @@ "difficulty": 1, "time": "5 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "salt_water", 1 ], [ "saline", 2 ], [ "salt", 2 ] ], [ [ "raw_fur", 1 ], [ "raw_hfur", 1 ], [ "raw_tainted_fur", 1 ] ] @@ -1739,7 +1739,7 @@ "batch_time_factors": [ 20, 10 ], "autolearn": true, "qualities": [ - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 }, { "id": "BOIL", "level": 1 }, { "id": "CONTAIN", "level": 1 } @@ -2192,7 +2192,7 @@ "skill_used": "fabrication", "time": "20 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_carving" } ], "components": [ [ [ "splinter", 1 ] ] ] }, @@ -2260,7 +2260,7 @@ "time": "45 m", "reversible": true, "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "razor_blade", 1 ] ], [ [ "plastic_chunk", 1 ] ] ] }, { @@ -2311,7 +2311,7 @@ "difficulty": 2, "time": "30 m", "autolearn": true, - "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "training_dummy_light", 1 ] ], [ [ "duct_tape", 50 ], [ "cordage", 2, "LIST" ] ], [ [ "scrap", 150 ] ] ] } ] diff --git a/data/json/recipes/recipe_traps.json b/data/json/recipes/recipe_traps.json index 897711c048dec..126257aeea83c 100644 --- a/data/json/recipes/recipe_traps.json +++ b/data/json/recipes/recipe_traps.json @@ -194,7 +194,7 @@ "time": "25 m", "book_learn": [ [ "manual_traps_mil", 3 ] ], "using": [ [ "cordage_short", 1 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_traps" }, { "proficiency": "prof_trapsetting" } ], "components": [ [ [ "grenade", 1 ] ], [ [ "clay_canister", 1 ], [ "can_drink", 1 ], [ "can_food", 1 ], [ "canister_empty", 1 ] ] ] }, diff --git a/data/json/recipes/recipe_vehicle.json b/data/json/recipes/recipe_vehicle.json index 5ddc036a4b2ff..bc72bcb8bbbac 100644 --- a/data/json/recipes/recipe_vehicle.json +++ b/data/json/recipes/recipe_vehicle.json @@ -870,7 +870,7 @@ "reversible": true, "autolearn": true, "proficiencies": [ { "proficiency": "prof_carpentry_basic" }, { "proficiency": "prof_carving" } ], - "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "2x4", 5 ] ], [ [ "stick", 2 ] ], [ [ "nail", 20 ] ] ] }, { diff --git a/data/json/recipes/recipes_holiday.json b/data/json/recipes/recipes_holiday.json index f84bf8413e4e3..4be8ce3532819 100644 --- a/data/json/recipes/recipes_holiday.json +++ b/data/json/recipes/recipes_holiday.json @@ -9,7 +9,7 @@ "difficulty": 2, "time": "30 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "book_learn": [ [ "plastics_book", 1 ] ], "proficiencies": [ { "proficiency": "prof_plasticworking" } ], "tools": [ [ [ "surface_heat", 5, "LIST" ] ] ], @@ -31,7 +31,7 @@ "difficulty": 1, "time": "45 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "pine_bough", 4 ] ], [ [ "duct_tape", 10 ], [ "cordage_superior", 6, "LIST" ] ] ] }, { @@ -44,7 +44,7 @@ "difficulty": 1, "time": "15 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "pumpkin", 12 ], [ "irradiated_pumpkin", 12 ] ], [ [ "candle", 1 ] ] ] } ] diff --git a/data/json/recipes/tools/containers.json b/data/json/recipes/tools/containers.json index c57f86f076267..ef77f23115f34 100644 --- a/data/json/recipes/tools/containers.json +++ b/data/json/recipes/tools/containers.json @@ -10,7 +10,7 @@ "difficulty": 2, "time": "30 m", "autolearn": true, - "qualities": [ { "id": "SEW", "level": 1 }, { "id": "LEATHER_AWL", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "LEATHER_AWL", "level": 1 }, { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_leatherworking_basic", "time_multiplier": 2 } ], "components": [ [ [ "leather", 6 ], [ "tanned_hide", 1 ], [ "fur", 6 ], [ "tanned_pelt", 1 ] ], [ [ "filament", 10, "LIST" ] ] ] }, @@ -25,7 +25,7 @@ "difficulty": 2, "time": "30 m", "autolearn": true, - "qualities": [ { "id": "SEW", "level": 1 }, { "id": "LEATHER_AWL", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "LEATHER_AWL", "level": 1 }, { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_leatherworking_basic", "time_multiplier": 2 } ], "components": [ [ [ "leather", 14 ], [ "tanned_hide", 2 ], [ "fur", 14 ], [ "tanned_pelt", 2 ] ], [ [ "filament", 20, "LIST" ] ] ] }, @@ -40,7 +40,7 @@ "difficulty": 3, "time": "30 m", "autolearn": true, - "qualities": [ { "id": "SEW", "level": 1 }, { "id": "LEATHER_AWL", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "LEATHER_AWL", "level": 1 }, { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_leatherworking_basic", "time_multiplier": 2 } ], "components": [ [ [ "leather", 24 ], [ "tanned_hide", 4 ], [ "fur", 24 ], [ "tanned_pelt", 4 ] ], [ [ "filament", 30, "LIST" ] ] ] }, @@ -88,7 +88,7 @@ "difficulty": 1, "time": "30 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "duct_tape", 10 ] ], [ [ "bottle_plastic", 8 ], [ "bottle_plastic_small", 16 ] ] ] }, { @@ -102,7 +102,7 @@ "time": "30 m", "autolearn": true, "using": [ [ "cordage", 1 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "duct_tape", 50 ] ], [ [ "jug_plastic", 4 ] ] ] }, { @@ -345,7 +345,7 @@ "time": "30 m", "autolearn": true, "using": [ [ "soldering_standard", 40 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "duct_tape", 200 ], [ "superglue", 4 ] ], [ [ "jerrycan", 12 ] ] ] }, { @@ -475,7 +475,7 @@ "difficulty": 4, "time": "3 m", "autolearn": true, - "qualities": [ { "id": "SAW_M", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SAW_M", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "syringe", 1 ] ], [ [ "flask_glass", 1 ], [ "bottle_plastic_small", 1 ] ] ] }, { @@ -711,7 +711,7 @@ "time": "30 m", "autolearn": true, "using": [ [ "waterproofing", 1 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "BOIL", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "BOIL", "level": 1 } ], "tools": [ [ [ "water_boiling_heat", 3, "LIST" ] ] ], "components": [ [ [ "water", 5 ], [ "water_clean", 5 ] ], @@ -730,7 +730,7 @@ "time": "45 m", "autolearn": true, "using": [ [ "waterproofing", 2 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "BOIL", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "BOIL", "level": 1 } ], "tools": [ [ [ "water_boiling_heat", 4, "LIST" ] ] ], "components": [ [ [ "water", 8 ], [ "water_clean", 8 ] ], @@ -749,7 +749,7 @@ "time": "30 m", "autolearn": true, "using": [ [ "adhesive", 1 ], [ "waterproofing", 1 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "SAW_W", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "SAW_W", "level": 2 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], "proficiencies": [ { "proficiency": "prof_metalworking" }, { "proficiency": "prof_carving" } ], "components": [ @@ -782,7 +782,7 @@ "difficulty": 1, "time": "10 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "cardboard", 90 ] ], [ [ "duct_tape", 100 ] ] ] }, { @@ -796,7 +796,7 @@ "difficulty": 3, "time": "90 m", "autolearn": true, - "qualities": [ { "id": "SEW", "level": 1 }, { "id": "LEATHER_AWL", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "LEATHER_AWL", "level": 1 }, { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_leatherworking_basic", "time_multiplier": 2 } ], "components": [ [ [ "leather", 3 ], [ "tanned_hide", 1 ], [ "tanned_pelt", 1 ] ], [ [ "filament", 35, "LIST" ] ] ] } diff --git a/data/json/recipes/tools/lights.json b/data/json/recipes/tools/lights.json index 19d93a126f81f..9c727156314bd 100644 --- a/data/json/recipes/tools/lights.json +++ b/data/json/recipes/tools/lights.json @@ -192,7 +192,7 @@ "time": "5 m", "reversible": true, "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "book_learn": [ [ "textbook_fabrication", 0 ], [ "manual_fabrication", 0 ], [ "mag_electronics", 0 ] ], "components": [ [ [ "flashlight", 1 ] ], @@ -213,7 +213,7 @@ "reversible": true, "using": [ [ "soldering_standard", 10 ] ], "proficiencies": [ { "proficiency": "prof_elec_soldering" } ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "SCREW", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "SCREW", "level": 1 } ], "components": [ [ [ "flashlight", 1 ] ], [ [ "amplifier", 1 ] ], @@ -236,7 +236,7 @@ "autolearn": true, "using": [ [ "soldering_standard", 10 ] ], "proficiencies": [ { "proficiency": "prof_elec_soldering" } ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "SCREW", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "SCREW", "level": 1 } ], "components": [ [ [ "betavoltaic", 4 ] ], [ [ "power_supply", 1 ] ], diff --git a/data/json/recipes/tools/tool.json b/data/json/recipes/tools/tool.json index 20060b7fbbaba..081b7b6b0f294 100644 --- a/data/json/recipes/tools/tool.json +++ b/data/json/recipes/tools/tool.json @@ -154,7 +154,7 @@ "skill_used": "fabrication", "time": "5 m", "autolearn": true, - "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "stick", 1 ], [ "2x4", 1 ] ], [ [ "nail", 1 ] ] ] }, { @@ -324,7 +324,7 @@ "difficulty": 1, "time": "10 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_carving" } ], "components": [ [ [ "bone_sturdy", 1, "LIST" ] ] ] }, @@ -390,7 +390,7 @@ "autolearn": false, "book_learn": [ [ "mag_survival", 4 ], [ "manual_survival", 4 ], [ "textbook_survival", 4 ] ], "using": [ [ "cordage", 6 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "stick", 1 ], [ "2x4", 2 ] ], [ [ "fishing_hook_bone", 1 ], [ "fishing_hook_basic", 1 ] ] ] }, { @@ -634,7 +634,7 @@ "time": "5 m", "autolearn": true, "book_learn": [ [ "mag_survival", 1 ], [ "textbook_survival", 1 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "can_drink", 1 ], [ "can_food", 1 ], [ "canister_empty", 1 ] ] ] }, { @@ -736,7 +736,7 @@ "time": "3 m", "autolearn": true, "batch_time_factors": [ 50, 5 ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 7, "LIST" ] ] ], "components": [ [ [ "stick", 1 ], [ "2x4", 1 ], [ "pool_cue", 1 ], [ "torch_done", 1 ] ], [ [ "pine_bough", 2 ] ] ] }, @@ -906,7 +906,7 @@ "batch_time_factors": [ 75, 4 ], "autolearn": false, "book_learn": [ [ "textbook_extraction", 2 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "paper", 2 ] ] ] }, { @@ -921,7 +921,7 @@ "batch_time_factors": [ 75, 4 ], "autolearn": false, "book_learn": [ [ "textbook_extraction", 2 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "paper", 2 ] ] ] }, { @@ -986,7 +986,7 @@ "proficiencies": [ { "proficiency": "prof_plasticworking" } ], "tools": [ [ [ "surface_heat", 5, "LIST" ] ] ], "qualities": [ - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "CUT_FINE", "level": 1 }, { "id": "HAMMER", "level": 1 }, { "id": "ANVIL", "level": 1 } @@ -1054,7 +1054,7 @@ "difficulty": 2, "time": "90 m", "book_learn": [ [ "textbook_extraction", 4 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_plasticworking" } ], "using": [ [ "plastic_molding", 1 ] ], "components": [ [ [ "glass_shard", 1 ] ] ] @@ -1070,7 +1070,7 @@ "difficulty": 4, "time": "20 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "CUT_FINE", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "CUT_FINE", "level": 1 } ], "proficiencies": [ { "proficiency": "prof_carving" } ], "components": [ [ [ "2x4", 1 ], [ "stick", 1 ] ] ] }, @@ -1087,7 +1087,7 @@ "time": "30 m", "reversible": true, "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "SEW", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "SEW", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_leatherworking_basic" } ], "components": [ [ [ "leather", 2 ] ], [ [ "superglue", 1 ] ], [ [ "filament", 40, "LIST" ] ] ] }, diff --git a/data/json/recipes/tools/tools_electronic.json b/data/json/recipes/tools/tools_electronic.json index 5ea8d58e6744c..1776aa35ccff8 100644 --- a/data/json/recipes/tools/tools_electronic.json +++ b/data/json/recipes/tools/tools_electronic.json @@ -407,7 +407,7 @@ "decomp_learn": 0, "autolearn": [ [ "electronics", 2 ] ], "book_learn": [ [ "manual_electronics", 1 ], [ "advanced_electronics", 2 ], [ "textbook_anarch", 2 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "SCREW", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "SCREW", "level": 1 } ], "proficiencies": [ { "proficiency": "prof_elec_soldering", "fail_multiplier": 1.125 }, { "proficiency": "prof_elec_circuits" } ], "components": [ [ [ "e_scrap", 2 ], [ "glowplug", 1 ] ], @@ -773,7 +773,7 @@ "decomp_learn": 5, "book_learn": [ [ "textbook_electronics", 7 ], [ "textbook_robots", 6 ] ], "using": [ [ "soldering_standard", 10 ], [ "surface_heat", 20 ], [ "plastic_molding", 3 ] ], - "qualities": [ { "id": "SCREW", "level": 1 }, { "id": "SAW_M", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SCREW", "level": 1 }, { "id": "SAW_M", "level": 1 }, { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_plasticworking", "time_multiplier": 1.5 }, { "proficiency": "prof_elec_soldering" }, diff --git a/data/json/recipes/tools/tools_hand.json b/data/json/recipes/tools/tools_hand.json index dde29bb90c7c1..6135c9ec6d69c 100644 --- a/data/json/recipes/tools/tools_hand.json +++ b/data/json/recipes/tools/tools_hand.json @@ -29,7 +29,7 @@ { "proficiency": "prof_blacksmithing" }, { "proficiency": "prof_toolsmithing" } ], - "qualities": [ { "id": "SAW_M", "level": 2 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SAW_M", "level": 2 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "hotcut", -1 ] ] ], "components": [ [ [ "plastic_chunk", 2 ], [ "2x4", 1 ], [ "stick", 2 ] ] ] }, @@ -271,7 +271,7 @@ "difficulty": 1, "time": "8 m", "autolearn": true, - "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "scrap", 1 ] ], [ [ "2x4", 1 ], [ "stick", 1 ], [ "broom", 1 ], [ "mop", 1 ] ] ] }, { @@ -284,7 +284,7 @@ "difficulty": 1, "time": "8 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "rag", 1 ] ], [ [ "2x4", 1 ], [ "stick", 1 ], [ "broom", 1 ], [ "mop", 1 ] ] ] }, { @@ -534,7 +534,7 @@ "time": "2 m", "byproducts": [ [ "splinter", 1 ] ], "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "hammer_sledge", 1 ] ] ] }, { @@ -1090,7 +1090,7 @@ "time": "1 h", "book_learn": [ [ "plastics_book", 2 ] ], "using": [ [ "plastic_molding", 5 ] ], - "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_plasticworking" } ], "components": [ [ [ "2x4", 1 ], [ "stick", 1 ] ] ] }, @@ -1125,7 +1125,7 @@ "difficulty": 2, "time": "1 h", "book_learn": [ [ "plastics_book", 2 ] ], - "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "CUT", "level": 2 } ], "using": [ [ "plastic_molding", 5 ] ], "proficiencies": [ { "proficiency": "prof_plasticworking" } ], "components": [ [ [ "2x4", 1 ], [ "stick", 1 ] ] ] @@ -1141,7 +1141,7 @@ "time": "25 m", "autolearn": true, "proficiencies": [ { "proficiency": "prof_carving" } ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "2x4", 1 ] ] ] }, { diff --git a/data/json/recipes/tools/tools_primitive.json b/data/json/recipes/tools/tools_primitive.json index bfc8aaa0c155b..579f8a99f4461 100644 --- a/data/json/recipes/tools/tools_primitive.json +++ b/data/json/recipes/tools/tools_primitive.json @@ -70,7 +70,7 @@ "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "SAW_W", "level": 1 }, - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "CHISEL_WOOD", "level": 1 } ], "proficiencies": [ { "proficiency": "prof_carving", "time_multiplier": 3, "fail_multiplier": 1 } ], @@ -94,7 +94,7 @@ "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "SAW_W", "level": 1 }, - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "CHISEL_WOOD", "level": 1 } ], "proficiencies": [ { "proficiency": "prof_carving", "time_multiplier": 3, "fail_multiplier": 1 } ], @@ -173,7 +173,7 @@ "difficulty": 2, "time": "1 h", "autolearn": true, - "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_knapping" }, { "proficiency": "prof_knapping_speed" } ], "components": [ [ [ "stick", 1 ], [ "2x4", 1 ] ], @@ -247,7 +247,7 @@ "time": "10 m", "autolearn": true, "using": [ [ "cordage", 2 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "stick", 4 ], [ "2x4", 2 ] ], [ [ "rock", 1 ], [ "ceramic_shard", 1 ] ] ] }, { @@ -259,7 +259,7 @@ "skill_used": "fabrication", "time": "5 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_carving" } ], "components": [ [ [ "bone_sturdy", 1, "LIST" ] ] ] }, @@ -274,7 +274,7 @@ "autolearn": true, "//": "As of writing, a stick/plank is 130 cm, a splinter is 30 cm, this is intentionally 'generous' because this is rounded up and material tends to be uneven anyways", "byproducts": [ [ "splinter", 4 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_carving" } ], "components": [ [ [ "stick", 1 ], [ "2x4", 1 ] ] ] }, @@ -315,7 +315,7 @@ "category": "CC_OTHER", "subcategory": "CSC_OTHER_TOOLS", "skill_used": "fabrication", - "skills_required": [ "survival", 3 ], + "skills_required": [ "survival", 2 ], "difficulty": 2, "time": "20 m", "autolearn": true, @@ -352,7 +352,7 @@ "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "SAW_W", "level": 1 }, - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "CHISEL_WOOD", "level": 1 } ], "proficiencies": [ { "proficiency": "prof_carving", "time_multiplier": 3, "fail_multiplier": 1 } ], diff --git a/data/json/recipes/weapon/bashing.json b/data/json/recipes/weapon/bashing.json index 295abe281df7e..a4ec75c8049e1 100644 --- a/data/json/recipes/weapon/bashing.json +++ b/data/json/recipes/weapon/bashing.json @@ -11,7 +11,7 @@ "autolearn": true, "using": [ [ "adhesive", 1 ] ], "proficiencies": [ { "proficiency": "prof_carving" }, { "proficiency": "prof_carpentry_basic" } ], - "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "2x4", 1 ] ], [ [ "nail", 5 ] ] ] }, { @@ -25,7 +25,7 @@ "difficulty": 3, "time": "360 m", "autolearn": true, - "qualities": [ { "id": "SAW_W", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SAW_W", "level": 1 }, { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_carving" } ], "tools": [ [ [ "char_smoker", 100 ] ] ], "components": [ [ [ "log", 1 ] ], [ [ "butter", 30 ], [ "edible_lard", 4, "LIST" ] ] ] @@ -104,7 +104,7 @@ "difficulty": 3, "time": "3 h", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_carving" }, { "proficiency": "prof_leatherworking_basic", "fail_multiplier": 1 } ], "components": [ [ [ "2x4", 1 ], [ "stick_long", 1 ] ], [ [ "leather", 5 ] ] ] }, @@ -295,7 +295,7 @@ { "proficiency": "prof_carpentry_basic", "fail_multiplier": 1 }, { "proficiency": "prof_carving", "fail_multiplier": 1 } ], - "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "nail", 16 ] ], [ [ "stick", 1 ], [ "2x4", 1 ] ] ] }, { @@ -354,7 +354,7 @@ "difficulty": 4, "time": "2 h", "book_learn": [ [ "recipe_melee", 3 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_carving" } ], "components": [ [ [ "2x4", 1 ], [ "stick", 2 ] ] ] }, @@ -416,7 +416,7 @@ "difficulty": 7, "time": "5 h 40 m", "book_learn": [ [ "textbook_weapeast", 6 ] ], - "qualities": [ { "id": "SAW_W", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SAW_W", "level": 1 }, { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_carving", "fail_multiplier": 1.5 } ], "//": "Bokken is a single piece of wood, and the stout branch just isn't large enough.", "components": [ @@ -482,7 +482,7 @@ "time": "45 m", "reversible": true, "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "HAMMER", "level": 1 }, { "id": "DRILL", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "HAMMER", "level": 1 }, { "id": "DRILL", "level": 1 } ], "proficiencies": [ { "proficiency": "prof_carving", "time_multiplier": 1.5, "fail_multiplier": 1.15 } ], "components": [ [ [ "stick", 1 ] ], @@ -504,7 +504,7 @@ "reversible": true, "autolearn": true, "proficiencies": [ { "proficiency": "prof_carving", "time_multiplier": 1.5, "fail_multiplier": 1.15 } ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "HAMMER", "level": 1 }, { "id": "DRILL", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "HAMMER", "level": 1 }, { "id": "DRILL", "level": 1 } ], "components": [ [ [ "mace_simple", 1 ] ], [ [ "nail", 2 ] ], [ [ "cordage", 1, "LIST" ], [ "duct_tape", 50 ] ] ] }, { @@ -539,7 +539,7 @@ "difficulty": 2, "time": "18 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_carving" } ], "components": [ [ [ "stick_long", 1 ] ] ] }, diff --git a/data/json/recipes/weapon/cutting.json b/data/json/recipes/weapon/cutting.json index 6c30b870c9397..6f84057683477 100644 --- a/data/json/recipes/weapon/cutting.json +++ b/data/json/recipes/weapon/cutting.json @@ -160,7 +160,7 @@ "time": "45 m", "reversible": true, "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "HAMMER", "level": 1 }, { "id": "DRILL", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "HAMMER", "level": 1 }, { "id": "DRILL", "level": 1 } ], "proficiencies": [ { "proficiency": "prof_carving", "time_multiplier": 1.5, "fail_multiplier": 1.5 } ], "components": [ [ [ "duct_tape", 100 ] ], diff --git a/data/json/recipes/weapon/explosive.json b/data/json/recipes/weapon/explosive.json index a9468d5a8aa19..054f112c9a4f5 100644 --- a/data/json/recipes/weapon/explosive.json +++ b/data/json/recipes/weapon/explosive.json @@ -69,7 +69,7 @@ "time": "1 m", "reversible": true, "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "thread", 10 ] ], [ [ "paper", 1 ], [ "rolling_paper", 6 ] ], @@ -86,7 +86,7 @@ "time": "3 m", "reversible": true, "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "firecracker", 25 ] ], [ [ "paper", 5 ] ], [ [ "cordage_short", 1, "LIST" ] ] ] }, { diff --git a/data/json/recipes/weapon/mods.json b/data/json/recipes/weapon/mods.json index a10d490da916f..eb9fbe115fbf9 100644 --- a/data/json/recipes/weapon/mods.json +++ b/data/json/recipes/weapon/mods.json @@ -571,7 +571,7 @@ "using": [ [ "soldering_standard", 20 ] ], "proficiencies": [ { "proficiency": "prof_plasticworking" } ], "qualities": [ - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "SCREW", "level": 1 }, { "id": "HAMMER_FINE", "level": 1 }, { "id": "SAW_M_FINE", "level": 1 } @@ -602,7 +602,7 @@ "difficulty": 1, "time": "6 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "duct_tape", 75 ] ], [ [ "bottle_twoliter", 1 ] ], [ [ "bottle_plastic", 4 ], [ "bottle_plastic_small", 4 ] ] ] }, { @@ -617,7 +617,7 @@ "time": "10 m", "book_learn": [ [ "mag_archery", 1 ], [ "manual_archery", 1 ] ], "proficiencies": [ { "proficiency": "prof_plasticworking", "required": false, "time_multiplier": 1.5 } ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "plastic_chunk", 1 ], [ "fur", 1 ] ], [ [ "superglue", 1 ], [ "bone_glue", 1 ] ] ] }, { @@ -938,7 +938,7 @@ ], "using": [ [ "soldering_standard", 15 ] ], "proficiencies": [ { "proficiency": "prof_plasticworking" } ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "plastic_chunk", 3 ] ] ] }, { @@ -1017,7 +1017,7 @@ "time": "30 m", "book_learn": [ [ "mag_archery", 3 ], [ "manual_archery", 2 ] ], "using": [ [ "soldering_standard", 10 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_plasticworking" } ], "components": [ [ [ "plastic_chunk", 2 ] ] ] }, @@ -1034,7 +1034,7 @@ "autolearn": true, "book_learn": [ [ "mag_archery", 2 ], [ "manual_archery", 1 ] ], "using": [ [ "soldering_standard", 5 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "plastic_chunk", 1 ] ] ] }, { @@ -1049,7 +1049,7 @@ "book_learn": [ [ "recipe_bows", 3 ], [ "manual_archery", 5 ], [ "book_archery", 4 ] ], "proficiencies": [ { "proficiency": "prof_carving" }, { "proficiency": "prof_gunsmithing_spring" }, { "proficiency": "prof_bowyery" } ], "qualities": [ - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "HAMMER", "level": 2 }, { "id": "SCREW", "level": 1 }, { "id": "WRENCH", "level": 1 } @@ -1075,7 +1075,7 @@ "reversible": true, "autolearn": true, "proficiencies": [ { "proficiency": "prof_leatherworking_basic" } ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "SEW", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "SEW", "level": 1 } ], "components": [ [ [ "filament", 20, "LIST" ], [ "sling", 1 ] ], [ [ "leather", 3 ], [ "fur", 3 ] ] ] }, { diff --git a/data/json/recipes/weapon/piercing.json b/data/json/recipes/weapon/piercing.json index 508d326fbc743..4014ac68ff101 100644 --- a/data/json/recipes/weapon/piercing.json +++ b/data/json/recipes/weapon/piercing.json @@ -272,7 +272,7 @@ { "proficiency": "prof_carving", "fail_multiplier": 1 } ], "using": [ [ "forging_standard", 2 ], [ "bronzesmithing_tools", 1 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "tools": [ [ [ "casting_mold", -1 ] ] ], "components": [ [ [ "scrap_bronze", 4 ] ], @@ -296,7 +296,7 @@ { "proficiency": "prof_carving", "fail_multiplier": 1 } ], "using": [ [ "forging_standard", 1 ], [ "bronzesmithing_tools", 1 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "tools": [ [ [ "casting_mold", -1 ] ] ], "components": [ [ [ "scrap_bronze", 2 ] ], [ [ "stick_long", 1 ] ] ] }, @@ -509,7 +509,7 @@ "difficulty": 3, "time": "30 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "tools": [ [ [ "fire", -1 ] ] ], "proficiencies": [ { "proficiency": "prof_carving", "fail_multiplier": 1 } ], "components": [ @@ -529,7 +529,7 @@ "time": "1 h", "reversible": true, "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "HAMMER", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "HAMMER", "level": 1 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], "proficiencies": [ { "proficiency": "prof_metalworking" }, @@ -554,7 +554,7 @@ "difficulty": 2, "time": "25 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "tools": [ [ [ "fire", -1 ] ] ], "proficiencies": [ { "proficiency": "prof_carving", "fail_multiplier": 1 } ], "components": [ [ [ "stick_long", 1 ], [ "pointy_stick_long", 1 ] ] ] @@ -570,7 +570,7 @@ "time": "30 m", "reversible": true, "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "HAMMER", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "HAMMER", "level": 1 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], "proficiencies": [ { "proficiency": "prof_metalworking" }, @@ -605,7 +605,7 @@ "difficulty": 3, "time": "30 m", "autolearn": true, - "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "CUT", "level": 1 }, { "id": "CUT_FINE", "level": 1 } ], + "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "CUT", "level": 2 }, { "id": "CUT_FINE", "level": 1 } ], "proficiencies": [ { "proficiency": "prof_carving" } ], "components": [ [ [ "stick_long", 1 ] ], [ [ "spike", 1 ] ], [ [ "cordage", 2, "LIST" ], [ "duct_tape", 75 ] ] ] }, @@ -620,7 +620,7 @@ "difficulty": 3, "time": "5 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "tools": [ [ [ "fire", -1 ] ] ], "proficiencies": [ { "proficiency": "prof_carving" } ], "components": [ [ [ "spear_wood", 1 ], [ "pointy_stick", 1 ], [ "pointy_stick_long", 1 ] ] ] @@ -710,7 +710,7 @@ "time": "45 m", "reversible": true, "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "HAMMER", "level": 1 }, { "id": "DRILL", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "HAMMER", "level": 1 }, { "id": "DRILL", "level": 1 } ], "proficiencies": [ { "proficiency": "prof_carving", "time_multiplier": 1.5, "fail_multiplier": 1.15 } ], "components": [ [ [ "stick_long", 1 ], [ "long_pole", 1 ] ], @@ -744,7 +744,7 @@ "reversible": true, "autolearn": true, "proficiencies": [ { "proficiency": "prof_carving", "time_multiplier": 1.5, "fail_multiplier": 1.15 } ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "HAMMER", "level": 1 }, { "id": "DRILL", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "HAMMER", "level": 1 }, { "id": "DRILL", "level": 1 } ], "components": [ [ [ "spear_knife", 1 ] ], [ [ "nail", 2 ] ], [ [ "cordage", 1, "LIST" ], [ "duct_tape", 50 ] ] ] }, { diff --git a/data/json/recipes/weapon/ranged.json b/data/json/recipes/weapon/ranged.json index f5050fe031af2..3a91a7d86f1e0 100644 --- a/data/json/recipes/weapon/ranged.json +++ b/data/json/recipes/weapon/ranged.json @@ -36,7 +36,7 @@ "time": "1 h", "autolearn": true, "proficiencies": [ { "proficiency": "prof_carving" } ], - "qualities": [ { "id": "SAW_W", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SAW_W", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "stick_long", 1 ] ], [ [ "sling", 1 ] ] ] }, { @@ -116,7 +116,7 @@ "book_learn": [ [ "manual_rifle", 5 ], [ "mag_rifle", 6 ] ], "qualities": [ { "id": "ANVIL", "level": 3 }, - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "HAMMER", "level": 3 }, { "id": "SCREW_FINE", "level": 1 }, { "id": "CHISEL", "level": 3 } @@ -145,7 +145,7 @@ "book_learn": [ [ "manual_rifle", 5 ], [ "mag_rifle", 6 ] ], "qualities": [ { "id": "ANVIL", "level": 3 }, - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "HAMMER", "level": 3 }, { "id": "SCREW_FINE", "level": 1 }, { "id": "CHISEL", "level": 3 } @@ -174,7 +174,7 @@ "book_learn": [ [ "manual_rifle", 5 ], [ "mag_rifle", 6 ] ], "qualities": [ { "id": "ANVIL", "level": 3 }, - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "HAMMER", "level": 3 }, { "id": "SCREW_FINE", "level": 1 }, { "id": "CHISEL", "level": 3 } @@ -203,7 +203,7 @@ "book_learn": [ [ "manual_pistol", 5 ], [ "mag_pistol", 6 ] ], "qualities": [ { "id": "ANVIL", "level": 3 }, - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "HAMMER", "level": 3 }, { "id": "SCREW_FINE", "level": 1 }, { "id": "CHISEL", "level": 3 } @@ -586,7 +586,7 @@ "time": "1 h 10 m", "autolearn": true, "using": [ [ "sewing_standard", 40 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_fibers", "time_multiplier": 4, "fail_multiplier": 1 } ], "components": [ [ [ "cordage", 32, "LIST" ] ], [ [ "rock", 8 ] ] ] }, @@ -602,7 +602,7 @@ "reversible": true, "autolearn": true, "proficiencies": [ { "proficiency": "prof_leatherworking_basic" } ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "SEW", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "SEW", "level": 1 } ], "components": [ [ [ "filament", 20, "LIST" ] ], [ [ "leather", 1 ], [ "fur", 1 ] ] ] }, { @@ -631,7 +631,7 @@ "time": "15 m", "autolearn": true, "proficiencies": [ { "proficiency": "prof_carving" } ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "stick", 1 ], [ "2x4", 1 ] ], [ [ "hose", 1 ] ] ] }, { @@ -646,7 +646,7 @@ "reversible": true, "autolearn": true, "proficiencies": [ { "proficiency": "prof_leatherworking_basic" } ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "leather", 20 ] ], [ [ "rope_superior_short", 2, "LIST" ] ] ] }, { @@ -663,7 +663,7 @@ "decomp_learn": 1, "proficiencies": [ { "proficiency": "prof_bowyery" }, { "proficiency": "prof_carving" } ], "book_learn": [ [ "manual_archery", 4 ], [ "recipe_bows", 3 ], [ "book_archery", 4 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "stick_long", 1 ], [ "2x4", 1 ] ], [ [ "cordage_superior", 2, "LIST" ] ] ] }, { @@ -680,7 +680,7 @@ "decomp_learn": 1, "book_learn": [ [ "manual_archery", 6 ], [ "recipe_bows", 5 ], [ "book_archery", 7 ] ], "proficiencies": [ { "proficiency": "prof_bowyery" }, { "proficiency": "prof_carving" } ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "stick_long", 4 ], [ "2x4", 4 ] ], [ [ "cordage_superior", 6, "LIST" ] ] ] }, { @@ -713,7 +713,7 @@ "decomp_learn": 1, "autolearn": true, "book_learn": [ [ "recipe_bows", 1 ], [ "manual_archery", 2 ], [ "book_archery", 2 ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_bowyery" }, { "proficiency": "prof_carving" } ], "components": [ [ [ "stick", 1 ], [ "2x4", 1 ] ], [ [ "cordage_superior", 2, "LIST" ] ] ] }, @@ -731,7 +731,7 @@ "book_learn": [ [ "recipe_bows", 4 ], [ "manual_archery", 5 ] ], "using": [ [ "adhesive", 3 ] ], "proficiencies": [ { "proficiency": "prof_bowyery" }, { "proficiency": "prof_carving" } ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "stick", 3 ], [ "2x4", 2 ] ], [ [ "bone_sturdy", 3, "LIST" ] ], [ [ "cordage_superior", 2, "LIST" ] ] ] }, { @@ -754,7 +754,7 @@ { "proficiency": "prof_plasticworking", "time_multiplier": 1.5, "learning_time_multiplier": 0.25 } ], "qualities": [ - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "SCREW", "level": 1 }, { "id": "HAMMER_FINE", "level": 1 }, { "id": "SAW_M_FINE", "level": 1 }, @@ -851,7 +851,7 @@ "decomp_learn": 3, "book_learn": [ [ "recipe_bows", 3 ], [ "manual_archery", 5 ], [ "book_archery", 4 ] ], "qualities": [ - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "HAMMER", "level": 2 }, { "id": "SCREW", "level": 1 }, { "id": "WRENCH", "level": 1 } @@ -905,7 +905,7 @@ "time": "10 h", "using": [ [ "adhesive", 3 ] ], "book_learn": [ [ "recipe_bows", 5 ], [ "manual_archery", 6 ], [ "book_archery", 6 ], [ "textbook_armschina", 6 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "SCREW", "level": 1 }, { "id": "WRENCH", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "SCREW", "level": 1 }, { "id": "WRENCH", "level": 1 } ], "components": [ [ [ "stick", 5 ], [ "2x4", 3 ] ], [ [ "bone_sturdy", 3, "LIST" ] ], [ [ "cordage_superior", 1, "LIST" ] ] ] }, { @@ -1168,7 +1168,7 @@ { "proficiency": "prof_bladesmith" } ], "using": [ [ "blacksmithing_standard", 3 ], [ "steel_tiny", 3 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "GRIND", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "GRIND", "level": 2 } ], "components": [ [ [ "2x4", 1 ], [ "stick", 1 ] ] ] }, { @@ -1202,7 +1202,7 @@ "decomp_learn": 5, "book_learn": [ [ "recipe_bows", 6 ], [ "textbook_weapwest", 6 ] ], "qualities": [ - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "HAMMER", "level": 1 }, { "id": "SCREW", "level": 1 }, { "id": "WRENCH", "level": 1 }, @@ -1241,7 +1241,7 @@ { "proficiency": "prof_gunsmithing_spring" }, { "proficiency": "prof_carving", "time_multiplier": 1.5 } ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "SCREW", "level": 1 }, { "id": "HAMMER", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "SCREW", "level": 1 }, { "id": "HAMMER", "level": 1 } ], "components": [ [ [ "2x4", 4 ], [ "stick", 8 ] ], [ [ "spring", 1 ] ], [ [ "cordage_superior", 1, "LIST" ] ], [ [ "nail", 20 ] ] ] }, { @@ -1298,7 +1298,7 @@ "reversible": true, "autolearn": true, "proficiencies": [ { "proficiency": "prof_leatherworking_basic" } ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "HAMMER", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "HAMMER", "level": 1 } ], "components": [ [ [ "leather", 30 ], [ "rope_superior_short", 2, "LIST" ] ], [ [ "scrap", 9 ], [ "razor_blade", 9 ] ] ] }, { diff --git a/data/json/requirements/butchery.json b/data/json/requirements/butchery.json index 14e883eebd908..aa3845c8c0e53 100644 --- a/data/json/requirements/butchery.json +++ b/data/json/requirements/butchery.json @@ -7,14 +7,14 @@ { "id": "SURFACE", "level": 3 }, { "id": "ROPE", "level": 2 }, { "id": "SUSPENDING", "level": 2 }, - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "SAW_W", "level": 1 } ] }, { "id": "butchery_large", "type": "requirement", - "qualities": [ { "id": "SURFACE", "level": 3 }, { "id": "CUT", "level": 1 } ] + "qualities": [ { "id": "SURFACE", "level": 3 }, { "id": "CUT", "level": 2 } ] }, { "id": "dissect_large", @@ -24,7 +24,7 @@ { "id": "butchery_small", "type": "requirement", - "qualities": [ { "id": "SURFACE", "level": 2 }, { "id": "CUT", "level": 1 } ] + "qualities": [ { "id": "SURFACE", "level": 2 }, { "id": "CUT", "level": 2 } ] }, { "id": "dissect_small", @@ -34,7 +34,7 @@ { "id": "field_dress", "type": "requirement", - "qualities": [ { "id": "SURFACE", "level": 2 }, { "id": "CUT", "level": 1 } ] + "qualities": [ { "id": "SURFACE", "level": 2 }, { "id": "CUT", "level": 2 } ] }, { "id": "full_butchery_large_no_surface", @@ -43,14 +43,14 @@ "qualities": [ { "id": "ROPE", "level": 2 }, { "id": "SUSPENDING", "level": 2 }, - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "SAW_W", "level": 1 } ] }, { "id": "butchery_large_no_surface", "type": "requirement", - "qualities": [ { "id": "CUT", "level": 1 } ] + "qualities": [ { "id": "CUT", "level": 2 } ] }, { "id": "dissect_large_no_surface", @@ -60,7 +60,7 @@ { "id": "butchery_small_no_surface", "type": "requirement", - "qualities": [ { "id": "CUT", "level": 1 } ] + "qualities": [ { "id": "CUT", "level": 2 } ] }, { "id": "dissect_small_no_surface", @@ -70,16 +70,16 @@ { "id": "field_dress_no_surface", "type": "requirement", - "qualities": [ { "id": "CUT", "level": 1 } ] + "qualities": [ { "id": "CUT", "level": 2 } ] }, { "id": "bleed_large", "type": "requirement", - "qualities": [ { "id": "ROPE", "level": 2 }, { "id": "SUSPENDING", "level": 2 }, { "id": "CUT", "level": 1 } ] + "qualities": [ { "id": "ROPE", "level": 2 }, { "id": "SUSPENDING", "level": 2 }, { "id": "CUT", "level": 2 } ] }, { "id": "bleed_small", "type": "requirement", - "qualities": [ { "id": "CUT", "level": 1 } ] + "qualities": [ { "id": "CUT", "level": 2 } ] } ] diff --git a/data/json/requirements/tailoring.json b/data/json/requirements/tailoring.json index 0300a8bb515cf..dc14733f92742 100644 --- a/data/json/requirements/tailoring.json +++ b/data/json/requirements/tailoring.json @@ -3,7 +3,7 @@ "id": "armor_acidchitin", "type": "requirement", "//": "Shaping and attaching a biosillicified chitin plate to something, per 112 g of biosillicified chitin. Time needed is 10 minutes per unit. In the future when we have some bases, we should also add the requirement for a weak base to neutralize the chitin before crafting with it.", - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "SEW", "level": 1 }, { "id": "LEATHER_AWL", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "SEW", "level": 1 }, { "id": "LEATHER_AWL", "level": 1 } ], "components": [ [ [ "acidchitin_piece", 1 ] ], [ [ "filament", 1, "LIST" ] ] ] }, { @@ -17,21 +17,21 @@ "id": "armor_chitin", "type": "requirement", "//": "Shaping and attaching a chitin plate to something, per 90 g of chitin. Time needed is 10 minutes per unit.", - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "SEW", "level": 1 }, { "id": "LEATHER_AWL", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "SEW", "level": 1 }, { "id": "LEATHER_AWL", "level": 1 } ], "components": [ [ [ "chitin_piece", 1 ] ], [ [ "filament", 1, "LIST" ] ] ] }, { "id": "armor_kevlar_rigid", "type": "requirement", "//": "Shaping and attaching a rigid Kevlar plate to something, per 300 g of rigid Kevlar. Time needed is 10 minutes per unit.", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "rigid_kevlar_plate", 1 ] ], [ [ "superglue", 1 ] ] ] }, { "id": "armor_kevlar_layered", "type": "requirement", "//": "Joining kevlar panels together into something like a kevlar vest or other armor per 80 g of Kevlar. Time needed is 90 minutes per unit.", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "sheet_kevlar_layered", 1 ] ], [ [ "filament", 4, "LIST" ] ] ] }, { @@ -51,14 +51,14 @@ "id": "armor_paper_lamellar", "type": "requirement", "//": "Layering paper sheets, cutting holes in them, laminating them with glue, and connecting multiple of resulting plates with cordage, per 162 g of paper. Time needed is 50 minutes per unit.", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "paper", 50 ] ], [ [ "superglue", 1 ], [ "bone_glue", 1 ] ], [ [ "cordage_short", 2, "LIST" ] ] ] }, { "id": "armor_wood", "type": "requirement", "//": "Shaping and tying together multiple wood pieces of same size with lots of cordage, per 1463 g of wood. Time needed is 30 minutes per unit. Works for lamellar wooden armor as well as for planks tied to limbs.", - "qualities": [ { "id": "SAW_W", "level": 2 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SAW_W", "level": 2 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "2x4", 1 ] ], [ [ "cordage", 2, "LIST" ] ] ] }, { @@ -71,14 +71,14 @@ "id": "strap_small", "type": "requirement", "//": "A small piece of fabric or leather to strap something firmly to the body. Stronger than a bit of string.", - "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "rag", 1 ], [ "leather", 1 ], [ "fur", 1 ] ] ] }, { "id": "strap_large", "type": "requirement", "//": "A long piece of fabric or leather to strap something firmly to the body. Stronger than a bit of string.", - "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "cordage_short", 1, "LIST" ], [ "leather", 2 ], [ "fur", 2 ] ] ] }, { @@ -205,7 +205,7 @@ "id": "plastic_molding", "type": "requirement", "//": "Melting and reshaping plastic items through the use of vacuum forming molds, per 70 g of plastic. Usually takes 30 minutes per unit.", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "tools": [ [ [ "makeshift_vacuum_mold", 4 ], [ "vac_mold", 2 ] ], [ [ "surface_heat", 5, "LIST" ] ] ], "components": [ [ [ "polycarbonate_sheet", 1 ] ] ] }, @@ -213,7 +213,7 @@ "id": "tailoring_cotton", "type": "requirement", "//": "Crafting cotton items, per 101 g of cotton; 10 g + excessive weight of material is wasted, producing rags and cotton scraps as byproducts. Time needed is usually 90 minutes per unit if hand-stitching.", - "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "sheet_cotton", 22 ] ], [ [ "filament", 1, "LIST" ] ] ] }, { @@ -227,126 +227,126 @@ "id": "tailoring_cotton_patchwork", "type": "requirement", "//": "Crafting possibly-patchwork cotton items, per 101 g of cotton; 10 g + excessive weight of material is wasted, producing rags and cotton scraps as byproducts. Time needed is usually 90 minutes per unit if hand-stitching (most of the time actually needed goes into making a patchwork sheet)", - "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "sheet_cotton", 22 ], [ "sheet_cotton_patchwork", 1 ] ], [ [ "filament", 1, "LIST" ] ] ] }, { "id": "tailoring_faux_fur", "type": "requirement", "//": "Crafting faux fur items, per 201 g of faux fur; 20 g + excessive weight of material is wasted, producing faux fur patches and scraps. Time needed is usually 90 minutes per unit if hand-stitching.", - "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "sheet_faux_fur", 22 ] ], [ [ "filament", 1, "LIST" ] ] ] }, { "id": "tailoring_faux_fur_patchwork", "type": "requirement", "//": "Crafting possibly-patchwork faux fur items, per 201 g of faux fur; 20 g + excessive weight of material is wasted, producing faux fur patches and scraps. Time needed is usually 90 minutes per unit if hand-stitching (most of the time actually needed goes into making a patchwork sheet).", - "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "sheet_faux_fur", 22 ], [ "sheet_faux_fur_patchwork", 1 ] ], [ [ "filament", 1, "LIST" ] ] ] }, { "id": "tailoring_felt", "type": "requirement", "//": "Crafting felt items (not via knitting), per 161 g of wool; 16 g + excessive weight of material is wasted, producing felt patches as byproducts. Time needed is usually 90 minutes per unit if hand-stitching.", - "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "sheet_felt", 22 ] ], [ [ "filament", 1, "LIST" ] ] ] }, { "id": "tailoring_felt_patchwork", "type": "requirement", "//": "Crafting possibly-patchwork felt items (not via knitting), per 161 g of wool; 16 g + excessive weight of material is wasted, producing felt patches as byproducts. Time needed is usually 90 minutes per unit if hand-stitching. (most of the time actually needed goes into making a patchwork sheet)", - "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "sheet_felt", 22 ], [ "sheet_felt_patchwork", 1 ] ], [ [ "filament", 1, "LIST" ] ] ] }, { "id": "tailoring_fur", "type": "requirement", "//": "Crafting fur items, per 415 g of fur; 273 g + excessive weight of material is wasted, producing fur patches as byproducts. Time needed is usually 360 minutes per unit if hand-stitching.", - "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 1 }, { "id": "LEATHER_AWL", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 2 }, { "id": "LEATHER_AWL", "level": 1 } ], "components": [ [ [ "tanned_pelt", 1 ] ], [ [ "filament", 4, "LIST" ] ] ] }, { "id": "tailoring_fur_small", "type": "requirement", "//": "Crafting either small or patchwork fur items, per 92 g of fur; 23 g + excessive weight of material is wasted, producing fur patches as byproducts. Time needed is usually 180 minutes per unit if hand-stitching.", - "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 1 }, { "id": "LEATHER_AWL", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 2 }, { "id": "LEATHER_AWL", "level": 1 } ], "components": [ [ [ "fur", 1 ] ], [ [ "filament", 1, "LIST" ] ] ] }, { "id": "tailoring_kevlar_fabric", "type": "requirement", "//": "Crafting Kevlar items, per 101 g of Kevlar; 10 g + excessive weight of material is wasted, producing Kevlar scraps as byproducts. Time needed is usually 90 minutes per unit if hand-stitching.", - "qualities": [ { "id": "SEW", "level": 2 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 2 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "sheet_kevlar", 22 ] ], [ [ "filament", 1, "LIST" ] ] ] }, { "id": "tailoring_leather", "type": "requirement", "//": "Crafting leather items, per 364 g of leather; 240 g + excessive weight of material is wasted, producing leather patches as byproducts. Time needed is usually 360 minutes per unit if hand-stitching.", - "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 1 }, { "id": "LEATHER_AWL", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 2 }, { "id": "LEATHER_AWL", "level": 1 } ], "components": [ [ [ "tanned_hide", 1 ] ], [ [ "filament", 4, "LIST" ] ] ] }, { "id": "tailoring_leather_small", "type": "requirement", "//": "Crafting either small or patchwork leather items, per 81 g of leather; 20 g + excessive weight of material is wasted, producing leather patches as byproducts. Time needed is usually 180 minutes per unit if hand-stitching.", - "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 1 }, { "id": "LEATHER_AWL", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 2 }, { "id": "LEATHER_AWL", "level": 1 } ], "components": [ [ [ "leather", 1 ] ], [ [ "filament", 1, "LIST" ] ] ] }, { "id": "tailoring_lycra", "type": "requirement", "//": "Crafting Lycra items, per 55 g of Lycra; 6 g + excessive weight of material is wasted, producing Lycra scraps as byproducts. Time needed is usually 90 minutes per unit if hand-stitching.", - "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "sheet_lycra", 22 ] ], [ [ "thread_nomex", 1 ] ] ] }, { "id": "tailoring_lycra_patchwork", "type": "requirement", "//": "Crafting possibly-patchwork Lycra items, per 55 g of Lycra; 6 g + excessive weight of material is wasted, producing Lycra scraps as byproducts. Time needed is usually 90 minutes per unit if hand-stitching (most of the time actually needed goes into making a patchwork sheet).", - "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "sheet_lycra", 22 ], [ "sheet_lycra_patchwork", 1 ] ], [ [ "thread_nomex", 1 ] ] ] }, { "id": "tailoring_neoprene", "type": "requirement", "//": "Crafting neoprene items, per 121 g of neoprene; 12 g + excessive weight of material is wasted, producing neoprene scraps as byproducts. Superglue and duct tape will usually be needed for extra waterproofing. Time needed is usually 100 minutes per unit if hand-stitching.", - "qualities": [ { "id": "SEW_CURVED", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SEW_CURVED", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "sheet_neoprene", 22 ] ], [ [ "filament", 1, "LIST" ] ] ] }, { "id": "tailoring_neoprene_patchwork", "type": "requirement", "//": "Crafting possibly-patchwork neoprene items, per 121 g of neoprene; 12 g + excessive weight of material is wasted, producing neoprene scraps as byproducts. Superglue and duct tape will usually be needed for extra waterproofing. Time needed is usually 100 minutes per unit if hand-stitching (most of the time actually needed goes into making a patchwork sheet).", - "qualities": [ { "id": "SEW_CURVED", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SEW_CURVED", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "sheet_neoprene", 22 ], [ "sheet_neoprene_patchwork", 1 ] ], [ [ "filament", 1, "LIST" ] ] ] }, { "id": "tailoring_nomex", "type": "requirement", "//": "Crafting Nomex items, per 101 g of Nomex; 10 g + excessive weight of material is wasted, producing Nomex scraps as byproducts. Time needed is usually 90 minutes per unit if hand-stitching.", - "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "sheet_nomex", 22 ] ], [ [ "thread_nomex", 1 ] ] ] }, { "id": "tailoring_nomex_patchwork", "type": "requirement", "//": "Crafting possibly-patchwork Nomex items, per 101 g of Nomex; 10 g + excessive weight of material is wasted, producing Nomex scraps as byproducts. Time needed is usually 90 minutes per unit if hand-stitching.", - "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "sheet_nomex", 22 ], [ "sheet_nomex_patchwork", 1 ] ], [ [ "thread_nomex", 1 ] ] ] }, { "id": "tailoring_nylon", "type": "requirement", "//": "Crafting synthetic fabric items, per 55 g of neoprene; 6 g + excessive weight of material is wasted, producing synthetic fabric scraps as byproducts. Time needed is usually 90 minutes per unit if hand-stitching.", - "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "sheet_nylon", 22 ] ], [ [ "filament", 1, "LIST" ] ] ] }, { "id": "tailoring_nylon_patchwork", "type": "requirement", "//": "Crafting possibly-patchwork synthetic fabric items, per 55 g of neoprene; 6 g + excessive weight of material is wasted, producing synthetic fabric scraps as byproducts. Time needed is usually 90 minutes per unit if hand-stitching (most of the time actually needed goes into making a patchwork sheet).", - "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "sheet_nylon", 22 ] ], [ [ "sheet_nylon_patchwork", 1 ] ], [ [ "filament", 1, "LIST" ] ] ] }, { @@ -360,7 +360,7 @@ "id": "waterproofing_cloth", "type": "requirement", "//": "Waterproofing cloth items, per 500 ml of waterproofed cloth. Takes 360 minutes, doesn't depend on amount. Duct tape is needed to waterproof seams.", - "qualities": [ { "id": "COOK", "level": 3 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "COOK", "level": 3 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "water_boiling_heat", 2, "LIST" ] ] ], "components": [ [ [ "chem_potassium_alum", 50 ] ], @@ -373,7 +373,7 @@ "id": "waterproofing_plastic_bags", "type": "requirement", "//": "Making a waterproof layer from plastic bags duct taped together, per 25 g of such waterproofing. Takes 15 minutes per unit.", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "bag_plastic", 1 ] ], [ [ "duct_tape", 5 ] ] ] } ] diff --git a/data/json/requirements/toolsets.json b/data/json/requirements/toolsets.json index c4a9be071966f..6547210c16750 100644 --- a/data/json/requirements/toolsets.json +++ b/data/json/requirements/toolsets.json @@ -63,7 +63,7 @@ "id": "sewing_standard", "type": "requirement", "//": "Crafting or repair of fabric items", - "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "filament", 1, "LIST" ] ] ] }, { diff --git a/data/json/uncraft/armor.json b/data/json/uncraft/armor.json index 736fb791a6593..856e3599ace2b 100644 --- a/data/json/uncraft/armor.json +++ b/data/json/uncraft/armor.json @@ -100,7 +100,7 @@ "type": "uncraft", "activity_level": "LIGHT_EXERCISE", "time": "2 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "lycra_patch", 1 ] ] ] }, { @@ -108,7 +108,7 @@ "type": "uncraft", "activity_level": "LIGHT_EXERCISE", "time": "2 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "rag", 2 ] ], [ [ "wire", 1 ] ], [ [ "button_plastic", 9 ] ] ] } ] diff --git a/data/json/uncraft/armor/pets_dog.json b/data/json/uncraft/armor/pets_dog.json index 59558d0d09d7c..e3d47b077fb74 100644 --- a/data/json/uncraft/armor/pets_dog.json +++ b/data/json/uncraft/armor/pets_dog.json @@ -16,7 +16,7 @@ "skill_used": "tailor", "difficulty": 1, "time": "15 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "alloy_sheet", 6 ] ] ] } ] diff --git a/data/json/uncraft/armor/storage.json b/data/json/uncraft/armor/storage.json index 393906d14f1fe..346cff6777b62 100644 --- a/data/json/uncraft/armor/storage.json +++ b/data/json/uncraft/armor/storage.json @@ -6,7 +6,7 @@ "skill_used": "tailor", "difficulty": 1, "time": "30 s", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "leather", 5 ] ], [ [ "scrap", 3 ] ] ] }, { @@ -16,7 +16,7 @@ "skill_used": "tailor", "difficulty": 1, "time": "30 s", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "leather", 6 ] ], [ [ "scrap", 3 ] ] ] } ] diff --git a/data/json/uncraft/armor/suit.json b/data/json/uncraft/armor/suit.json index 2851165711425..995ac49cd8423 100644 --- a/data/json/uncraft/armor/suit.json +++ b/data/json/uncraft/armor/suit.json @@ -6,7 +6,7 @@ "skill_used": "tailor", "difficulty": 3, "time": "10 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "rag", 33 ] ], [ [ "leather", 35 ] ], [ [ "scrap", 24 ] ], [ [ "sheet_kevlar_layered", 48 ] ] ] }, { @@ -16,7 +16,7 @@ "skill_used": "tailor", "difficulty": 3, "time": "5 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "rag", 23 ] ], [ [ "leather", 25 ] ], [ [ "scrap", 12 ] ], [ [ "sheet_kevlar_layered", 24 ] ] ] } ] diff --git a/data/json/uncraft/generic.json b/data/json/uncraft/generic.json index 9489b10b0a64f..87f186c4d2797 100644 --- a/data/json/uncraft/generic.json +++ b/data/json/uncraft/generic.json @@ -13,7 +13,7 @@ "skill_used": "fabrication", "difficulty": 1, "time": "20 s", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "incendiary", 75 ] ] ] }, { @@ -62,7 +62,7 @@ "skill_used": "tailor", "difficulty": 1, "time": "22 s", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "rag", 60 ] ], [ [ "sheet", 4 ] ], [ [ "spring", 4 ] ], [ [ "wire", 20 ] ] ] }, { @@ -88,7 +88,7 @@ "activity_level": "MODERATE_EXERCISE", "skill_used": "tailor", "time": "2 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "thread", 1 ] ] ], "flags": [ "UNCRAFT_SINGLE_CHARGE" ] }, @@ -107,7 +107,7 @@ "activity_level": "MODERATE_EXERCISE", "skill_used": "fabrication", "time": "4 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "chunk_rubber", 3 ] ] ] }, { @@ -116,7 +116,7 @@ "activity_level": "MODERATE_EXERCISE", "skill_used": "fabrication", "time": "5 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "rubber_tire_strip", 1 ] ] ] }, { @@ -125,7 +125,7 @@ "activity_level": "MODERATE_EXERCISE", "skill_used": "fabrication", "time": "7 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "rubber_tire_strip", 2 ] ] ] }, { @@ -134,7 +134,7 @@ "activity_level": "MODERATE_EXERCISE", "skill_used": "fabrication", "time": "5 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "rubber_tire_strip", 1 ] ] ] }, { @@ -143,7 +143,7 @@ "activity_level": "MODERATE_EXERCISE", "skill_used": "fabrication", "time": "5 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "rubber_tire_strip", 1 ] ] ] }, { @@ -152,7 +152,7 @@ "activity_level": "MODERATE_EXERCISE", "skill_used": "fabrication", "time": "10 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "rubber_tire_strip", 3 ] ] ] }, { @@ -161,7 +161,7 @@ "activity_level": "MODERATE_EXERCISE", "skill_used": "fabrication", "time": "10 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "rubber_tire_strip", 3 ] ] ] }, { @@ -170,7 +170,7 @@ "activity_level": "MODERATE_EXERCISE", "skill_used": "fabrication", "time": "5 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "rubber_tire_chunk", 3 ] ] ] }, { @@ -179,7 +179,7 @@ "activity_level": "MODERATE_EXERCISE", "skill_used": "fabrication", "time": "5 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "rubber_tire_chunk", 3 ] ] ] }, { @@ -188,7 +188,7 @@ "activity_level": "MODERATE_EXERCISE", "skill_used": "fabrication", "time": "5 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "rubber_tire_chunk", 5 ] ] ] }, { diff --git a/data/json/uncraft/tools.json b/data/json/uncraft/tools.json index 7cdf65c4682bd..a5bb2df53909c 100644 --- a/data/json/uncraft/tools.json +++ b/data/json/uncraft/tools.json @@ -6,7 +6,7 @@ "skill_used": "fabrication", "difficulty": 1, "time": "50 s", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ [ { "id": "CUT", "level": 2 }, { "id": "HAMMER", "level": 2 } ] ], "components": [ [ [ "splinter", 1 ] ] ] }, { @@ -26,7 +26,7 @@ "skill_used": "fabrication", "difficulty": 1, "time": "30 s", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "hose", 3 ] ] ] }, { @@ -36,7 +36,7 @@ "skill_used": "fabrication", "difficulty": 1, "time": "30 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "plastic_chunk", 1 ] ], [ [ "steel_lump", 1 ] ], [ [ "e_scrap", 1 ] ], [ [ "motor_micro", 1 ] ] ] }, { @@ -157,7 +157,7 @@ "skill_used": "fabrication", "difficulty": 1, "time": "30 s", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "plastic_chunk", 3 ] ] ] }, { @@ -167,7 +167,7 @@ "skill_used": "fabrication", "difficulty": 1, "time": "30 s", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "plastic_chunk", 4 ] ], [ [ "scrap", 1 ] ] ] }, { @@ -177,7 +177,7 @@ "skill_used": "fabrication", "difficulty": 1, "time": "30 s", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "plastic_chunk", 4 ] ], [ [ "lens", 1 ] ], [ [ "wire", 1 ] ] ] }, { @@ -187,7 +187,7 @@ "skill_used": "fabrication", "difficulty": 1, "time": "5 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "plastic_chunk", 4 ] ], [ [ "lens", 1 ] ], [ [ "lens", 1 ], [ "lens_small", 1 ] ], [ [ "spring", 1 ] ] ] } ] diff --git a/data/json/vehicleparts/vehicle_parts.json b/data/json/vehicleparts/vehicle_parts.json index 9eae4635edc37..c635e4879b6d9 100644 --- a/data/json/vehicleparts/vehicle_parts.json +++ b/data/json/vehicleparts/vehicle_parts.json @@ -1029,7 +1029,7 @@ "location": "under", "requirements": { "install": { "skills": [ [ "fabrication", 1 ] ], "time": "30 m", "using": [ [ "rope_natural_short", 2 ] ] }, - "removal": { "skills": [ [ "fabrication", 1 ] ], "time": "15 m", "qualities": [ { "id": "CUT", "level": 1 } ] }, + "removal": { "skills": [ [ "fabrication", 1 ] ], "time": "15 m", "qualities": [ { "id": "CUT", "level": 2 } ] }, "repair": { "skills": [ [ "fabrication", 2 ] ], "time": "15 m", "using": [ [ "rope_natural_short", 1 ] ] } }, "flags": [ "FLOATS" ], @@ -2464,7 +2464,7 @@ "location": "center", "requirements": { "install": { "skills": [ [ "mechanics", 1 ] ], "time": "30 m", "using": [ [ "rope_natural_short", 2 ] ] }, - "removal": { "skills": [ [ "mechanics", 1 ] ], "time": "15 m", "qualities": [ { "id": "CUT", "level": 1 } ] }, + "removal": { "skills": [ [ "mechanics", 1 ] ], "time": "15 m", "qualities": [ { "id": "CUT", "level": 2 } ] }, "repair": { "skills": [ [ "mechanics", 2 ] ], "time": "30 m", "using": [ [ "rope_natural_short", 1 ] ] } }, "flags": [ "SEAT", "BOARDABLE", "BELTABLE" ], diff --git a/data/mods/Aftershock/items/comestibles/bug_brew.json b/data/mods/Aftershock/items/comestibles/bug_brew.json index b4cc64ef268ed..8fbcf8b84a655 100644 --- a/data/mods/Aftershock/items/comestibles/bug_brew.json +++ b/data/mods/Aftershock/items/comestibles/bug_brew.json @@ -119,7 +119,7 @@ "batch_time_factors": [ 80, 4 ], "flags": [ "BLIND_HARD", "ALLOW_ROTTEN" ], "book_learn": { "afs_bugbrew_book": { "skill_level": 1 } }, - "qualities": [ { "id": "BOIL", "level": 1 }, { "id": "CHEM", "level": 2 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "BOIL", "level": 1 }, { "id": "CHEM", "level": 2 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], "components": [ [ [ "water", 6 ], [ "water_clean", 6 ] ], diff --git a/data/mods/Aftershock/items/tools.json b/data/mods/Aftershock/items/tools.json index 54e5a69e5f798..2e9263db4543f 100644 --- a/data/mods/Aftershock/items/tools.json +++ b/data/mods/Aftershock/items/tools.json @@ -194,7 +194,7 @@ "turns_per_charge": 3, "revert_to": "afs_power_cutter", "use_action": { "target": "afs_power_cutter", "msg": "Your power cutter falls quiet.", "menu_text": "Turn off", "type": "transform" }, - "qualities": [ [ "CUT", 1 ], [ "SAW_M", 5 ], [ "SAW_M_FINE", 1 ], [ "BUTCHER", -70 ] ], + "qualities": [ [ "CUT", 2 ], [ "SAW_M", 5 ], [ "SAW_M_FINE", 1 ], [ "BUTCHER", -70 ] ], "flags": [ "ALWAYS_TWOHAND", "MESSY", "TRADER_AVOID", "NONCONDUCTIVE" ] }, { @@ -230,7 +230,7 @@ "turns_per_charge": 5, "revert_to": "afs_murdersaw", "use_action": { "target": "afs_murdersaw", "msg": "Your murdersaw falls quiet.", "menu_text": "Turn off", "type": "transform" }, - "qualities": [ [ "CUT", 1 ], [ "SAW_M", 1 ], [ "BUTCHER", -50 ] ], + "qualities": [ [ "CUT", 2 ], [ "SAW_M", 1 ], [ "BUTCHER", -50 ] ], "flags": [ "ALWAYS_TWOHAND", "MESSY", "TRADER_AVOID", "NONCONDUCTIVE" ] }, { diff --git a/data/mods/Aftershock/items/weapons.json b/data/mods/Aftershock/items/weapons.json index ecafdc203d4cc..abd9c96e1edcf 100644 --- a/data/mods/Aftershock/items/weapons.json +++ b/data/mods/Aftershock/items/weapons.json @@ -239,7 +239,7 @@ "material": [ "ceramic", "plastic" ], "symbol": "/", "color": "dark_gray", - "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 5 ] ], + "qualities": [ [ "CUT", 2 ], [ "BUTCHER", 5 ] ], "flags": [ "SHEATH_KNIFE", "DURABLE_MELEE", "STAB" ] }, { diff --git a/data/mods/Aftershock/recipes/comestible_recipes.json b/data/mods/Aftershock/recipes/comestible_recipes.json index 1ff2d6c2bcff6..8022dba1186a6 100644 --- a/data/mods/Aftershock/recipes/comestible_recipes.json +++ b/data/mods/Aftershock/recipes/comestible_recipes.json @@ -179,7 +179,7 @@ "time": "10 m", "charges": 12, "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 7, "LIST" ] ] ], "components": [ [ [ "alien_fat", 3 ] ], [ [ "water", 1 ], [ "water_clean", 1 ] ] ] }, @@ -195,7 +195,7 @@ "time": "10 m", "charges": 3, "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 7, "LIST" ] ] ], "components": [ [ [ "alien_fat", 2 ] ] ] }, @@ -210,7 +210,7 @@ "time": "10 m", "charges": 12, "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 7, "LIST" ] ] ], "components": [ [ [ "frost_human_fat", 3 ] ], [ [ "water", 1 ], [ "water_clean", 1 ] ] ] }, @@ -226,7 +226,7 @@ "time": "10 m", "charges": 3, "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 7, "LIST" ] ] ], "components": [ [ [ "frost_human_fat", 2 ] ] ] } diff --git a/data/mods/Aftershock/recipes/recipe_overrides.json b/data/mods/Aftershock/recipes/recipe_overrides.json index 40b3045537b47..43c5476c6237d 100644 --- a/data/mods/Aftershock/recipes/recipe_overrides.json +++ b/data/mods/Aftershock/recipes/recipe_overrides.json @@ -137,7 +137,7 @@ "charges": 1, "time": 20000, "book_learn": [ [ "mag_cooking", 4 ], [ "mag_glam", 5 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 20, "LIST" ] ] ], "components": [ [ [ "liver", 3 ] ], [ [ "salt", 1 ] ], [ [ "sweet_fruit_like", 1, "LIST" ] ], [ [ "vinegar", 2 ] ] ] }, @@ -154,7 +154,7 @@ "book_learn": [ [ "cookbook", 1 ], [ "scots_cookbook", 2 ] ], "difficulty": 3, "batch_time_factors": [ 80, 1 ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], "components": [ [ [ "stomach", 1 ] ], [ [ "batter", 3, "LIST" ] ], [ [ "cooking_oil", 4 ], [ "cooking_oil2", 4 ] ] ] }, @@ -168,7 +168,7 @@ "difficulty": 4, "time": 25000, "book_learn": [ [ "cookbook", 2 ] ], - "qualities": [ { "id": "COOK", "level": 2 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "COOK", "level": 2 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "surface_heat", 25, "LIST" ] ] ], "components": [ [ [ "brain", 2 ] ], @@ -190,7 +190,7 @@ "time": 60000, "charges": 1, "book_learn": [ [ "cookbook", 2 ], [ "family_cookbook", 2 ] ], - "qualities": [ { "id": "COOK", "level": 3 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "COOK", "level": 3 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "surface_heat", 60, "LIST" ] ] ], "components": [ [ [ "kidney", 2 ] ], diff --git a/data/mods/Aftershock/recipes/recipes.json b/data/mods/Aftershock/recipes/recipes.json index 089c63a4352da..5582c172679ff 100644 --- a/data/mods/Aftershock/recipes/recipes.json +++ b/data/mods/Aftershock/recipes/recipes.json @@ -84,7 +84,7 @@ "difficulty": 4, "time": 30000, "autolearn": true, - "qualities": [ { "id": "SAW_M", "level": 1 }, { "id": "CUT", "level": 1 }, { "id": "SCREW", "level": 1 } ], + "qualities": [ { "id": "SAW_M", "level": 1 }, { "id": "CUT", "level": 2 }, { "id": "SCREW", "level": 1 } ], "components": [ [ [ "afs_power_cutter", 1 ] ], [ [ "steel_chunk", 3 ], [ "scrap", 6 ] ] ], "byproducts": [ [ "plastic_chunk" ], [ "plastic_chunk" ] ] }, diff --git a/data/mods/CRT_EXPANSION/items/crt_tools.json b/data/mods/CRT_EXPANSION/items/crt_tools.json index 594c7620d2127..40bbc1626cd5c 100644 --- a/data/mods/CRT_EXPANSION/items/crt_tools.json +++ b/data/mods/CRT_EXPANSION/items/crt_tools.json @@ -42,7 +42,7 @@ "bashing": 8, "to_hit": 2, "symbol": ";", - "qualities": [ [ "PRY", 1 ], [ "CUT", 1 ], [ "CUT_FINE", 1 ] ], + "qualities": [ [ "PRY", 1 ], [ "CUT", 2 ], [ "CUT_FINE", 1 ] ], "use_action": [ "CROWBAR" ], "flags": [ "SHEATH_KNIFE", "UNARMED_WEAPON", "STAB", "UNBREAKABLE_MELEE" ], "techniques": [ "WBLOCK_2", "UHAND", "PROD" ] @@ -151,7 +151,7 @@ "to_hit": 1, "category": "weapons", "use_action": { "type": "transform", "menu_text": "Extend", "msg": "You extend your hatchet", "target": "crt_hatchet_extended" }, - "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 15 ] ] + "qualities": [ [ "CUT", 2 ], [ "BUTCHER", 15 ] ] }, { "type": "GENERIC", @@ -172,7 +172,7 @@ "to_hit": 2, "category": "weapons", "use_action": { "type": "transform", "menu_text": "Collapse", "msg": "You collapse your axe", "target": "crt_hatchet" }, - "qualities": [ [ "AXE", 2 ], [ "CUT", 1 ], [ "HAMMER", 2 ], [ "HAMMER_FINE", 1 ], [ "BUTCHER", 15 ] ] + "qualities": [ [ "AXE", 2 ], [ "CUT", 2 ], [ "HAMMER", 2 ], [ "HAMMER_FINE", 1 ], [ "BUTCHER", 15 ] ] }, { "id": "crt_etool", diff --git a/data/mods/Dark-Skies-Above/obsolete.json b/data/mods/Dark-Skies-Above/obsolete.json index b30c457cd2b1d..20a1b3f316b0f 100644 --- a/data/mods/Dark-Skies-Above/obsolete.json +++ b/data/mods/Dark-Skies-Above/obsolete.json @@ -17,7 +17,7 @@ "charges_per_use": 1, "max_charges": 50, "techniques": [ "WBLOCK_1", "WIDE", "BRUTAL", "SWEEP" ], - "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 1 ] ], + "qualities": [ [ "CUT", 2 ], [ "BUTCHER", 1 ] ], "flags": [ "DURABLE_MELEE", "SHEATH_SWORD", "ALWAYS_TWOHAND" ] }, { @@ -37,7 +37,7 @@ "cutting": 31, "to_hit": 1, "category": "weapons", - "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 8 ] ], + "qualities": [ [ "CUT", 2 ], [ "BUTCHER", 8 ] ], "flags": [ "DURABLE_MELEE", "SHEATH_SWORD" ] }, { diff --git a/data/mods/DinoMod/recipes/pets_elephant.json b/data/mods/DinoMod/recipes/pets_elephant.json index 40286f6185d26..79f5bac42c239 100644 --- a/data/mods/DinoMod/recipes/pets_elephant.json +++ b/data/mods/DinoMod/recipes/pets_elephant.json @@ -148,7 +148,7 @@ "skills_required": [ "fabrication", 3 ], "time": "200 m", "autolearn": true, - "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "duct_tape", 250 ] ], [ [ "coat_rain", 15 ] ] ] }, { @@ -162,7 +162,7 @@ "skills_required": [ "fabrication", 3 ], "time": "400 m", "autolearn": true, - "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "duct_tape", 700 ] ], [ [ "bag_plastic", 150 ] ], [ [ "rag", 150 ] ] ] }, { diff --git a/data/mods/DinoMod/recipes/pets_ostrich.json b/data/mods/DinoMod/recipes/pets_ostrich.json index 05a18b8394797..08a81d4a876f2 100644 --- a/data/mods/DinoMod/recipes/pets_ostrich.json +++ b/data/mods/DinoMod/recipes/pets_ostrich.json @@ -148,7 +148,7 @@ "skills_required": [ "fabrication", 3 ], "time": "200 m", "autolearn": true, - "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "duct_tape", 250 ] ], [ [ "coat_rain", 15 ] ] ] }, { @@ -162,7 +162,7 @@ "skills_required": [ "fabrication", 3 ], "time": "400 m", "autolearn": true, - "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "SEW", "level": 1 }, { "id": "CUT", "level": 2 } ], "components": [ [ [ "duct_tape", 700 ] ], [ [ "bag_plastic", 150 ] ], [ [ "rag", 150 ] ] ] }, { diff --git a/data/mods/Generic_Guns/recipes/recipes_grenade_propelled.json b/data/mods/Generic_Guns/recipes/recipes_grenade_propelled.json index 5099e347436ba..34d1f27fee6ac 100644 --- a/data/mods/Generic_Guns/recipes/recipes_grenade_propelled.json +++ b/data/mods/Generic_Guns/recipes/recipes_grenade_propelled.json @@ -16,7 +16,7 @@ "using": [ [ "bullet_forming", 2 ], [ "ammo_bullet", 12 ], [ "req_grenade", -1 ] ], "proficiencies": [ { "proficiency": "prof_handloading" } ], "tools": [ [ [ "press", -1 ] ], [ [ "swage", -1 ] ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "sheet_metal_small", 1 ] ], [ [ "paper", 1 ], [ "wax", 1 ] ], @@ -40,7 +40,7 @@ "using": [ [ "bullet_forming", 2 ], [ "ammo_bullet", 12 ], [ "req_grenade", -1 ] ], "proficiencies": [ { "proficiency": "prof_handloading" } ], "tools": [ [ [ "press", -1 ] ], [ [ "swage", -1 ] ] ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "sheet_metal_small", 1 ] ], [ [ "paper", 1 ], [ "wax", 1 ] ], diff --git a/data/mods/Generic_Guns/recipes/recipes_rifle.json b/data/mods/Generic_Guns/recipes/recipes_rifle.json index 9cb81f6eee452..d6b11e1c7f29d 100644 --- a/data/mods/Generic_Guns/recipes/recipes_rifle.json +++ b/data/mods/Generic_Guns/recipes/recipes_rifle.json @@ -15,7 +15,7 @@ "reversible": true, "using": [ [ "ammo_bullet", 10 ] ], "proficiencies": [ { "proficiency": "prof_handloading" } ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "chem_black_powder", 5 ] ], [ [ "paper", 1 ] ] ] }, { @@ -34,7 +34,7 @@ "reversible": true, "using": [ [ "ammo_bullet", 10 ] ], "proficiencies": [ { "proficiency": "prof_handloading" } ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "chem_black_powder", 5 ] ], [ [ "paper", 1 ] ] ] }, { diff --git a/data/mods/Magiclysm/items/enchanted_tools.json b/data/mods/Magiclysm/items/enchanted_tools.json index 0fc6211f2e7fc..0f327679bbeac 100644 --- a/data/mods/Magiclysm/items/enchanted_tools.json +++ b/data/mods/Magiclysm/items/enchanted_tools.json @@ -24,7 +24,7 @@ "name": { "str": "hunting knife +1", "str_pl": "hunting knives +1" }, "proportional": { "price": 3.0, "price_postapoc": 3.0, "bashing": 1.1, "cutting": 1.1, "weight": 0.9 }, "relative": { "to_hit": 1 }, - "qualities": [ [ "CUT", 1 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 33 ] ] + "qualities": [ [ "CUT", 2 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 33 ] ] }, { "type": "GENERIC", @@ -33,7 +33,7 @@ "name": { "str": "hunting knife +2", "str_pl": "hunting knives +2" }, "proportional": { "price": 6.0, "price_postapoc": 6.0, "bashing": 1.2, "cutting": 1.2, "weight": 0.8 }, "relative": { "to_hit": 2 }, - "qualities": [ [ "CUT", 1 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 36 ] ] + "qualities": [ [ "CUT", 2 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 36 ] ] }, { "type": "GENERIC", @@ -57,7 +57,7 @@ "copy-from": "scalpel", "name": { "str": "scalpel +1", "str_pl": "scalpels +1" }, "proportional": { "price": 3.0, "price_postapoc": 3.0, "bashing": 1.1, "cutting": 1.1, "weight": 0.9 }, - "qualities": [ [ "CUT", 1 ], [ "CUT_FINE", 4 ], [ "BUTCHER", 9 ] ] + "qualities": [ [ "CUT", 2 ], [ "CUT_FINE", 4 ], [ "BUTCHER", 9 ] ] }, { "type": "GENERIC", @@ -65,7 +65,7 @@ "copy-from": "scalpel", "name": { "str": "scalpel +2", "str_pl": "scalpels +2" }, "proportional": { "price": 6.0, "price_postapoc": 6.0, "bashing": 1.2, "cutting": 1.2, "weight": 0.8 }, - "qualities": [ [ "CUT", 1 ], [ "CUT_FINE", 5 ], [ "BUTCHER", 10 ] ] + "qualities": [ [ "CUT", 2 ], [ "CUT_FINE", 5 ], [ "BUTCHER", 10 ] ] }, { "type": "GENERIC", @@ -73,7 +73,7 @@ "copy-from": "knife_butcher", "name": { "str": "butcher knife +1", "str_pl": "butcher knives +1" }, "proportional": { "price": 3.0, "price_postapoc": 3.0, "bashing": 1.1, "cutting": 1.1, "weight": 0.9 }, - "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 28 ] ] + "qualities": [ [ "CUT", 2 ], [ "BUTCHER", 28 ] ] }, { "type": "GENERIC", @@ -81,7 +81,7 @@ "copy-from": "knife_butcher", "name": { "str": "butcher knife +2", "str_pl": "butcher knives +2" }, "proportional": { "price": 6.0, "price_postapoc": 6.0, "bashing": 1.2, "cutting": 1.2, "weight": 0.8 }, - "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 30 ] ] + "qualities": [ [ "CUT", 2 ], [ "BUTCHER", 30 ] ] }, { "type": "GENERIC", @@ -89,7 +89,7 @@ "copy-from": "knife_meat_cleaver", "name": { "str": "meat cleaver +1", "str_pl": "meat cleavers +1" }, "proportional": { "price": 3.0, "price_postapoc": 3.0, "bashing": 1.1, "cutting": 1.1, "weight": 0.9 }, - "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 28 ] ] + "qualities": [ [ "CUT", 2 ], [ "BUTCHER", 28 ] ] }, { "type": "GENERIC", @@ -97,7 +97,7 @@ "copy-from": "knife_meat_cleaver", "name": { "str": "meat cleaver +2", "str_pl": "meat cleavers +2" }, "proportional": { "price": 6.0, "price_postapoc": 6.0, "bashing": 1.2, "cutting": 1.2, "weight": 0.8 }, - "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 30 ] ] + "qualities": [ [ "CUT", 2 ], [ "BUTCHER", 30 ] ] }, { "type": "GENERIC", @@ -105,7 +105,7 @@ "copy-from": "knife_carving", "name": { "str": "carving knife +1", "str_pl": "carving knives +1" }, "proportional": { "price": 3.0, "price_postapoc": 3.0, "bashing": 1.1, "cutting": 1.1, "weight": 0.9 }, - "qualities": [ [ "CUT", 1 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 24 ] ] + "qualities": [ [ "CUT", 2 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 24 ] ] }, { "type": "GENERIC", @@ -113,7 +113,7 @@ "copy-from": "knife_carving", "name": { "str": "carving knife +2", "str_pl": "carving knives +2" }, "proportional": { "price": 6.0, "price_postapoc": 6.0, "bashing": 1.2, "cutting": 1.2, "weight": 0.8 }, - "qualities": [ [ "CUT", 1 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 26 ] ] + "qualities": [ [ "CUT", 2 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 26 ] ] }, { "type": "GENERIC", @@ -121,7 +121,7 @@ "copy-from": "butchering_kit", "name": { "str": "butchering kit +1", "str_pl": "butchering kits +1" }, "proportional": { "price": 3.0, "price_postapoc": 3.0, "bashing": 1.1, "cutting": 1.1, "weight": 0.9 }, - "qualities": [ [ "CUT", 1 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 41 ] ] + "qualities": [ [ "CUT", 2 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 41 ] ] }, { "type": "GENERIC", @@ -129,6 +129,6 @@ "copy-from": "butchering_kit", "name": { "str": "butchering kit +2", "str_pl": "butchering kits +2" }, "proportional": { "price": 6.0, "price_postapoc": 6.0, "bashing": 1.2, "cutting": 1.2, "weight": 0.8 }, - "qualities": [ [ "CUT", 1 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 45 ] ] + "qualities": [ [ "CUT", 2 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 45 ] ] } ] diff --git a/data/mods/Magiclysm/items/ethereal_items.json b/data/mods/Magiclysm/items/ethereal_items.json index c7cafe6139e73..50aee58ceec79 100644 --- a/data/mods/Magiclysm/items/ethereal_items.json +++ b/data/mods/Magiclysm/items/ethereal_items.json @@ -800,7 +800,7 @@ "material": [ "superalloy" ], "symbol": "[", "color": "light_gray", - "qualities": [ [ "CUT", 1 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 12 ] ], + "qualities": [ [ "CUT", 2 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 12 ] ], "flags": [ "UNARMED_WEAPON", "UNBREAKABLE_MELEE", diff --git a/data/mods/Magiclysm/recipes/dragon_black.json b/data/mods/Magiclysm/recipes/dragon_black.json index bcf4e595b510f..afb65b634201c 100644 --- a/data/mods/Magiclysm/recipes/dragon_black.json +++ b/data/mods/Magiclysm/recipes/dragon_black.json @@ -12,7 +12,7 @@ "time": "48 m", "batch_time_factors": [ 20, 10 ], "qualities": [ - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 }, { "id": "BOIL", "level": 1 }, { "id": "CONTAIN", "level": 1 }, diff --git a/data/mods/Magiclysm/recipes/tailoring.json b/data/mods/Magiclysm/recipes/tailoring.json index 520a8a8d47683..67312c465b3fa 100644 --- a/data/mods/Magiclysm/recipes/tailoring.json +++ b/data/mods/Magiclysm/recipes/tailoring.json @@ -23,7 +23,7 @@ "time": "30 m", "autolearn": true, "proficiencies": [ { "proficiency": "prof_spinning" }, { "proficiency": "prof_fibers" } ], - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "tools": [ [ [ "distaff_spindle", -1 ] ] ], "components": [ [ [ "parabolan_wool_staple", 1 ] ] ] }, diff --git a/data/mods/Magiclysm/recipes/weapons.json b/data/mods/Magiclysm/recipes/weapons.json index 23a6e568808ca..b74990793cfff 100644 --- a/data/mods/Magiclysm/recipes/weapons.json +++ b/data/mods/Magiclysm/recipes/weapons.json @@ -57,7 +57,7 @@ "difficulty": 4, "time": "2 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "tools": [ [ [ "fire", -1 ] ] ], "components": [ [ [ "stick_long", 1 ], [ "pool_cue", 1 ] ], @@ -78,7 +78,7 @@ "difficulty": 6, "time": "660 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "MANA_INFUSE", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "MANA_INFUSE", "level": 2 } ], "tools": [ [ [ "fire", -1 ] ] ], "proficiencies": [ { "proficiency": "prof_carving" }, @@ -114,7 +114,7 @@ "time": "10 m", "autolearn": true, "reversible": false, - "qualities": [ { "id": "CUT", "level": 2 } ], + "qualities": [ { "id": "CUT", "level": 1 } ], "proficiencies": [ { "proficiency": "prof_carving", "required": false, "time_multiplier": 2 } ], "tools": [ [ [ "fire", -1 ] ] ], "components": [ [ [ "bone", 1 ] ] ] @@ -152,7 +152,7 @@ "difficulty": 4, "time": "360 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "MANA_INFUSE", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "MANA_INFUSE", "level": 1 } ], "components": [ [ [ "compositebow", 1 ] ], [ [ "rune_druid", 2 ] ] ] }, { @@ -501,7 +501,7 @@ { "proficiency": "prof_bowyery", "required": false, "time_multiplier": 2 }, { "proficiency": "prof_almetallurgy" } ], - "qualities": [ { "id": "HAMMER", "level": 3 }, { "id": "CHISEL", "level": 3 }, { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "HAMMER", "level": 3 }, { "id": "CHISEL", "level": 3 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "tongs", -1 ] ], [ [ "anvil", -1 ] ], [ [ "swage", -1 ] ] ], "components": [ [ [ "stick_long", 1 ], [ "2x4", 1 ] ], @@ -551,7 +551,7 @@ "charges": 4, "time": "30 m", "book_learn": [ [ "book_mythological", 9 ] ], - "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "CUT", "level": 1 }, { "id": "ANVIL", "level": 3 } ], + "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "CUT", "level": 2 }, { "id": "ANVIL", "level": 3 } ], "tools": [ [ [ "tongs", -1 ] ] ], "components": [ [ [ "orichalcum_ingot", 1 ] ], @@ -587,7 +587,7 @@ "difficulty": 2, "time": "20 m", "autolearn": true, - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "proficiencies": [ { "proficiency": "prof_carving" }, { "proficiency": "prof_alchemy" } ], "components": [ [ [ "stick_long", 1 ] ], [ [ "small_mana_crystal", 1 ] ], [ [ "leather", 2 ] ], [ [ "mana_dust", 10 ] ] ] }, @@ -602,7 +602,7 @@ "difficulty": 2, "time": "60 m", "book_learn": [ [ "enchantment_basic", 2 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "MANA_INFUSE", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "MANA_INFUSE", "level": 1 } ], "proficiencies": [ { "proficiency": "prof_carving" }, { "proficiency": "prof_alchemy" } ], "tools": [ [ [ "rune_alchemist", -1 ] ] ], "components": [ [ [ "enchanted_wood", 1 ] ], [ [ "mana_pearl", 1 ] ], [ [ "leather", 2 ] ], [ [ "mana_dust", 10 ] ] ] @@ -620,7 +620,7 @@ "book_learn": [ [ "enchantment_basic", 5 ] ], "using": [ [ "forging_standard", 2 ] ], "qualities": [ - { "id": "CUT", "level": 1 }, + { "id": "CUT", "level": 2 }, { "id": "MANA_INFUSE", "level": 2 }, { "id": "MANA_FOCUS", "level": 1 }, { "id": "ANVIL", "level": 3 }, diff --git a/data/mods/TEST_DATA/basecamp.json b/data/mods/TEST_DATA/basecamp.json index 52d6f212b8c01..a8131572f4c4c 100644 --- a/data/mods/TEST_DATA/basecamp.json +++ b/data/mods/TEST_DATA/basecamp.json @@ -58,7 +58,7 @@ "never_learn": true, "//0": "This blueprint has regular recipe components etc. in addition to the blueprint_needs. Similarly for the next two", "time": "20 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "pipe", 2 ], [ "scrap", 1 ] ] ], "construction_blueprint": "test_stove_update", "blueprint_name": "stove", @@ -78,7 +78,7 @@ "autolearn": false, "never_learn": true, "time": "20 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "pipe", 2 ], [ "scrap", 1 ] ] ], "construction_blueprint": "test_stove_update", "blueprint_name": "stove", @@ -93,7 +93,7 @@ "autolearn": false, "never_learn": true, "time": "20 m", - "qualities": [ { "id": "CUT", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "pipe", 2 ], [ "scrap", 1 ] ] ], "construction_blueprint": "test_stove_update", "blueprint_name": "stove", diff --git a/data/mods/TEST_DATA/recipes.json b/data/mods/TEST_DATA/recipes.json index 4d44ba3692a01..ff9fe4ca56ac6 100644 --- a/data/mods/TEST_DATA/recipes.json +++ b/data/mods/TEST_DATA/recipes.json @@ -12,7 +12,7 @@ "decomp_learn": 0, "autolearn": [ [ "electronics", 2 ] ], "book_learn": [ [ "manual_electronics", 1 ], [ "advanced_electronics", 2 ], [ "textbook_anarch", 2 ] ], - "qualities": [ { "id": "CUT", "level": 1 }, { "id": "SCREW", "level": 1 } ], + "qualities": [ { "id": "CUT", "level": 2 }, { "id": "SCREW", "level": 1 } ], "components": [ [ [ "e_scrap", 2 ], [ "glowplug", 1 ] ], [ [ "copper", 1 ], [ "nail", 1 ], [ "wire", 1 ] ], diff --git a/tests/iteminfo_test.cpp b/tests/iteminfo_test.cpp index a94d15399560e..34f75771e4103 100644 --- a/tests/iteminfo_test.cpp +++ b/tests/iteminfo_test.cpp @@ -2355,7 +2355,7 @@ TEST_CASE( "disassembly time and yield", "[iteminfo][disassembly]" ) CHECK( item_info_str( iron, disassemble ) == "--\n" "Disassembly takes about 20 minutes, requires 1 tool" - " with cutting of 1 or more and 1 tool with" + " with cutting of 2 or more and 1 tool with" " screw driving of 1 or more and might" " yield: 2 electronic scraps, 1 copper, 1 scrap metal, and 5 copper" " wire.\n" ); diff --git a/tests/recipe_test.cpp b/tests/recipe_test.cpp index 49e3e1907329a..f80afca75054a 100644 --- a/tests/recipe_test.cpp +++ b/tests/recipe_test.cpp @@ -61,11 +61,11 @@ TEST_CASE( "blueprint_autocalc_with_components", "[recipe][blueprint]" ) CHECK( stove_3->required_all_skills_string() == "none" ); CHECK( reqs_to_json_string( stove_1->simple_requirements() ) == - R"({"tools":[],"qualities":[[{"id":"CUT"}],[{"id":"SAW_M"}]],)" + R"({"tools":[],"qualities":[[{"id":"CUT","level":2}],[{"id":"SAW_M"}]],)" R"("components":[[["pipe",2],["scrap",1]],[["metal_tank",1]],[["pipe",1]]]})" ); CAPTURE( reqs_to_json_string( stove_2->simple_requirements() ) ); CHECK( stove_1->simple_requirements().has_same_requirements_as( stove_2->simple_requirements() ) ); CHECK( reqs_to_json_string( stove_3->simple_requirements() ) == - R"({"tools":[],"qualities":[[{"id":"CUT"}]],"components":[[["pipe",2],["scrap",1]]]})" ); + R"({"tools":[],"qualities":[[{"id":"CUT","level":2}]],"components":[[["pipe",2],["scrap",1]]]})" ); } From d2bca25bdaf1de9013f51ac5bfdde8583e065d2b Mon Sep 17 00:00:00 2001 From: David Seguin Date: Wed, 15 Dec 2021 11:18:39 -0500 Subject: [PATCH 19/39] Documentation to give some context for faction values (#53465) --- doc/FACTIONS.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/doc/FACTIONS.md b/doc/FACTIONS.md index 07bdfa0caec48..9bccb70b76d26 100644 --- a/doc/FACTIONS.md +++ b/doc/FACTIONS.md @@ -62,6 +62,19 @@ Field | Meaning `"mon_faction"` | string, optional. The monster faction `"name"` of the monster faction that this faction counts as. Defaults to "human" if unspecified. `"lone_wolf_faction"` | bool, optional. This is a proto/micro faction template that is used to generate 1-person factions for dynamically spawned NPCs, defaults to "false" if unspecified. +## Scale of faction values +Interacting with factions has certain effects on how the faction sees the player. These are reflected in values like `likes_u`, `respects_u` and `trusts_u`. Here's a (non-comprehensive) list to provide some context on how much these values are worth: + +| Type of interaction | Effect on `likes_u` | Effect on `respects_u` | Effect on `trusts_u` | +| ------------------- | ------------------- | ---------------------- | -------------------- | +| Neutral state | 0 | 0 | 0 | +| Player is warned by faction | - 1 | - 1 | - 1 | +| Player delivers food supply to faction camp | + food nutritional value / 1250 | + food nutritional value / 625 | + food nutritional value / 625 | +| Player triggers a mutiny | `likes_u` / 2 + 10 | - 5 | - 5 | +| Player angers an NPC | - 5 | - 5 | - 5 | +| Player completes a mission | + 10 | + 10 | + 10 | + + ## Faction relations Factions can have relations with each other that apply to each member of the faction. Faction relationships are not reciprocal: members of the Free Merchants will defend members of the Lobby Beggars, but members of the Lobby Beggars will not defend members of the Free Merchants. From 01565c8037db13b58592ae0c9cc7f0ce0c303223 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mih=C3=A1ly=20Verh=C3=A1s?= Date: Wed, 15 Dec 2021 17:19:02 +0100 Subject: [PATCH 20/39] Add some more dream messages. (#53446) * Add some more dream messages. * Lint the file. * Commit I-am-Erk's suggestions Co-authored-by: I-am-Erk <45136638+I-am-Erk@users.noreply.github.com> * Update data/json/dreams.json Co-authored-by: Binrui Dong Co-authored-by: I-am-Erk <45136638+I-am-Erk@users.noreply.github.com> Co-authored-by: Binrui Dong --- data/json/dreams.json | 39 +++++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/data/json/dreams.json b/data/json/dreams.json index 76a7d94a2d15c..9ef36bbe93edf 100644 --- a/data/json/dreams.json +++ b/data/json/dreams.json @@ -181,7 +181,8 @@ "type": "dream", "messages": [ "You have a disturbing dream of undergoing strange medical procedures.", - "While dreaming, you see yourself dressed in a hospital gown, receiving treatment." + "While dreaming, you see yourself dressed in a hospital gown, receiving treatment.", + "You dream of a hospital where doctors try out experimental treatments." ], "category": "MEDICAL", "strength": 2 @@ -190,7 +191,8 @@ "type": "dream", "messages": [ "You have a disturbing dream about running from dogs.", - "While dreaming, you see a distinctively rabbit-like reflection of yourself." + "While dreaming, you see a distinctively rabbit-like reflection of yourself.", + "You dream of digging a hole under a hill to make your home." ], "category": "RABBIT", "strength": 2 @@ -232,14 +234,19 @@ "type": "dream", "messages": [ "You have a vivid dream of hunting in the woods.", - "Whilst dreaming, you see a disturbingly bestial version of yourself." + "Whilst dreaming, you see a disturbingly bestial version of yourself.", + "You dream of blood and guts. For some reason, it makes you feel weirdly excited." ], "category": "BEAST", "strength": 2 }, { "type": "dream", - "messages": [ "You dream of foraging in the woods… mouth-first?", "Your dream-reflection is rather bearish." ], + "messages": [ + "You dream of foraging in the woods… mouth-first?", + "Your dream-reflection is rather bearish.", + "You dream of brushing the fur on your back against a tree." + ], "category": "URSINE", "strength": 2 }, @@ -254,7 +261,11 @@ }, { "type": "dream", - "messages": [ "You have a disturbing dream of someone invading your territory.", "Your dream-self's muzzle looks… wait, muzzle?" ], + "messages": [ + "You have a disturbing dream of someone invading your territory.", + "Your dream-self's muzzle looks… wait, muzzle?", + "You dream of the moon and feel a sudden urge to howl." + ], "category": "LUPINE", "strength": 2 }, @@ -271,7 +282,8 @@ "type": "dream", "messages": [ "You have a dream of working in a hive.", - "While dreaming you look into a mirror and see a frighteningly insectoid reflection." + "While dreaming you look into a mirror and see a frighteningly insectoid reflection.", + "You dream of a feast and excitedly chitter with your pincers… wait, what?" ], "category": "INSECT", "strength": 2 @@ -280,7 +292,8 @@ "type": "dream", "messages": [ "You have a confusing dream of growing in a garden.", - "You are confused by a plantlike image of yourself in a dream." + "You are confused by a plantlike image of yourself in a dream.", + "You dream of standing still in the rain, drinking in the falling drops… with your feet?" ], "category": "PLANT", "strength": 2 @@ -312,7 +325,11 @@ }, { "type": "dream", - "messages": [ "You have a strange dream of spinning webs", "In your dream you see a very spiderlike version of yourself." ], + "messages": [ + "You have a strange dream of spinning webs", + "In your dream you see a very spiderlike version of yourself.", + "You dream of the buzzing of a fly that you cannot see. It makes you hungry." + ], "category": "SPIDER", "strength": 2 }, @@ -329,7 +346,8 @@ "type": "dream", "messages": [ "You dream of having that success you knew you deserved, back before all this.", - "Your dream-self looks competent and in control." + "Your dream-self looks competent and in control.", + "You dream of a fortress, sheltering humanity from the zombies. You're in charge, of course." ], "category": "ALPHA", "strength": 2 @@ -390,7 +408,8 @@ "type": "dream", "messages": [ "You have a dream of doctors and nurses doing unnatural things to your body, which brings you perverse pleasure.", - "You have a vivid dream of being a medical anomaly, as your heartbeat syncs with the steady drip of an IV line." + "You have a vivid dream of being a medical anomaly, as your heartbeat syncs with the steady drip of an IV line.", + "You dream of cutting yourself with a knife and watch in fascination as it heals in seconds." ], "category": "MEDICAL", "strength": 3 From 265b971540670f0a2dd0795cde5ead4f8792c9c2 Mon Sep 17 00:00:00 2001 From: TannHaals Date: Thu, 16 Dec 2021 01:51:01 +0800 Subject: [PATCH 21/39] Update helmets.json --- data/json/items/armor/helmets.json | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/data/json/items/armor/helmets.json b/data/json/items/armor/helmets.json index 8c0479abdd789..a886e9554fb01 100644 --- a/data/json/items/armor/helmets.json +++ b/data/json/items/armor/helmets.json @@ -501,8 +501,7 @@ "material": [ "plastic", "nomex" ], "symbol": "[", "color": "dark_gray", - "armor_data": { - "armor": [ + "armor": [ { "material": [ { "type": "plastic", "covered_by_mat": 100, "thickness": 6.0 }, @@ -530,8 +529,7 @@ "coverage": 100, "encumbrance": 15 } - ] - }, + ], "use_action": { "type": "transform", "menu_text": "Raise visor", "target": "helmet_motor_raised", "msg": "You raise your visor." }, "warmth": 30, "environmental_protection": 1, @@ -556,8 +554,7 @@ "material": [ "plastic", "nomex" ], "symbol": "[", "color": "dark_gray", - "armor_data": { - "armor": [ + "armor": [ { "material": [ { "type": "plastic", "covered_by_mat": 100, "thickness": 6.0 }, @@ -567,8 +564,7 @@ "coverage": 100, "covers": [ "head" ] } - ] - }, + ], "use_action": { "type": "transform", "menu_text": "Lower visor", "target": "helmet_motor", "msg": "You put down your visor." }, "warmth": 30, "environmental_protection": 1, From 479bc3f51c07d3ed0125bc196e168d73b4d068ee Mon Sep 17 00:00:00 2001 From: PatrikLundell Date: Wed, 15 Dec 2021 19:27:09 +0100 Subject: [PATCH 22/39] fire station base camp maintenance (#53448) * fire station base camp maintenance * astyle trailing blanks --- .../modular_firestation1.json | 44 +++++++++---------- .../recipe_modular_firestation1.json | 17 +------ .../recipe_modular_firestation_walls_all.json | 11 +---- 3 files changed, 24 insertions(+), 48 deletions(-) diff --git a/data/json/mapgen/basecamps/base/modular_firestation_1/modular_firestation1.json b/data/json/mapgen/basecamps/base/modular_firestation_1/modular_firestation1.json index 34ea9d2e9b9da..4e7c4f3a0838b 100644 --- a/data/json/mapgen/basecamps/base/modular_firestation_1/modular_firestation1.json +++ b/data/json/mapgen/basecamps/base/modular_firestation_1/modular_firestation1.json @@ -12,6 +12,13 @@ "#": "t_privacy_fence" }, "furniture": { + "u": "f_clear", + ".": "f_clear", + "^": "f_clear", + "|": "f_clear", + "d": "f_clear", + "G": "f_clear", + "#": "f_clear", "h": "f_chair", "t": "f_table", "c": "f_counter", @@ -20,7 +27,8 @@ "L": "f_locker", "s": "f_sofa", "C": "f_armchair", - "B": "f_bookcase" + "B": "f_bookcase", + "-": "f_clear" } }, { @@ -43,22 +51,12 @@ "rows": [ " ", " ", - " ", - " ", - "t ", + "--- ", + "--- ", + "t-- ", "t t" ], - "palettes": [ "fbmc_firestation1_palette" ], - "place_furniture": [ - { "furn": "f_null", "x": 0, "y": 2 }, - { "furn": "f_null", "x": 0, "y": 3 }, - { "furn": "f_null", "x": 1, "y": 2 }, - { "furn": "f_null", "x": 1, "y": 3 }, - { "furn": "f_null", "x": 1, "y": 4 }, - { "furn": "f_null", "x": 2, "y": 2 }, - { "furn": "f_null", "x": 2, "y": 3 }, - { "furn": "f_null", "x": 2, "y": 4 } - ] + "palettes": [ "fbmc_firestation1_palette" ] } }, { @@ -135,14 +133,14 @@ "object": { "mapgensize": [ 6, 6 ], "place_furniture": [ - { "furn": "f_null", "x": 0, "y": 3 }, - { "furn": "f_null", "x": 0, "y": 4 }, - { "furn": "f_null", "x": 2, "y": 1 }, - { "furn": "f_null", "x": 2, "y": 2 }, - { "furn": "f_null", "x": 1, "y": 0 }, - { "furn": "f_null", "x": 0, "y": 0 }, - { "furn": "f_null", "x": 1, "y": 1 }, - { "furn": "f_null", "x": 1, "y": 2 } + { "furn": "f_clear", "x": 0, "y": 3 }, + { "furn": "f_clear", "x": 0, "y": 4 }, + { "furn": "f_clear", "x": 2, "y": 1 }, + { "furn": "f_clear", "x": 2, "y": 2 }, + { "furn": "f_clear", "x": 1, "y": 0 }, + { "furn": "f_clear", "x": 0, "y": 0 }, + { "furn": "f_clear", "x": 1, "y": 1 }, + { "furn": "f_clear", "x": 1, "y": 2 } ] } }, diff --git a/data/json/recipes/basecamps/base/recipe_modular_firestation_1/recipe_modular_firestation1.json b/data/json/recipes/basecamps/base/recipe_modular_firestation_1/recipe_modular_firestation1.json index fd9993410ccd0..bea394e41ee1d 100644 --- a/data/json/recipes/basecamps/base/recipe_modular_firestation_1/recipe_modular_firestation1.json +++ b/data/json/recipes/basecamps/base/recipe_modular_firestation_1/recipe_modular_firestation1.json @@ -80,14 +80,11 @@ "subcategory": "CSC_BUILDING_BASES", "autolearn": false, "never_learn": true, - "time": "2 h", "construction_blueprint": "fbmc_firestation1_kitchen2_storage", "blueprint_name": "add storage and root cellar", "blueprint_requires": [ { "id": "fbmc_firestation1_kitchen" } ], "blueprint_provides": [ { "id": "fbmc_firestation1_kitchen" }, { "id": "pantry" }, { "id": "sorting" } ], - "blueprint_excludes": [ { "id": "fbmc_firestation1_kitchen", "amount": 2 } ], - "check_blueprint_needs": false, - "components": [ [ [ "rock", 40 ], [ "brick", 40 ] ], [ [ "2x4", 6 ], [ "stick", 6 ] ], [ [ "withered", 12 ], [ "straw_pile", 12 ] ] ] + "blueprint_excludes": [ { "id": "fbmc_firestation1_kitchen", "amount": 2 } ] }, { "type": "recipe", @@ -438,23 +435,13 @@ "description": "Let's get a nice workbench built to improve our work. Place it next to the anvil.", "category": "CC_BUILDING", "subcategory": "CSC_BUILDING_BASES", - "skill_used": "fabrication", "autolearn": false, "never_learn": true, "construction_blueprint": "fbmc_firestation1_workbench", "blueprint_name": "build a workbench", "blueprint_requires": [ { "id": "fbmc_firestation1_tools" } ], "blueprint_provides": [ { "id": "fbmc_firestation1_workbench" }, { "id": "fbmc_firestation_blacksmith_recipes_5" } ], - "blueprint_excludes": [ { "id": "fbmc_firestation1_workbench" } ], - "blueprint_needs": { - "time": "2 h", - "skills": [ [ "fabrication", 3 ] ], - "inline": { - "tools": [ [ [ "oxy_torch", 20 ], [ "toolset", 150 ], [ "welder", 100 ], [ "welder_crude", 150 ] ] ], - "qualities": [ [ { "id": "GLARE", "level": 1 } ] ], - "components": [ [ [ "pipe", 16 ] ], [ [ "sheet_metal", 4 ] ], [ [ "sheet_metal_small", 8 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmc_firestation1_workbench" } ] }, { "type": "recipe", diff --git a/data/json/recipes/basecamps/base/recipe_modular_firestation_1/recipe_modular_firestation_walls_all.json b/data/json/recipes/basecamps/base/recipe_modular_firestation_1/recipe_modular_firestation_walls_all.json index 464761c09aceb..36ddee365b9b8 100644 --- a/data/json/recipes/basecamps/base/recipe_modular_firestation_1/recipe_modular_firestation_walls_all.json +++ b/data/json/recipes/basecamps/base/recipe_modular_firestation_1/recipe_modular_firestation_walls_all.json @@ -12,16 +12,7 @@ "blueprint_name": "build the standard white living quarters walls", "blueprint_requires": [ { "id": "fbmc_firestation1_0" } ], "blueprint_provides": [ { "id": "fbmc_firestation1_quarters" } ], - "blueprint_excludes": [ { "id": "fbmc_firestation1_quarters" } ], - "blueprint_needs": { - "time": "15 h 54 m", - "skills": [ [ "fabrication", 2 ] ], - "inline": { - "tools": [ [ [ "paint_brush", -1 ] ], [ [ "chipper", -1 ] ] ], - "qualities": [ [ { "id": "HAMMER", "level": 2 } ], [ { "id": "SAW_W", "level": 2 } ] ], - "components": [ [ [ "2x4", 70 ] ], [ [ "nail", 180 ] ], [ [ "wood_panel", 5 ] ], [ [ "hinge", 10 ] ], [ [ "w_paint", 900 ] ] ] - } - } + "blueprint_excludes": [ { "id": "fbmc_firestation1_quarters" } ] }, { "type": "recipe", From 92a3229ab86592fa6d335ef0d57126587e7c06c8 Mon Sep 17 00:00:00 2001 From: Paul Fenwick Date: Wed, 15 Dec 2021 10:27:48 -0800 Subject: [PATCH 23/39] Allow dish-towels to be uncrafted to a single rag (#53439) --- data/json/recipes/recipe_deconstruction.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/data/json/recipes/recipe_deconstruction.json b/data/json/recipes/recipe_deconstruction.json index a846ad084aec6..4b866c5970b61 100644 --- a/data/json/recipes/recipe_deconstruction.json +++ b/data/json/recipes/recipe_deconstruction.json @@ -4463,6 +4463,14 @@ "components": [ [ [ "rag", 5 ] ] ], "flags": [ "BLIND_HARD" ] }, + { + "result": "dish_towel", + "type": "uncraft", + "activity_level": "LIGHT_EXERCISE", + "time": "6 s", + "components": [ [ [ "rag", 1 ] ] ], + "flags": [ "BLIND_EASY" ] + }, { "result": "usb_drive", "type": "uncraft", From 2208282612328ab1d34e2f9b47dff8f9b66d1875 Mon Sep 17 00:00:00 2001 From: David Seguin Date: Wed, 15 Dec 2021 13:30:42 -0500 Subject: [PATCH 24/39] Conditionally prompt when examining locked object (#53433) * Conditionally prompt when examining locked object * Swap order of options * Skip prompt when best prying tool is inadequate for prying object --- src/iexamine.cpp | 60 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 45 insertions(+), 15 deletions(-) diff --git a/src/iexamine.cpp b/src/iexamine.cpp index 986fc3869ea7a..3be4f5026a269 100644 --- a/src/iexamine.cpp +++ b/src/iexamine.cpp @@ -206,6 +206,7 @@ static const quality_id qual_DIG( "DIG" ); static const quality_id qual_DRILL( "DRILL" ); static const quality_id qual_HAMMER( "HAMMER" ); static const quality_id qual_LOCKPICK( "LOCKPICK" ); +static const quality_id qual_PRY( "PRY" ); static const requirement_id requirement_data_anesthetic( "anesthetic" ); static const requirement_id requirement_data_autoclave( "autoclave" ); @@ -1607,26 +1608,55 @@ void iexamine::gunsafe_el( Character &you, const tripoint &examp ) */ void iexamine::locked_object( Character &you, const tripoint &examp ) { - item &best_prying = you.item_with_best_of_quality( STATIC( quality_id( "PRY" ) ) ); - map &here = get_map(); - if( best_prying.is_null() ) { - if( here.has_flag( ter_furn_flag::TFLAG_PICKABLE, examp ) ) { - add_msg( m_info, _( "The %s is locked. You could pry it open with the right tool…" ), - here.has_furn( examp ) ? here.furnname( examp ) : here.tername( examp ) ); - locked_object_pickable( you, examp ); + item &best_prying = you.item_with_best_of_quality( qual_PRY ); + item &best_lockpick = you.item_with_best_of_quality( qual_LOCKPICK ); + const bool has_prying = !best_prying.is_null(); + const bool can_pick = here.has_flag( ter_furn_flag::TFLAG_PICKABLE, examp ) && + ( !best_lockpick.is_null() || you.has_bionic( bio_lockpick ) ); + enum act { + pick = 0, + pry = 1, + none = 2 + }; + int action = act::none; + + if( has_prying && can_pick ) { + const int pry_has = best_prying.get_quality( qual_PRY ); + const int pry_req = here.has_furn( examp ) ? + here.furn( examp )->prying->prying_data().prying_level : + here.ter( examp )->prying->prying_data().prying_level; + if( pry_has < pry_req ) { + action = act::pick; } else { - add_msg( m_info, _( "The %s is locked. If only you had something to pry it with…" ), - here.has_furn( examp ) ? here.furnname( examp ) : here.tername( examp ) ); + uilist amenu; + amenu.text = string_format( _( "What to do with the %s?" ), + here.has_furn( examp ) ? here.furnname( examp ) : here.tername( examp ) ); + amenu.addentry( 0, true, 'l', _( "Pick the lock" ) ); + amenu.addentry( 1, true, 'p', _( "Pry open" ) ); + amenu.query(); + if( amenu.ret < act::pick || amenu.ret > act::pry ) { + return; + } + action = amenu.ret; } - return; + } else { + action = has_prying ? act::pry : can_pick ? act::pick : act::none; } - //~ %1$s: terrain/furniture name, %2$s: prying tool name - you.add_msg_if_player( _( "You attempt to pry open the %1$s using your %2$s…" ), - here.has_furn( examp ) ? here.furnname( examp ) : here.tername( examp ), best_prying.tname() ); - - iuse::crowbar( &you, &best_prying, false, examp ); + if( action == act::none ) { + add_msg( m_info, _( "The %s is locked. You could pry it open with the right tool…" ), + here.has_furn( examp ) ? here.furnname( examp ) : here.tername( examp ) ); + return; + } else if( action == act::pry ) { + //~ %1$s: terrain/furniture name, %2$s: prying tool name + you.add_msg_if_player( _( "You attempt to pry open the %1$s using your %2$s…" ), + here.has_furn( examp ) ? here.furnname( examp ) : + here.tername( examp ), best_prying.tname() ); + iuse::crowbar( &you, &best_prying, false, examp ); + } else if( action == act::pick ) { + locked_object_pickable( you, examp ); + } } /** From 03ceebe957a14ea1d0eb36bc03761bfe80b692e0 Mon Sep 17 00:00:00 2001 From: TannHaals Date: Thu, 16 Dec 2021 04:01:40 +0800 Subject: [PATCH 25/39] Update helmets.json --- data/json/items/armor/helmets.json | 76 +++++++++++++++--------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/data/json/items/armor/helmets.json b/data/json/items/armor/helmets.json index a886e9554fb01..1e67198421ed0 100644 --- a/data/json/items/armor/helmets.json +++ b/data/json/items/armor/helmets.json @@ -502,34 +502,34 @@ "symbol": "[", "color": "dark_gray", "armor": [ - { - "material": [ - { "type": "plastic", "covered_by_mat": 100, "thickness": 6.0 }, - { "type": "nomex", "covered_by_mat": 100, "thickness": 6.0 } - ], - "covers": [ "head" ], - "coverage": 100, - "encumbrance": 25 - }, - { - "material": [ - { "type": "plastic", "covered_by_mat": 100, "thickness": 6.0 }, - { "type": "nomex", "covered_by_mat": 100, "thickness": 6.0 } - ], - "covers": [ "eyes" ], - "coverage": 100, - "encumbrance": 5 - }, - { - "material": [ - { "type": "plastic", "covered_by_mat": 100, "thickness": 6.0 }, - { "type": "nomex", "covered_by_mat": 100, "thickness": 6.0 } - ], - "covers": [ "mouth" ], - "coverage": 100, - "encumbrance": 15 - } - ], + { + "material": [ + { "type": "plastic", "covered_by_mat": 100, "thickness": 6.0 }, + { "type": "nomex", "covered_by_mat": 100, "thickness": 6.0 } + ], + "covers": [ "head" ], + "coverage": 100, + "encumbrance": 25 + }, + { + "material": [ + { "type": "plastic", "covered_by_mat": 100, "thickness": 6.0 }, + { "type": "nomex", "covered_by_mat": 100, "thickness": 6.0 } + ], + "covers": [ "eyes" ], + "coverage": 100, + "encumbrance": 5 + }, + { + "material": [ + { "type": "plastic", "covered_by_mat": 100, "thickness": 6.0 }, + { "type": "nomex", "covered_by_mat": 100, "thickness": 6.0 } + ], + "covers": [ "mouth" ], + "coverage": 100, + "encumbrance": 15 + } + ], "use_action": { "type": "transform", "menu_text": "Raise visor", "target": "helmet_motor_raised", "msg": "You raise your visor." }, "warmth": 30, "environmental_protection": 1, @@ -555,16 +555,16 @@ "symbol": "[", "color": "dark_gray", "armor": [ - { - "material": [ - { "type": "plastic", "covered_by_mat": 100, "thickness": 6.0 }, - { "type": "nomex", "covered_by_mat": 100, "thickness": 6.0 } - ], - "encumbrance": 25, - "coverage": 100, - "covers": [ "head" ] - } - ], + { + "material": [ + { "type": "plastic", "covered_by_mat": 100, "thickness": 6.0 }, + { "type": "nomex", "covered_by_mat": 100, "thickness": 6.0 } + ], + "encumbrance": 25, + "coverage": 100, + "covers": [ "head" ] + } + ], "use_action": { "type": "transform", "menu_text": "Lower visor", "target": "helmet_motor", "msg": "You put down your visor." }, "warmth": 30, "environmental_protection": 1, From 1a4af960a871a144b7aa43fe90f7b1198ff59eea Mon Sep 17 00:00:00 2001 From: NetSysFire <59517351+NetSysFire@users.noreply.github.com> Date: Wed, 15 Dec 2021 21:58:41 +0100 Subject: [PATCH 26/39] Add some minimal warmth to the grass skirt (#53417) --- data/json/items/armor/legs_clothes.json | 1 + 1 file changed, 1 insertion(+) diff --git a/data/json/items/armor/legs_clothes.json b/data/json/items/armor/legs_clothes.json index ab2367b33d7ef..43e21f9d96115 100644 --- a/data/json/items/armor/legs_clothes.json +++ b/data/json/items/armor/legs_clothes.json @@ -1206,6 +1206,7 @@ "symbol": "[", "looks_like": "kilt", "color": "yellow", + "warmth": 1, "material_thickness": 1, "flags": [ "VARSIZE", "OVERSIZE", "WATER_FRIENDLY" ], "armor": [ From 0bb05b8b0274c52d60472dcd8af4f6a0065c6cdc Mon Sep 17 00:00:00 2001 From: Igor Nabebin Date: Mon, 6 Dec 2021 22:00:55 +0100 Subject: [PATCH 27/39] Fix mx_craters hitting the building roof --- src/map.cpp | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/map.cpp b/src/map.cpp index d5b7410383f89..22e7b075bb94d 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -3508,15 +3508,10 @@ void map::bash_ter_furn( const tripoint &p, bash_params ¶ms ) spawn_items( p, item_group::items_from( bash->drop_group, calendar::turn ) ); } - if( smash_ter && ter( p ) == t_open_air ) { - if( !zlevels ) { - // We destroyed something, so we aren't just "plugging" air with dirt here - ter_set( p, t_dirt ); - } else { - tripoint below( p.xy(), p.z - 1 ); - const auto roof = get_roof( below, params.bash_floor && ter( below ).obj().movecost != 0 ); - ter_set( p, roof ); - } + if( smash_ter && ter( p ) == t_open_air && zlevels ) { + tripoint below( p.xy(), p.z - 1 ); + const auto roof = get_roof( below, params.bash_floor && ter( below ).obj().movecost != 0 ); + ter_set( p, roof ); } if( bash->explosive > 0 ) { From 7339bc5303eb7119dcfe7074de1fe1a3076f87c8 Mon Sep 17 00:00:00 2001 From: Max <74881393+Max17U@users.noreply.github.com> Date: Thu, 16 Dec 2021 07:23:29 +0100 Subject: [PATCH 28/39] Prying Nail changes (#53479) Added the Prying_nail quality to the gunsmith repair kit since it has an hammer in it, and removed the Prying_nail quality from the makeshift hammer since it's just a piece of metal onto a stick --- data/json/items/tool/workshop.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/data/json/items/tool/workshop.json b/data/json/items/tool/workshop.json index 79ad243c21a05..45af641574f8e 100644 --- a/data/json/items/tool/workshop.json +++ b/data/json/items/tool/workshop.json @@ -548,6 +548,7 @@ [ "HAMMER_FINE", 1 ], [ "HAMMER", 3 ], [ "PRY", 1 ], + [ "PRYING_NAIL", 1 ], [ "SAW_M_FINE", 1 ], [ "SAW_M", 2 ], [ "SAW_W", 1 ], @@ -584,7 +585,7 @@ "material": [ "steel", "wood" ], "symbol": ";", "color": "brown", - "qualities": [ [ "HAMMER", 2 ], [ "PRYING_NAIL", 1 ] ], + "qualities": [ [ "HAMMER", 2 ] ], "use_action": [ "HAMMER" ], "flags": [ "NONCONDUCTIVE", "BELT_CLIP" ] }, From 98bf693c399538da8a06392334061f5f5c2ce4b2 Mon Sep 17 00:00:00 2001 From: Dillon Matchett Date: Thu, 16 Dec 2021 02:23:54 -0400 Subject: [PATCH 29/39] disable custom loot zones (#53476) --- data/json/loot_zones.json | 1 - 1 file changed, 1 deletion(-) diff --git a/data/json/loot_zones.json b/data/json/loot_zones.json index f0eb27bdbc791..0ea18851eec98 100644 --- a/data/json/loot_zones.json +++ b/data/json/loot_zones.json @@ -220,7 +220,6 @@ "id": "LOOT_CUSTOM", "type": "LOOT_ZONE", "name": "Loot: Custom", - "can_be_personal": true, "description": "Destination for loot with a custom filter that you can modify" }, { From f0ba5ae079f1883f9e29ab5c9953542c582e83e0 Mon Sep 17 00:00:00 2001 From: Aaron Chancey Date: Thu, 16 Dec 2021 01:28:31 -0500 Subject: [PATCH 30/39] Adding FABRIC_CUT quality and adding it to a variety of relevant tools (#53464) Added a new tool quality to denote fabric cutting suitability for tailoring - as cut is being overhauled. Adding the quality to a handful of tailoring suitable tools. --- data/json/items/tool/knives.json | 2 +- data/json/items/tool/med.json | 2 +- data/json/items/tool/stationary.json | 2 +- data/json/items/tool/tailoring.json | 6 +++--- data/json/items/tool/workshop.json | 2 +- data/json/tool_qualities.json | 7 +++++++ 6 files changed, 14 insertions(+), 7 deletions(-) diff --git a/data/json/items/tool/knives.json b/data/json/items/tool/knives.json index 1495887de3df5..48b2952c1e565 100644 --- a/data/json/items/tool/knives.json +++ b/data/json/items/tool/knives.json @@ -113,7 +113,7 @@ "material": [ "steel", "plastic" ], "symbol": ";", "color": "light_gray", - "qualities": [ [ "CUT", 2 ], [ "BUTCHER", 8 ] ] + "qualities": [ [ "CUT", 2 ], [ "BUTCHER", 8 ], [ "FABRIC_CUT", 1 ] ] }, { "type": "TOOL", diff --git a/data/json/items/tool/med.json b/data/json/items/tool/med.json index abd214d8406a1..4a53c209908b4 100644 --- a/data/json/items/tool/med.json +++ b/data/json/items/tool/med.json @@ -109,7 +109,7 @@ "material": [ "steel" ], "symbol": ",", "color": "light_gray", - "qualities": [ [ "CUT", 2 ], [ "CUT_FINE", 3 ], [ "BUTCHER", 8 ] ], + "qualities": [ [ "CUT", 2 ], [ "CUT_FINE", 3 ], [ "BUTCHER", 8 ], [ "FABRIC_CUT", 1 ] ], "flags": [ "FRAGILE_MELEE" ] }, { diff --git a/data/json/items/tool/stationary.json b/data/json/items/tool/stationary.json index 7500d6040dd8c..3826497f07b57 100644 --- a/data/json/items/tool/stationary.json +++ b/data/json/items/tool/stationary.json @@ -62,7 +62,7 @@ "material": [ "aluminum", "plastic" ], "symbol": ",", "color": "light_red", - "qualities": [ [ "CUT", 2 ], [ "BUTCHER", 3 ] ], + "qualities": [ [ "CUT", 2 ], [ "BUTCHER", 3 ], [ "FABRIC_CUT", 1 ] ], "flags": [ "STAB", "BELT_CLIP", "SHEATH_KNIFE" ], "weapon_category": [ "SHIVS" ] }, diff --git a/data/json/items/tool/tailoring.json b/data/json/items/tool/tailoring.json index 115ae3f6d3ed7..bd90515ce4f75 100644 --- a/data/json/items/tool/tailoring.json +++ b/data/json/items/tool/tailoring.json @@ -153,7 +153,7 @@ "id": "sewing_kit", "type": "TOOL", "name": { "str": "sewing kit" }, - "description": "This is a plastic kit with a variety of needles, some plastic spools for thread, and a few other useful textile tools. Use a sewing kit on an article of clothing to attempt to repair or reinforce that clothing. This uses your tailoring skill.", + "description": "This is a plastic kit with a variety of needles, some plastic spools for thread, small scissors, and a few other useful textile tools. Use a sewing kit on an article of clothing to attempt to repair or reinforce that clothing. This uses your tailoring skill.", "weight": "85 g", "volume": "250 ml", "price": 1000, @@ -164,7 +164,7 @@ "color": "red", "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "thread": 200 } } ], "charges_per_use": 1, - "qualities": [ [ "SEW", 3 ] ], + "qualities": [ [ "SEW", 3 ], [ "FABRIC_CUT", 1 ], [ "CUT", 2 ] ], "use_action": { "type": "repair_item", "item_action_type": "repair_fabric", @@ -271,7 +271,7 @@ "ammo": [ "thread" ], "sub": "sewing_kit", "charges_per_use": 1, - "qualities": [ [ "SEW", 4 ], [ "SEW_CURVED", 1 ], [ "KNIT", 1 ], [ "LEATHER_AWL", 2 ], [ "CUT", 2 ] ], + "qualities": [ [ "SEW", 4 ], [ "SEW_CURVED", 1 ], [ "KNIT", 1 ], [ "LEATHER_AWL", 2 ], [ "CUT", 2 ], [ "FABRIC_CUT", 2 ] ], "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "thread": 400 } } ], "use_action": [ { diff --git a/data/json/items/tool/workshop.json b/data/json/items/tool/workshop.json index 45af641574f8e..d3ad715bc9185 100644 --- a/data/json/items/tool/workshop.json +++ b/data/json/items/tool/workshop.json @@ -1247,7 +1247,7 @@ "material": [ "steel", "plastic" ], "symbol": ";", "color": "light_gray", - "qualities": [ [ "CUT", 2 ], [ "CUT_FINE", 2 ], [ "BUTCHER", 7 ] ], + "qualities": [ [ "CUT", 2 ], [ "CUT_FINE", 2 ], [ "BUTCHER", 7 ], [ "FABRIC_CUT", 1 ] ], "flags": [ "FRAGILE_MELEE" ] }, { diff --git a/data/json/tool_qualities.json b/data/json/tool_qualities.json index 44b3524cffad1..95e19bf02a168 100644 --- a/data/json/tool_qualities.json +++ b/data/json/tool_qualities.json @@ -336,5 +336,12 @@ "id": "WHEEL_FAST", "//": "A tool that is capable of manipulating the lug nuts of a vehicle's wheels or smaller to replace or fasten them.", "name": { "str": "wheel fastening" } + }, + { + "type": "tool_quality", + "id": "FABRIC_CUT", + "//": "A tool that shares a large number of qualities with cutting tools, with the added benefit of being suitable for cutting fabric to patterned shapes for tailoring.", + "name": { "str": "fabric cutting" }, + "usages": [ [ 1, [ "salvage", "inscribe", "cauterize" ] ] ] } ] From 9142b22c0c06156aa11e34f241b1ee7ee2af17c3 Mon Sep 17 00:00:00 2001 From: Max <74881393+Max17U@users.noreply.github.com> Date: Thu, 16 Dec 2021 07:29:24 +0100 Subject: [PATCH 31/39] Updated fields for recipe only books (#53461) Since it is possible to have a book that only teaches some recipes without leveling up a skill, i modified the item.cpp file to be consistent with the possibility to remove the "max_skill" field from the book description in the json file. Updated the book to reflect the change and the json_info.md file. --- data/json/items/book/chemistry.json | 2 -- data/json/items/book/electronics.json | 1 - data/json/items/book/fabrication.json | 1 - data/json/items/book/misc.json | 1 - doc/JSON_INFO.md | 2 ++ src/item.cpp | 9 ++++++--- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/data/json/items/book/chemistry.json b/data/json/items/book/chemistry.json index fbd52cd731b56..6a494b0538025 100644 --- a/data/json/items/book/chemistry.json +++ b/data/json/items/book/chemistry.json @@ -127,7 +127,6 @@ "color": "light_green", "skill": "chemistry", "required_level": 7, - "max_level": 7, "intelligence": 13, "time": "45 m", "fun": -2 @@ -207,7 +206,6 @@ "color": "light_green", "skill": "chemistry", "required_level": 8, - "max_level": 8, "intelligence": 13, "time": "45 m", "fun": -2 diff --git a/data/json/items/book/electronics.json b/data/json/items/book/electronics.json index f3b51a1450141..8b4522122e97f 100644 --- a/data/json/items/book/electronics.json +++ b/data/json/items/book/electronics.json @@ -104,7 +104,6 @@ "color": "light_green", "skill": "electronics", "required_level": 6, - "max_level": 6, "intelligence": 12, "time": "60 m", "fun": -3 diff --git a/data/json/items/book/fabrication.json b/data/json/items/book/fabrication.json index 687343aa97119..642110a20835f 100644 --- a/data/json/items/book/fabrication.json +++ b/data/json/items/book/fabrication.json @@ -84,7 +84,6 @@ "color": "blue", "skill": "fabrication", "required_level": 6, - "max_level": 6, "proficiencies": [ { "proficiency": "prof_fine_metalsmithing", "time_factor": 0.2, "fail_factor": 0.3, "include_prereqs": false }, { "proficiency": "prof_gem_setting", "time_factor": 0.2, "fail_factor": 0.3, "include_prereqs": false } diff --git a/data/json/items/book/misc.json b/data/json/items/book/misc.json index e5e7e17fc9c32..2cb3bea0c887d 100644 --- a/data/json/items/book/misc.json +++ b/data/json/items/book/misc.json @@ -68,7 +68,6 @@ "color": "light_green", "skill": "mechanics", "required_level": 1, - "max_level": 1, "intelligence": 8, "time": "45 m", "fun": -2 diff --git a/doc/JSON_INFO.md b/doc/JSON_INFO.md index 522f9d95765d7..e2655bd9e25b2 100644 --- a/doc/JSON_INFO.md +++ b/doc/JSON_INFO.md @@ -2850,6 +2850,8 @@ Books can be defined like this: "chapters" : 4, // Number of chapters (for fun only books), each reading "consumes" a chapter. Books with no chapters left are less fun (because the content is already known to the character). "required_level" : 2 // Minimum skill level required to learn ``` +It is possible to omit the `max_level` field if the book you're creating contains only recipes and it's not supposed to level up any skill. In this case the `skill` field will just refer to the skill required to learn the recipes. + Alternately, every item (tool, gun, even food) can be used as book if it has book_data: ```C++ "type" : "TOOL", // Or any other item type diff --git a/src/item.cpp b/src/item.cpp index d4736e8287545..94cb44920a103 100644 --- a/src/item.cpp +++ b/src/item.cpp @@ -3640,9 +3640,12 @@ void item::book_info( std::vector &info, const iteminfo_query *parts, const SkillLevel &skill = player_character.get_skill_level_object( book.skill ); if( skill.can_train() && parts->test( iteminfo_parts::BOOK_SKILLRANGE_MAX ) ) { const std::string skill_name = book.skill->name(); - std::string fmt = string_format( _( "Can bring your %s skill to " - "." ), skill_name ); - info.emplace_back( "BOOK", "", fmt, iteminfo::no_flags, book.level ); + std::string fmt; + if( book.level != 0 ) { + fmt = string_format( _( "Can bring your %s skill to " + "." ), skill_name ); + info.emplace_back( "BOOK", "", fmt, iteminfo::no_flags, book.level ); + } fmt = string_format( _( "Your current %s skill is ." ), skill_name ); info.emplace_back( "BOOK", "", fmt, iteminfo::no_flags, skill.knowledgeLevel() ); From a9dc74bd367d42c230cbd824806192579b510aa3 Mon Sep 17 00:00:00 2001 From: catdach <93795131+catdach@users.noreply.github.com> Date: Thu, 16 Dec 2021 01:31:35 -0500 Subject: [PATCH 32/39] Weapon Categories: Medieval Swordsmanship (#53449) * make Zweihander a longsword * make estoc a longsword * Update martialarts.json * new sword categories * added new categories to weapons (except Japanese swords) and removed zwie- from long swords * added Japanese sword category to weapons --- data/json/items/melee/swords_and_blades.json | 27 ++++++++++---------- data/json/martialarts.json | 27 +------------------- data/json/weapon_categories.json | 15 +++++++++++ 3 files changed, 30 insertions(+), 39 deletions(-) diff --git a/data/json/items/melee/swords_and_blades.json b/data/json/items/melee/swords_and_blades.json index d8e190ecef5ea..44bd97af8e0fd 100644 --- a/data/json/items/melee/swords_and_blades.json +++ b/data/json/items/melee/swords_and_blades.json @@ -15,7 +15,7 @@ "to_hit": { "grip": "solid", "length": "long", "surface": "line", "balance": "good" }, "price_postapoc": 50, "flags": [ "SHEATH_SWORD" ], - "weapon_category": [ "MEDIUM_SWORDS" ], + "weapon_category": [ "CONSTRUCTED_SWORDS", "MEDIUM_SWORDS" ], "techniques": [ "WBLOCK_1" ] }, { @@ -34,7 +34,7 @@ "to_hit": { "grip": "weapon", "length": "long", "surface": "every", "balance": "uneven" }, "price_postapoc": 100, "techniques": [ "WBLOCK_1" ], - "weapon_category": [ "MEDIUM_SWORDS" ] + "weapon_category": [ "CONSTRUCTED_SWORDS", "MEDIUM_SWORDS" ] }, { "type": "GENERIC", @@ -52,7 +52,7 @@ "to_hit": { "grip": "solid", "length": "long", "surface": "every", "balance": "uneven" }, "price_postapoc": 250, "flags": [ "SHEATH_SWORD" ], - "weapon_category": [ "MEDIUM_SWORDS" ], + "weapon_category": [ "CONSTRUCTED_SWORDS", "MEDIUM_SWORDS" ], "qualities": [ [ "BUTCHER", -50 ] ], "techniques": [ "WBLOCK_1" ] }, @@ -73,7 +73,7 @@ "to_hit": { "grip": "weapon", "length": "long", "surface": "line", "balance": "neutral" }, "price_postapoc": 500, "flags": [ "SHEATH_SWORD" ], - "weapon_category": [ "MEDIUM_SWORDS" ], + "weapon_category": [ "CONSTRUCTED_SWORDS", "MEDIUM_SWORDS" ], "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 2 ] ], "techniques": [ "WBLOCK_2" ] }, @@ -420,7 +420,7 @@ "techniques": [ "WBLOCK_2", "RAPID" ], "qualities": [ [ "CUT", 2 ], [ "BUTCHER", 8 ] ], "flags": [ "DURABLE_MELEE", "SHEATH_SWORD" ], - "weapon_category": [ "MEDIUM_SWORDS", "FENCING_WEAPONRY" ], + "weapon_category": [ "MEDIEVAL_SWORDS", "MEDIUM_SWORDS", "FENCING_WEAPONRY" ], "category": "weapons" }, { @@ -576,7 +576,7 @@ "material": [ "steel" ], "techniques": [ "WBLOCK_2", "PRECISE" ], "flags": [ "STAB", "DURABLE_MELEE", "SHEATH_SWORD" ], - "weapon_category": [ "FENCING_WEAPONRY" ], + "weapon_category": [ "MEDIEVAL_SWORDS", "LONG_SWORDS", "FENCING_WEAPONRY" ], "weight": "1814 g", "volume": "2750 ml", "longest_side": "130 cm", @@ -625,7 +625,7 @@ "price_postapoc": 6000, "material": [ "steel" ], "flags": [ "DURABLE_MELEE", "SHEATH_SWORD" ], - "weapon_category": [ "LONG_SWORDS" ], + "weapon_category": [ "MEDIEVAL_SWORDS", "LONG_SWORDS" ], "techniques": [ "WBLOCK_2" ], "weight": "1814 g", "volume": "2750 ml", @@ -682,7 +682,7 @@ "to_hit": { "grip": "weapon", "length": "long", "surface": "line", "balance": "good" }, "category": "weapons", "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 8 ] ], - "weapon_category": [ "MEDIUM_SWORDS" ] + "weapon_category": [ "MEDIEVAL_SWORDS", "MEDIUM_SWORDS" ] }, { "id": "arming_sword_fake", @@ -878,7 +878,7 @@ "techniques": [ "RAPID", "WBLOCK_2" ], "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 13 ] ], "flags": [ "DURABLE_MELEE", "SHEATH_SWORD" ], - "weapon_category": [ "SHORT_SWORDS" ], + "weapon_category": [ "JAPANESE_SWORDS", "SHORT_SWORDS" ], "category": "weapons" }, { @@ -900,6 +900,7 @@ "techniques": [ "WBLOCK_1", "WIDE", "BRUTAL", "SWEEP" ], "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 4 ] ], "flags": [ "DURABLE_MELEE", "SHEATH_SWORD", "ALWAYS_TWOHAND" ], + "weapon_category": [ "MEDIEVAL_SWORDS" ], "category": "weapons" }, { @@ -985,7 +986,7 @@ "techniques": [ "WBLOCK_1", "RAPID", "WIDE", "BRUTAL" ], "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 10 ] ], "flags": [ "DURABLE_MELEE", "SHEATH_SWORD", "ALWAYS_TWOHAND" ], - "weapon_category": [ "LONG_SWORDS" ], + "weapon_category": [ "JAPANESE_SWORDS", "LONG_SWORDS" ], "category": "weapons" }, { @@ -1238,7 +1239,7 @@ "techniques": [ "WBLOCK_2" ], "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 9 ] ], "flags": [ "DURABLE_MELEE", "SHEATH_SWORD" ], - "weapon_category": [ "MEDIUM_SWORDS", "FENCING_WEAPONRY" ], + "weapon_category": [ "MEDIEVAL_SWORDS", "MEDIUM_SWORDS", "FENCING_WEAPONRY" ], "category": "weapons" }, { @@ -1321,7 +1322,7 @@ "techniques": [ "RAPID", "WBLOCK_2" ], "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 9 ] ], "flags": [ "DURABLE_MELEE", "SHEATH_SWORD" ], - "weapon_category": [ "MEDIUM_SWORDS" ], + "weapon_category": [ "JAPANESE_SWORDS", "MEDIUM_SWORDS" ], "category": "weapons" }, { @@ -1505,7 +1506,7 @@ "techniques": [ "WBLOCK_2" ], "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 9 ] ], "flags": [ "DURABLE_MELEE", "SHEATH_SWORD" ], - "weapon_category": [ "SHORT_SWORDS" ], + "weapon_category": [ "MEDIEVAL_SWORDS", "SHORT_SWORDS" ], "category": "weapons" }, { diff --git a/data/json/martialarts.json b/data/json/martialarts.json index 07fdce0ff71ab..3ed7c0bbbceca 100644 --- a/data/json/martialarts.json +++ b/data/json/martialarts.json @@ -821,32 +821,7 @@ } ], "techniques": [ "tec_swordsmanship_feint", "tec_swordsmanship_lethal", "tec_swordsmanship_ringen" ], - "weapons": [ - "arming_sword", - "arming_sword_inferior", - "arming_sword_fake", - "broadsword", - "broadsword_inferior", - "broadsword_fake", - "estoc", - "estoc_inferior", - "estoc_fake", - "longsword", - "longsword_inferior", - "longsword_fake", - "sword_crude", - "sword_nail", - "sword_wood", - "sword_metal", - "zweihander", - "zweihander_inferior", - "zweihander_fake", - "cutlass", - "cutlass_fake", - "cutlass_inferior", - "cavalry_sabre", - "cavalry_sabre_fake" - ] + "weapon_category": [ "MEDIEVAL_SWORDS", "CONSTRUCTED_SWORDS" ] }, { "type": "martial_art", diff --git a/data/json/weapon_categories.json b/data/json/weapon_categories.json index c07aad4543764..be59fd3e88fa8 100644 --- a/data/json/weapon_categories.json +++ b/data/json/weapon_categories.json @@ -73,5 +73,20 @@ "type": "weapon_category", "id": "BIONIC_WEAPONRY", "name": "BIONIC WEAPONRY" + }, + { + "type": "weapon_category", + "id": "MEDIEVAL_SWORDS", + "name": "MEDIEVAL SWORDS" + }, + { + "type": "weapon_category", + "id": "CONSTRUCTED_SWORDS", + "name": "CONSTRUCTED SWORDS" + }, + { + "type": "weapon_category", + "id": "JAPANESE_SWORDS", + "name": "JAPANESE SWORDS" } ] From 3d0ca929a1908e44b296a8fb8c16006bab8e1028 Mon Sep 17 00:00:00 2001 From: Anton Burmistrov Date: Thu, 16 Dec 2021 10:38:51 +0400 Subject: [PATCH 33/39] Added puddles with fresh water. Replaced shallow water in forests with puddles (#53231) * Added puddles with fresh and salt water * Updated water puddles generation for forests * Made terrains with SPAWN_WITH_LIQUID flag spawn liquid on their own spawn Type of liquid is defined by other flags, like FRESH_WATER and SALT_WATER. * Made examining puddles activate liquid handler * Made crafting aware of new terrain types, based on their iexamine type * Added documentation for new flags and iexamine action * Increased amount of water in puddles tenfold * Reverted spawn of puddles in swamps * Removed puddle with salt water as it no longer spawns anywhere * Replaced spawn of relatively clean water with fetid and poisonous murky water in swamps Also make murky water spawn more frequently than salt water. * Lint and astyle * Make water in puddles murky * Added chance to get parasites and contamination to murky water * Appease clang-tidy * Appease clang-tidy one more time --- .../terrain-liquids.json | 16 +++++++++-- data/json/regional_map_settings.json | 13 ++++++--- doc/EXAMINE.md | 1 + doc/JSON_FLAGS.md | 3 +++ src/iexamine.cpp | 12 +++++++++ src/iexamine.h | 1 + src/inventory.cpp | 3 ++- src/map.cpp | 27 +++++++++++++++++++ src/mapdata.cpp | 1 + src/mapdata.h | 1 + 10 files changed, 71 insertions(+), 7 deletions(-) diff --git a/data/json/furniture_and_terrain/terrain-liquids.json b/data/json/furniture_and_terrain/terrain-liquids.json index 30ffa1ce5953a..3b8d3b46bb105 100644 --- a/data/json/furniture_and_terrain/terrain-liquids.json +++ b/data/json/furniture_and_terrain/terrain-liquids.json @@ -63,7 +63,7 @@ "color": "light_blue", "looks_like": "t_water_sh", "move_cost": 5, - "flags": [ "TRANSPARENT", "LIQUID", "NO_SCENT", "SWIMMABLE", "FISHABLE", "SHALLOW_WATER" ], + "flags": [ "TRANSPARENT", "LIQUID", "NO_SCENT", "SWIMMABLE", "FISHABLE", "SHALLOW_WATER", "MURKY" ], "connects_to": "WATER", "examine_action": "water_source" }, @@ -78,7 +78,7 @@ "looks_like": "t_water_sh", "move_cost": 5, "roof": "t_rock_roof", - "flags": [ "TRANSPARENT", "LIQUID", "NO_SCENT", "SWIMMABLE", "FISHABLE", "INDOORS", "SHALLOW_WATER" ], + "flags": [ "TRANSPARENT", "LIQUID", "NO_SCENT", "SWIMMABLE", "FISHABLE", "INDOORS", "SHALLOW_WATER", "MURKY" ], "connects_to": "WATER", "examine_action": "water_source" }, @@ -405,5 +405,17 @@ "flags": [ "TRANSPARENT", "LIQUID", "NO_SCENT", "SWIMMABLE", "SHALLOW_WATER" ], "connects_to": "WATER", "examine_action": "water_source" + }, + { + "type": "terrain", + "id": "t_puddle", + "name": "recess", + "description": "A shallow pit in the ground.", + "looks_like": "t_dirt", + "symbol": "~", + "color": "light_blue", + "move_cost": 3, + "flags": [ "TRANSPARENT", "LIQUIDCONT", "SPAWN_WITH_LIQUID", "FRESH_WATER", "MURKY" ], + "examine_action": "finite_water_source" } ] diff --git a/data/json/regional_map_settings.json b/data/json/regional_map_settings.json index 53d12acc9d85d..688344b8fdf55 100644 --- a/data/json/regional_map_settings.json +++ b/data/json/regional_map_settings.json @@ -292,7 +292,7 @@ "t_pit_shallow": 1 } }, - "water": { "sequence": 3, "chance": 512, "clear_types": false, "types": { "t_water_sh": 1 } } + "water": { "sequence": 3, "chance": 512, "clear_types": false, "types": { "t_puddle": 1 } } }, "clear_terrain_furniture": false, "terrain_furniture": { } @@ -342,7 +342,7 @@ "t_pit_shallow": 1 } }, - "water": { "sequence": 3, "chance": 512, "clear_types": false, "types": { "t_water_sh": 1 } } + "water": { "sequence": 3, "chance": 512, "clear_types": false, "types": { "t_puddle": 1 } } }, "clear_terrain_furniture": false, "terrain_furniture": { } @@ -396,10 +396,15 @@ "clear_types": false, "types": { "t_trunk": 1, "f_boulder_small": 2, "f_boulder_medium": 1 } }, - "water": { "sequence": 3, "chance": 2, "clear_types": false, "types": { "t_swater_sh": 12, "t_swater_dp": 1, "t_water_sh": 6 } } + "water": { + "sequence": 3, + "chance": 2, + "clear_types": false, + "types": { "t_swater_sh": 6, "t_swater_dp": 1, "t_water_murky": 12 } + } }, "clear_terrain_furniture": false, - "terrain_furniture": { "t_water_sh": { "chance": 2, "clear_furniture": false, "furniture": { "f_region_water_plant": 1 } } } + "terrain_furniture": { "t_water_murky": { "chance": 2, "clear_furniture": false, "furniture": { "f_region_water_plant": 1 } } } } }, "forest_trail_settings": { diff --git a/doc/EXAMINE.md b/doc/EXAMINE.md index cd833b8b07919..522c846087efd 100644 --- a/doc/EXAMINE.md +++ b/doc/EXAMINE.md @@ -16,6 +16,7 @@ The examine actors are specified as JSON objects with a `type` corresponding to - ```controls_gate``` Controls the attached gate. - ```dirtmound``` Plant seeds and plants. - ```elevator``` Use the elevator to change floors. +- ```finite_water_source``` Drink or get water from a water source. Unlike ordinary `water_source`, terrain with this examine action will get liquid from a finite source (liquid is placed on that tile as an item during the mapgen) and will stop functioning if said liquid if exhausted on that tile. - ```flower_poppy``` Pick the mutated poppy. - ```fswitch``` Flip the switch and the rocks will shift. - ```fungus``` Release spores as the terrain crumbles away. diff --git a/doc/JSON_FLAGS.md b/doc/JSON_FLAGS.md index ade271f101f50..778fbfa1a52fd 100644 --- a/doc/JSON_FLAGS.md +++ b/doc/JSON_FLAGS.md @@ -588,6 +588,7 @@ List of known flags, used in both `terrain.json` and `furniture.json`. - ```FLAT``` Player can build and move furniture on. - ```FORAGE_HALLU``` This item can be found with the `HIDDEN_HALLU` flag when found through foraging. - ```FORAGE_POISION``` This item can be found with the `HIDDEN_POISON` flag when found through foraging. +- ```FRESH_WATER``` Source of fresh water. Will spawn fresh water (once) on terrains with `SPAWN_WITH_LIQUID` flag. - ```GOES_DOWN``` Can use > to go down a level. - ```GOES_UP``` Can use < to go up a level. - ```GROWTH_SEEDLING``` This plant is in its seedling stage of growth. @@ -601,6 +602,7 @@ List of known flags, used in both `terrain.json` and `furniture.json`. - ```LIQUID``` Blocks movement, but isn't a wall (lava, water, etc.) - ```MINEABLE``` Can be mined with a pickaxe/jackhammer. - ```MOUNTABLE``` Suitable for guns with the `MOUNTED_GUN` flag. +- ```MURKY``` Water taker from tiles with this flag is badly poisoned (almost on par with sewage). - ```NOCOLLIDE``` Feature that simply doesn't collide with vehicles at all. - ```NOITEM``` Items cannot be added here but may overflow to adjacent tiles. See also `DESTROY_ITEM` - ```NO_FLOOR``` Things should fall when placed on this tile @@ -631,6 +633,7 @@ List of known flags, used in both `terrain.json` and `furniture.json`. - ```SHORT``` Feature too short to collide with vehicle protrusions. (mirrors, blades). - ```SIGN``` Show written message on examine. - ```SMALL_PASSAGE``` This terrain or furniture is too small for large or huge creatures to pass through. +- ```SPAWN_WITH_LIQUID``` This terrain will place liquid (once) on its own spawn. Type of liquid is defined by other flags. For example, it spawns fresh water via `FRESH_WATER` flag. - ```SUN_ROOF_ABOVE``` This furniture (terrain is not supported currently) has a "fake roof" above, that blocks sunlight. Special hack for #44421, to be removed later. - ```SUPPORTS_ROOF``` Used as a boundary for roof construction. - ```SUPPRESS_SMOKE``` Prevents smoke from fires; used by ventilated wood stoves, etc. diff --git a/src/iexamine.cpp b/src/iexamine.cpp index 3be4f5026a269..50f6908cfbb71 100644 --- a/src/iexamine.cpp +++ b/src/iexamine.cpp @@ -3967,6 +3967,17 @@ void iexamine::clean_water_source( Character &, const tripoint &examp ) liquid_handler::handle_liquid( water, nullptr, 0, &examp ); } +void iexamine::finite_water_source( Character &, const tripoint &examp ) +{ + map_stack items = get_map().i_at( examp ); + for( auto item_it = items.begin(); item_it != items.end(); ++item_it ) { + if( item_it->made_of( phase_id::LIQUID ) ) { + liquid_handler::handle_liquid_from_ground( item_it, examp ); + break; + } + } +} + const itype *furn_t::crafting_pseudo_item_type() const { if( crafting_pseudo_item.is_empty() ) { @@ -6360,6 +6371,7 @@ iexamine_functions iexamine_functions_from_string( const std::string &function_n { "shrub_wildveggies", &iexamine::shrub_wildveggies }, { "water_source", &iexamine::water_source }, { "clean_water_source", &iexamine::clean_water_source }, + { "finite_water_source", &iexamine::finite_water_source }, { "reload_furniture", &iexamine::reload_furniture }, { "curtains", &iexamine::curtains }, { "sign", &iexamine::sign }, diff --git a/src/iexamine.h b/src/iexamine.h index 641b6ed6b620d..1f173a8c423a3 100644 --- a/src/iexamine.h +++ b/src/iexamine.h @@ -112,6 +112,7 @@ void tree_marloss( Character &you, const tripoint &examp ); void shrub_wildveggies( Character &you, const tripoint &examp ); void water_source( Character &, const tripoint &examp ); void clean_water_source( Character &, const tripoint &examp ); +void finite_water_source( Character &, const tripoint &examp ); void kiln_empty( Character &you, const tripoint &examp ); void kiln_full( Character &you, const tripoint &examp ); void arcfurnace_empty( Character &you, const tripoint &examp ); diff --git a/src/inventory.cpp b/src/inventory.cpp index fddf807275a3c..51def36b835ff 100644 --- a/src/inventory.cpp +++ b/src/inventory.cpp @@ -540,7 +540,8 @@ void inventory::form_from_map( map &m, std::vector pts, const Characte } // keg-kludge - if( m.furn( p )->has_examine( iexamine::keg ) ) { + if( m.furn( p )->has_examine( iexamine::keg ) || + m.ter( p )->has_examine( iexamine::finite_water_source ) ) { map_stack liq_contained = m.i_at( p ); for( auto &i : liq_contained ) { if( i.made_of( phase_id::LIQUID ) ) { diff --git a/src/map.cpp b/src/map.cpp index 22e7b075bb94d..033904bdedee5 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -103,6 +103,8 @@ static const ammotype ammo_battery( "battery" ); +static const diseasetype_id disease_bad_food( "bad_food" ); + static const efftype_id effect_boomered( "boomered" ); static const efftype_id effect_crushed( "crushed" ); @@ -1748,6 +1750,21 @@ bool map::ter_set( const tripoint &p, const ter_id &new_terrain ) support_cache_dirty.insert( p ); set_seen_cache_dirty( p ); } + + if( new_t.has_flag( "SPAWN_WITH_LIQUID" ) ) { + if( new_t.has_flag( "FRESH_WATER" ) ) { + item water( "water", calendar::start_of_cataclysm ); + // TODO: Move all numeric values to json + water.charges = rng( 40, 240 ); + if( new_t.has_flag( ter_furn_flag::TFLAG_MURKY ) ) { + water.poison = rng( 1, 6 ); + water.get_comestible()->parasites = 5; + water.get_comestible()->contamination = { { disease_bad_food, 5 } }; + } + add_item( p, water ); + } + } + invalidate_max_populated_zlev( p.z ); set_memory_seen_cache_dirty( p ); @@ -4521,6 +4538,16 @@ item map::water_from( const tripoint &p ) return ret; } + if( has_flag( ter_furn_flag::TFLAG_MURKY, p ) ) { + item ret( "water", calendar::turn, item::INFINITE_CHARGES ); + ret.set_item_temperature( temp_to_kelvin( std::max( weather.get_temperature( p ), + temperatures::cold ) ) ); + ret.poison = rng( 1, 6 ); + ret.get_comestible()->parasites = 5; + ret.get_comestible()->contamination = { { disease_bad_food, 5 } }; + return ret; + } + const ter_id terrain_id = ter( p ); if( terrain_id == t_sewage ) { item ret( "water_sewage", calendar::turn, item::INFINITE_CHARGES ); diff --git a/src/mapdata.cpp b/src/mapdata.cpp index 59b162ea26017..74b2f303f8664 100644 --- a/src/mapdata.cpp +++ b/src/mapdata.cpp @@ -249,6 +249,7 @@ std::string enum_to_string( ter_furn_flag data ) case ter_furn_flag::TFLAG_BLOCKSDOOR: return "BLOCKSDOOR"; case ter_furn_flag::TFLAG_NO_SELF_CONNECT: return "NO_SELF_CONNECT"; case ter_furn_flag::TFLAG_BURROWABLE: return "BURROWABLE"; + case ter_furn_flag::TFLAG_MURKY: return "MURKY"; // *INDENT-ON* case ter_furn_flag::NUM_TFLAG_FLAGS: diff --git a/src/mapdata.h b/src/mapdata.h index 99d3b6b42c385..ad3a81aac9468 100644 --- a/src/mapdata.h +++ b/src/mapdata.h @@ -293,6 +293,7 @@ enum class ter_furn_flag : int { TFLAG_BLOCKSDOOR, TFLAG_NO_SELF_CONNECT, TFLAG_BURROWABLE, + TFLAG_MURKY, NUM_TFLAG_FLAGS }; From ecf55406b84c3fd4aefb6541525caac272854413 Mon Sep 17 00:00:00 2001 From: dnworden <59940356+dnworden@users.noreply.github.com> Date: Thu, 16 Dec 2021 01:45:11 -0500 Subject: [PATCH 34/39] Lets liquid soap be used to clean clothes (#53161) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Make liquid soap a detergent with count 5 As a side effect, it's no longer a comestible and can't be drank, but you probably shouldn't do that anyway. * Add liquid soap to finish washing * Attempting to fix liquid error * Lets liquid soap be used for soapy water crafting * Fixes alphabetical order * Dratted whitespace ruining my style * I think this is what the style checker means now * Makes liquid soap move to the chemical stuff section * Surely this isn't what the astyle was complaining about right? * Wait no it's just something dumb * Changing it back because it still doesn't like the style * Ok this should fix it * Using json linted version * Reduce long lines * Testing an exception * Fixing syntax * Change count to charges * Undo unnecessary check * Change it back to count * ADD LIQUID SOAP TO THE PLACE IT ACTUALLY BELONGS GITHUB * Trust me bro (hopefully this actually works) * Adds checking for unused cleansers * Appeasing astyle * Using allman formatting for astyle * Undoes that because it changed everything * Trying again with the proper astyle * Also format all of iuse with the astyle settings * Reverse some of the changes astyle made * Refactored washing to use only one component vector Hopefully it stops sending errors this way * Nearly missed that one * Update src/activity_item_handling.cpp Co-authored-by: Álvaro Co-authored-by: Álvaro --- data/json/items/chemicals_and_resources.json | 12 +++++------- data/json/recipes/recipe_medsandchemicals.json | 5 ++++- src/activity_item_handling.cpp | 6 +++++- src/iuse.cpp | 7 +++++-- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/data/json/items/chemicals_and_resources.json b/data/json/items/chemicals_and_resources.json index 1d4f0e2949f5c..fd260c0099f0f 100644 --- a/data/json/items/chemicals_and_resources.json +++ b/data/json/items/chemicals_and_resources.json @@ -1745,24 +1745,22 @@ "count": 100 }, { - "type": "COMESTIBLE", + "type": "AMMO", "id": "liquid_soap", "name": { "str_sp": "liquid soap" }, + "category": "chems", "weight": "260 g", "color": "light_cyan", "container": "bottle_bathroom", "sealed": false, - "comestible_type": "DRINK", "symbol": "~", - "quench": -90, - "healthy": -20, "description": "Liquid soap.", "price": 0, "price_postapoc": 0, "volume": "250 ml", "phase": "liquid", - "category": "chems", - "freezing_point": -2, - "fun": -50 + "ammo_type": "components", + "flags": [ "DETERGENT" ], + "count": 5 } ] diff --git a/data/json/recipes/recipe_medsandchemicals.json b/data/json/recipes/recipe_medsandchemicals.json index 5efc8ba4c1dd7..0d59a7b5cdb35 100644 --- a/data/json/recipes/recipe_medsandchemicals.json +++ b/data/json/recipes/recipe_medsandchemicals.json @@ -21,7 +21,10 @@ "time": "1 m", "autolearn": true, "flags": [ "BLIND_HARD" ], - "components": [ [ [ "water_clean", 1 ], [ "water", 1 ] ], [ [ "soap", 1 ], [ "soap_flakes", 15 ], [ "detergent", 1 ] ] ] + "components": [ + [ [ "water_clean", 1 ], [ "water", 1 ] ], + [ [ "soap", 1 ], [ "soap_flakes", 15 ], [ "detergent", 1 ], [ "liquid_soap", 1 ] ] + ] }, { "type": "recipe", diff --git a/src/activity_item_handling.cpp b/src/activity_item_handling.cpp index c7a02f6ad8d9c..886d9595537b9 100644 --- a/src/activity_item_handling.cpp +++ b/src/activity_item_handling.cpp @@ -98,6 +98,7 @@ static const efftype_id effect_incorporeal( "incorporeal" ); static const itype_id itype_battery( "battery" ); static const itype_id itype_detergent( "detergent" ); static const itype_id itype_disassembly( "disassembly" ); +static const itype_id itype_liquid_soap( "liquid_soap" ); static const itype_id itype_log( "log" ); static const itype_id itype_mop( "mop" ); static const itype_id itype_soap( "soap" ); @@ -506,7 +507,9 @@ void activity_handlers::washing_finish( player_activity *act, Character *you ) act->set_to_null(); return; } else if( !crafting_inv.has_charges( itype_soap, required.cleanser ) && - !crafting_inv.has_charges( itype_detergent, required.cleanser ) ) { + !crafting_inv.has_charges( itype_detergent, required.cleanser ) && + !crafting_inv.has_charges( itype_liquid_soap, required.cleanser, + is_liquid_crafting_component ) ) { you->add_msg_if_player( _( "You need %1$i charges of cleansing agent to wash these items." ), required.cleanser ); act->set_to_null(); @@ -527,6 +530,7 @@ void activity_handlers::washing_finish( player_activity *act, Character *you ) std::vector comps1; comps1.emplace_back( itype_soap, required.cleanser ); comps1.emplace_back( itype_detergent, required.cleanser ); + comps1.emplace_back( itype_liquid_soap, required.cleanser ); you->consume_items( comps1 ); you->add_msg_if_player( m_good, _( "You washed your items." ) ); diff --git a/src/iuse.cpp b/src/iuse.cpp index e389adf0e084f..36cc0aa821a8c 100644 --- a/src/iuse.cpp +++ b/src/iuse.cpp @@ -265,6 +265,7 @@ static const itype_id itype_handrolled_cig( "handrolled_cig" ); static const itype_id itype_heatpack_used( "heatpack_used" ); static const itype_id itype_hygrometer( "hygrometer" ); static const itype_id itype_joint( "joint" ); +static const itype_id itype_liquid_soap( "liquid_soap" ); static const itype_id itype_log( "log" ); static const itype_id itype_mask_h20survivor_on( "mask_h20survivor_on" ); static const itype_id itype_mininuke_act( "mininuke_act" ); @@ -9299,7 +9300,8 @@ cata::optional iuse::wash_items( Character *p, bool soft_items, bool hard_i crafting_inv.charges_of( itype_water_clean, INT_MAX, is_liquid ) ); int available_cleanser = std::max( crafting_inv.charges_of( itype_soap ), - crafting_inv.charges_of( itype_detergent ) ); + std::max( crafting_inv.charges_of( itype_detergent ), + crafting_inv.charges_of( itype_liquid_soap, INT_MAX, is_liquid ) ) ); const inventory_filter_preset preset( [soft_items, hard_items]( const item_location & location ) { return location->has_flag( flag_FILTHY ) && ( ( soft_items && location->is_soft() ) || @@ -9358,7 +9360,8 @@ cata::optional iuse::wash_items( Character *p, bool soft_items, bool hard_i required.water ); return cata::nullopt; } else if( !crafting_inv.has_charges( itype_soap, required.cleanser ) && - !crafting_inv.has_charges( itype_detergent, required.cleanser ) ) { + !crafting_inv.has_charges( itype_detergent, required.cleanser ) && + !crafting_inv.has_charges( itype_liquid_soap, required.cleanser, is_liquid ) ) { p->add_msg_if_player( _( "You need %1$i charges of cleansing agent to wash these items." ), required.cleanser ); return cata::nullopt; From bd06592272c7f051ed41c055c34b270214c0870e Mon Sep 17 00:00:00 2001 From: TannHaals Date: Thu, 16 Dec 2021 17:02:00 +0800 Subject: [PATCH 35/39] Update helmets.json --- data/json/items/armor/helmets.json | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/data/json/items/armor/helmets.json b/data/json/items/armor/helmets.json index 1e67198421ed0..975e1f1c1e9c4 100644 --- a/data/json/items/armor/helmets.json +++ b/data/json/items/armor/helmets.json @@ -498,14 +498,14 @@ "price_postapoc": 750, "to_hit": -1, "bashing": 7, - "material": [ "plastic", "nomex" ], + "material": [ "plastic", "epoxy" ], "symbol": "[", "color": "dark_gray", "armor": [ { "material": [ - { "type": "plastic", "covered_by_mat": 100, "thickness": 6.0 }, - { "type": "nomex", "covered_by_mat": 100, "thickness": 6.0 } + { "type": "plastic", "covered_by_mat": 100, "thickness": 2.0 }, + { "type": "epoxy", "covered_by_mat": 100, "thickness": 0.5 } ], "covers": [ "head" ], "coverage": 100, @@ -513,8 +513,8 @@ }, { "material": [ - { "type": "plastic", "covered_by_mat": 100, "thickness": 6.0 }, - { "type": "nomex", "covered_by_mat": 100, "thickness": 6.0 } + { "type": "plastic", "covered_by_mat": 100, "thickness": 2.0 }, + { "type": "epoxy", "covered_by_mat": 100, "thickness": 0.5 } ], "covers": [ "eyes" ], "coverage": 100, @@ -522,8 +522,8 @@ }, { "material": [ - { "type": "plastic", "covered_by_mat": 100, "thickness": 6.0 }, - { "type": "nomex", "covered_by_mat": 100, "thickness": 6.0 } + { "type": "plastic", "covered_by_mat": 100, "thickness": 2.0 }, + { "type": "epoxy", "covered_by_mat": 100, "thickness": 0.5 } ], "covers": [ "mouth" ], "coverage": 100, @@ -551,14 +551,14 @@ "price_postapoc": 750, "to_hit": -1, "bashing": 7, - "material": [ "plastic", "nomex" ], + "material": [ "plastic", "epoxy" ], "symbol": "[", "color": "dark_gray", "armor": [ { "material": [ - { "type": "plastic", "covered_by_mat": 100, "thickness": 6.0 }, - { "type": "nomex", "covered_by_mat": 100, "thickness": 6.0 } + { "type": "plastic", "covered_by_mat": 100, "thickness": 2.0 }, + { "type": "epoxy", "covered_by_mat": 100, "thickness": 0.5 } ], "encumbrance": 25, "coverage": 100, From cfc00fa884fe9d4d623537c83b6b67550c166e32 Mon Sep 17 00:00:00 2001 From: Charlie Gardai <32105250+Moltenhead@users.noreply.github.com> Date: Thu, 16 Dec 2021 15:53:17 +0100 Subject: [PATCH 36/39] Better worn container display (#48109) * wip: first test * wip: first working conditions * feat: add unit_to_string wrapper to handle most units display, add the ability to use compact param to remove whitespaces for to_string functions, add remove_trailing_zeroes to to_string functions to have the ability to remove trailing zeros, add round function to be able to round a double specifying decimal places * feat: add bool is_restricted method * feat: add divers utility get method to obtain capacity and weight capacity of contents, add unrestricted_pockets_only argument in some of get capacity related methods to limit the total of capacities to contained unrestricted pockets only * feat: add some utility get methods to obtain capacity related data and pocket restriction, add unrestricted_pockets_only argument to some of capacity related get methods to be able to only calculate capacity based upon unrestricted pockets only * feat: add container_data struct to handle item container data, add display to inventory_ui to display `(remains $REMAINING_UNRESTRICTED_VOLUME, $REMAINING_UNRESTRICTED_WEIGHT), max length $MAX_UNRESTRICTED_ITEM_LENGTH` after item name and item filling, if : the item is worn, the item is a container, the item has at least 1 unrestricted pocket * rm: duplicated debugmsg * fix : int to size_t comparison through static_cast * fix: custom_category attribute previously moved to public for testing purposes, put back to private members as it should * astyle: update * fix?: private public shenanigans * fix: quick fix for unwanted behaviour extension to all inventory panes * fix: wrongly associating item if within worn items menu `;` but not worn - due to item_category handling * astyle: update * fix: trying to fix clang-tidy errors * astyle: update * fix?: clang it up * fix: clang it up * fix: lgtm * fix: omitted declaration rename * fit: default decimal places with a variable * fix: wrong behaviour on restricted pockets * fix: string format error for vol_to_string when remove_trailing_zeroes == false * fix: inverted condition for max_containable_length with unrestricted_pockets_only * fix: formatting error for weight_to_string when remove_trailing_zeroes is false * fix: clang-tidy * chore - astyle: update * fix: } supression while resolving conflicts * fix: string_id to static * fix: duplicated addition made during conflict resolve Co-authored-by: Kevin Granade --- src/inventory_ui.cpp | 47 +++++++++++++++- src/inventory_ui.h | 2 + src/item.cpp | 52 +++++++++++++++-- src/item.h | 26 ++++++++- src/item_contents.cpp | 126 +++++++++++++++++++++++++++++++++++------- src/item_contents.h | 21 ++++--- src/item_pocket.cpp | 5 ++ src/item_pocket.h | 1 + src/units_utility.cpp | 54 +++++++++++++++--- src/units_utility.h | 18 +++++- 10 files changed, 305 insertions(+), 47 deletions(-) diff --git a/src/inventory_ui.cpp b/src/inventory_ui.cpp index b9ec030a1daea..70834925ca366 100644 --- a/src/inventory_ui.cpp +++ b/src/inventory_ui.cpp @@ -144,6 +144,27 @@ struct inventory_input { inventory_entry *entry; }; +struct container_data { + units::volume actual_capacity; + units::volume total_capacity; + units::mass actual_capacity_weight; + units::mass total_capacity_weight; + units::length max_containable_length; + + std::string to_formatted_string( const bool compact = true ) { + std::string string_to_format; + if( compact ) { + string_to_format = "%s/%s : %s/%s : max %s"; + } else { + string_to_format = "(remains %s, %s) max length %s"; + } + return string_format( string_to_format, + unit_to_string( total_capacity - actual_capacity, true, true ), + unit_to_string( total_capacity_weight - actual_capacity_weight, true, true ), + unit_to_string( max_containable_length, true ) ); + } +}; + static int contained_offset( const item_location &loc ) { if( loc.where() != item_location::type::container ) { @@ -388,7 +409,31 @@ std::string inventory_selector_preset::get_cell_text( const inventory_entry &ent if( !entry ) { return std::string(); } else if( entry.is_item() ) { - return cells[cell_index].get_text( entry ); + std::string text = cells[cell_index].get_text( entry ); + const item &actual_item = *entry.locations.front(); + if( cell_index == 0 && !text.empty() && + entry.get_category_ptr()->get_id() == item_category_ITEMS_WORN && + actual_item.is_worn_by_player() && + actual_item.is_container() && actual_item.has_unrestricted_pockets() ) { + const units::volume total_capacity = actual_item.get_total_capacity( true ); + const units::mass total_capacity_weight = actual_item.get_total_weight_capacity( true ); + const units::length max_containable_length = actual_item.max_containable_length( true ); + + const units::volume actual_capacity = actual_item.get_total_contained_volume( true ); + const units::mass actual_capacity_weight = actual_item.get_total_contained_weight( true ); + + container_data container_data = { + actual_capacity, + total_capacity, + actual_capacity_weight, + total_capacity_weight, + max_containable_length + }; + std::string formatted_string = container_data.to_formatted_string( false ); + + text = text + string_format( " %s", formatted_string ); + } + return text; } else if( cell_index != 0 ) { return replace_colors( cells[cell_index].title ); } else { diff --git a/src/inventory_ui.h b/src/inventory_ui.h index 2de9eb2eb6642..452f6d94f46e4 100644 --- a/src/inventory_ui.h +++ b/src/inventory_ui.h @@ -26,6 +26,7 @@ #include "optional.h" #include "pimpl.h" #include "translations.h" +#include "units.h" #include "units_fwd.h" class Character; @@ -51,6 +52,7 @@ enum class toggle_mode : int { }; struct inventory_input; +struct container_data; struct navigation_mode_data; using drop_location = std::pair; diff --git a/src/item.cpp b/src/item.cpp index 94cb44920a103..2877b5fb68f65 100644 --- a/src/item.cpp +++ b/src/item.cpp @@ -1028,6 +1028,10 @@ bool item::is_worn_only_with( const item &it ) const { return is_power_armor() && it.is_power_armor() && it.covers( bodypart_id( "torso" ) ); } +bool item::is_worn_by_player() const +{ + return get_player_character().is_worn( *this ); +} item item::in_its_container( int qty ) const { @@ -8104,6 +8108,18 @@ bool item::is_container() const return contents.has_pocket_type( item_pocket::pocket_type::CONTAINER ); } +bool item::is_container_with_restriction() const +{ + if( !is_container() ) { + return false; + } + return contents.is_restricted_container(); +} + +bool item::is_single_container_with_restriction() const +{ + return contents.is_single_restricted_container(); +} bool item::has_pocket_type( item_pocket::pocket_type pk_type ) const { @@ -8417,9 +8433,9 @@ double item::calculate_by_enchantment_wield( double modify, enchant_vals::mod va return modify; } -units::length item::max_containable_length() const +units::length item::max_containable_length( const bool unrestricted_pockets_only ) const { - return contents.max_containable_length(); + return contents.max_containable_length( unrestricted_pockets_only ); } units::length item::min_containable_length() const @@ -9922,14 +9938,33 @@ int item::getlight_emit() const return lumint; } -units::volume item::get_total_capacity() const +units::volume item::get_total_capacity( const bool unrestricted_pockets_only ) const { - return contents.total_container_capacity(); + return contents.total_container_capacity( unrestricted_pockets_only ); } -units::mass item::get_total_weight_capacity() const +units::mass item::get_total_weight_capacity( const bool unrestricted_pockets_only ) const { - return contents.total_container_weight_capacity(); + return contents.total_container_weight_capacity( unrestricted_pockets_only ); +} + +units::volume item::get_remaining_capacity( const bool unrestricted_pockets_only ) const +{ + return contents.remaining_container_capacity( unrestricted_pockets_only ); +} +units::mass item::get_remaining_weight_capacity( const bool unrestricted_pockets_only ) const +{ + return contents.remaining_container_capacity_weight( unrestricted_pockets_only ); +} + + +units::volume item::get_total_contained_volume( const bool unrestricted_pockets_only ) const +{ + return contents.total_contained_volume( unrestricted_pockets_only ); +} +units::mass item::get_total_contained_weight( const bool unrestricted_pockets_only ) const +{ + return contents.total_contained_weight( unrestricted_pockets_only ); } int item::get_remaining_capacity_for_liquid( const item &liquid, bool allow_bucket, @@ -12040,6 +12075,11 @@ units::volume item::get_selected_stack_volume( const std::map return 0_ml; } +bool item::has_unrestricted_pockets() const +{ + return contents.has_unrestricted_pockets(); +} + units::volume item::get_contents_volume_with_tweaks( const std::map &without ) const { diff --git a/src/item.h b/src/item.h index cd5efaa7272cb..086b1c209da62 100644 --- a/src/item.h +++ b/src/item.h @@ -761,6 +761,10 @@ class item : public visitable /** Whether this is container. Note that container does not necessarily means it's * suitable for liquids. */ bool is_container() const; + /** Whether it is a container, and if it is has some restrictions */ + bool is_container_with_restriction() const; + /** Whether it is a container with only one pocket, and if it is has some restrictions */ + bool is_single_container_with_restriction() const; // whether the contents has a pocket with the associated type bool has_pocket_type( item_pocket::pocket_type pk_type ) const; bool has_any_with( const std::function &filter, @@ -829,12 +833,24 @@ class item : public visitable * It returns the maximum volume of any contents, including liquids, * ammo, magazines, weapons, etc. */ - units::volume get_total_capacity() const; - units::mass get_total_weight_capacity() const; + units::volume get_total_capacity( bool unrestricted_pockets_only = false ) const; + units::mass get_total_weight_capacity( bool unrestricted_pockets_only = false ) const; + + units::volume get_remaining_capacity( bool unrestricted_pockets_only = false ) const; + units::mass get_remaining_weight_capacity( bool unrestricted_pockets_only = false ) const; + + units::volume get_total_contained_volume( bool unrestricted_pockets_only = false ) const; + units::mass get_total_contained_weight( bool unrestricted_pockets_only = false ) const; // recursive function that checks pockets for remaining free space units::volume check_for_free_space() const; units::volume get_selected_stack_volume( const std::map &without ) const; + // checks if the item can have things placed in it + bool has_pockets() const { + // what has it gots in them, precious + return contents.has_pocket_type( item_pocket::pocket_type::CONTAINER ); + } + bool has_unrestricted_pockets() const; units::volume get_contents_volume_with_tweaks( const std::map &without ) const; units::volume get_nested_content_volume_recursive( const std::map &without ) const; @@ -1380,7 +1396,7 @@ class item : public visitable std::pair best_pocket( const item &it, item_location &parent, const item *avoid = nullptr, bool allow_sealed = false, bool ignore_settings = false ); - units::length max_containable_length() const; + units::length max_containable_length( bool unrestricted_pockets_only = false ) const; units::length min_containable_length() const; units::volume max_containable_volume() const; @@ -1877,6 +1893,10 @@ class item : public visitable * Returns true whether this item can be worn only when @param it is worn. */ bool is_worn_only_with( const item &it ) const; + /** + * Returns true wether this item is worn or not + */ + bool is_worn_by_player() const; /** * @name Pet armor related functions. diff --git a/src/item_contents.cpp b/src/item_contents.cpp index c1b0247caa942..d12a438da7212 100644 --- a/src/item_contents.cpp +++ b/src/item_contents.cpp @@ -595,12 +595,16 @@ item_pocket *item_contents::contained_where( const item &contained ) return nullptr; } -units::length item_contents::max_containable_length() const +units::length item_contents::max_containable_length( const bool unrestricted_pockets_only ) const { units::length ret = 0_mm; for( const item_pocket &pocket : contents ) { - if( !pocket.is_type( item_pocket::pocket_type::CONTAINER ) || pocket.is_ablative() || - pocket.holster_full() ) { + bool restriction_condition = !pocket.is_type( item_pocket::pocket_type::CONTAINER ) || + pocket.is_ablative() || pocket.holster_full(); + if( unrestricted_pockets_only ) { + restriction_condition = restriction_condition && pocket.is_restricted(); + } + if( restriction_condition ) { continue; } units::length candidate = pocket.max_containable_length(); @@ -638,14 +642,17 @@ std::set item_contents::magazine_flag_restrictions() const return ret; } -units::volume item_contents::max_containable_volume() const +units::volume item_contents::max_containable_volume( const bool unrestricted_pockets_only ) const { units::volume ret = 0_ml; for( const item_pocket &pocket : contents ) { - // pockets that aren't traditional containers or don't have a default value shouldn't be counted for this - if( !pocket.is_type( item_pocket::pocket_type::CONTAINER ) || pocket.is_ablative() || - pocket.holster_full() || - pocket.volume_capacity() >= pocket_data::max_volume_for_container ) { + bool restriction_condition = !pocket.is_type( item_pocket::pocket_type::CONTAINER ) || + pocket.is_ablative() || pocket.holster_full() || + pocket.volume_capacity() >= pocket_data::max_volume_for_container; + if( unrestricted_pockets_only ) { + restriction_condition = restriction_condition && pocket.is_restricted(); + } + if( restriction_condition ) { continue; } units::volume candidate = pocket.remaining_volume(); @@ -1037,6 +1044,17 @@ bool item_contents::has_pocket_type( const item_pocket::pocket_type pk_type ) co return false; } +bool item_contents::has_unrestricted_pockets() const +{ + int restricted_pockets_qty = 0; + for( const item_pocket &pocket : contents ) { + if( pocket.is_restricted() ) { + restricted_pockets_qty++; + } + } + return restricted_pockets_qty < static_cast ( get_all_contained_pockets().value().size() ); +} + bool item_contents::has_any_with( const std::function &filter, item_pocket::pocket_type pk_type ) const { @@ -1088,6 +1106,22 @@ bool item_contents::is_funnel_container( units::volume &bigger_than ) const return false; } +bool item_contents::is_restricted_container() const +{ + for( const item_pocket &pocket : contents ) { + if( pocket.is_restricted() ) { + return true; + } + } + return false; +} + +bool item_contents::is_single_restricted_container() const +{ + std::vector contained_pockets = get_all_contained_pockets().value(); + return contained_pockets.size() == 1 && contained_pockets[0]->is_restricted(); +} + item &item_contents::only_item() { if( num_item_stacks() != 1 ) { @@ -1386,12 +1420,18 @@ itype_id item_contents::magazine_default() const return itype_id::NULL_ID(); } -units::mass item_contents::total_container_weight_capacity() const +units::mass item_contents::total_container_weight_capacity( const bool unrestricted_pockets_only ) +const { units::mass total_weight = 0_gram; + for( const item_pocket &pocket : contents ) { - if( pocket.is_type( item_pocket::pocket_type::CONTAINER ) && !pocket.is_ablative() && - pocket.weight_capacity() < pocket_data::max_weight_for_container ) { + bool restriction_condition = pocket.is_type( item_pocket::pocket_type::CONTAINER ) && + !pocket.is_ablative() && pocket.weight_capacity() < pocket_data::max_weight_for_container; + if( unrestricted_pockets_only ) { + restriction_condition = restriction_condition && !pocket.is_restricted(); + } + if( restriction_condition ) { total_weight += pocket.weight_capacity(); } } @@ -1540,11 +1580,15 @@ std::vector< const item_pocket *> item_contents::get_all_reloadable_pockets() co return pockets; } -units::volume item_contents::total_container_capacity() const +units::volume item_contents::total_container_capacity( const bool unrestricted_pockets_only ) const { units::volume total_vol = 0_ml; for( const item_pocket &pocket : contents ) { - if( pocket.is_type( item_pocket::pocket_type::CONTAINER ) ) { + bool restriction_condition = pocket.is_type( item_pocket::pocket_type::CONTAINER ); + if( unrestricted_pockets_only ) { + restriction_condition = restriction_condition && !pocket.is_restricted(); + } + if( restriction_condition ) { const pocket_data *p_data = pocket.get_pocket_data(); // if the pocket has default volume or is a holster that has an // item in it instead of returning the volume return the volume of things contained @@ -1559,39 +1603,83 @@ units::volume item_contents::total_container_capacity() const return total_vol; } -units::volume item_contents::total_standard_capacity() const +units::volume item_contents::total_standard_capacity( const bool unrestricted_pockets_only ) const { units::volume total_vol = 0_ml; for( const item_pocket &pocket : contents ) { - if( pocket.is_standard_type() ) { + bool restriction_condition = pocket.is_standard_type(); + if( unrestricted_pockets_only ) { + restriction_condition = restriction_condition && !pocket.is_restricted(); + } + if( restriction_condition ) { total_vol += pocket.volume_capacity(); } } return total_vol; } -units::volume item_contents::remaining_container_capacity() const +units::volume item_contents::remaining_container_capacity( const bool unrestricted_pockets_only ) +const { units::volume total_vol = 0_ml; for( const item_pocket &pocket : contents ) { - if( pocket.is_type( item_pocket::pocket_type::CONTAINER ) ) { + bool restriction_condition = pocket.is_type( item_pocket::pocket_type::CONTAINER ); + if( unrestricted_pockets_only ) { + restriction_condition = restriction_condition && !pocket.is_restricted(); + } + if( restriction_condition ) { total_vol += pocket.remaining_volume(); } } return total_vol; } -units::volume item_contents::total_contained_volume() const +units::volume item_contents::total_contained_volume( const bool unrestricted_pockets_only ) const { units::volume total_vol = 0_ml; for( const item_pocket &pocket : contents ) { - if( pocket.is_type( item_pocket::pocket_type::CONTAINER ) ) { + bool restriction_condition = pocket.is_type( item_pocket::pocket_type::CONTAINER ); + if( unrestricted_pockets_only ) { + restriction_condition = restriction_condition && !pocket.is_restricted(); + } + if( restriction_condition ) { total_vol += pocket.contains_volume(); } } return total_vol; } +units::mass item_contents::remaining_container_capacity_weight( const bool + unrestricted_pockets_only ) const +{ + units::mass total_weight = 0_gram; + for( const item_pocket &pocket : contents ) { + bool restriction_condition = pocket.is_type( item_pocket::pocket_type::CONTAINER ); + if( unrestricted_pockets_only ) { + restriction_condition = restriction_condition && !pocket.is_restricted(); + } + if( restriction_condition ) { + total_weight += pocket.remaining_weight(); + } + } + return total_weight; +} + +units::mass item_contents::total_contained_weight( const bool unrestricted_pockets_only ) const +{ + units::mass total_weight = 0_gram; + for( const item_pocket &pocket : contents ) { + bool restriction_condition = pocket.is_type( item_pocket::pocket_type::CONTAINER ); + if( unrestricted_pockets_only ) { + restriction_condition = restriction_condition && !pocket.is_restricted(); + } + if( restriction_condition ) { + total_weight += pocket.contains_weight(); + } + } + return total_weight; +} + units::volume item_contents::get_contents_volume_with_tweaks( const std::map &without ) const { diff --git a/src/item_contents.h b/src/item_contents.h index fd7785c1daa37..358a1a95e5d8b 100644 --- a/src/item_contents.h +++ b/src/item_contents.h @@ -41,12 +41,11 @@ class item_contents std::pair best_pocket( const item &it, item_location &parent, const item *avoid = nullptr, bool allow_sealed = false, bool ignore_settings = false ); - units::length max_containable_length() const; + units::length max_containable_length( bool unrestricted_pockets_only = false ) const; units::length min_containable_length() const; - units::volume max_containable_volume() const; + units::volume max_containable_volume( bool unrestricted_pockets_only = false ) const; std::set magazine_flag_restrictions() const; - /** * returns whether any of the pockets contained is compatible with the specified item. * Does not check if the item actually fits volume/weight wise @@ -138,19 +137,21 @@ class item_contents units::length item_length_modifier() const; // gets the total weight capacity of all pockets - units::mass total_container_weight_capacity() const; + units::mass total_container_weight_capacity( bool unrestricted_pockets_only = false ) const; /** * gets the total volume available to be used. * does not guarantee that an item of that size can be inserted. */ - units::volume total_container_capacity() const; + units::volume total_container_capacity( bool unrestricted_pockets_only = false ) const; // Gets the total volume of every is_standard_type container - units::volume total_standard_capacity() const; + units::volume total_standard_capacity( bool unrestricted_pockets_only = false ) const; - units::volume remaining_container_capacity() const; - units::volume total_contained_volume() const; + units::volume remaining_container_capacity( bool unrestricted_pockets_only = false ) const; + units::volume total_contained_volume( bool unrestricted_pockets_only = false ) const; + units::mass remaining_container_capacity_weight( bool unrestricted_pockets_only = false ) const; + units::mass total_contained_weight( bool unrestricted_pockets_only = false ) const; units::volume get_contents_volume_with_tweaks( const std::map &without ) const; units::volume get_nested_content_volume_recursive( const std::map &without ) const; @@ -279,6 +280,7 @@ class item_contents // whether the contents has a pocket with the associated type bool has_pocket_type( item_pocket::pocket_type pk_type ) const; + bool has_unrestricted_pockets() const; bool has_any_with( const std::function &filter, item_pocket::pocket_type pk_type ) const; @@ -294,6 +296,9 @@ class item_contents bool same_contents( const item_contents &rhs ) const; // can this item be used as a funnel? bool is_funnel_container( units::volume &bigger_than ) const; + // the container has restrictions + bool is_restricted_container() const; + bool is_single_restricted_container() const; /** * @relates visitable * NOTE: upon expansion, this may need to be filtered by type enum depending on accessibility diff --git a/src/item_pocket.cpp b/src/item_pocket.cpp index d50230eaf9527..0ccd7aca758d8 100644 --- a/src/item_pocket.cpp +++ b/src/item_pocket.cpp @@ -392,6 +392,11 @@ bool item_pocket::is_funnel_container( units::volume &bigger_than ) const return false; } +bool item_pocket::is_restricted() const +{ + return !data->get_flag_restrictions().empty(); +} + std::list item_pocket::all_items_top() { std::list items; diff --git a/src/item_pocket.h b/src/item_pocket.h index 65fe0c2575bbe..0692df7599604 100644 --- a/src/item_pocket.h +++ b/src/item_pocket.h @@ -122,6 +122,7 @@ class item_pocket bool stacks_with( const item_pocket &rhs ) const; bool is_funnel_container( units::volume &bigger_than ) const; + bool is_restricted() const; bool has_any_with( const std::function &filter ) const; bool is_valid() const; diff --git a/src/units_utility.cpp b/src/units_utility.cpp index 9b6206fdfec5f..6861f958abd92 100644 --- a/src/units_utility.cpp +++ b/src/units_utility.cpp @@ -166,10 +166,23 @@ std::string length_units( const units::length &length ) } } -std::string weight_to_string( const units::mass &weight ) +std::string length_to_string( const units::length &length, const bool compact ) { - const double converted_weight = convert_weight( weight ); - return string_format( "%.2f %s", converted_weight, weight_units() ); + const int converted_length = convert_length( length ); + std::string string_to_format = "%u%s%s"; + return string_format( string_to_format, converted_length, compact ? "" : " ", + length_units( length ) ); +} + +std::string weight_to_string( const units::mass &weight, const bool compact, + const bool remove_trailing_zeroes ) +{ + const int default_decimal_places = 2; + const double converted_weight = round_with_places( convert_weight( weight ), + default_decimal_places ); + std::string string_to_format = remove_trailing_zeroes ? "%g%s%s" : "%." + + std::to_string( default_decimal_places ) + "f%s%s"; + return string_format( string_to_format, converted_weight, compact ? "" : " ", weight_units() ); } double convert_volume( int volume ) @@ -198,12 +211,39 @@ double convert_volume( int volume, int *out_scale ) return ret; } -std::string vol_to_string( const units::volume &vol ) +std::string vol_to_string( const units::volume &vol, const bool compact, + const bool remove_trailing_zeroes ) { int converted_volume_scale = 0; + const int default_decimal_places = 3; const double converted_volume = - convert_volume( vol.value(), - &converted_volume_scale ); + round_with_places( convert_volume( vol.value(), + &converted_volume_scale ), default_decimal_places ); + std::string string_to_format = remove_trailing_zeroes ? "%g%s%s" : "%." + + std::to_string( default_decimal_places ) + "f%s%s"; + return string_format( string_to_format, converted_volume, compact ? "" : " ", volume_units_abbr() ); +} + +std::string unit_to_string( const units::volume &unit, const bool compact, + const bool remove_trailing_zeroes ) +{ + return vol_to_string( unit, compact, remove_trailing_zeroes ); +} +std::string unit_to_string( const units::mass &unit, const bool compact, + const bool remove_trailing_zeroes ) +{ + return weight_to_string( unit, compact, remove_trailing_zeroes ); +} +std::string unit_to_string( const units::length &unit, const bool compact ) +{ + return length_to_string( unit, compact ); +} - return string_format( "%.3f %s", converted_volume, volume_units_abbr() ); +/** + * round a float @value, with int @decimal_places limitation +*/ +double round_with_places( double value, int decimal_places ) +{ + const double multiplier = std::pow( 10.0, decimal_places ); + return std::round( value * multiplier ) / multiplier; } diff --git a/src/units_utility.h b/src/units_utility.h index 50b5f277935f3..b5353d6996477 100644 --- a/src/units_utility.h +++ b/src/units_utility.h @@ -85,12 +85,14 @@ double convert_weight( const units::mass &weight ); */ int convert_length( const units::length &length ); std::string length_units( const units::length &length ); +std::string length_to_string( const units::length &length, bool compact = false ); /** Convert length to inches or cm. Used in pickup UI */ double convert_length_cm_in( const units::length &length ); /** convert a mass unit to a string readable by a human */ -std::string weight_to_string( const units::mass &weight ); +std::string weight_to_string( const units::mass &weight, bool compact = false, + bool remove_trailing_zeroes = false ); /** * Convert volume from ml to units defined by user. @@ -104,6 +106,16 @@ double convert_volume( int volume ); double convert_volume( int volume, int *out_scale ); /** convert a volume unit to a string readable by a human */ -std::string vol_to_string( const units::volume &vol ); - +std::string vol_to_string( const units::volume &vol, bool compact = false, + bool remove_trailing_zeroes = false ); + +/** convert any type of unit to a string readable by a human */ +std::string unit_to_string( const units::volume &unit, bool compact = false, + bool remove_trailing_zeroes = false ); +std::string unit_to_string( const units::mass &unit, bool compact = false, + bool remove_trailing_zeroes = false ); +std::string unit_to_string( const units::length &unit, bool compact = false ); + +/** utility function to round with specified decimal places */ +double round_with_places( double value, int decimal_places ); #endif // CATA_SRC_UNITS_UTILITY_H From 9fe84e0cfcbdeb633585bf597febb821b1de1ad8 Mon Sep 17 00:00:00 2001 From: andrei <68240139+andrei8l@users.noreply.github.com> Date: Fri, 17 Dec 2021 00:36:28 +0200 Subject: [PATCH 37/39] inv_col: show matching entries even if hidden (#53444) --- src/inventory_ui.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/inventory_ui.cpp b/src/inventory_ui.cpp index 70834925ca366..858e2b437e253 100644 --- a/src/inventory_ui.cpp +++ b/src/inventory_ui.cpp @@ -995,10 +995,14 @@ void inventory_column::prepare_paging( const std::string &filter ) return preset.get_filter( filter ); } ); + const auto is_visible = [&filter_fn, &filter]( inventory_entry const & it ) { + return it.is_item() && ( filter_fn( it ) && ( !filter.empty() || !it.is_hidden() ) ); + }; + // restore entries revealed by SHOW_CONTENTS // FIXME: replace by std::remove_copy_if in C++17 for( auto it = entries_hidden.begin(); it != entries_hidden.end(); ) { - if( it->is_item() && !it->is_hidden() && filter_fn( *it ) ) { + if( is_visible( *it ) ) { add_entry( *it ); it = entries_hidden.erase( it ); } else { @@ -1008,7 +1012,7 @@ void inventory_column::prepare_paging( const std::string &filter ) // First, remove all non-items and backup hidden entries for( auto it = entries.begin(); it != entries.end(); ) { - if( !it->is_item() || !filter_fn( *it ) || it->is_hidden() ) { + if( !is_visible( *it ) ) { if( it->is_item() ) { entries_hidden.emplace_back( std::move( *it ) ); } @@ -2552,6 +2556,8 @@ void inventory_selector::action_examine( const item_location sitem ) std::vector vDummy; sitem->info( true, vThisItem ); + vThisItem.insert( vThisItem.begin(), + { {}, string_format( _( "Location: %s" ), sitem.describe( &u ) ) } ); item_info_data data( sitem->tname(), sitem->type_name(), vThisItem, vDummy ); data.handle_scrolling = true; From 189c4bf94768450573320ea73ed0e34d98b5f001 Mon Sep 17 00:00:00 2001 From: Adam Chirnside Date: Thu, 16 Dec 2021 20:59:39 -0400 Subject: [PATCH 38/39] Fix currency pricing (#53478) Fixes #53467 Solution courtesy of dseguin --- src/npctrade.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/npctrade.cpp b/src/npctrade.cpp index 15ef527965d81..f436943de8a96 100644 --- a/src/npctrade.cpp +++ b/src/npctrade.cpp @@ -152,7 +152,7 @@ int npc_trading::adjusted_price( item const *it, int amount, Character const &bu Character const &seller ) { double const adjust = npc_trading::net_price_adjustment( buyer, seller ); - faction const *const fac = buyer.get_faction(); + faction const *const fac = buyer.is_npc() ? buyer.get_faction() : seller.get_faction(); int price = it->price_no_contents( true ); if( it->count_by_charges() and amount >= 0 ) { From eff6ef16e243e1eedffaeeedb219efc56f8c2b80 Mon Sep 17 00:00:00 2001 From: Kevin Granade Date: Thu, 16 Dec 2021 17:19:30 -0800 Subject: [PATCH 39/39] Temporarally disable brute-force mapgen test (#53506) Re-enable after fixing https://github.com/CleverRaven/Cataclysm-DDA/issues/52345 --- tests/overmap_test.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/overmap_test.cpp b/tests/overmap_test.cpp index 874b1bae9f194..c5d99d4e52559 100644 --- a/tests/overmap_test.cpp +++ b/tests/overmap_test.cpp @@ -376,9 +376,11 @@ TEST_CASE( "overmap_terrain_coverage", "[overmap][slow]" ) // The second phase of this test is to perform the tile-level mapgen once // for each oter_type, in hopes of triggering any errors that might arise // with that. + /* Temporarally disabled until we fix https://github.com/CleverRaven/Cataclysm-DDA/issues/52345 for( const std::pair &p : stats ) { const tripoint_abs_omt pos = p.second.first_observed; tinymap tm; tm.load( project_to( pos ), false ); } + */ }