diff --git a/.gitignore b/.gitignore index 63906ca162fec..2fbca40bf5209 100644 --- a/.gitignore +++ b/.gitignore @@ -51,6 +51,7 @@ Debug*/ *.user *.vcxproj.filters .vscode/ +*.code-workspace # Temporary and backup files *~ diff --git a/data/json/construction.json b/data/json/construction.json index 9cf01525db204..27726f9e155a2 100644 --- a/data/json/construction.json +++ b/data/json/construction.json @@ -2004,7 +2004,7 @@ "category" : "DIG", "required_skills" : [ [ "fabrication", 5 ], [ "survival", 3 ] ], "time" : 420, - "qualities": [ [ { "id": "AXE", "level": 2 } ], + "qualities": [ [ { "id": "AXE", "level": 2 }, { "id": "SAW_W", "level": 1 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "DIG", "level": 2 } ] ], @@ -2023,7 +2023,7 @@ "category" : "DIG", "required_skills" : [ [ "fabrication", 6 ], [ "survival", 4 ] ], "time" : 480, - "qualities": [ [ { "id": "AXE", "level": 2 } ], + "qualities": [ [ { "id": "AXE", "level": 2 }, { "id": "SAW_W", "level": 1 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "DIG", "level": 2 } ] ], @@ -2043,7 +2043,7 @@ "category" : "DIG", "required_skills" : [ [ "fabrication", 6 ], [ "survival", 4 ] ], "time" : 480, - "qualities": [ [ { "id": "AXE", "level": 2 } ], + "qualities": [ [ { "id": "AXE", "level": 2 }, { "id": "SAW_W", "level": 1 } ], [ { "id": "HAMMER", "level": 2 } ], [ { "id": "DIG", "level": 2 } ] ], diff --git a/data/json/item_actions.json b/data/json/item_actions.json index 31befd0822722..3200643b4c726 100644 --- a/data/json/item_actions.json +++ b/data/json/item_actions.json @@ -263,6 +263,10 @@ "type" : "item_action", "id" : "CLEAR_RUBBLE", "name" : "Clear rubble" + },{ + "type" : "item_action", + "id" : "COIN_FLIP", + "name" : "Flip" },{ "type" : "item_action", "id" : "COKE", @@ -443,6 +447,10 @@ "type" : "item_action", "id" : "LADDER", "name" : "Place" + },{ + "type" : "item_action", + "id" : "MAGIC_8_BALL", + "name" : "Ask" },{ "type" : "item_action", "id" : "MARLOSS", diff --git a/data/json/item_groups.json b/data/json/item_groups.json index 92fbe15eb0244..e6c6bca4570da 100644 --- a/data/json/item_groups.json +++ b/data/json/item_groups.json @@ -289,6 +289,7 @@ ["hat_cotton", 45], ["hat_knit", 25], ["hat_fur", 15], + ["hat_faux_fur", 30], ["hat_newsboy", 20], ["hat_sombrero", 3], ["helmet_bike", 35], @@ -575,7 +576,18 @@ ["scots_cookbook", 6], ["food_processor", 30 ], ["eclipse_glasses", 1], - ["thermos", 15] + ["thermos", 15], + {"item": "meat_canned", "prob": 4, "charges": 12, "container-item": "jar_3l_glass_sealed"}, + {"item": "veggy_canned", "prob": 4, "charges": 12, "container-item": "jar_3l_glass_sealed"}, + {"item": "apple_canned", "prob": 4, "charges": 12, "container-item": "jar_3l_glass_sealed"}, + {"item": "can_tomato", "prob": 4, "charges": 12, "container-item": "jar_3l_glass_sealed"}, + {"item": "fish_pickled", "prob": 4, "charges": 12, "container-item": "jar_3l_glass_sealed"}, + {"item": "human_pickled", "prob": 1, "charges": 12, "container-item": "jar_3l_glass_sealed"}, + {"item": "meat_pickled", "prob": 4, "charges": 12, "container-item": "jar_3l_glass_sealed"}, + {"item": "veggy_pickled", "prob": 4, "charges": 12, "container-item": "jar_3l_glass_sealed"}, + {"item": "fish_pickled", "prob": 4, "charges": 12, "container-item": "jar_3l_glass_sealed"}, + {"item": "sauce_red", "prob": 4, "charges": 12, "container-item": "jar_3l_glass_sealed"}, + {"item": "kompot", "prob": 4, "charges": 12, "container-item": "jar_3l_glass_sealed"} ] },{ "type" : "item_group", @@ -1773,7 +1785,18 @@ ["lutefisk", 1], ["dry_beans", 40], ["dry_rice", 40], - {"item": "meat_pickled", "prob": 6, "charges": 2, "container-item": "jar_glass_sealed"} + {"item": "meat_pickled", "prob": 6, "charges": 2, "container-item": "jar_glass_sealed"}, + {"item": "meat_canned", "prob": 4, "charges": 12, "container-item": "jar_3l_glass_sealed"}, + {"item": "veggy_canned", "prob": 4, "charges": 12, "container-item": "jar_3l_glass_sealed"}, + {"item": "apple_canned", "prob": 4, "charges": 12, "container-item": "jar_3l_glass_sealed"}, + {"item": "offal_canned", "prob": 1, "charges": 12, "container-item": "jar_3l_glass_sealed"}, + {"item": "can_tomato", "prob": 4, "charges": 12, "container-item": "jar_3l_glass_sealed"}, + {"item": "fish_pickled", "prob": 4, "charges": 12, "container-item": "jar_3l_glass_sealed"}, + {"item": "meat_pickled", "prob": 4, "charges": 12, "container-item": "jar_3l_glass_sealed"}, + {"item": "veggy_pickled", "prob": 4, "charges": 12, "container-item": "jar_3l_glass_sealed"}, + {"item": "fish_pickled", "prob": 4, "charges": 12, "container-item": "jar_3l_glass_sealed"}, + {"item": "sauce_red", "prob": 4, "charges": 12, "container-item": "jar_3l_glass_sealed"}, + {"item": "kompot", "prob": 4, "charges": 12, "container-item": "jar_3l_glass_sealed"} ] },{ "type" : "item_group", @@ -1937,6 +1960,7 @@ ["magnifying_glass", 5], ["chem_chromium_oxide", 5], ["chem_thermite", 10], + ["chem_zinc_powder", 10], ["denat_alcohol", 25], ["tourist_table", 1] ] @@ -2804,6 +2828,7 @@ ["hat_newsboy", 20], ["hat_knit", 25], ["hat_fur", 15], + ["hat_faux_fur", 20], ["pants_ski", 60], ["long_underpants", 40], ["long_undertop", 40], @@ -2817,14 +2842,19 @@ "type" : "item_group", "id" : "fancyfurs", "items":[ - ["hat_fur", 400], + ["hat_fur", 300], + ["hat_faux_fur", 300], ["sleeveless_trenchcoat_fur", 10], ["sleeveless_duster_fur", 10], + ["sleeveless_trenchcoat_faux_fur", 10], ["coat_fur_sf", 100], ["coat_faux_fur", 300], ["coat_fur", 300], ["gloves_fur", 300], - ["boots_fur", 200] + ["boots_fur", 200], + ["trenchcoat_faux_fur", 50], + ["duster_faux_fur", 50], + ["pants_faux_fur", 50] ] },{ "type" : "item_group", @@ -2832,6 +2862,7 @@ "items":[ ["hat_cotton", 30], ["hat_knit", 40], + ["hat_faux_fur", 30], ["hat_fur", 20], ["hat_newsboy", 20], ["hat_sombrero", 30], @@ -3024,6 +3055,7 @@ ["hat_newsboy", 20], ["hat_sombrero", 3], ["hat_fur", 15], + ["hat_faux_fur", 20], ["UPS_off", 5], ["adv_UPS_off", 3], ["under_armor", 20], @@ -3039,12 +3071,17 @@ ["arm_warmers", 20], ["leg_warmers", 20], ["trenchcoat_leather", 12], + ["trenchcoat_faux_fur", 6], ["sleeveless_trenchcoat", 2], ["sleeveless_trenchcoat_leather", 2], + ["sleeveless_trenchcoat_faux_fur", 2], + ["trenchcoat_leather", 12], ["sleeveless_trenchcoat_fur", 1], ["duster_leather", 12], + ["duster_faux_fur", 6], ["sleeveless_duster", 2], ["sleeveless_duster_leather", 2], + ["sleeveless_duster_faux_fur", 2], ["sleeveless_duster_fur", 1], ["cloak", 5], ["cloak_wool", 5], @@ -3288,6 +3325,7 @@ [ "textbook_biodiesel", 4 ], [ "textbook_fabrication", 4 ], [ "textbook_tailor", 4 ], + [ "recipe_fauxfur", 6 ], [ "carpentry_book", 4 ], [ "brewing_cookbook", 4 ], [ "computer_science", 8 ], @@ -3396,6 +3434,7 @@ ["textbook_gaswarfare", 5], ["recipe_bullets", 8], ["textbook_tailor", 12], + ["recipe_fauxfur", 4], ["recipe_bows", 4], ["recipe_arrows", 4], ["textbook_firstaid", 8], @@ -4346,7 +4385,9 @@ ["katana", 2], ["rapier", 3], ["cavalry_sabre", 2], - ["sf_watch", 5] + ["sf_watch", 5], + ["magic_8_ball", 1], + ["coin_quarter", 1] ] },{ "type" : "item_group", @@ -4556,6 +4597,7 @@ ["helmet_army", 40], ["helmet_liner", 10], ["hat_fur", 15], + ["hat_faux_fur", 15], ["hat_newsboy", 20], ["hat_sombrero", 5], ["holster", 8], @@ -4795,7 +4837,9 @@ ["l-stick", 1], ["solarpack", 5], ["tourist_table", 10], - ["thermos", 25] + ["thermos", 25], + ["magic_8_ball", 2], + ["coin_quarter", 2] ] },{ "type" : "item_group", @@ -5172,6 +5216,7 @@ ["charcoal", 15], ["chem_hydrogen_peroxide", 15], ["chem_carbide", 10], + ["chem_zinc_powder", 10], ["denat_alcohol", 10] ] },{ @@ -5225,6 +5270,7 @@ ["chem_saltpetre", 15], ["chem_nitric_acid", 15], ["chem_chromium_oxide", 10], + ["chem_zinc_powder", 10], ["denat_alcohol", 10] ] },{ @@ -8519,7 +8565,9 @@ ["straw_doll", 1], ["pitchfork", 1], ["straw_sandals", 1], - ["holy_symbol", 10] + ["holy_symbol", 10], + ["magic_8_ball", 1], + ["coin_quarter", 1] ] },{ "type" : "item_group", diff --git a/data/json/items/armor.json b/data/json/items/armor.json index eaaf24c9b92f6..c21bc7ee278f5 100644 --- a/data/json/items/armor.json +++ b/data/json/items/armor.json @@ -1866,10 +1866,11 @@ "type": "ARMOR", "copy-from": "coat_fur", "name": "faux fur coat", - "description": "A garishly colored faux fur coat with a couple small pockets. Although not as warm as the natural fur, it gives you some of that unique flair.", + "description": "A garishly-colored faux fur coat with a couple small pockets. Although not as warm as the natural fur, it gives you some of that unique flair.", "material": [ "faux_fur", "cotton" ], "color": "pink", "covers": [ "TORSO", "ARMS" ], + "flags": [ "VARSIZE", "POCKETS", "OUTER", "SUPER_FANCY" ], "warmth": 70 }, { @@ -2419,6 +2420,17 @@ "environmental_protection": 1, "flags": [ "VARSIZE", "POCKETS", "OUTER", "WATERPROOF", "RAINPROOF" ] }, + { + "id": "duster_faux_fur", + "type": "ARMOR", + "copy-from": "duster_fur", + "name": "faux fur duster", + "description": "A thick faux fur duster, falling below your knees. Has many pockets for storing things.", + "material": [ "faux_fur", "cotton" ], + "covers": [ "TORSO", "ARMS", "LEGS" ], + "flags": [ "VARSIZE", "POCKETS", "OUTER", "FANCY" ], + "warmth": 40 + }, { "id": "duster_leather", "type": "ARMOR", @@ -2687,7 +2699,7 @@ "type": "holster", "holster_prompt": "Attach what to belt loop?", "holster_msg": "You clip your %s to your %s", - "max_volume": 5, + "max_volume": 8, "max_weight": 3600, "draw_cost": 50, "flags": [ "BELT_CLIP" ] @@ -4056,6 +4068,17 @@ "warmth": 70, "material_thickness": 3 }, + { + "id": "hat_faux_fur", + "type": "ARMOR", + "copy-from": "hat_fur", + "name": "faux fur hat", + "description": "A stylish hat made of faux fur. Like real fur, but without the suffering, if the tag is to be believed. Very warm.", + "material": [ "faux_fur", "cotton" ], + "covers": [ "HEAD" ], + "flags": [ "FANCY" ], + "warmth": 60 + }, { "id": "hat_hard", "type": "ARMOR", @@ -6801,6 +6824,16 @@ "environmental_protection": 3, "flags": [ "VARSIZE", "POCKETS" ] }, + { + "id": "pants_faux_fur", + "type": "ARMOR", + "copy-from": "pants_fur", + "name": "faux fur pants", + "description": "A pair of long cotton pants lined with warm imitation fur.", + "material": [ "faux_fur", "cotton" ], + "covers": [ "LEGS" ], + "warmth": 70 + }, { "id": "pants_leather", "type": "ARMOR", @@ -7868,6 +7901,17 @@ "environmental_protection": 1, "flags": [ "VARSIZE", "POCKETS", "OUTER", "WATERPROOF", "RAINPROOF" ] }, + { + "id": "sleeveless_duster_faux_fur", + "type": "ARMOR", + "copy-from": "sleeveless_duster_fur", + "name": "sleeveless faux fur duster", + "description": "A thick, sleeveless faux fur duster, falling below your knees. Has many pockets for storing things.", + "material": [ "faux_fur", "cotton" ], + "covers": [ "TORSO", "LEGS" ], + "flags": [ "VARSIZE", "POCKETS", "OUTER", "FANCY" ], + "warmth": 40 + }, { "id": "sleeveless_duster_leather", "type": "ARMOR", @@ -7957,6 +8001,17 @@ "environmental_protection": 1, "flags": [ "VARSIZE", "POCKETS", "OUTER" ] }, + { + "id": "sleeveless_trenchcoat_faux_fur", + "type": "ARMOR", + "copy-from": "sleeveless_trenchcoat_fur", + "name": "sleeveless faux fur trenchcoat", + "description": "A thick faux fur trenchcoat without sleeves. Has plenty of storage space, and looks pretty good.", + "material": [ "faux_fur", "cotton" ], + "covers": [ "TORSO" ], + "flags": [ "VARSIZE", "POCKETS", "OUTER", "FANCY" ], + "warmth": 40 + }, { "id": "sleeveless_trenchcoat_leather", "type": "ARMOR", @@ -9001,6 +9056,17 @@ "environmental_protection": 1, "flags": [ "VARSIZE", "POCKETS", "OUTER" ] }, + { + "id": "trenchcoat_faux_fur", + "type": "ARMOR", + "copy-from": "trenchcoat_fur", + "name": "faux fur trenchcoat", + "description": "A thick faux fur trenchcoat, lined with pockets. Great for storage, and makes you the talk of the town.", + "material": [ "faux_fur", "cotton" ], + "covers": [ "TORSO", "ARMS" ], + "flags": [ "VARSIZE", "POCKETS", "OUTER", "FANCY" ], + "warmth": 40 + }, { "id": "trenchcoat_leather", "type": "ARMOR", diff --git a/data/json/items/biosignatures.json b/data/json/items/biosignatures.json index 46166a17fc972..6c625c9c086bd 100644 --- a/data/json/items/biosignatures.json +++ b/data/json/items/biosignatures.json @@ -3,6 +3,7 @@ "type": "COMESTIBLE", "id": "feces_bird", "name": "bird litter", + "category": "chems", "weight": 40, "color": "brown", "spoils_in": "4 days 16 hours", diff --git a/data/json/items/book/tailor.json b/data/json/items/book/tailor.json index d684574e2d2a7..3344d2797543f 100644 --- a/data/json/items/book/tailor.json +++ b/data/json/items/book/tailor.json @@ -78,6 +78,25 @@ "time": 55, "fun": -1 }, + { + "id": "recipe_fauxfur", + "type": "BOOK", + "name": "Friendly, Humane Fashion", + "description": "An educational book detailing the uses of fake fur, as well as its benefits and disadvantages. The prose is rather passionate, and a disclaimer on the cover proudly states that the book is printed and distributed by the Gryphon Animal Rights Organization.", + "weight": 2267, + "volume": 4, + "price": 5000, + "bashing": 5, + "material": [ "paper" ], + "symbol": "?", + "color": "green", + "skill": "tailor", + "required_level": 2, + "max_level": 5, + "intelligence": 7, + "time": 20, + "fun": 1 + }, { "id": "textbook_tailor", "type": "BOOK", diff --git a/data/json/items/comestibles.json b/data/json/items/comestibles.json index a952e59a01711..7b8606e63c273 100644 --- a/data/json/items/comestibles.json +++ b/data/json/items/comestibles.json @@ -384,7 +384,7 @@ "description": "Baby cow food, appropriated for adult humans. Spoils rapidly.", "price": 38, "//": "A 12-charge gallon currently goes for around US$4.", - "material": "milk", + "material": [ "milk" ], "volume": 1, "phase": "liquid", "flags": [ "EATEN_COLD" ], @@ -1585,7 +1585,7 @@ "symbol": "~", "quench": 50, "healthy": 1, - "calories": 43, + "calories": 100, "description": "Clear juice obtained by cooking fruit in a large volume of water.", "price": 62, "material": "fruit", @@ -5335,7 +5335,7 @@ "calories": 130, "description": "Delicious fermented dairy. It tastes of vanilla.", "price": 190, - "material": "milk", + "material": [ "milk" ], "volume": 1, "phase": "liquid", "flags": [ "FREEZERBURN" ], @@ -6797,7 +6797,7 @@ "calories": 191, "description": "Fluffy and delicious pancakes with real maple syrup.", "price": 550, - "material": "wheat", + "material": [ "wheat", "milk" ], "volume": 1, "charges": 4, "flags": [ "EATEN_HOT" ], @@ -6818,7 +6818,7 @@ "calories": 217, "description": "Fluffy and delicious pancakes with real maple syrup, made sweeter and healthier with the addition of wholesome fruit.", "price": 650, - "material": [ "wheat", "fruit" ], + "material": [ "wheat", "fruit", "milk" ], "volume": 1, "charges": 4, "flags": [ "EATEN_HOT" ], @@ -6838,7 +6838,7 @@ "calories": 217, "description": "Fluffy and delicious pancakes with real maple syrup, with delicious chocolate baked right in.", "price": 700, - "material": [ "wheat", "junk" ], + "material": [ "wheat", "junk", "milk" ], "volume": 1, "charges": 4, "flags": [ "EATEN_HOT" ], @@ -6878,7 +6878,7 @@ "calories": 321, "description": "Hey it's waffle time, it's waffle time. Won't you have some waffles of mine?", "price": 550, - "material": "wheat", + "material": [ "wheat", "milk" ], "volume": 1, "charges": 4, "flags": [ "EATEN_HOT" ], @@ -6898,7 +6898,7 @@ "calories": 391, "description": "Crunchy and delicious waffles with real maple syrup, made sweeter and healthier with the addition of wholesome fruit.", "price": 600, - "material": [ "wheat", "fruit" ], + "material": [ "wheat", "fruit", "milk" ], "volume": 1, "charges": 4, "flags": [ "EATEN_HOT" ], @@ -6917,7 +6917,7 @@ "calories": 347, "description": "Crunchy and delicious waffles with real maple syrup, with delicious chocolate baked right in.", "price": 650, - "material": [ "wheat", "junk" ], + "material": [ "wheat", "junk", "milk" ], "volume": 1, "charges": 4, "flags": [ "EATEN_HOT" ], @@ -8087,6 +8087,7 @@ "type": "COMESTIBLE", "id": "cola_meth", "name": "methacola", + "category": "drugs", "weight": 61, "color": "brown", "addiction_type": "amphetamine", @@ -8112,6 +8113,7 @@ "type": "COMESTIBLE", "id": "taint_tornado", "name": "tainted tornado", + "category": "mutagen", "weight": 100, "color": "red", "addiction_type": "alcohol", @@ -8328,7 +8330,7 @@ "calories": 260, "description": "A block of yellow processed cheese.", "price": 900, - "material": "milk", + "material": [ "milk" ], "volume": 1, "charges": 4, "fun": 7, @@ -8369,7 +8371,7 @@ "calories": 35, "description": "Milk that has been curdled with vinegar and rennet. It still needs to be salted and drained of whey.", "price": 10, - "material": "milk", + "material": [ "milk" ], "volume": 1, "phase": "liquid", "fun": -12 @@ -8390,7 +8392,7 @@ "calories": 260, "description": "Hard, dry cheese made to last, unlike modern processed cheese. Will make you thirsty though.", "price": 900, - "material": "milk", + "material": [ "milk" ], "volume": 1, "charges": 3, "fun": 5 @@ -9010,7 +9012,7 @@ "calories": 9, "description": "Crunchy sugar in chocolate capsules. Legal and stimmy.", "price": 100, - "material": "junk", + "material": [ "junk", "milk" ], "volume": 0, "flags": [ "EDIBLE_FROZEN" ], "charges": 4, @@ -9624,7 +9626,7 @@ "calories": 260, "description": "Filling bread buns, taste good with tea on a Sunday morning breakfast.", "price": 550, - "material": "wheat", + "material": [ "wheat", "milk" ], "volume": 3, "charges": 6, "flags": [ "EATEN_HOT" ], diff --git a/data/json/items/containers.json b/data/json/items/containers.json index 30665ae52335e..ba78db021dc98 100644 --- a/data/json/items/containers.json +++ b/data/json/items/containers.json @@ -2,7 +2,7 @@ { "id": "2lcanteen", "type": "CONTAINER", - "category": "other", + "category": "clothing", "name": "2.5L canteen", "description": "A large plastic water canteen, with a 2.5 liter capacity and carrying strap.", "weight": 155, @@ -392,7 +392,7 @@ { "id": "canteen", "type": "CONTAINER", - "category": "other", + "category": "clothing", "name": "plastic canteen", "description": "A military-style water canteen with a 1.5 liter capacity. Commonly worn at the hip.", "weight": 155, @@ -570,7 +570,7 @@ { "id": "flask_hip", "type": "CONTAINER", - "category": "other", + "category": "clothing", "name": "hip flask", "description": "A 250 ml metal flask with a hinged screw-on lid, commonly used to discreetly transport alcohol.", "weight": 120, @@ -840,7 +840,7 @@ { "id": "metal_tank_little", "type": "CONTAINER", - "category": "other", + "category": "spare_parts", "name": "metal tank (2L)", "name_plural": "metal tanks (2L)", "description": "A small metal tank for gas or liquids. Useful for crafting.", @@ -879,7 +879,7 @@ { "id": "waterskin", "type": "CONTAINER", - "category": "other", + "category": "clothing", "name": "small waterskin", "description": "A small watertight leather bag with a carrying strap, can hold 1.5 liters of water.", "weight": 453, @@ -904,7 +904,7 @@ { "id": "waterskin2", "type": "CONTAINER", - "category": "other", + "category": "clothing", "name": "waterskin", "description": "A watertight leather bag with a carrying strap, can hold 3 liters of water.", "weight": 783, @@ -929,7 +929,7 @@ { "id": "waterskin3", "type": "CONTAINER", - "category": "other", + "category": "clothing", "name": "large waterskin", "description": "A large watertight leather bag with a carrying strap, can hold 5 liters of water.", "weight": 990, diff --git a/data/json/items/fluff.json b/data/json/items/fluff.json new file mode 100644 index 0000000000000..264d50acb3c8b --- /dev/null +++ b/data/json/items/fluff.json @@ -0,0 +1,32 @@ +[ + { + "id": "magic_8_ball", + "type": "GENERIC", + "category": "other", + "name": "Magic 8-Ball", + "name_plural": "Magic 8-Balls", + "description": "A fortune-telling device from the 1950s. The kind of moral support you didn't know you needed.", + "weight": 40, + "volume": 1, + "price": 1000, + "material": [ "plastic" ], + "symbol": "o", + "color": "white", + "use_action": "MAGIC_8_BALL" + }, + { + "id": "coin_quarter", + "type": "GENERIC", + "category": "other", + "name": "coin", + "name_plural": "coins", + "description": "A now-ancient form of currency. Stripped of its original purpose, it now serves, faithfully, flippant Flippists for free.", + "weight": 6, + "volume": 0, + "price": 25, + "material": [ "silver" ], + "symbol": "o", + "color": "light_gray", + "use_action": "COIN_FLIP" + } +] diff --git a/data/json/items/generic.json b/data/json/items/generic.json index d27282fbbdd11..0074ee391306e 100644 --- a/data/json/items/generic.json +++ b/data/json/items/generic.json @@ -69,6 +69,7 @@ "type": "GENERIC", "id": "file", "name": "file", + "category": "books", "description": "Several documents with all kinds of information, customer data and charts kept together, pretty useless now though.", "weight": 15, "to_hit": -3, @@ -165,6 +166,7 @@ { "type": "GENERIC", "id": "superglue", + "category": "spare_parts", "symbol": ",", "color": "white", "name": "superglue", @@ -180,6 +182,7 @@ "type": "GENERIC", "id": "bone_glue", "symbol": ",", + "category": "spare_parts", "color": "brown", "name": "bone glue", "description": "Glue made from boiling animal bones. The adhesive isn't strong enough for heavy duty usages, but it can be used as a varnish or holding together small items.", @@ -333,6 +336,7 @@ "symbol": "*", "color": "light_gray", "name": "spiral stone", + "category": "artifacts", "description": "A rock the size of your fist. It is covered with intricate spirals; it is impossible to tell whether they are carved, naturally formed, or some kind of fossil.", "price": 20000, "price_postapoc": 1000, @@ -1485,7 +1489,7 @@ "color": "light_gray", "name": "Mosin-Nagant EBR conversion kit", "name_plural": "Mosin-Nagant EBR conversion kits", - "category": "other", + "category": "spare_parts", "description": "A synthetic stock and hardware designed to accommodate common Mosin-Nagant actions. With gunsmithing tools, some skill, and a few hours, you could give the classic Russian design modern furniture and customization capacity.", "price": 12000, "weight": 2000, @@ -1500,7 +1504,7 @@ "color": "light_gray", "name": "L523-CAR conversion", "name_plural": "L523-CAR conversions", - "category": "other", + "category": "spare_parts", "description": "All the parts necessary to convert an L523 to the Carbine configuration, Leadworks LLC's choice for close-quarters work. In order to reconfigure an already-configured L523, you'll need to disassemble it to the base platform, then assemble with the parts you prefer.", "price": 170000, "weight": 400, @@ -1515,7 +1519,7 @@ "color": "light_gray", "name": "L523-MBR conversion", "name_plural": "L523-MBR conversions", - "category": "other", + "category": "spare_parts", "description": "All the parts necessary to convert an L523 to a Main Battle Rifle, a balanced weapon for all situations. In order to reconfigure an already-configured L523, you'll need to disassemble it to the base platform, then assemble with the parts you prefer.", "price": 170000, "weight": 700, @@ -1530,7 +1534,7 @@ "color": "light_gray", "name": "L523-DSR conversion", "name_plural": "L523-DSR conversions", - "category": "other", + "category": "spare_parts", "description": "All the parts necessary to convert an L523 to a Designated Shootist Rifle, suitable for long-ranged work. In order to reconfigure an already-configured L523, you'll need to disassemble it to the base platform, then assemble with the parts you prefer.", "price": 200000, "weight": 1900, @@ -1545,7 +1549,7 @@ "color": "light_gray", "name": "L523-LMG conversion", "name_plural": "L523-LMG conversions", - "category": "other", + "category": "spare_parts", "description": "All the parts necessary to convert an L523 to a light machine gun. In order to reconfigure an already-configured L523, you'll need to disassemble it to the base platform, then assemble with the parts you prefer.", "price": 270000, "weight": 2300, @@ -2752,7 +2756,7 @@ { "id": "clay_pot_flower", "type": "GENERIC", - "category": "tools", + "category": "other", "name": "clay flower pot", "description": "A nice looking clay pot used for planting.", "weight": 480, @@ -2766,7 +2770,7 @@ { "id": "plastic_pot_flower", "type": "GENERIC", - "category": "tools", + "category": "other", "name": "plastic flower pot", "description": "A cheap plastic pot used for planting.", "weight": 190, diff --git a/data/json/items/melee.json b/data/json/items/melee.json index bfc4efdf4d902..5fc7b267dab67 100644 --- a/data/json/items/melee.json +++ b/data/json/items/melee.json @@ -280,6 +280,7 @@ "symbol": "*", "color": "white", "name": "baseball", + "category": "other", "description": "A baseball, good for throwing at enemies. Getting hit with one of these hurts a lot more than you might think.", "price": 1000, "material": "leather", @@ -294,6 +295,7 @@ "symbol": "*", "color": "dark_gray", "name": "hockey puck", + "category": "other", "description": "A heavy circular block of solid rubber, normally used for playing hockey. You can throw it to cause some serious harm.", "price": 1000, "material": "plastic", @@ -308,6 +310,7 @@ "symbol": "*", "color": "brown", "name": "football", + "category": "other", "description": "An oval made of leather and string, it's easily thrown but does little damage. You could take it apart into leather if you wanted.", "price": 1000, "material": "leather", @@ -322,6 +325,7 @@ "symbol": "*", "color": "brown", "name": "basketball", + "category": "other", "description": "A high-quality indoor basketball. You may throw it at zombies.", "price": 1200, "material": "leather", @@ -438,7 +442,7 @@ "//": "Craftable from steel, shouldn't be silver. A warhammer is essentially one end of a pickaxe with balancing weight on the other and crushes/pierces the armor.", "material": [ "iron", "wood" ], "techniques": [ "WBLOCK_1", "BRUTAL", "SWEEP" ], - "flags": [ "DURABLE_MELEE", "SPEAR", "NONCONDUCTIVE" ], + "flags": [ "DURABLE_MELEE", "SPEAR", "NONCONDUCTIVE", "BELT_CLIP" ], "volume": 5, "bashing": 20, "cutting": 20, @@ -963,7 +967,7 @@ "symbol": "/", "material": [ "iron", "wood" ], "techniques": [ "SWEEP" ], - "flags": [ "DURABLE_MELEE", "NONCONDUCTIVE" ], + "flags": [ "DURABLE_MELEE", "NONCONDUCTIVE", "BELT_CLIP" ], "volume": 5, "//": "Same total damage and slightly higher weight than a morningstar - exchanged.", "bashing": 37, @@ -1391,6 +1395,7 @@ "symbol": ",", "color": "dark_gray", "name": "grenade launcher buttstock", + "category": "spare_parts", "description": "A collapsible buttstock designed for the M320 grenade launcher. When combined with this stock, the M320 can be used as a stand alone weapon", "price": 10000, "material": [ "plastic", "steel" ], @@ -1785,6 +1790,7 @@ "type": "GENERIC", "id": "pitchfork", "name": "pitchfork", + "category": "tools", "description": "An agricultural tool with long wooden shaft and four spikes. Is used to lift hay.", "weight": 1000, "to_hit": 1, diff --git a/data/json/items/tools.json b/data/json/items/tools.json index 9c1a9a2dd86aa..581b06350519f 100644 --- a/data/json/items/tools.json +++ b/data/json/items/tools.json @@ -2281,6 +2281,7 @@ "id": "digging_stick", "type": "GENERIC", "name": "digging stick", + "category": "tools", "description": "This is a large stick, with the end carved into a broad blade for digging. It could be used to dig shallow pits, but not deep ones.", "weight": 1133, "volume": 6, @@ -2755,7 +2756,7 @@ "color": "light_gray", "techniques": [ "WBLOCK_1", "BRUTAL", "SWEEP" ], "qualities": [ [ "AXE", 2 ], [ "BUTCHER", -30 ] ], - "flags": [ "DURABLE_MELEE", "NONCONDUCTIVE" ] + "flags": [ "DURABLE_MELEE", "NONCONDUCTIVE", "BELT_CLIP" ] }, { "id": "fire_drill", diff --git a/data/json/items/vehicle_parts.json b/data/json/items/vehicle_parts.json index 631cb8195f3a8..2060489137f22 100644 --- a/data/json/items/vehicle_parts.json +++ b/data/json/items/vehicle_parts.json @@ -588,7 +588,7 @@ "material" : ["glass"], "volume" : 1, "bashing" : 1, - "category" : "veh_parts", + "category" : "spare_parts", "price" : 5000 }, { @@ -604,7 +604,7 @@ "material" : ["steel"], "volume" : 4, "bashing" : 5, - "category" : "veh_parts", + "category" : "spare_parts", "price" : 6000, "qualities": [ [ "COOK", 1 ] ] }, diff --git a/data/json/npcs/TALK_COMMON_OTHER.json b/data/json/npcs/TALK_COMMON_OTHER.json new file mode 100644 index 0000000000000..69ae51616a4ed --- /dev/null +++ b/data/json/npcs/TALK_COMMON_OTHER.json @@ -0,0 +1,229 @@ +[ + { + "id": "TALK_SHELTER", + "type": "talk_topic", + "dynamic_line": [ "Well, I guess it's just us.", "At least we've got shelter." ], + "responses": [ + { "text": "What should we do now?", "topic": "TALK_SHELTER_PLANS" }, + { "text": "Any tips?", "topic": "TALK_SHELTER_ADVICE" }, + { "text": "Can I do anything for you?", "topic": "TALK_MISSION_LIST" }, + { "text": "Want to travel with me?", "topic": "TALK_SUGGEST_FOLLOW", "condition": { "not": "npc_following" } }, + { "text": "Let's trade items.", "topic": "TALK_NONE", "effect": "start_trade" }, + { "text": "I can't leave the shelter without equipment.", "topic": "TALK_SHARE_EQUIPMENT" }, + { "text": "Well, bye.", "topic": "TALK_DONE" } + ] + }, + { + "id": "TALK_SHELTER_PLANS", + "type": "talk_topic", + "dynamic_line": [ + "I don't know, look for supplies and other survivors I guess.", + "Maybe we should start boarding up this place.", + "I suppose getting a car up and running should really be useful if we have to disappear quickly from here.", + "We could look for one of those farms out here. They can provide plenty of food and aren't close to the cities.", + "We should probably stay away from those cities, even if there's plenty of useful stuff there." + ], + "responses": [ { "text": "Hmm, okay.", "topic": "TALK_NONE" } ] + }, + { + "id": "TALK_SHELTER_ADVICE", + "type": "talk_topic", + "dynamic_line": { "give_hint": true }, + "responses": [ { "text": "Thanks!", "topic": "TALK_NONE" } ] + }, + { + "id": "TALK_SUGGEST_FOLLOW", + "type": "talk_topic", + "category": "CATEGORY_FOLLOW", + "dynamic_line": { + "npc_has_effect": "infected", + "yes": "Not until I get some antibiotics...", + "no": { + "npc_has_effect": "asked_to_follow", + "yes": "You asked me recently; ask again later.", + "no": "Why should I travel with you?" + } + }, + "responses": [ + { + "text": "Understood. I'll get those antibiotics.", + "topic": "TALK_NONE", + "condition": { "npc_has_effect": "infected" } + }, + { + "text": "Right, right, I'll ask later.", + "topic": "TALK_NONE", + "condition": { "npc_has_effect": "asked_to_follow" } + }, + { + "text": "I can keep you safe.", + "condition": { "not": { "or": [ { "npc_has_effect": "infected" }, { "npc_has_effect": "asked_to_follow" } ] } }, + "trial": { "type": "PERSUADE", "difficulty": 20, "mod": [ [ "FEAR", 8 ], [ "VALUE", 2 ], [ "TRUST", 2 ], [ "BRAVERY", -2 ] ] }, + "success": { "topic": "TALK_AGREE_FOLLOW", "effect": "follow", "opinion": { "trust": 1, "value": 1 } }, + "failure": { "topic": "TALK_DENY_FOLLOW", "effect": "deny_follow", "opinion": { "value": -1, "anger": 1 } } + }, + { + "text": "You can keep me safe.", + "condition": { "not": { "or": [ { "npc_has_effect": "infected" }, { "npc_has_effect": "asked_to_follow" } ] } }, + "trial": { + "type": "PERSUADE", + "difficulty": 0, + "mod": [ [ "ALTRUISM", 6 ], [ "POS_FEAR", -6 ], [ "BRAVERY", 2 ], [ "ANGER", -6 ], [ "VALUE", 2 ] ] + }, + "success": { "topic": "TALK_AGREE_FOLLOW", "effect": "follow", "opinion": { "value": -1 } }, + "failure": { "topic": "TALK_DENY_FOLLOW", "effect": "deny_follow", "opinion": { "fear": -1, "value": -1, "anger": 1 } } + }, + { + "text": "We're friends, aren't we?", + "condition": { "not": { "or": [ { "npc_has_effect": "infected" }, { "npc_has_effect": "asked_to_follow" } ] } }, + "trial": { "type": "PERSUADE", "difficulty": 0, "mod": [ [ "TRUST", 3 ], [ "VALUE", 3 ], [ "ANGER", -3 ] ] }, + "success": { "topic": "TALK_AGREE_FOLLOW", "effect": "follow", "opinion": { "trust": 2, "anger": -1 } }, + "failure": { "topic": "TALK_DENY_FOLLOW", "effect": "deny_follow", "opinion": { "trust": 1, "fear": -2, "value": -1, "anger": 1 } } + }, + { + "text": "I'll kill you if you don't.", + "condition": { "not": { "or": [ { "npc_has_effect": "infected" }, { "npc_has_effect": "asked_to_follow" } ] } }, + "trial": { "type": "INTIMIDATE", "difficulty": 20, "mod": [ [ "FEAR", 8 ], [ "VALUE", 2 ], [ "TRUST", 2 ], [ "BRAVERY", -2 ] ] }, + "success": { "topic": "TALK_AGREE_FOLLOW", "effect": "follow", "opinion": { "trust": -4, "fear": 3, "value": -1, "anger": 4 } }, + "failure": { "topic": "TALK_DENY_FOLLOW", "effect": "deny_follow", "opinion": { "trust": 4, "value": -5, "anger": 10 } } + } + ] + }, + { + "id": "TALK_AGREE_FOLLOW", + "type": "talk_topic", + "category": "CATEGORY_FOLLOW", + "dynamic_line": "You got it, I'm with you!", + "responses": [ { "text": "Awesome!", "topic": "TALK_FRIEND" }, { "text": "Okay, let's go!", "topic": "TALK_DONE" } ] + }, + { + "id": "TALK_DENY_FOLLOW", + "type": "talk_topic", + "category": "CATEGORY_FOLLOW", + "dynamic_line": "Yeah... I don't think so.", + "responses": [ { "text": "Oh, okay.", "topic": "TALK_DONE" } ] + }, + { + "id": "TALK_LEAVE", + "type": "talk_topic", + "dynamic_line": "You're really leaving?", + "responses": [ + { "text": "Yeah, I'm sure. Bye.", "topic": "TALK_DONE", "effect": "leave" }, + { "text": "Nah, I'm just kidding.", "topic": "TALK_NONE" } + ] + }, + { + "id": "TALK_LEADER", + "type": "talk_topic", + "dynamic_line": "What is it?", + "responses": [ + { "text": "How much further?", "topic": "TALK_HOW_MUCH_FURTHER", "condition": "npc_has_destination" }, + { + "text": "I'd like to lead for a while.", + "trial": { + "type": "PERSUADE", + "difficulty": 0, + "mod": [ [ "FEAR", 1 ], [ "VALUE", 1 ], [ "TRUST", 1 ], [ "BRAVERY", -1 ], [ "AGGRESSION", -1 ] ] + }, + "success": { "topic": "TALK_PLAYER_LEADS", "effect": "follow" }, + "failure": { "topic": "TALK_LEADER_STAYS", "opinion": { "value": -1, "anger": -1 } } + }, + { + "text": "Step aside. I'm leader now.", + "trial": { "type": "INTIMIDATE", "difficulty": 40 }, + "success": { "topic": "TALK_PLAYER_LEADS", "effect": "follow", "opinion": { "trust": -1, "fear": 1, "value": -1, "anger": 1 } }, + "failure": { "topic": "TALK_LEADER_STAYS", "opinion": { "trust": -1, "value": -1, "anger": 1 } } + }, + { "text": "Can I do anything for you?", "topic": "TALK_MISSION_LIST" }, + { "text": "Let's trade items.", "topic": "TALK_NONE", "effect": "start_trade" }, + { "text": "Let's go.", "topic": "TALK_DONE" } + ] + }, + { + "id": "TALK_PLAYER_LEADS", + "type": "talk_topic", + "dynamic_line": "Alright. You can lead now.", + "responses": [ + { "text": "Good. Something else...", "topic": "TALK_FRIEND" }, + { "text": "Alright, let's go.", "topic": "TALK_NONE" } + ] + }, + { + "id": "TALK_LEADER_STAYS", + "type": "talk_topic", + "responses": [ { "text": "Okay, okay.", "topic": "TALK_NONE" } ] + }, + { + "id": "TALK_DENY_GUARD", + "type": "talk_topic", + "dynamic_line": "Not a bloody chance, I'm going to get left behind!", + "responses": [ { "text": "Fine.", "topic": "TALK_NONE" } ] + }, + { + "id": "TALK_FRIEND_GUARD", + "type": "talk_topic", + "dynamic_line": "I'm on watch.", + "responses": [ + { "text": "I need you to come with me.", "topic": "TALK_FRIEND", "effect": "stop_guard" }, + { "text": "See you around.", "topic": "TALK_NONE" } + ] + }, + { + "id": "TALK_FRIEND_UNCOMFORTABLE", + "type": "talk_topic", + "dynamic_line": "I really don't feel comfortable doing so...", + "responses": [ { "text": "I'll give you some space.", "topic": "TALK_FRIEND" } ] + }, + { + "id": "TALK_DENY_PERSONAL", + "type": "talk_topic", + "dynamic_line": "I'd prefer to keep that to myself.", + "responses": [ { "text": "I understand...", "topic": "TALK_FRIEND" } ] + }, + { + "id": "TALK_GIVE_EQUIPMENT", + "type": "talk_topic", + "category": "CATEGORY_EQUIP", + "dynamic_line": "Okay, here you go.", + "responses": [ + { "text": "Thank you!", "topic": "TALK_NONE" }, + { "text": "Thanks! But can I have some more?", "topic": "TALK_SHARE_EQUIPMENT" }, + { "text": "Thanks, see you later!", "topic": "TALK_DONE" } + ] + }, + { + "id": "TALK_DENY_EQUIPMENT", + "type": "talk_topic", + "category": "CATEGORY_EQUIP", + "responses": [ + { "text": "Okay, okay, sorry.", "topic": "TALK_NONE" }, + { "text": "Seriously, give me more stuff!", "topic": "TALK_SHARE_EQUIPMENT" }, + { "text": "Okay, fine, bye.", "topic": "TALK_DONE" } + ] + }, + { + "id": "TALK_TRAIN_START", + "type": "talk_topic", + "dynamic_line": "Alright, let's begin.", + "responses": [ + { "text": "Sounds good.", "topic": "TALK_DONE", "condition": "at_safe_space", "effect": "start_training" }, + { + "text": "Okay. Lead the way.", + "topic": "TALK_DONE", + "condition": { "not": "at_safe_space" }, + "effect": "lead_to_safety" + }, + { "text": "No, we'll be okay here.", "topic": "TALK_TRAIN_FORCE", "condition": { "not": "at_safe_space" } }, + { "text": "On second thought, never mind.", "topic": "TALK_NONE" } + ] + }, + { + "id": "TALK_TRAIN_FORCE", + "type": "talk_topic", + "dynamic_line": "Alright, let's begin.", + "responses": [ + { "text": "Sounds good.", "topic": "TALK_DONE", "effect": "start_training" }, + { "text": "On second thought, never mind.", "topic": "TALK_NONE" } + ] + } +] diff --git a/data/json/npcs/TALK_REFUGE_RANCH.json b/data/json/npcs/TALK_REFUGE_RANCH.json index 14df128d6ca59..f3e17911f1f2c 100644 --- a/data/json/npcs/TALK_REFUGE_RANCH.json +++ b/data/json/npcs/TALK_REFUGE_RANCH.json @@ -100,12 +100,17 @@ "no": "The rate is a bit steep but I still have my quotas that I need to fulfill. The logs will be dropped off in the garage at the entrance to the camp. I'll need a bit of time before I can deliver another load." }, "responses": [ - { "text": "[$2000, 1d] 10 logs", "topic": "TALK_DONE", "effect": "buy_10_logs", "condition": { "npc_service": 2000 } }, + { + "text": "[$2000, 1d] 10 logs", + "topic": "TALK_DONE", + "effect": [ "buy_10_logs", { "u_spend_cash": 200000 } ], + "condition": { "npc_service": 200000 } + }, { "text": "[$12000, 7d] 100 logs", "topic": "TALK_DONE", - "effect": "buy_100_logs", - "condition": { "npc_service": 12000 } + "effect": [ "buy_100_logs", { "u_spend_cash": 1200000 } ], + "condition": { "npc_service": 1200000 } }, { "text": "Maybe later.", "topic": "TALK_RANCH_WOODCUTTER", "condition": "npc_available" }, { "text": "I'll be back later.", "topic": "TALK_RANCH_WOODCUTTER" } @@ -265,14 +270,14 @@ { "text": "[$200, 30m] I need you to patch me up.", "topic": "TALK_DONE", - "effect": "give_aid", - "condition": { "npc_service": 200 } + "effect": [ "give_aid", { "u_spend_cash": 20000 } ], + "condition": { "npc_service": 20000 } }, { "text": "[$500, 1h] I need you to patch me up.", "topic": "TALK_DONE", - "effect": "give_all_aid", - "condition": { "npc_service": 200 } + "effect": [ "give_all_aid", { "u_spend_cash": 50000 } ], + "condition": { "npc_service": 50000 } }, { "text": "I should be fine.", "topic": "TALK_RANCH_NURSE" } ] @@ -429,14 +434,14 @@ { "text": "[$5] I'll have a shave", "topic": "TALK_RANCH_BARBER_CUT", - "effect": "buy_shave", - "condition": { "npc_service": 5 } + "effect": [ "buy_shave", { "u_spend_cash": 500 } ], + "condition": { "npc_service": 500 } }, { "text": "[$10] I'll get a haircut", "topic": "TALK_RANCH_BARBER_CUT", - "effect": "buy_haircut", - "condition": { "npc_service": 10 } + "effect": [ "buy_haircut", { "u_spend_cash": 1000 } ], + "condition": { "npc_service": 1000 } }, { "text": "Maybe another time...", "topic": "TALK_DONE" } ] diff --git a/data/json/recipes/armor/head.json b/data/json/recipes/armor/head.json index 935049cbbd2ec..ce1a76805dc25 100644 --- a/data/json/recipes/armor/head.json +++ b/data/json/recipes/armor/head.json @@ -264,6 +264,18 @@ "using": [ [ "sewing_standard", 8 ] ], "components": [ [ [ "fur", 3 ] ] ] }, + { + "result": "hat_faux_fur", + "type": "recipe", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_HEAD", + "skill_used": "tailor", + "difficulty": 2, + "time": 40000, + "book_learn": [ [ "textbook_tailor", 2 ], [ "recipe_fauxfur", 1 ] ], + "using": [ [ "sewing_standard", 8 ] ], + "components": [ [ [ "faux_fur", 3 ] ] ] + }, { "result": "hat_hard", "type": "recipe", diff --git a/data/json/recipes/armor/legs.json b/data/json/recipes/armor/legs.json index 8993db2e88c65..2ab72da3d6957 100644 --- a/data/json/recipes/armor/legs.json +++ b/data/json/recipes/armor/legs.json @@ -413,6 +413,21 @@ [ [ "fur", 6 ], [ "tanned_pelt", 1 ] ] ] }, + { + "result": "pants_faux_fur", + "type": "recipe", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_LEGS", + "skill_used": "tailor", + "difficulty": 3, + "time": 40000, + "book_learn": [ [ "textbook_tailor", 3 ], [ "tailor_portfolio", 3 ], [ "recipe_fauxfur", 2 ] ], + "using": [ [ "sewing_standard", 18 ] ], + "components": [ + [ [ "rag", 10 ] ], + [ [ "faux_fur", 6 ] ] + ] + }, { "result": "pants_leather", "type": "recipe", diff --git a/data/json/recipes/armor/torso.json b/data/json/recipes/armor/torso.json index 8920a5d23bafe..9b723e01d8f29 100644 --- a/data/json/recipes/armor/torso.json +++ b/data/json/recipes/armor/torso.json @@ -161,11 +161,9 @@ "category": "CC_ARMOR", "subcategory": "CSC_ARMOR_TORSO", "skill_used": "tailor", - "difficulty": 4, - "skills_required": [ "tailor", 1 ], + "difficulty": 3, "time": 100000, - "autolearn": true, - "book_learn": [ [ "textbook_tailor", 4 ], [ "tailor_portfolio", 4 ] ], + "book_learn": [ [ "textbook_tailor", 4 ], [ "tailor_portfolio", 3 ], [ "recipe_fauxfur", 3 ] ], "using": [ [ "sewing_standard", 20 ] ], "components": [ [ [ "rag", 11 ] ], @@ -237,6 +235,21 @@ "using": [ [ "sewing_standard", 60 ] ], "components": [ [ [ "fur", 40 ], [ "tanned_pelt", 7 ] ] ] }, + { + "result": "duster_faux_fur", + "type": "recipe", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_TORSO", + "skill_used": "tailor", + "difficulty": 3, + "time": 200000, + "book_learn": [ [ "textbook_tailor", 3 ], [ "tailor_portfolio", 3 ], [ "recipe_fauxfur", 2 ] ], + "using": [ [ "sewing_standard", 60 ] ], + "components": [ + [ [ "rag", 25 ] ], + [ [ "faux_fur", 20 ] ] + ] + }, { "result": "duster_leather", "type": "recipe", @@ -571,6 +584,22 @@ "using": [ [ "sewing_standard", 50 ] ], "components": [ [ [ "fur", 34 ], [ "tanned_pelt", 6 ] ] ] }, + { + "result": "sleeveless_duster_faux_fur", + "type": "recipe", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_TORSO", + "//": "The general guideline for sleeveless dusters is the components, volume, weight, time to craft, and value are 15% lower (rounded down) than the original. Making it from an original takes 50% the time.", + "skill_used": "tailor", + "difficulty": 3, + "time": 200000, + "book_learn": [ [ "textbook_tailor", 3 ], [ "tailor_portfolio", 3 ], [ "recipe_fauxfur", 2 ] ], + "using": [ [ "sewing_standard", 50 ] ], + "components": [ + [ [ "rag", 20 ] ], + [ [ "faux_fur", 12 ] ] + ] + }, { "result": "sleeveless_duster_fur", "type": "recipe", @@ -586,6 +615,21 @@ "qualities": [ { "id": "CUT", "level": 1 } ], "components": [ [ [ "duster_fur", 1 ] ] ] }, + { + "result": "sleeveless_duster_faux_fur", + "type": "recipe", + "id_suffix": "from_duster_faux_fur", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_TORSO", + "//": "The general guideline for sleeveless dusters is the components, volume, weight, time to craft, and value are 15% lower (rounded down) than the original. Making it from an original takes 50% the time.", + "skill_used": "tailor", + "difficulty": 2, + "time": 100000, + "autolearn": true, + "byproducts": [ [ "faux_fur", 6 ] ], + "qualities": [ { "id": "CUT", "level": 1 } ], + "components": [ [ [ "duster_faux_fur", 1 ] ] ] + }, { "result": "sleeveless_duster_leather", "type": "recipe", @@ -694,6 +738,21 @@ "qualities": [ { "id": "CUT", "level": 1 } ], "components": [ [ [ "trenchcoat_fur", 1 ] ] ] }, + { + "result": "sleeveless_trenchcoat_faux_fur", + "type": "recipe", + "id_suffix": "from_trenchcoat_faux_fur", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_TORSO", + "//": "The general guideline for sleeveless trenchcoats is the components, volume, weight, time to craft, and value are 15% lower (rounded down) than the original. Making it from an original takes 50% the time.", + "skill_used": "tailor", + "difficulty": 2, + "time": 100000, + "autolearn": true, + "byproducts": [ [ "faux_fur", 2 ] ], + "qualities": [ { "id": "CUT", "level": 1 } ], + "components": [ [ [ "trenchcoat_faux_fur", 1 ] ] ] + }, { "result": "sleeveless_trenchcoat_fur", "type": "recipe", @@ -708,6 +767,22 @@ "using": [ [ "sewing_standard", 38 ] ], "components": [ [ [ "fur", 28 ], [ "tanned_pelt", 5 ] ] ] }, + { + "result": "sleeveless_trenchcoat_faux_fur", + "type": "recipe", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_TORSO", + "//": "The general guideline for sleeveless trenchcoats is the components, volume, weight, time to craft, and value are 15% lower (rounded down) than the original. Making it from an original takes 50% the time.", + "skill_used": "tailor", + "difficulty": 3, + "time": 200000, + "book_learn": [ [ "textbook_tailor", 3 ], [ "tailor_portfolio", 3 ], [ "recipe_fauxfur", 2 ] ], + "using": [ [ "sewing_standard", 38 ] ], + "components": [ + [ [ "rag", 10 ] ], + [ [ "faux_fur", 10 ] ] + ] + }, { "result": "sleeveless_trenchcoat_leather", "type": "recipe", @@ -861,6 +936,21 @@ "using": [ [ "sewing_standard", 45 ] ], "components": [ [ [ "fur", 30 ], [ "tanned_pelt", 5 ] ] ] }, + { + "result": "trenchcoat_faux_fur", + "type": "recipe", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_TORSO", + "skill_used": "tailor", + "difficulty": 3, + "time": 200000, + "book_learn": [ [ "textbook_tailor", 3 ], [ "tailor_portfolio", 3 ], [ "recipe_fauxfur", 2 ] ], + "using": [ [ "sewing_standard", 45 ] ], + "components": [ + [ [ "rag", 14 ] ], + [ [ "faux_fur", 12 ] ] + ] + }, { "result": "trenchcoat_leather", "type": "recipe", diff --git a/data/json/recipes/recipe_food.json b/data/json/recipes/recipe_food.json index 19d58d3971acb..d5f6250beded4 100644 --- a/data/json/recipes/recipe_food.json +++ b/data/json/recipes/recipe_food.json @@ -116,6 +116,7 @@ "result": "offal_canned", "type": "recipe", "id_suffix": "jarred", + "byproducts": [ [ "water", 10 ] ], "category": "CC_FOOD", "subcategory": "CSC_FOOD_MEAT", "skill_used": "cooking", @@ -126,8 +127,8 @@ "container": "jar_glass_sealed", "result_mult": 2, "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], - "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], - "components": [ [ [ "water", 1 ], [ "water_clean", 1 ] ], [ [ "jar_glass", 1 ] ], [ [ "offal", 2 ] ] ] + "tools": [ [ [ "surface_heat", 100, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], + "components": [ [ [ "water", 11 ], [ "water_clean", 11 ] ], [ [ "jar_glass", 1 ] ], [ [ "offal", 2 ] ] ] }, { "result": "offal_canned", @@ -1207,13 +1208,13 @@ "subcategory": "CSC_FOOD_DRINKS", "skill_used": "cooking", "difficulty": 3, - "result_mult": 12, - "time": 30000, + "result_mult": 2, + "time": 20000, "autolearn": true, "batch_time_factors": [ 80, 4 ], "qualities": [ { "id": "COOK", "level": 3 } ], - "tools": [ [ [ "surface_heat", 2, "LIST" ] ] ], - "components": [ [ [ "sweet_fruit_like", 4, "LIST" ] ], [ [ "sugar", 10 ] ], [ [ "water", 12 ], [ "water_clean", 12 ] ] ] + "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], + "components": [ [ [ "sweet_fruit_like", 1, "LIST" ] ], [ [ "sugar", 5 ] ], [ [ "water", 2 ], [ "water_clean", 2 ] ] ] }, { "type": "recipe", @@ -4072,6 +4073,7 @@ "type": "recipe", "result": "meat_canned", "id_suffix": "jarred", + "byproducts": [ [ "water", 10 ] ], "container": "jar_glass_sealed", "category": "CC_FOOD", "subcategory": "CSC_FOOD_MEAT", @@ -4082,13 +4084,14 @@ "autolearn": true, "batch_time_factors": [ 83, 5 ], "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], - "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], - "components": [ [ [ "water", 1 ], [ "water_clean", 1 ] ], [ [ "jar_glass", 1 ] ], [ [ "meat", 2 ] ] ] + "tools": [ [ [ "surface_heat", 100, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], + "components": [ [ [ "water", 11 ], [ "water_clean", 11 ] ], [ [ "jar_glass", 1 ] ], [ [ "meat", 2 ] ] ] }, { "type": "recipe", "result": "fish_canned", "id_suffix": "jarred", + "byproducts": [ [ "water", 10 ] ], "container": "jar_glass_sealed", "category": "CC_FOOD", "subcategory": "CSC_FOOD_MEAT", @@ -4099,13 +4102,14 @@ "autolearn": true, "batch_time_factors": [ 83, 5 ], "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], - "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], - "components": [ [ [ "water", 1 ], [ "water_clean", 1 ] ], [ [ "jar_glass", 1 ] ], [ [ "fish", 2 ] ] ] + "tools": [ [ [ "surface_heat", 100, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], + "components": [ [ [ "water", 11 ], [ "water_clean", 11 ] ], [ [ "jar_glass", 1 ] ], [ [ "fish", 2 ] ] ] }, { "type": "recipe", "result": "human_canned", "id_suffix": "jarred", + "byproducts": [ [ "water", 10 ] ], "container": "jar_glass_sealed", "category": "CC_FOOD", "subcategory": "CSC_FOOD_MEAT", @@ -4116,13 +4120,14 @@ "book_learn": [ [ "cookbook_human", 4 ] ], "batch_time_factors": [ 83, 5 ], "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], - "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], - "components": [ [ [ "water", 1 ], [ "water_clean", 1 ] ], [ [ "jar_glass", 1 ] ], [ [ "human_flesh", 2 ] ] ] + "tools": [ [ [ "surface_heat", 100, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], + "components": [ [ [ "water", 11 ], [ "water_clean", 11 ] ], [ [ "jar_glass", 1 ] ], [ [ "human_flesh", 2 ] ] ] }, { "type": "recipe", "result": "veggy_canned", "id_suffix": "jarred", + "byproducts": [ [ "water", 10 ] ], "container": "jar_glass_sealed", "category": "CC_FOOD", "subcategory": "CSC_FOOD_VEGGI", @@ -4133,9 +4138,9 @@ "autolearn": true, "batch_time_factors": [ 83, 5 ], "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], - "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], + "tools": [ [ [ "surface_heat", 100, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], "components": [ - [ [ "water", 1 ], [ "water_clean", 1 ] ], + [ [ "water", 11 ], [ "water_clean", 11 ] ], [ [ "jar_glass", 1 ] ], [ [ "mushroom", 2 ], [ "veggy", 2 ], [ "veggy_wild", 2 ] ] ] @@ -4144,6 +4149,7 @@ "type": "recipe", "result": "apple_canned", "id_suffix": "jarred", + "byproducts": [ [ "water", 10 ] ], "container": "jar_glass_sealed", "category": "CC_FOOD", "subcategory": "CSC_FOOD_VEGGI", @@ -4154,8 +4160,8 @@ "autolearn": true, "batch_time_factors": [ 83, 5 ], "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], - "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], - "components": [ [ [ "water", 1 ], [ "water_clean", 1 ] ], [ [ "jar_glass", 1 ] ], [ [ "sweet_fruit", 2, "LIST" ] ] ] + "tools": [ [ [ "surface_heat", 100, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], + "components": [ [ [ "water", 11 ], [ "water_clean", 11 ] ], [ [ "jar_glass", 1 ] ], [ [ "sweet_fruit", 2, "LIST" ] ] ] }, { "type": "recipe", @@ -4267,6 +4273,7 @@ "type": "recipe", "result": "soup_veggy", "id_suffix": "jarred", + "byproducts": [ [ "water", 10 ] ], "container": "jar_glass_sealed", "category": "CC_FOOD", "subcategory": "CSC_FOOD_VEGGI", @@ -4278,9 +4285,10 @@ "autolearn": true, "batch_time_factors": [ 80, 4 ], "qualities": [ { "id": "COOK", "level": 3 } ], - "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], + "tools": [ [ [ "surface_heat", 100, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], "components": [ [ [ "jar_glass", 1 ] ], + [ [ "water", 10 ], [ "water_clean", 10 ] ], [ [ "broth", 2 ] ], [ [ "potato_irradiated", 2 ], @@ -4645,7 +4653,7 @@ { "type": "recipe", "result": "kompot", - "id_suffix": "jarred", + "id_suffix": "jarred_3l", "byproducts": [ [ "water", 10 ] ], "container": "jar_3l_glass_sealed", "category": "CC_FOOD", @@ -4653,15 +4661,15 @@ "skill_used": "cooking", "skills_required": [ "mechanics", 1 ], "difficulty": 3, - "time": 30000, + "time": 40000, "autolearn": true, "batch_time_factors": [ 80, 4 ], "qualities": [ { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 200, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], "components": [ [ [ "jar_3l_glass", 1 ] ], - [ [ "sweet_fruit_like", 4, "LIST" ] ], - [ [ "sugar", 5 ] ], + [ [ "sweet_fruit_like", 6, "LIST" ] ], + [ [ "sugar", 30 ] ], [ [ "water", 22 ], [ "water_clean", 22 ] ] ] }, @@ -5982,6 +5990,7 @@ "type": "recipe", "result": "can_tomato", "id_suffix": "jarred", + "byproducts": [ [ "water", 10 ] ], "container": "jar_glass_sealed", "category": "CC_FOOD", "subcategory": "CSC_FOOD_VEGGI", @@ -5992,8 +6001,8 @@ "autolearn": true, "batch_time_factors": [ 83, 5 ], "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], - "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], - "components": [ [ [ "water", 1 ], [ "water_clean", 1 ] ], [ [ "jar_glass", 1 ] ], [ [ "tomato", 2 ], [ "irradiated_tomato", 2 ] ] ] + "tools": [ [ [ "surface_heat", 100, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], + "components": [ [ [ "water", 11 ], [ "water_clean", 11 ] ], [ [ "jar_glass", 1 ] ], [ [ "tomato", 2 ], [ "irradiated_tomato", 2 ] ] ] }, { "type": "recipe", @@ -7481,5 +7490,705 @@ ], [ [ "sugar", 10 ], [ "honeycomb", 1 ], [ "honey_bottled", 1 ], [ "honey_glassed", 1 ], [ "syrup", 1 ] ] ] + }, + { + "type": "recipe", + "result": "meat_canned", + "id_suffix": "jarred_3l", + "byproducts": [ [ "water", 10 ] ], + "container": "jar_3l_glass_sealed", + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_MEAT", + "skill_used": "cooking", + "difficulty": 4, + "time": 40000, + "autolearn": true, + "batch_time_factors": [ 83, 5 ], + "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "tools": [ [ [ "surface_heat", 200, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], + "components": [ [ [ "water", 16 ], [ "water_clean", 16 ] ], [ [ "jar_3l_glass", 1 ] ], [ [ "meat", 12 ] ] ] + }, + { + "type": "recipe", + "result": "veggy_canned", + "id_suffix": "jarred_3l", + "byproducts": [ [ "water", 10 ] ], + "container": "jar_3l_glass_sealed", + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_VEGGI", + "skill_used": "cooking", + "difficulty": 4, + "time": 40000, + "autolearn": true, + "batch_time_factors": [ 83, 5 ], + "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "tools": [ [ [ "surface_heat", 200, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], + "components": [ + [ [ "water", 16 ], [ "water_clean", 16 ] ], + [ [ "jar_3l_glass", 1 ] ], + [ [ "mushroom", 12 ], [ "veggy", 12 ], [ "veggy_wild", 12 ] ] + ] + }, + { + "type": "recipe", + "result": "apple_canned", + "id_suffix": "jarred_3l", + "byproducts": [ [ "water", 10 ] ], + "container": "jar_3l_glass_sealed", + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_VEGGI", + "skill_used": "cooking", + "difficulty": 4, + "time": 40000, + "autolearn": true, + "batch_time_factors": [ 83, 5 ], + "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "tools": [ [ [ "surface_heat", 200, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], + "components": [ [ [ "water", 16 ], [ "water_clean", 16 ] ], [ [ "jar_3l_glass", 1 ] ], [ [ "sweet_fruit", 12, "LIST" ] ] ] + }, + { + "type": "recipe", + "result": "fish_canned", + "id_suffix": "jarred_3l", + "byproducts": [ [ "water", 10 ] ], + "container": "jar_3l_glass_sealed", + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_MEAT", + "skill_used": "cooking", + "difficulty": 4, + "time": 40000, + "autolearn": true, + "batch_time_factors": [ 83, 5 ], + "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "tools": [ [ [ "surface_heat", 200, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], + "components": [ [ [ "water", 16 ], [ "water_clean", 16 ] ], [ [ "jar_3l_glass", 1 ] ], [ [ "fish", 12 ] ] ] + }, + { + "result": "offal_canned", + "type": "recipe", + "id_suffix": "jarred_3l", + "byproducts": [ [ "water", 10 ] ], + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_MEAT", + "skill_used": "cooking", + "difficulty": 4, + "time": 40000, + "batch_time_factors": [ 83, 5 ], + "autolearn": true, + "container": "jar_3l_glass_sealed", + "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "tools": [ [ [ "surface_heat", 200, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], + "components": [ [ [ "water", 16 ], [ "water_clean", 16 ] ], [ [ "jar_3l_glass", 1 ] ], [ [ "offal", 12 ] ] ] + }, + { + "type": "recipe", + "result": "can_tomato", + "id_suffix": "jarred_3l", + "byproducts": [ [ "water", 10 ] ], + "container": "jar_3l_glass_sealed", + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_VEGGI", + "skill_used": "cooking", + "difficulty": 4, + "time": 40000, + "autolearn": true, + "batch_time_factors": [ 83, 5 ], + "result_mult": 6, + "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "tools": [ [ [ "surface_heat", 200, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], + "components": [ + [ [ "water", 16 ], [ "water_clean", 16 ] ], + [ [ "jar_3l_glass", 1 ] ], + [ [ "tomato", 12 ], [ "irradiated_tomato", 12 ] ] + ] + }, + { + "type": "recipe", + "result": "fish_pickled", + "id_suffix": "jarred_3l", + "container": "jar_3l_glass_sealed", + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_MEAT", + "skill_used": "cooking", + "difficulty": 6, + "time": 40000, + "autolearn": true, + "batch_time_factors": [ 83, 5 ], + "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "tools": [ [ [ "surface_heat", 100, "LIST" ] ] ], + "components": [ + [ [ "water", 6 ], [ "water_clean", 6 ], [ "salt_water", 6 ], [ "saline", 30 ] ], + [ [ "jar_3l_glass", 1 ] ], + [ [ "fish", 12 ] ], + [ [ "vinegar", 6 ] ] + ] + }, + { + "type": "recipe", + "result": "human_pickled", + "id_suffix": "jarred_3l", + "byproducts": [ [ "water", 10 ] ], + "container": "jar_3l_glass_sealed", + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_MEAT", + "skill_used": "cooking", + "difficulty": 6, + "time": 40000, + "book_learn": [ [ "cookbook_human", 6 ] ], + "batch_time_factors": [ 83, 5 ], + "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "tools": [ [ [ "surface_heat", 100, "LIST" ] ] ], + "components": [ + [ [ "water", 6 ], [ "water_clean", 6 ], [ "salt_water", 6 ], [ "saline", 30 ] ], + [ [ "jar_3l_glass", 1 ] ], + [ [ "human_flesh", 12 ] ], + [ [ "vinegar", 6 ] ] + ] + }, + { + "type": "recipe", + "result": "meat_pickled", + "id_suffix": "jarred_3l", + "container": "jar_3l_glass_sealed", + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_MEAT", + "skill_used": "cooking", + "difficulty": 6, + "time": 40000, + "autolearn": true, + "batch_time_factors": [ 83, 5 ], + "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "tools": [ [ [ "surface_heat", 100, "LIST" ] ] ], + "components": [ + [ [ "water", 6 ], [ "water_clean", 6 ], [ "salt_water", 6 ], [ "saline", 30 ] ], + [ [ "jar_3l_glass", 1 ] ], + [ [ "meat", 12 ] ], + [ [ "vinegar", 6 ] ] + ] + }, + { + "type": "recipe", + "result": "veggy_pickled", + "id_suffix": "jarred_3l", + "container": "jar_3l_glass_sealed", + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_VEGGI", + "skill_used": "cooking", + "difficulty": 5, + "time": 40000, + "autolearn": true, + "batch_time_factors": [ 83, 5 ], + "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "tools": [ [ [ "surface_heat", 100, "LIST" ] ] ], + "//": "Canned tomatoes aren't an option as they've already been preserved.", + "components": [ + [ [ "water", 6 ], [ "water_clean", 6 ], [ "salt_water", 6 ], [ "saline", 30 ] ], + [ [ "jar_3l_glass", 1 ] ], + [ + [ "veggy", 12 ], + [ "veggy_wild", 12 ], + [ "mushroom", 12 ], + [ "tomato", 12 ], + [ "irradiated_tomato", 12 ], + [ "broccoli", 12 ], + [ "irradiated_broccoli", 12 ], + [ "zucchini", 12 ], + [ "irradiated_zucchini", 12 ], + [ "cucumber", 12 ], + [ "irradiated_cucumber", 12 ], + [ "potato_raw", 12 ], + [ "potato_irradiated", 12 ], + [ "corn", 12 ], + [ "irradiated_corn", 12 ], + [ "onion", 12 ], + [ "irradiated_onion", 12 ], + [ "garlic_clove", 72 ], + [ "irradiated_carrot", 72 ], + [ "carrot", 72 ] + ], + [ [ "vinegar", 1 ] ] + ] + }, + { + "type": "recipe", + "result": "soup_woods", + "id_suffix": "jarred_3l", + "byproducts": [ [ "water", 10 ] ], + "container": "jar_3l_glass_sealed", + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_MEAT", + "skill_used": "cooking", + "skills_required": [ "mechanics", 1 ], + "difficulty": 4, + "time": 40000, + "autolearn": true, + "batch_time_factors": [ 80, 4 ], + "qualities": [ { "id": "COOK", "level": 3 } ], + "tools": [ [ [ "surface_heat", 200, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], + "components": [ + [ [ "jar_3l_glass", 1 ] ], + [ [ "water", 10 ], [ "water_clean", 10 ] ], + [ [ "broth", 12 ], [ "broth_bone", 12 ], [ "pine_tea", 12 ] ], + [ + [ "meat", 12 ], + [ "meat_smoked", 12 ], + [ "dry_meat", 12 ], + [ "rehydrated_meat", 12 ], + [ "meat_canned", 12 ], + [ "can_chicken", 12 ], + [ "fish", 12 ], + [ "fish_smoked", 12 ], + [ "dry_fish", 12 ], + [ "rehydrated_fish", 12 ], + [ "fish_canned", 12 ], + [ "can_salmon", 12 ], + [ "can_tuna", 12 ], + [ "sausage", 24 ], + [ "bacon", 24 ], + [ "powder_eggs", 120 ], + [ "eggs_bird", 24, "LIST" ], + [ "egg_reptile", 24 ] + ], + [ + [ "veggy_wild", 12 ], + [ "veggy", 12 ], + [ "rehydrated_veggy", 12 ], + [ "dry_veggy", 12 ], + [ "dry_beans", 12 ], + [ "can_beans", 12 ], + [ "raw_beans", 12 ], + [ "beans_cooked", 12 ], + [ "dry_rice", 12 ], + [ "dandelion_cooked", 12 ], + [ "mushroom", 12 ], + [ "dry_mushroom", 12 ], + [ "mushroom_cooked", 12 ], + [ "morel_cooked", 12 ], + [ "acorns_cooked", 12 ] + ] + ] + }, + { + "type": "recipe", + "result": "soup_meat", + "id_suffix": "jarred", + "byproducts": [ [ "water", 10 ] ], + "container": "jar_3l_glass_sealed", + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_MEAT", + "skill_used": "cooking", + "skills_required": [ "mechanics", 1 ], + "difficulty": 4, + "time": 40000, + "autolearn": true, + "batch_time_factors": [ 80, 4 ], + "qualities": [ { "id": "COOK", "level": 3 } ], + "tools": [ [ [ "surface_heat", 200, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], + "components": [ + [ [ "jar_3l_glass", 1 ] ], + [ [ "water", 10 ], [ "water_clean", 10 ] ], + [ [ "broth", 12 ], [ "broth_bone", 12 ] ], + [ + [ "potato_irradiated", 12 ], + [ "potato_raw", 12 ], + [ "celery", 12 ], + [ "irradiated_celery", 12 ], + [ "cabbage", 12 ], + [ "irradiated_cabbage", 12 ], + [ "sauerkraut", 24 ], + [ "powder_eggs", 60 ], + [ "eggs_bird", 12, "LIST" ], + [ "egg_reptile", 12 ], + [ "can_beans", 12 ], + [ "beans_cooked", 12 ], + [ "spaghetti_raw", 12 ], + [ "macaroni_raw", 12 ], + [ "noodles_fast", 12 ], + [ "dry_beans", 12 ], + [ "raw_beans", 12 ], + [ "dry_rice", 12 ], + [ "dandelion_cooked", 12 ], + [ "acorns_cooked", 12 ] + ], + [ [ "meat", 24 ], [ "rehydrated_meat", 24 ], [ "dry_meat", 24 ], [ "meat_canned", 24 ], [ "can_chicken", 24 ] ] + ] + }, + { + "type": "recipe", + "result": "soup_veggy", + "id_suffix": "jarred_3l", + "byproducts": [ [ "water", 10 ] ], + "container": "jar_3l_glass_sealed", + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_VEGGI", + "skill_used": "cooking", + "skills_required": [ "mechanics", 1 ], + "difficulty": 4, + "time": 40000, + "autolearn": true, + "batch_time_factors": [ 80, 4 ], + "qualities": [ { "id": "COOK", "level": 3 } ], + "tools": [ [ [ "surface_heat", 200, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], + "components": [ + [ [ "jar_3l_glass", 1 ] ], + [ [ "water", 10 ], [ "water_clean", 10 ] ], + [ [ "broth", 12 ] ], + [ + [ "potato_irradiated", 12 ], + [ "potato_raw", 12 ], + [ "celery", 12 ], + [ "irradiated_celery", 12 ], + [ "cabbage", 12 ], + [ "irradiated_cabbage", 12 ], + [ "sauerkraut", 24 ], + [ "powder_eggs", 60 ], + [ "eggs_bird", 12, "LIST" ], + [ "egg_reptile", 12 ], + [ "can_beans", 12 ], + [ "beans_cooked", 12 ], + [ "spaghetti_raw", 12 ], + [ "macaroni_raw", 12 ], + [ "noodles_fast", 12 ], + [ "dry_beans", 12 ], + [ "raw_beans", 12 ], + [ "dry_rice", 12 ], + [ "dandelion_cooked", 12 ], + [ "acorns_cooked", 12 ] + ], + [ + [ "irradiated_tomato", 24 ], + [ "can_tomato", 24 ], + [ "tomato", 24 ], + [ "pumpkin", 24 ], + [ "irradiated_pumpkin", 24 ], + [ "irradiated_broccoli", 24 ], + [ "broccoli", 24 ], + [ "irradiated_zucchini", 24 ], + [ "zucchini", 24 ], + [ "potato_raw", 24 ], + [ "potato_irradiated", 24 ], + [ "onion", 24 ], + [ "irradiated_onion", 24 ], + [ "carrot", 144 ], + [ "irradiated_carrot", 144 ], + [ "veggy", 24 ], + [ "dry_veggy", 24 ], + [ "mushroom", 24 ], + [ "dry_mushroom", 24 ], + [ "mushroom_cooked", 24 ], + [ "morel_cooked", 24 ], + [ "rehydrated_veggy", 24 ], + [ "veggy_wild", 24 ] + ] + ] + }, + { + "type": "recipe", + "result": "soup_fish", + "id_suffix": "jarred_3l", + "byproducts": [ [ "water", 10 ] ], + "container": "jar_3l_glass_sealed", + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_MEAT", + "skill_used": "cooking", + "skills_required": [ "mechanics", 1 ], + "difficulty": 4, + "time": 40000, + "autolearn": true, + "batch_time_factors": [ 80, 4 ], + "qualities": [ { "id": "COOK", "level": 3 } ], + "tools": [ [ [ "surface_heat", 200, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], + "components": [ + [ [ "jar_3l_glass", 1 ] ], + [ [ "water", 10 ], [ "water_clean", 10 ] ], + [ [ "broth", 12 ], [ "broth_bone", 12 ] ], + [ + [ "potato_irradiated", 12 ], + [ "potato_raw", 12 ], + [ "celery", 12 ], + [ "irradiated_celery", 12 ], + [ "cabbage", 12 ], + [ "irradiated_cabbage", 12 ], + [ "sauerkraut", 74 ], + [ "can_corn", 12 ], + [ "corn", 12 ], + [ "irradiated_corn", 12 ], + [ "irradiated_onion", 12 ], + [ "onion", 12 ], + [ "irradiated_carrot", 72 ], + [ "carrot", 72 ], + [ "pumpkin", 12 ], + [ "irradiated_pumpkin", 12 ], + [ "veggy_wild", 12 ], + [ "veggy", 12 ], + [ "dry_veggy", 12 ], + [ "powder_eggs", 60 ], + [ "eggs_bird", 12, "LIST" ], + [ "egg_reptile", 12 ], + [ "can_beans", 12 ], + [ "spaghetti_raw", 12 ], + [ "macaroni_raw", 12 ], + [ "noodles_fast", 12 ], + [ "con_milk", 12 ], + [ "flatbread", 12 ], + [ "tortilla_corn", 12 ], + [ "bread", 12 ], + [ "cornbread", 12 ], + [ "biscuit", 12 ], + [ "hardtack", 12 ], + [ "wastebread", 12 ], + [ "flour", 12 ], + [ "cornmeal", 12 ], + [ "milk_powder", 12 ], + [ "crackers", 24 ], + [ "dry_beans", 12 ], + [ "raw_beans", 12 ], + [ "dry_rice", 12 ], + [ "beans_cooked", 12 ], + [ "dandelion_cooked", 12 ], + [ "mushroom", 12 ], + [ "dry_mushroom", 12 ], + [ "morel_cooked", 12 ], + [ "mushroom_cooked", 12 ], + [ "acorns_cooked", 12 ] + ], + [ + [ "fish", 24 ], + [ "dry_fish", 24 ], + [ "salted_fish", 18 ], + [ "fish_smoked", 24 ], + [ "fish_pickled", 12 ], + [ "fish_vac", 24 ], + [ "fish_canned", 12 ], + [ "can_salmon", 12 ], + [ "can_tuna", 12 ] + ] + ] + }, + { + "type": "recipe", + "result": "soup_human", + "id_suffix": "jarred_3l", + "byproducts": [ [ "water", 10 ] ], + "container": "jar_3l_glass_sealed", + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_MEAT", + "skill_used": "cooking", + "skills_required": [ "mechanics", 1 ], + "difficulty": 4, + "time": 40000, + "book_learn": [ [ "cookbook_human", 4 ] ], + "batch_time_factors": [ 80, 4 ], + "qualities": [ { "id": "COOK", "level": 3 } ], + "tools": [ [ [ "surface_heat", 200, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], + "components": [ + [ [ "jar_3l_glass", 1 ] ], + [ [ "water", 10 ], [ "water_clean", 10 ] ], + [ [ "broth", 12 ], [ "broth_human", 12 ], [ "broth_bone", 6 ] ], + [ + [ "potato_irradiated", 12 ], + [ "potato_raw", 12 ], + [ "celery", 12 ], + [ "irradiated_celery", 12 ], + [ "cabbage", 12 ], + [ "irradiated_cabbage", 12 ], + [ "sauerkraut", 24 ], + [ "powder_eggs", 60 ], + [ "eggs_bird", 12, "LIST" ], + [ "egg_reptile", 12 ], + [ "can_beans", 12 ], + [ "spaghetti_raw", 12 ], + [ "macaroni_raw", 12 ], + [ "noodles_fast", 12 ], + [ "dry_beans", 12 ], + [ "raw_beans", 12 ], + [ "dry_rice", 12 ], + [ "beans_cooked", 12 ], + [ "acorns_cooked", 12 ] + ], + [ [ "dry_hflesh", 24 ], [ "rehydrated_hflesh", 24 ], [ "human_flesh", 24 ] ] + ] + }, + { + "type": "recipe", + "result": "broth", + "id_suffix": "jarred_3l", + "byproducts": [ [ "water", 10 ] ], + "container": "jar_3l_glass_sealed", + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_VEGGI", + "skill_used": "cooking", + "skills_required": [ "mechanics", 1 ], + "difficulty": 4, + "time": 40000, + "autolearn": true, + "batch_time_factors": [ 80, 4 ], + "qualities": [ { "id": "COOK", "level": 3 } ], + "tools": [ [ [ "surface_heat", 200, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], + "components": [ + [ [ "jar_3l_glass", 1 ] ], + [ [ "water", 22 ], [ "water_clean", 22 ] ], + [ + [ "irradiated_broccoli", 12 ], + [ "broccoli", 12 ], + [ "irradiated_tomato", 12 ], + [ "can_tomato", 12 ], + [ "tomato", 12 ], + [ "pumpkin", 12 ], + [ "irradiated_pumpkin", 12 ], + [ "irradiated_zucchini", 12 ], + [ "zucchini", 12 ], + [ "veggy", 12 ], + [ "veggy_wild", 12 ], + [ "powder_eggs", 60 ], + [ "eggs_bird", 12, "LIST" ], + [ "egg_reptile", 12 ], + [ "dry_veggy", 24 ], + [ "dandelion_cooked", 24 ], + [ "mushroom_cooked", 24 ], + [ "morel_cooked", 24 ], + [ "mushroom", 24 ], + [ "dry_mushroom", 24 ] + ], + [ + [ "seasoning_italian", 60 ], + [ "wild_herbs", 60 ], + [ "seasoning_salt", 60 ], + [ "soysauce", 8 ], + [ "pepper", 80 ], + [ "seed_garlic", 24 ], + [ "garlic", 4 ], + [ "salt_water", 4 ], + [ "salt", 60 ] + ] + ] + }, + { + "type": "recipe", + "result": "broth_bone", + "id_suffix": "jarred_3l", + "byproducts": [ [ "water", 10 ] ], + "container": "jar_3l_glass_sealed", + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_OTHER", + "skill_used": "cooking", + "skills_required": [ "mechanics", 1 ], + "difficulty": 4, + "time": 70000, + "autolearn": true, + "batch_time_factors": [ 80, 4 ], + "qualities": [ { "id": "COOK", "level": 3 } ], + "tools": [ [ [ "surface_heat", 200, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], + "components": [ [ [ "jar_3l_glass", 1 ] ], [ [ "water", 24 ], [ "water_clean", 24 ] ], [ [ "bone", 120 ] ] ] + }, + { + "type": "recipe", + "result": "broth_human", + "id_suffix": "jarred_3l", + "byproducts": [ [ "water", 10 ] ], + "container": "jar_3l_glass_sealed", + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_OTHER", + "skill_used": "cooking", + "skills_required": [ "mechanics", 1 ], + "difficulty": 4, + "time": 70000, + "book_learn": [ [ "cookbook_human", 4 ] ], + "batch_time_factors": [ 80, 4 ], + "qualities": [ { "id": "COOK", "level": 3 } ], + "tools": [ [ [ "surface_heat", 200, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], + "components": [ [ [ "jar_3l_glass", 1 ] ], [ [ "water", 24 ], [ "water_clean", 24 ] ], [ [ "bone_human", 120 ] ] ] + }, + { + "type": "recipe", + "result": "sauce_red", + "id_suffix": "jarred_3l", + "byproducts": [ [ "water", 10 ] ], + "container": "jar_3l_glass_sealed", + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_VEGGI", + "skill_used": "cooking", + "difficulty": 4, + "time": 120000, + "autolearn": true, + "batch_time_factors": [ 80, 4 ], + "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "tools": [ [ [ "surface_heat", 200, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], + "components": [ + [ [ "jar_3l_glass", 1 ] ], + [ [ "water", 22 ], [ "water_clean", 22 ] ], + [ [ "can_tomato", 12 ], [ "tomato", 12 ], [ "irradiated_tomato", 12 ] ] + ] + }, + { + "type": "recipe", + "result": "sauce_red", + "id_suffix": "jarred", + "byproducts": [ [ "water", 10 ] ], + "container": "jar_glass_sealed", + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_VEGGI", + "skill_used": "cooking", + "difficulty": 4, + "time": 40000, + "result_mult": 2, + "autolearn": true, + "batch_time_factors": [ 80, 4 ], + "qualities": [ { "id": "CUT", "level": 1 }, { "id": "COOK", "level": 3 } ], + "tools": [ [ [ "surface_heat", 200, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], + "components": [ + [ [ "jar_glass", 1 ] ], + [ [ "can_tomato", 2 ], [ "tomato", 2 ], [ "irradiated_tomato", 2 ] ], + [ [ "water", 12 ], [ "water_clean", 12 ] ] + ] + }, + { + "type": "recipe", + "result": "sauce_red", + "id_suffix": "canned", + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_VEGGI", + "skill_used": "cooking", + "difficulty": 4, + "time": 40000, + "autolearn": true, + "contained": true, + "batch_time_factors": [ 83, 5 ], + "qualities": [ + { "id": "SAW_M", "level": 1 }, + { "id": "HAMMER", "level": 1 }, + { "id": "CUT", "level": 1 }, + { "id": "COOK", "level": 3 } + ], + "tools": [ [ [ "surface_heat", 10, "LIST" ] ], [ [ "can_sealer", -1 ] ] ], + "components": [ + [ [ "canister_empty", 1 ], [ "can_food_unsealed", 1 ] ], + [ [ "scrap", 1 ] ], + [ [ "can_tomato", 1 ], [ "tomato", 1 ], [ "irradiated_tomato", 1 ] ], + [ [ "water", 1 ], [ "water_clean", 1 ] ] + ] + }, + { + "type": "recipe", + "result": "kompot", + "id_suffix": "jarred", + "byproducts": [ [ "water", 10 ] ], + "container": "jar_glass_sealed", + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_DRINKS", + "skill_used": "cooking", + "skills_required": [ "mechanics", 1 ], + "difficulty": 3, + "time": 30000, + "autolearn": true, + "batch_time_factors": [ 80, 4 ], + "qualities": [ { "id": "COOK", "level": 3 } ], + "tools": [ [ [ "surface_heat", 100, "LIST" ] ], [ [ "pot_canning", -1 ] ] ], + "components": [ + [ [ "jar_glass", 1 ] ], + [ [ "water", 12 ], [ "water_clean", 12 ] ], + [ [ "sweet_fruit_like", 1, "LIST" ] ], + [ [ "sugar", 5 ] ] + ] } ] diff --git a/data/json/techniques.json b/data/json/techniques.json index 1f352ab07218c..077197984d784 100644 --- a/data/json/techniques.json +++ b/data/json/techniques.json @@ -204,8 +204,7 @@ "messages" : [ "You counter-attack %s", " counter-attacks %s" - ], - "description" : "Counterattack on block, counterattack on dodge" + ] },{ "type" : "technique", "id" : "tec_feint", @@ -213,8 +212,7 @@ "unarmed_allowed" : true, "melee_allowed" : true, "defensive" : true, - "miss_recovery" : true, - "description" : "Free recovery from a miss" + "miss_recovery" : true },{ "type" : "technique", "id" : "tec_break", @@ -222,8 +220,7 @@ "unarmed_allowed" : true, "melee_allowed" : true, "defensive" : true, - "grab_break" : true, - "description" : "Break a grab" + "grab_break" : true },{ "type" : "technique", "id" : "tec_precise", @@ -236,8 +233,7 @@ "You jab deftly at %s", " jabs deftly at %s" ], - "stun_dur" : 2, - "description" : "Stun 2 turns, crit only" + "stun_dur" : 2 },{ "type" : "technique", "id" : "tec_boxing_cross", @@ -248,8 +244,7 @@ "You throw a heavy cross at %s", " throws a cross at %s" ], - "bash_mult" : 1.2, - "description" : "x1.2 bash damage, min 2 unarmed" + "mult_bonuses" : [["damage", "bash", 1.2]] },{ "type" : "technique", "id" : "tec_boxing_rapid", @@ -265,8 +260,7 @@ ["damage", "bash", 0.66], ["damage", "cut", 0.66], ["damage", "stab", 0.66] - ], - "description" : "50% moves, 66% damage, min 3 unarmed" + ] },{ "type" : "technique", "id" : "tec_boxing_upper", @@ -278,9 +272,8 @@ "You uppercut %s", " uppercuts %s" ], - "bash_mult" : 1.4, - "stun_dur" : 2, - "description" : "Stun 2 turns, x1.4 bash damage, min 4 unarmed" + "mult_bonuses" : [["damage", "bash", 1.4]], + "stun_dur" : 2 },{ "type" : "technique", "id" : "tec_boxing_counter", @@ -298,8 +291,7 @@ " throws a perfect counter at %s" ], "mult_bonuses" : [["movecost", 0.0]], - "stun_dur" : 2, - "description" : "Stun 2 turns, knockback 1 tile, crit only, min 5 unarmed" + "stun_dur" : 2 },{ "type" : "technique", "id" : "tec_karate_rapid", @@ -315,8 +307,7 @@ ["damage", "bash", 0.66], ["damage", "cut", 0.66], ["damage", "stab", 0.66] - ], - "description" : "50% moves, 66% damage" + ] },{ "type" : "technique", "id" : "tec_karate_precise", @@ -328,8 +319,7 @@ "You karate chop %s", " karate chops %s" ], - "stun_dur" : 2, - "description" : "Stun 2 turns, crit only, min 4 unarmed" + "stun_dur" : 2 },{ "type" : "technique", "id" : "tec_aikido_throw", @@ -342,8 +332,7 @@ "messages" : [ "You throw %s", " throws %s" - ], - "description" : "Down 1 turn, knockback 1 tile, min 2 unarmed" + ] },{ "type" : "technique", "id" : "tec_aikido_dodgethrow", @@ -358,8 +347,7 @@ "messages" : [ "You smoothly throw %s", " smoothly throws %s" - ], - "description" : "Down 1 turn, knockback 1 tile, counterattack on dodge, min 6 unarmed" + ] },{ "type" : "technique", "id" : "tec_aikido_feint", @@ -371,8 +359,7 @@ "messages" : [ "You feint at %s", " feints at %s" - ], - "description" : "Free recovery from a miss, min 2 unarmed" + ] },{ "type" : "technique", "id" : "tec_aikido_disarm", @@ -383,8 +370,7 @@ "messages" : [ "You disarm %s", " disarms %s" - ], - "description" : "Unwield target's weapon, min 3 unarmed" + ] },{ "type" : "technique", "id" : "tec_judo_throw", @@ -397,8 +383,7 @@ "messages" : [ "You throw %s", " throws %s" - ], - "description" : "Down 1 turn, knockback 1 tile, min 3 unarmed" + ] },{ "type" : "technique", "id" : "tec_judo_grab", @@ -409,8 +394,7 @@ "messages" : [ "You grab %s", " grabs %s" - ], - "description" : "Down 2 turns, min 2 unarmed" + ] },{ "type" : "technique", "id" : "tec_taichi_disarm", @@ -421,8 +405,7 @@ "messages" : [ "You disarm %s", " disarms %s" - ], - "description" : "Unwield target's weapon, min 3 unarmed" + ] },{ "type" : "technique", "id" : "tec_taichi_precise", @@ -434,8 +417,7 @@ "messages" : [ "You strike %s", " strikes %s" - ], - "description" : "Stun 2 turns, crit only, min 4 unarmed" + ] },{ "type" : "technique", "id" : "tec_capoeira_feint", @@ -447,8 +429,7 @@ "messages" : [ "You feint at %s", " feints at %s" - ], - "description" : "Free recovery from a miss, min 1 unarmed" + ] },{ "type" : "technique", "id" : "tec_muay_thai_elbow", @@ -460,8 +441,7 @@ "You elbow %s", " elbows %s" ], - "movecost_mult" : 0.5, - "description" : "50% moves, crit only, min 2 unarmed" + "mult_bonuses" : [["movecost", 0.5]] },{ "type" : "technique", "id" : "tec_muay_thai_kick", @@ -472,8 +452,7 @@ "You power-kick %s", " power-kicks %s" ], - "stun_dur" : 1, - "description" : "Stun 1 turn, min 3 unarmed" + "stun_dur" : 1 },{ "type" : "technique", "id" : "tec_muay_thai_knee", @@ -485,8 +464,7 @@ "You flying knee %s", " flying knees %s" ], - "stun_dur" : 2, - "description" : "Stun 2 turns, crit only, min 4 unarmed" + "stun_dur" : 2 },{ "type" : "technique", "id" : "tec_krav_maga_rapid", @@ -502,8 +480,7 @@ ["damage", "bash", 0.66], ["damage", "cut", 0.66], ["damage", "stab", 0.66] - ], - "description" : "50% moves, 66% damage, min 2 unarmed" + ] },{ "type" : "technique", "id" : "tec_krav_maga_feint", @@ -515,8 +492,7 @@ "messages" : [ "You feint at %s", " feints at %s" - ], - "description" : "Free recovery from a miss, min 2 unarmed" + ] },{ "type" : "technique", "id" : "tec_krav_maga_precise", @@ -528,8 +504,7 @@ "You jab %s", " jabs %s" ], - "stun_dur" : 2, - "description" : "Stun 2 turns, crit only, min 3 unarmed" + "stun_dur" : 2 },{ "type" : "technique", "id" : "tec_krav_maga_disarm", @@ -540,8 +515,7 @@ "messages" : [ "You disarm %s", " disarms %s" - ], - "description" : "Unwield target's weapon, min 3 unarmed" + ] },{ "type" : "technique", "id" : "tec_krav_maga_grab", @@ -552,8 +526,7 @@ "messages" : [ "You grab %s", " grabs %s" - ], - "description" : "Down 1 turn, min 4 unarmed" + ] },{ "type" : "technique", "id" : "tec_krav_maga_break", @@ -562,8 +535,7 @@ "unarmed_allowed" : true, "melee_allowed" : true, "defensive" : true, - "grab_break" : true, - "description" : "Break a grab, min 4 unarmed" + "grab_break" : true },{ "type" : "technique", "id" : "tec_ninjutsu_precise", @@ -578,9 +550,10 @@ " surprise attacks %s" ], "stun_dur" : 2, - "bash_mult" : 1.4, - "cut_mult" : 2, - "description" : "Stun 2 turns, x1.4 bash damage, x2 cut damage, crit only, min 3 unarmed, min 3 melee" + "mult_bonuses" : [ + ["damage", "bash", 1.4], + ["damage", "cut", 2] + ] },{ "type" : "technique", "id" : "tec_taekwondo_precise", @@ -592,8 +565,7 @@ "messages" : [ "You axe-kick %s", " axe-kicks %s" - ], - "description" : "Stun 2 turns, crit only, min 2 unarmed" + ] },{ "type" : "technique", "id" : "tec_taekwondo_push", @@ -605,8 +577,7 @@ " side-kicks %s" ], "stun_dur" : 1, - "knockback_dist" : 1, - "description" : "Stun 1 turn, knockback 1 tile, min 3 unarmed" + "knockback_dist" : 1 },{ "type" : "technique", "id" : "tec_taekwondo_sweep", @@ -617,8 +588,7 @@ "You sweep-kick %s", " sweep-kicks %s" ], - "down_dur" : 2, - "description" : "Down 2 turns, min 4 unarmed" + "down_dur" : 2 },{ "type" : "technique", "id" : "tec_biojutsu_counter", @@ -630,8 +600,7 @@ "messages" : [ "You block and counter-attack %s", " blocks and counter-attacks %s" - ], - "description" : "Counterattack on block, min 4 melee" + ] },{ "type" : "technique", "id" : "tec_biojutsu_rapid_unarmed", @@ -647,8 +616,7 @@ ["damage", "bash", 0.66], ["damage", "cut", 0.66], ["damage", "stab", 0.66] - ], - "description" : "50% moves, 66% damage" + ] },{ "type" : "technique", "id" : "tec_biojutsu_rapid_armed", @@ -663,22 +631,22 @@ ["damage", "bash", 0.66], ["damage", "cut", 0.66], ["damage", "stab", 0.66] - ], - "description" : "50% moves, 66% damage" + ] },{ "type" : "technique", "id" : "tec_biojutsu_impale", "name" : "biojutsu impale", "min_melee" : 3, "crit_tec" : true, - "cut_mult" : 1.5, - "bash_mult" : 1.5, + "mult_bonuses" : [ + ["damage", "bash", 1.5], + ["damage", "cut", 1.5] + ], "messages" : [ "You brutally impale %s", " brutally impales %s" ], - "stun_dur" : 1, - "description" : "Stun 1 turn, x1.5 cut damage, x1.5 bash damage, crit only, min 3 melee" + "stun_dur" : 1 },{ "type" : "technique", "id" : "tec_biojutsu_sweep", @@ -689,8 +657,7 @@ "You sweep-kick %s", " sweep-kicks %s" ], - "down_dur" : 2, - "description" : "Down 2 turns, min 2 melee" + "down_dur" : 2 },{ "type" : "technique", "id" : "tec_biojutsu_wide", @@ -701,8 +668,7 @@ "You cleave through %s", " cleave through %s" ], - "aoe" : "wide", - "description" : "Attack in a wide arc, crit only, min 5 melee" + "aoe" : "wide" },{ "type" : "technique", "id" : "tec_zuiquan_feint", @@ -714,8 +680,7 @@ "messages" : [ "You stumble and leer at %s", " stumbles and leers at %s" - ], - "description" : "Free recovery from a miss, min 3 unarmed" + ] },{ "type" : "technique", "id" : "tec_zuiquan_counter", @@ -730,8 +695,7 @@ "messages" : [ "You lurch, and your wild swing hits %s", " lurches, and hits %s" - ], - "description" : "x1.25 bash damage, counterattack on dodge, min 4 unarmed" + ] },{ "type" : "technique", "id" : "tec_fencing_lunge", @@ -742,8 +706,7 @@ "messages" : [ "You lunge at %s", " lunges at %s" - ], - "description" : "75% moves, min 2 melee" + ] },{ "type" : "technique", "id" : "tec_fencing_thrust", @@ -757,8 +720,7 @@ "messages" : [ "You thrust at %s", " thrust at %s" - ], - "description" : "90% moves, x1.25 stab damage, min 1 melee" + ] },{ "type" : "technique", "id" : "tec_fencing_stop_thrust", @@ -773,8 +735,7 @@ "messages" : [ "You deliver a perfect stop thrust to %s", " delivers a perfect stop thrust to %s" - ], - "description" : "x1.5 stab damage, stun 1 turn, counterattack on block, min 3 melee" + ] },{ "type" : "technique", "id" : "tec_eskrima_round", @@ -784,8 +745,7 @@ "messages" : [ "You round strike %s", " round strikes %s" - ], - "description" : "60% moves, min 4 melee" + ] },{ "type" : "technique", "id" : "tec_eskrima_fan", @@ -795,8 +755,7 @@ "messages" : [ "You fan strike %s", " fan strikes %s" - ], - "description" : "75% moves, min 2 melee" + ] },{ "type" : "technique", "id" : "tec_eskrima_snap", @@ -806,8 +765,7 @@ "messages" : [ "You snap out at %s", " snaps quickly at %s" - ], - "description" : "80% moves" + ] },{ "type" : "technique", "id" : "tec_eskrima_combination", @@ -825,8 +783,7 @@ "messages" : [ "You combination strike %s", " combination strikes %s" - ], - "description" : "80% moves, 150% damage, min 2 melee" + ] },{ "type" : "technique", "id" : "tec_eskrima_free", @@ -839,8 +796,7 @@ "messages" : [ "You whip a free strike onto %s", " free strikes %s" - ], - "description" : "Free strike, min 4 melee" + ] },{ "type" : "technique", "id" : "tec_eskrima_puno", @@ -857,8 +813,7 @@ "messages" : [ "You deliver a puño to %s", " haftstrikes %s" - ], - "description" : "Converts all damage into x4 bashing damage, stun 1 turn, min 3 melee, min 2 points of bashing damage delivered" + ] },{ "type" : "technique", "id" : "tec_eskrima_kick", @@ -869,8 +824,7 @@ "messages" : [ "You deliver a knee strike to %s", " knees %s" - ], - "description" : "Down 2 turns, crit only, min 3 unarmed" + ] },{ "type" : "technique", "id" : "tec_silat_hamstring", @@ -881,8 +835,7 @@ "messages" : [ "You ground %s with a low blow", " grounds %s with a low blow" - ], - "description" : "Down 3 turns, crit only, min 2 melee" + ] },{ "type" : "technique", "id" : "tec_silat_precise", @@ -897,8 +850,7 @@ "messages" : [ "You viciously wound %s", " viciously wounds %s" - ], - "description" : "150% damage, crit only, min 4 melee" + ] },{ "type" : "technique", "id" : "tec_silat_brutal", @@ -910,8 +862,7 @@ "messages" : [ "You send %s reeling backwards", " sends %s reeling" - ], - "description" : "Stun 1 turn, knockback 1 tile, crit only, min 3 melee" + ] },{ "type" : "technique", "id" : "tec_silat_dirty", @@ -925,8 +876,7 @@ "messages" : [ "You hit %s with a dirty blow", " delivers a dirty blow to %s" - ], - "description" : "Stun 2 turns, crit only, min 1 melee" + ] },{ "type" : "technique", "id" : "tec_venom_snake_feint", @@ -938,8 +888,7 @@ "messages" : [ "You hiss threateningly at %s", " hisses threateningly at %s" - ], - "description" : "Free recovery from a miss" + ] },{ "type" : "technique", "id" : "tec_venom_snake_rapid", @@ -955,8 +904,7 @@ "messages" : [ "You quickly chop %s", " quickly chops %s" - ], - "description" : "50% moves, 66% damage, min 3 unarmed" + ] },{ "type" : "technique", "id" : "tec_venom_snake_bite", @@ -969,8 +917,7 @@ "messages" : [ "You Snakebite %s", " Snakebites %s" - ], - "description" : "Stun 2 turns, x1.5 bash damage, 2 turns duration" + ] },{ "type" : "technique", "id" : "tec_venom_snake_strike", @@ -983,8 +930,7 @@ "messages" : [ "You Viper Strike %s", " Viper Strikes %s" - ], - "description" : "x3 bash damage, 2 turns duration" + ] },{ "type" : "technique", "id" : "tec_venom_snake_break", @@ -992,8 +938,7 @@ "unarmed_allowed" : true, "melee_allowed" : true, "defensive" : true, - "grab_break" : true, - "description" : "Break a grab" + "grab_break" : true },{ "type" : "technique", "id" : "tec_scorpion_brutal", @@ -1002,29 +947,23 @@ "crit_tec" : true, "stun_dur" : 3, "knockback_dist" : 3, - "mult_bonuses" : [ - ["damage", "bash", 2] - ], + "mult_bonuses" : [["damage", "bash", 2]], "messages" : [ "Your Stinger Kick sends %s flying", "'s Stinger Kick sends %s flying" - ], - "description" : "Stun 3 turns, knockback 3 tiles, x2 bash damage, crit only" + ] },{ "type" : "technique", "id" : "tec_scorpion_precise", "name" : "Pincer Strike", "min_unarmed" : 4, "unarmed_allowed" : true, - "mult_bonuses" : [ - ["damage", "bash", 1.25] - ], + "mult_bonuses" : [["damage", "bash", 1.25]], "messages" : [ "You punch %s with your Pincer Fist", " jabs %s with a Pincer Fist" ], - "stun_dur" : 2, - "description" : "x1.25 bash damage, stun 2 turns, min 4 unarmed" + "stun_dur" : 2 },{ "type" : "technique", "id" : "tec_toad_grab", @@ -1036,8 +975,7 @@ "messages" : [ "You snatch and slug %s", " snatches and slug %s" - ], - "description" : "50% moves, down 1 turn, min 4 unarmed" + ] },{ "type" : "technique", "id" : "tec_centipede_rapid", @@ -1053,8 +991,7 @@ "messages" : [ "You swiftly hit %s", " swiftly hits %s" - ], - "description" : "50% moves, 66% damage, min 2 unarmed" + ] },{ "type" : "technique", "id" : "tec_snake_rapid", @@ -1070,8 +1007,7 @@ "messages" : [ "You swiftly jab %s", " swiftly jabs %s" - ], - "description" : "50% moves, 66% damage, min 2 unarmed" + ] },{ "type" : "technique", "id" : "tec_snake_feint", @@ -1083,8 +1019,7 @@ "messages" : [ "You make serpentine hand motions at %s", " makes serpentine hand motions at %s" - ], - "description" : "Free recovery from a miss, min 3 unarmed" + ] },{ "type" : "technique", "id" : "tec_snake_break", @@ -1096,8 +1031,7 @@ "messages" : [ "You slither free", " slithers free" - ], - "description" : "Break a grab, min 4 unarmed" + ] },{ "type" : "technique", "id" : "tec_snake_precise", @@ -1109,8 +1043,7 @@ "You strike out at %s", " strikes out at %s" ], - "stun_dur" : 2, - "description" : "Stun 2 turns, crit only, min 4 unarmed" + "stun_dur" : 2 },{ "type" : "technique", "id" : "tec_tiger_grab", @@ -1121,8 +1054,7 @@ "messages" : [ "You grab and ground %s", " grabs and grounds %s" - ], - "description" : "Down 1 turns, min 4 unarmed" + ] },{ "type" : "technique", "id" : "tec_leopard_precise", @@ -1134,8 +1066,7 @@ "You strike out at %s with your Leopard Fist", " strikes out at %s with a Leopard Fist" ], - "stun_dur" : 2, - "description" : "Stun 2 turns, crit only, min 5 unarmed" + "stun_dur" : 2 },{ "type" : "technique", "id" : "tec_leopard_rapid", @@ -1151,8 +1082,7 @@ "messages" : [ "You quickly swipe at %s", " quickly swipes at %s" - ], - "description" : "50% moves, 66% damage, min 2 unarmed" + ] },{ "type" : "technique", "id" : "tec_leopard_counter", @@ -1167,8 +1097,7 @@ "messages" : [ "You dodge the attack and swipe at %s's exposed flank", " dodges and catches %s exposed" - ], - "description" : "x1.5 bash damage, counterattack on dodge, min 4 unarmed" + ] },{ "type" : "technique", "id" : "tec_dragon_grab", @@ -1176,12 +1105,11 @@ "min_unarmed" : 4, "unarmed_allowed" : true, "stun_dur" : 2, - "bash_mult" : 1.2, + "mult_bonuses" : [["damage", "bash", 1.2]], "messages" : [ "You grab and knee %s", " grabs and knees %s" - ], - "description" : "Stun 2 turns, x1.2 bash damage, min 4 unarmed" + ] },{ "type" : "technique", "id" : "tec_dragon_counter", @@ -1195,8 +1123,7 @@ "messages" : [ "You catch the attack and send %s spinning", " catches and spins %s" - ], - "description" : "Stun 2 turns, counterattack on dodge, counterattack on block, min 4 unarmed" + ] },{ "type" : "technique", "id" : "tec_dragon_sweep", @@ -1207,8 +1134,7 @@ "messages" : [ "You low-roundhouse %s 's legs", " low-roundhouses %s 's legs" - ], - "description" : "Down 2 turns, min 5 unarmed" + ] },{ "type" : "technique", "id" : "tec_dragon_brutal", @@ -1221,8 +1147,7 @@ "messages" : [ "You send %s reeling with a Dragon Strike", " sends %s reeling with a Dragon Strike" - ], - "description" : "Stun 1 turn, knockback 1 tile, crit only, min 6 unarmed" + ] },{ "type" : "technique", "id" : "tec_crane_feint", @@ -1234,8 +1159,7 @@ "messages" : [ "You raise your arms intimidatingly", " performs the Crane Wing" - ], - "description" : "Free recovery from a miss, min 2 unarmed" + ] },{ "type" : "technique", "id" : "tec_crane_break", @@ -1247,8 +1171,7 @@ "messages" : [ "You swing your arms and break free", " flaps free" - ], - "description" : "Break a grab, min 3 unarmed" + ] },{ "type" : "technique", "id" : "tec_crane_precise", @@ -1260,8 +1183,7 @@ "You hand-peck %s", " hand-pecks %s" ], - "stun_dur" : 3, - "description" : "Stun 3 turns, crit only, min 4 unarmed" + "stun_dur" : 3 },{ "type" : "technique", "id" : "tec_brawl_feint", @@ -1274,8 +1196,7 @@ "messages" : [ "You fake a strike at %s", " feints at %s" - ], - "description" : "Free recovery from a miss, min 3 unarmed" + ] },{ "type" : "technique", "id" : "tec_brawl_power", @@ -1289,8 +1210,7 @@ "messages" : [ "You send %s reeling", " sends %s reeling" - ], - "description" : "Stun 1 turn, knockback 1 tile, crit only, min 4 unarmed" + ] },{ "type" : "technique", "id" : "tec_brawl_counter", @@ -1302,8 +1222,7 @@ "messages" : [ "You catch %s's attack, and hit back", " catches %s, and counters" - ], - "description" : "Counterattack on block, min 5 unarmed" + ] },{ "type" : "technique", "id" : "tec_brawl_trip", @@ -1314,8 +1233,7 @@ "messages" : [ "You trip %s", " trips %s" - ], - "description" : "Down 2 turns, min 5 unarmed" + ] },{ "type" : "technique", "id" : "niten_water_cut", @@ -1329,8 +1247,7 @@ "messages" : [ "You strike %s with the slow power of flowing water", " strikes %s with the slow power of flowing water" - ], - "description" : "175% moves, x2 bash damage, x2 cut damage, min 4 melee" + ] },{ "type" : "technique", "id" : "niten_red_leaf", @@ -1340,8 +1257,7 @@ "messages" : [ "Your strike knocks %s off balance", "'s strike knocks %s off balance" - ], - "description" : "Down 2 turns, min 5 melee" + ] },{ "type" : "technique", "id" : "niten_stone_cut", @@ -1356,8 +1272,7 @@ "You stun %s with the force of the blow", " stuns %s with the force of the blow" ], - "stun_dur" : 2, - "description" : "Stun 2 turns, x1.5 bash damage, x1.5 cut damage, crit only, min 6 melee" + "stun_dur" : 2 },{ "type" : "technique", "id" : "niten_timing_attack", @@ -1377,8 +1292,7 @@ ["damage", "cut", 1.5] ], "//" : "Minimum effective time for a status in combat is two turns, as you have one deducted on the same turn its applied.", - "stun_dur" : 2, - "description" : "50% moves, x1.5 bash damage, x1.5 cut damage, stun 2 turns, min 5 melee" + "stun_dur" : 2 },{ "type" : "technique", "id" : "niten_feint", @@ -1391,8 +1305,7 @@ "messages" : [ "You feint at %s", " feints at %s" - ], - "description" : "80% moves, free recovery from a miss, min 2 melee" + ] },{ "type" : "technique", "id" : "tec_debug_slow", diff --git a/data/mods/Medieval_Stuff/armor.json b/data/mods/Medieval_Stuff/armor.json index ee1fa3f2d2534..7ce0a544aaf3d 100644 --- a/data/mods/Medieval_Stuff/armor.json +++ b/data/mods/Medieval_Stuff/armor.json @@ -88,6 +88,7 @@ "id": "armor_cuirass", "type": "ARMOR", "name": "bell cuirass", + "category": "armor", "name_plural": "bell cuirasses", "description": "An ancient Greek breastplate, made of bronze.", "weight": 5896, diff --git a/data/mods/Medieval_Stuff/shields.json b/data/mods/Medieval_Stuff/shields.json index 600ccaccae7a1..6c2352c36a024 100644 --- a/data/mods/Medieval_Stuff/shields.json +++ b/data/mods/Medieval_Stuff/shields.json @@ -3,6 +3,7 @@ "id": "shield_wooden", "type": "ARMOR", "name": "wooden shield", + "category": "armor", "description": "A crude wooden shield, lacking any metal or leather reinforcement. Lightweight but not very tough.", "weight": 2267, "volume": 15, @@ -23,6 +24,7 @@ "id": "shield_wooden_large", "type": "ARMOR", "name": "large wooden shield", + "category": "armor", "description": "An ancient style of wooden shield, lacking any metal or leather reinforcement. Bulky, but offers a decent amount of protection.", "weight": 3828, "volume": 20, @@ -43,6 +45,7 @@ "id": "shield_heater", "type": "ARMOR", "name": "heater shield", + "category": "armor", "//": "Doesn't use leather in material because it's not meant to be sewn up", "description": "A medieval style of shield made of wood overlaid with leather, developed from the longer kite shield. Mainly used in tournaments, but still viable in battle.", "weight": 3175, @@ -63,6 +66,7 @@ "id": "shield_kite", "type": "ARMOR", "name": "kite shield", + "category": "armor", "//": "Doesn't use leather in material because it's not meant to be sewn up", "description": "A classic medieval style of shield, made of wood overlaid with leather, in an elongated teardrop shape. Affords decent protection, but was better suited for cavalry.", "weight": 3628, @@ -84,6 +88,7 @@ "id": "shield_round", "type": "ARMOR", "name": "round shield", + "category": "armor", "description": "A simple round shield made of wood, with a rim and boss of iron. Made infamous by the Vikings.", "weight": 3400, "volume": 16, @@ -103,6 +108,7 @@ "id": "shield_hoplon", "type": "ARMOR", "name": "hoplon", + "category": "armor", "description": "A convex round shield from ancient Greece, made of wood reinforced with bronze. Heavy but effective.", "weight": 4082, "volume": 18, @@ -124,6 +130,7 @@ "type": "ARMOR", "name": "scutum", "name_plural": "scuta", + "category": "armor", "description": "A rectangular shield from ancient Rome, made of wood and iron. Perfect for fighting in formation, but not ideal for facing zombies alone.", "weight": 4535, "volume": 22, @@ -144,6 +151,7 @@ "id": "shield_buckler", "type": "ARMOR", "name": "buckler", + "category": "armor", "description": "A small metal shield from the late medieval and renaissance periods. Extremely light and tough, but its small size is as much a hindrance as it is an advantage.", "weight": 1814, "volume": 10, diff --git a/data/mods/More_Locations/factory/factory_be_gate_01.json b/data/mods/More_Locations/factory/factory_be_gate_01.json index 32007695eee59..e2c182af5afa6 100644 --- a/data/mods/More_Locations/factory/factory_be_gate_01.json +++ b/data/mods/More_Locations/factory/factory_be_gate_01.json @@ -18,7 +18,7 @@ "....... .......", "....... .......", "....... .......", - "....... .......", + "H...... ......H", "==..... .....==", "------1 1------", "-----|| ||-----", @@ -40,6 +40,11 @@ "t": { "monster": "mon_turret" }, "Z": { "monster": "mon_secubot" }, "z": { "monster": "mon_skitterbot" } + }, + "mapping": { + "H": { + "item": { "item": "chem_zinc_powder", "count": 50 } + } } } } diff --git a/data/mods/More_Survival_Tools/ammo.json b/data/mods/More_Survival_Tools/ammo.json index 4859d6e84a8f6..6f1252a361f43 100644 --- a/data/mods/More_Survival_Tools/ammo.json +++ b/data/mods/More_Survival_Tools/ammo.json @@ -2,7 +2,7 @@ { "id": "tinder", "type": "AMMO", - "category": "other", + "category": "spare_parts", "name": "tinder", "name_plural": "tinder", "description": "Flammable material, finely divided for easy combustion.", diff --git a/data/mods/More_Survival_Tools/items.json b/data/mods/More_Survival_Tools/items.json index d82822329f5fa..a9b5d9447c2d9 100644 --- a/data/mods/More_Survival_Tools/items.json +++ b/data/mods/More_Survival_Tools/items.json @@ -519,7 +519,7 @@ { "id": "canteen_wood", "type": "CONTAINER", - "category": "other", + "category": "clothing", "name": "wooden canteen", "description": "A water canteen made from wood, secured by metal bands and sealed with wax or pitch. Holds 1.5 liters and has a simple carry strap.", "weight": 232, diff --git a/data/mods/more_classes_scenarios/cs_classes.json b/data/mods/more_classes_scenarios/cs_classes.json index ad5a9b0164e48..6c4af7041682e 100644 --- a/data/mods/more_classes_scenarios/cs_classes.json +++ b/data/mods/more_classes_scenarios/cs_classes.json @@ -1,565 +1,429 @@ [ - { - "type": "profession", - "ident": "bio_specops", - "name": "Bionic Spec-Op", - "description": "Once bionic augmentation proved safe, you were choosen for a top secret soldier augmentation program. As if being a top-tier special forces operator before the procedure wasn't enough, your new enhancememts allow you to handle any combat scenario be it human or not.", - "points": 12, - "CBMs":[ - "bio_targeting", - "bio_purifier", - "bio_carbon", - "bio_shock", - "bio_adrenaline", - "bio_night_vision", - "bio_ups", - "bio_nanobots", - "bio_painkiller", - "bio_metabolics", - "bio_power_storage_mkII" + { + "type": "profession", + "ident": "bio_specops", + "name": "Bionic Spec-Op", + "description": "Once bionic augmentation proved safe, you were choosen for a top secret soldier augmentation program. As if being a top-tier special forces operator before the procedure wasn't enough, your new enhancememts allow you to handle any combat scenario be it human or not.", + "points": 12, + "CBMs": [ + "bio_targeting", + "bio_purifier", + "bio_carbon", + "bio_shock", + "bio_adrenaline", + "bio_night_vision", + "bio_ups", + "bio_nanobots", + "bio_painkiller", + "bio_torsionratchet", + "bio_power_storage_mkII" + ], + "skills": [ + { "level": 3, "name": "gun" }, + { "level": 3, "name": "rifle" }, + { "level": 2, "name": "pistol" }, + { "level": 2, "name": "melee" }, + { "level": 2, "name": "stabbing" }, + { "level": 2, "name": "dodge" } + ], + "items": { + "both": { + "items": [ + "balclava", + "army_top", + "arm_warmers", + "gloves_liner", + "leg_warmers", + "socks", + "beret", + "gloves_tactical", + "pants_army", + "boots_combat", + "jacket_army" ], - "skills": [ - { - "level": 3, - "name": "gun" - }, - { - "level": 3, - "name": "rifle" - }, - { - "level": 2, - "name": "pistol" - }, - { - "level": 2, - "name": "melee" - }, - { - "level": 2, - "name": "stabbing" - }, - { - "level": 2, - "name": "dodge" - } - ], - "items": { - "both": { - "items": [ - "balclava", - "army_top", - "arm_warmers", - "gloves_liner", - "leg_warmers", - "socks", - "beret", - "gloves_tactical", - "pants_army", - "boots_combat", - "jacket_army" - ], - "entries": [ - { "item": "knife_combat", "container-item": "sheath" }, - { "item": "v29", "container-item": "sholster" }, - { "item": "rm51_assault_rifle", "ammo-item": "8mm_fmj", "charges": 50, "contents-item": "shoulder_strap" }, - { "item": "8mm_fmj", "charges": 50 } - ] - }, - "male": [ - "boxer_shorts" - ], - "female": [ - "sports_bra", - "boxer_shorts" - ] - }, - "flags" : ["SCEN_ONLY"] - }, - { - "type" : "profession", - "ident": "wasteland_cyborg", - "name": "Wasteland Cyborg", - "description": "After months of reading, experimentation, severe injuries, and countless supply raids you emerge a self-made cyborg with the some of the best crafted weapons and armor in the wasteland.", - "points": 8, - "CBMs":[ - "bio_flashlight", - "bio_tools", - "bio_ups", - "bio_sunglasses", - "bio_ears", - "bio_carbon", - "bio_targeting", - "bio_metabolics", - "bio_power_storage_mkII", - "bio_power_storage_mkII" - ], - "skills": [ - { - "level": 6, - "name": "fabrication" - }, - { - "level": 5, - "name": "mechanics" - }, - { - "level": 5, - "name": "electronics" - }, - { - "level": 4, - "name": "firstaid" - }, - { - "level": 5, - "name": "tailor" - }, - { - "level" : 2, - "name" : "gun" - }, - { - "level": 2, - "name": "rifle" - }, - { - "level" : 2, - "name" : "melee" - }, - { - "level": 2, - "name": "bashing" - } - ], - "items": { - "both": [ - "socks", - "hood_lsurvivor", - "mask_lsurvivor", - "lsurvivor_suit", - "chestpouch", - "survivor_vest", - "gloves_lsurvivor", - "legpouch_large", - "legpouch_large", - "boots_lsurvivor", - "shoulder_strap", - "coilgun", - "nailmag", - "nailmag", - "nailmag", - "nailmag", - "combatnail", - "combatnail", - "shocktonfa_off", - "battery_ups" - ], - "male": [ - "boxer_shorts" - ], - "female": [ - "bra", - "panties" - ] - }, - "flags" : ["SCEN_ONLY"] - }, - { - "type": "profession", - "ident": "seasoned_tourist", - "name": "Seasoned Tourist", - "description": "Due to your thirst for adventure, hunger for good food, and disposable income, you have been able to travel extensively. You've traveled here to get a taste of New England; now you hope New England won't get a taste of you!", - "points": 5, - "skills": [ - { - "level": 3, - "name": "speech" - }, - { - "level": 2, - "name": "barter" - }, - { - "level": 2, - "name": "cooking" - }, - { - "level": 1, - "name": "firstaid" - } - ], - "items": { - "both": [ - "knit_scarf", - "undershirt", - "dress_shirt", - "jacket_light", - "gloves_light", - "pants", - "fanny", - "socks", - "sneakers", - "roadmap", - "restaurantmap", - "shavingkit", - "mess_kit", - "aluminum_foil", - "cell_phone", - "can_chowder", - "apple_cider", - "fruit_leather", - "suitcase_m" - ], - "male": [ - "boxer_shorts" - ], - "female": [ - "bra", - "panties" - ] - } - }, - { - "type" : "profession", - "ident": "trans_human", - "name": "Post-Human Cyborg", - "description": "As a wealthy trans-humanist you decided to put yourself on the frontline of augmentative technology to bring forth the future. You are now a walking example of what humanity could have become.", - "points": 8, - "CBMs":[ - "bio_str_enhancer", - "bio_dex_enhancer", - "bio_int_enhancer", - "bio_eye_enhancer", - "bio_speed", - "bio_eye_optic", - "bio_sunglasses", - "bio_ears", - "bio_digestion", - "bio_recycler", - "bio_purifier" - ], - "items": { - "both": [ - "hat_knit", - "tshirt", - "jacket_light", - "knit_scarf", - "gloves_light", - "boots" - ], - "male": [ - "briefs", - "socks", - "pants" - ], - "female": [ - "bra", - "panties", - "stockings", - "skirt" - ] - } - }, - { - "type": "profession", - "ident": "janitor", - "name": "Janitor", - "description": "You earned a living from sweeping up chocolate wrappers and picking chewing gum from under tables. Now the only thing you'll be sweeping are the brains of the dead.", - "points": -1, - "items": { - "both": [ - "jumpsuit", - "socks", - "boots", - "mop" - ], - "male": [ - "boxer_shorts" - ], - "female": [ - "bra", - "boxer_shorts" - ] - } - }, - { - "type": "profession", - "ident": "poor_student", - "name": "Poor Student", - "description": "You come from a low-income family, and got mocked for your old hand-me-down clothes and for getting free school lunches in the cafeteria. Even worse, your ratty old backpack finally fell apart at the worst time. At least no one's mocking you now.", - "points": -1, - "items": { - "both": [ - "tshirt", - "socks", - "lowtops", - "shorts" - ], - "male": [ - "briefs" - ], - "female": [ - "panties" - ] - } - }, - { - "type": "profession", - "ident": "elementary_student", - "name": "Elementary Student", - "description": "You're just a kid, and now the world has turned into something out of one of your bad dreams. The grown-ups you relied on are all dead--or undead--now. What are you going to do?", - "points": 0, - "items": { - "both": [ - "tshirt", - "socks", - "slingpack", - "sneakers", - "jeans", - "jacket_light", - "knit_scarf", - "juice", - "sandwich_pbj", - "fairy_tales" - ], - "male": [ - "briefs" - ], - "female": [ - "panties" - ] - } - }, - { - "type": "profession", - "ident": "goalie", - "name": "Hockey Player", - "description": "You were a minor-league hockey goalie before the rest of your team became zombies. It's just you and your hockey equipment versus the undead, but at least you can cross-check them now.", - "points": 0, - "traits": [ - "PROF_SKATER" - ], - "items": { - "both": [ - "mask_hockey", - "hockey_stick", - "jersey", - "pants", - "socks", - "sneakers", - "mouthpiece", - "puck" - ], - "male": [ - "briefs" - ], - "female": [ - "sports_bra", - "panties" - ] - } - }, - { - "type": "profession", - "ident": "batter", - "name": "Baseball Player", - "description": "You were a batter on a local minor league team before the cataclysm. You escaped with your equipment, but how long can you survive until your innings are up?", - "points": 0, - "skills": [ - { - "level": 1, - "name": "bashing" - } - ], - "items": { - "both": [ - "bat", - "helmet_ball", - "dress_shirt", - "pants", - "socks", - "cleats", - "mouthpiece", - "baseball" - ], - "male": [ - "briefs" - ], - "female": [ - "sports_bra", - "panties" - ] - } - }, - { - "type": "profession", - "ident": "linebacker", - "name": "Football Player", - "description": "You were the star player for the local football team, adored by teammates and fans alike. Now they just adore your brain. You've still got your bulky football gear on.", - "points": 0, - "skills": [ - { - "level": 2, - "name": "dodge" - } - ], - "items": { - "both": [ - "football_armor", - "tank_top", - "helmet_football", - "pants", - "socks", - "cleats", - "mouthpiece", - "football", - "sports_drink" - ], - "male": [ - "briefs" - ], - "female": [ - "sports_bra", - "panties" - ] - } - }, - { - "type": "profession", - "ident": "golfer", - "name": "Golfer", - "description": "A birdie is one under par, but how much is a zombie? Your clubhouse was overrun by the undead, and you fled with your trusty driving wedge.", - "points": 0, - "items": { - "both": [ - "hat_ball", - "dress_shirt", - "pants", - "socks", - "sneakers", - "golf_club" - ], - "male": [ - "briefs" - ], - "female": [ - "sports_bra", - "panties" - ] - } - }, - { - "type": "profession", - "ident": "prep_student", - "name": "Preppy Student", - "description": "Your parents were busy, important people, who wanted you to have every advantage and pushed you to be \"successful,\" whatever that meant. If only they'd ever let you experience childhood, or ever shown you their love. You're certainly not getting either one now.", - "points": 1, - "skills": [ - { - "level": 1, - "name": "speech" - } + "entries": [ + { "item": "knife_combat", "container-item": "sheath" }, + { "item": "v29", "container-item": "sholster" }, + { "item": "rm51_assault_rifle", "ammo-item": "8mm_fmj", "charges": 50, "contents-item": "shoulder_strap" }, + { "item": "8mm_fmj", "charges": 50 } + ] + }, + "male": [ "boxer_shorts" ], + "female": [ "sports_bra", "boxer_shorts" ] + } + }, + { + "type": "profession", + "ident": "wasteland_cyborg", + "name": "Wasteland Cyborg", + "description": "After months of reading, experimentation, severe injuries, and countless supply raids you emerge a self-made cyborg with the some of the best crafted weapons and armor in the wasteland.", + "points": 8, + "CBMs": [ + "bio_flashlight", + "bio_tools", + "bio_ups", + "bio_sunglasses", + "bio_ears", + "bio_carbon", + "bio_targeting", + "bio_metabolics", + "bio_power_storage_mkII", + "bio_power_storage_mkII" + ], + "skills": [ + { "level": 3, "name": "fabrication" }, + { "level": 3, "name": "mechanics" }, + { "level": 3, "name": "electronics" }, + { "level": 3, "name": "firstaid" }, + { "level": 3, "name": "tailor" }, + { "level": 3, "name": "gun" }, + { "level": 3, "name": "rifle" }, + { "level": 3, "name": "melee" }, + { "level": 3, "name": "bashing" } + ], + "items": { + "both": { + "items": [ + "socks", + "hood_lsurvivor", + "mask_lsurvivor", + "lsurvivor_suit", + "chestpouch", + "survivor_vest", + "gloves_lsurvivor", + "legpouch_large", + "legpouch_large", + "boots_lsurvivor" ], - "items": { - "both": [ - "dress_shirt", - "jacket_light", - "pants", - "socks", - "dress_shoes", - "skinny_tie", - "tieclip", - "fancy_sunglasses", - "knit_scarf", - "wristwatch", - "mbag", - "water_mineral", - "cell_phone", - "money_bundle", - "adderall", - "manual_business" - ], - "male": [ - "briefs" - ], - "female": [ - "panties" - ] - } + "entries": [ + { "item": "shocktonfa_off", "contents-item": "battery_ups" }, + { "item": "coilgun", "ammo-item": "combatnail", "charges": 50, "contents-item": "shoulder_strap" }, + { "item": "nailmag", "ammo-item": "combatnail", "charges": 50 } + ] + }, + "male": [ "boxer_shorts" ], + "female": [ "bra", "panties" ] }, - { - "type": "profession", - "ident": "bio_gangster", - "name": "Bionic Gangster", - "description": "You were the boss' favorite, their protege; they always counted on you to get the toughtest jobs done. Seeing your potential, they invested in \"basic\" augments and the best gear on the market to better aid you in your job. After enjoying some period of freedom to do as you wanted, now you find yourself needing those skills to survive. ", - "points": 8, - "CBMs":[ - "bio_targeting", - "bio_sunglasses", - "bio_ears", - "bio_carbon", - "bio_blade", - "bio_shock", - "bio_night_vision", - "bio_torsionratchet", - "bio_power_storage_mkII" - ], - "skills": [ - { - "level": 3, - "name": "melee" - }, - { - "level": 3, - "name": "gun" - }, - { - "level": 2, - "name": "unarmed" - }, - { - "level": 2, - "name": "stabbing" - }, - { - "level": 2, - "name": "cutting" - }, - { - "level": 2, - "name": "pistol" - }, - { - "level": 1, - "name": "driving" - } - ], - "items": { - "both": { - "items": [ - "socks", - "bowhat", - "suit", - "dress_shoes", - "knit_scarf", - "cigar", - "mag_porn" - ], - "entries": [ - { "item": "rm103a_pistol", "ammo-item": "8mm_caseless", "container-item": "sholster", "charges": 25 }, - { "item": "8x40_10_mag", "ammo-item": "8mm_caseless", "charges": 10 }, - { "item": "8x40_10_mag", "ammo-item": "8mm_caseless", "charges": 10 }, - { "item": "ref_lighter", "charges": 100 } - ] - }, - "male": [ - "boxer_shorts" - ], - "female": [ - "bra", - "panties" - ] - } + "flags": [ "SCEN_ONLY" ] + }, + { + "type": "profession", + "ident": "seasoned_tourist", + "name": "Seasoned Tourist", + "description": "Due to your thirst for adventure, hunger for good food, and disposable income, you have been able to travel extensively. You've traveled here to get a taste of New England; now you hope New England won't get a taste of you!", + "points": 5, + "skills": [ + { "level": 3, "name": "speech" }, + { "level": 2, "name": "barter" }, + { "level": 2, "name": "cooking" }, + { "level": 1, "name": "firstaid" } + ], + "items": { + "both": [ + "knit_scarf", + "undershirt", + "dress_shirt", + "jacket_light", + "gloves_light", + "pants", + "fanny", + "socks", + "sneakers", + "roadmap", + "restaurantmap", + "shavingkit", + "mess_kit", + "aluminum_foil", + "cell_phone", + "can_chowder", + "apple_cider", + "fruit_leather", + "suitcase_m" + ], + "male": [ "boxer_shorts" ], + "female": [ "bra", "panties" ] + } + }, + { + "type": "profession", + "ident": "trans_human", + "name": "Post-Human Cyborg", + "description": "As a wealthy trans-humanist you decided to put yourself on the frontline of augmentative technology to bring forth the future. You are now a walking example of what humanity could have become.", + "points": 8, + "CBMs": [ + "bio_str_enhancer", + "bio_dex_enhancer", + "bio_int_enhancer", + "bio_eye_enhancer", + "bio_speed", + "bio_eye_optic", + "bio_sunglasses", + "bio_ears", + "bio_digestion", + "bio_recycler", + "bio_purifier" + ], + "items": { + "both": [ "hat_knit", "tshirt", "jacket_light", "knit_scarf", "gloves_light", "boots" ], + "male": [ "briefs", "socks", "pants" ], + "female": [ "bra", "panties", "stockings", "skirt" ] + } + }, + { + "type": "profession", + "ident": "janitor", + "name": "Janitor", + "description": "You earned a living from sweeping up chocolate wrappers and picking chewing gum from under tables. Now the only thing you'll be sweeping are the brains of the dead.", + "points": -1, + "items": { "both": [ "jumpsuit", "socks", "boots", "mop" ], "male": [ "boxer_shorts" ], "female": [ "bra", "boxer_shorts" ] } + }, + { + "type": "profession", + "ident": "poor_student", + "name": "Poor Student", + "description": "You come from a low-income family, and got mocked for your old hand-me-down clothes and for getting free school lunches in the cafeteria. Even worse, your ratty old backpack finally fell apart at the worst time. At least no one's mocking you now.", + "points": -1, + "items": { "both": [ "tshirt", "socks", "lowtops", "shorts" ], "male": [ "briefs" ], "female": [ "panties" ] } + }, + { + "type": "profession", + "ident": "elementary_student", + "name": "Elementary Student", + "description": "You're just a kid, and now the world has turned into something out of one of your bad dreams. The grown-ups you relied on are all dead--or undead--now. What are you going to do?", + "points": 0, + "items": { + "both": [ + "tshirt", + "socks", + "slingpack", + "sneakers", + "jeans", + "jacket_light", + "knit_scarf", + "juice", + "sandwich_pbj", + "fairy_tales" + ], + "male": [ "briefs" ], + "female": [ "panties" ] + } + }, + { + "type": "profession", + "ident": "goalie", + "name": "Hockey Player", + "description": "You were a minor-league hockey goalie before the rest of your team became zombies. It's just you and your hockey equipment versus the undead, but at least you can cross-check them now.", + "points": 0, + "traits": [ "PROF_SKATER" ], + "items": { + "both": [ "mask_hockey", "hockey_stick", "jersey", "pants", "socks", "sneakers", "mouthpiece", "puck" ], + "male": [ "briefs" ], + "female": [ "sports_bra", "panties" ] + } + }, + { + "type": "profession", + "ident": "batter", + "name": "Baseball Player", + "description": "You were a batter on a local minor league team before the cataclysm. You escaped with your equipment, but how long can you survive until your innings are up?", + "points": 0, + "skills": [ { "level": 1, "name": "bashing" } ], + "items": { + "both": [ "bat", "helmet_ball", "dress_shirt", "pants", "socks", "cleats", "mouthpiece", "baseball" ], + "male": [ "briefs" ], + "female": [ "sports_bra", "panties" ] + } + }, + { + "type": "profession", + "ident": "linebacker", + "name": "Football Player", + "description": "You were the star player for the local football team, adored by teammates and fans alike. Now they just adore your brain. You've still got your bulky football gear on.", + "points": 0, + "skills": [ { "level": 2, "name": "dodge" } ], + "items": { + "both": [ + "football_armor", + "tank_top", + "helmet_football", + "pants", + "socks", + "cleats", + "mouthpiece", + "football", + "sports_drink" + ], + "male": [ "briefs" ], + "female": [ "sports_bra", "panties" ] + } + }, + { + "type": "profession", + "ident": "golfer", + "name": "Golfer", + "description": "A birdie is one under par, but how much is a zombie? Your clubhouse was overrun by the undead, and you fled with your trusty driving wedge.", + "points": 0, + "items": { + "both": [ "hat_ball", "dress_shirt", "pants", "socks", "sneakers", "golf_club" ], + "male": [ "briefs" ], + "female": [ "sports_bra", "panties" ] + } + }, + { + "type": "profession", + "ident": "prep_student", + "name": "Preppy Student", + "description": "Your parents were busy, important people, who wanted you to have every advantage and pushed you to be \"successful,\" whatever that meant. If only they'd ever let you experience childhood, or ever shown you their love. You're certainly not getting either one now.", + "points": 1, + "skills": [ { "level": 1, "name": "speech" } ], + "items": { + "both": [ + "dress_shirt", + "jacket_light", + "pants", + "socks", + "dress_shoes", + "skinny_tie", + "tieclip", + "fancy_sunglasses", + "knit_scarf", + "wristwatch", + "mbag", + "water_mineral", + "cell_phone", + "money_bundle", + "adderall", + "manual_business" + ], + "male": [ "briefs" ], + "female": [ "panties" ] + } + }, + { + "type": "profession", + "ident": "bio_gangster", + "name": "Bionic Gangster", + "description": "You were the boss' favorite, their protege; they always counted on you to get the toughtest jobs done. Seeing your potential, they invested in \"basic\" augments and the best gear on the market to better aid you in your job. After enjoying some period of freedom to do as you wanted, now you find yourself needing those skills to survive. ", + "points": 10, + "CBMs": [ + "bio_targeting", + "bio_sunglasses", + "bio_ears", + "bio_carbon", + "bio_blade", + "bio_shock", + "bio_night_vision", + "bio_torsionratchet", + "bio_power_storage_mkII" + ], + "skills": [ + { "level": 3, "name": "melee" }, + { "level": 3, "name": "unarmed" }, + { "level": 3, "name": "gun" }, + { "level": 3, "name": "smg" }, + { "level": 2, "name": "pistol" }, + { "level": 2, "name": "stabbing" }, + { "level": 2, "name": "cutting" }, + { "level": 1, "name": "driving" } + ], + "items": { + "both": { + "items": [ "socks", "bowhat", "suit", "dress_shoes", "knit_scarf", "cigar", "mag_porn" ], + "entries": [ + { "item": "glock_19", "ammo-item": "9mm", "container-item": "sholster", "charges": 15 }, + { "item": "glockmag", "ammo-item": "9mm", "charges": 15 }, + { "item": "tommygun", "ammo-item": "45_acp", "container-item": "shoulder_strap", "charges": 30 }, + { "item": "thompson_bigmag", "ammo-item": "45_acp", "charges": 30 }, + { "item": "ref_lighter", "charges": 100 } + ] + }, + "male": [ "boxer_shorts" ], + "female": [ "bra", "panties" ] + } + }, + { + "type": "profession", + "ident": "waken", + "name": "Awakened", + "description": "You were awoken in the middle of the night by a noise. Armed only with a flashlight you went to investigate, now you face the cataclysm.", + "points": 0, + "items": { + "both": [ "slippers", "flashlight" ], + "male": [ "boxer_shorts", "socks", "house_coat" ], + "female": [ "bra", "panties", "stockings", "gown" ] + } + }, + { + "type": "profession", + "ident": "bio_cyclist", + "name": "Bionic Cyclist", + "description": "Your training and augmentation for the Cyber-Olympics cycling competition gave you an edge on escaping the start of the cataclysm. Can you keep on running from it forever?", + "points": 6, + "CBMs": [ "bio_str_enhancer", "bio_adrenaline", "bio_hydraulics", "bio_metabolics", "bio_power_storage_mkII" ], + "skills": [ { "level": 3, "name": "driving" }, { "level": 2, "name": "dodge" } ], + "items": { + "both": [ + "helmet_bike", + "folding_bicycle", + "under_armor_shorts", + "under_armor", + "socks", + "sneakers", + "protein_drink", + "fanny", + "fancy_sunglasses" + ], + "male": [ "briefs" ], + "female": [ "panties", "sports_bra" ] + } + }, + { + "type": "profession", + "ident": "welder", + "name": "Welder", + "description": "You worked as a welder for an off shore company before the cataclysm. You were on your way back home when it struck. At least you got the tools of your craft.", + "points": 4, + "skills": [ { "level": 1, "name": "mechanics" } ], + "items": { + "both": [ + "socks", + "wearable_light", + "goggles_welding", + "jumpsuit", + "gloves_work", + "boots_steel", + "tool_belt", + "apron_leather", + "oxy_torch", + "tinyweldtank" + ], + "male": [ "boxer_shorts" ], + "female": [ "bra", "boxer_shorts" ] + } + }, + { + "type": "profession", + "ident": "pri-sur", + "name": "Primitive Survivalist", + "description": "You knew the day would come, the day it all went to shit. You prepared yourself, not by gear but sheer skill; all those days in the woods paid off. If your ancestors survived with no tech, you'll be damned if you dont't", + "points": 6, + "skills": [ + { "level": 5, "name": "survival" }, + { "level": 3, "name": "archery" }, + { "level": 3, "name": "gun" }, + { "level": 3, "name": "fabrication" }, + { "level": 3, "name": "cooking" }, + { "level": 2, "name": "unarmed" }, + { "level": 2, "name": "melee" }, + { "level": 2, "name": "tailor" }, + { "level": 2, "name": "firstaid" }, + { "level": 1, "name": "mechanics" }, + { "level": 1, "name": "swimming" } + ], + "items": { + "both": [ "jeans", "longshirt", "socks", "coat_winter", "boots_winter", "knit_scarf", "pockknife", "water_clean", "matches" ], + "male": [ "boxer_shorts" ], + "female": [ "bra", "panties" ] } + } ] diff --git a/data/mods/more_classes_scenarios/cs_scenarios.json b/data/mods/more_classes_scenarios/cs_scenarios.json index 65ae8a9256703..1ce5466d69eb5 100644 --- a/data/mods/more_classes_scenarios/cs_scenarios.json +++ b/data/mods/more_classes_scenarios/cs_scenarios.json @@ -1,25 +1,60 @@ [ + { + "type": "scenario", + "name": "Bunker Evacuee", + "description": "You had connections, or intel somehow..., and because of it, you found this LMOE Shelter. It's summer now and you somehow survived, now things get a little bit easier.", + "flags": [ "SUR_START", "SUM_START" ], + "ident": "bunker", + "points": 2, + "start_name": "LMOE Shelter", + "allowed_locs": [ "lmoe" ], + "professions": [ + "senior", + "hacker", + "lawyer", + "labtech", + "bionic_spy", + "soldier", + "national_guard", + "specops", + "bio_soldier", + "bio_sniper", + "bio_specops" + ] + }, { "type": "scenario", "ident": "fema_help", "name": "Challenge-FEMA Death Camp", - "points" : -6, + "points": -6, "description": "You were one of the many law enforcement and military personnel alike called in to keep order on one of the FEMA camps, it all went to shit fast...wounded, infected, surrounded by fire you lay...and they just keep coming...", - "allowed_locs": ["fema_entrance_s","fema_s"], - "professions" : ["cop","sniper_police","riot_police","bionic_cop","swat","swat_heavy","soldier","bio_soldier","bio_sniper","bio_specops","specops"], + "allowed_locs": [ "fema_entrance_s", "fema_s" ], + "professions": [ + "cop", + "sniper_police", + "riot_police", + "bionic_cop", + "swat", + "swat_heavy", + "soldier", + "bio_soldier", + "bio_sniper", + "bio_specops", + "specops" + ], "start_name": "Fema Camp", - "flags": ["HELI_CRASH","SUR_START","FIRE_START","INFECTED","CHALLENGE"] + "flags": [ "HELI_CRASH", "SUR_START", "FIRE_START", "INFECTED", "CHALLENGE" ] }, { - "type" : "scenario", - "ident" : "mansion_scen", - "name" : "Mansion Holdout", - "points" : -1, - "description" : "While the world ended, you felt relatively safe inside the mansion you have serviced for years. Now the dead have come knocking at your doorstep, it might be time to leave", - "allowed_locs" : ["mansion_e2_s", "mansion_+2_s"], - "professions" : ["maid"], - "start_name" : "Mansion", - "flags" : ["SUR_START"] + "type": "scenario", + "ident": "mansion_scen", + "name": "Mansion Holdout", + "points": -1, + "description": "While the world ended, you felt relatively safe inside the mansion you have serviced for years. Now the dead have come knocking at your doorstep, it might be time to leave", + "allowed_locs": [ "mansion_e2_s", "mansion_+2_s" ], + "professions": [ "maid" ], + "start_name": "Mansion", + "flags": [ "SUR_START" ] }, { "type": "scenario", @@ -27,51 +62,87 @@ "name": "The Last Gig", "points": -6, "description": "You were on your way to another routine job, it might of been a target to kill, an item to steal or intel to gather. Whatever it was doesn't matter anymore; you did your best to avoid the horde and when you arrive, the place is surrounded, not by cops as you might expected, but by the dead. Worse, you got a cut somewhere along the way and it's looking infected.", - "allowed_locs": ["house","bank","pawn","s_gun","s_gas_s"], - "professions": ["convict", "scoundrel", "gangster", "burglar", "bionic_thief", "razorgirl", "bionic_hitman", "bio_gangster"], + "allowed_locs": [ "house", "bank", "pawn", "s_gun", "s_gas_s" ], + "professions": [ "convict", "scoundrel", "gangster", "burglar", "bionic_thief", "razorgirl", "bionic_hitman", "bio_gangster" ], "start_name": "Intended Crime Scene", - "flags": ["SUR_START","INFECTED"] + "flags": [ "SUR_START", "INFECTED" ] }, { - "type" : "scenario", - "ident" : "summer_advanced_start", - "copy-from" : "summer_advanced_start", - "extend": { "professions" : [ "wasteland_cyborg" ] } + "type": "scenario", + "ident": "summer_advanced_start", + "copy-from": "summer_advanced_start", + "extend": { "professions": [ "wasteland_cyborg" ] } }, { - "type" : "scenario", - "ident" : "ambushed", - "copy-from" : "ambushed", - "extend": { "professions" : [ "wasteland_cyborg" ] } + "type": "scenario", + "ident": "ambushed", + "copy-from": "ambushed", + "extend": { "professions": [ "wasteland_cyborg" ] } }, { - "type" : "scenario", - "ident" : "heli_crash", - "copy-from" : "heli_crash", - "extend": { "professions" : [ "bio_specops" ] } + "type": "scenario", + "ident": "heli_crash", + "copy-from": "heli_crash", + "extend": { "professions": [ "bio_specops" ] } }, { - "type" : "scenario", + "type": "scenario", "ident": "lab_chal", - "copy-from" : "lab_chal", - "extend": { "professions" : [ "cykotic" ] } + "copy-from": "lab_chal", + "extend": { "professions": [ "cykotic" ] } }, { - "type" : "scenario", - "ident" : "mutant", - "copy-from" : "mutant", - "extend": { "professions" : [ "cykotic" ] } + "type": "scenario", + "ident": "mutant", + "copy-from": "mutant", + "extend": { "professions": [ "cykotic" ] } }, { "type": "scenario", "ident": "schools_out", - "copy-from" : "schools_out", - "extend": { "professions" : ["elementary_student", "prep_student", "janitor", "poor_student"] } + "copy-from": "schools_out", + "extend": { "professions": [ "elementary_student", "prep_student", "janitor", "poor_student" ] } }, { "type": "scenario", "ident": "cyberpunk", - "copy-from" : "cyberpunk", - "extend": { "professions" : ["bionic_thief", "bionic_hitman", "bio_gangster"] } + "copy-from": "cyberpunk", + "extend": { "professions": [ "bionic_thief", "bionic_hitman", "bio_gangster" ] } + }, + { + "type": "scenario", + "ident": "wilderness", + "copy-from": "wilderness", + "extend": { "professions": [ "pri-sur" ] } + }, + { + "type": "scenario", + "ident": "infected", + "copy-from": "infected", + "extend": { "allowed_locs": [ "s_electronics_s", "s_clothes_s" ] } + }, + { + "type": "scenario", + "ident": "fire", + "copy-from": "fire", + "extend": { "allowed_locs": [ "s_electronics_s", "s_clothes_s" ] } + }, + { + "type": "scenario", + "ident": "missed", + "copy-from": "missed", + "extend": { "allowed_locs": [ "s_electronics_s", "s_clothes_s" ] } + }, + { + "type": "scenario", + "ident": "mutant", + "copy-from": "mutant", + "extend": { "professions": [ "faulty_bionic" ] } + }, + { + "type": "scenario", + "ident": "bad_day", + "copy-from": "bad_day", + "extend": { "professions": [ "faulty_bionic", "cykotic" ] } } ] diff --git a/data/mods/more_classes_scenarios/cs_start_locations.json b/data/mods/more_classes_scenarios/cs_start_locations.json index e551c29fb5c84..18690d445dd56 100644 --- a/data/mods/more_classes_scenarios/cs_start_locations.json +++ b/data/mods/more_classes_scenarios/cs_start_locations.json @@ -1,32 +1,44 @@ [ { - "type" : "start_location", - "ident" : "fema_entrance_s", - "name" : "Fema Entrance", - "target" : "fema_entrance" + "type": "start_location", + "ident": "fema_entrance_s", + "name": "Fema Entrance", + "target": "fema_entrance" }, { - "type" : "start_location", - "ident" : "fema_s", - "name" : "Fema Camp", - "target" : "fema" + "type": "start_location", + "ident": "fema_s", + "name": "Fema Camp", + "target": "fema" }, { - "type" : "start_location", - "ident" : "mansion_e2_s", - "name" : "Mansion Entrance", - "target" : "mansion_e2" + "type": "start_location", + "ident": "mansion_e2_s", + "name": "Mansion Entrance", + "target": "mansion_e2" }, { - "type" : "start_location", - "ident" : "mansion_+2_s", - "name" : "Mansion", - "target" : "mansion_+2" + "type": "start_location", + "ident": "mansion_+2_s", + "name": "Mansion", + "target": "mansion_+2" }, { - "type" : "start_location", - "ident" : "s_gas_s", - "name" : "Gas Station", - "target" : "s_gas" + "type": "start_location", + "ident": "s_gas_s", + "name": "Gas Station", + "target": "s_gas" + }, + { + "type": "start_location", + "ident": "s_electronics_s", + "name": "Electronics Store", + "target": "s_electronics" + }, + { + "type": "start_location", + "ident": "s_clothes_s", + "name": "Clothing Store", + "target": "s_clothes" } ] diff --git a/doc/JSON_INFO.md b/doc/JSON_INFO.md index 8c2fcb3f3dbed..d5c0b11549772 100644 --- a/doc/JSON_INFO.md +++ b/doc/JSON_INFO.md @@ -1125,6 +1125,8 @@ For this to work, the item needs to be a tool that consumes charges upon invocat - `ARTC_SOLAR` Recharges in sunlight - `ARTC_PAIN` Creates pain to recharge - `ARTC_HP` Drains HP to recharge +- `ARTC_FATIGUE` Creates fatigue to recharge +- `ARTC_PORTAL` Consumes portals to recharge #### `Effects_carried` @@ -1210,6 +1212,8 @@ Possible values (see src/artifact.h for an up-to-date list): - `AEA_LIGHT` Temporary light source - `AEA_GROWTH` Grow plants, a la triffid queen - `AEA_HURTALL` Hurts all monsters! +- `AEA_FUN` Temporary morale bonus +- `AEA_SPLIT` Split between good and bad - `AEA_RADIATION` Spew radioactive gas - `AEA_PAIN` Increases player pain - `AEA_MUTATE` Chance of mutation @@ -1223,6 +1227,7 @@ Possible values (see src/artifact.h for an up-to-date list): - `AEA_FLASH` Flashbang - `AEA_VOMIT` User vomits - `AEA_SHADOWS` Summon shadow creatures +- `AEA_STAMINA_EMPTY` Empties most of the player's stamina gauge ### Software Data diff --git a/doc/NPCs.md b/doc/NPCs.md index e625f8ef99c9b..9ff3d1217ee8e 100644 --- a/doc/NPCs.md +++ b/doc/NPCs.md @@ -332,22 +332,22 @@ Ends the conversation and makes the NPC hostile, adds a message that character s Allows your character to select items from the NPC's inventory and transfer them to your inventory. ### give_aid -Removes $200 from your character's cash and removes all bites, infection, and bleeding from your character's body and heals 10-25 HP of injury on each of your character's body parts. +Removes all bites, infection, and bleeding from your character's body and heals 10-25 HP of injury on each of your character's body parts. ### give_aid_all -Removes $300 from your character's cash and performs give_aid on each of your character's NPC allies in range. +Performs give_aid on each of your character's NPC allies in range. ### buy_haircut -Removes $10 from your character's cash and gives your character a haircut morale boost for 12 hours. +Gives your character a haircut morale boost for 12 hours. ### buy_shave -Removes $5 from your character's cash and gives your character a shave morale boost for 6 hours. +Gives your character a shave morale boost for 6 hours. ### buy_10_logs -Removes $2000 from your character's cash, places 10 logs in the ranch garage, and makes the NPC unavailable for 1 day. +Places 10 logs in the ranch garage, and makes the NPC unavailable for 1 day. ### buy_100_logs -Removes $12000 from your character's cash, places 100 logs in the ranch garage, and makes the NPC unavailable for 7 days. +Places 100 logs in the ranch garage, and makes the NPC unavailable for 7 days. ### bionic_install The NPC installs a bionic from your character's inventory onto your character, using very high skill, and charging you according to the operation's difficulty. diff --git a/src/artifact.cpp b/src/artifact.cpp index 7cddb17e9d23e..e4a86439c898d 100644 --- a/src/artifact.cpp +++ b/src/artifact.cpp @@ -1488,6 +1488,7 @@ static const std::unordered_map art_charge_values = { { PAIR( ARTC_PAIN ), PAIR( ARTC_HP ), PAIR( ARTC_FATIGUE ), + PAIR( ARTC_PORTAL ), } }; static const std::unordered_map art_charge_req_values = { { diff --git a/src/artifact.h b/src/artifact.h index 3ddedabb9988e..ba650ac482347 100644 --- a/src/artifact.h +++ b/src/artifact.h @@ -59,6 +59,7 @@ enum art_charge : int { ARTC_PAIN, // Creates pain to recharge ARTC_HP, // Drains HP to recharge ARTC_FATIGUE, // Creates fatigue to recharge + ARTC_PORTAL, // Consumes portals NUM_ARTCS }; diff --git a/src/bonuses.cpp b/src/bonuses.cpp index d1651e0c36418..cbc367f616111 100644 --- a/src/bonuses.cpp +++ b/src/bonuses.cpp @@ -3,6 +3,9 @@ #include "json.h" #include "character.h" #include "debug.h" +#include "translations.h" +#include "output.h" + #include #include #include @@ -58,6 +61,39 @@ affected_stat affected_stat_from_string( const std::string &s ) return AFFECTED_NULL; } +static const std::map affected_stat_map_translation = {{ + std::make_pair( AFFECTED_HIT, translate_marker( "Accuracy" ) ), + std::make_pair( AFFECTED_DODGE, translate_marker( "Dodge" ) ), + std::make_pair( AFFECTED_BLOCK, translate_marker( "Block" ) ), + std::make_pair( AFFECTED_SPEED, translate_marker( "Speed" ) ), + std::make_pair( AFFECTED_MOVE_COST, translate_marker( "Move cost" ) ), + std::make_pair( AFFECTED_DAMAGE, translate_marker( "damage" ) ), + std::make_pair( AFFECTED_ARMOR, translate_marker( "Armor" ) ), + std::make_pair( AFFECTED_ARMOR_PENETRATION, translate_marker( "Armor pen" ) ), + std::make_pair( AFFECTED_TARGET_ARMOR_MULTIPLIER, translate_marker( "Target armor multiplier" ) ), + } +}; + +std::string string_from_affected_stat( const affected_stat &s ) +{ + const auto &iter = affected_stat_map_translation.find( s ); + return iter != affected_stat_map_translation.end() ? _( iter->second.c_str() ) : ""; +} + +static const std::map scaling_stat_map_translation = {{ + std::make_pair( STAT_STR, translate_marker( "strength" ) ), + std::make_pair( STAT_DEX, translate_marker( "dexterity" ) ), + std::make_pair( STAT_INT, translate_marker( "intelligence" ) ), + std::make_pair( STAT_PER, translate_marker( "perception" ) ), + } +}; + +std::string string_from_scaling_stat( const scaling_stat &s ) +{ + const auto &iter = scaling_stat_map_translation.find( s ); + return iter != scaling_stat_map_translation.end() ? _( iter->second.c_str() ) : ""; +} + bonus_container::bonus_container() { } @@ -183,6 +219,53 @@ float bonus_container::get_mult( const Character &u, affected_stat stat ) const return get_mult( u, stat, DT_NULL ); } +std::string bonus_container::get_description() const +{ + std::stringstream dump; + for( const auto &boni : bonuses_mult ) { + std::string type = string_from_affected_stat( boni.first.get_stat() ); + + if( needs_damage_type( boni.first.get_stat() ) ) { + type = name_by_dt( boni.first.get_damage_type() ) + " " + type; + } + + for( const auto &sf : boni.second ) { + dump << string_format( "%s: %d%%", type, static_cast( sf.scale * 100 ) ); + + if( sf.stat ) { + //~ bash damage +80% of strength + dump << _( " of " ) << string_from_scaling_stat( sf.stat ); + } + + dump << " "; + }; + } + + for( const auto &boni : bonuses_flat ) { + std::string type = string_from_affected_stat( boni.first.get_stat() ); + + if( needs_damage_type( boni.first.get_stat() ) ) { + type = name_by_dt( boni.first.get_damage_type() ) + " " + type; + } + + for( const auto &sf : boni.second ) { + if( sf.stat ) { + dump << string_format( "%s: %s%d%%", type, ( sf.scale < 0 ) ? "" : "+", + static_cast( sf.scale * 100 ) ); + //~ bash damage +80% of strength + dump << _( " of " ) << string_from_scaling_stat( sf.stat ); + } else { + dump << string_format( "%s: %s%d", type, ( sf.scale < 0 ) ? "" : "+", + static_cast( sf.scale ) ); + } + + dump << " "; + } + } + + return dump.str(); +} + float effect_scaling::get( const Character &u ) const { float bonus = 0.0f; diff --git a/src/bonuses.h b/src/bonuses.h index 561f3909b8a25..e323abbe8e980 100644 --- a/src/bonuses.h +++ b/src/bonuses.h @@ -78,6 +78,8 @@ class bonus_container float get_mult( const Character &u, affected_stat stat, damage_type type ) const; float get_mult( const Character &u, affected_stat stat ) const; + std::string get_description() const; + private: using bonus_map = std::map>; /** All kinds of bonuses by types to damage, hit etc. */ diff --git a/src/color.cpp b/src/color.cpp index 4861c7cb829b5..a1afb81311a0b 100644 --- a/src/color.cpp +++ b/src/color.cpp @@ -486,13 +486,13 @@ void init_colors() // The short color codes (e.g. "br") are intentionally untranslatable. color_by_string_map = { - {"br", {c_brown, _( "brown" )}}, {"lg", {c_light_gray, _( "light gray" )}}, - {"dg", {c_dark_gray, _( "dark gray" )}}, {"r", {c_light_red, _( "light red" )}}, - {"R", {c_red, _( "red" )}}, {"g", {c_light_green, _( "light green" )}}, - {"G", {c_green, _( "green" )}}, {"b", {c_light_blue, _( "light blue" )}}, - {"B", {c_blue, _( "blue" )}}, {"W", {c_white, _( "white" )}}, - {"C", {c_cyan, _( "cyan" )}}, {"c", {c_light_cyan, _( "light cyan" )}}, - {"P", {c_pink, _( "pink" )}}, {"m", {c_magenta, _( "magenta" )}} + {"br", {c_brown, translate_marker( "brown" )}}, {"lg", {c_light_gray, translate_marker( "light gray" )}}, + {"dg", {c_dark_gray, translate_marker( "dark gray" )}}, {"r", {c_light_red, translate_marker( "light red" )}}, + {"R", {c_red, translate_marker( "red" )}}, {"g", {c_light_green, translate_marker( "light green" )}}, + {"G", {c_green, translate_marker( "green" )}}, {"b", {c_light_blue, translate_marker( "light blue" )}}, + {"B", {c_blue, translate_marker( "blue" )}}, {"W", {c_white, translate_marker( "white" )}}, + {"C", {c_cyan, translate_marker( "cyan" )}}, {"c", {c_light_cyan, translate_marker( "light cyan" )}}, + {"P", {c_pink, translate_marker( "pink" )}}, {"m", {c_magenta, translate_marker( "magenta" )}} }; } diff --git a/src/game.cpp b/src/game.cpp index b5ba31b83aa91..0394cff0da32d 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -12645,6 +12645,19 @@ void game::process_artifact( item &it, player &p ) it.charges++; } break; + // Portals are energetic enough to charge the item. + // Tears in reality are consumed too, but can't charge it. + case ARTC_PORTAL: + for( const tripoint &dest : m.points_in_radius( p.pos(), 1 ) ) { + m.remove_field( dest, fd_fatigue ); + if( m.tr_at( dest ).loadid == tr_portal ) { + add_msg( m_good, _( "The portal collapses!" ) ); + m.remove_trap( dest ); + it.charges++; + break; + } + } + break; } } } diff --git a/src/item_factory.cpp b/src/item_factory.cpp index c85a023b91843..c1c985ead026e 100644 --- a/src/item_factory.cpp +++ b/src/item_factory.cpp @@ -539,6 +539,7 @@ void Item_factory::init() add_iuse( "CAFF", &iuse::caff ); add_iuse( "CAMERA", &iuse::camera ); add_iuse( "CAN_GOO", &iuse::can_goo ); + add_iuse( "COIN_FLIP", &iuse::coin_flip ); add_iuse( "DIRECTIONAL_HOLOGRAM", &iuse::directional_hologram ); add_iuse( "CAPTURE_MONSTER_ACT", &iuse::capture_monster_act ); add_iuse( "CAPTURE_MONSTER_VEH", &iuse::capture_monster_veh ); @@ -609,6 +610,7 @@ void Item_factory::init() add_iuse( "JET_INJECTOR", &iuse::jet_injector ); add_iuse( "LADDER", &iuse::ladder ); add_iuse( "LUMBER", &iuse::lumber ); + add_iuse( "MAGIC_8_BALL", &iuse::magic_8_ball ); add_iuse( "MAKEMOUND", &iuse::makemound ); add_iuse( "MARLOSS", &iuse::marloss ); add_iuse( "MARLOSS_GEL", &iuse::marloss_gel ); diff --git a/src/iuse.cpp b/src/iuse.cpp index 10ff505676b6e..226265420f9b5 100644 --- a/src/iuse.cpp +++ b/src/iuse.cpp @@ -433,6 +433,8 @@ int iuse::ecig( player *p, item *it, bool, const tripoint & ) p->add_msg_if_player( m_neutral, _( "You inhale some vapor from your advanced electronic cigarette." ) ); p->use_charges( "nicotine_liquid", 1 ); + item dummy_ecig = item( "ecig", calendar::turn ); + p->consume_effects( dummy_ecig ); } else { p->add_msg_if_player( m_info, _( "You don't have any nicotine liquid!" ) ); return 0; @@ -7849,3 +7851,48 @@ int iuse::magnesium_tablet( player *p, item *it, bool, const tripoint & ) p->add_effect( effect_magnesium_supplements, 16_hours ); return it->type->charges_to_use(); } + +int iuse::coin_flip( player *p, item *it, bool, const tripoint & ) +{ + p->add_msg_if_player( m_info, _( "You flip a %s." ), it->tname().c_str() ); + p->add_msg_if_player( m_info, one_in( 2 ) ? _( "Heads!" ) : _( "Tails!" ) ); + return 0; +} + +int iuse::magic_8_ball( player *p, item *it, bool, const tripoint & ) +{ + enum { + BALL8_GOOD, + BALL8_UNK = 10, + BALL8_BAD = 15 + }; + const static std::array tab = {{ + translate_marker( "It is certain." ), + translate_marker( "It is decidedly so." ), + translate_marker( "Without a doubt." ), + translate_marker( "Yes - definitely." ), + translate_marker( "You may rely on it." ), + translate_marker( "As I see it, yes." ), + translate_marker( "Most likely." ), + translate_marker( "Outlook good." ), + translate_marker( "Yes." ), + translate_marker( "Signs point to yes." ), + translate_marker( "Reply hazy, try again." ), + translate_marker( "Ask again later." ), + translate_marker( "Better not tell you now." ), + translate_marker( "Cannot predict now." ), + translate_marker( "Concentrate and ask again." ), + translate_marker( "Don't count on it." ), + translate_marker( "My reply is no." ), + translate_marker( "My sources say no." ), + translate_marker( "Outlook not so good." ), + translate_marker( "Very doubtful." ) + } + }; + + p->add_msg_if_player( m_info, _( "You ask the %s, then flip it." ), it->tname().c_str() ); + int rn = rng( 0, tab.size() - 1 ); + auto color = ( rn >= BALL8_BAD ? m_bad : rn >= BALL8_UNK ? m_info : m_good ); + p->add_msg_if_player( color, _( "The %s says: %s" ), it->tname().c_str(), _( tab[rn] ) ); + return 0; +} diff --git a/src/iuse.h b/src/iuse.h index 3d0105434f62f..623870b80fd25 100644 --- a/src/iuse.h +++ b/src/iuse.h @@ -209,6 +209,8 @@ class iuse int instant_antibiotic( player *, item *, bool, const tripoint & ); int panacea( player *, item *, bool, const tripoint & ); int magnesium_tablet( player *, item *, bool, const tripoint & ); + int coin_flip( player *, item *, bool, const tripoint & ); + int magic_8_ball( player *, item *, bool, const tripoint & ); // MACGUFFINS diff --git a/src/martialarts.cpp b/src/martialarts.cpp index 22175e409430f..1c5a91c6cb60c 100644 --- a/src/martialarts.cpp +++ b/src/martialarts.cpp @@ -6,6 +6,9 @@ #include "translations.h" #include "itype.h" #include "damage.h" +#include "output.h" +#include "input.h" +#include "skill.h" #include #include @@ -364,6 +367,46 @@ bool ma_requirements::is_valid_weapon( const item &i ) const return true; } +std::string ma_requirements::get_description( bool buff ) const +{ + std::stringstream dump; + + if( std::any_of( min_skill.begin(), min_skill.end(), []( const std::pair &pr ) { + return pr.second > 0; +} ) ) { + dump << string_format( _( "%s required: " ), + ngettext( "Skill", "Skills", min_skill.size() ) ); + + dump << enumerate_as_string( min_skill.begin(), + min_skill.end(), []( const std::pair &pr ) { + return string_format( "%s: %d", pr.first->name(), pr.second ); + }, enumeration_conjunction::none ) << std::endl; + } + + if( req_buffs.size() ) { + dump << string_format( _( "Requires: " ) ); + + dump << enumerate_as_string( req_buffs.begin(), req_buffs.end(), []( const mabuff_id & bid ) { + return bid->name; + }, enumeration_conjunction::none ) << std::endl; + } + + const std::string type = buff ? _( "activate" ) : _( "be used" ); + + if( unarmed_allowed && melee_allowed ) { + dump << string_format( _( "* Can %s while armed or unarmed" ), + type ) << std::endl; + } else if( unarmed_allowed ) { + dump << string_format( _( "* Can only %s while unarmed" ), + type ) << std::endl; + } else if( melee_allowed ) { + dump << string_format( _( "* Can only %s while armed" ), + type ) << std::endl; + } + + return dump.str(); +} + ma_technique::ma_technique() { crit_tec = false; @@ -474,6 +517,53 @@ bool ma_buff::can_melee() const return melee_allowed; } +std::string ma_buff::get_description( bool passive ) const +{ + std::stringstream dump; + dump << string_format( _( "Buff technique: %s" ), name ) << std::endl; + + std::string temp = bonuses.get_description(); + if( !temp.empty() ) { + dump << string_format( _( "%s: " ), + ngettext( "Bonus", "Bonus/stack", max_stacks ) ) << temp << std::endl; + } + + dump << reqs.get_description( true ); + + if( max_stacks > 1 ) { + dump << string_format( _( "* Will stack up to %d times" ), + max_stacks ) << std::endl; + } + + const int turns = to_turns( buff_duration ); + if( !passive && turns ) { + dump << string_format( _( "* Will last for %d %s" ), + turns, ngettext( "turn", "turns", turns ) ) << std::endl; + } + + if( dodges_bonus > 0 ) { + dump << string_format( _( "* Will give a +%s bonus to dodge%s" ), + dodges_bonus, ngettext( "", " per stack", max_stacks ) ) << std::endl; + } else if( dodges_bonus < 0 ) { + dump << string_format( _( "* Will give a %s penalty to dodge%s" ), + dodges_bonus, ngettext( "", " per stack", max_stacks ) ) << std::endl; + } + + if( blocks_bonus > 0 ) { + dump << string_format( _( "* Will give a +%s bonus to block%s" ), + blocks_bonus, ngettext( "", " per stack", max_stacks ) ) << std::endl; + } else if( blocks_bonus < 0 ) { + dump << string_format( _( "* Will give a %s penalty to block%s" ), + blocks_bonus, ngettext( "", " per stack", max_stacks ) ) << std::endl; + } + + if( quiet ) { + dump << _( "* Attacks will be completely silent" ) << std::endl; + } + + return dump.str(); +} + martialart::martialart() { leg_block = -1; @@ -840,3 +930,172 @@ float ma_technique::armor_penetration( const player &u, damage_type type ) const { return bonuses.get_flat( u, AFFECTED_ARMOR_PENETRATION, type ); } + +std::string ma_technique::get_description() const +{ + std::stringstream dump; + + dump << string_format( _( "Type: %s" ), + defensive ? _( "defensive" ) : _( "offensive" ) ) << std::endl; + + std::string temp = bonuses.get_description(); + if( !temp.empty() ) { + dump << _( "Bonus: " ) << temp << std::endl; + } + + dump << reqs.get_description(); + + if( crit_tec ) { + dump << _( "* Will only activate on a crit" ) << std::endl; + } + + if( dodge_counter ) { + dump << _( "* Will counterattack when you dodge" ) << std::endl; + } + + if( block_counter ) { + dump << _( "* Will counterattack when you block" ) << std::endl; + } + + if( miss_recovery ) { + dump << _( "* Will grant free recovery from a miss" ) << std::endl; + } + + if( grab_break ) { + dump << _( "* Will break a grab" ) << std::endl; + } + + if( aoe == "wide" ) { + dump << _( "* Will attack in a wide arc in front of you" ) << std::endl; + + } else if( aoe == "spin" ) { + dump << _( "* Will attack adjacent enemies around you" ) << std::endl; + + } else if( aoe == "impale" ) { + dump << _( "* Will attack your target and another one behind it" ) << + std::endl; + } + + if( knockback_dist ) { + dump << string_format( _( "* Will knock back enemies %d %s" ), + knockback_dist, ngettext( "tile", "tiles", knockback_dist ) ) << std::endl; + } + + if( down_dur ) { + dump << string_format( _( "* Will down enemies for %d %s" ), + down_dur, ngettext( "turn", "turns", down_dur ) ) << std::endl; + } + + if( stun_dur ) { + dump << string_format( _( "* Will stun target for %d %s" ), + stun_dur, ngettext( "turn", "turns", stun_dur ) ) << std::endl; + } + + if( disarms ) { + dump << _( "* Will disarm the target" ) << std::endl; + } + + return dump.str(); +} + +bool ma_style_callback::key( const input_context &ctxt, const input_event &event, int entnum, + uimenu *menu ) +{ + const std::string action = ctxt.input_to_action( event ); + if( action != "SHOW_DESCRIPTION" ) { + return false; + } + matype_id style_selected; + const size_t index = entnum; + if( index >= offset && index - offset < styles.size() ) { + style_selected = styles[index - offset]; + } + if( !style_selected.str().empty() ) { + const martialart &ma = style_selected.obj(); + + std::ostringstream buffer; + + if( ma.force_unarmed ) { + buffer << _( "This style forces you to use unarmed strikes, even if wielding a weapon." ); + buffer << std::endl << "--" << std::endl; + } + + auto buff_desc = [&]( const std::string & title, const std::vector &buffs, + bool passive = false ) { + if( !buffs.empty() ) { + buffer << string_format( _( "
%s buffs:
" ), title ); + for( const auto &buff : buffs ) { + buffer << std::endl << buff->get_description( passive ) ; + } + buffer << std::endl << "--" << std::endl; + } + }; + + buff_desc( _( "Passive" ), ma.static_buffs, true ); + buff_desc( _( "Move" ), ma.onmove_buffs ); + buff_desc( _( "Hit" ), ma.onhit_buffs ); + buff_desc( _( "Attack" ), ma.onattack_buffs ); + buff_desc( _( "Dodge" ), ma.ondodge_buffs ); + buff_desc( _( "Block" ), ma.onblock_buffs ); + buff_desc( _( "Get hit" ), ma.ongethit_buffs ); + + for( const auto &tech : ma.techniques ) { + buffer << string_format( _( "
Technique:
%s " ), tech.obj().name ); + buffer << tech.obj().get_description() << std::endl << "--" << std::endl; + } + + if( !ma.weapons.empty() ) { + buffer << std::endl << std::endl; + buffer << ngettext( "Weapon:", "Weapons:", ma.weapons.size() ) << " "; + buffer << enumerate_as_string( ma.weapons.begin(), ma.weapons.end(), []( const std::string & wid ) { + return item::nname( wid ); + } ); + } + + catacurses::window w = catacurses::newwin( FULL_SCREEN_HEIGHT, FULL_SCREEN_WIDTH, + ( TERMY > FULL_SCREEN_HEIGHT ) ? ( TERMY - FULL_SCREEN_HEIGHT ) / 2 : 0, + ( TERMX > FULL_SCREEN_WIDTH ) ? ( TERMX - FULL_SCREEN_WIDTH ) / 2 : 0 ); + + std::string text = replace_colors( buffer.str() ); + int width = FULL_SCREEN_WIDTH - 4; + int height = FULL_SCREEN_HEIGHT - 2; + const auto vFolded = foldstring( text, width ); + int iLines = vFolded.size(); + int selected = 0; + + input_context ict; + ict.register_action( "UP" ); + ict.register_action( "DOWN" ); + ict.register_action( "QUIT" ); + + do { + if( selected < 0 ) { + selected = 0; + } else if( iLines < height ) { + selected = 0; + } else if( selected >= iLines - height ) { + selected = iLines - height; + } + + werase( w ); + fold_and_print_from( w, 1, 2, width, selected, c_light_gray, text ); + draw_border( w, BORDER_COLOR, string_format( _( " Style: %s " ), ma.name ) ); + draw_scrollbar( w, selected, height, iLines, 1, 0, BORDER_COLOR, true ); + wrefresh( w ); + catacurses::refresh(); + + std::string action = ict.handle_input(); + + if( action == "QUIT" ) { + break; + } else if( action == "DOWN" ) { + selected++; + } else if( action == "UP" ) { + selected--; + } + } while( true ); + + menu->redraw(); + } + return true; +} diff --git a/src/martialarts.h b/src/martialarts.h index 624eb9d54c6c0..81e7fb7500b1f 100644 --- a/src/martialarts.h +++ b/src/martialarts.h @@ -5,6 +5,7 @@ #include "string_id.h" #include "bonuses.h" #include "calendar.h" +#include "ui.h" #include #include @@ -54,6 +55,8 @@ struct ma_requirements { strictly_unarmed = false; } + std::string get_description( bool buff = false ) const; + bool is_valid_player( const player &u ) const; bool is_valid_weapon( const item &i ) const; @@ -72,6 +75,7 @@ class ma_technique std::string name; std::string description; + std::string get_description() const; std::string goal; // the melee goal this achieves @@ -161,6 +165,7 @@ class ma_buff bool was_loaded = false; std::string name; std::string description; + std::string get_description( bool passive = false ) const; ma_requirements reqs; @@ -233,6 +238,22 @@ class martialart std::vector ongethit_buffs; }; +class ma_style_callback : public uimenu_callback +{ + private: + size_t offset; + const std::vector &styles; + + public: + ma_style_callback( int style_offset, const std::vector &selectable_styles ) + : offset( style_offset ) + , styles( selectable_styles ) + {} + + bool key( const input_context &ctxt, const input_event &event, int entnum, uimenu *menu ) override; + ~ma_style_callback() override = default; +}; + void load_technique( JsonObject &jo, const std::string &src ); void load_martial_art( JsonObject &jo, const std::string &src ); void check_martialarts(); diff --git a/src/newcharacter.cpp b/src/newcharacter.cpp index f12824ac0938d..59df02ed6c8c8 100644 --- a/src/newcharacter.cpp +++ b/src/newcharacter.cpp @@ -28,6 +28,7 @@ #include "string_input_popup.h" #include "worldfactory.h" #include "json.h" +#include "martialarts.h" #ifndef _MSC_VER #include @@ -203,10 +204,20 @@ matype_id choose_ma_style( const character_type type, const std::vector json_talk_topics; #define SUCCESS_ACTION(func) ret.back().success.set_effect( func ) #define FAILURE_ACTION(func) ret.back().failure.set_effect( func ) -#define SUCCESS_ACTION_CONSEQUENCE(func, con) ret.back().success.set_effect_consequence( func, con ) -#define FAILURE_ACTION_CONSEQUENCE(func, con) ret.back().failure.set_effect_consequence( func, con ) - #define dbg(x) DebugLog((DebugLevel)(x),D_GAME) << __FILE__ << ":" << __LINE__ << ": " int topic_category( const talk_topic &topic ); @@ -368,44 +365,14 @@ std::string dialogue::dynamic_line( const talk_topic &the_topic ) const if( topic == "TALK_NONE" || topic == "TALK_DONE" ) { return _( "Bye." ); - } else if( topic == "TALK_DELIVER_ASK" ) { return bulk_trade_inquire( *p, the_topic.item_type ); - - } else if( topic == "TALK_DELIVER_CONFIRM" ) { - return _( "Pleasure doing business!" ); - - } else if( topic == "TALK_SHELTER" ) { - switch( rng( 1, 2 ) ) { - case 1: - return _( "Well, I guess it's just us." ); - case 2: - return _( "At least we've got shelter." ); - } - } else if( topic == "TALK_SHELTER_ADVICE" ) { - return get_hint(); - } else if( topic == "TALK_SHELTER_PLANS" ) { - switch( rng( 1, 5 ) ) { - case 1: - return _( "I don't know, look for supplies and other survivors I guess." ); - case 2: - return _( "Maybe we should start boarding up this place." ); - case 3: - return _( "I suppose getting a car up and running should really be useful if we have to disappear quickly from here." ); - case 4: - return _( "We could look for one of those farms out here. They can provide plenty of food and aren't close to the cities." ); - case 5: - return _( "We should probably stay away from those cities, even if there's plenty of useful stuff there." ); - } - } else if( topic == "TALK_SHARE_EQUIPMENT" ) { if( p->has_effect( effect_asked_for_item ) ) { return _( "You just asked me for stuff; ask later." ); } return _( "Why should I share my equipment with you?" ); - } else if( topic == "TALK_GIVE_EQUIPMENT" ) { - return _( "Okay, here you go." ); } else if( topic == "TALK_DENY_EQUIPMENT" ) { if( p->op_of_u.anger >= p->hostile_anger_level() - 4 ) { @@ -426,40 +393,9 @@ std::string dialogue::dynamic_line( const talk_topic &the_topic ) const } else { return _( "Here's what I can teach you..." ); } - - } else if( topic == "TALK_TRAIN_START" ) { - return _( "Alright, let's begin." ); - - } else if( topic == "TALK_TRAIN_FORCE" ) { - return _( "Alright, let's begin." ); - - } else if( topic == "TALK_SUGGEST_FOLLOW" ) { - if( p->has_effect( effect_infection ) ) { - return _( "Not until I get some antibiotics..." ); - } - if( p->has_effect( effect_asked_to_follow ) ) { - return _( "You asked me recently; ask again later." ); - } - return _( "Why should I travel with you?" ); - - } else if( topic == "TALK_AGREE_FOLLOW" ) { - return _( "You got it, I'm with you!" ); - - } else if( topic == "TALK_DENY_FOLLOW" ) { - return _( "Yeah... I don't think so." ); - } else if( topic == "TALK_LEADER" ) { return _( "What is it?" ); - } else if( topic == "TALK_LEAVE" ) { - return _( "You're really leaving?" ); - - } else if( topic == "TALK_PLAYER_LEADS" ) { - return _( "Alright. You can lead now." ); - - } else if( topic == "TALK_LEADER_STAYS" ) { - return _( "No. I'm the leader here." ); - } else if( topic == "TALK_HOW_MUCH_FURTHER" ) { // TODO: this ignores the z-component const tripoint player_pos = p->global_omt_location(); @@ -482,21 +418,9 @@ std::string dialogue::dynamic_line( const talk_topic &the_topic ) const } else if( topic == "TALK_FRIEND" ) { return _( "What is it?" ); - } else if( topic == "TALK_FRIEND_GUARD" ) { - return _( "I'm on watch." ); - - } else if( topic == "TALK_DENY_GUARD" ) { - return _( "Not a bloody chance, I'm going to get left behind!" ); - } else if( topic == "TALK_DENY_TRAIN" ) { return the_topic.reason; - } else if( topic == "TALK_DENY_PERSONAL" ) { - return _( "I'd prefer to keep that to myself." ); - - } else if( topic == "TALK_FRIEND_UNCOMFORTABLE" ) { - return _( "I really don't feel comfortable doing so..." ); - } else if( topic == "TALK_COMBAT_COMMANDS" ) { std::stringstream status; // Prepending * makes this an action, not a phrase @@ -881,7 +805,6 @@ void dialogue::gen_responses( const talk_topic &the_topic ) break; } } - } else if( topic == "TALK_MISSION_SUCCESS" ) { int mission_value = 0; if( miss == nullptr ) { @@ -929,7 +852,6 @@ void dialogue::gen_responses( const talk_topic &the_topic ) } add_response( _( "Works for me." ), "TALK_DELIVER_CONFIRM", the_topic.item_type ); add_response( _( "Maybe later." ), "TALK_DONE" ); - } else if( topic == "TALK_DELIVER_CONFIRM" ) { bulk_trade_accept( *p, the_topic.item_type ); add_response_done( _( "You might be seeing more of me..." ) ); @@ -937,22 +859,6 @@ void dialogue::gen_responses( const talk_topic &the_topic ) if( g->u.charges_of( "bandages" ) > 0 ) { add_response( _( "Delivering bandages." ), "TALK_DELIVER_ASK", itype_id( "bandages" ) ); } - } else if( topic == "TALK_SHELTER" ) { - add_response( _( "What should we do now?" ), "TALK_SHELTER_PLANS" ); - add_response( _( "Any tips?" ), "TALK_SHELTER_ADVICE" ); - add_response( _( "Can I do anything for you?" ), "TALK_MISSION_LIST" ); - if( !p->is_following() ) { - add_response( _( "Want to travel with me?" ), "TALK_SUGGEST_FOLLOW" ); - } - add_response( _( "Let's trade items." ), "TALK_NONE", &talk_function::start_trade ); - add_response( _( "I can't leave the shelter without equipment..." ), "TALK_SHARE_EQUIPMENT" ); - add_response_done( _( "Well, bye." ) ); - } else if( topic == "TALK_SHELTER_ADVICE" ) { - add_response_none( _( "Thanks!" ) ); - } else if( topic == "TALK_SHELTER_PLANS" ) { - // TODO: Add _("follow me") - add_response_none( _( "Hmm, okay." ) ); - } else if( topic == "TALK_SHARE_EQUIPMENT" ) { if( p->has_effect( effect_asked_for_item ) ) { add_response_none( _( "Okay, fine." ) ); @@ -1003,16 +909,6 @@ void dialogue::gen_responses( const talk_topic &the_topic ) add_response_done( _( "Never mind, I'll do without. Bye." ) ); } - } else if( topic == "TALK_GIVE_EQUIPMENT" ) { - add_response_none( _( "Thank you!" ) ); - add_response( _( "Thanks! But can I have some more?" ), "TALK_SHARE_EQUIPMENT" ); - add_response_done( _( "Thanks, see you later!" ) ); - - } else if( topic == "TALK_DENY_EQUIPMENT" ) { - add_response_none( _( "Okay, okay, sorry." ) ); - add_response( _( "Seriously, give me more stuff!" ), "TALK_SHARE_EQUIPMENT" ); - add_response_done( _( "Okay, fine, bye." ) ); - } else if( topic == "TALK_TRAIN" ) { if( !g->u.backlog.empty() && g->u.backlog.front().id() == activity_id( "ACT_TRAIN" ) ) { player_activity &backlog = g->u.backlog.front(); @@ -1053,116 +949,10 @@ void dialogue::gen_responses( const talk_topic &the_topic ) } add_response_none( _( "Eh, never mind." ) ); - } else if( topic == "TALK_TRAIN_START" ) { - if( overmap_buffer.is_safe( p->global_omt_location() ) ) { - add_response( _( "Sounds good." ), "TALK_DONE", &talk_function::start_training ); - add_response_none( _( "On second thought, never mind." ) ); - } else { - add_response( _( "Okay. Lead the way." ), "TALK_DONE", &talk_function::lead_to_safety ); - add_response( _( "No, we'll be okay here." ), "TALK_TRAIN_FORCE" ); - add_response_none( _( "On second thought, never mind." ) ); - } - - } else if( topic == "TALK_TRAIN_FORCE" ) { - add_response( _( "Sounds good." ), "TALK_DONE", &talk_function::start_training ); - add_response_none( _( "On second thought, never mind." ) ); - - } else if( topic == "TALK_SUGGEST_FOLLOW" ) { - if( p->has_effect( effect_infection ) ) { - add_response_none( _( "Understood. I'll get those antibiotics." ) ); - } else if( p->has_effect( effect_asked_to_follow ) ) { - add_response_none( _( "Right, right, I'll ask later." ) ); - } else { - int strength = 4 * p->op_of_u.fear + p->op_of_u.value + p->op_of_u.trust + - ( 10 - p->personality.bravery ); - int weakness = 3 * ( p->personality.altruism - std::max( 0, p->op_of_u.fear ) ) + - p->personality.bravery - 3 * p->op_of_u.anger + 2 * p->op_of_u.value; - int friends = 2 * p->op_of_u.trust + 2 * p->op_of_u.value - 2 * p->op_of_u.anger; - RESPONSE( _( "I can keep you safe." ) ); - TRIAL( TALK_TRIAL_PERSUADE, strength * 2 ); - SUCCESS( "TALK_AGREE_FOLLOW" ); - SUCCESS_ACTION( &talk_function::follow ); - SUCCESS_OPINION( 1, 0, 1, 0, 0 ); - FAILURE( "TALK_DENY_FOLLOW" ); - FAILURE_ACTION( &talk_function::deny_follow ); - FAILURE_OPINION( 0, 0, -1, 1, 0 ); - RESPONSE( _( "You can keep me safe." ) ); - TRIAL( TALK_TRIAL_PERSUADE, weakness * 2 ); - SUCCESS( "TALK_AGREE_FOLLOW" ); - SUCCESS_ACTION( &talk_function::follow ); - SUCCESS_OPINION( 0, 0, -1, 0, 0 ); - FAILURE( "TALK_DENY_FOLLOW" ); - FAILURE_ACTION( &talk_function::deny_follow ); - FAILURE_OPINION( 0, -1, -1, 1, 0 ); - RESPONSE( _( "We're friends, aren't we?" ) ); - TRIAL( TALK_TRIAL_PERSUADE, friends * 1.5 ); - SUCCESS( "TALK_AGREE_FOLLOW" ); - SUCCESS_ACTION( &talk_function::follow ); - SUCCESS_OPINION( 2, 0, 0, -1, 0 ); - FAILURE( "TALK_DENY_FOLLOW" ); - FAILURE_ACTION( &talk_function::deny_follow ); - FAILURE_OPINION( -1, -2, -1, 1, 0 ); - RESPONSE( _( "I'll kill you if you don't." ) ); - TRIAL( TALK_TRIAL_INTIMIDATE, strength * 2 ); - SUCCESS( "TALK_AGREE_FOLLOW" ); - SUCCESS_ACTION( &talk_function::follow ); - SUCCESS_OPINION( -4, 3, -1, 4, 0 ); - FAILURE( "TALK_DENY_FOLLOW" ); - FAILURE_OPINION( -4, 0, -5, 10, 0 ); - } - - } else if( topic == "TALK_AGREE_FOLLOW" ) { - add_response( _( "Awesome!" ), "TALK_FRIEND" ); - add_response_done( _( "Okay, let's go!" ) ); - - } else if( topic == "TALK_DENY_FOLLOW" ) { - add_response_none( _( "Oh, okay." ) ); - - } else if( topic == "TALK_LEADER" ) { - int persuade = p->op_of_u.fear + p->op_of_u.value + p->op_of_u.trust - - p->personality.bravery - p->personality.aggression; - if( p->has_destination() ) { - add_response( _( "How much further?" ), "TALK_HOW_MUCH_FURTHER" ); - } - add_response( _( "I'm going to go my own way for a while." ), "TALK_LEAVE" ); - if( !p->has_effect( effect_asked_to_lead ) ) { - RESPONSE( _( "I'd like to lead for a while." ) ); - TRIAL( TALK_TRIAL_PERSUADE, persuade ); - SUCCESS( "TALK_PLAYER_LEADS" ); - SUCCESS_ACTION( &talk_function::follow ); - FAILURE( "TALK_LEADER_STAYS" ); - FAILURE_OPINION( 0, 0, -1, -1, 0 ); - RESPONSE( _( "Step aside. I'm leader now." ) ); - TRIAL( TALK_TRIAL_INTIMIDATE, 40 ); - SUCCESS( "TALK_PLAYER_LEADS" ); - SUCCESS_ACTION( &talk_function::follow ); - SUCCESS_OPINION( -1, 1, -1, 1, 0 ); - FAILURE( "TALK_LEADER_STAYS" ); - FAILURE_OPINION( -1, 0, -1, 1, 0 ); - } - add_response( _( "Can I do anything for you?" ), "TALK_MISSION_LIST" ); - add_response( _( "Let's trade items." ), "TALK_NONE", &talk_function::start_trade ); - add_response_done( _( "Let's go." ) ); - - } else if( topic == "TALK_LEAVE" ) { - add_response_none( _( "Nah, I'm just kidding." ) ); - add_response( _( "Yeah, I'm sure. Bye." ), "TALK_DONE", &talk_function::leave ); - - } else if( topic == "TALK_PLAYER_LEADS" ) { - add_response( _( "Good. Something else..." ), "TALK_FRIEND" ); - add_response_done( _( "Alright, let's go." ) ); - - } else if( topic == "TALK_LEADER_STAYS" ) { - add_response_none( _( "Okay, okay." ) ); - } else if( topic == "TALK_HOW_MUCH_FURTHER" ) { add_response_none( _( "Okay, thanks." ) ); add_response_done( _( "Let's keep moving." ) ); - } else if( topic == "TALK_FRIEND_GUARD" ) { - add_response( _( "I need you to come with me." ), "TALK_FRIEND", &talk_function::stop_guard ); - add_response_done( _( "See you around." ) ); - } else if( topic == "TALK_FRIEND" || topic == "TALK_GIVE_ITEM" || topic == "TALK_USE_ITEM" ) { if( p->is_following() ) { add_response( _( "Combat commands..." ), "TALK_COMBAT_COMMANDS" ); @@ -1238,15 +1028,6 @@ void dialogue::gen_responses( const talk_topic &the_topic ) add_response_done( _( "Bye." ) ); } - } else if( topic == "TALK_FRIEND_UNCOMFORTABLE" ) { - add_response( _( "I'll give you some space." ), "TALK_FRIEND" ); - - } else if( topic == "TALK_DENY_TRAIN" ) { - add_response( _( "Very well..." ), "TALK_FRIEND" ); - - } else if( topic == "TALK_DENY_PERSONAL" ) { - add_response( _( "I understand..." ), "TALK_FRIEND" ); - } else if( topic == "TALK_COMBAT_COMMANDS" ) { add_response( _( "Change your engagement rules..." ), "TALK_COMBAT_ENGAGEMENT" ); add_response( _( "Change your aiming rules..." ), "TALK_AIM_RULES" ); diff --git a/src/npctalk_funcs.cpp b/src/npctalk_funcs.cpp index 23eee4f7160d6..d096863f2abdf 100644 --- a/src/npctalk_funcs.cpp +++ b/src/npctalk_funcs.cpp @@ -350,7 +350,6 @@ void talk_function::give_equipment( npc &p ) void talk_function::give_aid( npc &p ) { - g->u.cash -= 20000; p.add_effect( effect_currently_busy, 30_minutes ); body_part bp_healed; for( int i = 0; i < num_hp_parts; i++ ) { @@ -372,7 +371,6 @@ void talk_function::give_aid( npc &p ) void talk_function::give_all_aid( npc &p ) { - g->u.cash -= 30000; p.add_effect( effect_currently_busy, 30_minutes ); give_aid( p ); body_part bp_healed; @@ -398,7 +396,6 @@ void talk_function::give_all_aid( npc &p ) void talk_function::buy_haircut( npc &p ) { g->u.add_morale( MORALE_HAIRCUT, 5, 5, 720_minutes, 3_minutes ); - g->u.cash -= 1000; g->u.assign_activity( activity_id( "ACT_WAIT_NPC" ), 300 ); g->u.activity.str_values.push_back( p.name ); add_msg( m_good, _( "%s gives you a decent haircut..." ), p.name ); @@ -407,7 +404,6 @@ void talk_function::buy_haircut( npc &p ) void talk_function::buy_shave( npc &p ) { g->u.add_morale( MORALE_SHAVE, 10, 10, 360_minutes, 3_minutes ); - g->u.cash -= 500; g->u.assign_activity( activity_id( "ACT_WAIT_NPC" ), 100 ); g->u.activity.str_values.push_back( p.name ); add_msg( m_good, _( "%s gives you a decent shave..." ), p.name ); @@ -436,7 +432,6 @@ void talk_function::buy_10_logs( npc &p ) bay.save(); p.add_effect( effect_currently_busy, 1_days ); - g->u.cash -= 200000; add_msg( m_good, _( "%s drops the logs off in the garage..." ), p.name ); } @@ -463,7 +458,6 @@ void talk_function::buy_100_logs( npc &p ) bay.save(); p.add_effect( effect_currently_busy, 7_days ); - g->u.cash -= 1200000; add_msg( m_good, _( "%s drops the logs off in the garage..." ), p.name ); } diff --git a/src/player.cpp b/src/player.cpp index a497b22ccbda7..446c71dd13c75 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -7878,57 +7878,6 @@ static const std::vector bio_cqb_styles {{ matype_id{ "style_karate" }, matype_id{ "style_judo" }, matype_id{ "style_muay_thai" }, matype_id{ "style_biojutsu" } }}; -class ma_style_callback : public uimenu_callback -{ -private: - size_t offset; - const std::vector &styles; - -public: - ma_style_callback( int style_offset, const std::vector &selectable_styles ) - : offset( style_offset ) - , styles( selectable_styles ) - {} - - bool key(const input_context &ctxt, const input_event &event, int entnum, uimenu *menu) override { - const std::string action = ctxt.input_to_action( event ); - if( action != "SHOW_DESCRIPTION" ) { - return false; - } - matype_id style_selected; - const size_t index = entnum; - if( index >= offset && index - offset < styles.size() ) { - style_selected = styles[index - offset]; - } - if( !style_selected.str().empty() ) { - const martialart &ma = style_selected.obj(); - std::ostringstream buffer; - buffer << ma.name << "\n\n \n\n"; - if( !ma.techniques.empty() ) { - buffer << ngettext( "Technique:", "Techniques:", ma.techniques.size() ) << " "; - buffer << enumerate_as_string( ma.techniques.begin(), ma.techniques.end(), []( const matec_id &mid ) { - return string_format( "%s: %s", _( mid.obj().name.c_str() ), _( mid.obj().description.c_str() ) ); - } ); - } - if( ma.force_unarmed ) { - buffer << "\n\n \n\n"; - buffer << _( "This style forces you to use unarmed strikes, even if wielding a weapon." ); - } - if( !ma.weapons.empty() ) { - buffer << "\n\n \n\n"; - buffer << ngettext( "Weapon:", "Weapons:", ma.weapons.size() ) << " "; - buffer << enumerate_as_string( ma.weapons.begin(), ma.weapons.end(), []( const std::string &wid ) { - return item::nname( wid ); - } ); - } - popup(buffer.str(), PF_NONE); - menu->redraw(); - } - return true; - } - ~ma_style_callback() override = default; -}; - bool player::pick_style() // Style selection menu { enum style_selection { @@ -11173,7 +11122,8 @@ bool player::wield_contents( item &container, int pos, bool penalties, int base_ container.contents.erase( target ); container.on_contents_changed(); - inv.assign_empty_invlet( weapon, *this, true ); + inv.update_invlet( weapon ); + inv.update_cache_with_item( weapon ); last_item = weapon.typeId(); /** diff --git a/summary30.txt b/summary30.txt index 8e4f19f4e86d3..8bf3dd47b392d 100644 --- a/summary30.txt +++ b/summary30.txt @@ -82,7 +82,7 @@ Infrastructure JSONized mapgen_basement_junk.cpp gunsafe Balance Remove kinetic bullet puller from paper cartridge uncraft recipe Balance Allow placement of reinforced machines through place_vending and fix the low amount of spawned items Infrastructure Astyling continues... -Balnace Raised 2x4 ingredient req from 1 to 2 for some arrows +Balance Raised 2x4 ingredient req from 1 to 2 for some arrows Features Always save the latest created character as a template "Last Character". Interface Color NPC/Player background cyan when grabbed. Balance Added gunsmith kit to tools_gunsmith itemgroup @@ -97,4 +97,4 @@ Bugfixes Fix spiritual applying morale too soon Infrastructure Show that palettes can include toilets Bugfixes Remove ammo recipe uncraft duplicates Bugfixes Razorclaws avoid metal wreckage -I18N Translated sentence in veh_interact.cpp \ No newline at end of file +I18N Translated sentence in veh_interact.cpp diff --git a/summary34.txt b/summary34.txt new file mode 100644 index 0000000000000..75b69206ca670 --- /dev/null +++ b/summary34.txt @@ -0,0 +1,75 @@ +Infrastructure Removed dk and lt prefixes from enums in code +Infrastructure Removed dk and lt prefixes from strings in code +Content Second variant of s_bikeshop +Infrastructure Add tests that validate crafting container handling. +Balance Added CARGO flag and size to vehicle aisles +Interface Improved bionics UX +Infrastructure Add explicit namespace to calls to newin: +Infrastructure Remove unused function show_mutations_titlebar +Balance Forbid understanding the messages on the signs for illiterate characters +Infrastructure Obsoleted crude brick +Bugfixes Rad-immune player is now protected from zombie scientist's radiation beam +I18N Show localized monster attitude and size names +Mods Moved light and heavy snare kits to More Survival Tools mod +Content Canned meat can be heated up +Content Add MShockXotto+ tileset +Bugfixes Fix uimenu redraw +Infrastructure Add error checking and reporting to cata_tiles.cpp +Infrastructure Implement time_point and time_duration classes +Infrastructure Convert line endings of Xotto+ tileset to LF +Performance Speed up cache generation in z-level mode +Interface Rope, wire and barbed wire fences are now built and removed through the construction menu +Bugfixes Allow [r]eloading of watertight containers +Content Added restroom to s_arcade +Bugfixes Restricts minimum texture size to fix crash during division by zero +Content Added Tokarev pistol spawns +Content Added rack of obscure ammo to gunsmith store +Features Sawing metal long action +Balance Reduced monster spawn in school +Balance Switched safety glasses to OUTER layer +Balance Replaced 7.62x39mm M43 with 57-N-231, buffing it +Balance Buffed kevlar vest and SWAT armor +Balance Buffed .22 CB recoil to 39 +Balance Nerfed .38 Super to "damage": 27 +Content adds descriptions to (not all) furniture objects +Infrastructure Move hardcoded hospital mapgen to json +Content Small town buildings +Content Subway +Mods Added .50 BMG overrides to Extended Realistic Guns mod +Mods Craftable guns overhaul +Mods Removed and replaced antique_guns itemgroups from Extended Realistic Guns mod +Mods Restored the original recipes for modified CW-24/CW-24M, and updated them +Content Glock-17 And Glock Drum Magazines +Bugfixes hostile NPC unweild handcuffs exploit +Bugfixes Remove plastic material type from zombie pheromones. +Content Hallucination monsters are now described in extended description +Bugfixes Reach melee attacks with conductive weapons now will trigger the zapback +Bugfixes Vehicles shouldn't collide with hallucinations - take two +Features Add stimulant/painkiller overdose symptoms. +Interface horizontal emoticon style interface option +Balance Make all woods soup recipes the same +Bugfixes Make the special brownie a food +Content Added glazed tenderloin to house_patio +Balance Raised time required to craft radio activation mod from 1 minute to 15 minutes +Balance Buffd 700nx damage +Bugfixes Containers with food will be opened when player is feeding the npc with it +Bugfixes Don't consume cards if doors are already open +Bugfixes Don't turn nonflammable terrain with flammable furniture on it (such as chair on the rock floor) into dirt after burning +Balance Drawing own blood increases hunger and thirst and causes pain +Bugfixes Reduced zed move speed while underwater +Infrastructure Removed lots of unused static consts from mutation.cpp +Bugfixes Fix generation of subway stations and tunnels on Z-level -2 +Infrastructure Change most function signatures to use catacurses::window +Infrastructure Change various variables to be of type time_point / time_duration. +Bugfixes Prevented trading simplified active bombs and grenades to NPC +Bugfixes Make advanced electronic cigarette a drug +Content Added PERMEABLE and "connects_to": "WALL", to rebar cage and set move_cost to 0 +Bugfixes Make sandwiches non-reversible +Balance Autofire rebalance +Mods Added vehicle parts, items and recipes to Blaze Mod +Balance Made shopping carts' baskets unpassable +Mods Add "Mutant NPCs" mod. +Features Add trait groups. +Interface Use scrollbar at morale screen +Infrastructure Change catacurses::window to store a shared pointer +Infrastructure Extract events system to separate class