From 6897bc14bd681f74179c491501b959f357202ca0 Mon Sep 17 00:00:00 2001 From: AlisW02 <63066930+AlisW02@users.noreply.github.com> Date: Thu, 14 May 2020 12:42:39 -0700 Subject: [PATCH 01/33] better descriptions for appliances I've changed most of the descriptions to the appliances, largely giving them more consistency, descriptiveness, and, hopefully, usefulness. I've tried to keep things more consistently serious, albeit with a handful of minor jokes, to keep more in line with the game's atmosphere and tone. --- .../furniture-appliances.json | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/data/json/furniture_and_terrain/furniture-appliances.json b/data/json/furniture_and_terrain/furniture-appliances.json index 2160d9d039a6e..4c6a0660d6b23 100644 --- a/data/json/furniture_and_terrain/furniture-appliances.json +++ b/data/json/furniture_and_terrain/furniture-appliances.json @@ -4,7 +4,7 @@ "id": "f_air_conditioner", "name": "cooling unit", "looks_like": "t_machinery_light", - "description": "A big, blocky metal device for refrigerating large areas.", + "description": "A large, blocky appliance encased in sheet metal. This commonplace fixture is used for cooling large indoor areas.", "symbol": "{", "bgcolor": "white", "move_cost_mod": -1, @@ -44,7 +44,7 @@ "type": "furniture", "id": "f_air_filter", "name": "central air filter", - "description": "Cleans out dust mites, smoke particles, and more!", + "description": "A large synthetic membrane used to filter out dust, smoke, mites, and other contaminants from air that passes through it.", "symbol": "#", "bgcolor": "white", "move_cost_mod": -1, @@ -85,7 +85,7 @@ "id": "f_dishwasher", "name": "dishwasher", "looks_like": "f_oven", - "description": "This metal box used to spray hot water and soap at dirty dishes to make them clean and to save people an unpleasant chore. Now, with the power gone and it sitting for a while, it's starting to smell a bit off.", + "description": "A large, boxy machine that uses hot water and soap to efficiently clean batches of dishes. Now that it's sat powerless for a while, a putrid scent of rot is leaking from inside.", "symbol": "{", "bgcolor": "white", "move_cost_mod": -1, @@ -129,7 +129,7 @@ "type": "furniture", "id": "f_dryer", "name": "dryer", - "description": "'Dry your clothes!' would be what you'd do if electricity was running.", + "description": "A common household appliance used to quickly dry large batches of clothing, after they have been washed.", "symbol": "{", "bgcolor": "white", "move_cost_mod": -1, @@ -170,7 +170,7 @@ "id": "f_fridge", "name": "refrigerator", "symbol": "{", - "description": "Freeze your food with the amazing science of electricity! Oh wait, none is flowing. Well, as long as you don't open it, maybe it'll stay cool for awhile.", + "description": "A tall metal storage container that, if powered, will freeze food and other perishables for preservation.", "color": "light_cyan", "move_cost_mod": -1, "coverage": 90, @@ -216,7 +216,7 @@ "name": "glass door fridge", "symbol": "{", "color": "light_cyan", - "description": "Wow! See INTO your fridge before you open it and discover it's not working!", + "description": "A modern refrigerator with a thick sheet of glass in the door, often specially treated to be more insulative. Allows seeing the contents without letting out the cold air, which used to be a minor convenience, and now saves precious minutes until spoilage.", "move_cost_mod": -1, "coverage": 90, "required_str": 10, @@ -260,7 +260,7 @@ "id": "f_home_furnace", "name": "furnace", "looks_like": "t_sewage_pipe", - "description": "A gas-powered forced-air central heating unit, with an internal fan to push the air through a building's air ducts and keep it warm.", + "description": "A gas-powered forced-air central heating unit, with an internal fan to push the air through a building's ventilation system to keep it warm.", "symbol": "0", "bgcolor": "white", "move_cost_mod": -1, @@ -300,7 +300,7 @@ "type": "furniture", "id": "f_washer", "name": "washing machine", - "description": "You could wash your dirty clothes if electricity was running.", + "description": "A large, chunky machine that uses soap and large amounts of water to wash batches of clothes with minimal effort.", "symbol": "{", "bgcolor": "white", "move_cost_mod": -1, @@ -343,7 +343,7 @@ "id": "f_oven", "name": "oven", "symbol": "#", - "description": "Used for heating and cooking food with electricity. Doesn't look like it's working, although it still has parts. It might be safe to light a fire inside of it, if you had to.", + "description": "A standard convection-based oven, commonly used for heating and cooking food. Despite it no longer working, you could safely light a fire inside.", "color": "dark_gray", "move_cost_mod": 2, "coverage": 60, @@ -383,7 +383,7 @@ "id": "f_bellows", "name": "blacksmith bellows", "symbol": "#", - "description": "Used for delivering air to increase the combustion and heat output of a forge. Doesn't look like it's working, although it still has parts.", + "description": "An old device for pushing air into a blacksmith's forge to strengthen the fire and maintain a high temperature. Useless in its current state, but good for parts.", "color": "dark_gray", "looks_like": "t_machinery_old", "move_cost_mod": 2, @@ -417,7 +417,7 @@ "id": "f_drophammer", "name": "blacksmith drop hammer", "symbol": "#", - "description": "Used for fast production of metal items. Doesn't look like it's working, although it still has parts.", + "description": "An anvil with a large metal hammer suspended above it in a metal framework. If it were working, it would be useful for shaping softened metal plates, though now it is only useful for parts.", "color": "white", "looks_like": "t_machinery_old", "move_cost_mod": 2, @@ -453,7 +453,7 @@ "type": "furniture", "id": "f_shredder", "name": "document shredder", - "description": "It's not all about hiding government secrets, sometimes you just want to stop identity theft.", + "description": "A simple electronic device mounted to a large basket. It is designed to efficiently destroy paper documents with sensitive information. Good for parts, as identity theft and corporate espionage probably aren't big concerns anymore.", "symbol": "H", "bgcolor": "white", "move_cost_mod": 5, @@ -496,7 +496,7 @@ "id": "f_server", "looks_like": "f_utility_shelf", "name": "server stack", - "description": "This is a big pile of computers. They're all turned off.", + "description": "A large rack of specialized computers for storing and transmitting information. Powerless and largely useless for its intended purpose, the laptops mounted inside can still be used if removed.", "symbol": ":", "color": "blue_white", "move_cost_mod": -1, @@ -532,7 +532,7 @@ "id": "f_satellite", "name": "large satellite dish", "looks_like": "t_radio_tower", - "description": "Somewhere up there, there are still satellites, orbiting and doing their thing, sending signals down to an Earth that is no longer listening.", + "description": "A large concave metal panel with simple electronics used to receive signals from sattelites. While the hundreds of expensive machines orbitting the planet will likely continue to function indefinately, their various purposes have all been lost.", "symbol": ")", "color": "white_green", "move_cost_mod": -1, @@ -573,7 +573,7 @@ "type": "furniture", "id": "f_solar_unit", "name": "mounted solar panel", - "description": "A mounted solar panel.", + "description": "A set of photovoltaic power generators, which turns solar radiation into useable electricity. While useful before the cataclysm, they have become priceless tools, invaluable to any survivor.", "symbol": "#", "color": "yellow", "move_cost_mod": 2, From 462ebfef104b00412709d4bb207aca146c92642d Mon Sep 17 00:00:00 2001 From: AlisW02 <63066930+AlisW02@users.noreply.github.com> Date: Thu, 14 May 2020 13:27:54 -0700 Subject: [PATCH 02/33] updated descriptions --- .../furniture_and_terrain/furniture-barriers.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/data/json/furniture_and_terrain/furniture-barriers.json b/data/json/furniture_and_terrain/furniture-barriers.json index 28935f92c3872..a0e4260978b67 100644 --- a/data/json/furniture_and_terrain/furniture-barriers.json +++ b/data/json/furniture_and_terrain/furniture-barriers.json @@ -5,7 +5,7 @@ "name": "road barricade", "symbol": "#", "bgcolor": "yellow", - "description": "A road barricade. For barricading roads.", + "description": "A large wooden blockade used to block passage through a road. It is lined with reflective tape to increase visibility. Despite the name, it does little to stop a moving car.", "move_cost_mod": -1, "coverage": 30, "required_str": 5, @@ -27,7 +27,7 @@ "symbol": "#", "looks_like": "f_sandbag_half", "bgcolor": "brown", - "description": "An earthbag barricade, typically used for blocking bullets.", + "description": "A low wall made of stacked earthbags, commonly used to catch bullets and block flooding.", "move_cost_mod": -1, "coverage": 60, "required_str": -1, @@ -61,7 +61,7 @@ "bgcolor": "brown", "move_cost_mod": -1, "coverage": 95, - "description": "An earthbag wall.", + "description": "A wall of stacked earthbags, a bit taller than an average adult.", "required_str": -1, "flags": [ "NOITEM", "BLOCKSDOOR", "EASY_DECONSTRUCT", "MINEABLE", "BLOCK_WIND" ], "deconstruct": { "items": [ { "item": "earthbag", "count": 20 } ], "furn_set": "f_earthbag_half" }, @@ -78,7 +78,7 @@ "type": "furniture", "id": "f_lane", "name": "lane guard", - "description": "Used to be used for keeping traffic.", + "description": "A simple wooden post to mark the separation between street lanes.", "symbol": "#", "color": "brown", "move_cost_mod": 1, @@ -98,7 +98,7 @@ "name": "sandbag barricade", "symbol": "#", "bgcolor": "brown", - "description": "A sandbag barricade, typically used for blocking bullets.", + "description": "A low wall made of canvas sacks filled with sand, commonly used to catch bullets and prevent flooding.", "move_cost_mod": -1, "coverage": 60, "required_str": -1, @@ -131,7 +131,7 @@ "bgcolor": "brown", "move_cost_mod": -1, "coverage": 95, - "description": "A sandbag wall.", + "description": "A wall of stacked sandbags, a bit taller than an average adult.", "required_str": -1, "flags": [ "NOITEM", "BLOCKSDOOR", "EASY_DECONSTRUCT", "MINEABLE", "BLOCK_WIND" ], "deconstruct": { "items": [ { "item": "sandbag", "count": 20 } ], "furn_set": "f_sandbag_half" }, From 2b9b54e10d45fd1e968c5ce6f61453013b5a1f74 Mon Sep 17 00:00:00 2001 From: AlisW02 <63066930+AlisW02@users.noreply.github.com> Date: Thu, 14 May 2020 14:10:36 -0700 Subject: [PATCH 03/33] updated descriptions --- .../furniture-decorative.json | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/data/json/furniture_and_terrain/furniture-decorative.json b/data/json/furniture_and_terrain/furniture-decorative.json index f5124ba5a3d5d..8c722e18c1a06 100644 --- a/data/json/furniture_and_terrain/furniture-decorative.json +++ b/data/json/furniture_and_terrain/furniture-decorative.json @@ -4,7 +4,7 @@ "id": "f_bigmirror", "name": "standing mirror", "symbol": "{", - "description": "Lookin' good - is that blood?", + "description": "A full-length mirror mounted in a sleek metal frame. You can easily see all of the dirt and blood on your clothes, and the weariness in your eyes.", "color": "white", "move_cost_mod": 2, "coverage": 80, @@ -24,7 +24,7 @@ "type": "furniture", "id": "f_bigmirror_b", "name": "broken standing mirror", - "description": "You could look at yourself, if the mirror wasn't covered in cracks and fractures.", + "description": "A metal frame for a full-length mirror, with most of the mirror missing. What remains in the frame are large dangerous-looking shards of fractured glass.", "symbol": "{", "color": "light_gray", "move_cost_mod": 2, @@ -43,7 +43,7 @@ "id": "f_bitts", "type": "furniture", "name": "bitts", - "description": "Paired vertical iron posts mounted on a wharf, pier or quay. They are used to secure mooring lines, ropes, hawsers, or cables.", + "description": "A pair of vertical iron posts mounted on a wharf, pier, or other form of dock. They are used to secure mooring lines, ropes, and similar.", "symbol": "B", "color": "light_gray", "move_cost_mod": 2, @@ -62,7 +62,7 @@ "type": "furniture", "id": "f_shackle", "name": "manacles", - "description": "Chain serfs in your dungeon. All you need now is an iron ball to chain to it.", + "description": "A pair of metal shackles with heavy chains mounted to a wall or floor.", "symbol": "8", "color": "light_gray", "move_cost_mod": 1, @@ -80,7 +80,7 @@ "type": "furniture", "id": "f_statue", "name": "statue", - "description": "A carved statue made of stone.", + "description": "A massive block of stone that has been carefully carved into a work of timeless art.", "symbol": "S", "color": "dark_gray", "move_cost_mod": -1, @@ -99,7 +99,7 @@ "type": "furniture", "id": "f_mannequin", "name": "mannequin", - "description": "Put clothes on it, talk to it. Who's around to judge you? Wait… did it just move?", + "description": "A life-size wooden figure of a person, most commonly used to display clothing in stores, or for tailors to design outfits on. Considering all that's happened, something about it is somewhat unnerving.", "symbol": "@", "color": "brown", "move_cost_mod": 2, @@ -118,7 +118,7 @@ "type": "furniture", "id": "f_birdbath", "name": "birdbath", - "description": "A decorative cement birdbath and pedestal.", + "description": "A wide stone bowl mounted to a pedestal, usually filled with rainwater, meant for birds to play or bathe in.", "symbol": "o", "color": "light_gray", "move_cost_mod": -1, @@ -136,7 +136,7 @@ "type": "furniture", "id": "f_rotary_clothesline", "name": "rotary clothes dryer line", - "description": "A umbrella shaped clothes line mounted on a pole.", + "description": "A central metal pole holding up a wide rotating frame, this would be used to hang up clothes to dry in the sunlight.", "symbol": "X", "color": "white", "move_cost_mod": -2, @@ -159,7 +159,7 @@ "name": "floor lamp", "symbol": "T", "looks_like": "f_rack_coat", - "description": "A tall standing lamp, meant to plug into a wall and light up a room.", + "description": "A light mounted on the top of a metal pole, this would be plugged into a wall socket to illuminate a room.", "color": "light_gray", "move_cost_mod": 2, "required_str": 1, @@ -202,7 +202,7 @@ "type": "furniture", "id": "f_decorative_tree", "name": "decorative tree", - "description": "A decorative tree for the winter holidays.", + "description": "A decorative pine tree littered with ornaments for the winter holidays.", "symbol": "+", "color": "light_green", "looks_like": "t_tree_pine", From d6f61e4b71e0ced42f7ea6a80cb677a3a398098c Mon Sep 17 00:00:00 2001 From: AlisW02 <63066930+AlisW02@users.noreply.github.com> Date: Thu, 14 May 2020 14:23:50 -0700 Subject: [PATCH 04/33] updated descriptions --- .../furniture-domestic_plants.json | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/data/json/furniture_and_terrain/furniture-domestic_plants.json b/data/json/furniture_and_terrain/furniture-domestic_plants.json index 316c8c1e5bad1..9dd645a99caa7 100644 --- a/data/json/furniture_and_terrain/furniture-domestic_plants.json +++ b/data/json/furniture_and_terrain/furniture-domestic_plants.json @@ -6,7 +6,7 @@ "symbol": "^", "color": "green", "move_cost_mod": 2, - "description": "A variety of plant, used for decoration.", + "description": "A small potted plant, used for decoration indoors. It appears to have dried up and died a while ago.", "required_str": 5, "max_volume": "10 L", "flags": [ "CONTAINER", "FLAMMABLE_ASH", "PLACE_ITEM", "ORGANIC", "TINY", "TRANSPARENT", "EASY_DECONSTRUCT" ], @@ -39,7 +39,7 @@ "type": "furniture", "id": "f_indoor_plant_y", "name": "yellow indoor plant", - "description": "A variety of plant for decoration. It's yellow.", + "description": "A decorative potted plant with a yellow flower, it looks to have wilted and died some time ago.", "symbol": "^", "color": "yellow", "move_cost_mod": 2, @@ -75,7 +75,7 @@ "type": "furniture", "id": "f_plant_harvest", "name": "harvestable plant", - "description": "This plant is ready for harvest. Examine it more closely to identify how to harvest the plant appropriately.", + "description": "This plant is fully grown and ready to be harvested. Identifying how to harvest it requires closer examination.", "symbol": "#", "color": "light_green", "move_cost_mod": 0, @@ -89,7 +89,7 @@ "type": "furniture", "id": "f_plant_mature", "name": "mature plant", - "description": "This plant has matured.", + "description": "This plant has matured, and will be ready to harvest before long.", "symbol": "#", "color": "green", "move_cost_mod": 0, @@ -103,7 +103,7 @@ "type": "furniture", "id": "f_plant_seed", "name": "seed", - "description": "A humble planted seed. Actions are the seed of fate deeds grow into destiny.", + "description": "A freshly planted seed. If properly tended to, it could grow into a healthy plant.", "symbol": "^", "color": "brown", "move_cost_mod": 0, @@ -117,7 +117,7 @@ "type": "furniture", "id": "f_plant_seedling", "name": "seedling", - "description": "This plant is just getting started.", + "description": "A seed that has just begun to sprout its first roots.", "symbol": "^", "color": "green", "move_cost_mod": 0, @@ -165,7 +165,7 @@ "type": "furniture", "id": "f_planter_harvest", "name": "planter with harvestable plant", - "description": "A garden planter full of soil and slatted to allow adequate drainage. Can be used for planting crops. This one contains a planted seed", + "description": "A garden planter full of soil and slatted to allow adequate drainage. This one has a fully grown plant, and will need closer examination to harvest.", "symbol": "#", "color": "light_green", "looks_like": "f_plant_harvest", @@ -199,7 +199,7 @@ "type": "furniture", "id": "f_planter_mature", "name": "planter with mature plant", - "description": "A garden planter full of soil and slatted to allow adequate drainage. Can be used for planting crops. This one contains a planted seed", + "description": "A garden planter full of soil and slatted to allow adequate drainage. This one has a matured plant that should be ready for harvest before long.", "symbol": "#", "color": "green", "looks_like": "f_plant_mature", @@ -233,7 +233,7 @@ "type": "furniture", "id": "f_planter_seed", "name": "planter with seed", - "description": "A garden planter full of soil and slatted to allow adequate drainage. Can be used for planting crops. This one contains a planted seed", + "description": "A garden planter full of soil and slatted to allow adequate drainage. This one contains a planted seed, and will need attention to grow fully.", "symbol": "^", "color": "brown", "looks_like": "f_plant_seed", @@ -267,7 +267,7 @@ "type": "furniture", "id": "f_planter_seedling", "name": "planter with seedling", - "description": "A garden planter full of soil and slatted to allow adequate drainage. Can be used for planting crops. This one contains a planted seedling", + "description": "A garden planter full of soil and slatted to allow adequate drainage. This one has a seed that has just begun to sprout its first roots.", "symbol": "^", "color": "green", "looks_like": "f_plant_seedling", From 9688954305ec1bded215b1a83d4990c8fed08e61 Mon Sep 17 00:00:00 2001 From: AlisW02 <63066930+AlisW02@users.noreply.github.com> Date: Thu, 14 May 2020 14:33:13 -0700 Subject: [PATCH 05/33] updated descriptions --- data/json/furniture_and_terrain/furniture-eggs.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/data/json/furniture_and_terrain/furniture-eggs.json b/data/json/furniture_and_terrain/furniture-eggs.json index 3c93235d58e73..cbfd53ed08368 100644 --- a/data/json/furniture_and_terrain/furniture-eggs.json +++ b/data/json/furniture_and_terrain/furniture-eggs.json @@ -3,7 +3,7 @@ "type": "furniture", "id": "f_egg_sackbw", "name": "spider egg sack", - "description": "Much too large, off-white egg sack. Kind of icky. Something IS moving in there.", + "description": "A sizable, off-white sac of large eggs. Upon watching closer, you can see them moving slightly. Gross.", "symbol": "O", "color": "white", "move_cost_mod": 3, @@ -16,7 +16,7 @@ "type": "furniture", "id": "f_egg_sackcs", "name": "spider egg sack", - "description": "Bulbous mass of spider eggs. More than kind of icky. Something IS moving in there.", + "description": "A bulbous mass of off-white spider eggs. Upon watching closer, you can see them moving a bit. Really gross.", "symbol": "O", "color": "white", "move_cost_mod": 3, @@ -29,7 +29,7 @@ "type": "furniture", "id": "f_egg_sackws", "name": "spider egg sack", - "description": "A horrifyingly oversized egg sack. Something IS moving in there. If you're seeing this, you're already too close to it.", + "description": "A gigantic sac of spider's eggs, each one larger than your fist. They're definitely moving around. Really gross, just seeing it makes your skin crawl.", "symbol": "O", "color": "yellow", "move_cost_mod": 3, @@ -42,7 +42,7 @@ "type": "furniture", "id": "f_egg_sacke", "name": "ruptured egg sack", - "description": "Super icky. Spider stuff's spilling out.", + "description": "A disgusting ruptured sac of giant spider eggs. The thought of all those massive baby spiders pouring out of it is almost terrifying on its own.", "symbol": "X", "color": "white", "move_cost_mod": 3, From 5fa24aa184927b8453586c0b1642c5eae133d446 Mon Sep 17 00:00:00 2001 From: AlisW02 <63066930+AlisW02@users.noreply.github.com> Date: Thu, 14 May 2020 14:45:19 -0700 Subject: [PATCH 06/33] updated descriptions --- data/json/furniture_and_terrain/furniture-fireplaces.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/data/json/furniture_and_terrain/furniture-fireplaces.json b/data/json/furniture_and_terrain/furniture-fireplaces.json index 535e2fc19afb0..ca87ea60bff5f 100644 --- a/data/json/furniture_and_terrain/furniture-fireplaces.json +++ b/data/json/furniture_and_terrain/furniture-fireplaces.json @@ -4,7 +4,7 @@ "id": "f_fireplace", "name": "fireplace", "symbol": "#", - "description": "Ah. The relaxation of sitting in front of a fire as the world around you crumbles. Towards the End, you could also get this service on your television.", + "description": "A common fixture for safely hosting a fire indoors, with a chimney to vent the smoke to the outside. Dangerous to leave unattended while lit.", "bgcolor": "white", "move_cost_mod": 2, "coverage": 50, @@ -25,7 +25,7 @@ "name": "wood stove", "symbol": "#", "bgcolor": "red", - "description": "Wood stove for heating and cooking. Much more efficient than an open flame.", + "description": "A simple metal stove for hosting wood-fueled fires. Good for cooking or heating food, and safe to have indoors.", "move_cost_mod": 2, "coverage": 60, "required_str": 10, @@ -70,7 +70,7 @@ "type": "furniture", "id": "f_55gal_firebarrel", "name": "fire barrel (200L)", - "description": "A large metal barrel used to contain a fire. It has multiple holes punched in its walls for air supply. Fires set in a fire barrel will not spread to surrounding flammable objects.", + "description": "A huge metal barrel used to safely contain a fire. It has multiple holes punched in the walls for air supply.", "symbol": "#", "color": "red", "looks_like": "55gal_drum", @@ -96,7 +96,7 @@ "type": "furniture", "id": "f_30gal_firebarrel", "name": "fire barrel (100L)", - "description": "A large metal barrel used to contain a fire. It has multiple holes punched in its walls for air supply. Fires set in a fire barrel will not spread to surrounding flammable objects.", + "description": "A large metal barrel used to safely contain a fire. It has multiple holes punched in the walls for air supply.", "symbol": "#", "color": "red", "looks_like": "30gal_drum", From 3ede305cfa5490939d00bf688e9a00ce4d54ebc0 Mon Sep 17 00:00:00 2001 From: AlisW02 <63066930+AlisW02@users.noreply.github.com> Date: Thu, 14 May 2020 15:03:59 -0700 Subject: [PATCH 07/33] Update furniture-fungal.json --- data/json/furniture_and_terrain/furniture-fungal.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/data/json/furniture_and_terrain/furniture-fungal.json b/data/json/furniture_and_terrain/furniture-fungal.json index ea0529048d104..87522deef9093 100644 --- a/data/json/furniture_and_terrain/furniture-fungal.json +++ b/data/json/furniture_and_terrain/furniture-fungal.json @@ -3,7 +3,7 @@ "type": "furniture", "id": "f_flower_marloss", "name": "marloss flower", - "description": "This flower is like the other flowers taken by the mushrooms, but its bulb is colored a brilliant cyan color, and it emits an aroma both overwhelming and… delicious?", + "description": "This flower is like the other flowers taken by the mushrooms, but its bulb is colored a brilliant cyan color. It emits an aroma both overwhelming and strangely alluring.", "symbol": "f", "color": "cyan", "move_cost_mod": 1, @@ -16,7 +16,7 @@ "type": "furniture", "id": "f_flower_fungal", "name": "fungal flower", - "description": "This flower has been overgrown by gray, sinewy tendrils of fungus, and the color has leached from its petals and stem. It gently sways of its own volition.", + "description": "This flower has been overgrown by gray, sinewy tendrils of fungus, and the color has been leached from its petals and stem. It gently sways of its own volition, maintaining an unsettling rhythm.", "symbol": "f", "color": "dark_gray", "move_cost_mod": 1, @@ -29,7 +29,7 @@ "type": "furniture", "id": "f_fungal_mass", "name": "fungal mass", - "description": "Thick ropes of mycal matter have covered the ground here completely. It's soft to the touch, but you sink into it, making moving across it difficult.", + "description": "Thick ropes of mycal matter have covered the ground here completely. It's soft to the touch, but not firm enough to hold any weight.", "symbol": "O", "bgcolor": "dark_gray", "move_cost_mod": -10, @@ -41,7 +41,7 @@ "type": "furniture", "id": "f_fungal_clump", "name": "fungal clump", - "description": "Alien mold and stems mingle tightly here, creating a sort of fungal bush.", + "description": "Alien mold and stems mingle tightly here, swaying around and weaving together, creating a sort of fungal bush.", "symbol": "#", "bgcolor": "light_gray", "move_cost_mod": 3, From 63b6dd583aecee275fddfff701df916422329020 Mon Sep 17 00:00:00 2001 From: AlisW02 <63066930+AlisW02@users.noreply.github.com> Date: Thu, 14 May 2020 15:14:12 -0700 Subject: [PATCH 08/33] Update furniture-graves.json --- data/json/furniture_and_terrain/furniture-graves.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/data/json/furniture_and_terrain/furniture-graves.json b/data/json/furniture_and_terrain/furniture-graves.json index 0e5a1893e744e..34c04fb89bb3e 100644 --- a/data/json/furniture_and_terrain/furniture-graves.json +++ b/data/json/furniture_and_terrain/furniture-graves.json @@ -3,7 +3,7 @@ "type": "furniture", "id": "f_slab", "name": "stone slab", - "description": "A flat slab of heavy stone.", + "description": "A slab of heavy stone, with a reasonably flat surface.", "symbol": "n", "color": "dark_gray", "move_cost_mod": 2, @@ -23,7 +23,7 @@ "type": "furniture", "id": "f_grave_head", "name": "headstone", - "description": "Keeps the bodies.", + "description": "A large slab of stone, engraved with information on the deceased individual buried beneath. While only a solemn reminder of the uncountable losses of the Cataclysm, a proper final resting place grants an odd sense of peace.", "symbol": "_", "color": "light_gray", "move_cost_mod": 0, @@ -42,7 +42,7 @@ "type": "furniture", "id": "f_grave_stone", "name": "gravestone", - "description": "Keeps the bodies. More fancy.", + "description": "An upright slab of stone with information engraved on the face about whoever lies beneath. While only a solemn reminder of the countless casualties of the Cataclysm, a proper final resting place grants an odd sense of peace.", "symbol": "^", "color": "light_gray", "move_cost_mod": 2, @@ -62,7 +62,7 @@ "type": "furniture", "id": "f_grave_stone_old", "name": "worn gravestone", - "description": "A worn-out gravestone.", + "description": "An aged and eroded gravestone, damaged to the point of rendering the inscription illegible. Whoever's buried here was probably lucky enough to pass before all this chaos began.", "symbol": "^", "color": "dark_gray", "move_cost_mod": 2, @@ -81,7 +81,7 @@ "type": "furniture", "id": "f_grave_monument", "name": "obelisk", - "description": "Monument to pride.", + "description": "A magnificent carved statue with an engraved plaque fixed to the base. It serves to honor the passing of somebody significant, something one wishes was still a practical goal.", "symbol": "$", "color": "black_white", "move_cost_mod": -1, From f14a1195212078016bade0dcfea792ad17e54960 Mon Sep 17 00:00:00 2001 From: AlisW02 <63066930+AlisW02@users.noreply.github.com> Date: Thu, 14 May 2020 15:19:08 -0700 Subject: [PATCH 09/33] Update furniture-industrial.json --- data/json/furniture_and_terrain/furniture-industrial.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data/json/furniture_and_terrain/furniture-industrial.json b/data/json/furniture_and_terrain/furniture-industrial.json index 557b592f69b44..d1d94b09dc9bb 100644 --- a/data/json/furniture_and_terrain/furniture-industrial.json +++ b/data/json/furniture_and_terrain/furniture-industrial.json @@ -4,7 +4,7 @@ "id": "f_robotic_assembler", "name": "robotic assembler", "looks_like": "f_robotic_arm", - "description": "A durable and versatile robotic arm with a tool fitted to the end, for working on an assembly line.", + "description": "A durable and versatile robotic arm with a tool fitted to the end, for working on an assembly line. Despite its specialized purpose being all but lost now, it could provide a plethora of useful parts if disassembled.", "symbol": "3", "color": "magenta_cyan", "move_cost_mod": -1, @@ -46,7 +46,7 @@ { "type": "furniture", "id": "f_chemical_mixer", - "description": "When chemicals need to be mixed in large quantities at just the right combinations and temperatures, this is the tool for the job.", + "description": "A large vat with a motorized mixing device for combining large quantities of chemicals.", "name": "chemical mixer", "symbol": "0", "color": "red_green", @@ -82,7 +82,7 @@ "type": "furniture", "id": "f_robotic_arm", "name": "robotic arm", - "description": "Automation! Science! Industry! Make a better horse! This robot arm promises to do it all. Except it's currently unpowered. You could remove the casing and retrieve the electronics through disassembly.", + "description": "An automated robotic arm used in assembly lines, which appears to be more general-purpose than specially designed assemblers. Despite being functionless now, the parts could be useful.", "symbol": "&", "bgcolor": "yellow", "move_cost_mod": 3, From 9e39b5eb3cb88d64ef66574465596f98b4a31b24 Mon Sep 17 00:00:00 2001 From: AlisW02 <63066930+AlisW02@users.noreply.github.com> Date: Thu, 14 May 2020 15:45:54 -0700 Subject: [PATCH 10/33] Update furniture-medical.json --- .../furniture-medical.json | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/data/json/furniture_and_terrain/furniture-medical.json b/data/json/furniture_and_terrain/furniture-medical.json index b13c6bf522ebe..5f8a23b7e6eb3 100644 --- a/data/json/furniture_and_terrain/furniture-medical.json +++ b/data/json/furniture_and_terrain/furniture-medical.json @@ -4,7 +4,7 @@ "id": "f_autodoc", "name": "Autodoc Mk. XI", "symbol": "&", - "description": "A surgical apparatus used for installation and removal of bionics. It's only as skilled as its operator.", + "description": "A surgical apparatus used for installation and removal of bionics. The term name 'Autodoc' is something of a misnomer, as it can only operate if programmed beforehand, something that a plethora of labels warn against doing without expertise.", "color": "light_cyan", "looks_like": "f_robotic_arm", "move_cost_mod": -1, @@ -85,7 +85,7 @@ "type": "furniture", "id": "f_autoclave", "name": "autoclave", - "description": "This thing is basically an extremely high tech laundry machine or dishwasher. It steams things at temperatures that will kill almost anything.", + "description": "A device that can steam its contents at high enough tempuratures to completely sterilize them, killing any possible contaminants.", "symbol": "0", "color": "light_blue_white", "move_cost_mod": 3, @@ -129,7 +129,7 @@ "type": "furniture", "id": "f_autoclave_full", "name": "filled autoclave", - "description": "This thing is basically an extremely high tech laundry machine or dishwasher. It steams things at temperatures that will kill almost anything.", + "description": "A device that can steam its contents at high enough tempuratures to completely sterilize them, killing any possible contaminants.", "symbol": "0", "color": "light_blue_white", "move_cost_mod": 3, @@ -172,7 +172,7 @@ "type": "furniture", "id": "f_sample_freezer", "name": "sample freezer", - "description": "When cold just isn't cold enough, you have this extreme deep freeze. This will store stuff at -80 degrees Celsius. Don't lick the metal on the inside.", + "description": "A specialized freezer capable of maintaining tempuratures of -80 Celsieus, and is often used only for the preservation of delicate scientific samples.", "symbol": "[", "bgcolor": "white", "move_cost_mod": 2, @@ -305,7 +305,7 @@ "type": "furniture", "id": "f_shaker", "name": "shaker incubator", - "description": "A tool for keeping broth nicely mixed, at just the right temperature to grow bacteria. This is great for microbiology, but terrible for preserving food.", + "description": "A tool for keeping chemical broth nicely mixed, at just the right temperature to grow bacteria. Although, more bacteria is probably the last thing you need, considering the circumstances.", "symbol": "]", "color": "white_yellow", "move_cost_mod": 3, @@ -344,7 +344,7 @@ "type": "furniture", "id": "f_eyewash", "name": "emergency wash station", - "description": "This pole has a lot of weird nozzles and attachments. If there were running water, you could use those attachments to wash harmful chemicals out of your eyes, or to take a pleasant cold shower in a public place.", + "description": "A standing sink with a pair of nozzles, along with a large and brightly-colored handle. It is specially designed to quickly remove contaminants from the eyes, and is easily usable without being able to see very well. A sizable notice warns against drinking the water it uses.", "symbol": "u", "color": "green", "move_cost_mod": 1, @@ -376,7 +376,7 @@ "type": "furniture", "id": "f_IV_pole", "name": "IV pole", - "description": "This is basically just a stick on wheels with some hooks at the top.", + "description": "A tall wire frame on a set of small wheels used for holding an IV bag, useful for unattended administration.", "symbol": "I", "bgcolor": "white", "move_cost_mod": 0, @@ -402,7 +402,7 @@ "type": "furniture", "id": "f_HPLC", "name": "high performance liquid chromatographer", - "description": "This high-tech tool would, with electricity and an experienced user, be a very useful way to separate chemicals in a liquid or aqueous phase based on their affinity to a solid state medium in a tube. In other words, it's a fancy way to separate things.", + "description": "This high-tech tool would, with electricity and an experienced user, be a very useful way to separate chemicals in a liquid or aqueous state, based on their affinity, into a solid state in a test tube. At least, that's what the label says.", "symbol": ":", "color": "red_white", "move_cost_mod": -1, @@ -447,7 +447,7 @@ "type": "furniture", "id": "f_GC", "name": "gas chromatographer", - "description": "This high-tech tool would, with electricity and an experienced user, be a very useful way to separate chemicals in a gaseous phase based on their affinity to a solid state medium in a tube. In other words, it's a fancy way to separate things.", + "description": "This high-tech tool would, with electricity and an experienced user, be a very useful way to separate chemicals in a gaseous state, based on their affinity, to a solid state in a test tube. At least, that's what the label says.", "symbol": ":", "color": "blue_white", "move_cost_mod": -1, @@ -492,7 +492,7 @@ "type": "furniture", "id": "f_MS", "name": "mass spectrometer", - "description": "Inside this thing is a carefully balanced set of electric field generators that can precisely separate ionized particles based on their charge-to-mass ratio, firing them into a detector that measures the exact mass of the particle hitting it. On the outside, it looks like a very boring white box.", + "description": "Inside this large white box is a carefully balanced set of electric field generators that can precisely separate ionized particles based on their charge-to-mass ratio, firing them into a detector that measures the exact mass of the particle hitting it. Invaluable for particle research and other advanced sciences, it's not as useful anymore.", "symbol": "-", "bgcolor": "white", "move_cost_mod": -1, @@ -533,7 +533,7 @@ "type": "furniture", "id": "f_NMR", "name": "nuclear magnetic resonance spectrometer", - "description": "This is a giant electromagnet in a kind of sci-fi looking housing. Somehow it can be used to wiggle molecular bonds or something, and from there, look at the deepest inner workings of chemical structures! Magnets: how do they work?", + "description": "This is a giant electromagnet with carefully tuned measurement equipment used to observe how magnetic fields interact with nuclear particles.", "symbol": "M", "color": "white_cyan", "move_cost_mod": -1, @@ -573,7 +573,7 @@ "type": "furniture", "id": "f_electron_microscope", "name": "electron microscope", - "description": "An enormous tool for using electron reflections off a surface to see what very tiny things look like. Amazing for taking gross pictures of bugs.", + "description": "An enormous obersvational tool for studying the details of samples on an immensely small scale.", "symbol": "I", "bgcolor": "white", "move_cost_mod": -1, @@ -612,7 +612,7 @@ "type": "furniture", "id": "f_CTscan", "name": "CT scanner", - "description": "This giant donut can take hundreds of x-rays in rapid sequence, making a really cool looking picture of all your innards that have varying degrees of radio-opacity.", + "description": "A massive piece of machinery used to take hundreds of X-ray images from 360 degrees, often used for medical examinations of patients.", "symbol": "o", "bgcolor": "white", "move_cost_mod": 7, @@ -653,7 +653,7 @@ "type": "furniture", "id": "f_MRI", "name": "MRI machine", - "description": "This thing is really an NMR that you stick a person into, but people weren't excited about getting into a tiny hole in a loud machine called a 'nuclear magnetic resonance imager', so they changed it.", + "description": "A massive tool used to take NMR images of a patient placed inside, providing invaluable medical insight.", "symbol": "o", "bgcolor": "cyan", "move_cost_mod": 8, @@ -694,7 +694,7 @@ "type": "furniture", "id": "f_scan_bed", "name": "scanner bed", - "description": "This is a narrow, uncomfortable bed for putting someone into an imaging machine or other small hole.", + "description": "This is a narrow, flat, and frankly uncomfortable bed for putting someone into an imaging machine for medical observations.", "symbol": "I", "bgcolor": "white", "move_cost_mod": 4, @@ -729,7 +729,7 @@ "type": "furniture", "id": "f_anesthetic", "name": "anesthetic machine", - "description": "Keeping a person at just the right level of asleep to do surgery is hard. This machine helps an anesthesiologist keep the right mix of drugs and air to keep a patient asleep.", + "description": "A large machine with various tanks, tubes, and monitoring devices used to maintain precise levels of anesthesia in a patient to ensure they, at least ideally, remain asleep, unfeeling, but alive.", "symbol": "n", "color": "white_red", "move_cost_mod": -1, @@ -775,7 +775,7 @@ "type": "furniture", "id": "f_dialysis", "name": "dialysis machine", - "description": "If your kidneys don't work, this is a large and inconvenient machine that can do the job instead! It's super useful in the apocalypse, especially with how it requires power, tons of supplies, and a trained operator.", + "description": "A large machine for pumping and filtering the blood of somebody without the function of their kidneys. Largely obsolete for those with access to bionics, but a lifeline to those that need it.", "symbol": "8", "bgcolor": "white", "move_cost_mod": -1, @@ -819,7 +819,7 @@ "type": "furniture", "id": "f_ventilator", "name": "medical ventilator", - "description": "When they talk about the 'breathing machine' that you don't want to wind up stuck on, this is what they mean. It just looks like a couple boxes on a trolley.", + "description": "A sizable box on a set of wheels that will pump air in and out of a patient's lungs when they are incapable of breathing, though often only needed temporarily.", "symbol": "F", "color": "blue", "move_cost_mod": -1, From fe0159072293052d7e7e720671927e3de9cebe28 Mon Sep 17 00:00:00 2001 From: AlisW02 <63066930+AlisW02@users.noreply.github.com> Date: Fri, 15 May 2020 08:23:37 -0700 Subject: [PATCH 11/33] Update furniture-medical.json Added some changes as advised by somebody who knows what the hell they're doing with chemistry. (Thank you Torbenbeta) --- data/json/furniture_and_terrain/furniture-medical.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/data/json/furniture_and_terrain/furniture-medical.json b/data/json/furniture_and_terrain/furniture-medical.json index 5f8a23b7e6eb3..00c4546a61987 100644 --- a/data/json/furniture_and_terrain/furniture-medical.json +++ b/data/json/furniture_and_terrain/furniture-medical.json @@ -402,7 +402,7 @@ "type": "furniture", "id": "f_HPLC", "name": "high performance liquid chromatographer", - "description": "This high-tech tool would, with electricity and an experienced user, be a very useful way to separate chemicals in a liquid or aqueous state, based on their affinity, into a solid state in a test tube. At least, that's what the label says.", + "description": "This high-tech tool would, with electricity and an experienced user, be a very useful way to separate chemicals in a liquid or aqueous phase, based on their affinity, to a solid state in a tube. At least, that's what the label says.", "symbol": ":", "color": "red_white", "move_cost_mod": -1, @@ -447,7 +447,7 @@ "type": "furniture", "id": "f_GC", "name": "gas chromatographer", - "description": "This high-tech tool would, with electricity and an experienced user, be a very useful way to separate chemicals in a gaseous state, based on their affinity, to a solid state in a test tube. At least, that's what the label says.", + "description": "This high-tech tool would, with electricity and an experienced user, be a very useful way to separate chemicals in a gaseous phase, based on their affinity, to a solid state in a tube. At least, that's what the label says.", "symbol": ":", "color": "blue_white", "move_cost_mod": -1, @@ -492,7 +492,7 @@ "type": "furniture", "id": "f_MS", "name": "mass spectrometer", - "description": "Inside this large white box is a carefully balanced set of electric field generators that can precisely separate ionized particles based on their charge-to-mass ratio, firing them into a detector that measures the exact mass of the particle hitting it. Invaluable for particle research and other advanced sciences, it's not as useful anymore.", + "description": "Inside this large white box is a carefully balanced set of electric field generators that can precisely separate ionized particles based on their charge-to-mass ratio, firing them into a detector that measures the exact mass of the particle hitting it. Invaluable for chemical analysis and other advanced sciences, it's not as useful anymore.", "symbol": "-", "bgcolor": "white", "move_cost_mod": -1, @@ -533,7 +533,7 @@ "type": "furniture", "id": "f_NMR", "name": "nuclear magnetic resonance spectrometer", - "description": "This is a giant electromagnet with carefully tuned measurement equipment used to observe how magnetic fields interact with nuclear particles.", + "description": "This is a giant electromagnet with carefully tuned measurement equipment used to observe how magnetic fields affect nuclear spins. It is a common workhorse for the discovery and study of chemical structures.", "symbol": "M", "color": "white_cyan", "move_cost_mod": -1, @@ -573,7 +573,7 @@ "type": "furniture", "id": "f_electron_microscope", "name": "electron microscope", - "description": "An enormous obersvational tool for studying the details of samples on an immensely small scale.", + "description": "An enormous observational tool for studying the details of samples on an immensely small scale.", "symbol": "I", "bgcolor": "white", "move_cost_mod": -1, From 1b118caec4b06e0b9359b3286dad4b53345af8de Mon Sep 17 00:00:00 2001 From: AlisW02 <63066930+AlisW02@users.noreply.github.com> Date: Fri, 15 May 2020 10:53:48 -0700 Subject: [PATCH 12/33] Update furniture-medical.json --- data/json/furniture_and_terrain/furniture-medical.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/json/furniture_and_terrain/furniture-medical.json b/data/json/furniture_and_terrain/furniture-medical.json index 00c4546a61987..294ffca2b19a1 100644 --- a/data/json/furniture_and_terrain/furniture-medical.json +++ b/data/json/furniture_and_terrain/furniture-medical.json @@ -402,7 +402,7 @@ "type": "furniture", "id": "f_HPLC", "name": "high performance liquid chromatographer", - "description": "This high-tech tool would, with electricity and an experienced user, be a very useful way to separate chemicals in a liquid or aqueous phase, based on their affinity, to a solid state in a tube. At least, that's what the label says.", + "description": "This high-tech tool would, with electricity and an experienced user, be a very useful way to separate chemicals in a liquid or aqueous phase, based on their affinity, to the stationary phase in a tube. At least, that's what the label says.", "symbol": ":", "color": "red_white", "move_cost_mod": -1, @@ -447,7 +447,7 @@ "type": "furniture", "id": "f_GC", "name": "gas chromatographer", - "description": "This high-tech tool would, with electricity and an experienced user, be a very useful way to separate chemicals in a gaseous phase, based on their affinity, to a solid state in a tube. At least, that's what the label says.", + "description": "This high-tech tool would, with electricity and an experienced user, be a very useful way to separate chemicals in a gaseous phase, based on their affinity, to a stationary phase in a tube. At least, that's what the label says.", "symbol": ":", "color": "blue_white", "move_cost_mod": -1, From 266096d6241965e31cbd75e9b0404d1acda77c72 Mon Sep 17 00:00:00 2001 From: AlisW02 <63066930+AlisW02@users.noreply.github.com> Date: Fri, 15 May 2020 17:05:22 -0700 Subject: [PATCH 13/33] Update furniture-appliances.json --- data/json/furniture_and_terrain/furniture-appliances.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/json/furniture_and_terrain/furniture-appliances.json b/data/json/furniture_and_terrain/furniture-appliances.json index 4c6a0660d6b23..11c38f3a32099 100644 --- a/data/json/furniture_and_terrain/furniture-appliances.json +++ b/data/json/furniture_and_terrain/furniture-appliances.json @@ -129,7 +129,7 @@ "type": "furniture", "id": "f_dryer", "name": "dryer", - "description": "A common household appliance used to quickly dry large batches of clothing, after they have been washed.", + "description": "A common household appliance used to quickly dry large batches of clothing after they have been washed.", "symbol": "{", "bgcolor": "white", "move_cost_mod": -1, From 6bc81902c07100d61ab4045fa1fc66381dd07244 Mon Sep 17 00:00:00 2001 From: Qrox Date: Sat, 16 May 2020 14:06:40 +0800 Subject: [PATCH 14/33] Migrate mouse view to ui_adaptor --- src/game.cpp | 23 ++++---------- src/live_view.cpp | 81 +++++++++++++++++++++++------------------------ src/live_view.h | 15 +++++---- 3 files changed, 55 insertions(+), 64 deletions(-) diff --git a/src/game.cpp b/src/game.cpp index 734c7a0ed0711..ebcdfad3e6ee7 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -2321,12 +2321,6 @@ int game::inventory_item_menu( item_location locThisItem, bool game::handle_mouseview( input_context &ctxt, std::string &action ) { cata::optional liveview_pos; - auto &mgr = panel_manager::get_manager(); - const bool sidebar_right = get_option( "SIDEBAR_POSITION" ) == "right"; - int width = sidebar_right ? mgr.get_width_right() : mgr.get_width_left(); - - // FIXME: temporarily disable redrawing of lower UIs before this UI is migrated to `ui_adaptor` - ui_adaptor ui( ui_adaptor::disable_uis_below {} ); do { action = ctxt.handle_input(); @@ -2335,15 +2329,11 @@ bool game::handle_mouseview( input_context &ctxt, std::string &action ) if( mouse_pos && ( !liveview_pos || *mouse_pos != *liveview_pos ) ) { liveview_pos = mouse_pos; liveview.show( *liveview_pos ); - draw_panels( true ); - const catacurses::window &w = catacurses::newwin( TERMY / 2, width, - point( sidebar_right ? TERMX - width : 0, 0 ) ); - liveview.draw( w, TERMY / 2 ); } else if( !mouse_pos ) { liveview_pos.reset(); liveview.hide(); - draw_panels( true ); } + ui_manager::redraw(); } } while( action == "MOUSE_MOVE" ); // Freeze animation when moving the mouse @@ -6124,18 +6114,19 @@ void game::print_items_info( const tripoint &lp, const catacurses::window &w_loo } const int max_width = getmaxx( w_look ) - column - 1; - for( const auto &it : item_names ) { - if( line >= last_line - 2 ) { + for( auto it = item_names.begin(); it != item_names.end(); ++it ) { + // last line but not last item + if( line + 1 >= last_line && std::next( it ) != item_names.end() ) { mvwprintz( w_look, point( column, ++line ), c_yellow, _( "More items here…" ) ); break; } - if( it.second > 1 ) { + if( it->second > 1 ) { trim_and_print( w_look, point( column, ++line ), max_width, c_white, pgettext( "%s is the name of the item. %d is the quantity of that item.", "%s [%d]" ), - it.first.c_str(), it.second ); + it->first.c_str(), it->second ); } else { - trim_and_print( w_look, point( column, ++line ), max_width, c_white, it.first ); + trim_and_print( w_look, point( column, ++line ), max_width, c_white, it->first ); } } } diff --git a/src/live_view.cpp b/src/live_view.cpp index edf48efb5b41b..ea73a83b65ccc 100644 --- a/src/live_view.cpp +++ b/src/live_view.cpp @@ -8,8 +8,11 @@ #include "cursesport.h" #include "game.h" #include "map.h" +#include "options.h" #include "output.h" +#include "panels.h" #include "translations.h" +#include "ui_manager.h" namespace { @@ -19,61 +22,57 @@ constexpr int MIN_BOX_HEIGHT = 3; } //namespace +live_view::live_view() = default; +live_view::~live_view() = default; + void live_view::init() { hide(); } -int live_view::draw( const catacurses::window &win, const int max_height ) -{ - if( !enabled ) { - return 0; - } - - // -1 for border. -1 because getmaxy() actually returns height, not y position. - const int line_limit = max_height - 2; - const visibility_variables &cache = g->m.get_visibility_variables_cache(); - int line_out = START_LINE; - g->pre_print_all_tile_info( mouse_position, win, line_out, line_limit, cache ); - - const int live_view_box_height = std::min( max_height, std::max( line_out + 2, MIN_BOX_HEIGHT ) ); - -#if defined(TILES) || defined(_WIN32) - // HACK: Because of the way the status UI is done, the live view window must - // be tall enough to clear the entire height of the viewport below the - // status bar. This hack allows the border around the live view box to - // be drawn only as big as it needs to be, while still leaving the - // window tall enough. Won't work for ncurses in Linux, but that doesn't - // currently support the mouse. If and when it does, there will need to - // be a different code path here that works for ncurses. - const int original_height = win.get()->height; - win.get()->height = live_view_box_height; - g->draw_panels(); -#endif - - draw_border( win ); - center_print( win, 0, c_white, _( "< Mouse View >" ) ); - wrefresh( win ); - -#if defined(TILES) || defined(_WIN32) - win.get()->height = original_height; -#endif - - return live_view_box_height; -} - void live_view::hide() { - enabled = false; + ui = nullptr; } void live_view::show( const tripoint &p ) { - enabled = true; mouse_position = p; + if( !ui ) { + ui = std::make_unique(); + ui->on_screen_resize( [this]( ui_adaptor & ui ) { + auto &mgr = panel_manager::get_manager(); + const bool sidebar_right = get_option( "SIDEBAR_POSITION" ) == "right"; + const int width = sidebar_right ? mgr.get_width_right() : mgr.get_width_left(); + + const int max_height = TERMY / 2; + const int line_limit = max_height - 2; + const visibility_variables &cache = g->m.get_visibility_variables_cache(); + int line_out = START_LINE; + // HACK: using dummy window to get the window height without refreshing. + win = catacurses::newwin( 1, width, point_zero ); + g->pre_print_all_tile_info( mouse_position, win, line_out, line_limit, cache ); + const int live_view_box_height = std::min( max_height, std::max( line_out + 2, MIN_BOX_HEIGHT ) ); + + win = catacurses::newwin( live_view_box_height, width, + point( sidebar_right ? TERMX - width : 0, 0 ) ); + ui.position_from_window( win ); + } ); + ui->on_redraw( [this]( const ui_adaptor & ) { + werase( win ); + const visibility_variables &cache = g->m.get_visibility_variables_cache(); + int line_out = START_LINE; + g->pre_print_all_tile_info( mouse_position, win, line_out, getmaxy( win ) - 2, cache ); + draw_border( win ); + center_print( win, 0, c_white, _( "< Mouse View >" ) ); + wrefresh( win ); + } ); + } + // Always mark ui for resize as the required box height may have changed. + ui->mark_resize(); } bool live_view::is_enabled() { - return enabled; + return ui != nullptr; } diff --git a/src/live_view.h b/src/live_view.h index 9d5b42704f4bb..5c386a6ba0848 100644 --- a/src/live_view.h +++ b/src/live_view.h @@ -2,20 +2,20 @@ #ifndef CATA_SRC_LIVE_VIEW_H #define CATA_SRC_LIVE_VIEW_H +#include + +#include "cursesdef.h" #include "point.h" -namespace catacurses -{ -class window; -} // namespace catacurses +class ui_adaptor; class live_view { public: - live_view() = default; + live_view(); + ~live_view(); void init(); - int draw( const catacurses::window &win, int max_height ); void show( const tripoint &p ); bool is_enabled(); void hide(); @@ -23,7 +23,8 @@ class live_view private: tripoint mouse_position; - bool enabled = false; + catacurses::window win; + std::unique_ptr ui; }; #endif // CATA_SRC_LIVE_VIEW_H From 55995716ccdf20095add3a43bf74811157bfba4a Mon Sep 17 00:00:00 2001 From: Qrox Date: Sat, 16 May 2020 16:50:07 +0800 Subject: [PATCH 15/33] Migrate NPC dialogue window to ui_adaptor --- src/dialogue.h | 2 +- src/dialogue_win.cpp | 46 ++++++++++++++++++++++++++------------------ src/dialogue_win.h | 7 +++++-- src/npctalk.cpp | 36 ++++++++++++++++++++++++++-------- 4 files changed, 61 insertions(+), 30 deletions(-) diff --git a/src/dialogue.h b/src/dialogue.h index 14a9073b8de90..831e47ee57c12 100644 --- a/src/dialogue.h +++ b/src/dialogue.h @@ -237,7 +237,7 @@ struct dialogue { /** Missions that have been assigned by this npc to the player they currently speak to. */ std::vector missions_assigned; - talk_topic opt( dialogue_window &d_win, const talk_topic &topic ); + talk_topic opt( dialogue_window &d_win, const std::string &npc_name, const talk_topic &topic ); dialogue() = default; diff --git a/src/dialogue_win.cpp b/src/dialogue_win.cpp index 91efa417358b4..44e46a3709dd7 100644 --- a/src/dialogue_win.cpp +++ b/src/dialogue_win.cpp @@ -9,6 +9,7 @@ #include "output.h" #include "point.h" #include "translations.h" +#include "ui_manager.h" void dialogue_window::open_dialogue( bool text_only ) { @@ -16,11 +17,21 @@ void dialogue_window::open_dialogue( bool text_only ) this->text_only = true; return; } - int win_beginy = TERMY > FULL_SCREEN_HEIGHT ? ( TERMY - FULL_SCREEN_HEIGHT ) / 4 : 0; - int win_beginx = TERMX > FULL_SCREEN_WIDTH ? ( TERMX - FULL_SCREEN_WIDTH ) / 4 : 0; - int maxy = win_beginy ? TERMY - 2 * win_beginy : FULL_SCREEN_HEIGHT; - int maxx = win_beginx ? TERMX - 2 * win_beginx : FULL_SCREEN_WIDTH; - d_win = catacurses::newwin( maxy, maxx, point( win_beginx, win_beginy ) ); +} + +void dialogue_window::resize_dialogue( ui_adaptor &ui ) +{ + if( text_only ) { + ui.position( point_zero, point_zero ); + } else { + int win_beginy = TERMY > FULL_SCREEN_HEIGHT ? ( TERMY - FULL_SCREEN_HEIGHT ) / 4 : 0; + int win_beginx = TERMX > FULL_SCREEN_WIDTH ? ( TERMX - FULL_SCREEN_WIDTH ) / 4 : 0; + int maxy = win_beginy ? TERMY - 2 * win_beginy : FULL_SCREEN_HEIGHT; + int maxx = win_beginx ? TERMX - 2 * win_beginx : FULL_SCREEN_WIDTH; + d_win = catacurses::newwin( maxy, maxx, point( win_beginx, win_beginy ) ); + ui.position_from_window( d_win ); + } + yoffset = 0; } void dialogue_window::print_header( const std::string &name ) @@ -132,25 +143,13 @@ void dialogue_window::refresh_response_display() can_scroll_up = false; } -void dialogue_window::display_responses( const int hilight_lines, - const std::vector &responses, - const int &ch ) +void dialogue_window::handle_scrolling( const int ch ) { if( text_only ) { return; } -#if defined(__ANDROID__) - input_context ctxt( "DIALOGUE_CHOOSE_RESPONSE" ); - for( size_t i = 0; i < responses.size(); i++ ) { - ctxt.register_manual_key( 'a' + i ); - } - ctxt.register_manual_key( 'L', "Look at" ); - ctxt.register_manual_key( 'S', "Size up stats" ); - ctxt.register_manual_key( 'Y', "Yell" ); - ctxt.register_manual_key( 'O', "Check opinion" ); -#endif // adjust scrolling from the last key pressed - int win_maxy = getmaxy( d_win ); + const int win_maxy = getmaxy( d_win ); switch( ch ) { case KEY_DOWN: case KEY_NPAGE: @@ -167,6 +166,15 @@ void dialogue_window::display_responses( const int hilight_lines, default: break; } +} + +void dialogue_window::display_responses( const int hilight_lines, + const std::vector &responses ) +{ + if( text_only ) { + return; + } + const int win_maxy = getmaxy( d_win ); clear_window_texts(); print_history( hilight_lines ); can_scroll_down = print_responses( yoffset, responses ); diff --git a/src/dialogue_win.h b/src/dialogue_win.h index 0638fcfb0ff3a..931431d619ebe 100644 --- a/src/dialogue_win.h +++ b/src/dialogue_win.h @@ -12,18 +12,21 @@ using talk_data = std::pair; +class ui_adaptor; + class dialogue_window { public: dialogue_window() = default; void open_dialogue( bool text_only = false ); + void resize_dialogue( ui_adaptor &ui ); void print_header( const std::string &name ); bool text_only = false; void clear_window_texts(); - void display_responses( int hilight_lines, const std::vector &responses, - const int &ch ); + void handle_scrolling( int ch ); + void display_responses( int hilight_lines, const std::vector &responses ); void refresh_response_display(); /** * Folds and adds the folded text to @ref history. Returns the number of added lines. diff --git a/src/npctalk.cpp b/src/npctalk.cpp index e2448f095800d..4b121155d5a72 100644 --- a/src/npctalk.cpp +++ b/src/npctalk.cpp @@ -865,8 +865,7 @@ void npc::talk_to_u( bool text_only, bool radio_contact ) chatbin.mission_selected = d.missions_assigned.front(); } } - d_win.print_header( name ); - const talk_topic next = d.opt( d_win, d.topic_stack.back() ); + const talk_topic next = d.opt( d_win, name, d.topic_stack.back() ); if( next.id == "TALK_NONE" ) { int cat = topic_category( d.topic_stack.back() ); do { @@ -1733,7 +1732,8 @@ const talk_topic &special_talk( char ch ) return no_topic; } -talk_topic dialogue::opt( dialogue_window &d_win, const talk_topic &topic ) +talk_topic dialogue::opt( dialogue_window &d_win, const std::string &npc_name, + const talk_topic &topic ) { bool text_only = d_win.text_only; std::string challenge = dynamic_line( topic ); @@ -1771,29 +1771,49 @@ talk_topic dialogue::opt( dialogue_window &d_win, const talk_topic &topic ) response_lines.push_back( responses[i].create_option_line( *this, 'a' + i ) ); } - // FIXME: temporarily disable redrawing of lower UIs before this UI is migrated to `ui_adaptor` - ui_adaptor ui( ui_adaptor::disable_uis_below {} ); +#if defined(__ANDROID__) + input_context ctxt( "DIALOGUE_CHOOSE_RESPONSE" ); + for( size_t i = 0; i < responses.size(); i++ ) { + ctxt.register_manual_key( 'a' + i ); + } + ctxt.register_manual_key( 'L', "Look at" ); + ctxt.register_manual_key( 'S', "Size up stats" ); + ctxt.register_manual_key( 'Y', "Yell" ); + ctxt.register_manual_key( 'O', "Check opinion" ); +#endif + + ui_adaptor ui; + ui.on_screen_resize( [&]( ui_adaptor & ui ) { + d_win.resize_dialogue( ui ); + } ); + ui.mark_resize(); + + ui.on_redraw( [&]( const ui_adaptor & ) { + d_win.print_header( npc_name ); + d_win.display_responses( hilight_lines, response_lines ); + } ); int ch = text_only ? 'a' + responses.size() - 1 : ' '; bool okay; do { d_win.refresh_response_display(); do { - d_win.display_responses( hilight_lines, response_lines, ch ); + ui_manager::redraw(); if( !text_only ) { ch = inp_mngr.get_input_event().get_first_input(); } + d_win.handle_scrolling( ch ); auto st = special_talk( ch ); if( st.id != "TALK_NONE" ) { return st; } switch( ch ) { - // send scroll control keys back to the display window case KEY_DOWN: case KEY_NPAGE: case KEY_UP: case KEY_PPAGE: - continue; + ch = -1; + break; default: ch -= 'a'; break; From 8f05ab9838e75afd3cf9fe77bc99c9a688895b57 Mon Sep 17 00:00:00 2001 From: AlisW02 <63066930+AlisW02@users.noreply.github.com> Date: Sat, 16 May 2020 11:21:00 -0700 Subject: [PATCH 16/33] Update data/json/furniture_and_terrain/furniture-fungal.json Co-authored-by: Justen Robertson --- data/json/furniture_and_terrain/furniture-fungal.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/json/furniture_and_terrain/furniture-fungal.json b/data/json/furniture_and_terrain/furniture-fungal.json index 87522deef9093..4aa6ca2232179 100644 --- a/data/json/furniture_and_terrain/furniture-fungal.json +++ b/data/json/furniture_and_terrain/furniture-fungal.json @@ -3,7 +3,7 @@ "type": "furniture", "id": "f_flower_marloss", "name": "marloss flower", - "description": "This flower is like the other flowers taken by the mushrooms, but its bulb is colored a brilliant cyan color. It emits an aroma both overwhelming and strangely alluring.", + "description": "This flower is like the other flowers taken by the mushrooms, but its bulb is colored a brilliant cyan color. It emits an aroma both overwhelming and strangely alluring.", "symbol": "f", "color": "cyan", "move_cost_mod": 1, From be1ea8c4be6820d6ffa9ead2989a23327a1d2ad9 Mon Sep 17 00:00:00 2001 From: eJ0opb Date: Sun, 17 May 2020 08:53:30 -0400 Subject: [PATCH 17/33] Make turrets very easy to hit with melee Add a very large bonus to hit_spread when target is IMMOBILE. --- src/creature.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/creature.cpp b/src/creature.cpp index ef707080ced98..db4d13471ca4f 100644 --- a/src/creature.cpp +++ b/src/creature.cpp @@ -483,6 +483,13 @@ int Creature::size_melee_penalty() const int Creature::deal_melee_attack( Creature *source, int hitroll ) { int hit_spread = hitroll - dodge_roll() - size_melee_penalty(); + if( has_flag( MF_IMMOBILE ) ) { + // Under normal circumstances, even a clumsy person would + // not miss a turret. It should, however, be possible to + // miss a smaller target, especially when wielding a + // clumsy weapon or when severely encumbered. + hit_spread += 40; + } // If attacker missed call targets on_dodge event if( hit_spread <= 0 && source != nullptr && !source->is_hallucination() ) { From 0b3af14ea9026519c2fddb90a238e76ed21d3850 Mon Sep 17 00:00:00 2001 From: curstwist <39442864+curstwist@users.noreply.github.com> Date: Sun, 17 May 2020 12:36:34 -0400 Subject: [PATCH 18/33] mainlnie fuji houses 34 to 36 --- data/json/mapgen/house/house34.json | 180 ++++++++++++++++++ data/json/mapgen/house/house35.json | 110 +++++++++++ data/json/mapgen/house/house36.json | 166 ++++++++++++++++ .../overmap/multitile_city_buildings.json | 26 +++ .../overmap_terrain_residential.json | 8 + data/json/regional_map_settings.json | 3 + .../worldgen/houses/house34.json | 150 --------------- .../worldgen/houses/house35.json | 160 ---------------- .../worldgen/houses/house36.json | 147 -------------- .../worldgen/overmap_terrain.json | 27 --- .../worldgen/regional_overlay.json | 3 - 11 files changed, 493 insertions(+), 487 deletions(-) create mode 100644 data/json/mapgen/house/house34.json create mode 100644 data/json/mapgen/house/house35.json create mode 100644 data/json/mapgen/house/house36.json delete mode 100644 data/mods/Fuji_Structures/worldgen/houses/house34.json delete mode 100644 data/mods/Fuji_Structures/worldgen/houses/house35.json delete mode 100644 data/mods/Fuji_Structures/worldgen/houses/house36.json diff --git a/data/json/mapgen/house/house34.json b/data/json/mapgen/house/house34.json new file mode 100644 index 0000000000000..de6e575f1270f --- /dev/null +++ b/data/json/mapgen/house/house34.json @@ -0,0 +1,180 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "house_34" ], + "object": { + "fill_ter": "t_floor", + "rows": [ + ".........p```!..........", + ".....[....```!.%%%......", + "....%%%.^#o*o##oo####...", + "..##o##o##y L| xx #...", + "..#I dd| ; H #...", + ".%#@@ | ; llH #...", + ".%o@@ | ; | HHHs #...", + ".%#I RR | ; #%..", + "..#|+|||+| ; Er#%..", + "..#D |6+ |RR r#...", + "..#||||| |||| |#...", + "..#D |> ||+|hfh_J_7#...", + ".%#|+|||+|5_|hfh_J_4#%..", + ".%# |t_|______3o%..", + "..o @@ d|BB|F__O512#%..", + "..#I@@I d##o##*##o###^..", + "..####o###:::~~~~GKG$%..", + "....!!!``=~~~~~~~~~~$%..", + "...`````!#$$#$=$$#$$#!..", + "...`````!!%%!%.%%!%%!!..", + "....[...................", + "........................", + ".................[......", + "........................" + ], + "palettes": [ "standard_domestic_palette" ], + "terrain": { + "%": [ "t_region_shrub", "t_region_shrub_fruit", "t_region_shrub_decorative" ], + "[": [ [ "t_region_tree_fruit", 2 ], [ "t_region_tree_nut", 2 ], "t_region_tree_shade" ], + "!": "t_region_groundcover_urban", + "$": "t_screened_porch_wall", + "=": "t_screen_door_c", + "#": "t_adobe_brick_wall", + ";": "t_carpet_green", + "~": "t_thconc_floor", + "A": "t_thconc_floor", + "N": "t_thconc_floor", + "K": "t_thconc_floor", + "G": "t_thconc_floor", + ":": "t_thconc_floor", + "`": "t_concrete", + "_": "t_linoleum_white", + "J": "t_linoleum_white", + "h": "t_linoleum_white", + "f": "t_linoleum_white", + "1": "t_linoleum_white", + "2": "t_linoleum_white", + "3": "t_linoleum_white", + "4": "t_linoleum_white", + "5": "t_linoleum_white", + "7": "t_linoleum_white", + "8": "t_linoleum_white", + "O": "t_linoleum_white", + "F": "t_linoleum_white", + "B": "t_linoleum_white", + "S": "t_linoleum_white", + "t": "t_linoleum_white" + }, + "furniture": { "!": "f_region_flower", ":": [ "f_indoor_plant", "f_indoor_plant_y" ] }, + "place_loot": [ + { "item": "hose", "x": 10, "y": 1 }, + { "item": "television", "x": 16, "y": 3 }, + { "item": "stereo", "x": 15, "y": 3, "chance": 50 } + ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": "house_34_roof", + "object": { + "fill_ter": "t_shingle_flat_roof", + "rows": [ + " ", + " ", + " |22222222223 ", + " |2222225..........3 ", + " |.................3 ", + " |.................3 ", + " |.................3 ", + " |.................3 ", + " |............N....3 ", + " |.................3 ", + " |....&............3 ", + " |.................3 ", + " |............=....3 ", + " |.................3 ", + " |.................3 ", + " |.................5 ", + " |------|..........3 ", + " |..........3 ", + " |----------3 ", + " ", + " ", + " ", + " ", + " " + ], + "palettes": [ "roof_palette" ], + "terrain": { ".": "t_shingle_flat_roof" } + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": "house_34_basement", + "object": { + "fill_ter": "t_thconc_floor", + "rows": [ + " ", + " ", + " |||||||||||| ", + " ||||||||2.........| ", + " |3................| ", + " |.................| ", + " |.................| ", + " |.................| ", + " |.................| ", + " |.................| ", + " |.................| ", + " |g..<.............| ", + " |W................| ", + " |J........4.......| ", + " |J................| ", + " |Z.UU.F...........| ", + " ||||||||..........| ", + " |..........| ", + " |||||||||||| ", + " ", + " ", + " ", + " ", + " " + ], + "palettes": [ "basement_empty" ], + "nested": { + "2": { + "chunks": [ + [ "null", 70 ], + [ "room_10x10_recording_studio_W", 5 ], + [ "room_10x10_woodworker_S", 10 ], + [ "room_10x10_guns_S", 10 ], + [ "room_10x10_junk_S", 30 ] + ] + }, + "3": { + "chunks": [ [ "null", 95 ], [ "7x7_tent_indoors", 5 ], [ "room_7x7_recroom_S", 20 ], [ "7x7_band_practice_open", 20 ] ] + }, + "4": { + "chunks": [ + [ "null", 80 ], + [ "5x5_holdout_W", 2 ], + [ "5x5_gym_N", 10 ], + [ "5x5_gym_S", 10 ], + [ "5x5_gym_E", 10 ], + [ "5x5_gym_W", 10 ], + [ "livingroom_5x5_S_1", 30 ], + [ "livingroom_5x5_E_1", 30 ], + [ "livingroom_5x5_N_1", 30 ], + [ "livingroom_5x5_W_1", 30 ], + [ "livingroom_5x5_S_2", 30 ], + [ "livingroom_5x5_E_2", 30 ], + [ "livingroom_5x5_N_2", 30 ], + [ "livingroom_5x5_W_2", 30 ], + [ "home_office_4x4_N", 20 ], + [ "home_office_4x4_S", 20 ] + ] + } + } + } + } +] diff --git a/data/json/mapgen/house/house35.json b/data/json/mapgen/house/house35.json new file mode 100644 index 0000000000000..96dc7345ccf1e --- /dev/null +++ b/data/json/mapgen/house/house35.json @@ -0,0 +1,110 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "house_35" ], + "object": { + "fill_ter": "t_floor", + "rows": [ + "........p`..............", + "....%%%%.`.%%%..........", + "...##oo##`##o##````````.", + ".###R I|*|rrR#````````.", + ".#D+ @@| + h *````````.", + ".#||d | |E T##oo##```.", + ".#D|||+|| |||||O152#```.", + ".#+| + II|F___3#```.", + "!# d ||+| J___7#*##.", + "!o |S_|H E ____6|~~#.", + "!#@@ |t_|H hfh |ANo!", + ".#I |BB|H hfh |~N#!", + ".#|||||||sHH +~~o!", + "!#tS|D|U|RRR |y Y|qq#.", + "!o__+ |+| ||xx |####.", + "!#BB| | + T#^...", + ".#|||+| ##oo### lHo!...", + ".#dbd #G::~~* lHo!...", + ".# o~~~~~#sHHI#!...", + ".o @@ *~~~~~##oo##....", + ".# I@@I #~~:~~:$........", + "^##o##o##$$$=$$$........", + "...%%%%%...```.......u..", + "........................" + ], + "palettes": [ "standard_domestic_palette" ], + "terrain": { + "%": [ "t_region_shrub", "t_region_shrub_fruit", "t_region_shrub_decorative" ], + "[": [ [ "t_region_tree_fruit", 2 ], [ "t_region_tree_nut", 2 ], "t_region_tree_shade" ], + "!": "t_region_groundcover_urban", + "$": "t_screened_porch_wall", + "=": "t_screen_door_c", + "#": "t_adobe_brick_wall", + "~": "t_thconc_floor", + "A": "t_thconc_floor", + "N": "t_thconc_floor", + "K": "t_thconc_floor", + "G": "t_thconc_floor", + ":": "t_thconc_floor", + "q": "t_thconc_floor", + "`": "t_concrete", + "_": "t_linoleum_white", + "J": "t_linoleum_white", + "1": "t_linoleum_white", + "2": "t_linoleum_white", + "3": "t_linoleum_white", + "4": "t_linoleum_white", + "5": "t_linoleum_white", + "6": "t_linoleum_white", + "7": "t_linoleum_white", + "8": "t_linoleum_white", + "O": "t_linoleum_white", + "F": "t_linoleum_white", + "B": "t_linoleum_white", + "S": "t_linoleum_white", + "t": "t_linoleum_white" + }, + "furniture": { "!": "f_region_flower", ":": [ "f_indoor_plant", "f_indoor_plant_y" ] }, + "place_loot": [ + { "item": "hose", "x": 9, "y": 22 }, + { "item": "television", "x": 16, "y": 14 }, + { "item": "stereo", "x": 15, "y": 14, "chance": 20 } + ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": "house_35_roof", + "object": { + "fill_ter": "t_shingle_flat_roof", + "rows": [ + " ", + " ", + " |22222 22223 ", + " |2|....222...3 ", + " |............3 ", + " |............3----3 ", + " |.................3 ", + " |.................3 ", + " |.................3223 ", + " |....................3 ", + " |....................3 ", + " |......&.............3 ", + " |....................3 ", + " |....................3 ", + " |..........N......5--3 ", + " |.................3 ", + " |.......=.........3 ", + " |.................3 ", + " |.................3 ", + " |.............3---3 ", + " |.............3 ", + " 5-------------3 ", + " ", + " " + ], + "palettes": [ "roof_palette" ], + "terrain": { ".": "t_shingle_flat_roof" } + } + } +] diff --git a/data/json/mapgen/house/house36.json b/data/json/mapgen/house/house36.json new file mode 100644 index 0000000000000..9b5b22c6bc773 --- /dev/null +++ b/data/json/mapgen/house/house36.json @@ -0,0 +1,166 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "house_36" ], + "object": { + "fill_ter": "t_floor", + "rows": [ + ".```````........```.!!!.", + ".```````........```.![!.", + ".```````##oooo##```.!!!.", + ".```````#RE y##*#oo##.", + ".```````o d|L y xx#^", + ".```````# d|r #.", + ".``````:# @@ |r llE#.", + ".```````#I@@I | HHs#.", + ".``````:#||||| | #.", + ".&``````* |>| |R R#.", + "##=====##i |+|+|R R#.", + "#&~~~~~U#i || |#.", + "o~~~~~~~#|+|y T#.", + "#~~~~~~q#S_||||||| #.", + "#~~~~~~q#t9|32F1O| hh #.", + "#~~~~~~##|||4____J ff #.", + "#~~~~~~*~~+______J ff #.", + "o~~~~~~#~A|+||____ hh #.", + "#~~~~~~#NN|_S|_45|y #.", + "#########o#_t#*#o##oo##.", + "......^...##o#..........", + "................[.......", + "....[...............[...", + "........................" + ], + "palettes": [ "standard_domestic_palette" ], + "terrain": { + "%": [ "t_region_shrub", "t_region_shrub_fruit", "t_region_shrub_decorative" ], + "[": [ [ "t_region_tree_fruit", 2 ], [ "t_region_tree_nut", 2 ], "t_region_tree_shade" ], + "!": "t_region_groundcover_urban", + "=": "t_door_metal_locked", + "&": "t_gates_control_brick", + "#": "t_brick_wall", + "~": "t_thconc_floor", + "q": "t_thconc_floor", + "U": "t_thconc_floor", + "A": "t_thconc_floor", + "N": "t_thconc_floor", + "`": "t_concrete", + ":": "t_concrete", + "_": "t_linoleum_white", + "J": "t_linoleum_white", + "1": "t_linoleum_white", + "2": "t_linoleum_white", + "3": "t_linoleum_white", + "4": "t_linoleum_white", + "5": "t_linoleum_white", + "7": "t_linoleum_white", + "8": "t_linoleum_white", + "O": "t_linoleum_white", + "F": "t_linoleum_white", + "B": "t_linoleum_white", + "S": "t_linoleum_white", + "t": "t_linoleum_white" + }, + "furniture": { "!": "f_region_flower", ":": [ "f_indoor_plant", "f_indoor_plant_y" ] }, + "place_loot": [ + { "item": "hose", "x": 10, "y": 20 }, + { "item": "lawnmower", "x": 1, "y": 4 }, + { "item": "television", "x": 20, "y": 4 }, + { "item": "stereo", "x": 21, "y": 4 } + ], + "place_vehicles": [ + { "vehicle": "car", "x": 3, "y": 14, "chance": 100, "rotation": 270 }, + { "vehicle": "tricycle", "x": 4, "y": 7, "chance": 100, "status": 0 } + ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": "house_36_roof", + "object": { + "fill_ter": "t_shingle_flat_roof", + "rows": [ + " ", + " ", + " |22222222222223 ", + " |.............5 ", + " |...........X.3 ", + " |....N........3 ", + " |.............3 ", + " |.............3 ", + " |.............3 ", + " |.............3 ", + "|2222222|.............3 ", + "|.....................3 ", + "|.....................3 ", + "|.....................3 ", + "|.....&.......=.......3 ", + "|.....................3 ", + "|.....................3 ", + "|.....................3 ", + "|.....................3 ", + "|-----5---|..3--------3 ", + " |--3 ", + " ", + " ", + " " + ], + "palettes": [ "roof_palette" ], + "terrain": { ".": "t_shingle_flat_roof" } + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": "house_36_basement", + "object": { + "fill_ter": "t_thconc_floor", + "rows": [ + " ", + " ", + " |||||||| ", + " |....UU|||||||| ", + " |.z.z...2.....| ", + " |..z..........| ", + " |F............| ", + " |g............| ", + " ||||||........| ", + " |WZ|<|........| ", + " |..|+|........| ", + " |.............| ", + " |1............| ", + " |.............| ", + " |.............| ", + " ||.............| ", + " |..............| ", + " |..............| ", + " |..............| ", + " ||||..|||||||||| ", + " |||| ", + " ", + " ", + " " + ], + "palettes": [ "basement_empty" ], + "nested": { + "2": { + "chunks": [ + [ "null", 70 ], + [ "room_6x6_office_S", 35 ], + [ "room_6x6_woodworker", 10 ], + [ "room_6x6_guns_S", 10 ], + [ "room_6x6_brewer_S", 10 ], + [ "room_6x6_bike", 10 ], + [ "6x6_electronics_open", 10 ], + [ "6x6_sewing_open", 10 ], + [ "room_6x6_junk_S", 20 ] + ] + }, + "1": { + "chunks": [ [ "null", 95 ], [ "7x7_tent_indoors", 5 ], [ "room_7x7_recroom_N", 20 ], [ "7x7_band_practice_open", 20 ] ] + } + } + } + } +] diff --git a/data/json/overmap/multitile_city_buildings.json b/data/json/overmap/multitile_city_buildings.json index 3c4698b58fb17..aa1b861313e84 100644 --- a/data/json/overmap/multitile_city_buildings.json +++ b/data/json/overmap/multitile_city_buildings.json @@ -520,6 +520,32 @@ { "point": [ 0, 0, 1 ], "overmap": "house_33_roof_north" } ] }, + { + "type": "city_building", + "id": "house_34", + "locations": [ "land" ], + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "house_34_north" }, + { "point": [ 0, 0, -1 ], "overmap": "house_34_basement_north" }, + { "point": [ 0, 0, 1 ], "overmap": "house_34_roof_north" } + ] + }, + { + "type": "city_building", + "id": "house_35", + "locations": [ "land" ], + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "house_35_north" }, { "point": [ 0, 0, 1 ], "overmap": "house_35_roof_north" } ] + }, + { + "type": "city_building", + "id": "house_36", + "locations": [ "land" ], + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "house_36_north" }, + { "point": [ 0, 0, 1 ], "overmap": "house_36_roof_north" }, + { "point": [ 0, 0, -1 ], "overmap": "house_36_basement_north" } + ] + }, { "type": "city_building", "id": "house_08", diff --git a/data/json/overmap/overmap_terrain/overmap_terrain_residential.json b/data/json/overmap/overmap_terrain/overmap_terrain_residential.json index 7e4c193c8c917..921ba7f876edd 100644 --- a/data/json/overmap/overmap_terrain/overmap_terrain_residential.json +++ b/data/json/overmap/overmap_terrain/overmap_terrain_residential.json @@ -81,6 +81,9 @@ "house_31", "house_32", "house_33", + "house_34", + "house_35", + "house_36", "house_crack1", "house_crack2", "house_crack3", @@ -247,6 +250,9 @@ "house_31_roof", "house_32_roof", "house_33_roof", + "house_34_roof", + "house_35_roof", + "house_36_roof", "house_crack1_roof", "house_crack3_roof", "house_detatched10_roof", @@ -328,6 +334,8 @@ "house_19_basement", "house_22_basement", "house_33_basement", + "house_34_basement", + "house_36_basement", "house_2story_basement", "house_crack3_basement", "house_detatched1_basement", diff --git a/data/json/regional_map_settings.json b/data/json/regional_map_settings.json index b844117591dd9..7c9d2b42ca010 100644 --- a/data/json/regional_map_settings.json +++ b/data/json/regional_map_settings.json @@ -616,6 +616,9 @@ "house_31": 50, "house_32": 50, "house_33": 50, + "house_34": 50, + "house_35": 50, + "house_36": 50, "house_garage": 50, "house_garage2": 50, "house_garage3": 50, diff --git a/data/mods/Fuji_Structures/worldgen/houses/house34.json b/data/mods/Fuji_Structures/worldgen/houses/house34.json deleted file mode 100644 index 627f3173f0ebe..0000000000000 --- a/data/mods/Fuji_Structures/worldgen/houses/house34.json +++ /dev/null @@ -1,150 +0,0 @@ -[ - { - "type": "mapgen", - "method": "json", - "om_terrain": [ "house_34" ], - "object": { - "fill_ter": "t_floor", - "rows": [ - "ddddddddddeeeddddddddddd", - "dddddfddddeeeddddddddddd", - "dddddddddacbcaaccaaaaddd", - "ddaacaacaaA Aa pp addd", - "ddap HHa t addd", - "ddaGG a t addd", - "ddcGG a a tttp addd", - "ddap uu a addd", - "ddaabaaaba paddd", - "ddaH aOh auu paddd", - "ddaaaaJh aaaa aaddd", - "ddaH aIh aabavNvhhhmaddd", - "ddaabaaabajhavNvhhhmaddd", - "dda akhahhhhhhmcddd", - "ddc GG Hallanhhijmmaddd", - "ddapGGp Haacaabaacaaaddd", - "ddaaaacaaaDDDDDDDDDDzddd", - "dddddddddzDDDDDDDDDDzddd", - "dddddddddazzazDzzazzaddd", - "dddddddddddddddddddddddd", - "ddddfddddddddddddddddddd", - "dddddddfdddddddddddddddd", - "dddddddddddddddddfdddddd", - "dddddddddddddddddddddddd" - ], - "terrain": { - "a": "t_wall", - "b": "t_door_locked", - "c": "t_window_domestic", - "d": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], - "e": "t_sidewalk", - "f": [ - "t_tree", - "t_tree_pine", - "t_tree_pear", - "t_tree_plum", - "t_tree_cherry", - "t_tree_maple", - "t_tree_birch", - "t_tree_apple", - "t_tree_willow", - "t_tree_hickory", - "t_tree_young" - ], - "g": "t_sidewalk", - "h": "t_linoleum_gray", - "i": "t_linoleum_gray", - "j": "t_linoleum_gray", - "k": "t_linoleum_gray", - "l": "t_linoleum_gray", - "m": "t_linoleum_gray", - "n": "t_linoleum_gray", - "o": "t_linoleum_gray", - "p": "t_floor", - "q": "t_floor", - "r": "t_floor", - "s": "t_floor", - "t": "t_floor", - "u": "t_floor", - "A": "t_floor", - "B": [ "t_shrub", "t_shrub", "t_shrub_strawberry", "t_shrub_blueberry" ], - "C": "t_fence_v", - "D": "t_concrete_floor", - "E": "t_wall_glass", - "F": "t_door_glass_c", - "G": "t_floor", - "H": "t_floor", - "I": "t_linoleum_gray", - "J": "t_linoleum_gray", - "K": "t_rock_floor", - "L": "t_rock_floor", - "M": "t_rock", - "N": "t_linoleum_gray", - "O": "t_linoleum_gray", - "P": "t_door_metal_locked", - "Q": "t_gates_mech_control", - "R": "t_linoleum_gray", - "v": "t_linoleum_gray", - "z": "t_railing_h" - }, - "furniture": { - "g": "f_dumpster", - "i": "f_oven", - "j": "f_sink", - "l": "f_bathtub", - "m": "f_counter", - "n": "f_fridge", - "o": "f_cupboard", - "p": "f_table", - "q": "f_chair", - "r": "f_trashcan", - "s": "f_locker", - "t": "f_sofa", - "u": "f_bookcase", - "A": "f_indoor_plant", - "G": "f_bed", - "H": "f_dresser", - "I": "f_washer", - "J": "f_dryer", - "K": "f_fireplace", - "N": "f_table", - "O": "f_locker", - "R": "f_rack", - "v": "f_chair" - }, - "toilets": { "k": { } }, - "place_loot": [ - { "group": "homebooks", "chance": 60, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 9, 9 ] }, - { "group": "homebooks", "chance": 60, "repeat": [ 2 ], "x": [ 15, 15 ], "y": [ 9, 9 ] }, - { "group": "homebooks", "chance": 60, "repeat": [ 2 ], "x": [ 6, 6 ], "y": [ 7, 7 ] }, - { "group": "dresser", "chance": 80, "repeat": [ 3 ], "x": [ 7, 7 ], "y": [ 7, 7 ] }, - { "group": "dresser", "chance": 80, "repeat": [ 3 ], "x": [ 8, 8 ], "y": [ 14, 15 ] }, - { "group": "dresser", "chance": 80, "repeat": [ 3 ], "x": [ 7, 8 ], "y": [ 4, 4 ] }, - { "group": "dresser", "chance": 80, "repeat": [ 3 ], "x": [ 3, 3 ], "y": [ 9, 9 ] }, - { "group": "dresser", "chance": 80, "repeat": [ 3 ], "x": [ 3, 3 ], "y": [ 11, 11 ] }, - { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 3, 3 ], "y": [ 4, 4 ] }, - { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 3, 3 ], "y": [ 7, 7 ] }, - { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 3, 3 ], "y": [ 15, 15 ] }, - { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 6, 6 ], "y": [ 15, 15 ] }, - { "group": "bed", "chance": 60, "repeat": [ 4 ], "x": [ 4, 5 ], "y": [ 14, 15 ] }, - { "group": "bed", "chance": 60, "repeat": [ 4 ], "x": [ 3, 4 ], "y": [ 5, 6 ] }, - { "group": "a_television", "chance": 100, "repeat": [ 1 ], "x": [ 16, 16 ], "y": [ 3, 3 ] }, - { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 18, 18 ], "y": [ 6, 6 ] }, - { "group": "livingroom", "chance": 60, "repeat": [ 4 ], "x": [ 19, 19 ], "y": [ 8, 9 ] }, - { "group": "dining", "chance": 80, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 11, 12 ] }, - { "group": "kitchen", "chance": 60, "repeat": [ 4 ], "x": [ 19, 19 ], "y": [ 11, 14 ] }, - { "group": "oven", "chance": 80, "repeat": [ 2 ], "x": [ 16, 16 ], "y": [ 14, 14 ] }, - { "group": "cleaning", "chance": 80, "repeat": [ 2 ], "x": [ 17, 17 ], "y": [ 14, 14 ] }, - { "group": "fridge", "chance": 80, "repeat": [ 2 ], "x": [ 13, 13 ], "y": [ 14, 14 ] }, - { "group": "softdrugs", "chance": 80, "repeat": [ 2 ], "x": [ 10, 10 ], "y": [ 12, 12 ] }, - { "group": "dresser", "chance": 80, "repeat": [ 3 ], "x": [ 6, 6 ], "y": [ 10, 11 ] }, - { "group": "cleaning_bulk", "chance": 80, "repeat": [ 2 ], "x": [ 6, 6 ], "y": [ 9, 9 ] }, - { "group": "livingroom", "chance": 30, "repeat": [ 2 ], "x": [ 15, 17 ], "y": [ 6, 6 ] }, - { "group": "livingroom", "chance": 30, "repeat": [ 2 ], "x": [ 18, 18 ], "y": [ 5, 4 ] }, - { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 8, 3 ], "y": [ 7, 4 ] }, - { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 3, 8 ], "y": [ 13, 15 ] }, - { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 19, 14 ], "y": [ 3, 9 ] }, - { "group": "livingroom", "chance": 60, "repeat": [ 4 ], "x": [ 12, 10 ], "y": [ 9, 3 ] } - ] - } - } -] diff --git a/data/mods/Fuji_Structures/worldgen/houses/house35.json b/data/mods/Fuji_Structures/worldgen/houses/house35.json deleted file mode 100644 index b5fc087f961c9..0000000000000 --- a/data/mods/Fuji_Structures/worldgen/houses/house35.json +++ /dev/null @@ -1,160 +0,0 @@ -[ - { - "type": "mapgen", - "method": "json", - "om_terrain": [ "house_35" ], - "object": { - "fill_ter": "t_floor", - "rows": [ - "dddddddddedddddddddddddd", - "dddddddddedddddddddddddd", - "dddaaccaaeaacaaeeeeeeeed", - "daaau pabappuaeeeeeeeed", - "daHb GGa b q beeeeeeeed", - "daaa a a aaccaaeeed", - "daHaaabaa aaaaaimjmaeeed", - "daba b pparhhhmaeeed", - "da u aaba hhhhnabaad", - "dc ajhat hhhhha ad", - "daGG akhat qpq aO cd", - "dap allat qpq aO ad", - "daaaaaaaaptt b cd", - "dakjaHasauuu a aIJad", - "dchhb aba aaa aaaaad", - "dalla a b padddd", - "daaaaba aaccaaa tcdddd", - "dauHH a b tcdddd", - "da c apttpadddd", - "dc GG b aaccaadddd", - "da pGGp a Edddddddd", - "daacaacaaEEEFEEEdddddddd", - "dddddddddddddddddddddddd", - "dddddddddddddddddddddddd" - ], - "terrain": { - "a": "t_wall", - "b": "t_door_locked", - "c": "t_window_domestic", - "d": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], - "e": "t_sidewalk", - "f": [ - "t_tree", - "t_tree_pine", - "t_tree_pear", - "t_tree_plum", - "t_tree_cherry", - "t_tree_maple", - "t_tree_birch", - "t_tree_apple", - "t_tree_willow", - "t_tree_hickory", - "t_tree_young" - ], - "g": "t_sidewalk", - "h": "t_linoleum_gray", - "i": "t_linoleum_gray", - "j": "t_linoleum_gray", - "k": "t_linoleum_gray", - "l": "t_linoleum_gray", - "m": "t_linoleum_gray", - "n": "t_linoleum_gray", - "o": "t_linoleum_gray", - "p": "t_floor", - "q": "t_floor", - "r": "t_linoleum_gray", - "s": "t_floor", - "t": "t_floor", - "u": "t_floor", - "A": "t_floor", - "B": [ "t_shrub", "t_shrub", "t_shrub_strawberry", "t_shrub_blueberry" ], - "C": "t_fence_v", - "D": "t_concrete_floor", - "E": "t_wall_glass", - "F": "t_door_glass_c", - "G": "t_floor", - "H": "t_floor", - "I": "t_linoleum_gray", - "J": "t_linoleum_gray", - "K": "t_rock_floor", - "L": "t_rock_floor", - "M": "t_rock", - "N": "t_linoleum_gray", - "O": "t_linoleum_gray", - "P": "t_door_metal_locked", - "Q": "t_gates_mech_control", - "R": "t_linoleum_gray", - "v": "t_linoleum_gray", - "z": "t_railing_h" - }, - "furniture": { - "g": "f_dumpster", - "i": "f_oven", - "j": "f_sink", - "l": "f_bathtub", - "m": "f_counter", - "n": "f_fridge", - "o": "f_cupboard", - "p": "f_table", - "q": "f_chair", - "r": "f_trashcan", - "s": "f_locker", - "t": "f_sofa", - "u": "f_bookcase", - "A": "f_indoor_plant", - "G": "f_bed", - "H": "f_dresser", - "I": "f_washer", - "J": "f_dryer", - "K": "f_fireplace", - "N": "f_table", - "O": "f_locker", - "R": "f_rack", - "v": "f_chair" - }, - "toilets": { "k": { } }, - "place_loot": [ - { "group": "fridge", "chance": 80, "repeat": [ 4 ], "x": [ 18, 18 ], "y": [ 8, 8 ] }, - { "group": "kitchen", "chance": 80, "repeat": [ 2 ], "x": [ 18, 18 ], "y": [ 6, 7 ] }, - { "group": "kitchen", "chance": 80, "repeat": [ 2 ], "x": [ 16, 16 ], "y": [ 6, 6 ] }, - { "group": "trash", "chance": 60, "repeat": [ 5 ], "x": [ 14, 14 ], "y": [ 7, 7 ] }, - { "group": "oven", "chance": 80, "repeat": [ 2 ], "x": [ 15, 15 ], "y": [ 6, 6 ] }, - { "group": "cleaning", "chance": 80, "repeat": [ 2 ], "x": [ 17, 17 ], "y": [ 6, 6 ] }, - { "group": "cleaning_bulk", "chance": 80, "repeat": [ 4 ], "x": [ 20, 20 ], "y": [ 10, 11 ] }, - { "group": "softdrugs", "chance": 80, "repeat": [ 2 ], "x": [ 3, 3 ], "y": [ 13, 13 ] }, - { "group": "softdrugs", "chance": 80, "repeat": [ 2 ], "x": [ 6, 6 ], "y": [ 9, 9 ] }, - { "group": "homebooks", "chance": 80, "repeat": [ 2 ], "x": [ 3, 3 ], "y": [ 8, 8 ] }, - { "group": "homebooks", "chance": 80, "repeat": [ 2 ], "x": [ 4, 4 ], "y": [ 3, 3 ] }, - { "group": "homebooks", "chance": 80, "repeat": [ 2 ], "x": [ 2, 2 ], "y": [ 17, 17 ] }, - { "group": "homebooks", "chance": 80, "repeat": [ 2 ], "x": [ 9, 9 ], "y": [ 13, 13 ] }, - { "group": "homebooks", "chance": 80, "repeat": [ 2 ], "x": [ 10, 10 ], "y": [ 13, 13 ] }, - { "group": "homebooks", "chance": 80, "repeat": [ 2 ], "x": [ 11, 11 ], "y": [ 13, 13 ] }, - { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 9, 9 ], "y": [ 12, 12 ] }, - { "group": "livingroom", "chance": 30, "repeat": [ 2 ], "x": [ 10, 11 ], "y": [ 12, 12 ] }, - { "group": "bed", "chance": 60, "repeat": [ 2 ], "x": [ 2, 3 ], "y": [ 10, 10 ] }, - { "group": "bed", "chance": 60, "repeat": [ 4 ], "x": [ 4, 5 ], "y": [ 19, 20 ] }, - { "group": "bedroom", "chance": 80, "repeat": [ 1 ], "x": [ 3, 3 ], "y": [ 20, 20 ] }, - { "group": "bedroom", "chance": 80, "repeat": [ 1 ], "x": [ 2, 2 ], "y": [ 11, 11 ] }, - { "group": "bedroom", "chance": 80, "repeat": [ 1 ], "x": [ 6, 6 ], "y": [ 20, 20 ] }, - { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 11, 12 ], "y": [ 7, 7 ] }, - { "group": "office", "chance": 60, "repeat": [ 2 ], "x": [ 11, 12 ], "y": [ 3, 3 ] }, - { "group": "textbooks", "chance": 60, "repeat": [ 2 ], "x": [ 13, 13 ], "y": [ 3, 3 ] }, - { "group": "dresser", "chance": 60, "repeat": [ 4 ], "x": [ 20, 21 ], "y": [ 13, 13 ] }, - { "group": "dresser", "chance": 60, "repeat": [ 4 ], "x": [ 5, 5 ], "y": [ 13, 13 ] }, - { "group": "dresser", "chance": 60, "repeat": [ 4 ], "x": [ 2, 2 ], "y": [ 4, 4 ] }, - { "group": "dresser", "chance": 60, "repeat": [ 4 ], "x": [ 2, 2 ], "y": [ 6, 6 ] }, - { "group": "bedroom", "chance": 80, "repeat": [ 1 ], "x": [ 7, 7 ], "y": [ 3, 3 ] }, - { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 15, 15 ], "y": [ 18, 18 ] }, - { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 18, 18 ], "y": [ 18, 18 ] }, - { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 18, 18 ], "y": [ 15, 15 ] }, - { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 18, 18 ], "y": [ 16, 17 ] }, - { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 17, 16 ], "y": [ 18, 18 ] }, - { "group": "dresser", "chance": 60, "repeat": [ 4 ], "x": [ 3, 4 ], "y": [ 17, 17 ] }, - { "group": "livingroom", "chance": 60, "repeat": [ 4 ], "x": [ 15, 18 ], "y": [ 15, 18 ] }, - { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 7, 2 ], "y": [ 17, 20 ] }, - { "group": "bedroom", "chance": 60, "repeat": [ 4 ], "x": [ 4, 7 ], "y": [ 5, 3 ] }, - { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 4, 2 ], "y": [ 8, 11 ] }, - { "group": "livingroom", "chance": 30, "repeat": [ 2 ], "x": [ 9, 9 ], "y": [ 11, 9 ] } - ] - } - } -] diff --git a/data/mods/Fuji_Structures/worldgen/houses/house36.json b/data/mods/Fuji_Structures/worldgen/houses/house36.json deleted file mode 100644 index afb588f547583..0000000000000 --- a/data/mods/Fuji_Structures/worldgen/houses/house36.json +++ /dev/null @@ -1,147 +0,0 @@ -[ - { - "type": "mapgen", - "method": "json", - "om_terrain": [ "house_36" ], - "object": { - "fill_ter": "t_floor", - "rows": [ - "ddeeeeeeddddddddeeeddddd", - "ddeeeeeeddddddddeeeddddd", - "ddeeeeeeaaccccaaeeeddddd", - "ddeeeeeeau Aaabaccaad", - "ddeeeeeec Hap App ad", - "ddeeeeeea Hap ad", - "ddeeeeeea GG ap tad", - "ddeeeeeeapGGp a ttpad", - "ddeeeeeeaaaaaa a ad", - "ddQeeeeeb a au uad", - "daaPPPPaaaaa abau uad", - "daQDDDDDalla s aa aad", - "dcDDDDDDahha ad", - "daDDDDDOahhb aaaaa ad", - "daDDDDDOakja ammja qq ad", - "daDDDDDaaaaa anhh pp ad", - "daDDDDDbhhb hhh pp ad", - "dcDDDDDahhabaahhh qq ad", - "daDDDDDaIJahjahriaA ad", - "daaaaaaaacahkabacaaccaad", - "ddddddddddaacadddddddddd", - "dddddddddddddddddddddddd", - "dddddddddddddddddddddddd", - "dddddddddddddddddddddddd" - ], - "terrain": { - "a": "t_wall", - "b": "t_door_locked", - "c": "t_window_domestic", - "d": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], - "e": "t_sidewalk", - "f": [ - "t_tree", - "t_tree_pine", - "t_tree_pear", - "t_tree_plum", - "t_tree_cherry", - "t_tree_maple", - "t_tree_birch", - "t_tree_apple", - "t_tree_willow", - "t_tree_hickory", - "t_tree_young" - ], - "g": "t_sidewalk", - "h": "t_linoleum_gray", - "i": "t_linoleum_gray", - "j": "t_linoleum_gray", - "k": "t_linoleum_gray", - "l": "t_linoleum_gray", - "m": "t_linoleum_gray", - "n": "t_linoleum_gray", - "o": "t_linoleum_gray", - "p": "t_floor", - "q": "t_floor", - "r": "t_linoleum_gray", - "s": "t_floor", - "t": "t_floor", - "u": "t_floor", - "A": "t_floor", - "B": [ "t_shrub", "t_shrub", "t_shrub_strawberry", "t_shrub_blueberry" ], - "C": "t_fence_v", - "D": "t_concrete_floor", - "E": "t_wall_glass", - "F": "t_door_glass_c", - "G": "t_floor", - "H": "t_floor", - "I": "t_linoleum_gray", - "J": "t_linoleum_gray", - "K": "t_rock_floor", - "L": "t_rock_floor", - "M": "t_rock", - "N": "t_linoleum_gray", - "O": "t_linoleum_gray", - "P": "t_door_metal_locked", - "Q": "t_gates_mech_control", - "R": "t_linoleum_gray", - "v": "t_linoleum_gray", - "z": "t_railing_h" - }, - "furniture": { - "g": "f_dumpster", - "i": "f_oven", - "j": "f_sink", - "l": "f_bathtub", - "m": "f_counter", - "n": "f_fridge", - "o": "f_cupboard", - "p": "f_table", - "q": "f_chair", - "r": "f_trashcan", - "s": "f_locker", - "t": "f_sofa", - "u": "f_bookcase", - "A": "f_indoor_plant", - "G": "f_bed", - "H": "f_dresser", - "I": "f_washer", - "J": "f_dryer", - "K": "f_fireplace", - "N": "f_table", - "O": "f_locker", - "R": "f_rack", - "v": "f_chair" - }, - "toilets": { "k": { } }, - "place_loot": [ - { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 12, 12 ], "y": [ 7, 7 ] }, - { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 9, 9 ], "y": [ 7, 7 ] }, - { "group": "livingroom", "chance": 30, "repeat": [ 2 ], "x": [ 19, 20 ], "y": [ 7, 7 ] }, - { "group": "livingroom", "chance": 30, "repeat": [ 1 ], "x": [ 21, 21 ], "y": [ 6, 6 ] }, - { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 20, 20 ], "y": [ 4, 4 ] }, - { "group": "table_livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 16, 16 ], "y": [ 4, 6 ] }, - { "group": "table_livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 21, 21 ], "y": [ 7, 7 ] }, - { "group": "a_television", "chance": 100, "repeat": [ 1 ], "x": [ 19, 19 ], "y": [ 4, 4 ] }, - { "group": "homebooks", "chance": 80, "repeat": [ 2 ], "x": [ 21, 21 ], "y": [ 9, 10 ] }, - { "group": "homebooks", "chance": 80, "repeat": [ 2 ], "x": [ 16, 16 ], "y": [ 9, 10 ] }, - { "group": "softdrugs", "chance": 80, "repeat": [ 2 ], "x": [ 10, 10 ], "y": [ 14, 14 ] }, - { "group": "softdrugs", "chance": 80, "repeat": [ 2 ], "x": [ 12, 12 ], "y": [ 18, 18 ] }, - { "group": "tools_home", "chance": 80, "repeat": [ 2 ], "x": [ 7, 7 ], "y": [ 13, 13 ] }, - { "group": "cleaning_bulk", "chance": 80, "repeat": [ 2 ], "x": [ 7, 7 ], "y": [ 14, 14 ] }, - { "group": "dresser", "chance": 80, "repeat": [ 2 ], "x": [ 8, 9 ], "y": [ 18, 18 ] }, - { "group": "dresser", "chance": 80, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 4, 4 ] }, - { "group": "dresser", "chance": 80, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 5, 5 ] }, - { "group": "homebooks", "chance": 80, "repeat": [ 2 ], "x": [ 9, 9 ], "y": [ 3, 3 ] }, - { "group": "fridge", "chance": 80, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 15, 15 ] }, - { "group": "oven", "chance": 80, "repeat": [ 2 ], "x": [ 16, 16 ], "y": [ 18, 18 ] }, - { "group": "trash", "chance": 60, "repeat": [ 5 ], "x": [ 15, 15 ], "y": [ 18, 18 ] }, - { "group": "kitchen_nonfood", "chance": 60, "repeat": [ 5 ], "x": [ 14, 16 ], "y": [ 14, 14 ] }, - { "group": "dining", "chance": 80, "repeat": [ 4 ], "x": [ 19, 20 ], "y": [ 15, 16 ] }, - { "group": "bed", "chance": 60, "repeat": [ 4 ], "x": [ 20, 20 ], "y": [ 8, 8 ] }, - { "group": "bed", "chance": 60, "repeat": [ 4 ], "x": [ 10, 11 ], "y": [ 6, 7 ] }, - { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 14, 9 ], "y": [ 7, 3 ] }, - { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 21, 16 ], "y": [ 4, 10 ] }, - { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 21, 18 ], "y": [ 12, 18 ] } - ] - } - } -] diff --git a/data/mods/Fuji_Structures/worldgen/overmap_terrain.json b/data/mods/Fuji_Structures/worldgen/overmap_terrain.json index e8bf44f9fa3a6..2505fe2c05c03 100644 --- a/data/mods/Fuji_Structures/worldgen/overmap_terrain.json +++ b/data/mods/Fuji_Structures/worldgen/overmap_terrain.json @@ -417,33 +417,6 @@ "extras": "build", "mondensity": 2 }, - { - "type": "overmap_terrain", - "id": "house_34", - "copy-from": "generic_city_building", - "name": "house", - "color": "light_green", - "see_cost": 2, - "flags": [ "SIDEWALK", "GENERIC_LOOT" ] - }, - { - "type": "overmap_terrain", - "id": "house_35", - "copy-from": "generic_city_building", - "name": "house", - "color": "light_green", - "see_cost": 2, - "flags": [ "SIDEWALK", "GENERIC_LOOT" ] - }, - { - "type": "overmap_terrain", - "id": "house_36", - "copy-from": "generic_city_building", - "name": "house", - "color": "light_green", - "see_cost": 2, - "flags": [ "SIDEWALK", "GENERIC_LOOT" ] - }, { "type": "overmap_terrain", "id": "house_37", diff --git a/data/mods/Fuji_Structures/worldgen/regional_overlay.json b/data/mods/Fuji_Structures/worldgen/regional_overlay.json index c65a78e9cfca0..1ba25bdc3a19a 100644 --- a/data/mods/Fuji_Structures/worldgen/regional_overlay.json +++ b/data/mods/Fuji_Structures/worldgen/regional_overlay.json @@ -6,9 +6,6 @@ "houses": { "s_apt": 40, "s_apt_2": 40, - "house_34": 50, - "house_35": 50, - "house_36": 50, "house_37": 50, "house_38": 50, "house_39": 50, From 3e67d1360ef1dd001c38d011cae935921d57d227 Mon Sep 17 00:00:00 2001 From: curstwist <39442864+curstwist@users.noreply.github.com> Date: Sun, 17 May 2020 12:48:07 -0400 Subject: [PATCH 19/33] nerf vehcile spawns --- data/json/mapgen/house/house36.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/json/mapgen/house/house36.json b/data/json/mapgen/house/house36.json index 9b5b22c6bc773..6a960ea1e9251 100644 --- a/data/json/mapgen/house/house36.json +++ b/data/json/mapgen/house/house36.json @@ -69,8 +69,8 @@ { "item": "stereo", "x": 21, "y": 4 } ], "place_vehicles": [ - { "vehicle": "car", "x": 3, "y": 14, "chance": 100, "rotation": 270 }, - { "vehicle": "tricycle", "x": 4, "y": 7, "chance": 100, "status": 0 } + { "vehicle": "car", "x": 3, "y": 14, "chance": 60, "rotation": 270 }, + { "vehicle": "tricycle", "x": 4, "y": 7, "chance": 40, "status": 0 } ] } }, From 2a706cc8d1983d7afa2e418efe0654aee91e4d4d Mon Sep 17 00:00:00 2001 From: Ramza13 <52087122+Ramza13@users.noreply.github.com> Date: Sun, 17 May 2020 20:31:17 -0400 Subject: [PATCH 20/33] More consume fixes --- src/activity_actor.cpp | 61 +++++++++++++++++++++++++++++------------- src/activity_actor.h | 19 ++++++++----- src/avatar_action.cpp | 8 ++---- src/consumption.cpp | 8 +++--- src/game.cpp | 4 ++- src/handle_liquid.cpp | 3 +-- src/iexamine.cpp | 13 +++------ src/item.cpp | 8 +++--- src/player.h | 4 +-- src/vehicle_use.cpp | 4 +-- 10 files changed, 78 insertions(+), 54 deletions(-) diff --git a/src/activity_actor.cpp b/src/activity_actor.cpp index c2611680bcd6a..24abca877ad25 100644 --- a/src/activity_actor.cpp +++ b/src/activity_actor.cpp @@ -588,11 +588,29 @@ std::unique_ptr open_gate_activity_actor::deserialize( JsonIn &j void consume_activity_actor::start( player_activity &act, Character &guy ) { - if( !loc ) { - debugmsg( "Item location to be consumed should not be null." ); + int moves; + if( consume_location ) { + const auto ret = g->u.will_eat( *consume_location, true ); + if( !ret.success() ) { + open_consume_menu = false; + return; + } else { + force = true; + } + moves = to_moves( guy.get_consume_time( *consume_location ) ); + } else if( !consume_item.is_null() ) { + const auto ret = g->u.will_eat( consume_item, true ); + if( !ret.success() ) { + open_consume_menu = false; + return; + } else { + force = true; + } + moves = to_moves( guy.get_consume_time( consume_item ) ); + } else { + debugmsg( "Item/location to be consumed should not be null." ); return; } - int moves = to_moves( guy.get_consume_time( *loc ) ); act.moves_total = moves; act.moves_left = moves; @@ -600,30 +618,34 @@ void consume_activity_actor::start( player_activity &act, Character &guy ) void consume_activity_actor::finish( player_activity &act, Character & ) { - if( !loc ) { - debugmsg( "Item location to be consumed should not be null." ); - act.set_to_null(); - return; - } - if( loc.where() == item_location::type::character ) { - g->u.consume( loc ); - } else if( g->u.consume( *loc ) ) { - loc.remove_item(); - } - if( g->u.get_value( "THIEF_MODE_KEEP" ) != "YES" ) { - g->u.set_value( "THIEF_MODE", "THIEF_ASK" ); + if( consume_location ) { + if( consume_location.where() == item_location::type::character ) { + g->u.consume( consume_location, force ); + } else if( g->u.consume( *consume_location, force ) ) { + consume_location.remove_item(); + } + if( g->u.get_value( "THIEF_MODE_KEEP" ) != "YES" ) { + g->u.set_value( "THIEF_MODE", "THIEF_ASK" ); + } + } else if( !consume_item.is_null() ) { + g->u.consume( consume_item, force ); + } else { + debugmsg( "Item location/name to be consumed should not be null." ); } + act.set_to_null(); if( open_consume_menu ) { avatar_action::eat( g->u ); } - act.set_to_null(); } void consume_activity_actor::serialize( JsonOut &jsout ) const { jsout.start_object(); - jsout.member( "loc", loc ); + jsout.member( "consume_location", consume_location ); + jsout.member( "consume_item", consume_item ); + jsout.member( "open_consume_menu", open_consume_menu ); + jsout.member( "force", force ); jsout.end_object(); } @@ -635,7 +657,10 @@ std::unique_ptr consume_activity_actor::deserialize( JsonIn &jsi JsonObject data = jsin.get_object(); - data.read( "loc", actor.loc ); + data.read( "consume_location", actor.consume_location ); + data.read( "consume_item", actor.consume_item ); + data.read( "open_consume_menu", actor.open_consume_menu ); + data.read( "force", actor.force ); return actor.clone(); } diff --git a/src/activity_actor.h b/src/activity_actor.h index eae17c1bc2571..59997a72f3838 100644 --- a/src/activity_actor.h +++ b/src/activity_actor.h @@ -9,6 +9,7 @@ #include "clone_ptr.h" #include "item_location.h" +#include "item.h" #include "point.h" #include "type_id.h" @@ -361,19 +362,25 @@ class open_gate_activity_actor : public activity_actor class consume_activity_actor : public activity_actor { private: - item_location loc; - bool open_consume_menu; - + item_location consume_location; + item consume_item; + bool open_consume_menu = false; + bool force = false; /** * @pre @p other is a consume_activity_actor */ bool can_resume_with_internal( const activity_actor &other, const Character & ) const override { const consume_activity_actor &c_actor = static_cast( other ); - return loc == c_actor.loc; + return ( consume_location == c_actor.consume_location && + open_consume_menu == c_actor.open_consume_menu && + force == c_actor.force && &consume_item == &c_actor.consume_item ); } public: - consume_activity_actor( const item_location &loc, bool open_consume_menu = false ) : - loc( loc ), open_consume_menu( open_consume_menu ) {} + consume_activity_actor( const item_location &consume_location, bool open_consume_menu = false ) : + consume_location( consume_location ), open_consume_menu( open_consume_menu ) {} + + consume_activity_actor( item consume_item, bool open_consume_menu = false ) : + consume_item( consume_item ), open_consume_menu( open_consume_menu ) {} activity_id get_type() const override { return activity_id( "ACT_CONSUME" ); diff --git a/src/avatar_action.cpp b/src/avatar_action.cpp index 88d98a088f762..cd2497ff50be7 100644 --- a/src/avatar_action.cpp +++ b/src/avatar_action.cpp @@ -1024,12 +1024,10 @@ bool avatar_action::eat_here( avatar &you ) add_msg( _( "You're too full to eat the leaves from the %s." ), g->m.ter( you.pos() )->name() ); return true; } else { - you.moves -= 400; g->m.ter_set( you.pos(), t_grass ); add_msg( _( "You eat the underbrush." ) ); item food( "underbrush", calendar::turn, 1 ); - you.consume( food ); - //I tried to convert this the to use the consume activity but couldn't get the transformation of this item into an item location quite right + you.assign_activity( player_activity( consume_activity_actor( food, false ) ) ); return true; } } @@ -1039,11 +1037,9 @@ bool avatar_action::eat_here( avatar &you ) add_msg( _( "You're too full to graze." ) ); return true; } else { - you.moves -= 400; add_msg( _( "You eat the grass." ) ); item food( item( "grass", calendar::turn, 1 ) ); - you.consume( food ); - //I tried to convert this the to use the consume activity but couldn't get the transformation of this item into an item location quite right + you.assign_activity( player_activity( consume_activity_actor( food, false ) ) ); if( g->m.ter( you.pos() ) == t_grass_tall ) { g->m.ter_set( you.pos(), t_grass_long ); } else if( g->m.ter( you.pos() ) == t_grass_long ) { diff --git a/src/consumption.cpp b/src/consumption.cpp index 1a39ccbd52ea3..d42e450594a50 100644 --- a/src/consumption.cpp +++ b/src/consumption.cpp @@ -1766,7 +1766,7 @@ static bool consume_med( item &target, player &you ) return target.charges <= 0; } -bool player::consume( item &target ) +bool player::consume( item &target, bool force ) { if( target.is_null() ) { add_msg_if_player( m_info, _( "You do not have that item." ) ); @@ -1791,7 +1791,7 @@ bool player::consume( item &target ) return false; } if( consume_med( comest, *this ) || - eat( comest, *this ) || feed_reactor_with( comest ) || feed_furnace_with( comest ) || + eat( comest, *this, force ) || feed_reactor_with( comest ) || feed_furnace_with( comest ) || fuel_bionic_with( comest ) ) { if( &target != &comest ) { @@ -1804,7 +1804,7 @@ bool player::consume( item &target ) return false; } -bool player::consume( item_location loc ) +bool player::consume( item_location loc, bool force ) { if( !loc ) { debugmsg( "Null loc to consume." ); @@ -1815,7 +1815,7 @@ bool player::consume( item_location loc ) bool worn = is_worn( target ); const bool inv_item = !( wielding || worn ); - if( consume( target ) ) { + if( consume( target, force ) ) { i_rem( loc.get_item() ); diff --git a/src/game.cpp b/src/game.cpp index ac6fbd667e33e..6819fad9f6f5d 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -1697,7 +1697,9 @@ void game::process_activity() return; } - if( calendar::once_every( 5_minutes ) ) { + if( calendar::once_every( 5_minutes ) + && u.activity.moves_total > to_moves + ( 5_minutes ) ) {//This is a hack to prevent an issue with the consume menu popping up again when this fires, since eating is not at present ever 5 minutes long this works ui_manager::redraw(); refresh_display(); } diff --git a/src/handle_liquid.cpp b/src/handle_liquid.cpp index db5f20cecd8a9..7cceff2a2f634 100644 --- a/src/handle_liquid.cpp +++ b/src/handle_liquid.cpp @@ -333,8 +333,7 @@ static bool perform_liquid_transfer( item &liquid, const tripoint *const source_ switch( target.dest_opt ) { case LD_CONSUME: - //I tried to convert this the to use the consume activity but couldn't get the transformation of this item into an item location quite right - g->u.consume( liquid ); + g->u.assign_activity( player_activity( consume_activity_actor( liquid, false ) ) ); transfer_ok = true; break; case LD_ITEM: { diff --git a/src/iexamine.cpp b/src/iexamine.cpp index 802986f839bd2..b479ef3b947df 100644 --- a/src/iexamine.cpp +++ b/src/iexamine.cpp @@ -1611,11 +1611,9 @@ static bool can_drink_nectar( const player &p ) static bool drink_nectar( player &p ) { if( can_drink_nectar( p ) ) { - p.moves -= to_moves( 30_seconds ); add_msg( _( "You drink some nectar." ) ); item nectar( "nectar", calendar::turn, 1 ); - p.consume( nectar ); - //I tried to convert this the to use the consume activity but couldn't get the transformation of this item into an item location quite right + p.assign_activity( player_activity( consume_activity_actor( nectar, false ) ) ); return true; } @@ -1656,11 +1654,9 @@ void iexamine::flower_poppy( player &p, const tripoint &examp ) g->m.furnname( examp ) ) ) { return; } - p.moves -= to_moves( 30_seconds ); // You take your time... add_msg( _( "You slowly suck up the nectar." ) ); item poppy( "poppy_nectar", calendar::turn, 1 ); - p.consume( poppy ); - //I tried to convert this the to use the consume activity but couldn't get the transformation of this item into an item location quite right + p.assign_activity( player_activity( consume_activity_actor( poppy, false ) ) ); p.mod_fatigue( 20 ); p.add_effect( effect_pkill2, 7_minutes ); // Please drink poppy nectar responsibly. @@ -3135,11 +3131,10 @@ void iexamine::keg( player &p, const tripoint &examp ) return; case HAVE_A_DRINK: - if( !p.consume( drink ) ) { - //I tried to convert this the to use the consume activity but couldn't get the transformation of this item into an item location quite right + if( !p.can_consume( drink ) ) { return; // They didn't actually drink } - + p.assign_activity( player_activity( consume_activity_actor( drink, false ) ) ); if( drink.charges == 0 ) { add_msg( _( "You squeeze the last drops of %1$s from the %2$s." ), drink_tname, keg_name ); diff --git a/src/item.cpp b/src/item.cpp index 0764aa70820b2..4882662e30f49 100644 --- a/src/item.cpp +++ b/src/item.cpp @@ -6154,13 +6154,15 @@ bool item::is_comestible() const bool item::is_food() const { - return is_comestible() && ( get_comestible()->comesttype == "FOOD" || - get_comestible()->comesttype == "DRINK" ); + const std::string comest_type = get_comestible() ? get_comestible()->comesttype : ""; + return is_comestible() && ( comest_type == "FOOD" || + comest_type == "DRINK" ); } bool item::is_medication() const { - return is_comestible() && get_comestible()->comesttype == "MED"; + const std::string comest_type = get_comestible() ? get_comestible()->comesttype : ""; + return is_comestible() && comest_type == "MED"; } bool item::is_brewable() const diff --git a/src/player.h b/src/player.h index c25a677d35ed4..e37f8bc2afe1c 100644 --- a/src/player.h +++ b/src/player.h @@ -334,10 +334,10 @@ class player : public Character void siphon( vehicle &veh, const itype_id &desired_liquid ); /** Used for eating object at pos, returns true if object is removed from inventory (last charge was consumed) */ - bool consume( item_location loc ); + bool consume( item_location loc, bool force = false ); /** Used for eating a particular item that doesn't need to be in inventory. * Returns true if the item is to be removed (doesn't remove). */ - bool consume( item &target ); + bool consume( item &target, bool force = false ); /** Handles the enjoyability value for a book. **/ int book_fun_for( const item &book, const player &p ) const; diff --git a/src/vehicle_use.cpp b/src/vehicle_use.cpp index eca2bb36253b5..de26d8d636a27 100644 --- a/src/vehicle_use.cpp +++ b/src/vehicle_use.cpp @@ -2072,10 +2072,8 @@ void vehicle::interact_with( const tripoint &pos, int interact_part ) case DRINK: { item water( "water_clean", 0 ); if( g->u.can_consume( water ) ) { - //I tried to convert this the to use the consume activity but couldn't get the transformation of this item into an item location quite right - g->u.consume( water ); + g->u.assign_activity( player_activity( consume_activity_actor( water, false ) ) ); drain( "water_clean", 1 ); - g->u.moves -= 250; } return; } From 3e49b53f0d052ab0aead73d7d8ec42d1cc3394b0 Mon Sep 17 00:00:00 2001 From: Eric <52087122+Ramza13@users.noreply.github.com> Date: Mon, 18 May 2020 15:09:21 -0400 Subject: [PATCH 21/33] Gorging penalties (#40284) --- data/json/effects.json | 46 +++++++++++++ src/character.cpp | 143 ++++++++++++++++++++++++----------------- 2 files changed, 130 insertions(+), 59 deletions(-) diff --git a/data/json/effects.json b/data/json/effects.json index 401444703850e..aa7beec6bceb0 100644 --- a/data/json/effects.json +++ b/data/json/effects.json @@ -1950,5 +1950,51 @@ "id": "ignore_fall_damage", "//": "Used for translocation via teleporter_list as a way to avoid fall damage by teleporting Z levels", "flags": [ "EFFECT_FEATHER_FALL" ] + }, + { + "type": "effect_type", + "id": "hunger_full", + "name": [ "Full" ], + "desc": [ "You feel quite full, and a bit sluggish." ], + "apply_message": "You feel quite full, and a bit sluggish.", + "rating": "bad", + "base_mods": { "speed_mod": [ -2 ], "fatigue_amount": [ 1 ] } + }, + { + "type": "effect_type", + "id": "hunger_engorged", + "name": [ "Engorged" ], + "desc": [ "Your stomach is full to bursting. This was a mistake." ], + "apply_message": "Your stomach is full to bursting. This was a mistake.", + "rating": "bad", + "base_mods": { "speed_mod": [ -10 ], "fatigue_amount": [ 2 ], "vomit_chance": [ 5 ], "vomit_tick": [ 60 ], "pain_amount": [ 3 ] } + }, + { + "type": "effect_type", + "id": "hunger_satisfied" + }, + { + "type": "effect_type", + "id": "hunger_hungry" + }, + { + "type": "effect_type", + "id": "hunger_very_hungry" + }, + { + "type": "effect_type", + "id": "hunger_near_starving" + }, + { + "type": "effect_type", + "id": "hunger_starving" + }, + { + "type": "effect_type", + "id": "hunger_famished" + }, + { + "type": "effect_type", + "id": "hunger_blank" } ] diff --git a/src/character.cpp b/src/character.cpp index 9b69f16c96802..68cc655e72136 100644 --- a/src/character.cpp +++ b/src/character.cpp @@ -137,14 +137,23 @@ static const efftype_id effect_heating_bionic( "heating_bionic" ); static const efftype_id effect_heavysnare( "heavysnare" ); static const efftype_id effect_hot( "hot" ); static const efftype_id effect_hot_speed( "hot_speed" ); +static const efftype_id effect_hunger_blank( "hunger_blank" ); +static const efftype_id effect_hunger_engorged( "hunger_engorged" ); +static const efftype_id effect_hunger_famished( "hunger_famished" ); +static const efftype_id effect_hunger_full( "hunger_full" ); +static const efftype_id effect_hunger_hungry( "hunger_hungry" ); +static const efftype_id effect_hunger_near_starving( "hunger_near_starving" ); +static const efftype_id effect_hunger_satisfied( "hunger_satisfied" ); +static const efftype_id effect_hunger_starving( "hunger_starving" ); +static const efftype_id effect_hunger_very_hungry( "hunger_very_hungry" ); static const efftype_id effect_in_pit( "in_pit" ); static const efftype_id effect_infected( "infected" ); static const efftype_id effect_jetinjector( "jetinjector" ); static const efftype_id effect_lack_sleep( "lack_sleep" ); static const efftype_id effect_lightsnare( "lightsnare" ); static const efftype_id effect_lying_down( "lying_down" ); -static const efftype_id effect_melatonin_supplements( "melatonin" ); static const efftype_id effect_masked_scent( "masked_scent" ); +static const efftype_id effect_melatonin_supplements( "melatonin" ); static const efftype_id effect_mending( "mending" ); static const efftype_id effect_narcosis( "narcosis" ); static const efftype_id effect_nausea( "nausea" ); @@ -4264,64 +4273,23 @@ std::pair Character::get_thirst_description() const std::pair Character::get_hunger_description() const { - const bool calorie_deficit = get_bmi() < character_weight_category::normal; - const units::volume contains = stomach.contains(); - const units::volume cap = stomach.capacity( *this ); - std::string hunger_string; - nc_color hunger_color = c_white; - // i ate just now! - const bool just_ate = stomach.time_since_ate() < 15_minutes; - // i ate a meal recently enough that i shouldn't need another meal - const bool recently_ate = stomach.time_since_ate() < 3_hours; - if( calorie_deficit ) { - if( contains >= cap ) { - hunger_string = _( "Engorged" ); - hunger_color = c_green; - } else if( contains > cap * 3 / 4 ) { - hunger_string = _( "Sated" ); - hunger_color = c_green; - } else if( just_ate && contains > cap / 2 ) { - hunger_string = _( "Full" ); - hunger_color = c_green; - } else if( just_ate ) { - hunger_string = _( "Hungry" ); - hunger_color = c_yellow; - } else if( recently_ate ) { - hunger_string = _( "Very Hungry" ); - hunger_color = c_yellow; - } else if( get_bmi() < character_weight_category::emaciated ) { - hunger_string = _( "Starving!" ); - hunger_color = c_red; - } else if( get_bmi() < character_weight_category::underweight ) { - hunger_string = _( "Near starving" ); - hunger_color = c_red; - } else { - hunger_string = _( "Famished" ); - hunger_color = c_light_red; - } - } else { - if( contains >= cap * 5 / 6 ) { - hunger_string = _( "Engorged" ); - hunger_color = c_green; - } else if( contains > cap * 11 / 20 ) { - hunger_string = _( "Sated" ); - hunger_color = c_green; - } else if( recently_ate && contains >= cap * 3 / 8 ) { - hunger_string = _( "Full" ); - hunger_color = c_green; - } else if( !just_ate && ( recently_ate || contains > 0_ml ) ) { - hunger_string.clear(); - } else { - if( get_bmi() > character_weight_category::overweight ) { - hunger_string = _( "Hungry" ); - } else { - hunger_string = _( "Very Hungry" ); - } - hunger_color = c_yellow; + std::map > hunger_states = { + { effect_hunger_engorged, std::make_pair( _( "Engorged" ), c_red ) }, + { effect_hunger_full, std::make_pair( _( "Full" ), c_yellow ) }, + { effect_hunger_satisfied, std::make_pair( _( "Satisfied" ), c_green ) }, + { effect_hunger_blank, std::make_pair( _( "" ), c_white ) }, + { effect_hunger_hungry, std::make_pair( _( "Hungry" ), c_yellow ) }, + { effect_hunger_very_hungry, std::make_pair( _( "Very Hungry" ), c_yellow ) }, + { effect_hunger_near_starving, std::make_pair( _( "Near starving" ), c_red ) }, + { effect_hunger_starving, std::make_pair( _( "Starving!" ), c_red ) }, + { effect_hunger_famished, std::make_pair( _( "Famished" ), c_light_red ) } + }; + for( auto &hunger_state : hunger_states ) { + if( has_effect( hunger_state.first ) ) { + return hunger_state.second; } } - - return std::make_pair( hunger_string, hunger_color ); + return std::make_pair( _( "ERROR!" ), c_light_red ); } std::pair Character::get_fatigue_description() const @@ -4697,7 +4665,7 @@ void Character::update_stomach( const time_point &from, const time_point &to ) // you're engorged! your stomach is full to bursting! set_hunger( -61 ); } else if( stomach.contains() >= stomach_capacity / 2 && get_hunger() > -21 ) { - // sated + // full set_hunger( -21 ); } else if( stomach.contains() >= stomach_capacity / 8 && get_hunger() > -1 ) { // that's really all the food you need to feel full @@ -4722,7 +4690,7 @@ void Character::update_stomach( const time_point &from, const time_point &to ) // you're engorged! your stomach is full to bursting! set_hunger( -61 ); } else if( stomach.contains() >= stomach_capacity * 3 / 4 && get_hunger() > -21 ) { - // sated + // full set_hunger( -21 ); } else if( stomach.contains() >= stomach_capacity / 2 && get_hunger() > -1 ) { // that's really all the food you need to feel full @@ -4741,6 +4709,63 @@ void Character::update_stomach( const time_point &from, const time_point &to ) if( mycus || mouse ) { set_thirst( 0 ); } + + const bool calorie_deficit = get_bmi() < character_weight_category::normal; + const units::volume contains = stomach.contains(); + const units::volume cap = stomach.capacity( *this ); + + efftype_id hunger_effect; + // i ate just now! + const bool just_ate = stomach.time_since_ate() < 15_minutes; + // i ate a meal recently enough that i shouldn't need another meal + const bool recently_ate = stomach.time_since_ate() < 3_hours; + if( calorie_deficit ) { + if( contains >= cap ) { + hunger_effect = effect_hunger_engorged; + } else if( contains > cap * 3 / 4 ) { + hunger_effect = effect_hunger_full; + } else if( just_ate && contains > cap / 2 ) { + hunger_effect = effect_hunger_satisfied; + } else if( just_ate ) { + hunger_effect = effect_hunger_hungry; + } else if( recently_ate ) { + hunger_effect = effect_hunger_very_hungry; + } else if( get_bmi() < character_weight_category::underweight ) { + hunger_effect = effect_hunger_near_starving; + } else if( get_bmi() < character_weight_category::emaciated ) { + hunger_effect = effect_hunger_starving; + } else { + hunger_effect = effect_hunger_famished; + } + } else { + if( contains >= cap * 5 / 6 ) { + hunger_effect = effect_hunger_engorged; + } else if( contains > cap * 11 / 20 ) { + hunger_effect = effect_hunger_full; + } else if( recently_ate && contains >= cap * 3 / 8 ) { + hunger_effect = effect_hunger_satisfied; + } else if( !just_ate && ( recently_ate || contains > 0_ml ) ) { + hunger_effect = effect_hunger_blank; + } else { + if( get_bmi() > character_weight_category::overweight ) { + hunger_effect = effect_hunger_hungry; + } else { + hunger_effect = effect_hunger_very_hungry; + } + } + } + if( !has_effect( hunger_effect ) ) { + remove_effect( effect_hunger_engorged ); + remove_effect( effect_hunger_full ); + remove_effect( effect_hunger_satisfied ); + remove_effect( effect_hunger_hungry ); + remove_effect( effect_hunger_very_hungry ); + remove_effect( effect_hunger_near_starving ); + remove_effect( effect_hunger_starving ); + remove_effect( effect_hunger_famished ); + remove_effect( effect_hunger_blank ); + add_effect( hunger_effect, 24_hours, num_bp, true ); + } } void Character::update_needs( int rate_multiplier ) From a24f20e7d2ea895b52e4823df22283c040e093ae Mon Sep 17 00:00:00 2001 From: Pupsi Mupsi <44737997+Pupsi-Mupsi@users.noreply.github.com> Date: Mon, 18 May 2020 21:36:30 +0200 Subject: [PATCH 22/33] Update workshop.json --- data/json/items/tool/workshop.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/json/items/tool/workshop.json b/data/json/items/tool/workshop.json index ed9d7e6d48a9e..b2ab534aad535 100644 --- a/data/json/items/tool/workshop.json +++ b/data/json/items/tool/workshop.json @@ -882,7 +882,7 @@ [ "SCREW_FINE", 1 ], [ "BUTCHER", 11 ], [ "FILE", 2 ], - [ "REAM", 1 ], + [ "REAM", 2 ], [ "VISE", 1 ] ], "use_action": [ "HAMMER", "CROWBAR" ] From 3598dfa38ab5a0c72f506d8f8efd83e015842c77 Mon Sep 17 00:00:00 2001 From: Testudo-Cultu <65055502+Testudo-Cultu@users.noreply.github.com> Date: Mon, 18 May 2020 14:46:52 -0500 Subject: [PATCH 23/33] Revamped flaming eyes, made effect_tindrift (#40494) Revamped flaming eyes' attack and made Tindalos rifts not be hardcoded to teleglow so it can be used by other enemies or events --- data/json/effects.json | 24 ++++++++++++++++ src/monattack.cpp | 22 +++++++++++++-- src/player_hardcoded_effects.cpp | 48 +++++++++++++++++--------------- 3 files changed, 69 insertions(+), 25 deletions(-) diff --git a/data/json/effects.json b/data/json/effects.json index aa7beec6bceb0..29fbcc6e83be5 100644 --- a/data/json/effects.json +++ b/data/json/effects.json @@ -862,6 +862,30 @@ "resist_traits": [ "POISRESIST" ], "base_mods": { "speed_mod": [ -10 ], "str_mod": [ -1 ], "dex_mod": [ -1 ] } }, + { + "type": "effect_type", + "id": "taint", + "name": [ "Touched mind", "Touched mind", "Tainted mind", "Badly tainted mind" ], + "miss_messages": [ [ "Your sense of reality warps!", 3 ] ], + "speed_name": "Tainted", + "desc": [ + "You are disoriented as strange visions flash through your mind.", + "You are overwhelmed by the disturbing imagery and concepts you're flooded with.", + "You can't comprehend the things around you…", + "You don't know what is and isn't real anymore…" + ], + "rating": "bad", + "max_intensity": 4, + "max_duration": "2 h", + "int_add_val": 1, + "int_dur_factor": "5 m", + "base_mods": { "speed_mod": [ -20 ], "str_mod": [ 0 ], "dex_mod": [ -1 ], "per_mod": [ -2 ], "vomit_chance": [ 20 ] }, + "scaling_mods": { "speed_mod": [ -10 ], "int_mod": [ -2 ], "str_mod": [ -1 ], "dex_mod": [ -1 ], "per_mod": [ -2 ] } + }, + { + "type": "effect_type", + "id": "tindrift" + }, { "type": "effect_type", "id": "visuals", diff --git a/src/monattack.cpp b/src/monattack.cpp index 4c40b1b8a909b..a95150298bf45 100644 --- a/src/monattack.cpp +++ b/src/monattack.cpp @@ -102,6 +102,7 @@ static const efftype_id effect_got_checked( "got_checked" ); static const efftype_id effect_grabbed( "grabbed" ); static const efftype_id effect_grabbing( "grabbing" ); static const efftype_id effect_grown_of_fuse( "grown_of_fuse" ); +static const efftype_id effect_hallu( "hallu" ); static const efftype_id effect_has_bag( "has_bag" ); static const efftype_id effect_infected( "infected" ); static const efftype_id effect_laserlocked( "laserlocked" ); @@ -115,8 +116,9 @@ static const efftype_id effect_rat( "rat" ); static const efftype_id effect_shrieking( "shrieking" ); static const efftype_id effect_slimed( "slimed" ); static const efftype_id effect_stunned( "stunned" ); +static const efftype_id effect_taint( "taint" ); static const efftype_id effect_targeted( "targeted" ); -static const efftype_id effect_teleglow( "teleglow" ); +static const efftype_id effect_tindrift( "tindrift" ); static const efftype_id effect_under_op( "under_operation" ); static const skill_id skill_gun( "gun" ); @@ -2861,9 +2863,23 @@ bool mattack::stare( monster *z ) } else { add_msg( m_bad, _( "You feel like you're being watched, it makes you sick." ) ); } - g->u.add_effect( effect_teleglow, 80_minutes ); + g->u.add_effect( effect_taint, rng( 20_minutes, 60_minutes ) ); + //Check severity before adding more debuffs + if( g->u.get_effect_int( effect_taint ) > 2 ) { + g->u.add_effect( effect_hallu, 30_minutes ); + //Check if target is a player before spawning hallucinations + if( g->u.is_player() && one_in( 2 ) ) { + g->spawn_hallucination( g->u.pos() + tripoint( rng( -10, 10 ), rng( -10, 10 ), 0 ) ); + } + if( one_in( 12 ) ) { + g->u.add_effect( effect_blind, 5_minutes ); + add_msg( m_bad, _( "Your sight darkens as the visions overtake you!" ) ); + } + } + if( g->u.get_effect_int( effect_taint ) >= 3 && one_in( 12 ) ) { + g->u.add_effect( effect_tindrift, 5_turns ); + } } - return true; } diff --git a/src/player_hardcoded_effects.cpp b/src/player_hardcoded_effects.cpp index 315f941e19fee..946fbe1e3cf03 100644 --- a/src/player_hardcoded_effects.cpp +++ b/src/player_hardcoded_effects.cpp @@ -86,6 +86,7 @@ static const efftype_id effect_strong_antibiotic( "strong_antibiotic" ); static const efftype_id effect_stunned( "stunned" ); static const efftype_id effect_tapeworm( "tapeworm" ); static const efftype_id effect_teleglow( "teleglow" ); +static const efftype_id effect_tindrift( "tindrift" ); static const efftype_id effect_tetanus( "tetanus" ); static const efftype_id effect_toxin_buildup( "toxin_buildup" ); static const efftype_id effect_valium( "valium" ); @@ -624,6 +625,16 @@ void player::hardcoded_effects( effect &it ) mod_fatigue( dice( 1, 6 ) ); } } + } else if( id == effect_tindrift ) { + add_msg_if_player( m_bad, _( "You are beset with a vision of a prowling beast." ) ); + for( const tripoint &dest : g->m.points_in_radius( pos(), 6 ) ) { + if( g->m.is_cornerfloor( dest ) ) { + g->m.add_field( dest, fd_tindalos_rift, 3 ); + add_msg_if_player( m_info, _( "Your surroundings are permeated with a foul scent." ) ); + //Remove the effect, since it's done all it needs to do to the target. + remove_effect( effect_tindrift ); + } + } } else if( id == effect_teleglow ) { // Default we get around 300 duration points per teleport (possibly more // depending on the source). @@ -646,29 +657,22 @@ void player::hardcoded_effects( effect &it ) it.set_duration( 0_turns ); } } - if( one_in( 7200 - ( dur - 360_minutes ) / 4_turns ) ) { - add_msg_if_player( m_bad, _( "You are beset with a vision of a prowling beast." ) ); - for( const tripoint &dest : g->m.points_in_radius( pos(), 6 ) ) { - if( g->m.is_cornerfloor( dest ) ) { - g->m.add_field( dest, fd_tindalos_rift, 3 ); - add_msg_if_player( m_info, _( "Your surroundings are permeated with a foul scent." ) ); - break; - } - } - if( one_in( 2 ) ) { - // Set ourselves up for removal - it.set_duration( 0_turns ); - } + } + if( one_in( 7200 - ( dur - 360_minutes ) / 4_turns ) ) { + //Spawn a tindalos rift via effect_tindrift rather than it being hard-coded to teleglow + add_effect( effect_tindrift, 5_turns ); + + if( one_in( 2 ) ) { + // Set ourselves up for removal + it.set_duration( 0_turns ); } - if( one_in( 7200 - ( ( dur - 600_minutes ) / 30_seconds ) ) && one_in( 20 ) ) { - if( !is_npc() ) { - add_msg( m_bad, _( "You pass out." ) ); - } - fall_asleep( 2_hours ); - if( one_in( 6 ) ) { - // Set ourselves up for removal - it.set_duration( 0_turns ); - } + } + if( one_in( 7200 - ( ( dur - 600_minutes ) / 30_seconds ) ) && one_in( 20 ) ) { + add_msg_if_player( m_bad, _( "You pass out." ) ); + fall_asleep( 2_hours ); + if( one_in( 6 ) ) { + // Set ourselves up for removal + it.set_duration( 0_turns ); } } if( dur > 6_hours ) { From 74364f63d1a0dcdfe1e70eed0d06cfe63bc0416a Mon Sep 17 00:00:00 2001 From: Nannaquin Date: Mon, 18 May 2020 12:17:08 -0400 Subject: [PATCH 24/33] Adjust weight and length of jackhammer to be in line with realism --- data/json/items/tool/workshop.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/data/json/items/tool/workshop.json b/data/json/items/tool/workshop.json index ed9d7e6d48a9e..af449d52514cb 100644 --- a/data/json/items/tool/workshop.json +++ b/data/json/items/tool/workshop.json @@ -379,8 +379,9 @@ "type": "TOOL", "name": { "str": "jackhammer" }, "description": "This is a construction tool for drilling through hard rock or other surfaces. It runs on gasoline. Use it (if loaded) to blast a hole in adjacent solid terrain.", - "weight": "15875 g", + "weight": "27215 g", "volume": "5 L", + "longest_side": "92 cm", "price": 40000, "price_postapoc": 1000, "to_hit": -8, From 8cc5cbf882b28e6c68d3e42e7c96c5ba3d608c8a Mon Sep 17 00:00:00 2001 From: Rail-Runner <8814734+Rail-Runner@users.noreply.github.com> Date: Fri, 15 May 2020 09:39:33 +0300 Subject: [PATCH 25/33] Allow installing AR-specific gunmods on other AR-based weapons --- data/json/items/gunmod/mechanism.json | 4 ++-- data/json/recipes/recipe_weapon.json | 16 ++++++++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/data/json/items/gunmod/mechanism.json b/data/json/items/gunmod/mechanism.json index 2e6556bc7bfb9..5230986522b0f 100644 --- a/data/json/items/gunmod/mechanism.json +++ b/data/json/items/gunmod/mechanism.json @@ -34,7 +34,7 @@ "symbol": ":", "color": "red", "location": "mechanism", - "mod_targets": [ "ar15" ], + "mod_targets": [ "ar15", "ar15_retool_300blk", "ar_pistol", "oa93" ], "//": "Install time short since it drops in, hinging open the AR being all the 'skill' necessary. Precision drop marginal since it'd change how semi and FA trigger pulls feel.", "install_time": "5 m", "dispersion_modifier": 10, @@ -56,7 +56,7 @@ "symbol": ":", "color": "red", "location": "mechanism", - "mod_targets": [ "ar15" ], + "mod_targets": [ "ar15", "ar15_retool_300blk", "ar_pistol", "oa93" ], "//": "Sort of long install time. Gotta grind down the carrier trip to SP1-ish length. Unfortunately, since you're sort of guessing how long that is, the AR's timing with this installed will be borked.(disco might be disengaged at non-ideal times).", "install_time": "25 m", "dispersion_modifier": 40, diff --git a/data/json/recipes/recipe_weapon.json b/data/json/recipes/recipe_weapon.json index 2114b9bd293d5..4891838709b9e 100644 --- a/data/json/recipes/recipe_weapon.json +++ b/data/json/recipes/recipe_weapon.json @@ -1430,7 +1430,16 @@ "book_learn": [ [ "manual_rifle", 5 ], [ "textbook_anarch", 5 ] ], "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "SAW_M_FINE", "level": 1 }, { "id": "DRILL", "level": 1 } ], "tools": [ - [ [ "ar15", -1 ], [ "h&k416a5", -1 ], [ "m27iar", -1 ], [ "m4a1", -1 ], [ "m16a4", -1 ] ], + [ + [ "ar15", -1 ], + [ "ar15_retool_300blk", -1 ], + [ "ar_pistol", -1 ], + [ "oa93", -1 ], + [ "h&k416a5", -1 ], + [ "m27iar", -1 ], + [ "m4a1", -1 ], + [ "m16a4", -1 ] + ], [ [ "oxy_torch", 4 ], [ "welder", 20 ], [ "welder_crude", 40 ], [ "toolset", 40 ] ], [ [ "small_repairkit", 40 ], [ "large_repairkit", 40 ] ] ], @@ -1448,7 +1457,10 @@ "//": "Simple to manufacture, hence it's not gonna be in published in too much detail in gun-mags.", "book_learn": [ [ "manual_rifle", 6 ], [ "textbook_anarch", 3 ] ], "qualities": [ { "id": "SAW_M", "level": 1 }, { "id": "HAMMER", "level": 1 } ], - "tools": [ [ [ "ar15", -1 ] ], [ [ "small_repairkit", 40 ], [ "large_repairkit", 40 ] ] ], + "tools": [ + [ [ "ar15", -1 ], [ "ar15_retool_300blk", -1 ], [ "ar_pistol", -1 ], [ "oa93", -1 ] ], + [ [ "small_repairkit", 40 ], [ "large_repairkit", 40 ] ] + ], "components": [ [ [ "sheet_metal_small", 2 ] ] ] }, { From f21515ae228142025e746d49c58b49e4440e3efc Mon Sep 17 00:00:00 2001 From: Reiner Herrmann Date: Mon, 18 May 2020 19:28:11 +0200 Subject: [PATCH 26/33] Honour CPPFLAGS also while building tests --- tests/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Makefile b/tests/Makefile index 89f2ec82f9e1f..96fb3204a6749 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -46,7 +46,7 @@ clean: $(shell mkdir -p $(ODIR)) $(ODIR)/%.o: %.cpp - $(CXX) $(DEFINES) $(CXXFLAGS) -c $< -o $@ + $(CXX) $(CPPFLAGS) $(DEFINES) $(CXXFLAGS) -c $< -o $@ .PHONY: clean check tests From 26dcba03a7c84dfecd581e6fc824f30b0ac5e20c Mon Sep 17 00:00:00 2001 From: LyleSY Date: Tue, 19 May 2020 04:00:52 -0400 Subject: [PATCH 27/33] [DinoMod] create hints.json (#40661) --- data/mods/DinoMod/hints.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 data/mods/DinoMod/hints.json diff --git a/data/mods/DinoMod/hints.json b/data/mods/DinoMod/hints.json new file mode 100644 index 0000000000000..aa9a0929281f8 --- /dev/null +++ b/data/mods/DinoMod/hints.json @@ -0,0 +1,14 @@ +{ + "type": "snippet", + "category": "hint", + "text": [ + "I've seen some big dinosaurs out there. I know that should be scary, but all I felt was hungry.", + "I think those little dinosaurs are kind of cute, like a cat kind of. Do you think they eat cat food?", + "Dinosaurs are a bow hunter's best friend. Feathers forever!", + "A buddy of mine wandered close to the swamps and was eaten by a T-Rex, a big lizard. I'd be careful unless you have a gun and plenty of ammo.", + "I hear the zombies have been in the swamps. Bad news if they bite a dinosaur before it bites them.", + "I know there aren't alligators in the sewer, but I heard there was some kind of big lizard down there. Probably not a good idea to check.", + "Some of those big dinosaurs seem halfway all right. I bet if you fed them something nice and gave them a pet you could ride them like a pony. Or maybe they'd eat you instead.", + "One time I found a strange egg out in the woods. It was probably a dinosaur, but I cooked it and it was pretty good!" + ] +} From 2e4ce82616567e2fe82c642834eac7127bdf62c5 Mon Sep 17 00:00:00 2001 From: LaVeyanFiend <51099123+LaVeyanFiend@users.noreply.github.com> Date: Tue, 19 May 2020 04:01:37 -0400 Subject: [PATCH 28/33] Fix Ichaival being uncraftable (#40664) --- data/mods/Magiclysm/recipes/weapons.json | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/data/mods/Magiclysm/recipes/weapons.json b/data/mods/Magiclysm/recipes/weapons.json index 8766048a0bf57..f90bc50294aa4 100644 --- a/data/mods/Magiclysm/recipes/weapons.json +++ b/data/mods/Magiclysm/recipes/weapons.json @@ -312,9 +312,14 @@ "time": 480000, "book_learn": [ [ "book_mythological", 10 ] ], "using": [ [ "forging_standard", 3 ] ], - "qualities": [ { "id": "HAMMER", "level": 3 }, { "id": "CHISEL", "level": 3 } ], + "qualities": [ { "id": "HAMMER", "level": 3 }, { "id": "CHISEL", "level": 3 }, { "id": "CUT", "level": 1 } ], "tools": [ [ [ "tongs", -1 ] ], [ [ "anvil", -1 ] ], [ [ "swage", -1 ] ] ], - "components": [ [ [ "reflexrecurvebow", 1 ] ], [ [ "gold_small", 1 ] ], [ [ "orichalcum_ingot", 1 ] ] ] + "components": [ + [ [ "stick_long", 1 ], [ "2x4", 1 ] ], + [ [ "cordage_superior", 2, "LIST" ] ], + [ [ "gold_small", 1 ] ], + [ [ "orichalcum_ingot", 1 ] ] + ] }, { "type": "recipe", From f938ce9f70ca3f2452cd4e44098742cad33a0a65 Mon Sep 17 00:00:00 2001 From: crispymiller <65513235+crispymiller@users.noreply.github.com> Date: Tue, 19 May 2020 01:06:02 -0700 Subject: [PATCH 29/33] Spelling fix 'opperate' to 'operate' (#40659) --- src/iexamine.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/iexamine.cpp b/src/iexamine.cpp index 802986f839bd2..fae4ce8a0f1b3 100644 --- a/src/iexamine.cpp +++ b/src/iexamine.cpp @@ -4444,7 +4444,7 @@ void iexamine::autodoc( player &p, const tripoint &examp ) popup( _( "Patient is dead. Please remove corpse to proceed. Exiting." ) ); return; } else if( cyborg.typeId() == "bot_broken_cyborg" || cyborg.typeId() == "corpse" ) { - popup( _( "ERROR Bionic Level Assessement: FULL CYBORG. Autodoc Mk. XI can't opperate. Please move patient to appropriate facility. Exiting." ) ); + popup( _( "ERROR Bionic Level Assessment: FULL CYBORG. Autodoc Mk. XI can't operate. Please move patient to appropriate facility. Exiting." ) ); return; } From 97ac2639c6ef70493059c53d583c8e0a8a54080c Mon Sep 17 00:00:00 2001 From: nexusmrsep <39925111+nexusmrsep@users.noreply.github.com> Date: Tue, 19 May 2020 10:09:44 +0200 Subject: [PATCH 30/33] Custom map memory color overlay option + Blue Dark preset (#40677) --- src/options.cpp | 52 +++++++++++++++++++++++++++++++++++++++++++++-- src/sdl_utils.cpp | 2 ++ src/sdl_utils.h | 30 +++++++++++++++++++-------- 3 files changed, 74 insertions(+), 10 deletions(-) diff --git a/src/options.cpp b/src/options.cpp index e5cc2b8ec4dc0..7c46e51134bab 100644 --- a/src/options.cpp +++ b/src/options.cpp @@ -1796,14 +1796,62 @@ void options_manager::add_options_graphics() add_empty_line(); - add( "MEMORY_MAP_MODE", "graphics", translate_marker( "Memory map drawing mode" ), - translate_marker( "Specified the mode in which the memory map is drawn. Requires restart." ), { + add( "MEMORY_MAP_MODE", "graphics", translate_marker( "Memory map overlay preset" ), + translate_marker( "Specified the overlay in which the memory map is drawn. Requires restart. For custom overlay define gamma and RGB values for dark and light colors." ), { { "color_pixel_darken", translate_marker( "Darkened" ) }, { "color_pixel_sepia_light", translate_marker( "Sepia" ) }, { "color_pixel_sepia_dark", translate_marker( "Sepia Dark" ) }, + { "color_pixel_blue_dark", translate_marker( "Blue Dark" ) }, + { "color_pixel_custom", translate_marker( "Custom" ) }, }, "color_pixel_sepia_light", COPT_CURSES_HIDE ); + add( "MEMORY_RGB_DARK_RED", "graphics", translate_marker( "Custom dark color RGB overlay - RED" ), + translate_marker( "Specify RGB value for color RED for dark color overlay." ), + 0, 255, 39, COPT_CURSES_HIDE ); + + get_option( "MEMORY_RGB_DARK_RED" ).setPrerequisite( "MEMORY_MAP_MODE", "color_pixel_custom" ); + + add( "MEMORY_RGB_DARK_GREEN", "graphics", + translate_marker( "Custom dark color RGB overlay - GREEN" ), + translate_marker( "Specify RGB value for color GREEN for dark color overlay." ), + 0, 255, 23, COPT_CURSES_HIDE ); + + get_option( "MEMORY_RGB_DARK_GREEN" ).setPrerequisite( "MEMORY_MAP_MODE", "color_pixel_custom" ); + + add( "MEMORY_RGB_DARK_BLUE", "graphics", translate_marker( "Custom dark color RGB overlay - BLUE" ), + translate_marker( "Specify RGB value for color BLUE for dark color overlay." ), + 0, 255, 19, COPT_CURSES_HIDE ); + + get_option( "MEMORY_RGB_DARK_BLUE" ).setPrerequisite( "MEMORY_MAP_MODE", "color_pixel_custom" ); + + add( "MEMORY_RGB_BRIGHT_RED", "graphics", + translate_marker( "Custom bright color RGB overlay - RED" ), + translate_marker( "Specify RGB value for color RED for bright color overlay." ), + 0, 255, 241, COPT_CURSES_HIDE ); + + get_option( "MEMORY_RGB_BRIGHT_RED" ).setPrerequisite( "MEMORY_MAP_MODE", "color_pixel_custom" ); + + add( "MEMORY_RGB_BRIGHT_GREEN", "graphics", + translate_marker( "Custom bright color RGB overlay - GREEN" ), + translate_marker( "Specify RGB value for color GREEN for bright color overlay." ), + 0, 255, 220, COPT_CURSES_HIDE ); + + get_option( "MEMORY_RGB_BRIGHT_GREEN" ).setPrerequisite( "MEMORY_MAP_MODE", "color_pixel_custom" ); + + add( "MEMORY_RGB_BRIGHT_BLUE", "graphics", + translate_marker( "Custom bright color RGB overlay - BLUE" ), + translate_marker( "Specify RGB value for color BLUE for bright color overlay." ), + 0, 255, 163, COPT_CURSES_HIDE ); + + get_option( "MEMORY_RGB_BRIGHT_BLUE" ).setPrerequisite( "MEMORY_MAP_MODE", "color_pixel_custom" ); + + add( "MEMORY_GAMMA", "graphics", translate_marker( "Custom gamma for overlay" ), + translate_marker( "Specify gamma value for overlay." ), + 1.0f, 3.0f, 1.6f, 0.1f, COPT_CURSES_HIDE ); + + get_option( "MEMORY_GAMMA" ).setPrerequisite( "MEMORY_MAP_MODE", "color_pixel_custom" ); + add_empty_line(); add( "PIXEL_MINIMAP", "graphics", translate_marker( "Pixel minimap" ), diff --git a/src/sdl_utils.cpp b/src/sdl_utils.cpp index 10c11bdc82894..a1f01f5d3bd35 100644 --- a/src/sdl_utils.cpp +++ b/src/sdl_utils.cpp @@ -16,6 +16,8 @@ color_pixel_function_map builtin_color_pixel_functions = { { "color_pixel_darken", color_pixel_darken }, { "color_pixel_sepia_light", color_pixel_sepia_light }, { "color_pixel_sepia_dark", color_pixel_sepia_dark }, + { "color_pixel_blue_dark", color_pixel_blue_dark }, + { "color_pixel_custom", color_pixel_custom }, { "color_pixel_grayscale", color_pixel_grayscale }, { "color_pixel_nightvision", color_pixel_nightvision }, { "color_pixel_overexposed", color_pixel_overexposed }, diff --git a/src/sdl_utils.h b/src/sdl_utils.h index 81b53dd9a25c7..49bd42a3c73e9 100644 --- a/src/sdl_utils.h +++ b/src/sdl_utils.h @@ -9,6 +9,7 @@ #include #include "color.h" +#include "options.h" #include "sdl_wrappers.h" using color_pixel_function_pointer = SDL_Color( * )( const SDL_Color &color ); @@ -121,7 +122,7 @@ inline SDL_Color color_pixel_darken( const SDL_Color &color ) } -inline SDL_Color color_pixel_sepia( const SDL_Color &color, const float &gammav, +inline SDL_Color color_pixel_mixer( const SDL_Color &color, const float &gammav, const SDL_Color &color_a, const SDL_Color &color_b ) { if( is_black( color ) ) { @@ -131,7 +132,6 @@ inline SDL_Color color_pixel_sepia( const SDL_Color &color, const float &gammav, /* * Objective is to provide a gradient between two color points * (color_a and color_b) based on the grayscale value. - * This presents an effect intended to mimic a faded sepia photograph. */ const Uint8 av = average_pixel_color( color ); @@ -144,16 +144,30 @@ inline SDL_Color color_pixel_sepia( const SDL_Color &color, const float &gammav, inline SDL_Color color_pixel_sepia_light( const SDL_Color &color ) { - const SDL_Color sepia_dark = { 39, 23, 19, color.a}; - const SDL_Color sepia_light = { 241, 220, 163, color.a}; - return color_pixel_sepia( color, 1.6f, sepia_dark, sepia_light ); + const SDL_Color dark = { 39, 23, 19, color.a }; + const SDL_Color light = { 241, 220, 163, color.a }; + return color_pixel_mixer( color, 1.6f, dark, light ); } inline SDL_Color color_pixel_sepia_dark( const SDL_Color &color ) { - const SDL_Color sepia_dark = { 39, 23, 19, color.a}; - const SDL_Color sepia_light = { 70, 66, 60, color.a}; - return color_pixel_sepia( color, 1.0f, sepia_dark, sepia_light ); + const SDL_Color dark = { 39, 23, 19, color.a }; + const SDL_Color light = { 70, 66, 60, color.a }; + return color_pixel_mixer( color, 1.0f, dark, light ); +} + +inline SDL_Color color_pixel_blue_dark( const SDL_Color &color ) +{ + const SDL_Color dark = { 19, 23, 39, color.a }; + const SDL_Color light = { 60, 66, 70, color.a }; + return color_pixel_mixer( color, 1.0f, dark, light ); +} + +inline SDL_Color color_pixel_custom( const SDL_Color &color ) +{ + const SDL_Color dark = { static_cast( get_option( "MEMORY_RGB_DARK_RED" ) ), static_cast( get_option( "MEMORY_RGB_DARK_GREEN" ) ), static_cast( get_option( "MEMORY_RGB_DARK_BLUE" ) ), color.a }; + const SDL_Color light = { static_cast( get_option( "MEMORY_RGB_BRIGHT_RED" ) ), static_cast( get_option( "MEMORY_RGB_BRIGHT_GREEN" ) ), static_cast( get_option( "MEMORY_RGB_BRIGHT_BLUE" ) ), color.a }; + return color_pixel_mixer( color, get_option( "MEMORY_GAMMA" ), dark, light ); } SDL_Color curses_color_to_SDL( const nc_color &color ); From 8b512867639eeadb87496352a2a336fc81fbe1b5 Mon Sep 17 00:00:00 2001 From: Fris0uman <41293484+Fris0uman@users.noreply.github.com> Date: Tue, 19 May 2020 10:14:12 +0200 Subject: [PATCH 31/33] Fields of darkness (#40645) --- data/json/bionics.json | 2 +- data/json/emit.json | 8 ++++++++ data/json/enchantments.json | 7 +++++++ data/json/field_type.json | 7 +++++++ doc/JSON_INFO.md | 4 ++++ src/bionics.cpp | 7 +------ src/character.cpp | 7 +------ src/field.cpp | 5 +++++ src/field.h | 1 + src/field_type.cpp | 2 ++ src/field_type.h | 4 ++++ src/lightmap.cpp | 16 +++++++--------- 12 files changed, 48 insertions(+), 22 deletions(-) diff --git a/data/json/bionics.json b/data/json/bionics.json index 290c44ef44526..d7bb0d074b244 100644 --- a/data/json/bionics.json +++ b/data/json/bionics.json @@ -710,7 +710,7 @@ "description": "When active, this bionic eliminates all light within a 2 tile radius through destructive interference.", "occupied_bodyparts": [ [ "torso", 16 ] ], "flags": [ "BIONIC_TOGGLED" ], - "enchantments": [ "ENCH_INVISIBILITY" ], + "enchantments": [ "ENCH_SHADOW_CLOUD" ], "act_cost": "9 kJ", "react_cost": "9 kJ", "time": 1 diff --git a/data/json/emit.json b/data/json/emit.json index 0027fd2537b42..4c9045aef0390 100644 --- a/data/json/emit.json +++ b/data/json/emit.json @@ -130,6 +130,14 @@ "intensity": 3, "chance": 50 }, + { + "id": "emit_shadow_field", + "type": "emit", + "field": "fd_shadow", + "intensity": 1, + "qty": 10, + "chance": 100 + }, { "id": "emit_shock_burst", "type": "emit", diff --git a/data/json/enchantments.json b/data/json/enchantments.json index f5635831ef01a..9f045b7dfd25e 100644 --- a/data/json/enchantments.json +++ b/data/json/enchantments.json @@ -4,5 +4,12 @@ "id": "ENCH_INVISIBILITY", "condition": "ALWAYS", "ench_effects": [ { "effect": "invisibility", "intensity": 1 } ] + }, + { + "type": "enchantment", + "id": "ENCH_SHADOW_CLOUD", + "condition": "ALWAYS", + "ench_effects": [ { "effect": "invisibility", "intensity": 1 } ], + "emitter": "emit_shadow_field" } ] diff --git a/data/json/field_type.json b/data/json/field_type.json index 552f0d9e1982c..2d0e71aced560 100644 --- a/data/json/field_type.json +++ b/data/json/field_type.json @@ -518,6 +518,13 @@ "display_field": true, "looks_like": "fd_fire" }, + { + "id": "fd_shadow", + "type": "field_type", + "intensity_levels": [ { "name": "shadow", "light_override": 3.7 } ], + "half_life": "10 seconds", + "percent_spread": 50 + }, { "id": "fd_flame_burst", "type": "field_type", diff --git a/doc/JSON_INFO.md b/doc/JSON_INFO.md index 22665f8821819..e6ab51893976f 100644 --- a/doc/JSON_INFO.md +++ b/doc/JSON_INFO.md @@ -3321,6 +3321,10 @@ Setting of sprite sheets. Same as `tiles-new` field in `tile_config`. Sprite fil "type": "field_type", // this is a field type "id": "fd_gum_web", // id of the field "immune_mtypes": [ "mon_spider_gum" ], // list of monster immune to this field + "intensity_levels": [ + { "name": "shadow", // name of this level of intensity + "light_override": 3.7 } //light level on the tile occupied by this field will be set at 3.7 not matter the ambient light. + ], "bash": { "str_min": 1, // lower bracket of bashing damage required to bash "str_max": 3, // higher bracket diff --git a/src/bionics.cpp b/src/bionics.cpp index 263637a8d77ec..920078b499a94 100644 --- a/src/bionics.cpp +++ b/src/bionics.cpp @@ -153,7 +153,6 @@ static const bionic_id bio_lockpick( "bio_lockpick" ); static const bionic_id bio_magnet( "bio_magnet" ); static const bionic_id bio_meteorologist( "bio_meteorologist" ); static const bionic_id bio_nanobots( "bio_nanobots" ); -static const bionic_id bio_night( "bio_night" ); static const bionic_id bio_painkiller( "bio_painkiller" ); static const bionic_id bio_plutdump( "bio_plutdump" ); static const bionic_id bio_power_storage( "bio_power_storage" ); @@ -1606,11 +1605,7 @@ void Character::process_bionic( int b ) } // Bionic effects on every turn they are active go here. - if( bio.id == bio_night ) { - if( calendar::once_every( 5_turns ) ) { - add_msg_if_player( m_neutral, _( "Artificial night generator active!" ) ); - } - } else if( bio.id == bio_remote ) { + if( bio.id == bio_remote ) { if( g->remoteveh() == nullptr && get_value( "remote_controlling" ).empty() ) { bio.powered = false; add_msg_if_player( m_warning, _( "Your %s has lost connection and is turning off." ), diff --git a/src/character.cpp b/src/character.cpp index 68cc655e72136..6837c8b9138c3 100644 --- a/src/character.cpp +++ b/src/character.cpp @@ -229,7 +229,6 @@ static const bionic_id bio_tattoo_led( "bio_tattoo_led" ); static const bionic_id bio_tools( "bio_tools" ); static const bionic_id bio_ups( "bio_ups" ); static const bionic_id str_bio_cloak( "bio_cloak" ); -static const bionic_id str_bio_night( "bio_night" ); // Aftershock stuff! static const bionic_id afs_bio_linguistic_coprocessor( "afs_bio_linguistic_coprocessor" ); @@ -10700,11 +10699,7 @@ bool Character::sees( const tripoint &t, bool, int ) const if( wanted_range < MAX_CLAIRVOYANCE && wanted_range < clairvoyance() ) { return true; } - // Only check if we need to override if we already came to the opposite conclusion. - if( can_see && wanted_range < 15 && wanted_range > sight_range( 1 ) && - has_active_bionic( str_bio_night ) ) { - can_see = false; - } + if( can_see && wanted_range > unimpaired_range() ) { can_see = false; } diff --git a/src/field.cpp b/src/field.cpp index 08dfb532514cf..bbf8102195051 100644 --- a/src/field.cpp +++ b/src/field.cpp @@ -71,6 +71,11 @@ float field_entry::light_emitted() const return type.obj().get_light_emitted( intensity - 1 ); } +float field_entry::local_light_override() const +{ + return type.obj().get_local_light_override( intensity - 1 ); +} + float field_entry::translucency() const { return type.obj().get_translucency( intensity - 1 ); diff --git a/src/field.h b/src/field.h index 441fa29dd167a..a0e08d033410c 100644 --- a/src/field.h +++ b/src/field.h @@ -43,6 +43,7 @@ class field_entry mongroup_id monster_spawn_group() const; float light_emitted() const; + float local_light_override() const; float translucency() const; bool is_transparent() const; int convection_temperature_mod() const; diff --git a/src/field_type.cpp b/src/field_type.cpp index 9c8371026087d..692dc5ce17e37 100644 --- a/src/field_type.cpp +++ b/src/field_type.cpp @@ -164,6 +164,8 @@ void field_type::load( const JsonObject &jo, const std::string & ) fallback_intensity_level.monster_spawn_group ); optional( jao, was_loaded, "light_emitted", intensity_level.light_emitted, fallback_intensity_level.light_emitted ); + optional( jao, was_loaded, "light_override", intensity_level.local_light_override, + fallback_intensity_level.local_light_override ); optional( jao, was_loaded, "translucency", intensity_level.translucency, fallback_intensity_level.translucency ); optional( jao, was_loaded, "convection_temperature_mod", intensity_level.convection_temperature_mod, diff --git a/src/field_type.h b/src/field_type.h index b2a91eb605fa2..56bbcac7c2c34 100644 --- a/src/field_type.h +++ b/src/field_type.h @@ -109,6 +109,7 @@ struct field_intensity_level { int monster_spawn_radius = 0; mongroup_id monster_spawn_group; float light_emitted = 0.0f; + float local_light_override = -1.0f; float translucency = 0.0f; int convection_temperature_mod = 0; int scent_neutralization = 0; @@ -224,6 +225,9 @@ struct field_type { float get_light_emitted( int level = 0 ) const { return get_intensity_level( level ).light_emitted; } + float get_local_light_override( int level = 0 )const { + return get_intensity_level( level ).local_light_override; + } float get_translucency( int level = 0 ) const { return get_intensity_level( level ).translucency; } diff --git a/src/lightmap.cpp b/src/lightmap.cpp index 1bb768286f153..63ae590a22290 100644 --- a/src/lightmap.cpp +++ b/src/lightmap.cpp @@ -39,8 +39,6 @@ #include "vpart_range.h" #include "weather.h" -static const bionic_id bio_night( "bio_night" ); - static const efftype_id effect_haslight( "haslight" ); static const efftype_id effect_onfire( "onfire" ); @@ -324,6 +322,7 @@ void map::generate_lightmap( const int zlev ) apply_character_light( guy ); } + std::vector> lm_override; // Traverse the submaps in order for( int smx = 0; smx < my_MAPSIZE; ++smx ) { for( int smy = 0; smy < my_MAPSIZE; ++smy ) { @@ -376,6 +375,10 @@ void map::generate_lightmap( const int zlev ) if( light_emitted > 0 ) { add_light_source( p, light_emitted ); } + const int light_override = cur->local_light_override(); + if( light_override >= 0.0 ) { + lm_override.push_back( std::pair( p, light_override ) ); + } } } } @@ -482,13 +485,8 @@ void map::generate_lightmap( const int zlev ) apply_light_source( p, light_source_buffer[p.x][p.y] ); } } - - if( g->u.has_active_bionic( bio_night ) ) { - for( const tripoint &p : points_in_rectangle( cache_start, cache_end ) ) { - if( rl_dist( p, g->u.pos() ) < 2 ) { - lm[p.x][p.y].fill( LIGHT_AMBIENT_MINIMAL ); - } - } + for( const std::pair &elem : lm_override ) { + lm[elem.first.x][elem.first.y].fill( elem.second ); } } From 593791b3bd7307a0988ba412247bf9615e683dca Mon Sep 17 00:00:00 2001 From: Eric Pierce Date: Tue, 19 May 2020 02:15:22 -0600 Subject: [PATCH 32/33] Summon several kinds of kittycat from Bag of Cats (#40656) * Add spell flag SPAWN_GROUP to summon monster group With this flag, a spell with "summon" effect spawns not a specific monster type ID, but rather a monster type from a monster group ID. * Add GROUP_STRAY_CATS monster group with cat types * Make "Bag of Cats" summon a paw-pourri of felines * Document spell flags and summon effect * Swap position of damage and range in spell info This makes the typically shorter strings (Range and AOE) share a line in two colums, while Damage (or Summon, Spawn, etc.) gets its own line. * Show "N from GROUP" for group summon spells --- data/json/monstergroups/mammal.json | 29 ++++++++++++++++ data/mods/Magiclysm/Spells/druid.json | 4 +-- doc/MAGIC.md | 49 ++++++++++++++++++++++++--- src/magic.cpp | 27 ++++++++++++--- src/magic.h | 1 + src/magic_spell_effect.cpp | 18 +++++++--- 6 files changed, 112 insertions(+), 16 deletions(-) diff --git a/data/json/monstergroups/mammal.json b/data/json/monstergroups/mammal.json index ac79743402e87..a0bcab9009071 100644 --- a/data/json/monstergroups/mammal.json +++ b/data/json/monstergroups/mammal.json @@ -40,6 +40,35 @@ { "monster": "mon_dog_auscattle_pup", "freq": 5, "cost_multiplier": 0 } ] }, + { + "name": "GROUP_STRAY_CATS", + "type": "monstergroup", + "default": "mon_cat", + "monsters": [ + { "monster": "mon_cat", "freq": 50, "cost_multiplier": 0 }, + { "monster": "mon_cat_kitten", "freq": 5, "cost_multiplier": 0 }, + { "monster": "mon_cat_tabby", "freq": 50, "cost_multiplier": 0 }, + { "monster": "mon_cat_tabby_kitten", "freq": 5, "cost_multiplier": 0 }, + { "monster": "mon_cat_longhair", "freq": 50, "cost_multiplier": 0 }, + { "monster": "mon_cat_longhair_kitten", "freq": 5, "cost_multiplier": 0 }, + { "monster": "mon_cat_siamese", "freq": 50, "cost_multiplier": 0 }, + { "monster": "mon_cat_siamese_kitten", "freq": 5, "cost_multiplier": 0 }, + { "monster": "mon_cat_persian", "freq": 50, "cost_multiplier": 0 }, + { "monster": "mon_cat_persian_kitten", "freq": 5, "cost_multiplier": 0 }, + { "monster": "mon_cat_calico", "freq": 50, "cost_multiplier": 0 }, + { "monster": "mon_cat_calico_kitten", "freq": 5, "cost_multiplier": 0 }, + { "monster": "mon_cat_maine_coon", "freq": 50, "cost_multiplier": 0 }, + { "monster": "mon_cat_maine_coon_kitten", "freq": 5, "cost_multiplier": 0 }, + { "monster": "mon_cat_bengal", "freq": 50, "cost_multiplier": 0 }, + { "monster": "mon_cat_bengal_kitten", "freq": 5, "cost_multiplier": 0 }, + { "monster": "mon_cat_devon_rex", "freq": 50, "cost_multiplier": 0 }, + { "monster": "mon_cat_devon_rex_kitten", "freq": 5, "cost_multiplier": 0 }, + { "monster": "mon_cat_sphynx", "freq": 50, "cost_multiplier": 0 }, + { "monster": "mon_cat_sphynx_kitten", "freq": 5, "cost_multiplier": 0 }, + { "monster": "mon_cat_chonker", "freq": 50, "cost_multiplier": 0 }, + { "monster": "mon_cat_chonker_kitten", "freq": 5, "cost_multiplier": 0 } + ] + }, { "name": "GROUP_PETS", "type": "monstergroup", diff --git a/data/mods/Magiclysm/Spells/druid.json b/data/mods/Magiclysm/Spells/druid.json index d5d7766daf970..211ed3e6336d9 100644 --- a/data/mods/Magiclysm/Spells/druid.json +++ b/data/mods/Magiclysm/Spells/druid.json @@ -142,7 +142,7 @@ "name": { "str": "Bag of Cats" }, "description": "Are you the crazy cat lady?", "valid_targets": [ "ground" ], - "flags": [ "LOUD", "SOMATIC" ], + "flags": [ "LOUD", "SOMATIC", "SPAWN_GROUP" ], "min_damage": 1, "max_damage": 12, "damage_increment": 1.0, @@ -161,7 +161,7 @@ "difficulty": 1, "base_energy_cost": 265, "effect": "summon", - "effect_str": "mon_cat" + "effect_str": "GROUP_STRAY_CATS" }, { "id": "summon_bear", diff --git a/doc/MAGIC.md b/doc/MAGIC.md index 5369e94bdf368..8302d13c743d8 100644 --- a/doc/MAGIC.md +++ b/doc/MAGIC.md @@ -13,10 +13,11 @@ In `data/mods/Magiclysm` there is a template spell, copied here for your perusal "description": "This is a template to show off all the available values", "valid_targets": [ "hostile", "ground", "self", "ally" ], // if a valid target is not included, you cannot cast the spell on that target. "effect": "shallow_pit", // effects are coded in C++. A list will be provided below of possible effects that have been coded. - "effect_str": "template" // special. see below + "effect_str": "template", // special. see below "extra_effects": [ { "id": "fireball", "hit_self": false, "max_level": 3 } ], // this allows you to cast multiple spells with only one spell "affected_body_parts": [ "HEAD", "TORSO", "MOUTH", "EYES", "ARM_L", "ARM_R", "HAND_R", "HAND_L", "LEG_L", "FOOT_L", "FOOT_R" ], // body parts affected by effects - "spell_class": "NONE" // + "flags": [ "SILENT", "LOUD", "SOMATIC", "VERBAL", "NO_HANDS", "NO_LEGS", "SPAWN_GROUP" ], // see "Spell Flags" below + "spell_class": "NONE", // "base_casting_time": 100, // this is the casting time (in moves) "base_energy_cost": 10, // the amount of energy (of the requisite type) to cast the spell "energy_source": "MANA", // the type of energy used to cast the spell. types are: MANA, BIONIC, HP, STAMINA, FATIGUE, NONE (none will not use mana) @@ -100,6 +101,7 @@ Below is a table of currently implemented effects, along with special rules for | `cone_attack` | fires a cone toward the target up to your range. The arc of the cone in degrees is aoe. Stops at walls. If "effect_str" is included, it will add that effect (defined elsewhere in json) to the targets if able, to the body parts defined in affected_body_parts. | `line_attack` | fires a line with width aoe toward the target, being blocked by walls on the way. If "effect_str" is included, it will add that effect (defined elsewhere in json) to the targets if able, to the body parts defined in affected_body_parts. | `spawn_item` | spawns an item that will disappear at the end of its duration. Default duration is 0. +| `summon` | summons a monster ID or group ID from `effect_str` that will disappear at the end of its duration. Default duration is 0. | `teleport_random` | teleports the player randomly range spaces with aoe variation | `recover_energy` | recovers an energy source equal to damage of the spell. The energy source recovered is defined in "effect_str" and may be one of "MANA", "STAMINA", "FATIGUE", "PAIN", "BIONIC" | `ter_transform` | transform the terrain and furniture in an area centered at the target. The chance of any one of the points in the area of effect changing is one_in( damage ). The effect_str is the id of a ter_furn_transform. @@ -113,8 +115,47 @@ Below is a table of currently implemented effects, along with special rules for | `charm_monster` | charms a monster that has less hp than damage() for approximately duration() | `mutate` | mutates the target(s). if effect_str is defined, mutates toward that category instead of picking at random. the "MUTATE_TRAIT" flag allows effect_str to be a specific trait instead of a category. damage() / 100 is the percent chance the mutation will be successful (a value of 10000 represents 100.00%) | `bash` | bashes the terrain at the target. uses damage() as the strength of the bash. -| `WONDER` | Unlike the above, this is not an "effect" but a "flag". This alters the behavior of the parent spell drastically: The spell itself doesn't cast, but its damage and range information is used in order to cast the extra_effects. N of the extra_effects will be chosen at random to be cast, where N is the current damage of the spell (stacks with RANDOM_DAMAGE flag) and the message of the spell cast by this spell will also be displayed. If this spell's message is not wanted to be displayed, make sure the message is an empty string. -| `RANDOM_TARGET` | A special spell flag (like wonder) that forces the spell to choose a random valid target within range instead of the caster choosing the target. This also affects extra_effects. + +### Spell Flags + +Flags allow you to provide additional customizations for spell effects, behavior, and limitations. +Spells may have any number of flags, for example: + +```json + { + "id": "bless", + "//": "Encumbrance on the mouth (verbal) or arms (somatic) affect casting success, but not legs.", + "flags": [ "VERBAL", "SOMATIC", "NO_LEGS" ] + } +``` + +| Flag | Description +| --- | --- +| `WONDER` | This alters the behavior of the parent spell drastically: The spell itself doesn't cast, but its damage and range information is used in order to cast the extra_effects. N of the extra_effects will be chosen at random to be cast, where N is the current damage of the spell (stacks with RANDOM_DAMAGE flag) and the message of the spell cast by this spell will also be displayed. If this spell's message is not wanted to be displayed, make sure the message is an empty string. +| `RANDOM_TARGET` | Forces the spell to choose a random valid target within range instead of the caster choosing the target. This also affects extra_effects. +| `RANDOM_DURATION` | picks random number between min+increment*level and max instead of normal behavior +| `RANDOM_DAMAGE` | picks random number between min+increment*level and max instead of normal behavior +| `RANDOM_AOE` | picks random number between min+increment*level and max instead of normal behavior +| `PERMANENT` | items or creatures spawned with this spell do not disappear and die as normal +| `IGNORE_WALLS` | spell's aoe goes through walls +| `SWAP_POS` | a projectile spell swaps the positions of the caster and target +| `HOSTILE_SUMMON` | summon spell always spawns a hostile monster +| `HOSTILE_50` | summoned monster spawns friendly 50% of the time +| `SILENT` | spell makes no noise at target +| `LOUD` | spell makes extra noise at target +| `VERBAL` | spell makes noise at caster location, mouth encumbrance affects fail % +| `SOMATIC` | arm encumbrance affects fail % and casting time (slightly) +| `NO_HANDS` | hands do not affect spell energy cost +| `NO_LEGS` | legs do not affect casting time +| `CONCENTRATE` | focus affects spell fail % +| `MUTATE_TRAIT` | overrides the mutate spell_effect to use a specific trait_id instead of a category +| `PAIN_NORESIST` | pain altering spells can't be resisted (like with the deadened trait) +| `WITH_CONTAINER` | items spawned with container +| `UNSAFE_TELEPORT` | teleport spell risks killing the caster or others +| `SPAWN_GROUP` | spawn or summon from an item or monster group, instead of individual item/monster ID + + +### Damage Types For Spells that have an attack type, these are the available damage types: diff --git a/src/magic.cpp b/src/magic.cpp index c534dba227799..e34d5d8ac04b0 100644 --- a/src/magic.cpp +++ b/src/magic.cpp @@ -34,6 +34,7 @@ #include "magic_enchantment.h" #include "map.h" #include "messages.h" +#include "mongroup.h" #include "monster.h" #include "mtype.h" #include "mutation.h" @@ -116,6 +117,7 @@ std::string enum_to_string( spell_flag data ) case spell_flag::MUTATE_TRAIT: return "MUTATE_TRAIT"; case spell_flag::PAIN_NORESIST: return "PAIN_NORESIST"; case spell_flag::WITH_CONTAINER: return "WITH_CONTAINER"; + case spell_flag::SPAWN_GROUP: return "SPAWN_GROUP"; case spell_flag::WONDER: return "WONDER"; case spell_flag::LAST: break; } @@ -1728,6 +1730,7 @@ void spellcasting_callback::draw_spell_info( const spell &sp, const uilist *menu const int damage = sp.damage(); std::string damage_string; + std::string range_string; std::string aoe_string; // if it's any type of attack spell, the stats are normal. if( fx == "target_attack" || fx == "projectile_attack" || fx == "cone_attack" || @@ -1764,18 +1767,32 @@ void spellcasting_callback::draw_spell_info( const spell &sp, const uilist *menu damage_string = string_format( "%s %d %s", _( "Spawn" ), sp.damage(), item::nname( sp.effect_data(), sp.damage() ) ); } else if( fx == "summon" ) { - damage_string = string_format( "%s %d %s", _( "Summon" ), sp.damage(), - _( monster( mtype_id( sp.effect_data() ) ).get_name( ) ) ); + std::string monster_name = "FIXME"; + if( sp.has_flag( spell_flag::SPAWN_GROUP ) ) { + // TODO: Get a more user-friendly group name + if( MonsterGroupManager::isValidMonsterGroup( mongroup_id( sp.effect_data() ) ) ) { + monster_name = "from " + sp.effect_data(); + } else { + debugmsg( "Unknown monster group: %s", sp.effect_data() ); + } + } else { + monster_name = monster( mtype_id( sp.effect_data() ) ).get_name( ); + } + damage_string = string_format( "%s %d %s", _( "Summon" ), sp.damage(), _( monster_name ) ); aoe_string = string_format( "%s: %d", _( "Spell Radius" ), sp.aoe() ); } else if( fx == "ter_transform" ) { aoe_string = string_format( "%s: %s", _( "Spell Radius" ), sp.aoe_string() ); } - print_colored_text( w_menu, point( h_col1, line ), gray, gray, damage_string ); + range_string = string_format( "%s: %s", _( "Range" ), + sp.range() <= 0 ? _( "self" ) : to_string( sp.range() ) ); + + // Range / AOE in two columns + print_colored_text( w_menu, point( h_col1, line ), gray, gray, range_string ); print_colored_text( w_menu, point( h_col2, line++ ), gray, gray, aoe_string ); - print_colored_text( w_menu, point( h_col1, line++ ), gray, gray, - string_format( "%s: %s", _( "Range" ), sp.range() <= 0 ? _( "self" ) : to_string( sp.range() ) ) ); + // One line for damage / healing / spawn / summon effect + print_colored_text( w_menu, point( h_col1, line++ ), gray, gray, damage_string ); // todo: damage over time here, when it gets implemeted diff --git a/src/magic.h b/src/magic.h index b859515c46e43..e221b7e560643 100644 --- a/src/magic.h +++ b/src/magic.h @@ -57,6 +57,7 @@ enum spell_flag { WONDER, // instead of casting each of the extra_spells, it picks N of them and casts them (where N is std::min( damage(), number_of_spells )) PAIN_NORESIST, // pain altering spells can't be resisted (like with the deadened trait) WITH_CONTAINER, // items spawned with container + SPAWN_GROUP, // spawn or summon from an item or monster group, instead of individual item/monster ID LAST }; diff --git a/src/magic_spell_effect.cpp b/src/magic_spell_effect.cpp index 6c4ead7e85f1e..61cc28e47f540 100644 --- a/src/magic_spell_effect.cpp +++ b/src/magic_spell_effect.cpp @@ -783,10 +783,19 @@ static bool is_summon_friendly( const spell &sp ) return friendly; } -static bool add_summoned_mon( const mtype_id &id, const tripoint &pos, const time_duration &time, - const spell &sp ) +static bool add_summoned_mon( const tripoint &pos, const time_duration &time, const spell &sp ) { - monster *const mon_ptr = g->place_critter_at( id, pos ); + std::string monster_id = sp.effect_data(); + + // Spawn a monster from a group, or a specific monster ID + if( sp.has_flag( spell_flag::SPAWN_GROUP ) ) { + const mongroup_id group_id( sp.effect_data() ); + monster_id = MonsterGroupManager::GetRandomMonsterFromGroup( group_id ).str(); + } + + const mtype_id mon_id( monster_id ); + monster *const mon_ptr = g->place_critter_at( mon_id, pos ); + if( !mon_ptr ) { return false; } @@ -807,7 +816,6 @@ static bool add_summoned_mon( const mtype_id &id, const tripoint &pos, const tim void spell_effect::spawn_summoned_monster( const spell &sp, Creature &caster, const tripoint &target ) { - const mtype_id mon_id( sp.effect_data() ); std::set area = spell_effect_area( sp, target, spell_effect_blast, caster ); // this should never be negative, but this'll keep problems from happening size_t num_mons = std::abs( sp.damage() ); @@ -816,7 +824,7 @@ void spell_effect::spawn_summoned_monster( const spell &sp, Creature &caster, const size_t mon_spot = rng( 0, area.size() - 1 ); auto iter = area.begin(); std::advance( iter, mon_spot ); - if( add_summoned_mon( mon_id, *iter, summon_time, sp ) ) { + if( add_summoned_mon( *iter, summon_time, sp ) ) { num_mons--; sp.make_sound( *iter ); } else { From f8f9f522dc98a6676f3591440c3580fcbf644b96 Mon Sep 17 00:00:00 2001 From: Matthew Taylor Date: Tue, 19 May 2020 09:27:55 +0100 Subject: [PATCH 33/33] Rework kevlar, add slash resistant and EOD gear (#39964) --- data/json/clothing_mods.json | 2 +- data/json/harvest.json | 2 +- .../itemgroups/Clothing_Gear/clothing.json | 29 +++++++- data/json/itemgroups/Clothing_Gear/gear.json | 2 + .../Locations_MapExtras/locations.json | 1 + .../locations_commercial.json | 5 +- .../monster_drops_advtech.json | 4 +- .../json/itemgroups/collections_domestic.json | 1 + data/json/itemgroups/food_service.json | 2 + data/json/itemgroups/military.json | 2 +- data/json/itemgroups/trash_and_debris.json | 2 +- data/json/items/armor/ammo_pouch.json | 2 +- data/json/items/armor/arms_armor.json | 10 +++ data/json/items/armor/ballistic_armor.json | 4 +- data/json/items/armor/boots.json | 41 +++++++++++ data/json/items/armor/coats.json | 8 +-- data/json/items/armor/eyewear.json | 4 +- data/json/items/armor/gloves.json | 41 ++++++++--- data/json/items/armor/helmets.json | 10 +-- data/json/items/armor/hoods.json | 10 +-- data/json/items/armor/legs_armor.json | 57 +++++++++++++++- data/json/items/armor/masks.json | 9 +++ data/json/items/armor/pets_dog_armor.json | 2 +- data/json/items/armor/pets_horse_armor.json | 2 +- data/json/items/armor/storage.json | 4 +- data/json/items/armor/suits_protection.json | 24 +++---- data/json/items/armor/torso_armor.json | 42 +++++++++++- data/json/items/armor/torso_clothes.json | 9 +++ data/json/items/migration.json | 5 ++ data/json/items/resources/tailoring.json | 32 ++++++++- data/json/items/tool/misc.json | 15 ---- data/json/items/tool/tailoring.json | 19 +++++- data/json/items/tool/workshop.json | 2 +- data/json/items/tool_armor.json | 68 ++++++++++++++++--- data/json/materials.json | 33 +++++++-- data/json/monsterdrops/zombie_cop.json | 3 +- data/json/npcs/items_generic.json | 2 +- data/json/recipes/armor/feet.json | 14 ++-- data/json/recipes/armor/hands.json | 14 ++-- data/json/recipes/armor/head.json | 41 ++++++----- data/json/recipes/armor/legs.json | 4 +- data/json/recipes/armor/pets_horse.json | 2 +- data/json/recipes/armor/suit.json | 26 +++---- data/json/recipes/armor/torso.json | 10 +-- data/json/recipes/recipe_others.json | 22 ++++++ data/json/requirements/tailoring.json | 15 ++-- data/json/uncraft/armor/pets_dog.json | 2 +- data/json/uncraft/armor/suit.json | 4 +- data/json/vehicleparts/vehicle_parts.json | 2 +- src/iuse_actor.h | 1 + 50 files changed, 510 insertions(+), 157 deletions(-) diff --git a/data/json/clothing_mods.json b/data/json/clothing_mods.json index 804e158988c71..116e9cded3932 100644 --- a/data/json/clothing_mods.json +++ b/data/json/clothing_mods.json @@ -30,7 +30,7 @@ "type": "clothing_mod", "id": "kevlar_padded", "flag": "kevlar_padded", - "item": "kevlar_plate", + "item": "sheet_kevlar_layered", "implement_prompt": "Pad with Kevlar", "destroy_prompt": "Destroy Kevlar padding", "mod_value": [ diff --git a/data/json/harvest.json b/data/json/harvest.json index 3b5e5a3985ebd..6a7b3516ff3ff 100644 --- a/data/json/harvest.json +++ b/data/json/harvest.json @@ -556,7 +556,7 @@ { "drop": "meat_tainted", "type": "flesh", "mass_ratio": 0.25 }, { "drop": "fat_tainted", "type": "flesh", "mass_ratio": 0.08 }, { "drop": "bone_tainted", "type": "bone", "mass_ratio": 0.1 }, - { "drop": "kevlar_plate", "type": "skin", "mass_ratio": 0.015 }, + { "drop": "sheet_kevlar", "type": "skin", "mass_ratio": 0.24 }, { "drop": "pheromone", "type": "bionic", "max": 1 } ] }, diff --git a/data/json/itemgroups/Clothing_Gear/clothing.json b/data/json/itemgroups/Clothing_Gear/clothing.json index 9a27735dcecb5..2fbd985965b90 100644 --- a/data/json/itemgroups/Clothing_Gear/clothing.json +++ b/data/json/itemgroups/Clothing_Gear/clothing.json @@ -120,6 +120,10 @@ { "item": "webbing_belt" }, { "distribution": [ { "item": "socks", "prob": 10 }, { "item": "socks_wool", "prob": 90 } ] }, { "item": "boots_combat" }, + { + "collection": [ { "distribution": [ { "item": "balclava", "prob": 90 }, { "item": "balaclava_cut_resistant", "prob": 10 } ] } ], + "prob": 25 + }, { "distribution": [ { "collection": [ { "item": "sports_bra" }, { "item": "boy_shorts" } ] }, @@ -367,7 +371,8 @@ "entries": [ { "item": "gloves_leather", "prob": 30 }, { "item": "gloves_rubber", "prob": 10 }, - { "item": "gloves_work", "prob": 60 } + { "item": "gloves_work", "prob": 60 }, + { "item": "gloves_cut_resistant", "prob": 10 } ] }, { @@ -446,6 +451,10 @@ [ "mask_filter", 30 ], [ "glasses_safety", 30 ], [ "ear_plugs", 35 ], + [ "apron_cut_resistant", 5 ], + [ "gloves_cut_resistant", 10 ], + [ "chaps_cut_resistant", 5 ], + [ "armguard_cut_resistant", 5 ], [ "apron_leather", 10 ], [ "tool_belt", 30 ], [ "knee_pads", 20 ], @@ -1825,6 +1834,24 @@ [ "sneakers", 70 ] ] }, + { + "type": "item_group", + "subtype": "distribution", + "id": "eod_armor", + "entries": [ + { + "collection": [ + { "item": "helmet_eod" }, + { "item": "jacket_eod" }, + { "item": "trousers_eod" }, + { "item": "foot_protectors_eod" }, + { "item": "gloves_eod", "prob": 20 } + ], + "prob": 100 + }, + { "collection": [ { "item": "jacket_eod_light" }, { "item": "trousers_eod_light" } ], "prob": 20 } + ] + }, { "type": "item_group", "id": "mil_armor", diff --git a/data/json/itemgroups/Clothing_Gear/gear.json b/data/json/itemgroups/Clothing_Gear/gear.json index 0dfa98f2ea509..5ee14c38c1ce9 100644 --- a/data/json/itemgroups/Clothing_Gear/gear.json +++ b/data/json/itemgroups/Clothing_Gear/gear.json @@ -17,6 +17,8 @@ [ "helmet_lobster", 5 ], [ "helmet_riot", 5 ], [ "holo_sight", 20 ], + [ "balclava", 10 ], + [ "balaclava_cut_resistant", 5 ], [ "holster", 15 ], [ "bandolier_shotgun", 15 ], [ "torso_bandolier_shotgun", 8 ], diff --git a/data/json/itemgroups/Locations_MapExtras/locations.json b/data/json/itemgroups/Locations_MapExtras/locations.json index 3379cf2e87a4a..158fe4a4252ca 100644 --- a/data/json/itemgroups/Locations_MapExtras/locations.json +++ b/data/json/itemgroups/Locations_MapExtras/locations.json @@ -42,6 +42,7 @@ { "group": "ammo_swat", "prob": 20 }, { "group": "guns_swat", "prob": 20 }, { "group": "mags_swat", "prob": 20 }, + { "group": "eod_armor", "prob": 20 }, { "item": "survnote", "prob": 1 } ] }, diff --git a/data/json/itemgroups/Locations_MapExtras/locations_commercial.json b/data/json/itemgroups/Locations_MapExtras/locations_commercial.json index f515e02965eb0..64c2523015636 100644 --- a/data/json/itemgroups/Locations_MapExtras/locations_commercial.json +++ b/data/json/itemgroups/Locations_MapExtras/locations_commercial.json @@ -236,6 +236,9 @@ [ "sleeveless_duster", 5 ], [ "sleeveless_duster_leather", 5 ], [ "sleeveless_duster_fur", 5 ], + [ "apron_cut_resistant", 2 ], + [ "chaps_cut_resistant", 5 ], + [ "balaclava_cut_resistant", 5 ], [ "gold_watch", 15 ], [ "silver_watch", 20 ], [ "sf_watch", 7 ], @@ -1862,7 +1865,7 @@ { "item": "shed_stick", "prob": 2 }, [ "tailors_kit", 9 ], [ "knitting_needles", 15 ], - [ "kevlar_plate", 10 ], + [ "sheet_kevlar_layered", 10 ], [ "leather", 10 ], [ "rag", 20 ], [ "needle_curved", 10 ], diff --git a/data/json/itemgroups/Monsters_Animals_Lairs/monster_drops_advtech.json b/data/json/itemgroups/Monsters_Animals_Lairs/monster_drops_advtech.json index 422c6279b1d75..181793155504f 100644 --- a/data/json/itemgroups/Monsters_Animals_Lairs/monster_drops_advtech.json +++ b/data/json/itemgroups/Monsters_Animals_Lairs/monster_drops_advtech.json @@ -15,7 +15,7 @@ { "item": "steel_chunk", "prob": 30 }, { "item": "spring", "prob": 50 }, { "item": "steel_lump", "prob": 30 }, - { "item": "kevlar_plate", "prob": 10 }, + { "item": "sheet_kevlar_layered", "prob": 10 }, { "item": "ceramic_armor", "prob": 15 }, { "item": "motor", "prob": 2 }, { "group": "ammo_heavy_batteries_full", "prob": 50 }, @@ -60,7 +60,7 @@ "entries": [ { "item": "baton", "prob": 8 }, { "item": "tazer", "prob": 3 }, - { "item": "kevlar_plate", "prob": 10 }, + { "item": "sheet_kevlar_layered", "prob": 10 }, { "item": "ceramic_armor", "prob": 15 }, { "item": "tonfa", "prob": 10 }, { "item": "shocktonfa_off", "prob": 5 }, diff --git a/data/json/itemgroups/collections_domestic.json b/data/json/itemgroups/collections_domestic.json index b410a1555d328..2c25b1fc3ffe1 100644 --- a/data/json/itemgroups/collections_domestic.json +++ b/data/json/itemgroups/collections_domestic.json @@ -459,6 +459,7 @@ { "group": "kitchen_appliances", "prob": 253 }, { "item": "hat_chef", "prob": 2 }, { "item": "jacket_chef", "prob": 2 }, + { "item": "gloves_cut_resistant", "prob": 1 }, { "item": "pot", "prob": 25 }, { "item": "sponge", "prob": 30 }, { "item": "pot_copper", "prob": 15 }, diff --git a/data/json/itemgroups/food_service.json b/data/json/itemgroups/food_service.json index 230d7aae23f5d..644bae086d9c0 100644 --- a/data/json/itemgroups/food_service.json +++ b/data/json/itemgroups/food_service.json @@ -955,6 +955,8 @@ [ "foon", 5 ], { "group": "wines_worthy", "prob": 66 }, [ "fruit_wine", 20 ], + [ "gloves_cut_resistant", 5 ], + [ "armguard_cut_resistant", 2 ], [ "hat_chef", 30 ], [ "jacket_chef", 30 ], [ "pants_checkered", 28 ] diff --git a/data/json/itemgroups/military.json b/data/json/itemgroups/military.json index d8ee6133d259c..479f37867ecce 100644 --- a/data/json/itemgroups/military.json +++ b/data/json/itemgroups/military.json @@ -505,7 +505,7 @@ { "item": "jumpsuit", "prob": 20 }, { "item": "kevlar", "prob": 10 }, { "item": "ballistic_vest_esapi", "prob": 40 }, - { "item": "kevlar_plate", "prob": 10 }, + { "item": "sheet_kevlar_layered", "prob": 10 }, { "item": "mask_gas", "prob": 10 }, { "item": "helmet_army", "prob": 40 }, { "item": "helmet_liner", "prob": 10 }, diff --git a/data/json/itemgroups/trash_and_debris.json b/data/json/itemgroups/trash_and_debris.json index 3e3f2ec771f26..238c36807cbba 100644 --- a/data/json/itemgroups/trash_and_debris.json +++ b/data/json/itemgroups/trash_and_debris.json @@ -119,7 +119,7 @@ [ "tinder", 1 ], [ "rag", 1 ], [ "hairpin", 1 ], - [ "kevlar_plate", 1 ], + [ "sheet_kevlar_layered", 1 ], [ "ceramic_armor", 1 ], [ "leather", 1 ], [ "software_hacking", 10 ], diff --git a/data/json/items/armor/ammo_pouch.json b/data/json/items/armor/ammo_pouch.json index 2e4e0bc5cd7e2..beb0ff2c00298 100644 --- a/data/json/items/armor/ammo_pouch.json +++ b/data/json/items/armor/ammo_pouch.json @@ -454,7 +454,7 @@ "price_postapoc": 6000, "to_hit": -3, "bashing": 6, - "material": [ "kevlar" ], + "material": [ "kevlar_layered" ], "symbol": "[", "color": "light_gray", "covers": [ "TORSO" ], diff --git a/data/json/items/armor/arms_armor.json b/data/json/items/armor/arms_armor.json index 719917bb9e8b8..a368b61b4cdb9 100644 --- a/data/json/items/armor/arms_armor.json +++ b/data/json/items/armor/arms_armor.json @@ -279,5 +279,15 @@ "material_thickness": 3, "environmental_protection": 1, "flags": [ "STURDY", "BELTED", "WATER_FRIENDLY" ] + }, + { + "id": "armguard_cut_resistant", + "type": "ARMOR", + "name": { "str": "pair of cut-resistant arm sleeves", "str_pl": "pairs of cut-resistant arm sleeves" }, + "description": "A long pair of cut resistant sleeves, with thumbholes. Useful for chainsaw protection.", + "weight": "113 g", + "copy-from": "armguard_soft", + "price": 1200, + "material": [ "kevlar" ] } ] diff --git a/data/json/items/armor/ballistic_armor.json b/data/json/items/armor/ballistic_armor.json index af45b40580800..0137802d2b6fe 100644 --- a/data/json/items/armor/ballistic_armor.json +++ b/data/json/items/armor/ballistic_armor.json @@ -54,7 +54,7 @@ "price_postapoc": 6000, "to_hit": -3, "bashing": 6, - "material": [ "lightceramic", "kevlar" ], + "material": [ "lightceramic", "kevlar_layered" ], "symbol": "[", "looks_like": "kevlar", "color": "light_red", @@ -79,7 +79,7 @@ "price_postapoc": 2000, "to_hit": -3, "bashing": 6, - "material": [ "kevlar" ], + "material": [ "kevlar_layered" ], "symbol": "[", "looks_like": "dragonskin", "color": "light_red", diff --git a/data/json/items/armor/boots.json b/data/json/items/armor/boots.json index 46bf5f6c6352d..7697bc7e892bb 100644 --- a/data/json/items/armor/boots.json +++ b/data/json/items/armor/boots.json @@ -145,6 +145,47 @@ "environmental_protection": 2, "flags": [ "VARSIZE", "WATERPROOF", "STURDY" ] }, + { + "id": "foot_protectors_eod", + "type": "ARMOR", + "category": "armor", + "name": { "str": "pair of EOD foot protectors", "str_pl": "pairs of EOD foot protectors" }, + "description": "Armored foot protectors constructed from steel and nomex for explosive ordnance disposal. They are designed to protect against overpressure, fragmentation, impact and heat.", + "weight": "1220 g", + "volume": "3 L", + "price": 50000, + "covers": [ "FEET" ], + "coverage": 100, + "encumbrance": 40, + "warmth": 10, + "material": [ "steel", "nomex" ], + "symbol": "[", + "color": "light_gray", + "environmental_protection": 2, + "material_thickness": 7, + "flags": [ "STURDY", "OUTER" ] + }, + { + "id": "toecaps", + "type": "ARMOR", + "name": { "str": "pair of toecaps", "str_pl": "pairs of toecaps" }, + "description": "Rubbery overshoes that cover your toes with sturdy, ANSI compliant steel toes.", + "weight": "907 g", + "volume": "1 L", + "price": 2500, + "to_hit": -1, + "bashing": 2, + "material": [ "plastic", "steel" ], + "symbol": "[", + "color": "brown", + "covers": [ "FEET" ], + "coverage": 15, + "encumbrance": 10, + "warmth": 10, + "material_thickness": 3, + "environmental_protection": 1, + "flags": [ "OUTER", "STURDY" ] + }, { "id": "boots_fsurvivor", "type": "ARMOR", diff --git a/data/json/items/armor/coats.json b/data/json/items/armor/coats.json index 713b16549877e..21dc9c7d5d3e0 100644 --- a/data/json/items/armor/coats.json +++ b/data/json/items/armor/coats.json @@ -346,7 +346,7 @@ "price": 40000, "price_postapoc": 8000, "to_hit": -1, - "material": [ "cotton", "kevlar" ], + "material": [ "cotton", "kevlar_layered" ], "symbol": "[", "looks_like": "duster_leather", "color": "brown", @@ -1103,7 +1103,7 @@ "price": 34000, "price_postapoc": 4500, "to_hit": -1, - "material": [ "cotton", "kevlar" ], + "material": [ "cotton", "kevlar_layered" ], "symbol": "[", "looks_like": "duster_survivor", "color": "brown", @@ -1246,7 +1246,7 @@ "price": 34000, "price_postapoc": 500, "to_hit": -1, - "material": [ "cotton", "kevlar" ], + "material": [ "cotton", "kevlar_layered" ], "symbol": "[", "looks_like": "sleeveless_duster_survivor", "color": "brown", @@ -1428,7 +1428,7 @@ "price": 40000, "price_postapoc": 8000, "to_hit": -1, - "material": [ "cotton", "kevlar" ], + "material": [ "cotton", "kevlar_layered" ], "symbol": "[", "looks_like": "trenchcoat", "color": "brown", diff --git a/data/json/items/armor/eyewear.json b/data/json/items/armor/eyewear.json index 5b6469af9518a..bdfc5ad4daa10 100644 --- a/data/json/items/armor/eyewear.json +++ b/data/json/items/armor/eyewear.json @@ -76,7 +76,7 @@ "price": 7500, "price_postapoc": 500, "to_hit": -2, - "material": [ "kevlar_rigid", "plastic" ], + "material": [ "plastic", "nylon" ], "symbol": "[", "looks_like": "glasses_safety", "color": "dark_gray", @@ -296,7 +296,7 @@ "price": 7500, "price_postapoc": 3000, "to_hit": -2, - "material": [ "kevlar", "leather" ], + "material": [ "kevlar_layered", "leather" ], "symbol": "[", "looks_like": "glasses_bal", "color": "dark_gray", diff --git a/data/json/items/armor/gloves.json b/data/json/items/armor/gloves.json index f52c24ed84512..c7e88e7f5e9ed 100644 --- a/data/json/items/armor/gloves.json +++ b/data/json/items/armor/gloves.json @@ -266,7 +266,7 @@ "price": 18000, "price_postapoc": 2500, "to_hit": 2, - "material": [ "kevlar", "nomex" ], + "material": [ "kevlar_layered", "nomex" ], "symbol": "[", "looks_like": "fire_gauntlets", "color": "light_gray", @@ -309,7 +309,7 @@ "price": 18000, "price_postapoc": 3000, "to_hit": 2, - "material": [ "kevlar", "steel" ], + "material": [ "kevlar_layered", "steel" ], "symbol": "[", "looks_like": "fire_gauntlets", "color": "dark_gray", @@ -417,7 +417,7 @@ "price": 18000, "price_postapoc": 2000, "to_hit": 2, - "material": [ "kevlar", "cotton" ], + "material": [ "kevlar_layered", "cotton" ], "symbol": "[", "looks_like": "gloves_survivor", "color": "green", @@ -441,7 +441,7 @@ "price": 16000, "price_postapoc": 2000, "to_hit": 2, - "material": [ "kevlar", "cotton" ], + "material": [ "kevlar_layered", "cotton" ], "symbol": "[", "color": "green", "covers": [ "HANDS" ], @@ -532,7 +532,7 @@ "price": 18000, "price_postapoc": 2000, "to_hit": 2, - "material": [ "kevlar", "leather" ], + "material": [ "kevlar_layered", "leather" ], "symbol": "[", "looks_like": "fire_gauntlets", "color": "brown", @@ -550,7 +550,7 @@ "type": "ARMOR", "category": "armor", "name": { "str": "pair of tactical gloves", "str_pl": "pairs of tactical gloves" }, - "description": "A pair of reinforced Kevlar tactical gloves. Commonly used by police and military units.", + "description": "A pair of flame and cut resistant aramid fabric gloves. Commonly used by police and military units.", "weight": "220 g", "volume": "500 ml", "price": 5200, @@ -565,6 +565,7 @@ "encumbrance": 13, "warmth": 20, "material_thickness": 2, + "environmental_protection": 2, "flags": [ "VARSIZE", "STURDY" ] }, { @@ -635,13 +636,13 @@ "repairs_like": "gloves_plate", "type": "ARMOR", "name": { "str": "pair of cut resistant gloves", "str_pl": "pairs of cut resistant gloves" }, - "description": "A pair of cut resistant gloves, useful when rapidly breaking down carcasses.", + "description": "A pair of cut resistant gloves, useful for butchery or routine work with bladed objects.", "weight": "240 g", "volume": "250 ml", "price": 9000, "price_postapoc": 100, "to_hit": 2, - "material": [ "steel", "cotton" ], + "material": [ "kevlar" ], "symbol": "[", "looks_like": "gloves_work", "color": "light_gray", @@ -747,7 +748,7 @@ "price": 18000, "price_postapoc": 2500, "to_hit": 2, - "material": [ "kevlar", "fur" ], + "material": [ "kevlar_layered", "fur" ], "symbol": "[", "looks_like": "gloves_winter", "color": "light_gray", @@ -770,7 +771,7 @@ "price": 18000, "price_postapoc": 1500, "to_hit": 2, - "material": [ "kevlar", "leather" ], + "material": [ "kevlar_layered", "leather" ], "symbol": "[", "looks_like": "gloves_survivor", "color": "brown", @@ -927,5 +928,25 @@ "warmth": 20, "material_thickness": 1, "flags": [ "VARSIZE", "WATERPROOF", "SKINTIGHT" ] + }, + { + "id": "gloves_eod", + "type": "ARMOR", + "category": "armor", + "name": { "str": "pair of EOD gloves", "str_pl": "pairs of EOD gloves" }, + "description": "Light armored gloves constructed from kevlar and nomex for explosive ordnance disposal. They are designed to protect against fragmentation and heat.", + "weight": "800 g", + "volume": "1500 ml", + "price": 70000, + "covers": [ "HANDS" ], + "coverage": 100, + "encumbrance": 20, + "warmth": 40, + "material": [ "kevlar_layered", "nomex" ], + "symbol": "[", + "color": "light_gray", + "environmental_protection": 2, + "material_thickness": 5, + "flags": [ "STURDY", "OUTER", "RAINPROOF", "ONLY_ONE" ] } ] diff --git a/data/json/items/armor/helmets.json b/data/json/items/armor/helmets.json index 6d10547a84a97..268b842290e4c 100644 --- a/data/json/items/armor/helmets.json +++ b/data/json/items/armor/helmets.json @@ -58,7 +58,7 @@ "price_postapoc": 1500, "to_hit": -1, "bashing": 10, - "material": [ "kevlar", "plastic" ], + "material": [ "kevlar_rigid", "plastic" ], "symbol": "[", "looks_like": "hat_hard", "color": "green", @@ -83,7 +83,7 @@ "price_postapoc": 1000, "to_hit": -1, "bashing": 10, - "material": [ "kevlar", "plastic" ], + "material": [ "kevlar_rigid", "plastic" ], "symbol": "[", "looks_like": "helmet_motor", "color": "dark_gray", @@ -109,7 +109,7 @@ "price_postapoc": 750, "to_hit": -1, "bashing": 10, - "material": [ "kevlar", "plastic" ], + "material": [ "kevlar_rigid", "plastic" ], "symbol": "[", "looks_like": "tac_fullhelmet", "color": "dark_gray", @@ -421,7 +421,7 @@ "price_postapoc": 3000, "to_hit": -1, "bashing": 10, - "material": [ "kevlar", "plastic" ], + "material": [ "kevlar_rigid", "plastic" ], "symbol": "[", "looks_like": "helmet_barbute", "color": "light_gray", @@ -537,7 +537,7 @@ "price": 55000, "price_postapoc": 3500, "to_hit": -3, - "material": [ "kevlar", "cotton" ], + "material": [ "kevlar_layered", "cotton" ], "symbol": "[", "looks_like": "mask_gas", "color": "white", diff --git a/data/json/items/armor/hoods.json b/data/json/items/armor/hoods.json index afe02850e3bb3..e0f331408b43f 100644 --- a/data/json/items/armor/hoods.json +++ b/data/json/items/armor/hoods.json @@ -54,7 +54,7 @@ "price_postapoc": 4000, "to_hit": -1, "bashing": 10, - "material": [ "kevlar", "nomex" ], + "material": [ "kevlar_layered", "nomex" ], "symbol": "[", "looks_like": "hood_survivor", "color": "light_gray", @@ -78,7 +78,7 @@ "price_postapoc": 3000, "to_hit": -1, "bashing": 10, - "material": [ "kevlar", "cotton" ], + "material": [ "kevlar_layered", "cotton" ], "symbol": "[", "looks_like": "hood_survivor", "color": "green", @@ -122,7 +122,7 @@ "price_postapoc": 4000, "to_hit": -1, "bashing": 10, - "material": [ "kevlar", "leather" ], + "material": [ "kevlar_layered", "leather" ], "symbol": "[", "looks_like": "hood_rain", "color": "brown", @@ -147,7 +147,7 @@ "price_postapoc": 3500, "to_hit": -1, "bashing": 10, - "material": [ "kevlar", "fur" ], + "material": [ "kevlar_layered", "fur" ], "symbol": "[", "looks_like": "hood_survivor", "color": "light_gray", @@ -171,7 +171,7 @@ "price_postapoc": 2500, "to_hit": -1, "bashing": 10, - "material": [ "kevlar", "leather" ], + "material": [ "kevlar_layered", "leather" ], "symbol": "[", "looks_like": "hood_survivor", "color": "brown", diff --git a/data/json/items/armor/legs_armor.json b/data/json/items/armor/legs_armor.json index 325d89e24293c..c9f029c885480 100644 --- a/data/json/items/armor/legs_armor.json +++ b/data/json/items/armor/legs_armor.json @@ -97,6 +97,17 @@ "material_thickness": 3, "flags": [ "OUTER" ] }, + { + "id": "chaps_cut_resistant", + "type": "ARMOR", + "name": { "str_sp": "chainsaw chaps" }, + "description": "A pair of tough chaps made of kevlar. Chainsaw kickbacks are potentially fatal; personal protective equipment like these chaps help protect your femoral arteries. The layered kevlar is designed to fray on contact with the chain and bind up the tool.", + "weight": "1519 g", + "copy-from": "chaps_leather", + "price": 7800, + "material": [ "kevlar_layered" ], + "material_thickness": 2 + }, { "id": "fencing_pants", "repairs_like": "survivor_suit", @@ -107,7 +118,7 @@ "volume": "2 L", "price": 2500, "price_postapoc": 500, - "material": [ "cotton", "kevlar" ], + "material": [ "cotton", "nylon" ], "symbol": "[", "looks_like": "pants", "color": "white", @@ -287,7 +298,7 @@ "volume": "3500 ml", "price": 40000, "price_postapoc": 1500, - "material": [ "kevlar", "cotton" ], + "material": [ "kevlar_layered", "cotton" ], "symbol": "[", "looks_like": "pants_survivor", "color": "green", @@ -340,7 +351,7 @@ "volume": "3 L", "price": 38000, "price_postapoc": 2000, - "material": [ "cotton", "kevlar" ], + "material": [ "cotton", "kevlar_layered" ], "symbol": "[", "looks_like": "pants_army", "color": "green", @@ -363,5 +374,45 @@ "valid_mods": [ "steel_padded" ], "environmental_protection": 3, "flags": [ "VARSIZE", "POCKETS", "STURDY", "WATERPROOF" ] + }, + { + "id": "trousers_eod", + "type": "ARMOR", + "category": "armor", + "name": { "str_sp": "EOD trousers" }, + "description": "Thick armored trousers constructed from kevlar and nomex for explosive ordnance disposal. It is designed to protect against overpressure, fragmentation, impact and heat.", + "weight": "6400 g", + "volume": "12 L", + "price": 200000, + "covers": [ "LEGS" ], + "coverage": 100, + "encumbrance": 80, + "warmth": 65, + "material": [ "kevlar_layered", "nomex" ], + "symbol": "[", + "color": "light_gray", + "environmental_protection": 2, + "material_thickness": 15, + "flags": [ "STURDY", "OUTER", "RAINPROOF", "ONLY_ONE" ] + }, + { + "id": "trousers_eod_light", + "type": "ARMOR", + "category": "armor", + "name": { "str_sp": "light EOD trousers" }, + "description": "Armored trousers constructed from kevlar and nomex designed to protect against overpressure, fragmentation, impact and heat in hostile environments. It is lighter than normal EOD armor to provide more maneuverability.", + "weight": "3000 g", + "volume": "12 L", + "price": 200000, + "covers": [ "LEGS" ], + "coverage": 100, + "encumbrance": 40, + "warmth": 40, + "material": [ "kevlar_layered", "nomex" ], + "symbol": "[", + "color": "light_gray", + "environmental_protection": 2, + "material_thickness": 7, + "flags": [ "STURDY", "OUTER", "RAINPROOF", "ONLY_ONE" ] } ] diff --git a/data/json/items/armor/masks.json b/data/json/items/armor/masks.json index 29b2cf13b7d87..6caca7629b8e2 100644 --- a/data/json/items/armor/masks.json +++ b/data/json/items/armor/masks.json @@ -19,6 +19,15 @@ "material_thickness": 2, "flags": [ "VARSIZE", "SKINTIGHT" ] }, + { + "id": "balaclava_cut_resistant", + "type": "ARMOR", + "name": { "str": "cut-resistant balaclava" }, + "description": "A face covering garment that helps protect from slashes and cuts, in addition to the cold.", + "copy-from": "balclava", + "price": 7600, + "material": [ "kevlar" ] + }, { "id": "bandana", "type": "ARMOR", diff --git a/data/json/items/armor/pets_dog_armor.json b/data/json/items/armor/pets_dog_armor.json index 7fcefc61b8383..35720ae92af87 100644 --- a/data/json/items/armor/pets_dog_armor.json +++ b/data/json/items/armor/pets_dog_armor.json @@ -9,7 +9,7 @@ "description": "A blue bulletproof harness, designed to be worn by canines in the service of local law enforcement, that protects from shoulders to abdomen. You could put this on a friendly dog.", "price": 30000, "price_postapoc": 1000, - "material": [ "kevlar" ], + "material": [ "kevlar_layered" ], "weight": "4290 g", "volume": "4500 ml", "bashing": 5, diff --git a/data/json/items/armor/pets_horse_armor.json b/data/json/items/armor/pets_horse_armor.json index c46941a1e9a3c..d053f4a68d946 100644 --- a/data/json/items/armor/pets_horse_armor.json +++ b/data/json/items/armor/pets_horse_armor.json @@ -18,7 +18,7 @@ "description": "A heavy mattress-like armor of cloth, leather and thick linings of Kevlar, originally used as protection in bullfighting. You could put this on a friendly horse.", "price": 50000, "price_postapoc": 5000, - "material": [ "cotton", "leather", "kevlar" ], + "material": [ "cotton", "leather", "kevlar_layered" ], "weight": "30 kg", "volume": "150 L", "material_thickness": 10 diff --git a/data/json/items/armor/storage.json b/data/json/items/armor/storage.json index ecccabfe04511..c0118a8815c3b 100644 --- a/data/json/items/armor/storage.json +++ b/data/json/items/armor/storage.json @@ -373,7 +373,7 @@ "price_postapoc": 250, "to_hit": 2, "bashing": 1, - "material": [ "kevlar", "plastic" ], + "material": [ "nylon", "plastic" ], "symbol": "[", "looks_like": "holster", "color": "dark_gray", @@ -641,7 +641,7 @@ "volume": "2500 ml", "price": 6700, "price_postapoc": 1500, - "material": [ "cotton", "kevlar" ], + "material": [ "cotton", "nylon" ], "symbol": "[", "looks_like": "backpack", "color": "green", diff --git a/data/json/items/armor/suits_protection.json b/data/json/items/armor/suits_protection.json index bd6453af623ce..6075ee19064b6 100644 --- a/data/json/items/armor/suits_protection.json +++ b/data/json/items/armor/suits_protection.json @@ -9,7 +9,7 @@ "volume": "9 L", "price": 140000, "price_postapoc": 6000, - "material": [ "kevlar", "plastic" ], + "material": [ "kevlar_layered", "plastic" ], "symbol": "[", "looks_like": "hazmat_suit", "color": "light_red", @@ -38,7 +38,7 @@ "volume": "20 L", "price": 400000, "price_postapoc": 9000, - "material": [ "kevlar", "plastic" ], + "material": [ "kevlar_layered", "plastic" ], "symbol": "[", "looks_like": "hazmat_suit", "color": "light_red", @@ -378,7 +378,7 @@ "price": 180000, "price_postapoc": 2000, "to_hit": -3, - "material": [ "kevlar", "cotton" ], + "material": [ "kevlar_layered", "cotton" ], "symbol": "[", "looks_like": "armor_nomad", "color": "green", @@ -539,7 +539,7 @@ "volume": "6 L", "price": 240500, "price_postapoc": 2500, - "material": [ "nomex", "kevlar" ], + "material": [ "nomex", "kevlar_layered" ], "symbol": "[", "looks_like": "jumpsuit", "color": "light_gray", @@ -563,7 +563,7 @@ "price_postapoc": 5000, "to_hit": -3, "bashing": 6, - "material": [ "kevlar", "nomex" ], + "material": [ "kevlar_layered", "nomex" ], "symbol": "[", "looks_like": "survivor_suit", "color": "light_gray", @@ -641,7 +641,7 @@ "price_postapoc": 7000, "to_hit": -3, "bashing": 6, - "material": [ "kevlar", "steel", "leather" ], + "material": [ "kevlar_layered", "steel", "leather" ], "symbol": "[", "looks_like": "survivor_suit", "color": "dark_gray", @@ -670,7 +670,7 @@ "volume": "10500 ml", "price": 110000, "price_postapoc": 5000, - "material": [ "kevlar", "cotton" ], + "material": [ "kevlar_layered", "cotton" ], "symbol": "[", "looks_like": "survivor_suit", "color": "green", @@ -805,7 +805,7 @@ "volume": "11500 ml", "price": 150000, "price_postapoc": 5000, - "material": [ "kevlar", "leather" ], + "material": [ "kevlar_layered", "leather" ], "symbol": "[", "looks_like": "touring_suit", "color": "brown", @@ -839,7 +839,7 @@ "price_postapoc": 2000, "to_hit": -3, "bashing": 6, - "material": [ "kevlar", "cotton" ], + "material": [ "kevlar_layered", "cotton" ], "symbol": "[", "looks_like": "touring_suit", "color": "dark_gray", @@ -898,7 +898,7 @@ "price_postapoc": 5000, "to_hit": -3, "bashing": 6, - "material": [ "kevlar", "fur" ], + "material": [ "kevlar_layered", "fur" ], "symbol": "[", "looks_like": "survivor_suit", "color": "light_gray", @@ -930,7 +930,7 @@ "price_postapoc": 4000, "to_hit": -3, "bashing": 6, - "material": [ "kevlar", "leather" ], + "material": [ "kevlar_layered", "leather" ], "symbol": "[", "looks_like": "survivor_suit", "color": "brown", @@ -964,7 +964,7 @@ "price_postapoc": 5000, "to_hit": -3, "bashing": 6, - "material": [ "kevlar", "steel", "leather" ], + "material": [ "kevlar_layered", "steel", "leather" ], "symbol": "[", "looks_like": "hsurvivor_suit", "color": "dark_gray", diff --git a/data/json/items/armor/torso_armor.json b/data/json/items/armor/torso_armor.json index f8a942f73dbb6..bb84550b34029 100644 --- a/data/json/items/armor/torso_armor.json +++ b/data/json/items/armor/torso_armor.json @@ -312,7 +312,7 @@ "price_postapoc": 1250, "to_hit": -3, "bashing": 6, - "material": [ "kevlar" ], + "material": [ "kevlar_layered" ], "symbol": "[", "looks_like": "vest_leather", "color": "light_gray", @@ -448,5 +448,45 @@ "material_thickness": 3, "environmental_protection": 1, "flags": [ "VARSIZE", "POCKETS", "OUTER" ] + }, + { + "id": "jacket_eod", + "type": "TOOL_ARMOR", + "category": "armor", + "name": { "str": "EOD jacket" }, + "description": "A thick armored jacket constructed from kevlar and nomex for explosive ordnance disposal. It is designed to protect against overpressure, fragmentation, impact and heat.", + "weight": "16300 g", + "volume": "15 L", + "price": 200000, + "covers": [ "TORSO", "ARMS" ], + "coverage": 100, + "encumbrance": 80, + "warmth": 65, + "material": [ "kevlar_layered", "kevlar_rigid", "nomex" ], + "symbol": "[", + "color": "light_gray", + "environmental_protection": 2, + "material_thickness": 15, + "flags": [ "STURDY", "OUTER", "RAINPROOF", "ONLY_ONE" ] + }, + { + "id": "jacket_eod_light", + "type": "TOOL_ARMOR", + "category": "armor", + "name": { "str": "light EOD jacket" }, + "description": "An armored jacket constructed from kevlar and nomex designed to protect against overpressure, fragmentation, impact and heat in hostile environments. It is lighter than normal EOD armor to provide more maneuverability and can be worn over ballistic armor.", + "weight": "7000 g", + "volume": "15 L", + "price": 200000, + "covers": [ "TORSO", "ARMS" ], + "coverage": 100, + "encumbrance": 40, + "warmth": 40, + "material": [ "kevlar_layered", "kevlar_rigid", "nomex" ], + "symbol": "[", + "color": "light_gray", + "environmental_protection": 2, + "material_thickness": 7, + "flags": [ "STURDY", "OUTER", "RAINPROOF", "ONLY_ONE" ] } ] diff --git a/data/json/items/armor/torso_clothes.json b/data/json/items/armor/torso_clothes.json index fd2975e4f911f..e3f4ca38991a5 100644 --- a/data/json/items/armor/torso_clothes.json +++ b/data/json/items/armor/torso_clothes.json @@ -26,6 +26,15 @@ "environmental_protection": 1, "flags": [ "POCKETS", "BELTED", "WATER_FRIENDLY" ] }, + { + "id": "apron_cut_resistant", + "type": "ARMOR", + "name": { "str": "cut-resistant apron" }, + "description": "An apron made of kevlar fabric which provides excellent protection from cuts.", + "copy-from": "apron_leather", + "price": 3800, + "material": [ "kevlar" ] + }, { "id": "blazer", "type": "ARMOR", diff --git a/data/json/items/migration.json b/data/json/items/migration.json index 53890b6f99216..9fffcbced1de2 100644 --- a/data/json/items/migration.json +++ b/data/json/items/migration.json @@ -1188,5 +1188,10 @@ "id": "akmbigmag", "type": "MIGRATION", "replace": "akmag40" + }, + { + "id": "kevlar_plate", + "type": "MIGRATION", + "replace": "sheet_kevlar_layered" } ] diff --git a/data/json/items/resources/tailoring.json b/data/json/items/resources/tailoring.json index 948a0bb13adeb..61b3d82967e19 100644 --- a/data/json/items/resources/tailoring.json +++ b/data/json/items/resources/tailoring.json @@ -185,10 +185,10 @@ "type": "AMMO", "category": "spare_parts", "name": { "str": "Kevlar sheet" }, - "description": "A sheet of Kevlar synthetic fabric, suitable for making bulletproof armor. In this form, unlike rigid plates, it can be stitched.", + "description": "A sheet of Kevlar synthetic fabric, suitable for making cut-resistant, durable clothing. In this form, unlike rigid plates, it can be stitched.", "weight": "5 g", "volume": "300 ml", - "price": 15000, + "price": 900, "price_postapoc": 500, "material": "kevlar", "symbol": "=", @@ -212,6 +212,34 @@ "count": 100, "ammo_type": "components" }, + { + "id": "sheet_kevlar_layered", + "type": "TOOL", + "category": "spare_parts", + "name": "layered kevlar panel", + "description": "This is a small 16-layer thick Kevlar panel. It could be used to repair armor made of Kevlar.", + "weight": "80 g", + "volume": "600 ml", + "price": 15000, + "material": "kevlar_layered", + "flags": [ "NO_SALVAGE" ], + "symbol": ",", + "color": "green" + }, + { + "id": "rigid_kevlar_plate", + "type": "TOOL", + "category": "spare_parts", + "name": "rigid kevlar plate", + "description": "This is a compressed panel of kevlar treated with epoxy or other adhesive. It could be used to repair items made of Kevlar.", + "weight": "300 g", + "volume": "250 ml", + "price": 1000, + "material": "kevlar_rigid", + "flags": [ "NO_SALVAGE" ], + "symbol": ",", + "color": "green" + }, { "id": "sheet_lycra_patchwork", "copy-from": "sheet_lycra", diff --git a/data/json/items/tool/misc.json b/data/json/items/tool/misc.json index b7d879665020a..cf1fd6163732d 100644 --- a/data/json/items/tool/misc.json +++ b/data/json/items/tool/misc.json @@ -335,21 +335,6 @@ "symbol": ";", "color": "light_gray" }, - { - "id": "kevlar_plate", - "type": "TOOL", - "category": "spare_parts", - "name": { "str": "Kevlar plate" }, - "description": "This is a plate of reinforced Kevlar. It could be used to repair items made of Kevlar.", - "weight": "300 g", - "volume": "250 ml", - "price": 1000, - "price_postapoc": 25, - "material": "kevlar", - "symbol": ",", - "color": "green", - "flags": [ "NO_SALVAGE" ] - }, { "id": "large_space_heater", "type": "TOOL", diff --git a/data/json/items/tool/tailoring.json b/data/json/items/tool/tailoring.json index 5760db0eb696f..f43029c49d2eb 100644 --- a/data/json/items/tool/tailoring.json +++ b/data/json/items/tool/tailoring.json @@ -83,7 +83,7 @@ "use_action": { "type": "repair_item", "item_action_type": "repair_fabric", - "materials": [ "cotton", "leather", "lycra", "nylon", "wool", "fur", "faux_fur", "nomex", "kevlar", "gutskin" ], + "materials": [ "cotton", "leather", "lycra", "nylon", "wool", "fur", "faux_fur", "nomex", "kevlar", "kevlar_layered", "gutskin" ], "skill": "tailor", "tool_quality": -1, "cost_scaling": 0.1, @@ -168,7 +168,7 @@ "use_action": { "type": "repair_item", "item_action_type": "repair_fabric", - "materials": [ "cotton", "leather", "lycra", "nylon", "wool", "fur", "faux_fur", "nomex", "kevlar", "gutskin" ], + "materials": [ "cotton", "leather", "lycra", "nylon", "wool", "fur", "faux_fur", "nomex", "kevlar", "kevlar_layered", "gutskin" ], "skill": "tailor", "tool_quality": 0, "cost_scaling": 0.1, @@ -278,7 +278,20 @@ { "type": "repair_item", "item_action_type": "repair_fabric", - "materials": [ "cotton", "leather", "lycra", "nylon", "wool", "fur", "faux_fur", "nomex", "kevlar", "neoprene", "gutskin" ], + "materials": [ + "cotton", + "leather", + "lycra", + "nylon", + "wool", + "fur", + "faux_fur", + "nomex", + "kevlar", + "kevlar_layered", + "neoprene", + "gutskin" + ], "skill": "tailor", "tool_quality": 1, "cost_scaling": 0.1, diff --git a/data/json/items/tool/workshop.json b/data/json/items/tool/workshop.json index 69d18d102c406..ea3bc1b270d7d 100644 --- a/data/json/items/tool/workshop.json +++ b/data/json/items/tool/workshop.json @@ -908,7 +908,7 @@ { "type": "repair_item", "item_action_type": "repair_metal", - "materials": [ "kevlar", "plastic", "iron", "steel", "hardsteel", "aluminum", "copper", "silver", "gold" ], + "materials": [ "kevlar", "kevlar_layered", "plastic", "iron", "steel", "hardsteel", "aluminum", "copper", "silver", "gold" ], "skill": "mechanics", "cost_scaling": 0.1, "move_cost": 1000 diff --git a/data/json/items/tool_armor.json b/data/json/items/tool_armor.json index 3c093c871706b..690e65f983422 100644 --- a/data/json/items/tool_armor.json +++ b/data/json/items/tool_armor.json @@ -786,6 +786,52 @@ "target": "wearable_atomic_light" } }, + { + "id": "helmet_eod", + "type": "TOOL_ARMOR", + "category": "armor", + "name": { "str": "EOD helmet" }, + "description": "An armored electronically shielded helmet containing a camera, a two-way radio, and a headlamp, all of which can be voice-activated for redundancy. It is designed to protect against overpressure, fragmentation, impact and heat.", + "weight": "5600 g", + "volume": "4 L", + "price": 150000, + "covers": [ "HEAD", "MOUTH", "EYES" ], + "coverage": 100, + "encumbrance": 20, + "warmth": 65, + "material": [ "kevlar_rigid", "nomex" ], + "symbol": "[", + "color": "light_gray", + "environmental_protection": 2, + "ammo": "battery", + "magazines": [ + [ + "battery", + [ "medium_battery_cell", "medium_plus_battery_cell", "medium_atomic_battery_cell", "medium_disposable_cell" ] + ] + ], + "use_action": { + "type": "transform", + "menu_text": "Turn on headlamps", + "msg": "\"Activating illumination.\"", + "target": "helmet_eod_on", + "active": true, + "need_charges": 1, + "need_charges_msg": "\"Illumination disabled, low power.\"" + }, + "material_thickness": 15, + "flags": [ "STURDY", "OUTER", "RAINPROOF", "TWO_WAY_RADIO", "WATCH", "ALARMCLOCK" ] + }, + { + "id": "helmet_eod_on", + "type": "TOOL_ARMOR", + "copy-from": "helmet_eod", + "name": { "str": "EOD helmet (on)", "str_pl": "EOD helmets (on)" }, + "extend": { "flags": [ "LIGHT_350", "CHARGEDIM", "TRADER_AVOID" ] }, + "power_draw": 10000, + "revert_to": "helmet_eod", + "use_action": { "type": "transform", "menu_text": "Turn off headlamps", "msg": "\"Disabling illumination.\"", "target": "helmet_eod" } + }, { "id": "rm13_armor", "type": "TOOL_ARMOR", @@ -797,7 +843,7 @@ "flags": [ "VARSIZE", "STURDY", "WATERPROOF", "RAINPROOF", "WATCH", "ALARMCLOCK", "SWIM_GOGGLES", "SUN_GLASSES", "RAD_RESIST" ], "price": 50000000, "price_postapoc": 10000, - "material": [ "ceramic", "kevlar" ], + "material": [ "ceramic", "kevlar_layered" ], "weight": "6820 g", "volume": "9 L", "to_hit": -3, @@ -1160,7 +1206,7 @@ "price": 24000, "price_postapoc": 1750, "to_hit": -3, - "material": [ "kevlar", "nomex" ], + "material": [ "kevlar_layered", "nomex" ], "symbol": "[", "color": "light_gray", "covers": [ "MOUTH", "EYES" ], @@ -1188,7 +1234,7 @@ "price": 24000, "price_postapoc": 1500, "to_hit": -3, - "material": [ "kevlar", "nomex" ], + "material": [ "kevlar_layered", "nomex" ], "symbol": "[", "color": "light_gray", "covers": [ "MOUTH", "EYES" ], @@ -1249,7 +1295,7 @@ "initial_charges": 100, "ammo": "gasfilter_m", "use_action": "GASMASK", - "material": [ "kevlar", "steel" ], + "material": [ "kevlar_layered", "steel" ], "symbol": "[", "color": "dark_gray", "covers": [ "MOUTH", "EYES" ], @@ -1278,7 +1324,7 @@ "charges_per_use": 1, "ammo": "gasfilter_m", "use_action": "GASMASK", - "material": [ "kevlar", "cotton" ], + "material": [ "kevlar_layered", "cotton" ], "symbol": "[", "color": "dark_gray", "covers": [ "MOUTH", "EYES" ], @@ -1306,7 +1352,7 @@ "initial_charges": 100, "ammo": "gasfilter_m", "use_action": "GASMASK", - "material": [ "kevlar", "leather" ], + "material": [ "kevlar_layered", "leather" ], "symbol": "[", "color": "dark_gray", "covers": [ "MOUTH", "EYES" ], @@ -1334,7 +1380,7 @@ "initial_charges": 100, "ammo": "gasfilter_m", "use_action": "GASMASK", - "material": [ "kevlar", "plastic" ], + "material": [ "kevlar_layered", "plastic" ], "symbol": "[", "color": "dark_gray", "covers": [ "MOUTH", "EYES" ], @@ -1362,7 +1408,7 @@ "initial_charges": 100, "ammo": "gasfilter_m", "use_action": "GASMASK", - "material": [ "kevlar", "fur" ], + "material": [ "kevlar_layered", "fur" ], "symbol": "[", "color": "light_gray", "covers": [ "MOUTH", "EYES" ], @@ -1390,7 +1436,7 @@ "initial_charges": 100, "ammo": "gasfilter_m", "use_action": "GASMASK", - "material": [ "kevlar", "fur" ], + "material": [ "kevlar_layered", "fur" ], "symbol": "[", "color": "light_gray", "covers": [ "MOUTH", "EYES" ], @@ -1577,7 +1623,7 @@ "flags": [ "VARSIZE", "STURDY", "WATER_FRIENDLY", "SWIM_GOGGLES" ], "price": 40000, "price_postapoc": 2000, - "material": [ "kevlar", "plastic" ], + "material": [ "kevlar_layered", "plastic" ], "weight": "982 g", "volume": "1500 ml", "to_hit": -3, @@ -1625,7 +1671,7 @@ "flags": [ "VARSIZE", "STURDY", "WATER_FRIENDLY", "SWIM_GOGGLES", "OVERSIZE" ], "price": 40000, "price_postapoc": 1500, - "material": [ "kevlar", "plastic" ], + "material": [ "kevlar_layered", "plastic" ], "weight": "1302 g", "volume": "2 L", "to_hit": -3, diff --git a/data/json/materials.json b/data/json/materials.json index df95f30dd600b..3564cba7c003a 100644 --- a/data/json/materials.json +++ b/data/json/materials.json @@ -770,6 +770,29 @@ "type": "material", "ident": "kevlar", "name": "Kevlar", + "density": 9, + "soft": true, + "reinforces": true, + "specific_heat_liquid": 0.82, + "specific_heat_solid": 0.45, + "latent_heat": 273, + "bash_resist": 1, + "cut_resist": 3, + "bullet_resist": 5, + "acid_resist": 5, + "fire_resist": 1, + "elec_resist": 2, + "chip_resist": 7, + "repaired_with": "sheet_kevlar", + "salvaged_into": "sheet_kevlar", + "dmg_adj": [ "ripped", "torn", "shredded", "tattered" ], + "bash_dmg_verb": "ripped", + "cut_dmg_verb": "cut" + }, + { + "type": "material", + "ident": "kevlar_layered", + "name": "Layered Kevlar", "density": 10, "specific_heat_liquid": 0.82, "specific_heat_solid": 0.45, @@ -782,8 +805,8 @@ "fire_resist": 3, "elec_resist": 2, "chip_resist": 20, - "repaired_with": "kevlar_plate", - "salvaged_into": "kevlar_plate", + "repaired_with": "sheet_kevlar_layered", + "salvaged_into": "sheet_kevlar_layered", "dmg_adj": [ "ripped", "torn", "shredded", "tattered" ], "bash_dmg_verb": "ripped", "cut_dmg_verb": "cut" @@ -803,9 +826,9 @@ "fire_resist": 3, "elec_resist": 2, "chip_resist": 20, - "repaired_with": "kevlar_plate", - "salvaged_into": "kevlar_plate", - "dmg_adj": [ "marked", "dented", "scarred", "broken" ], + "repaired_with": "rigid_kevlar_plate", + "salvaged_into": "rigid_kevlar_plate", + "dmg_adj": [ "ripped", "torn", "shredded", "tattered" ], "bash_dmg_verb": "ripped", "cut_dmg_verb": "cut" }, diff --git a/data/json/monsterdrops/zombie_cop.json b/data/json/monsterdrops/zombie_cop.json index 3e11d0454fe15..8ef549093c7b1 100644 --- a/data/json/monsterdrops/zombie_cop.json +++ b/data/json/monsterdrops/zombie_cop.json @@ -35,6 +35,7 @@ [ "heavy_flashlight", 35 ], [ "holster", 25 ], [ "kevlar", 35 ], + [ "armguard_cut_resistant", 2 ], [ "bholster", 3 ], [ "legpouch_large", 5 ], [ "pocket_firstaid", 10 ], @@ -48,7 +49,7 @@ { "id": "cop_gloves", "type": "item_group", - "items": [ [ "gloves_leather", 45 ], [ "gloves_medical", 20 ], [ "gloves_tactical", 10 ] ] + "items": [ [ "gloves_leather", 45 ], [ "gloves_medical", 20 ], [ "gloves_cut_resistant", 20 ], [ "gloves_tactical", 10 ] ] }, { "id": "cop_helmet", diff --git a/data/json/npcs/items_generic.json b/data/json/npcs/items_generic.json index 720702f73c4dc..a2f03681e2e4f 100644 --- a/data/json/npcs/items_generic.json +++ b/data/json/npcs/items_generic.json @@ -678,7 +678,7 @@ [ "juice", 5 ], [ "kernels", 4 ], [ "ketchup", 4 ], - [ "kevlar_plate", 1 ], + [ "sheet_kevlar_layered", 1 ], [ "knee_pads", 4 ], [ "knife_butcher", 6 ], [ "knife_butter", 4 ], diff --git a/data/json/recipes/armor/feet.json b/data/json/recipes/armor/feet.json index f715c2c8ea8ae..de66c42758f4c 100644 --- a/data/json/recipes/armor/feet.json +++ b/data/json/recipes/armor/feet.json @@ -63,7 +63,7 @@ "tools": [ [ [ "welder", 21 ], [ "welder_crude", 32 ], [ "soldering_iron", 32 ], [ "toolset", 32 ] ] ], "components": [ [ [ "nomex", 8 ] ], - [ [ "kevlar_plate", 4 ] ], + [ [ "sheet_kevlar_layered", 4 ] ], [ [ "duct_tape", 200 ] ], [ [ "nomex_socks", 1 ] ], [ [ "boots_combat", 1 ], [ "boots_steel", 1 ], [ "boots_bunker", 1 ] ] @@ -97,7 +97,7 @@ "tools": [ [ [ "welder", 21 ], [ "welder_crude", 32 ], [ "soldering_iron", 32 ], [ "toolset", 32 ] ] ], "components": [ [ [ "plastic_chunk", 4 ] ], - [ [ "kevlar_plate", 4 ] ], + [ [ "sheet_kevlar_layered", 4 ] ], [ [ "duct_tape", 200 ] ], [ [ "wetsuit_booties", 1 ] ], [ [ "boots_combat", 1 ], [ "boots_steel", 1 ], [ "boots_bunker", 1 ] ] @@ -119,7 +119,7 @@ [ [ "rag", 4 ] ], [ [ "leather", 4 ] ], [ [ "steel_chunk", 4 ], [ "scrap", 12 ] ], - [ [ "kevlar_plate", 4 ] ], + [ [ "sheet_kevlar_layered", 4 ] ], [ [ "duct_tape", 100 ] ], [ [ "boots_combat", 1 ], [ "boots_steel", 1 ], [ "boots_hiking", 1 ], [ "boots_bunker", 1 ], [ "boots", 1 ] ] ] @@ -150,7 +150,7 @@ "tools": [ [ [ "welder", 21 ], [ "welder_crude", 32 ], [ "soldering_iron", 32 ], [ "toolset", 32 ] ] ], "components": [ [ [ "rag", 8 ] ], - [ [ "kevlar_plate", 4 ] ], + [ [ "sheet_kevlar_layered", 4 ] ], [ [ "duct_tape", 100 ] ], [ [ "boots_combat", 1 ], [ "boots_steel", 1 ], [ "boots_hiking", 1 ], [ "boots_bunker", 1 ], [ "boots", 1 ] ] ] @@ -198,7 +198,7 @@ "tools": [ [ [ "welder", 21 ], [ "welder_crude", 32 ], [ "soldering_iron", 32 ], [ "toolset", 32 ] ] ], "components": [ [ [ "leather", 8 ], [ "tanned_hide", 2 ] ], - [ [ "kevlar_plate", 4 ] ], + [ [ "sheet_kevlar_layered", 4 ] ], [ [ "duct_tape", 100 ] ], [ [ "boots_combat", 1 ], [ "boots_steel", 1 ], [ "boots_hiking", 1 ], [ "boots_bunker", 1 ], [ "boots", 1 ] ] ] @@ -241,7 +241,7 @@ "tools": [ [ [ "welder", 21 ], [ "welder_crude", 32 ], [ "soldering_iron", 32 ], [ "toolset", 32 ] ] ], "components": [ [ [ "fur", 12 ], [ "tanned_pelt", 2 ] ], - [ [ "kevlar_plate", 4 ] ], + [ [ "sheet_kevlar_layered", 4 ] ], [ [ "duct_tape", 100 ] ], [ [ "boots_combat", 1 ], [ "boots_steel", 1 ], [ "boots_hiking", 1 ], [ "boots_bunker", 1 ], [ "boots", 1 ] ] ] @@ -262,7 +262,7 @@ [ [ "leather", 24 ], [ "tanned_hide", 4 ] ], [ [ "rag", 6 ] ], [ [ "scrap", 4 ] ], - [ [ "boots_combat", 2 ], [ "kevlar_plate", 10 ] ], + [ [ "boots_combat", 2 ], [ "sheet_kevlar_layered", 10 ] ], [ [ "duct_tape", 200 ] ] ] }, diff --git a/data/json/recipes/armor/hands.json b/data/json/recipes/armor/hands.json index a822c50c63d5e..c7b6d6823d70c 100644 --- a/data/json/recipes/armor/hands.json +++ b/data/json/recipes/armor/hands.json @@ -101,7 +101,7 @@ [ [ "nomex", 6 ] ], [ [ "leather", 2 ] ], [ [ "duct_tape", 120 ] ], - [ [ "gloves_tactical", 1 ], [ "kevlar_plate", 4 ] ], + [ [ "gloves_tactical", 1 ], [ "sheet_kevlar_layered", 4 ] ], [ [ "nomex_gloves", 1 ], [ "fire_gauntlets", 1 ] ] ] }, @@ -134,7 +134,7 @@ "components": [ [ [ "plastic_chunk", 4 ] ], [ [ "duct_tape", 120 ] ], - [ [ "gloves_tactical", 1 ], [ "kevlar_plate", 4 ] ], + [ [ "gloves_tactical", 1 ], [ "sheet_kevlar_layered", 4 ] ], [ [ "wetsuit_gloves", 1 ] ] ] }, @@ -155,7 +155,7 @@ [ [ "leather", 2 ] ], [ [ "scrap", 4 ] ], [ [ "duct_tape", 50 ] ], - [ [ "gloves_tactical", 1 ], [ "kevlar_plate", 4 ] ], + [ [ "gloves_tactical", 1 ], [ "sheet_kevlar_layered", 4 ] ], [ [ "gloves_leather", 1 ], [ "gloves_light", 1 ], @@ -218,7 +218,7 @@ [ [ "rag", 6 ] ], [ [ "leather", 2 ] ], [ [ "duct_tape", 80 ] ], - [ [ "gloves_tactical", 1 ], [ "kevlar_plate", 4 ] ], + [ [ "gloves_tactical", 1 ], [ "sheet_kevlar_layered", 4 ] ], [ [ "gloves_leather", 1 ], [ "gloves_light", 1 ], @@ -269,7 +269,7 @@ [ [ "rag", 2 ] ], [ [ "leather", 6 ], [ "tanned_hide", 1 ] ], [ [ "duct_tape", 80 ] ], - [ [ "gloves_tactical", 1 ], [ "kevlar_plate", 4 ] ], + [ [ "gloves_tactical", 1 ], [ "sheet_kevlar_layered", 4 ] ], [ [ "gloves_leather", 1 ], [ "gloves_light", 1 ], @@ -367,7 +367,7 @@ [ [ "rag", 2 ] ], [ [ "fur", 8 ], [ "tanned_pelt", 1 ] ], [ [ "duct_tape", 80 ] ], - [ [ "gloves_tactical", 1 ], [ "kevlar_plate", 4 ] ], + [ [ "gloves_tactical", 1 ], [ "sheet_kevlar_layered", 4 ] ], [ [ "gloves_leather", 1 ], [ "gloves_light", 1 ], @@ -394,7 +394,7 @@ [ [ "rag", 6 ] ], [ [ "scrap", 2 ] ], [ [ "duct_tape", 160 ] ], - [ [ "gloves_tactical", 2 ], [ "kevlar_plate", 6 ] ] + [ [ "gloves_tactical", 2 ], [ "sheet_kevlar_layered", 6 ] ] ] }, { diff --git a/data/json/recipes/armor/head.json b/data/json/recipes/armor/head.json index 8a69481884dcd..9c6d9e9f2bc27 100644 --- a/data/json/recipes/armor/head.json +++ b/data/json/recipes/armor/head.json @@ -491,7 +491,7 @@ [ [ "hat_ball", 1 ], [ "hat_boonie", 1 ] ], [ [ "mask_filter", 1 ] ], [ [ "glasses_bal", 1 ], [ "goggles_ski", 1 ] ], - [ [ "kevlar_plate", 8 ] ] + [ [ "sheet_kevlar_layered", 8 ] ] ] }, { @@ -521,7 +521,7 @@ "book_learn": [ [ "textbook_fireman", 7 ] ], "using": [ [ "sewing_standard", 40 ] ], "tools": [ [ [ "welder", 21 ], [ "welder_crude", 32 ], [ "soldering_iron", 32 ], [ "toolset", 32 ] ] ], - "components": [ [ [ "nomex", 8 ] ], [ [ "kevlar_plate", 4 ] ], [ [ "nomex_hood", 1 ] ], [ [ "duct_tape", 100 ] ] ] + "components": [ [ [ "nomex", 8 ] ], [ [ "sheet_kevlar_layered", 4 ] ], [ [ "nomex_hood", 1 ] ], [ [ "duct_tape", 100 ] ] ] }, { "result": "hood_h20survivor", @@ -535,7 +535,7 @@ "autolearn": true, "using": [ [ "sewing_standard", 40 ] ], "tools": [ [ [ "welder", 21 ], [ "welder_crude", 32 ], [ "soldering_iron", 32 ], [ "toolset", 32 ] ] ], - "components": [ [ [ "plastic_chunk", 4 ] ], [ [ "kevlar_plate", 4 ] ], [ [ "wetsuit_hood", 1 ] ], [ [ "duct_tape", 100 ] ] ] + "components": [ [ [ "plastic_chunk", 4 ] ], [ [ "sheet_kevlar_layered", 4 ] ], [ [ "wetsuit_hood", 1 ] ], [ [ "duct_tape", 100 ] ] ] }, { "result": "hood_lsurvivor", @@ -549,7 +549,12 @@ "autolearn": true, "using": [ [ "sewing_standard", 40 ] ], "tools": [ [ [ "welder", 21 ], [ "welder_crude", 32 ], [ "soldering_iron", 32 ], [ "toolset", 32 ] ] ], - "components": [ [ [ "rag", 8 ] ], [ [ "kevlar_plate", 4 ] ], [ [ "hood_rain", 1 ], [ "bag_plastic", 2 ] ], [ [ "duct_tape", 100 ] ] ] + "components": [ + [ [ "rag", 8 ] ], + [ [ "sheet_kevlar_layered", 4 ] ], + [ [ "hood_rain", 1 ], [ "bag_plastic", 2 ] ], + [ [ "duct_tape", 100 ] ] + ] }, { "result": "hood_rain", @@ -578,7 +583,7 @@ "components": [ [ [ "leather", 6 ], [ "tanned_hide", 1 ] ], [ [ "rag", 2 ] ], - [ [ "kevlar_plate", 4 ] ], + [ [ "sheet_kevlar_layered", 4 ] ], [ [ "hood_rain", 1 ], [ "bag_plastic", 2 ] ], [ [ "duct_tape", 100 ] ] ] @@ -598,7 +603,7 @@ "components": [ [ [ "fur", 8 ], [ "tanned_pelt", 1 ] ], [ [ "rag", 2 ] ], - [ [ "kevlar_plate", 4 ] ], + [ [ "sheet_kevlar_layered", 4 ] ], [ [ "hood_rain", 1 ], [ "bag_plastic", 2 ] ], [ [ "duct_tape", 100 ] ] ] @@ -619,7 +624,7 @@ [ [ "leather", 14 ], [ "tanned_hide", 3 ] ], [ [ "rag", 4 ] ], [ [ "scrap", 2 ] ], - [ [ "kevlar_plate", 6 ] ], + [ [ "sheet_kevlar_layered", 6 ] ], [ [ "hood_rain", 2 ], [ "bag_plastic", 4 ] ], [ [ "duct_tape", 200 ] ] ] @@ -742,7 +747,7 @@ "book_learn": [ [ "textbook_fireman", 7 ], [ "atomic_survival", 8 ], [ "textbook_gaswarfare", 9 ] ], "using": [ [ "adhesive", 2 ], [ "sewing_standard", 20 ] ], "tools": [ [ [ "welder", 56 ], [ "welder_crude", 84 ], [ "soldering_iron", 84 ], [ "toolset", 84 ] ] ], - "components": [ [ [ "mask_bunker", 1 ] ], [ [ "nomex", 4 ] ], [ [ "mask_bal", 1 ], [ "kevlar_plate", 4 ] ] ] + "components": [ [ [ "mask_bunker", 1 ] ], [ [ "nomex", 4 ] ], [ [ "mask_bal", 1 ], [ "sheet_kevlar_layered", 4 ] ] ] }, { "result": "mask_fsurvivorxl", @@ -757,7 +762,7 @@ "book_learn": [ [ "textbook_fireman", 7 ], [ "atomic_survival", 8 ], [ "textbook_gaswarfare", 9 ] ], "using": [ [ "adhesive", 2 ], [ "sewing_standard", 20 ] ], "tools": [ [ [ "welder", 56 ], [ "welder_crude", 84 ], [ "soldering_iron", 84 ], [ "toolset", 84 ] ] ], - "components": [ [ [ "mask_bunker", 1 ] ], [ [ "nomex", 8 ] ], [ [ "mask_bal", 1 ], [ "kevlar_plate", 6 ] ] ] + "components": [ [ [ "mask_bunker", 1 ] ], [ [ "nomex", 8 ] ], [ [ "mask_bal", 1 ], [ "sheet_kevlar_layered", 6 ] ] ] }, { "result": "mask_gas", @@ -845,7 +850,7 @@ [ [ "rebreather", 1 ] ], [ [ "goggles_swim", 1 ] ], [ [ "plastic_chunk", 4 ] ], - [ [ "mask_bal", 1 ], [ "kevlar_plate", 4 ] ] + [ [ "mask_bal", 1 ], [ "sheet_kevlar_layered", 4 ] ] ] }, { @@ -864,7 +869,7 @@ [ [ "rebreather", 1 ] ], [ [ "goggles_swim", 1 ] ], [ [ "plastic_chunk", 8 ] ], - [ [ "mask_bal", 1 ], [ "kevlar_plate", 6 ] ] + [ [ "mask_bal", 1 ], [ "sheet_kevlar_layered", 6 ] ] ] }, { @@ -884,7 +889,7 @@ [ [ "mask_filter", 2 ], [ "mask_gas", 1 ], [ "mask_bunker", 1 ] ], [ [ "glasses_safety", 2 ], [ "glasses_bal", 1 ] ], [ [ "scrap", 3 ] ], - [ [ "mask_bal", 1 ], [ "kevlar_plate", 4 ] ] + [ [ "mask_bal", 1 ], [ "sheet_kevlar_layered", 4 ] ] ] }, { @@ -903,7 +908,7 @@ [ [ "mask_filter", 2 ], [ "mask_gas", 1 ], [ "mask_bunker", 1 ] ], [ [ "glasses_safety", 2 ], [ "glasses_bal", 1 ] ], [ [ "rag", 3 ] ], - [ [ "mask_bal", 1 ], [ "kevlar_plate", 4 ] ] + [ [ "mask_bal", 1 ], [ "sheet_kevlar_layered", 4 ] ] ] }, { @@ -946,7 +951,7 @@ [ [ "mask_filter", 2 ], [ "mask_gas", 1 ], [ "mask_bunker", 1 ] ], [ [ "glasses_safety", 2 ], [ "glasses_bal", 1 ] ], [ [ "leather", 3 ] ], - [ [ "mask_bal", 1 ], [ "kevlar_plate", 4 ] ] + [ [ "mask_bal", 1 ], [ "sheet_kevlar_layered", 4 ] ] ] }, { @@ -965,7 +970,7 @@ [ [ "mask_filter", 2 ], [ "mask_gas", 1 ], [ "mask_bunker", 1 ] ], [ [ "glasses_safety", 2 ], [ "glasses_bal", 1 ] ], [ [ "leather", 6 ] ], - [ [ "mask_bal", 1 ], [ "kevlar_plate", 6 ] ] + [ [ "mask_bal", 1 ], [ "sheet_kevlar_layered", 6 ] ] ] }, { @@ -983,7 +988,7 @@ "components": [ [ [ "mask_filter", 2 ], [ "mask_gas", 1 ], [ "mask_bunker", 1 ] ], [ [ "glasses_safety", 2 ], [ "glasses_bal", 1 ] ], - [ [ "mask_bal", 1 ], [ "kevlar_plate", 4 ] ], + [ [ "mask_bal", 1 ], [ "sheet_kevlar_layered", 4 ] ], [ [ "fur", 6 ], [ "tanned_pelt", 1 ] ] ] }, @@ -1002,7 +1007,7 @@ "components": [ [ [ "mask_filter", 2 ], [ "mask_gas", 1 ], [ "mask_bunker", 1 ] ], [ [ "glasses_safety", 2 ], [ "glasses_bal", 1 ] ], - [ [ "mask_bal", 1 ], [ "kevlar_plate", 4 ] ], + [ [ "mask_bal", 1 ], [ "sheet_kevlar_layered", 4 ] ], [ [ "fur", 12 ], [ "tanned_pelt", 2 ] ] ] }, @@ -1233,7 +1238,7 @@ ], [ [ "glasses_safety", 2 ], [ "glasses_bal", 1 ] ], [ [ "leather", 3 ] ], - [ [ "kevlar_plate", 2 ] ] + [ [ "sheet_kevlar_layered", 2 ] ] ] }, { diff --git a/data/json/recipes/armor/legs.json b/data/json/recipes/armor/legs.json index 31c5d2e5167d1..d184509b70ccc 100644 --- a/data/json/recipes/armor/legs.json +++ b/data/json/recipes/armor/legs.json @@ -425,7 +425,7 @@ [ "fanny", 2 ] ], [ [ "duct_tape", 50 ] ], - [ [ "kevlar_plate", 8 ] ] + [ [ "sheet_kevlar_layered", 8 ] ] ] }, { @@ -517,7 +517,7 @@ "using": [ [ "sewing_standard", 100 ] ], "components": [ [ [ "pants_army", 1 ], [ "pants_cargo", 1 ], [ "shorts_cargo", 1 ] ], - [ [ "kevlar", 1 ], [ "kevlar_plate", 12 ] ], + [ [ "kevlar", 1 ], [ "sheet_kevlar_layered", 12 ] ], [ [ "rag", 12 ] ], [ [ "tacvest", 1 ], diff --git a/data/json/recipes/armor/pets_horse.json b/data/json/recipes/armor/pets_horse.json index a020d119a8d9d..437d78fcfa5d4 100644 --- a/data/json/recipes/armor/pets_horse.json +++ b/data/json/recipes/armor/pets_horse.json @@ -47,7 +47,7 @@ "time": "210 m", "autolearn": true, "using": [ [ "sewing_standard", 190 ] ], - "components": [ [ [ "kevlar_plate", 56 ] ], [ [ "rag", 42 ] ], [ [ "leather", 24 ], [ "tanned_hide", 24 ] ] ] + "components": [ [ [ "sheet_kevlar_layered", 56 ] ], [ [ "rag", 42 ] ], [ [ "leather", 24 ], [ "tanned_hide", 24 ] ] ] }, { "result": "leather_armor_horse", diff --git a/data/json/recipes/armor/suit.json b/data/json/recipes/armor/suit.json index a4295f4551334..e65d0fe571b15 100644 --- a/data/json/recipes/armor/suit.json +++ b/data/json/recipes/armor/suit.json @@ -14,7 +14,7 @@ "components": [ [ [ "cleansuit", 1 ] ], [ [ "duct_tape", 600 ] ], - [ [ "kevlar", 1 ], [ "ballistic_vest_empty", 1 ], [ "swat_armor", 1 ], [ "kevlar_plate", 24 ] ], + [ [ "kevlar", 1 ], [ "ballistic_vest_empty", 1 ], [ "swat_armor", 1 ], [ "sheet_kevlar_layered", 24 ] ], [ [ "plastic_sheet", 1 ] ] ] }, @@ -33,7 +33,7 @@ "components": [ [ [ "hazmat_suit", 1 ] ], [ [ "duct_tape", 800 ] ], - [ [ "swat_armor", 1 ], [ "kevlar_plate", 48 ] ], + [ [ "swat_armor", 1 ], [ "sheet_kevlar_layered", 48 ] ], [ [ "plastic_sheet", 1 ] ] ] }, @@ -255,7 +255,7 @@ [ [ "fanny", 2 ], [ "dump_pouch", 1 ] ], [ [ "tool_belt", 1 ], [ "legrig", 1 ] ], [ [ "pants_army", 1 ] ], - [ [ "kevlar", 1 ], [ "ballistic_vest_empty", 1 ], [ "swat_armor", 1 ], [ "kevlar_plate", 24 ] ] + [ [ "kevlar", 1 ], [ "ballistic_vest_empty", 1 ], [ "swat_armor", 1 ], [ "sheet_kevlar_layered", 24 ] ] ] }, { @@ -424,9 +424,9 @@ "tools": [ [ [ "welder", 28 ], [ "welder_crude", 42 ], [ "soldering_iron", 42 ], [ "toolset", 42 ] ] ], "components": [ [ [ "nomex", 40 ] ], - [ [ "kevlar_plate", 8 ] ], + [ [ "sheet_kevlar_layered", 8 ] ], [ [ "duct_tape", 200 ], [ "superglue", 5 ] ], - [ [ "kevlar", 1 ], [ "ballistic_vest_empty", 1 ], [ "swat_armor", 1 ], [ "kevlar_plate", 24 ] ] + [ [ "kevlar", 1 ], [ "ballistic_vest_empty", 1 ], [ "swat_armor", 1 ], [ "sheet_kevlar_layered", 24 ] ] ] }, { @@ -458,7 +458,7 @@ [ "fanny", 2 ] ], [ [ "duct_tape", 200 ] ], - [ [ "kevlar", 1 ], [ "ballistic_vest_empty", 1 ], [ "swat_armor", 1 ], [ "kevlar_plate", 24 ] ] + [ [ "kevlar", 1 ], [ "ballistic_vest_empty", 1 ], [ "swat_armor", 1 ], [ "sheet_kevlar_layered", 24 ] ] ] }, { @@ -501,7 +501,7 @@ [ "fanny", 2 ] ], [ [ "duct_tape", 400 ] ], - [ [ "kevlar", 1 ], [ "ballistic_vest_empty", 1 ], [ "swat_armor", 1 ], [ "kevlar_plate", 24 ] ] + [ [ "kevlar", 1 ], [ "ballistic_vest_empty", 1 ], [ "swat_armor", 1 ], [ "sheet_kevlar_layered", 24 ] ] ] }, { @@ -533,7 +533,7 @@ [ "fanny", 2 ] ], [ [ "duct_tape", 300 ] ], - [ [ "kevlar", 1 ], [ "ballistic_vest_empty", 1 ], [ "swat_armor", 1 ], [ "kevlar_plate", 24 ] ] + [ [ "kevlar", 1 ], [ "ballistic_vest_empty", 1 ], [ "swat_armor", 1 ], [ "sheet_kevlar_layered", 24 ] ] ] }, { @@ -612,7 +612,7 @@ [ "fanny", 2 ] ], [ [ "duct_tape", 200 ] ], - [ [ "kevlar", 1 ], [ "ballistic_vest_empty", 1 ], [ "swat_armor", 1 ], [ "kevlar_plate", 24 ] ] + [ [ "kevlar", 1 ], [ "ballistic_vest_empty", 1 ], [ "swat_armor", 1 ], [ "sheet_kevlar_layered", 24 ] ] ] }, { @@ -668,7 +668,7 @@ [ "fanny", 2 ] ], [ [ "duct_tape", 300 ] ], - [ [ "kevlar", 1 ], [ "ballistic_vest_empty", 1 ], [ "swat_armor", 1 ], [ "kevlar_plate", 24 ] ] + [ [ "kevlar", 1 ], [ "ballistic_vest_empty", 1 ], [ "swat_armor", 1 ], [ "sheet_kevlar_layered", 24 ] ] ] }, { @@ -812,7 +812,7 @@ [ "fanny", 2 ] ], [ [ "duct_tape", 300 ] ], - [ [ "kevlar", 1 ], [ "ballistic_vest_empty", 1 ], [ "swat_armor", 1 ], [ "kevlar_plate", 24 ] ] + [ [ "kevlar", 1 ], [ "ballistic_vest_empty", 1 ], [ "swat_armor", 1 ], [ "sheet_kevlar_layered", 24 ] ] ] }, { @@ -844,7 +844,7 @@ [ "fanny", 2 ] ], [ [ "duct_tape", 400 ] ], - [ [ "kevlar", 2 ], [ "ballistic_vest_empty", 2 ], [ "swat_armor", 2 ], [ "kevlar_plate", 48 ] ] + [ [ "kevlar", 2 ], [ "ballistic_vest_empty", 2 ], [ "swat_armor", 2 ], [ "sheet_kevlar_layered", 48 ] ] ] }, { @@ -876,7 +876,7 @@ [ "fanny", 2 ] ], [ [ "duct_tape", 400 ] ], - [ [ "kevlar", 2 ], [ "ballistic_vest_empty", 2 ], [ "swat_armor", 2 ], [ "kevlar_plate", 42 ] ] + [ [ "kevlar", 2 ], [ "ballistic_vest_empty", 2 ], [ "swat_armor", 2 ], [ "sheet_kevlar_layered", 42 ] ] ] }, { diff --git a/data/json/recipes/armor/torso.json b/data/json/recipes/armor/torso.json index e6729842e512a..82e5b57534c18 100644 --- a/data/json/recipes/armor/torso.json +++ b/data/json/recipes/armor/torso.json @@ -292,7 +292,7 @@ "components": [ [ [ "coat_rain", 1 ] ], [ [ "duster", 1 ], [ "jacket_army", 1 ] ], - [ [ "kevlar", 1 ], [ "ballistic_vest_empty", 1 ], [ "kevlar_plate", 16 ] ], + [ [ "kevlar", 1 ], [ "ballistic_vest_empty", 1 ], [ "sheet_kevlar_layered", 16 ] ], [ [ "rag", 19 ] ], [ [ "tacvest", 1 ], @@ -698,7 +698,7 @@ "components": [ [ [ "coat_rain", 1 ] ], [ [ "duster", 1 ], [ "jacket_army", 1 ], [ "sleeveless_duster", 1 ] ], - [ [ "kevlar", 1 ], [ "ballistic_vest_empty", 1 ], [ "kevlar_plate", 13 ] ], + [ [ "kevlar", 1 ], [ "ballistic_vest_empty", 1 ], [ "sheet_kevlar_layered", 13 ] ], [ [ "rag", 14 ] ], [ [ "tacvest", 1 ], @@ -843,7 +843,7 @@ "components": [ [ [ "coat_rain", 1 ] ], [ [ "trenchcoat", 1 ], [ "jacket_army", 1 ], [ "sleeveless_trenchcoat", 1 ] ], - [ [ "kevlar", 1 ], [ "ballistic_vest_empty", 1 ], [ "kevlar_plate", 10 ] ], + [ [ "kevlar", 1 ], [ "ballistic_vest_empty", 1 ], [ "sheet_kevlar_layered", 10 ] ], [ [ "rag", 11 ] ], [ [ "tacvest", 1 ], @@ -1037,7 +1037,7 @@ "components": [ [ [ "coat_rain", 1 ] ], [ [ "trenchcoat", 1 ], [ "jacket_army", 1 ] ], - [ [ "kevlar", 1 ], [ "ballistic_vest_empty", 1 ], [ "kevlar_plate", 12 ] ], + [ [ "kevlar", 1 ], [ "ballistic_vest_empty", 1 ], [ "sheet_kevlar_layered", 12 ] ], [ [ "rag", 14 ] ], [ [ "tacvest", 1 ], @@ -1139,7 +1139,7 @@ "decomp_learn": 6, "autolearn": true, "using": [ [ "sewing_standard", 54 ] ], - "components": [ [ [ "kevlar_plate", 43 ] ] ] + "components": [ [ [ "sheet_kevlar_layered", 43 ] ] ] }, { "result": "vest_leather", diff --git a/data/json/recipes/recipe_others.json b/data/json/recipes/recipe_others.json index 23d2866a13640..16e8dcec8b88a 100644 --- a/data/json/recipes/recipe_others.json +++ b/data/json/recipes/recipe_others.json @@ -1171,6 +1171,28 @@ "using": [ [ "sewing_standard", 50 ] ], "components": [ [ [ "rag", 20 ] ] ] }, + { + "type": "recipe", + "result": "sheet_kevlar_layered", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "tailor", + "time": "2 m", + "autolearn": true, + "reversible": true, + "using": [ [ "sewing_standard", 15 ] ], + "components": [ [ [ "sheet_kevlar", 16 ] ] ] + }, + { + "type": "recipe", + "result": "rigid_kevlar_plate", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "tailor", + "time": "15 m", + "autolearn": true, + "components": [ [ [ "sheet_kevlar", 16 ], [ "sheet_kevlar_layered", 1 ] ], [ [ "superglue", 1 ] ] ] + }, { "type": "recipe", "result": "vehicle_controls", diff --git a/data/json/requirements/tailoring.json b/data/json/requirements/tailoring.json index 45dda3f726fff..4718b1a98f5c7 100644 --- a/data/json/requirements/tailoring.json +++ b/data/json/requirements/tailoring.json @@ -21,11 +21,18 @@ "components": [ [ [ "chitin_piece", 1 ] ], [ [ "filament", 1, "LIST" ] ] ] }, { - "id": "armor_kevlar_plate", + "id": "armor_kevlar_rigid", "type": "requirement", "//": "Shaping and attaching a rigid Kevlar plate to something, per 300 g of rigid Kevlar. Time needed is 10 minutes per unit.", "qualities": [ { "id": "CUT", "level": 1 } ], - "components": [ [ [ "kevlar_plate", 1 ] ], [ [ "superglue", 1 ] ] ] + "components": [ [ [ "rigid_kevlar_plate", 1 ] ], [ [ "superglue", 1 ] ] ] + }, + { + "id": "armor_kevlar_layered", + "type": "requirement", + "//": "Joining kevlar panels together into something like a kevlar vest or other armor per 80 g of Kevlar. Time needed is 90 minutes per unit.", + "qualities": [ { "id": "CUT", "level": 1 } ], + "components": [ [ [ "sheet_kevlar_layered", 1 ] ], [ [ "filament", 4, "LIST" ] ] ] }, { "id": "armor_steel_plate", @@ -224,11 +231,11 @@ "components": [ [ [ "fur", 1 ] ], [ [ "filament", 1, "LIST" ] ] ] }, { - "id": "tailoring_kevlar", + "id": "tailoring_kevlar_fabric", "type": "requirement", "//": "Crafting Kevlar items, per 101 g of Kevlar; 10 g + excessive weight of material is wasted, producing Kevlar scraps as byproducts. Time needed is usually 90 minutes per unit if hand-stitching.", "qualities": [ { "id": "SEW", "level": 2 }, { "id": "CUT", "level": 1 } ], - "components": [ [ [ "sheet_kevlar", 22 ] ], [ [ "thread_kevlar", 1 ] ] ] + "components": [ [ [ "sheet_kevlar", 22 ] ], [ [ "filament", 1, "LIST" ] ] ] }, { "id": "tailoring_leather", diff --git a/data/json/uncraft/armor/pets_dog.json b/data/json/uncraft/armor/pets_dog.json index eb7bcb2e48a0f..8358112964928 100644 --- a/data/json/uncraft/armor/pets_dog.json +++ b/data/json/uncraft/armor/pets_dog.json @@ -51,7 +51,7 @@ "difficulty": 1, "time": "10 s", "qualities": [ { "id": "CUT", "level": 1 } ], - "components": [ [ [ "kevlar_plate", 6 ] ] ] + "components": [ [ [ "sheet_kevlar_layered", 6 ] ] ] }, { "result": "rubber_harness_dog", diff --git a/data/json/uncraft/armor/suit.json b/data/json/uncraft/armor/suit.json index 52612425dd4e9..408a8dce08a5d 100644 --- a/data/json/uncraft/armor/suit.json +++ b/data/json/uncraft/armor/suit.json @@ -6,7 +6,7 @@ "difficulty": 3, "time": "5 m", "qualities": [ { "id": "CUT", "level": 1 } ], - "components": [ [ [ "rag", 33 ] ], [ [ "leather", 35 ] ], [ [ "scrap", 24 ] ], [ [ "kevlar_plate", 48 ] ] ] + "components": [ [ [ "rag", 33 ] ], [ [ "leather", 35 ] ], [ [ "scrap", 24 ] ], [ [ "sheet_kevlar_layered", 48 ] ] ] }, { "result": "xlsurvivor_suit", @@ -15,6 +15,6 @@ "difficulty": 3, "time": "150 s", "qualities": [ { "id": "CUT", "level": 1 } ], - "components": [ [ [ "rag", 23 ] ], [ [ "leather", 25 ] ], [ [ "scrap", 12 ] ], [ [ "kevlar_plate", 24 ] ] ] + "components": [ [ [ "rag", 23 ] ], [ [ "leather", 25 ] ], [ [ "scrap", 12 ] ], [ [ "sheet_kevlar_layered", 24 ] ] ] } ] diff --git a/data/json/vehicleparts/vehicle_parts.json b/data/json/vehicleparts/vehicle_parts.json index 8bf37219cbf81..1059a6a3dd9b5 100644 --- a/data/json/vehicleparts/vehicle_parts.json +++ b/data/json/vehicleparts/vehicle_parts.json @@ -1515,7 +1515,7 @@ "repair": { "skills": [ [ "mechanics", 7 ] ], "time": "60 m", "using": [ [ "welding_standard", 5 ] ] } }, "flags": [ "FLOATS", "BOARDABLE" ], - "breaks_into": [ { "item": "kevlar_plate", "count": [ 1, 3 ] } ], + "breaks_into": [ { "item": "sheet_kevlar", "count": [ 1, 3 ] } ], "damage_reduction": { "all": 14 } }, { diff --git a/src/iuse_actor.h b/src/iuse_actor.h index 5cc7edcb25153..b2f5c7ebaf521 100644 --- a/src/iuse_actor.h +++ b/src/iuse_actor.h @@ -538,6 +538,7 @@ class salvage_actor : public iuse_actor material_id( "faux_fur" ), material_id( "fur" ), material_id( "kevlar" ), + material_id( "kevlar_layered" ), material_id( "kevlar_rigid" ), material_id( "leather" ), material_id( "lycra" ),