diff --git a/.github/workflows/pull-translations.yml b/.github/workflows/pull-translations.yml index 70783b2215364..82bc7f7ecbfa3 100644 --- a/.github/workflows/pull-translations.yml +++ b/.github/workflows/pull-translations.yml @@ -22,7 +22,7 @@ jobs: - name: "Pull translations" env: TX_TOKEN: ${{ secrets.TX_TOKEN }} - run: tx pull + run: tx pull --force - name: Create Pull Request uses: peter-evans/create-pull-request@v3.10.0 with: diff --git a/data/json/character_modifiers.json b/data/json/character_modifiers.json index fe0a39575ab9a..e66b150f43f96 100644 --- a/data/json/character_modifiers.json +++ b/data/json/character_modifiers.json @@ -123,6 +123,18 @@ "denominator": 6.0 } }, + { + "type": "character_mod", + "id": "obstacle_climb_mod", + "description": "Obstacle climb modifier (Crawl, Grip, Lift)", + "mod_type": "x", + "value": { + "limb_score": [ [ "crawl", 3.0 ], [ "grip", 2.0 ], "lift" ], + "override_encumb": true, + "limb_score_op": "+", + "denominator": 6.0 + } + }, { "type": "character_mod", "id": "limb_str_mod", diff --git a/data/json/flags.json b/data/json/flags.json index 28f26bbc74124..c8b63b32c10f2 100644 --- a/data/json/flags.json +++ b/data/json/flags.json @@ -394,6 +394,12 @@ "//": "Prevents repairing of this item even if otherwise suitable tools exist.", "inherit": false }, + { + "id": "NO_CLEAN", + "type": "json_flag", + "//": "items that are impossible to clean no matter how hard you try", + "info": "This item is impossible to clean." + }, { "id": "NUTRIENT_OVERRIDE", "type": "json_flag", @@ -580,17 +586,17 @@ { "id": "PALS_SMALL", "type": "json_flag", - "info": "This item will attach directly to load bearing vests taking a small ammount of space." + "info": "This item will attach directly to load bearing vests taking a small amount of space." }, { "id": "PALS_MEDIUM", "type": "json_flag", - "info": "This item will attach directly to load bearing vests taking an average ammount of space." + "info": "This item will attach directly to load bearing vests taking an average amount of space." }, { "id": "PALS_LARGE", "type": "json_flag", - "info": "This item will attach directly to load bearing vests take a large ammount of space." + "info": "This item will attach directly to load bearing vests take a large amount of space." }, { "id": "PSYSHIELD_PARTIAL", @@ -1924,76 +1930,6 @@ "type": "json_flag", "info": "This is meant for exosuit leg plating." }, - { - "id": "EXO_BOOT_PLATE", - "type": "json_flag", - "info": "This is meant for exosuit foot plating." - }, - { - "id": "EXO_SMALL", - "type": "json_flag", - "info": "This is meant for a small exosuit hardpoint." - }, - { - "id": "EXO_LARGE", - "type": "json_flag", - "info": "This is meant for a large exosuit hardpoint." - }, - { - "id": "EXO_PSU", - "type": "json_flag", - "info": "This is meant for an exosuit PSU hardpoint." - }, - { - "id": "EXO_SMALL_GADGET", - "type": "json_flag", - "info": "This is meant for small exosuit gadgets, 1 L or less." - }, - { - "id": "EXO_HELMET_GADGET", - "type": "json_flag", - "info": "This is meant for helmet-specific gadgets." - }, - { - "id": "EXO_MEDIUM_GADGET", - "type": "json_flag", - "info": "This is meant for medium exosuit gadgets, between 1 L and 5 L." - }, - { - "id": "EXO_LARGE_GADGET", - "type": "json_flag", - "info": "This is meant for large exosuit gadgets, larger than 5 L." - }, - { - "id": "EXO_HELMET_PLATE", - "type": "json_flag", - "info": "This is meant for exosuit helmet plating." - }, - { - "id": "EXO_TORSO_PLATE", - "type": "json_flag", - "info": "This is meant for exosuit torso plating." - }, - { - "id": "EXO_PSU_PLATE", - "type": "json_flag", - "info": "This is meant for exosuit PSU plating." - }, - { - "id": "EXO_ARM_PLATE", - "type": "json_flag", - "info": "This is meant for exosuit arm plating." - }, - { - "id": "EXO_GLOVE_PLATE", - "type": "json_flag", - "info": "This is meant for exosuit arm plating." - }, - { - "id": "EXO_LEG_PLATE", - "type": "json_flag", - "info": "This is meant for exosuit leg plating." - }, { "id": "EXO_BOOT_PLATE", "type": "json_flag", diff --git a/data/json/furniture_and_terrain/terrain-floors-indoor.json b/data/json/furniture_and_terrain/terrain-floors-indoor.json index e61830bbc27a4..a3b409c1126e7 100644 --- a/data/json/furniture_and_terrain/terrain-floors-indoor.json +++ b/data/json/furniture_and_terrain/terrain-floors-indoor.json @@ -367,6 +367,7 @@ "color": "magenta", "connects_to": "ROCKFLOOR", "move_cost": 2, + "roof": "t_warped_roof", "flags": [ "TRANSPARENT", "INDOORS", "SUPPORTS_ROOF", "FLAT", "ROAD" ] }, { diff --git a/data/json/furniture_and_terrain/terrain-roofs.json b/data/json/furniture_and_terrain/terrain-roofs.json index d0e124e5be719..1bf921f95bd70 100644 --- a/data/json/furniture_and_terrain/terrain-roofs.json +++ b/data/json/furniture_and_terrain/terrain-roofs.json @@ -334,6 +334,16 @@ "bash_below": true } }, + { + "type": "terrain", + "id": "t_warped_roof", + "name": "warped roof", + "description": "A section of flat stone like roof. It's pattern of grooves and lines is constantly shifting.", + "symbol": ".", + "color": "magenta", + "move_cost": 2, + "flags": [ "FLAT" ] + }, { "type": "terrain", "id": "t_roof_paper", diff --git a/data/json/harvest.json b/data/json/harvest.json index f920b4a36132e..9aa8391b125b8 100644 --- a/data/json/harvest.json +++ b/data/json/harvest.json @@ -355,13 +355,13 @@ { "drop": "Zomborg_CBM_harvest", "type": "bionic_group", - "flags": [ "NO_STERILE", "NO_PACKED" ], + "flags": [ "NO_STERILE", "NO_PACKED", "FILTHY" ], "faults": [ "fault_bionic_salvaged" ] }, { "drop": "Zomborg_CBM_harvest_power", "type": "bionic_group", - "flags": [ "NO_STERILE", "NO_PACKED" ], + "flags": [ "NO_STERILE", "NO_PACKED", "FILTHY" ], "faults": [ "fault_bionic_salvaged" ] }, { "drop": "meat_tainted", "type": "flesh", "mass_ratio": 0.1 }, diff --git a/data/json/itemgroups/Drugs_Tobacco_Alcohol/drugs.json b/data/json/itemgroups/Drugs_Tobacco_Alcohol/drugs.json index 6c490a6bd544e..c4354cf46b087 100644 --- a/data/json/itemgroups/Drugs_Tobacco_Alcohol/drugs.json +++ b/data/json/itemgroups/Drugs_Tobacco_Alcohol/drugs.json @@ -85,7 +85,6 @@ [ "antiparasitic", 100 ], [ "diazepam", 100 ], [ "calcium_tablet", 100 ], - [ "inj_vitb", 100 ], [ "inj_iron", 100 ], [ "prozac", 100 ], [ "thorazine", 100 ], diff --git a/data/json/itemgroups/Locations_MapExtras/locations_commercial.json b/data/json/itemgroups/Locations_MapExtras/locations_commercial.json index 96bc3e5c532d6..57964d19e0683 100644 --- a/data/json/itemgroups/Locations_MapExtras/locations_commercial.json +++ b/data/json/itemgroups/Locations_MapExtras/locations_commercial.json @@ -1654,6 +1654,7 @@ { "item": "portable_game", "prob": 65, "charges": 100 }, { "item": "cell_phone", "prob": 11, "charges": 150 }, { "item": "smart_phone", "prob": 85, "charges": 120 }, + { "item": "waterproof_smart_phone_case", "prob": 40 }, { "item": "mp3", "prob": 65, "charges": 100 }, { "group": "toy_radio_car", "prob": 35 }, { "group": "toy_makerspace_kit", "prob": 25 }, diff --git a/data/json/itemgroups/collections_domestic.json b/data/json/itemgroups/collections_domestic.json index 3c09f21202986..15982e5278785 100644 --- a/data/json/itemgroups/collections_domestic.json +++ b/data/json/itemgroups/collections_domestic.json @@ -420,6 +420,7 @@ { "group": "alcohol", "prob": 163 }, { "item": "cell_phone", "prob": 5, "charges": [ 0, 150 ] }, { "item": "smart_phone", "prob": 36, "charges-min": 0 }, + { "item": "waterproof_smart_phone_case", "prob": 5 }, { "item": "wristwatch", "prob": 15 }, { "item": "pocketwatch", "prob": 5 }, { "item": "umbrella", "prob": 50 }, diff --git a/data/json/itemgroups/electronics.json b/data/json/itemgroups/electronics.json index 90d59d9bc585d..bfa617986a679 100644 --- a/data/json/itemgroups/electronics.json +++ b/data/json/itemgroups/electronics.json @@ -34,6 +34,7 @@ [ "battery_ups", 15 ], { "item": "cell_phone", "prob": 5, "charges": [ 0, 150 ] }, { "item": "smart_phone", "prob": 31, "charges-min": 0 }, + { "item": "waterproof_smart_phone_case", "prob": 11 }, { "item": "eink_tablet_pc", "prob": 8, "charges": [ 0, 100 ] }, { "item": "laptop", "prob": 20, "charges": [ 0, 500 ] }, { "item": "smart_lamp", "prob": 5, "charges": [ 0, 100 ] }, diff --git a/data/json/items/ammo.json b/data/json/items/ammo.json index 65186aa677f1f..31e3a87bfac51 100644 --- a/data/json/items/ammo.json +++ b/data/json/items/ammo.json @@ -1178,6 +1178,50 @@ "ammo_type": "components", "count": 150 }, + { + "type": "AMMO", + "id": "lc_chain_link", + "category": "spare_parts", + "price": 150, + "price_postapoc": 50, + "name": { "str": "mild steel chain link" }, + "symbol": "=", + "color": "light_gray", + "description": "Small metal rings, suitable for constructing chainmail.", + "material": [ "lc_steel" ], + "volume": "250 ml", + "weight": "1 g", + "ammo_type": "components", + "count": 150 + }, + { + "type": "AMMO", + "id": "mc_chain_link", + "copy-from": "lc_chain_link", + "name": { "str": "medium steel chain link" }, + "material": [ "mc_steel" ] + }, + { + "type": "AMMO", + "id": "hc_chain_link", + "copy-from": "lc_chain_link", + "name": { "str": "high steel chain link" }, + "material": [ "hc_steel" ] + }, + { + "type": "AMMO", + "id": "ch_chain_link", + "copy-from": "lc_chain_link", + "name": { "str": "hardened steel chain link" }, + "material": [ "ch_steel" ] + }, + { + "type": "AMMO", + "id": "qt_chain_link", + "copy-from": "lc_chain_link", + "name": { "str": "tempered steel chain link" }, + "material": [ "qt_steel" ] + }, { "type": "AMMO", "id": "nitrox", diff --git a/data/json/items/armor/arms_armor.json b/data/json/items/armor/arms_armor.json index 8cf1f34caece1..7d40b7f08102c 100644 --- a/data/json/items/armor/arms_armor.json +++ b/data/json/items/armor/arms_armor.json @@ -609,13 +609,19 @@ "price": 7500, "price_postapoc": 2500, "to_hit": -1, - "material": [ "steel", "cotton" ], "symbol": "[", "looks_like": "armguard_metal", "color": "light_red", "material_thickness": 3, "flags": [ "VARSIZE", "STURDY" ], - "armor": [ { "encumbrance": 20, "coverage": 95, "covers": [ "arm_l", "arm_r" ] } ] + "armor": [ + { + "material": [ { "type": "steel", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "arm_l", "arm_r" ], + "coverage": 100, + "encumbrance": 20 + } + ] }, { "id": "xl_chainmail_arms", @@ -637,6 +643,180 @@ "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, "flags": [ "VARSIZE", "STURDY", "UNDERSIZE" ] }, + { + "id": "lc_chainmail_arms", + "type": "ARMOR", + "category": "armor", + "name": { "str": "pair of mild steel chainmail sleeves", "str_pl": "pairs of mild steel chainmail sleeves" }, + "description": "Customized mild steel chainmail arms. Each sleeve has straps to connect them with each other. The lack of fingers makes them less cumbersome and allows them to be used with gloves.", + "weight": "2812 g", + "volume": "750 ml", + "price": 7500, + "price_postapoc": 2500, + "to_hit": -1, + "symbol": "[", + "looks_like": "armguard_metal", + "color": "light_red", + "flags": [ "VARSIZE", "STURDY", "OUTER" ], + "armor": [ + { + "material": [ { "type": "lc_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "arm_l", "arm_r" ], + "coverage": 100, + "encumbrance": 20 + } + ] + }, + { + "id": "xl_lc_chainmail_arms", + "type": "ARMOR", + "copy-from": "lc_chainmail_arms", + "name": { "str": "pair of XL mild steel chainmail sleeves", "str_pl": "pairs of XL mild steel chainmail sleeves" }, + "description": "Customized mild steel chainmail arms. Each sleeve has straps to connect them with each other. The lack of fingers makes them less cumbersome and allows them to be used with gloves. These are oversized.", + "proportional": { "weight": 1.25, "volume": 1.13, "price": 1.25 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "xs_lc_chainmail_arms", + "type": "ARMOR", + "copy-from": "lc_chainmail_arms", + "name": { "str": "pair of XS mild steel chainmail sleeves", "str_pl": "pairs of XS mild steel chainmail sleeves" }, + "description": "Customized mild steel chainmail arms. Each sleeve has straps to connect them with each other. The lack of fingers makes them less cumbersome and allows them to be used with gloves. These are undersized.", + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "mc_chainmail_arms", + "type": "ARMOR", + "copy-from": "lc_chainmail_arms", + "name": { "str": "pair of medium steel chainmail sleeves", "str_pl": "pairs of medium steel chainmail sleeves" }, + "description": "Customized medium steel chainmail arms. Each sleeve has straps to connect them with each other. The lack of fingers makes them less cumbersome and allows them to be used with gloves.", + "armor": [ + { + "material": [ { "type": "mc_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "arm_l", "arm_r" ], + "coverage": 100, + "encumbrance": 20 + } + ] + }, + { + "id": "xl_mc_chainmail_arms", + "type": "ARMOR", + "copy-from": "mc_chainmail_arms", + "name": { "str": "pair of XL medium steel chainmail sleeves", "str_pl": "pairs of XL medium steel chainmail sleeves" }, + "description": "Customized medium steel chainmail arms. Each sleeve has straps to connect them with each other. The lack of fingers makes them less cumbersome and allows them to be used with gloves. These are oversized.", + "proportional": { "weight": 1.25, "volume": 1.13, "price": 1.25 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "xs_mc_chainmail_arms", + "type": "ARMOR", + "copy-from": "mc_chainmail_arms", + "name": { "str": "pair of XS medium steel chainmail sleeves", "str_pl": "pairs of XS medium steel chainmail sleeves" }, + "description": "Customized medium steel chainmail arms. Each sleeve has straps to connect them with each other. The lack of fingers makes them less cumbersome and allows them to be used with gloves. These are undersized.", + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "hc_chainmail_arms", + "type": "ARMOR", + "copy-from": "lc_chainmail_arms", + "name": { "str": "pair of high steel chainmail sleeves", "str_pl": "pairs of high steel chainmail sleeves" }, + "description": "Customized high steel chainmail arms. Each sleeve has straps to connect them with each other. The lack of fingers makes them less cumbersome and allows them to be used with gloves.", + "armor": [ + { + "material": [ { "type": "hc_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "arm_l", "arm_r" ], + "coverage": 100, + "encumbrance": 20 + } + ] + }, + { + "id": "xl_hc_chainmail_arms", + "type": "ARMOR", + "copy-from": "hc_chainmail_arms", + "name": { "str": "pair of XL high steel chainmail sleeves", "str_pl": "pairs of XL high steel chainmail sleeves" }, + "description": "Customized high steel chainmail arms. Each sleeve has straps to connect them with each other. The lack of fingers makes them less cumbersome and allows them to be used with gloves. These are oversized.", + "proportional": { "weight": 1.25, "volume": 1.13, "price": 1.25 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "xs_hc_chainmail_arms", + "type": "ARMOR", + "copy-from": "hc_chainmail_arms", + "name": { "str": "pair of XS high steel chainmail sleeves", "str_pl": "pairs of XS high steel chainmail sleeves" }, + "description": "Customized high steel chainmail arms. Each sleeve has straps to connect them with each other. The lack of fingers makes them less cumbersome and allows them to be used with gloves. These are undersized.", + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "ch_chainmail_arms", + "type": "ARMOR", + "copy-from": "lc_chainmail_arms", + "name": { "str": "pair of hardened steel chainmail sleeves", "str_pl": "pairs of hardened steel chainmail sleeves" }, + "description": "Customized hardened steel chainmail arms. Each sleeve has straps to connect them with each other. The lack of fingers makes them less cumbersome and allows them to be used with gloves.", + "armor": [ + { + "material": [ { "type": "ch_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "arm_l", "arm_r" ], + "coverage": 100, + "encumbrance": 20 + } + ] + }, + { + "id": "xl_ch_chainmail_arms", + "type": "ARMOR", + "copy-from": "ch_chainmail_arms", + "name": { "str": "pair of XL hardened steel chainmail sleeves", "str_pl": "pairs of XL hardened steel chainmail sleeves" }, + "description": "Customized hardened steel chainmail arms. Each sleeve has straps to connect them with each other. The lack of fingers makes them less cumbersome and allows them to be used with gloves. These are oversized.", + "proportional": { "weight": 1.25, "volume": 1.13, "price": 1.25 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "xs_ch_chainmail_arms", + "type": "ARMOR", + "copy-from": "ch_chainmail_arms", + "name": { "str": "pair of XS hardened steel chainmail sleeves", "str_pl": "pairs of XS hardened steel chainmail sleeves" }, + "description": "Customized hardened steel chainmail arms. Each sleeve has straps to connect them with each other. The lack of fingers makes them less cumbersome and allows them to be used with gloves. These are undersized.", + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "qt_chainmail_arms", + "type": "ARMOR", + "copy-from": "lc_chainmail_arms", + "name": { "str": "pair of tempered steel chainmail sleeves", "str_pl": "pairs of tempered steel chainmail sleeves" }, + "description": "Customized tempered steel chainmail arms. Each sleeve has straps to connect them with each other. The lack of fingers makes them less cumbersome and allows them to be used with gloves.", + "armor": [ + { + "material": [ { "type": "qt_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "arm_l", "arm_r" ], + "coverage": 100, + "encumbrance": 20 + } + ] + }, + { + "id": "xl_qt_chainmail_arms", + "type": "ARMOR", + "copy-from": "qt_chainmail_arms", + "name": { "str": "pair of XL tempered steel chainmail sleeves", "str_pl": "pairs of XL tempered steel chainmail sleeves" }, + "description": "Customized tempered steel chainmail arms. Each sleeve has straps to connect them with each other. The lack of fingers makes them less cumbersome and allows them to be used with gloves. These are oversized.", + "proportional": { "weight": 1.25, "volume": 1.13, "price": 1.25 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "xs_qt_chainmail_arms", + "type": "ARMOR", + "copy-from": "qt_chainmail_arms", + "name": { "str": "pair of XS tempered steel chainmail sleeves", "str_pl": "pairs of XS tempered steel chainmail sleeves" }, + "description": "Customized tempered steel chainmail arms. Each sleeve has straps to connect them with each other. The lack of fingers makes them less cumbersome and allows them to be used with gloves. These are undersized.", + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, { "id": "elbow_pads", "type": "ARMOR", @@ -751,8 +931,8 @@ "armor": [ { "material": [ - { "type": "low_steel", "covered_by_mat": 95, "thickness": 0.25 }, - { "type": "low_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "lc_steel", "covered_by_mat": 95, "thickness": 0.05 }, + { "type": "lc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "arm_l", "arm_r" ], @@ -779,8 +959,8 @@ "armor": [ { "material": [ - { "type": "med_steel", "covered_by_mat": 95, "thickness": 0.25 }, - { "type": "med_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "mc_steel", "covered_by_mat": 95, "thickness": 0.05 }, + { "type": "mc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "arm_l", "arm_r" ], @@ -807,8 +987,8 @@ "armor": [ { "material": [ - { "type": "high_steel", "covered_by_mat": 95, "thickness": 0.25 }, - { "type": "high_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "hc_steel", "covered_by_mat": 95, "thickness": 0.05 }, + { "type": "hc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "arm_l", "arm_r" ], @@ -835,8 +1015,8 @@ "armor": [ { "material": [ - { "type": "case_hardened_steel", "covered_by_mat": 95, "thickness": 0.25 }, - { "type": "case_hardened_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "ch_steel", "covered_by_mat": 95, "thickness": 0.05 }, + { "type": "ch_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "arm_l", "arm_r" ], @@ -863,8 +1043,8 @@ "armor": [ { "material": [ - { "type": "tempered_steel", "covered_by_mat": 95, "thickness": 0.25 }, - { "type": "tempered_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "qt_steel", "covered_by_mat": 95, "thickness": 0.05 }, + { "type": "qt_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "arm_l", "arm_r" ], @@ -904,8 +1084,8 @@ "armor": [ { "material": [ - { "type": "low_steel", "covered_by_mat": 95, "thickness": 0.75 }, - { "type": "low_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "lc_steel", "covered_by_mat": 95, "thickness": 0.55 }, + { "type": "lc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "arm_l", "arm_r" ], @@ -932,8 +1112,8 @@ "armor": [ { "material": [ - { "type": "med_steel", "covered_by_mat": 95, "thickness": 0.75 }, - { "type": "med_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "mc_steel", "covered_by_mat": 95, "thickness": 0.55 }, + { "type": "mc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "arm_l", "arm_r" ], @@ -960,8 +1140,8 @@ "armor": [ { "material": [ - { "type": "high_steel", "covered_by_mat": 95, "thickness": 0.75 }, - { "type": "high_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "hc_steel", "covered_by_mat": 95, "thickness": 0.55 }, + { "type": "hc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "arm_l", "arm_r" ], @@ -988,8 +1168,8 @@ "armor": [ { "material": [ - { "type": "case_hardened_steel", "covered_by_mat": 95, "thickness": 0.75 }, - { "type": "case_hardened_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "ch_steel", "covered_by_mat": 95, "thickness": 0.55 }, + { "type": "ch_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "arm_l", "arm_r" ], @@ -1016,8 +1196,8 @@ "armor": [ { "material": [ - { "type": "tempered_steel", "covered_by_mat": 95, "thickness": 0.75 }, - { "type": "tempered_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "qt_steel", "covered_by_mat": 95, "thickness": 0.55 }, + { "type": "qt_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "arm_l", "arm_r" ], @@ -1057,8 +1237,8 @@ "armor": [ { "material": [ - { "type": "low_steel", "covered_by_mat": 95, "thickness": 1.25 }, - { "type": "low_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "lc_steel", "covered_by_mat": 95, "thickness": 1.05 }, + { "type": "lc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "arm_l", "arm_r" ], @@ -1085,8 +1265,8 @@ "armor": [ { "material": [ - { "type": "med_steel", "covered_by_mat": 95, "thickness": 1.25 }, - { "type": "med_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "mc_steel", "covered_by_mat": 95, "thickness": 1.05 }, + { "type": "mc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "arm_l", "arm_r" ], @@ -1113,8 +1293,8 @@ "armor": [ { "material": [ - { "type": "high_steel", "covered_by_mat": 95, "thickness": 1.25 }, - { "type": "high_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "hc_steel", "covered_by_mat": 95, "thickness": 1.05 }, + { "type": "hc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "arm_l", "arm_r" ], @@ -1141,8 +1321,8 @@ "armor": [ { "material": [ - { "type": "case_hardened_steel", "covered_by_mat": 95, "thickness": 1.25 }, - { "type": "case_hardened_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "ch_steel", "covered_by_mat": 95, "thickness": 1.05 }, + { "type": "ch_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "arm_l", "arm_r" ], @@ -1169,8 +1349,8 @@ "armor": [ { "material": [ - { "type": "tempered_steel", "covered_by_mat": 95, "thickness": 1.25 }, - { "type": "tempered_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "qt_steel", "covered_by_mat": 95, "thickness": 1.05 }, + { "type": "qt_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "arm_l", "arm_r" ], diff --git a/data/json/items/armor/bandolier.json b/data/json/items/armor/bandolier.json index bae031f741a40..fa82174ec6bdb 100644 --- a/data/json/items/armor/bandolier.json +++ b/data/json/items/armor/bandolier.json @@ -231,7 +231,7 @@ "color": "dark_gray", "sided": true, "material_thickness": 1, - "pocket_data": [ { "ammo_restriction": { "rock": 10 }, "moves": 20 } ], + "pocket_data": [ { "ammo_restriction": { "rock": 10, "pebble": 80 }, "moves": 20 } ], "flags": [ "WATER_FRIENDLY", "BELTED", "OVERSIZE", "PALS_LARGE" ], "armor": [ { diff --git a/data/json/items/armor/belts.json b/data/json/items/armor/belts.json index 2027dff7af548..fd46bd40f5d1a 100644 --- a/data/json/items/armor/belts.json +++ b/data/json/items/armor/belts.json @@ -26,7 +26,17 @@ ], "use_action": { "type": "holster", "holster_prompt": "Attach what to belt loop?", "holster_msg": "You clip your %s to your %s" }, "flags": [ "WAIST", "NO_QUICKDRAW", "WATER_FRIENDLY" ], - "armor": [ { "encumbrance": [ 2, 5 ], "coverage": 5, "covers": [ "torso" ] } ] + "armor": [ + { + "encumbrance": [ 2, 5 ], + "coverage": 5, + "covers": [ "torso" ], + "material": [ + { "type": "leather", "covered_by_mat": 100, "thickness": 2.5 }, + { "type": "steel", "covered_by_mat": 10, "thickness": 0.5 } + ] + } + ] }, { "abstract": "judo_belt_abstract", @@ -173,7 +183,17 @@ ], "use_action": { "type": "holster", "holster_prompt": "Attach what to holder?", "holster_msg": "You attach your %s to your %s." }, "flags": [ "WAIST", "WATER_FRIENDLY" ], - "armor": [ { "encumbrance": [ 2, 5 ], "coverage": 5, "covers": [ "torso" ] } ] + "armor": [ + { + "encumbrance": [ 2, 5 ], + "coverage": 5, + "covers": [ "torso" ], + "material": [ + { "type": "leather", "covered_by_mat": 100, "thickness": 2.0 }, + { "type": "steel", "covered_by_mat": 10, "thickness": 0.5 } + ] + } + ] }, { "id": "santa_belt", diff --git a/data/json/items/armor/boots.json b/data/json/items/armor/boots.json index 34d2cf626b889..9de1f5a6f6f1c 100644 --- a/data/json/items/armor/boots.json +++ b/data/json/items/armor/boots.json @@ -1208,12 +1208,17 @@ "price": 5012, "price_postapoc": 2000, "to_hit": -1, - "material": [ "steel", "cotton" ], "symbol": "[", "color": "light_red", - "material_thickness": 3, "flags": [ "VARSIZE", "STURDY" ], - "armor": [ { "encumbrance": 20, "coverage": 100, "covers": [ "foot_l", "foot_r" ] } ] + "armor": [ + { + "material": [ { "type": "steel", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "foot_l", "foot_r" ], + "coverage": 100, + "encumbrance": 20 + } + ] }, { "id": "xl_chainmail_feet", @@ -1232,6 +1237,171 @@ "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, "flags": [ "VARSIZE", "STURDY", "UNDERSIZE" ] }, + { + "id": "lc_chainmail_feet", + "type": "ARMOR", + "category": "armor", + "name": { "str": "pair of mild steel chainmail chausses", "str_pl": "pairs of mild steel chainmail chausses" }, + "description": "Customized chainmail chausses that cover the feet, like booties made of chainmail.", + "weight": "2006 g", + "volume": "500 ml", + "price": 5012, + "price_postapoc": 2000, + "to_hit": -1, + "symbol": "[", + "color": "light_red", + "flags": [ "VARSIZE", "STURDY", "OUTER" ], + "armor": [ + { + "material": [ { "type": "lc_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "foot_l", "foot_r" ], + "coverage": 100, + "encumbrance": 20 + } + ] + }, + { + "id": "xl_lc_chainmail_feet", + "type": "ARMOR", + "copy-from": "lc_chainmail_feet", + "name": { "str": "pair of XL mild steel chainmail chausses", "str_pl": "pairs of XL mild steel chainmail chausses" }, + "proportional": { "weight": 2, "volume": 2 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "xs_lc_chainmail_feet", + "type": "ARMOR", + "copy-from": "lc_chainmail_feet", + "looks_like": "chainmail_feet", + "name": { "str": "pair of XS mild steel chainmail chausses", "str_pl": "pairs of XS mild steel chainmail chausses" }, + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "UNDERSIZE" ] } + }, + { + "id": "mc_chainmail_feet", + "type": "ARMOR", + "copy-from": "lc_chainmail_feet", + "name": { "str": "pair of medium steel chainmail chausses", "str_pl": "pairs of medium steel chainmail chausses" }, + "description": "Customized chainmail chausses that cover the feet, like booties made of chainmail.", + "armor": [ + { + "material": [ { "type": "mc_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "foot_l", "foot_r" ], + "coverage": 100, + "encumbrance": 20 + } + ] + }, + { + "id": "xl_mc_chainmail_feet", + "type": "ARMOR", + "copy-from": "mc_chainmail_feet", + "name": { "str": "pair of XL medium steel chainmail chausses", "str_pl": "pairs of XL medium steel chainmail chausses" }, + "proportional": { "weight": 2, "volume": 2 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "xs_mc_chainmail_feet", + "type": "ARMOR", + "copy-from": "mc_chainmail_feet", + "looks_like": "chainmail_feet", + "name": { "str": "pair of XS medium steel chainmail chausses", "str_pl": "pairs of XS medium steel chainmail chausses" }, + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "UNDERSIZE" ] } + }, + { + "id": "hc_chainmail_feet", + "type": "ARMOR", + "copy-from": "lc_chainmail_feet", + "name": { "str": "pair of high steel chainmail chausses", "str_pl": "pairs of high steel chainmail chausses" }, + "description": "Customized chainmail chausses that cover the feet, like booties made of chainmail.", + "armor": [ + { + "material": [ { "type": "hc_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "foot_l", "foot_r" ], + "coverage": 100, + "encumbrance": 20 + } + ] + }, + { + "id": "xl_hc_chainmail_feet", + "type": "ARMOR", + "copy-from": "hc_chainmail_feet", + "name": { "str": "pair of XL high steel chainmail chausses", "str_pl": "pairs of XL high steel chainmail chausses" }, + "proportional": { "weight": 2, "volume": 2 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "xs_hc_chainmail_feet", + "type": "ARMOR", + "copy-from": "hc_chainmail_feet", + "name": { "str": "pair of XS high steel chainmail chausses", "str_pl": "pairs of XS high steel chainmail chausses" }, + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "UNDERSIZE" ] } + }, + { + "id": "ch_chainmail_feet", + "type": "ARMOR", + "copy-from": "lc_chainmail_feet", + "name": { "str": "pair of hardened steel chainmail chausses", "str_pl": "pairs of hardened steel chainmail chausses" }, + "description": "Customized chainmail chausses that cover the feet, like booties made of chainmail.", + "armor": [ + { + "material": [ { "type": "ch_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "foot_l", "foot_r" ], + "coverage": 100, + "encumbrance": 20 + } + ] + }, + { + "id": "xl_ch_chainmail_feet", + "type": "ARMOR", + "copy-from": "ch_chainmail_feet", + "name": { "str": "pair of XL hardened steel chainmail chausses", "str_pl": "pairs of XL hardened steel chainmail chausses" }, + "proportional": { "weight": 2, "volume": 2 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "xs_ch_chainmail_feet", + "type": "ARMOR", + "copy-from": "ch_chainmail_feet", + "name": { "str": "pair of XS hardened steel chainmail chausses", "str_pl": "pairs of XS hardened steel chainmail chausses" }, + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "UNDERSIZE" ] } + }, + { + "id": "qt_chainmail_feet", + "type": "ARMOR", + "copy-from": "lc_chainmail_feet", + "name": { "str": "pair of tempered steel chainmail chausses", "str_pl": "pairs of tempered steel chainmail chausses" }, + "description": "Customized chainmail chausses that cover the feet, like booties made of chainmail.", + "armor": [ + { + "material": [ { "type": "qt_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "foot_l", "foot_r" ], + "coverage": 100, + "encumbrance": 20 + } + ] + }, + { + "id": "xl_qt_chainmail_feet", + "type": "ARMOR", + "copy-from": "qt_chainmail_feet", + "name": { "str": "pair of XL tempered steel chainmail chausses", "str_pl": "pairs of XL tempered steel chainmail chausses" }, + "proportional": { "weight": 2, "volume": 2 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "xs_qt_chainmail_feet", + "type": "ARMOR", + "copy-from": "qt_chainmail_feet", + "name": { "str": "pair of XS tempered steel chainmail chausses", "str_pl": "pairs of XS tempered steel chainmail chausses" }, + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "UNDERSIZE" ] } + }, { "id": "nomex_socks", "type": "ARMOR", @@ -1509,10 +1679,10 @@ "armor": [ { "material": [ - { "type": "low_steel", "covered_by_mat": 90, "thickness": 1.25 }, + { "type": "lc_steel", "covered_by_mat": 90, "thickness": 1.25 }, { "type": "leather", "covered_by_mat": 100, "thickness": 1.0 } ], - "covers": [ "foot_l", "foot_l" ], + "covers": [ "foot_l", "foot_r" ], "coverage": 100, "encumbrance": 20, "layers": [ "OUTER" ] @@ -1548,10 +1718,10 @@ "armor": [ { "material": [ - { "type": "med_steel", "covered_by_mat": 90, "thickness": 1.25 }, + { "type": "mc_steel", "covered_by_mat": 90, "thickness": 1.25 }, { "type": "leather", "covered_by_mat": 100, "thickness": 1.0 } ], - "covers": [ "foot_l", "foot_l" ], + "covers": [ "foot_l", "foot_r" ], "coverage": 100, "encumbrance": 20, "layers": [ "OUTER" ] @@ -1587,10 +1757,10 @@ "armor": [ { "material": [ - { "type": "high_steel", "covered_by_mat": 90, "thickness": 1.25 }, + { "type": "hc_steel", "covered_by_mat": 90, "thickness": 1.25 }, { "type": "leather", "covered_by_mat": 100, "thickness": 1.0 } ], - "covers": [ "foot_l", "foot_l" ], + "covers": [ "foot_l", "foot_r" ], "coverage": 100, "encumbrance": 20, "layers": [ "OUTER" ] @@ -1626,10 +1796,10 @@ "armor": [ { "material": [ - { "type": "case_hardened_steel", "covered_by_mat": 90, "thickness": 1.25 }, + { "type": "ch_steel", "covered_by_mat": 90, "thickness": 1.25 }, { "type": "leather", "covered_by_mat": 100, "thickness": 1.0 } ], - "covers": [ "foot_l", "foot_l" ], + "covers": [ "foot_l", "foot_r" ], "coverage": 100, "encumbrance": 20, "layers": [ "OUTER" ] @@ -1665,10 +1835,10 @@ "armor": [ { "material": [ - { "type": "tempered_steel", "covered_by_mat": 90, "thickness": 1.25 }, + { "type": "qt_steel", "covered_by_mat": 90, "thickness": 1.25 }, { "type": "leather", "covered_by_mat": 100, "thickness": 1.0 } ], - "covers": [ "foot_l", "foot_l" ], + "covers": [ "foot_l", "foot_r" ], "coverage": 100, "encumbrance": 20, "layers": [ "OUTER" ] diff --git a/data/json/items/armor/coats.json b/data/json/items/armor/coats.json index a0672815ff335..1933e0ce860f9 100644 --- a/data/json/items/armor/coats.json +++ b/data/json/items/armor/coats.json @@ -876,6 +876,7 @@ }, { "id": "jacket_army_modern", + "repairs_like": "trenchcoat", "type": "ARMOR", "name": { "str_sp": "combat blouse" }, "description": "A sleek blouse in a camouflage pattern with angled breast pockets and lots of loop velcro for affixing patches. You might call it a jacket but it's really a blouse. It has a pocket for your pen!", diff --git a/data/json/items/armor/exotic.json b/data/json/items/armor/exotic.json new file mode 100644 index 0000000000000..87a01c134d748 --- /dev/null +++ b/data/json/items/armor/exotic.json @@ -0,0 +1,248 @@ +[ + { + "id": "migo_plate_overgrown", + "type": "ARMOR", + "category": "armor", + "name": { "str": "overgrown iridescent carapace plate" }, + "description": "A chunk of otherworldly carapace that looks like it was at one point shaped like armor but is now bulky and overgrown with sharp pieces jutting out haphazardly. Scarred into the outer surface you can barely make out the label \"STRIKE FACE\". It looks like you could force it into a ballistic vest.", + "weight": "2800 g", + "volume": "1533 ml", + "price": 0, + "price_postapoc": 0, + "material": [ "alien_carapace", "flesh" ], + "symbol": ",", + "color": "dark_gray", + "material_thickness": 10, + "non_functional": "migo_plate", + "flags": [ "ABLATIVE_LARGE", "CANT_WEAR", "TRADER_AVOID" ], + "armor": [ + { + "encumbrance": 6, + "coverage": 45, + "covers": [ "torso" ], + "specifically_covers": [ "torso_upper" ], + "material": [ + { "type": "alien_carapace", "covered_by_mat": 100, "thickness": 5.0 }, + { "type": "flesh", "covered_by_mat": 95, "thickness": 4.0 } + ] + } + ] + }, + { + "id": "migo_plate", + "type": "ARMOR", + "category": "armor", + "name": { "str": "iridescent carapace plate" }, + "description": "A chunk of otherworldly carapace that seems to have been forced into the shape of a ballistic plate with a slightly concave profile. Scarred into the outer surface is the label \"STRIKE FACE\". It looks like you could force it into a ballistic vest.", + "weight": "2000 g", + "volume": "1533 ml", + "price": 0, + "price_postapoc": 0, + "material": [ "alien_carapace", "flesh" ], + "symbol": ",", + "color": "dark_gray", + "material_thickness": 8, + "non_functional": "migo_plate_undergrown", + "//": "transforms over a day", + "countdown_interval": 86400, + "countdown_action": { "type": "transform", "target": "migo_plate_overgrown", "msg": "The iridescent carapace plate expands as it grows." }, + "flags": [ "ABLATIVE_LARGE", "CANT_WEAR", "TRADER_AVOID", "SPAWN_ACTIVE" ], + "armor": [ + { + "encumbrance": 2, + "coverage": 42, + "covers": [ "torso" ], + "specifically_covers": [ "torso_upper" ], + "material": [ + { "type": "alien_carapace", "covered_by_mat": 100, "thickness": 4.0 }, + { "type": "flesh", "covered_by_mat": 95, "thickness": 4.0 } + ] + } + ] + }, + { + "id": "migo_plate_undergrown", + "type": "ARMOR", + "category": "armor", + "name": { "str": "undergrown iridescent carapace plate" }, + "description": "A chunk of otherworldly carapace that seems to have been forced into the shape of a ballistic plate with a slightly concave profile. Scarred into the outer surface is the label \"STRIKE FACE\". The armor coverage is spotty and it appears to be oozing and pulsing like it is in pain.", + "weight": "1500 g", + "volume": "1533 ml", + "price": 0, + "price_postapoc": 0, + "material": [ "alien_carapace", "flesh" ], + "symbol": ",", + "color": "dark_gray", + "material_thickness": 6, + "non_functional": "migo_plate_undergrown", + "//": "transforms over a day", + "countdown_interval": 86400, + "countdown_action": { "type": "transform", "target": "migo_plate", "msg": "The iridescent carapace plate expands as it grows." }, + "flags": [ "ABLATIVE_LARGE", "CANT_WEAR", "TRADER_AVOID", "SPAWN_ACTIVE" ], + "armor": [ + { + "encumbrance": 2, + "coverage": 39, + "covers": [ "torso" ], + "specifically_covers": [ "torso_upper" ], + "material": [ + { "type": "alien_carapace", "covered_by_mat": 100, "thickness": 2.0 }, + { "type": "flesh", "covered_by_mat": 95, "thickness": 4.0 } + ] + } + ] + }, + { + "id": "migo_plate_naked", + "type": "ARMOR", + "category": "armor", + "name": { "str": "plate of scarred flesh", "str_pl": "plates of scarred flesh" }, + "description": "A chunk of otherworldly flesh that seems to have been forced into the shape of a ballistic plate with a slightly concave profile. There is no armor left on this plate just a mass of writhing alien flesh oozing in pain. However it looks like it is slowly growing back.", + "weight": "1000 g", + "volume": "1533 ml", + "price": 0, + "price_postapoc": 0, + "material": [ "flesh" ], + "symbol": ",", + "color": "dark_gray", + "material_thickness": 4, + "//": "transforms over a day", + "countdown_interval": 86400, + "countdown_action": { "type": "transform", "target": "migo_plate_undergrown", "msg": "The plate of scarred flesh expands as it grows." }, + "flags": [ "ABLATIVE_LARGE", "CANT_WEAR", "TRADER_AVOID", "SPAWN_ACTIVE" ], + "armor": [ + { + "encumbrance": 2, + "coverage": 0, + "covers": [ "torso" ], + "specifically_covers": [ "torso_upper" ], + "material": [ { "type": "flesh", "covered_by_mat": 95, "thickness": 4.0 } ] + } + ] + }, + { + "id": "migo_skin", + "type": "ARMOR", + "name": { "str": "second skin" }, + "repairs_like": "jumpsuit", + "description": "A slimy layer of liquid has completely engulfed your body from the neck down and seems to move with you, the sensation is uncomfortable. The liquid appears bound to the article at your neck which is clearly resonating, the inside reads \"CAREFUL CHOKING HAZARD! THIS WAY DOWN\". The ooze flows freely covering your entire body but never crossing the gorget to get to your head.", + "weight": "1500 g", + "volume": "1 L", + "price": 2500, + "price_postapoc": 400, + "material": [ "alien_liquid", "unobtanium" ], + "symbol": "[", + "looks_like": "union_suit", + "color": "white", + "armor": [ + { + "material": [ + { "type": "unobtanium", "covered_by_mat": 10, "thickness": 0.5 }, + { "type": "alien_liquid", "covered_by_mat": 100, "thickness": 1 } + ], + "covers": [ "torso" ], + "specifically_covers": [ "torso_upper" ], + "coverage": 100, + "encumbrance": 0 + }, + { + "material": [ + { "type": "unobtanium", "covered_by_mat": 85, "thickness": 0.5 }, + { "type": "alien_liquid", "covered_by_mat": 100, "thickness": 1 } + ], + "covers": [ "arm_l", "arm_r" ], + "specifically_covers": [ "arm_shoulder_l", "arm_shoulder_r" ], + "coverage": 100, + "encumbrance": 0 + }, + { + "covers": [ "torso", "arm_l", "arm_r" ], + "specifically_covers": [ "torso_lower", "arm_upper_l", "arm_elbow_l", "arm_lower_l", "arm_upper_r", "arm_elbow_r", "arm_lower_r" ], + "coverage": 100, + "encumbrance": 2 + }, + { "covers": [ "leg_l", "leg_r", "foot_l", "foot_r", "hand_l", "hand_r" ], "coverage": 100, "encumbrance": 2 } + ], + "use_action": [ + { + "target": "migo_skin_off", + "msg": "The gorget hums and the liquid gets sucked back into it.", + "menu_text": "Deactivate the device", + "type": "transform" + } + ], + "warmth": 1, + "material_thickness": 1, + "environmental_protection": 1, + "flags": [ "SKINTIGHT", "STURDY", "TRADER_AVOID", "FILTHY", "NO_CLEAN" ] + }, + { + "id": "migo_skin_off", + "type": "ARMOR", + "name": { "str": "resonating gorget" }, + "description": "A heavy duty gorget made from odd materials that hums slightly, it feels damp to the touch and there is a mechanical button of some kind on the front. The inside reads \"CAREFUL CHOKING HAZARD! THIS WAY DOWN\".", + "weight": "1500 g", + "volume": "100 ml", + "price": 2500, + "price_postapoc": 400, + "material": [ "unobtanium" ], + "symbol": "[", + "looks_like": "silver_necklace", + "color": "white", + "use_action": { + "need_worn": true, + "target": "migo_skin", + "msg": "Murky ooze begins to leak out of the gorget and engulf your body from the neck down!", + "menu_text": "Activate the device", + "type": "transform" + }, + "armor": [ + { + "material": [ { "type": "unobtanium", "covered_by_mat": 100, "thickness": 0.5 } ], + "covers": [ "torso" ], + "specifically_covers": [ "torso_upper" ], + "coverage": 10, + "encumbrance": 0 + }, + { + "material": [ { "type": "unobtanium", "covered_by_mat": 100, "thickness": 0.5 } ], + "covers": [ "arm_l", "arm_r" ], + "specifically_covers": [ "arm_shoulder_l", "arm_shoulder_r" ], + "coverage": 85, + "encumbrance": 0 + } + ], + "warmth": 1, + "material_thickness": 1, + "environmental_protection": 1, + "flags": [ "SKINTIGHT", "STURDY", "TRADER_AVOID" ] + }, + { + "id": "feeding_kit", + "type": "TOOL", + "name": { "str": "feeding kit" }, + "description": "This is a collection of syringes with nozzles, an aerosol sprayer as well as a few other attachments. It seems designed for looking after some kind of creature that wants to stay wet.", + "weight": "85 g", + "volume": "250 ml", + "price": 1000, + "price_postapoc": 50, + "to_hit": -1, + "material": [ "plastic", "steel" ], + "symbol": ",", + "color": "red", + "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "water": 5 }, "watertight": true } ], + "charges_per_use": 1, + "use_action": [ + { + "type": "repair_item", + "item_action_type": "repair_metal", + "materials": [ "alien_liquid" ], + "skill": "survival", + "tool_quality": 0, + "cost_scaling": 0.1, + "move_cost": 100 + } + ], + "flags": [ "ALLOWS_REMOTE_USE" ] + } +] diff --git a/data/json/items/armor/gloves.json b/data/json/items/armor/gloves.json index 5964b9396c258..0314615d57c38 100644 --- a/data/json/items/armor/gloves.json +++ b/data/json/items/armor/gloves.json @@ -52,12 +52,18 @@ "price": 5012, "price_postapoc": 2500, "to_hit": -1, - "material": [ "steel", "cotton" ], "symbol": "[", "color": "light_red", "material_thickness": 2, "flags": [ "VARSIZE", "STURDY" ], - "armor": [ { "encumbrance": 30, "coverage": 100, "covers": [ "hand_l", "hand_r" ] } ] + "armor": [ + { + "material": [ { "type": "steel", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "hand_l", "hand_r" ], + "coverage": 100, + "encumbrance": 20 + } + ] }, { "id": "xl_chainmail_hands", @@ -76,6 +82,170 @@ "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, "flags": [ "VARSIZE", "STURDY", "UNDERSIZE" ] }, + { + "id": "lc_chainmail_hands", + "type": "ARMOR", + "category": "armor", + "name": { "str": "pair of mild steel chainmail gloves", "str_pl": "pairs of mild steel chainmail gloves" }, + "description": "Customized mild steel chainmail gloves that fully enclose the hand.", + "weight": "2006 g", + "volume": "500 ml", + "price": 5012, + "price_postapoc": 2500, + "to_hit": -1, + "symbol": "[", + "color": "light_red", + "material_thickness": 2, + "flags": [ "VARSIZE", "STURDY", "OUTER" ], + "armor": [ + { + "material": [ { "type": "lc_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "hand_l", "hand_r" ], + "coverage": 100, + "encumbrance": 20 + } + ] + }, + { + "id": "xl_lc_chainmail_hands", + "type": "ARMOR", + "copy-from": "lc_chainmail_hands", + "name": { "str": "pair of XL mild steel chainmail gloves", "str_pl": "pairs of XL mild steel chainmail gloves" }, + "proportional": { "weight": 1.5, "volume": 1.5 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "xs_lc_chainmail_hands", + "type": "ARMOR", + "copy-from": "lc_chainmail_hands", + "name": { "str": "pair of XS mild steel chainmail gloves", "str_pl": "pairs of XS mild steel chainmail gloves" }, + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "UNDERSIZE" ] } + }, + { + "id": "mc_chainmail_hands", + "type": "ARMOR", + "copy-from": "lc_chainmail_hands", + "name": { "str": "pair of medium steel chainmail gloves", "str_pl": "pairs of medium steel chainmail gloves" }, + "description": "Customized medium steel chainmail gloves that fully enclose the hand.", + "armor": [ + { + "material": [ { "type": "mc_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "hand_l", "hand_r" ], + "coverage": 100, + "encumbrance": 20 + } + ] + }, + { + "id": "xl_mc_chainmail_hands", + "type": "ARMOR", + "copy-from": "mc_chainmail_hands", + "name": { "str": "pair of XL medium steel chainmail gloves", "str_pl": "pairs of XL medium steel chainmail gloves" }, + "proportional": { "weight": 1.5, "volume": 1.5 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "xs_mc_chainmail_hands", + "type": "ARMOR", + "copy-from": "mc_chainmail_hands", + "name": { "str": "pair of XS medium steel chainmail gloves", "str_pl": "pairs of XS medium steel chainmail gloves" }, + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "UNDERSIZE" ] } + }, + { + "id": "hc_chainmail_hands", + "type": "ARMOR", + "copy-from": "lc_chainmail_hands", + "name": { "str": "pair of high steel chainmail gloves", "str_pl": "pairs of high steel chainmail gloves" }, + "description": "Customized high steel chainmail gloves that fully enclose the hand.", + "armor": [ + { + "material": [ { "type": "hc_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "hand_l", "hand_r" ], + "coverage": 100, + "encumbrance": 20 + } + ] + }, + { + "id": "xl_hc_chainmail_hands", + "type": "ARMOR", + "copy-from": "hc_chainmail_hands", + "name": { "str": "pair of XL high steel chainmail gloves", "str_pl": "pairs of XL high steel chainmail gloves" }, + "proportional": { "weight": 1.5, "volume": 1.5 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "xs_hc_chainmail_hands", + "type": "ARMOR", + "copy-from": "hc_chainmail_hands", + "name": { "str": "pair of XS high steel chainmail gloves", "str_pl": "pairs of XS high steel chainmail gloves" }, + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "UNDERSIZE" ] } + }, + { + "id": "ch_chainmail_hands", + "type": "ARMOR", + "copy-from": "lc_chainmail_hands", + "name": { "str": "pair of hardened steel chainmail gloves", "str_pl": "pairs of hardened steel chainmail gloves" }, + "description": "Customized hardened steel chainmail gloves that fully enclose the hand.", + "armor": [ + { + "material": [ { "type": "ch_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "hand_l", "hand_r" ], + "coverage": 100, + "encumbrance": 20 + } + ] + }, + { + "id": "xl_ch_chainmail_hands", + "type": "ARMOR", + "copy-from": "ch_chainmail_hands", + "name": { "str": "pair of XL hardened steel chainmail gloves", "str_pl": "pairs of XL hardened steel chainmail gloves" }, + "proportional": { "weight": 1.5, "volume": 1.5 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "xs_ch_chainmail_hands", + "type": "ARMOR", + "copy-from": "ch_chainmail_hands", + "name": { "str": "pair of XS hardened steel chainmail gloves", "str_pl": "pairs of XS hardened steel chainmail gloves" }, + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "UNDERSIZE" ] } + }, + { + "id": "qt_chainmail_hands", + "type": "ARMOR", + "copy-from": "lc_chainmail_hands", + "name": { "str": "pair of tempered steel chainmail gloves", "str_pl": "pairs of tempered steel chainmail gloves" }, + "description": "Customized tempered steel chainmail gloves that fully enclose the hand.", + "armor": [ + { + "material": [ { "type": "qt_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "hand_l", "hand_r" ], + "coverage": 100, + "encumbrance": 20 + } + ] + }, + { + "id": "xl_qt_chainmail_hands", + "type": "ARMOR", + "copy-from": "qt_chainmail_hands", + "name": { "str": "pair of XL tempered steel chainmail gloves", "str_pl": "pairs of XL tempered steel chainmail gloves" }, + "proportional": { "weight": 1.5, "volume": 1.5 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "xs_qt_chainmail_hands", + "type": "ARMOR", + "copy-from": "qt_chainmail_hands", + "name": { "str": "pair of XS tempered steel chainmail gloves", "str_pl": "pairs of XS tempered steel chainmail gloves" }, + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "UNDERSIZE" ] } + }, { "id": "fire_gauntlets", "repairs_like": "gauntlets_larmor", @@ -953,8 +1123,8 @@ "armor": [ { "material": [ - { "type": "low_steel", "covered_by_mat": 100, "thickness": 1 }, - { "type": "low_steel", "covered_by_mat": 60, "thickness": 0.25 }, + { "type": "lc_steel", "covered_by_mat": 60, "thickness": 1.25 }, + { "type": "lc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 100, "thickness": 1.0 } ], "covers": [ "hand_l", "hand_r" ], @@ -992,8 +1162,8 @@ "armor": [ { "material": [ - { "type": "med_steel", "covered_by_mat": 100, "thickness": 1 }, - { "type": "med_steel", "covered_by_mat": 60, "thickness": 0.25 }, + { "type": "mc_steel", "covered_by_mat": 60, "thickness": 1.25 }, + { "type": "mc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 100, "thickness": 1.0 } ], "covers": [ "hand_l", "hand_r" ], @@ -1031,8 +1201,8 @@ "armor": [ { "material": [ - { "type": "high_steel", "covered_by_mat": 100, "thickness": 1 }, - { "type": "high_steel", "covered_by_mat": 60, "thickness": 0.25 }, + { "type": "hc_steel", "covered_by_mat": 60, "thickness": 1.25 }, + { "type": "hc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 100, "thickness": 1.0 } ], "covers": [ "hand_l", "hand_r" ], @@ -1070,8 +1240,8 @@ "armor": [ { "material": [ - { "type": "case_hardened_steel", "covered_by_mat": 100, "thickness": 1 }, - { "type": "case_hardened_steel", "covered_by_mat": 60, "thickness": 0.25 }, + { "type": "ch_steel", "covered_by_mat": 60, "thickness": 1.25 }, + { "type": "ch_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 100, "thickness": 1.0 } ], "covers": [ "hand_l", "hand_r" ], @@ -1109,8 +1279,8 @@ "armor": [ { "material": [ - { "type": "tempered_steel", "covered_by_mat": 100, "thickness": 1 }, - { "type": "tempered_steel", "covered_by_mat": 60, "thickness": 0.25 }, + { "type": "qt_steel", "covered_by_mat": 60, "thickness": 1.25 }, + { "type": "qt_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 100, "thickness": 1.0 } ], "covers": [ "hand_l", "hand_r" ], @@ -1148,9 +1318,9 @@ "armor": [ { "material": [ - { "type": "low_steel", "covered_by_mat": 95, "thickness": 1.25 }, - { "type": "low_steel", "covered_by_mat": 95, "thickness": 1 }, - { "type": "leather", "covered_by_mat": 100, "thickness": 1 } + { "type": "lc_steel", "covered_by_mat": 95, "thickness": 1.25 }, + { "type": "lc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, + { "type": "leather", "covered_by_mat": 100, "thickness": 1.2 } ], "covers": [ "hand_l", "hand_r" ], "coverage": 100, @@ -1187,9 +1357,9 @@ "armor": [ { "material": [ - { "type": "med_steel", "covered_by_mat": 95, "thickness": 1.25 }, - { "type": "med_steel", "covered_by_mat": 95, "thickness": 1 }, - { "type": "leather", "covered_by_mat": 100, "thickness": 1 } + { "type": "mc_steel", "covered_by_mat": 95, "thickness": 1.25 }, + { "type": "mc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, + { "type": "leather", "covered_by_mat": 100, "thickness": 0.05 } ], "covers": [ "hand_l", "hand_r" ], "coverage": 100, @@ -1226,9 +1396,9 @@ "armor": [ { "material": [ - { "type": "high_steel", "covered_by_mat": 95, "thickness": 1.25 }, - { "type": "high_steel", "covered_by_mat": 95, "thickness": 1 }, - { "type": "leather", "covered_by_mat": 100, "thickness": 1 } + { "type": "hc_steel", "covered_by_mat": 95, "thickness": 1.25 }, + { "type": "hc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, + { "type": "leather", "covered_by_mat": 100, "thickness": 0.05 } ], "covers": [ "hand_l", "hand_r" ], "coverage": 100, @@ -1265,9 +1435,9 @@ "armor": [ { "material": [ - { "type": "case_hardened_steel", "covered_by_mat": 95, "thickness": 1.25 }, - { "type": "case_hardened_steel", "covered_by_mat": 95, "thickness": 1 }, - { "type": "leather", "covered_by_mat": 100, "thickness": 1 } + { "type": "ch_steel", "covered_by_mat": 95, "thickness": 1.25 }, + { "type": "ch_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, + { "type": "leather", "covered_by_mat": 100, "thickness": 0.05 } ], "covers": [ "hand_l", "hand_r" ], "coverage": 100, @@ -1304,9 +1474,9 @@ "armor": [ { "material": [ - { "type": "tempered_steel", "covered_by_mat": 95, "thickness": 1.25 }, - { "type": "tempered_steel", "covered_by_mat": 95, "thickness": 1 }, - { "type": "leather", "covered_by_mat": 100, "thickness": 1 } + { "type": "qt_steel", "covered_by_mat": 95, "thickness": 1.25 }, + { "type": "qt_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, + { "type": "leather", "covered_by_mat": 100, "thickness": 0.05 } ], "covers": [ "hand_l", "hand_r" ], "coverage": 100, diff --git a/data/json/items/armor/helmets.json b/data/json/items/armor/helmets.json index 3cf2965beaa22..33aa756f56fd7 100644 --- a/data/json/items/armor/helmets.json +++ b/data/json/items/armor/helmets.json @@ -910,7 +910,7 @@ "armor": [ { "material": [ - { "type": "low_steel", "covered_by_mat": 100, "thickness": 1.25 }, + { "type": "lc_steel", "covered_by_mat": 100, "thickness": 1.25 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "head" ], @@ -919,7 +919,7 @@ }, { "material": [ - { "type": "low_steel", "covered_by_mat": 100, "thickness": 1.25 }, + { "type": "lc_steel", "covered_by_mat": 100, "thickness": 1.25 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "eyes", "mouth" ], @@ -943,7 +943,7 @@ "armor": [ { "material": [ - { "type": "low_steel", "covered_by_mat": 100, "thickness": 1.25 }, + { "type": "lc_steel", "covered_by_mat": 100, "thickness": 1.25 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "head" ], @@ -992,7 +992,7 @@ "armor": [ { "material": [ - { "type": "med_steel", "covered_by_mat": 100, "thickness": 1.25 }, + { "type": "mc_steel", "covered_by_mat": 100, "thickness": 1.25 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "head" ], @@ -1001,7 +1001,7 @@ }, { "material": [ - { "type": "med_steel", "covered_by_mat": 100, "thickness": 1.25 }, + { "type": "mc_steel", "covered_by_mat": 100, "thickness": 1.25 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "eyes", "mouth" ], @@ -1025,7 +1025,7 @@ "armor": [ { "material": [ - { "type": "med_steel", "covered_by_mat": 100, "thickness": 1.25 }, + { "type": "mc_steel", "covered_by_mat": 100, "thickness": 1.25 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "head" ], @@ -1074,7 +1074,7 @@ "armor": [ { "material": [ - { "type": "high_steel", "covered_by_mat": 100, "thickness": 1.25 }, + { "type": "hc_steel", "covered_by_mat": 100, "thickness": 1.25 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "head" ], @@ -1083,7 +1083,7 @@ }, { "material": [ - { "type": "high_steel", "covered_by_mat": 100, "thickness": 1.25 }, + { "type": "hc_steel", "covered_by_mat": 100, "thickness": 1.25 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "eyes", "mouth" ], @@ -1107,7 +1107,7 @@ "armor": [ { "material": [ - { "type": "high_steel", "covered_by_mat": 100, "thickness": 1.25 }, + { "type": "hc_steel", "covered_by_mat": 100, "thickness": 1.25 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "head" ], @@ -1156,7 +1156,7 @@ "armor": [ { "material": [ - { "type": "case_hardened_steel", "covered_by_mat": 100, "thickness": 1.25 }, + { "type": "ch_steel", "covered_by_mat": 100, "thickness": 1.25 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "head" ], @@ -1165,7 +1165,7 @@ }, { "material": [ - { "type": "case_hardened_steel", "covered_by_mat": 100, "thickness": 1.25 }, + { "type": "ch_steel", "covered_by_mat": 100, "thickness": 1.25 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "eyes", "mouth" ], @@ -1189,7 +1189,7 @@ "armor": [ { "material": [ - { "type": "case_hardened_steel", "covered_by_mat": 100, "thickness": 1.25 }, + { "type": "ch_steel", "covered_by_mat": 100, "thickness": 1.25 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "head" ], @@ -1238,7 +1238,7 @@ "armor": [ { "material": [ - { "type": "tempered_steel", "covered_by_mat": 100, "thickness": 1.25 }, + { "type": "qt_steel", "covered_by_mat": 100, "thickness": 1.25 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "head" ], @@ -1247,7 +1247,7 @@ }, { "material": [ - { "type": "tempered_steel", "covered_by_mat": 100, "thickness": 1.25 }, + { "type": "qt_steel", "covered_by_mat": 100, "thickness": 1.25 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "eyes", "mouth" ], @@ -1271,7 +1271,7 @@ "armor": [ { "material": [ - { "type": "tempered_steel", "covered_by_mat": 100, "thickness": 1.25 }, + { "type": "qt_steel", "covered_by_mat": 100, "thickness": 1.25 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "head" ], diff --git a/data/json/items/armor/hoods.json b/data/json/items/armor/hoods.json index 8a1d97f516cb1..696c6e49ef6a0 100644 --- a/data/json/items/armor/hoods.json +++ b/data/json/items/armor/hoods.json @@ -33,13 +33,19 @@ "price": 5012, "price_postapoc": 2500, "to_hit": -1, - "material": [ "iron", "cotton" ], "symbol": "[", "looks_like": "balclava", "color": "light_red", "material_thickness": 4, "flags": [ "VARSIZE", "STURDY", "HELMET_COMPAT" ], - "armor": [ { "encumbrance": 10, "coverage": 95, "covers": [ "head" ] } ] + "armor": [ + { + "material": [ { "type": "steel", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "head" ], + "coverage": 95, + "encumbrance": 10 + } + ] }, { "id": "xl_chainmail_hood", @@ -60,6 +66,185 @@ "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, "flags": [ "VARSIZE", "STURDY", "HELMET_COMPAT", "UNDERSIZE" ] }, + { + "id": "lc_chainmail_hood", + "type": "ARMOR", + "category": "armor", + "name": { "str": "mild steel chainmail coif" }, + "description": "A customized mild steel chainmail hood. Can be worn comfortably under helmets.", + "weight": "2006 g", + "volume": "500 ml", + "price": 5012, + "price_postapoc": 2500, + "to_hit": -1, + "symbol": "[", + "looks_like": "balclava", + "color": "light_red", + "flags": [ "VARSIZE", "STURDY", "HELMET_COMPAT", "OUTER" ], + "armor": [ + { + "material": [ { "type": "lc_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "head" ], + "coverage": 95, + "encumbrance": 10 + } + ] + }, + { + "id": "xl_lc_chainmail_hood", + "type": "ARMOR", + "copy-from": "lc_chainmail_hood", + "name": { "str": "XL mild steel chainmail coif" }, + "description": "A customized mild steel chainmail hood. Can be worn comfortably under helmets. Comes in size XL.", + "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "xs_lc_chainmail_hood", + "type": "ARMOR", + "copy-from": "lc_chainmail_hood", + "looks_like": "lc_chainmail_hood", + "name": { "str": "XS mild steel chainmail coif" }, + "description": "A customized mild steel chainmail hood. Can be worn comfortably under helmets. Comes in size XS.", + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "UNDERSIZE" ] } + }, + { + "id": "mc_chainmail_hood", + "type": "ARMOR", + "copy-from": "lc_chainmail_hood", + "name": { "str": "medium steel chainmail coif" }, + "description": "A customized medium steel chainmail hood. Can be worn comfortably under helmets.", + "armor": [ + { + "material": [ { "type": "mc_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "head" ], + "coverage": 95, + "encumbrance": 10 + } + ] + }, + { + "id": "xl_mc_chainmail_hood", + "type": "ARMOR", + "copy-from": "mc_chainmail_hood", + "name": { "str": "XL medium steel chainmail coif" }, + "description": "A customized medium steel chainmail hood. Can be worn comfortably under helmets. Comes in size XL.", + "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "xs_mc_chainmail_hood", + "type": "ARMOR", + "copy-from": "mc_chainmail_hood", + "looks_like": "mc_chainmail_hood", + "name": { "str": "XS medium steel chainmail coif" }, + "description": "A customized medium steel chainmail hood. Can be worn comfortably under helmets. Comes in size XS.", + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "UNDERSIZE" ] } + }, + { + "id": "hc_chainmail_hood", + "type": "ARMOR", + "copy-from": "lc_chainmail_hood", + "name": { "str": "high steel chainmail coif" }, + "description": "A customized high steel chainmail hood. Can be worn comfortably under helmets.", + "armor": [ + { + "material": [ { "type": "hc_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "head" ], + "coverage": 95, + "encumbrance": 10 + } + ] + }, + { + "id": "xl_hc_chainmail_hood", + "type": "ARMOR", + "copy-from": "hc_chainmail_hood", + "name": { "str": "XL high steel chainmail coif" }, + "description": "A customized high steel chainmail hood. Can be worn comfortably under helmets. Comes in size XL.", + "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "xs_hc_chainmail_hood", + "type": "ARMOR", + "copy-from": "hc_chainmail_hood", + "looks_like": "hc_chainmail_hood", + "name": { "str": "XS high steel chainmail coif" }, + "description": "A customized high steel chainmail hood. Can be worn comfortably under helmets. Comes in size XS.", + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "UNDERSIZE" ] } + }, + { + "id": "ch_chainmail_hood", + "type": "ARMOR", + "copy-from": "lc_chainmail_hood", + "name": { "str": "hardened steel chainmail coif" }, + "description": "A customized hardened steel chainmail hood. Can be worn comfortably under helmets.", + "armor": [ + { + "material": [ { "type": "ch_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "head" ], + "coverage": 95, + "encumbrance": 10 + } + ] + }, + { + "id": "xl_ch_chainmail_hood", + "type": "ARMOR", + "copy-from": "ch_chainmail_hood", + "name": { "str": "XL hardened steel chainmail coif" }, + "description": "A customized hardened steel chainmail hood. Can be worn comfortably under helmets. Comes in size XL.", + "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "xs_ch_chainmail_hood", + "type": "ARMOR", + "copy-from": "ch_chainmail_hood", + "looks_like": "ch_chainmail_hood", + "name": { "str": "XS hardened steel chainmail coif" }, + "description": "A customized hardened steel chainmail hood. Can be worn comfortably under helmets. Comes in size XS.", + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "UNDERSIZE" ] } + }, + { + "id": "qt_chainmail_hood", + "type": "ARMOR", + "copy-from": "lc_chainmail_hood", + "name": { "str": "tempered steel chainmail coif" }, + "description": "A customized tempered steel chainmail hood. Can be worn comfortably under helmets.", + "armor": [ + { + "material": [ { "type": "qt_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "head" ], + "coverage": 95, + "encumbrance": 10 + } + ] + }, + { + "id": "xl_qt_chainmail_hood", + "type": "ARMOR", + "copy-from": "qt_chainmail_hood", + "name": { "str": "XL tempered steel chainmail coif" }, + "description": "A customized tempered steel chainmail hood. Can be worn comfortably under helmets. Comes in size XL.", + "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "xs_qt_chainmail_hood", + "type": "ARMOR", + "copy-from": "qt_chainmail_hood", + "looks_like": "qt_chainmail_hood", + "name": { "str": "XS tempered steel chainmail coif" }, + "description": "A customized tempered steel chainmail hood. Can be worn comfortably under helmets. Comes in size XS.", + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "UNDERSIZE" ] } + }, { "id": "gambeson_hood", "type": "ARMOR", diff --git a/data/json/items/armor/legs_armor.json b/data/json/items/armor/legs_armor.json index 8a9271ee966fc..3022781d224ba 100644 --- a/data/json/items/armor/legs_armor.json +++ b/data/json/items/armor/legs_armor.json @@ -139,13 +139,18 @@ "price": 7500, "price_postapoc": 2000, "to_hit": -1, - "material": [ "iron", "cotton" ], "symbol": "[", "looks_like": "legguard_hard", "color": "light_red", - "material_thickness": 4, "flags": [ "VARSIZE", "STURDY" ], - "armor": [ { "encumbrance": 20, "coverage": 95, "covers": [ "leg_l", "leg_r" ] } ] + "armor": [ + { + "material": [ { "type": "steel", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "leg_l", "leg_r" ], + "coverage": 95, + "encumbrance": 20 + } + ] }, { "id": "xl_chainmail_legs", @@ -166,6 +171,180 @@ "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, "flags": [ "VARSIZE", "STURDY", "UNDERSIZE" ] }, + { + "id": "lc_chainmail_legs", + "type": "ARMOR", + "category": "armor", + "name": { "str": "mild steel chainmail leggings", "str_pl": "pairs of mild steel chainmail leggings" }, + "description": "Customized mild steel chainmail legs. Their straps keep everything in place, and the lack of toes and heels allows them to work perfectly well with footwear.", + "weight": "4212 g", + "volume": "1500 ml", + "price": 7500, + "price_postapoc": 2000, + "to_hit": -1, + "symbol": "[", + "looks_like": "legguard_hard", + "color": "light_red", + "flags": [ "VARSIZE", "STURDY", "OUTER" ], + "armor": [ + { + "material": [ { "type": "lc_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "leg_l", "leg_r" ], + "coverage": 95, + "encumbrance": 20 + } + ] + }, + { + "id": "xl_lc_chainmail_legs", + "type": "ARMOR", + "copy-from": "lc_chainmail_legs", + "name": { "str": "XL mild steel chainmail leggings", "str_pl": "pairs of XL mild steel chainmail leggings" }, + "description": "Customized mild steel chainmail legs for the largest of transhumans. Their straps keep everything in place, and the lack of toes and heels allows them to work perfectly well with footwear.", + "proportional": { "weight": 1.25, "volume": 1.13, "price": 1.25 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "xs_lc_chainmail_legs", + "type": "ARMOR", + "copy-from": "lc_chainmail_legs", + "name": { "str": "XS mild steel chainmail leggings", "str_pl": "pairs of XS mild steel chainmail leggings" }, + "description": "Customized mild steel chainmail legs for the smallest of transhumans. Their straps keep everything in place, and the lack of toes and heels allows them to work perfectly well with footwear.", + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "UNDERSIZE" ] } + }, + { + "id": "mc_chainmail_legs", + "type": "ARMOR", + "copy-from": "lc_chainmail_legs", + "name": { "str": "medium steel chainmail leggings", "str_pl": "pairs of medium steel chainmail leggings" }, + "description": "Customized medium steel chainmail legs. Their straps keep everything in place, and the lack of toes and heels allows them to work perfectly well with footwear.", + "armor": [ + { + "material": [ { "type": "mc_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "leg_l", "leg_r" ], + "coverage": 95, + "encumbrance": 20 + } + ] + }, + { + "id": "xl_mc_chainmail_legs", + "type": "ARMOR", + "copy-from": "mc_chainmail_legs", + "name": { "str": "XL medium steel chainmail leggings", "str_pl": "pairs of XL medium steel chainmail leggings" }, + "description": "Customized medium steel chainmail legs for the largest of transhumans. Their straps keep everything in place, and the lack of toes and heels allows them to work perfectly well with footwear.", + "proportional": { "weight": 1.25, "volume": 1.13, "price": 1.25 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "xs_mc_chainmail_legs", + "type": "ARMOR", + "copy-from": "mc_chainmail_legs", + "name": { "str": "XS medium steel chainmail leggings", "str_pl": "pairs of XS medium steel chainmail leggings" }, + "description": "Customized medium steel chainmail legs for the smallest of transhumans. Their straps keep everything in place, and the lack of toes and heels allows them to work perfectly well with footwear.", + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "UNDERSIZE" ] } + }, + { + "id": "hc_chainmail_legs", + "type": "ARMOR", + "copy-from": "lc_chainmail_legs", + "name": { "str": "high steel chainmail leggings", "str_pl": "pairs of high steel chainmail leggings" }, + "description": "Customized high steel chainmail legs. Their straps keep everything in place, and the lack of toes and heels allows them to work perfectly well with footwear.", + "armor": [ + { + "material": [ { "type": "hc_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "leg_l", "leg_r" ], + "coverage": 95, + "encumbrance": 20 + } + ] + }, + { + "id": "xl_hc_chainmail_legs", + "type": "ARMOR", + "copy-from": "hc_chainmail_legs", + "name": { "str": "XL high steel chainmail leggings", "str_pl": "pairs of XL high steel chainmail leggings" }, + "description": "Customized high steel chainmail legs for the largest of transhumans. Their straps keep everything in place, and the lack of toes and heels allows them to work perfectly well with footwear.", + "proportional": { "weight": 1.25, "volume": 1.13, "price": 1.25 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "xs_hc_chainmail_legs", + "type": "ARMOR", + "copy-from": "hc_chainmail_legs", + "name": { "str": "XS high steel chainmail leggings", "str_pl": "pairs of XS high steel chainmail leggings" }, + "description": "Customized high steel chainmail legs for the smallest of transhumans. Their straps keep everything in place, and the lack of toes and heels allows them to work perfectly well with footwear.", + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "UNDERSIZE" ] } + }, + { + "id": "ch_chainmail_legs", + "type": "ARMOR", + "copy-from": "lc_chainmail_legs", + "name": { "str": "hardened steel chainmail leggings", "str_pl": "pairs of hardened steel chainmail leggings" }, + "description": "Customized hardened steel chainmail legs. Their straps keep everything in place, and the lack of toes and heels allows them to work perfectly well with footwear.", + "armor": [ + { + "material": [ { "type": "ch_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "leg_l", "leg_r" ], + "coverage": 95, + "encumbrance": 20 + } + ] + }, + { + "id": "xl_ch_chainmail_legs", + "type": "ARMOR", + "copy-from": "ch_chainmail_legs", + "name": { "str": "XL hardened steel chainmail leggings", "str_pl": "pairs of XL hardened steel chainmail leggings" }, + "description": "Customized hardened steel chainmail legs for the largest of transhumans. Their straps keep everything in place, and the lack of toes and heels allows them to work perfectly well with footwear.", + "proportional": { "weight": 1.25, "volume": 1.13, "price": 1.25 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "xs_ch_chainmail_legs", + "type": "ARMOR", + "copy-from": "ch_chainmail_legs", + "name": { "str": "XS hardened steel chainmail leggings", "str_pl": "pairs of XS hardened steel chainmail leggings" }, + "description": "Customized hardened steel chainmail legs for the smallest of transhumans. Their straps keep everything in place, and the lack of toes and heels allows them to work perfectly well with footwear.", + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "UNDERSIZE" ] } + }, + { + "id": "qt_chainmail_legs", + "type": "ARMOR", + "copy-from": "lc_chainmail_legs", + "name": { "str": "tempered steel chainmail leggings", "str_pl": "pairs of tempered steel chainmail leggings" }, + "description": "Customized tempered steel chainmail legs. Their straps keep everything in place, and the lack of toes and heels allows them to work perfectly well with footwear.", + "armor": [ + { + "material": [ { "type": "qt_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "leg_l", "leg_r" ], + "coverage": 95, + "encumbrance": 20 + } + ] + }, + { + "id": "xl_qt_chainmail_legs", + "type": "ARMOR", + "copy-from": "qt_chainmail_legs", + "name": { "str": "XL tempered steel chainmail leggings", "str_pl": "pairs of XL tempered steel chainmail leggings" }, + "description": "Customized tempered steel chainmail legs for the largest of transhumans. Their straps keep everything in place, and the lack of toes and heels allows them to work perfectly well with footwear.", + "proportional": { "weight": 1.25, "volume": 1.13, "price": 1.25 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "xs_qt_chainmail_legs", + "type": "ARMOR", + "copy-from": "qt_chainmail_legs", + "name": { "str": "XS tempered steel chainmail leggings", "str_pl": "pairs of XS tempered steel chainmail leggings" }, + "description": "Customized tempered steel chainmail legs for the smallest of transhumans. Their straps keep everything in place, and the lack of toes and heels allows them to work perfectly well with footwear.", + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "UNDERSIZE" ] } + }, { "id": "leggings_thessalonian", "type": "ARMOR", @@ -361,7 +540,7 @@ "armor": [ { "covers": [ "leg_l", "leg_r" ], - "encumbrance": 10, + "encumbrance": 4, "coverage": 90, "cover_melee": 90, "cover_ranged": 95, @@ -809,8 +988,8 @@ "armor": [ { "material": [ - { "type": "low_steel", "covered_by_mat": 95, "thickness": 0.25 }, - { "type": "low_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "lc_steel", "covered_by_mat": 95, "thickness": 0.05 }, + { "type": "lc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "leg_l", "leg_r" ], @@ -837,8 +1016,8 @@ "armor": [ { "material": [ - { "type": "med_steel", "covered_by_mat": 95, "thickness": 0.25 }, - { "type": "med_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "mc_steel", "covered_by_mat": 95, "thickness": 0.05 }, + { "type": "mc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "leg_l", "leg_r" ], @@ -865,8 +1044,8 @@ "armor": [ { "material": [ - { "type": "high_steel", "covered_by_mat": 95, "thickness": 0.25 }, - { "type": "high_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "hc_steel", "covered_by_mat": 95, "thickness": 0.05 }, + { "type": "hc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "leg_l", "leg_r" ], @@ -893,8 +1072,8 @@ "armor": [ { "material": [ - { "type": "case_hardened_steel", "covered_by_mat": 95, "thickness": 0.25 }, - { "type": "case_hardened_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "ch_steel", "covered_by_mat": 95, "thickness": 0.05 }, + { "type": "ch_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "leg_l", "leg_r" ], @@ -921,8 +1100,8 @@ "armor": [ { "material": [ - { "type": "tempered_steel", "covered_by_mat": 95, "thickness": 0.25 }, - { "type": "tempered_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "qt_steel", "covered_by_mat": 95, "thickness": 0.05 }, + { "type": "qt_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "leg_l", "leg_r" ], @@ -962,8 +1141,8 @@ "armor": [ { "material": [ - { "type": "low_steel", "covered_by_mat": 95, "thickness": 0.75 }, - { "type": "low_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "lc_steel", "covered_by_mat": 95, "thickness": 0.55 }, + { "type": "lc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "leg_l", "leg_r" ], @@ -990,8 +1169,8 @@ "armor": [ { "material": [ - { "type": "med_steel", "covered_by_mat": 95, "thickness": 0.75 }, - { "type": "med_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "mc_steel", "covered_by_mat": 95, "thickness": 0.55 }, + { "type": "mc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "leg_l", "leg_r" ], @@ -1018,8 +1197,8 @@ "armor": [ { "material": [ - { "type": "high_steel", "covered_by_mat": 95, "thickness": 0.75 }, - { "type": "high_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "hc_steel", "covered_by_mat": 95, "thickness": 0.55 }, + { "type": "hc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "leg_l", "leg_r" ], @@ -1046,8 +1225,8 @@ "armor": [ { "material": [ - { "type": "case_hardened_steel", "covered_by_mat": 95, "thickness": 0.75 }, - { "type": "case_hardened_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "ch_steel", "covered_by_mat": 95, "thickness": 0.55 }, + { "type": "ch_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "leg_l", "leg_r" ], @@ -1074,8 +1253,8 @@ "armor": [ { "material": [ - { "type": "tempered_steel", "covered_by_mat": 95, "thickness": 0.75 }, - { "type": "tempered_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "qt_steel", "covered_by_mat": 95, "thickness": 0.55 }, + { "type": "qt_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "leg_l", "leg_r" ], @@ -1115,8 +1294,8 @@ "armor": [ { "material": [ - { "type": "low_steel", "covered_by_mat": 95, "thickness": 1.25 }, - { "type": "low_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "lc_steel", "covered_by_mat": 95, "thickness": 1.05 }, + { "type": "lc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "leg_l", "leg_r" ], @@ -1143,8 +1322,8 @@ "armor": [ { "material": [ - { "type": "med_steel", "covered_by_mat": 95, "thickness": 1.25 }, - { "type": "med_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "mc_steel", "covered_by_mat": 95, "thickness": 1.05 }, + { "type": "mc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "leg_l", "leg_r" ], @@ -1171,8 +1350,8 @@ "armor": [ { "material": [ - { "type": "high_steel", "covered_by_mat": 95, "thickness": 1.25 }, - { "type": "high_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "hc_steel", "covered_by_mat": 95, "thickness": 1.05 }, + { "type": "hc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "leg_l", "leg_r" ], @@ -1199,8 +1378,8 @@ "armor": [ { "material": [ - { "type": "case_hardened_steel", "covered_by_mat": 95, "thickness": 1.25 }, - { "type": "case_hardened_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "ch_steel", "covered_by_mat": 95, "thickness": 1.05 }, + { "type": "ch_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "leg_l", "leg_r" ], @@ -1227,8 +1406,8 @@ "armor": [ { "material": [ - { "type": "tempered_steel", "covered_by_mat": 95, "thickness": 1.25 }, - { "type": "tempered_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "qt_steel", "covered_by_mat": 95, "thickness": 1.05 }, + { "type": "qt_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "leg_l", "leg_r" ], diff --git a/data/json/items/armor/suits_protection.json b/data/json/items/armor/suits_protection.json index 299437641ba62..ce1c7e34d16df 100644 --- a/data/json/items/armor/suits_protection.json +++ b/data/json/items/armor/suits_protection.json @@ -301,8 +301,8 @@ "armor": [ { "material": [ - { "type": "low_steel", "covered_by_mat": 95, "thickness": 1.0 }, - { "type": "low_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "lc_steel", "covered_by_mat": 95, "thickness": 0.8 }, + { "type": "lc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "torso" ], @@ -311,8 +311,8 @@ }, { "material": [ - { "type": "low_steel", "covered_by_mat": 95, "thickness": 0.25 }, - { "type": "low_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "lc_steel", "covered_by_mat": 95, "thickness": 0.05 }, + { "type": "lc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "arm_l", "arm_r" ], @@ -321,8 +321,8 @@ }, { "material": [ - { "type": "low_steel", "covered_by_mat": 95, "thickness": 0.25 }, - { "type": "low_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "lc_steel", "covered_by_mat": 95, "thickness": 0.05 }, + { "type": "lc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "leg_l", "leg_r" ], @@ -348,8 +348,8 @@ "armor": [ { "material": [ - { "type": "med_steel", "covered_by_mat": 95, "thickness": 1.0 }, - { "type": "med_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "mc_steel", "covered_by_mat": 95, "thickness": 0.8 }, + { "type": "mc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "torso" ], @@ -358,8 +358,8 @@ }, { "material": [ - { "type": "med_steel", "covered_by_mat": 95, "thickness": 0.25 }, - { "type": "med_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "mc_steel", "covered_by_mat": 95, "thickness": 0.05 }, + { "type": "mc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "arm_l", "arm_r" ], @@ -368,8 +368,8 @@ }, { "material": [ - { "type": "med_steel", "covered_by_mat": 95, "thickness": 0.25 }, - { "type": "med_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "mc_steel", "covered_by_mat": 95, "thickness": 0.05 }, + { "type": "mc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "leg_l", "leg_r" ], @@ -395,8 +395,8 @@ "armor": [ { "material": [ - { "type": "high_steel", "covered_by_mat": 95, "thickness": 1.0 }, - { "type": "high_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "hc_steel", "covered_by_mat": 95, "thickness": 0.8 }, + { "type": "hc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "torso" ], @@ -405,8 +405,8 @@ }, { "material": [ - { "type": "high_steel", "covered_by_mat": 95, "thickness": 0.25 }, - { "type": "high_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "hc_steel", "covered_by_mat": 95, "thickness": 0.05 }, + { "type": "hc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "arm_l", "arm_r" ], @@ -415,8 +415,8 @@ }, { "material": [ - { "type": "high_steel", "covered_by_mat": 95, "thickness": 0.25 }, - { "type": "high_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "hc_steel", "covered_by_mat": 95, "thickness": 0.05 }, + { "type": "hc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "leg_l", "leg_r" ], @@ -442,8 +442,8 @@ "armor": [ { "material": [ - { "type": "case_hardened_steel", "covered_by_mat": 95, "thickness": 1.0 }, - { "type": "case_hardened_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "ch_steel", "covered_by_mat": 95, "thickness": 0.8 }, + { "type": "ch_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "torso" ], @@ -452,8 +452,8 @@ }, { "material": [ - { "type": "case_hardened_steel", "covered_by_mat": 95, "thickness": 0.25 }, - { "type": "case_hardened_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "ch_steel", "covered_by_mat": 95, "thickness": 0.05 }, + { "type": "ch_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "arm_l", "arm_r" ], @@ -462,8 +462,8 @@ }, { "material": [ - { "type": "case_hardened_steel", "covered_by_mat": 95, "thickness": 0.25 }, - { "type": "case_hardened_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "ch_steel", "covered_by_mat": 95, "thickness": 0.05 }, + { "type": "ch_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "leg_l", "leg_r" ], @@ -489,8 +489,8 @@ "armor": [ { "material": [ - { "type": "tempered_steel", "covered_by_mat": 95, "thickness": 1.0 }, - { "type": "tempered_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "qt_steel", "covered_by_mat": 95, "thickness": 0.8 }, + { "type": "qt_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "torso" ], @@ -499,8 +499,8 @@ }, { "material": [ - { "type": "tempered_steel", "covered_by_mat": 95, "thickness": 0.25 }, - { "type": "tempered_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "qt_steel", "covered_by_mat": 95, "thickness": 0.05 }, + { "type": "qt_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "arm_l", "arm_r" ], @@ -509,8 +509,8 @@ }, { "material": [ - { "type": "tempered_steel", "covered_by_mat": 95, "thickness": 0.25 }, - { "type": "tempered_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "qt_steel", "covered_by_mat": 95, "thickness": 0.05 }, + { "type": "qt_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "leg_l", "leg_r" ], @@ -549,8 +549,8 @@ "armor": [ { "material": [ - { "type": "low_steel", "covered_by_mat": 95, "thickness": 3.0 }, - { "type": "low_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "lc_steel", "covered_by_mat": 95, "thickness": 2.8 }, + { "type": "lc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "torso" ], @@ -559,8 +559,8 @@ }, { "material": [ - { "type": "low_steel", "covered_by_mat": 95, "thickness": 0.75 }, - { "type": "low_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "lc_steel", "covered_by_mat": 95, "thickness": 0.55 }, + { "type": "lc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "arm_l", "arm_r" ], @@ -569,8 +569,8 @@ }, { "material": [ - { "type": "low_steel", "covered_by_mat": 95, "thickness": 0.75 }, - { "type": "low_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "lc_steel", "covered_by_mat": 95, "thickness": 0.55 }, + { "type": "lc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "leg_l", "leg_r" ], @@ -596,8 +596,8 @@ "armor": [ { "material": [ - { "type": "med_steel", "covered_by_mat": 95, "thickness": 3.0 }, - { "type": "med_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "mc_steel", "covered_by_mat": 95, "thickness": 2.8 }, + { "type": "mc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "torso" ], @@ -606,8 +606,8 @@ }, { "material": [ - { "type": "med_steel", "covered_by_mat": 95, "thickness": 0.75 }, - { "type": "med_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "mc_steel", "covered_by_mat": 95, "thickness": 0.55 }, + { "type": "mc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "arm_l", "arm_r" ], @@ -616,8 +616,8 @@ }, { "material": [ - { "type": "med_steel", "covered_by_mat": 95, "thickness": 0.75 }, - { "type": "med_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "mc_steel", "covered_by_mat": 95, "thickness": 0.55 }, + { "type": "mc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "leg_l", "leg_r" ], @@ -643,8 +643,8 @@ "armor": [ { "material": [ - { "type": "high_steel", "covered_by_mat": 95, "thickness": 3.0 }, - { "type": "high_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "hc_steel", "covered_by_mat": 95, "thickness": 2.8 }, + { "type": "hc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "torso" ], @@ -653,8 +653,8 @@ }, { "material": [ - { "type": "high_steel", "covered_by_mat": 95, "thickness": 0.75 }, - { "type": "high_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "hc_steel", "covered_by_mat": 95, "thickness": 0.55 }, + { "type": "hc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "arm_l", "arm_r" ], @@ -663,8 +663,8 @@ }, { "material": [ - { "type": "high_steel", "covered_by_mat": 95, "thickness": 0.75 }, - { "type": "high_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "hc_steel", "covered_by_mat": 95, "thickness": 0.55 }, + { "type": "hc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "leg_l", "leg_r" ], @@ -690,8 +690,8 @@ "armor": [ { "material": [ - { "type": "case_hardened_steel", "covered_by_mat": 95, "thickness": 3.0 }, - { "type": "case_hardened_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "ch_steel", "covered_by_mat": 95, "thickness": 2.8 }, + { "type": "ch_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "torso" ], @@ -700,8 +700,8 @@ }, { "material": [ - { "type": "case_hardened_steel", "covered_by_mat": 95, "thickness": 0.75 }, - { "type": "case_hardened_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "ch_steel", "covered_by_mat": 95, "thickness": 0.55 }, + { "type": "ch_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "arm_l", "arm_r" ], @@ -710,8 +710,8 @@ }, { "material": [ - { "type": "case_hardened_steel", "covered_by_mat": 95, "thickness": 0.75 }, - { "type": "case_hardened_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "ch_steel", "covered_by_mat": 95, "thickness": 0.55 }, + { "type": "ch_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "leg_l", "leg_r" ], @@ -737,8 +737,8 @@ "armor": [ { "material": [ - { "type": "tempered_steel", "covered_by_mat": 95, "thickness": 3.0 }, - { "type": "tempered_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "qt_steel", "covered_by_mat": 95, "thickness": 2.8 }, + { "type": "qt_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "torso" ], @@ -747,8 +747,8 @@ }, { "material": [ - { "type": "tempered_steel", "covered_by_mat": 95, "thickness": 0.75 }, - { "type": "tempered_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "qt_steel", "covered_by_mat": 95, "thickness": 0.55 }, + { "type": "qt_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "arm_l", "arm_r" ], @@ -757,8 +757,8 @@ }, { "material": [ - { "type": "tempered_steel", "covered_by_mat": 95, "thickness": 0.75 }, - { "type": "tempered_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "qt_steel", "covered_by_mat": 95, "thickness": 0.55 }, + { "type": "qt_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "leg_l", "leg_r" ], @@ -797,8 +797,8 @@ "armor": [ { "material": [ - { "type": "low_steel", "covered_by_mat": 95, "thickness": 5.0 }, - { "type": "low_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "lc_steel", "covered_by_mat": 95, "thickness": 4.8 }, + { "type": "lc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "torso" ], @@ -807,8 +807,8 @@ }, { "material": [ - { "type": "low_steel", "covered_by_mat": 95, "thickness": 1.25 }, - { "type": "low_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "lc_steel", "covered_by_mat": 95, "thickness": 1.05 }, + { "type": "lc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "arm_l", "arm_r" ], @@ -817,8 +817,8 @@ }, { "material": [ - { "type": "low_steel", "covered_by_mat": 95, "thickness": 1.25 }, - { "type": "low_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "lc_steel", "covered_by_mat": 95, "thickness": 1.05 }, + { "type": "lc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "leg_l", "leg_r" ], @@ -844,8 +844,8 @@ "armor": [ { "material": [ - { "type": "med_steel", "covered_by_mat": 95, "thickness": 5.0 }, - { "type": "med_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "mc_steel", "covered_by_mat": 95, "thickness": 4.8 }, + { "type": "mc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "torso" ], @@ -854,8 +854,8 @@ }, { "material": [ - { "type": "med_steel", "covered_by_mat": 95, "thickness": 1.25 }, - { "type": "med_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "mc_steel", "covered_by_mat": 95, "thickness": 1.05 }, + { "type": "mc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "arm_l", "arm_r" ], @@ -864,8 +864,8 @@ }, { "material": [ - { "type": "med_steel", "covered_by_mat": 95, "thickness": 1.25 }, - { "type": "med_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "mc_steel", "covered_by_mat": 95, "thickness": 1.05 }, + { "type": "mc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "leg_l", "leg_r" ], @@ -891,8 +891,8 @@ "armor": [ { "material": [ - { "type": "high_steel", "covered_by_mat": 95, "thickness": 5.0 }, - { "type": "high_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "hc_steel", "covered_by_mat": 95, "thickness": 4.8 }, + { "type": "hc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "torso" ], @@ -901,8 +901,8 @@ }, { "material": [ - { "type": "high_steel", "covered_by_mat": 95, "thickness": 1.25 }, - { "type": "high_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "hc_steel", "covered_by_mat": 95, "thickness": 1.05 }, + { "type": "hc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "arm_l", "arm_r" ], @@ -911,8 +911,8 @@ }, { "material": [ - { "type": "high_steel", "covered_by_mat": 95, "thickness": 1.25 }, - { "type": "high_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "hc_steel", "covered_by_mat": 95, "thickness": 1.05 }, + { "type": "hc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "leg_l", "leg_r" ], @@ -938,8 +938,8 @@ "armor": [ { "material": [ - { "type": "case_hardened_steel", "covered_by_mat": 95, "thickness": 5.0 }, - { "type": "case_hardened_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "ch_steel", "covered_by_mat": 95, "thickness": 4.8 }, + { "type": "ch_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "torso" ], @@ -948,8 +948,8 @@ }, { "material": [ - { "type": "case_hardened_steel", "covered_by_mat": 95, "thickness": 1.25 }, - { "type": "case_hardened_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "ch_steel", "covered_by_mat": 95, "thickness": 1.05 }, + { "type": "ch_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "arm_l", "arm_r" ], @@ -958,8 +958,8 @@ }, { "material": [ - { "type": "case_hardened_steel", "covered_by_mat": 95, "thickness": 1.25 }, - { "type": "case_hardened_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "ch_steel", "covered_by_mat": 95, "thickness": 1.05 }, + { "type": "ch_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "leg_l", "leg_r" ], @@ -985,8 +985,8 @@ "armor": [ { "material": [ - { "type": "tempered_steel", "covered_by_mat": 95, "thickness": 5.0 }, - { "type": "tempered_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "qt_steel", "covered_by_mat": 95, "thickness": 4.8 }, + { "type": "qt_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "torso" ], @@ -995,8 +995,8 @@ }, { "material": [ - { "type": "tempered_steel", "covered_by_mat": 95, "thickness": 1.25 }, - { "type": "tempered_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "qt_steel", "covered_by_mat": 95, "thickness": 1.05 }, + { "type": "qt_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "arm_l", "arm_r" ], @@ -1005,8 +1005,8 @@ }, { "material": [ - { "type": "tempered_steel", "covered_by_mat": 95, "thickness": 1.25 }, - { "type": "tempered_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "qt_steel", "covered_by_mat": 95, "thickness": 1.05 }, + { "type": "qt_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "leg_l", "leg_r" ], @@ -1275,28 +1275,25 @@ "type": "ARMOR", "category": "armor", "name": { "str": "chainmail hauberk" }, - "description": "A fully customized chainmail outfit, leaving the head uncovered. The shirt, arms, and leggings have been modified with straps and combined with a gambeson to deal with uneven weight distribution, cold environments and to allow them to be used separately.", + "description": "A fully customized chainmail outfit, leaving the head uncovered. Combine with a gambeson or other padded layer for optimal protection.", "weight": "14430 g", "volume": "2750 ml", "price": 35988, "price_postapoc": 3000, "to_hit": -1, - "material": [ "steel", "cotton" ], "symbol": "[", "looks_like": "armor_blarmor", "color": "light_red", - "warmth": 50, - "material_thickness": 6, + "warmth": 0, "flags": [ "VARSIZE", "STURDY", "OUTER" ], - "armor": [ { "encumbrance": 20, "coverage": 95, "covers": [ "torso", "leg_l", "leg_r", "arm_l", "arm_r" ] } ] - }, - { - "id": "kevlar_chainmail_hauberk", - "type": "ARMOR", - "name": { "str": "Kevlar chainmail hauberk" }, - "description": "A fully customized chainmail outfit, leaving the head uncovered. The shirt, arms, and leggings have been modified with straps and combined with a kevlar gambeson to deal with uneven weight distribution, cold environments and to allow them to be used separately.", - "copy-from": "chainmail_hauberk", - "material": [ { "type": "steel", "portion": 5 }, { "type": "kevlar_layered", "portion": 3 }, { "type": "kevlar", "portion": 2 } ] + "armor": [ + { + "material": [ { "type": "steel", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "torso", "leg_l", "leg_r", "arm_l", "arm_r" ], + "coverage": 95, + "encumbrance": 20 + } + ] }, { "id": "xl_chainmail_hauberk", @@ -1316,52 +1313,195 @@ "flags": [ "VARSIZE", "STURDY", "OUTER", "UNDERSIZE" ] }, { - "id": "xl_kevlar_chainmail_hauberk", + "id": "lc_chainmail_hauberk", "type": "ARMOR", - "name": { "str": "XL Kevlar chainmail hauberk" }, - "copy-from": "kevlar_chainmail_hauberk", + "category": "armor", + "name": { "str": "low steel chainmail hauberk" }, + "description": "A fully customized low steel chainmail outfit, leaving the head uncovered. Combine with a gambeson or other padded layer for optimal protection.", + "weight": "14430 g", + "volume": "2750 ml", + "price": 35988, + "price_postapoc": 3000, + "to_hit": -1, + "symbol": "[", + "looks_like": "armor_blarmor", + "color": "light_red", + "warmth": 0, + "flags": [ "VARSIZE", "STURDY", "OUTER" ], + "armor": [ + { + "material": [ { "type": "lc_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "torso", "leg_l", "leg_r", "arm_l", "arm_r" ], + "coverage": 95, + "encumbrance": 20 + } + ] + }, + { + "id": "xl_lc_chainmail_hauberk", + "type": "ARMOR", + "name": { "str": "XL low steel chainmail hauberk" }, + "copy-from": "lc_chainmail_hauberk", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, "extend": { "flags": [ "OVERSIZE" ] } }, { - "id": "kevlar_chainmail_hauberk_xs", + "id": "lc_chainmail_hauberk_xs", "type": "ARMOR", - "copy-from": "kevlar_chainmail_hauberk", - "looks_like": "kevlar_chainmail_hauberk", - "name": { "str": "XS kevlar chainmail hauberk" }, + "copy-from": "lc_chainmail_hauberk", + "name": { "str": "XS low steel chainmail hauberk" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "flags": [ "UNDERSIZE" ] + "extend": { "flags": [ "UNDERSIZE" ] } + }, + { + "id": "mc_chainmail_hauberk", + "type": "ARMOR", + "copy-from": "lc_chainmail_hauberk", + "name": { "str": "medium steel chainmail hauberk" }, + "description": "A fully customized medium steel chainmail outfit, leaving the head uncovered. Combine with a gambeson or other padded layer for optimal protection.", + "armor": [ + { + "material": [ { "type": "mc_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "torso", "leg_l", "leg_r", "arm_l", "arm_r" ], + "coverage": 95, + "encumbrance": 20 + } + ] + }, + { + "id": "xl_mc_chainmail_hauberk", + "type": "ARMOR", + "name": { "str": "XL medium steel chainmail hauberk" }, + "copy-from": "mc_chainmail_hauberk", + "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "mc_chainmail_hauberk_xs", + "type": "ARMOR", + "copy-from": "mc_chainmail_hauberk", + "looks_like": "mc_chainmail_hauberk", + "name": { "str": "XS medium steel chainmail hauberk" }, + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "UNDERSIZE" ] } + }, + { + "id": "hc_chainmail_hauberk", + "type": "ARMOR", + "copy-from": "lc_chainmail_hauberk", + "name": { "str": "high steel chainmail hauberk" }, + "description": "A fully customized high steel chainmail outfit, leaving the head uncovered. Combine with a gambeson or other padded layer for optimal protection.", + "armor": [ + { + "material": [ { "type": "hc_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "torso", "leg_l", "leg_r", "arm_l", "arm_r" ], + "coverage": 95, + "encumbrance": 20 + } + ] + }, + { + "id": "xl_hc_chainmail_hauberk", + "type": "ARMOR", + "name": { "str": "XL high steel chainmail hauberk" }, + "copy-from": "hc_chainmail_hauberk", + "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "hc_chainmail_hauberk_xs", + "type": "ARMOR", + "copy-from": "hc_chainmail_hauberk", + "name": { "str": "XS high steel chainmail hauberk" }, + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "UNDERSIZE" ] } + }, + { + "id": "ch_chainmail_hauberk", + "type": "ARMOR", + "copy-from": "lc_chainmail_hauberk", + "name": { "str": "hardened steel chainmail hauberk" }, + "description": "A fully customized hardened steel chainmail outfit, leaving the head uncovered. Combine with a gambeson or other padded layer for optimal protection.", + "armor": [ + { + "material": [ { "type": "ch_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "torso", "leg_l", "leg_r", "arm_l", "arm_r" ], + "coverage": 95, + "encumbrance": 20 + } + ] + }, + { + "id": "xl_ch_chainmail_hauberk", + "type": "ARMOR", + "name": { "str": "XL hardened steel chainmail hauberk" }, + "copy-from": "ch_chainmail_hauberk", + "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "ch_chainmail_hauberk_xs", + "type": "ARMOR", + "copy-from": "ch_chainmail_hauberk", + "name": { "str": "XS hardened steel chainmail hauberk" }, + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "UNDERSIZE" ] } + }, + { + "id": "qt_chainmail_hauberk", + "type": "ARMOR", + "copy-from": "lc_chainmail_hauberk", + "name": { "str": "tempered steel chainmail hauberk" }, + "description": "A fully customized tempered steel chainmail outfit, leaving the head uncovered. Combine with a gambeson or other padded layer for optimal protection.", + "armor": [ + { + "material": [ { "type": "qt_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "torso", "leg_l", "leg_r", "arm_l", "arm_r" ], + "coverage": 95, + "encumbrance": 20 + } + ] + }, + { + "id": "xl_qt_chainmail_hauberk", + "type": "ARMOR", + "name": { "str": "XL tempered steel chainmail hauberk" }, + "copy-from": "qt_chainmail_hauberk", + "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "qt_chainmail_hauberk_xs", + "type": "ARMOR", + "copy-from": "qt_chainmail_hauberk", + "name": { "str": "XS tempered steel chainmail hauberk" }, + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "UNDERSIZE" ] } }, { "id": "chainmail_suit", "type": "ARMOR", "category": "armor", "name": { "str": "chainmail armor" }, - "description": "A fully customized chainmail suit. The coif, shirt, arms, and leggings have been modified with straps and combined with a gambeson to deal with uneven weight distribution, cold environments and to allow them to be used separately.", + "description": "A fully customized chainmail suit. Combine with a gambeson or other padded layer for optimal protection.", "weight": "16436 g", "volume": "3250 ml", "price": 45000, "price_postapoc": 8000, "to_hit": -1, - "material": [ "steel", "cotton" ], "symbol": "[", "looks_like": "touring_suit", "color": "light_red", - "warmth": 50, - "material_thickness": 5, + "warmth": 0, "flags": [ "VARSIZE", "STURDY", "HELMET_COMPAT", "OUTER" ], - "armor": [ { "encumbrance": 20, "coverage": 95, "covers": [ "head", "torso", "leg_l", "leg_r", "arm_l", "arm_r" ] } ] - }, - { - "id": "kevlar_chainmail_suit", - "type": "ARMOR", - "name": { "str": "Kevlar chainmail armor" }, - "description": "A fully customized chainmail suit. The shirt, arms, and leggings have been modified with straps and combined with a kevlar gambeson to deal with uneven weight distribution, cold environments and to allow them to be used separately.", - "copy-from": "chainmail_suit", - "material_thickness": 6, - "material": [ { "type": "steel", "portion": 5 }, { "type": "kevlar_layered", "portion": 3 }, { "type": "kevlar", "portion": 2 } ], - "armor": [ { "encumbrance": 20, "coverage": 95, "covers": [ "head", "torso", "leg_l", "leg_r", "arm_l", "arm_r" ] } ], - "flags": [ "VARSIZE", "STURDY", "HELMET_COMPAT", "OUTER", "NONCONDUCTIVE" ] + "armor": [ + { + "material": [ { "type": "steel", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "head", "torso", "leg_l", "leg_r", "arm_l", "arm_r" ], + "coverage": 95, + "encumbrance": 20 + } + ] }, { "id": "xl_chainmail_suit", @@ -1381,43 +1521,182 @@ "flags": [ "VARSIZE", "STURDY", "HELMET_COMPAT", "OUTER", "UNDERSIZE" ] }, { - "id": "xl_kevlar_chainmail_suit", + "id": "lc_chainmail_suit", "type": "ARMOR", - "name": { "str": "XL kevlar chainmail armor" }, - "copy-from": "kevlar_chainmail_suit", + "category": "armor", + "name": { "str": "low steel chainmail armor" }, + "description": "A fully customized low steel chainmail suit. Combine with a gambeson or other padded layer for optimal protection.", + "weight": "16436 g", + "volume": "3250 ml", + "price": 45000, + "price_postapoc": 8000, + "to_hit": -1, + "symbol": "[", + "looks_like": "touring_suit", + "color": "light_red", + "warmth": 0, + "flags": [ "VARSIZE", "STURDY", "HELMET_COMPAT", "OUTER" ], + "armor": [ + { + "material": [ { "type": "lc_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "head", "torso", "leg_l", "leg_r", "arm_l", "arm_r" ], + "coverage": 95, + "encumbrance": 20 + } + ] + }, + { + "id": "xl_lc_chainmail_suit", + "type": "ARMOR", + "name": { "str": "XL low steel chainmail armor" }, + "copy-from": "lc_chainmail_suit", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, "extend": { "flags": [ "OVERSIZE" ] } }, { - "id": "kevlar_chainmail_suit_xs", + "id": "lc_chainmail_suit_xs", "type": "ARMOR", - "copy-from": "kevlar_chainmail_suit", - "looks_like": "kevlar_chainmail_suit", - "name": { "str": "XS kevlar chainmail armor" }, + "copy-from": "lc_chainmail_suit", + "name": { "str": "XS low steel chainmail armor" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "flags": [ "VARSIZE", "STURDY", "HELMET_COMPAT", "OUTER", "NONCONDUCTIVE", "UNDERSIZE" ] + "extend": { "flags": [ "UNDERSIZE" ] } + }, + { + "id": "mc_chainmail_suit", + "type": "ARMOR", + "copy-from": "lc_chainmail_suit", + "name": { "str": "medium steel chainmail armor" }, + "description": "A fully customized medium steel chainmail suit. Combine with a gambeson or other padded layer for optimal protection.", + "armor": [ + { + "material": [ { "type": "mc_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "head", "torso", "leg_l", "leg_r", "arm_l", "arm_r" ], + "coverage": 95, + "encumbrance": 20 + } + ] + }, + { + "id": "xl_mc_chainmail_suit", + "type": "ARMOR", + "name": { "str": "XL medium steel chainmail armor" }, + "copy-from": "mc_chainmail_suit", + "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "mc_chainmail_suit_xs", + "type": "ARMOR", + "copy-from": "mc_chainmail_suit", + "name": { "str": "XS medium steel chainmail armor" }, + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "UNDERSIZE" ] } + }, + { + "id": "hc_chainmail_suit", + "type": "ARMOR", + "copy-from": "lc_chainmail_suit", + "name": { "str": "high steel chainmail armor" }, + "description": "A fully customized high steel chainmail suit. Combine with a gambeson or other padded layer for optimal protection.", + "armor": [ + { + "material": [ { "type": "hc_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "head", "torso", "leg_l", "leg_r", "arm_l", "arm_r" ], + "coverage": 95, + "encumbrance": 20 + } + ] + }, + { + "id": "xl_hc_chainmail_suit", + "type": "ARMOR", + "name": { "str": "XL high steel chainmail armor" }, + "copy-from": "hc_chainmail_suit", + "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "hc_chainmail_suit_xs", + "type": "ARMOR", + "copy-from": "hc_chainmail_suit", + "name": { "str": "XS high steel chainmail armor" }, + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "UNDERSIZE" ] } + }, + { + "id": "ch_chainmail_suit", + "type": "ARMOR", + "copy-from": "lc_chainmail_suit", + "name": { "str": "hardened steel chainmail armor" }, + "description": "A fully customized hardened steel chainmail suit. Combine with a gambeson or other padded layer for optimal protection.", + "armor": [ + { + "material": [ { "type": "ch_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "head", "torso", "leg_l", "leg_r", "arm_l", "arm_r" ], + "coverage": 95, + "encumbrance": 20 + } + ] + }, + { + "id": "xl_ch_chainmail_suit", + "type": "ARMOR", + "name": { "str": "XL hardened steel chainmail armor" }, + "copy-from": "ch_chainmail_suit", + "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "ch_chainmail_suit_xs", + "type": "ARMOR", + "copy-from": "ch_chainmail_suit", + "name": { "str": "XS hardened steel chainmail armor" }, + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "UNDERSIZE" ] } + }, + { + "id": "qt_chainmail_suit", + "type": "ARMOR", + "copy-from": "lc_chainmail_suit", + "name": { "str": "tempered steel chainmail armor" }, + "description": "A fully customized tempered steel chainmail suit. Combine with a gambeson or other padded layer for optimal protection.", + "armor": [ + { + "material": [ { "type": "qt_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "head", "torso", "leg_l", "leg_r", "arm_l", "arm_r" ], + "coverage": 95, + "encumbrance": 20 + } + ] + }, + { + "id": "xl_qt_chainmail_suit", + "type": "ARMOR", + "name": { "str": "XL tempered steel chainmail armor" }, + "copy-from": "qt_chainmail_suit", + "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "qt_chainmail_suit_xs", + "type": "ARMOR", + "copy-from": "qt_chainmail_suit", + "name": { "str": "XS tempered steel chainmail armor" }, + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "UNDERSIZE" ] } }, { "id": "chainmail_suit_faraday", "type": "ARMOR", - "category": "armor", + "copy-from": "lc_chainmail_suit", "name": { "str": "faraday chainmail suit" }, "description": "A fully customized chainmail suit that can be worn over your normal clothing. The suit is conductively interconnected, protecting against electricity.", - "weight": "23335 g", - "volume": "3500 ml", - "price": 35000, - "price_postapoc": 9000, - "to_hit": -1, - "material": [ "steel", "cotton" ], - "symbol": "[", - "color": "light_red", - "material_thickness": 3, - "flags": [ "VARSIZE", "STURDY", "HELMET_COMPAT", "ELECTRIC_IMMUNE", "OUTER" ], "armor": [ { - "encumbrance": 30, + "material": [ { "type": "lc_steel", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "torso", "head", "arm_l", "arm_r", "hand_l", "hand_r", "leg_l", "leg_r", "foot_l", "foot_r", "mouth", "eyes" ], "coverage": 100, - "covers": [ "torso", "head", "arm_l", "arm_r", "hand_l", "hand_r", "leg_l", "leg_r", "foot_l", "foot_r", "mouth", "eyes" ] + "encumbrance": 30 } ] }, @@ -2145,6 +2424,7 @@ }, { "id": "mil_flight_suit", + "repairs_like": "nomex_suit", "type": "ARMOR", "name": { "str": "military flight suit" }, "description": "A sage-green US military flight suit. It has various insignia embroidered onto it.", @@ -2209,6 +2489,7 @@ }, { "id": "mil_flight_suit", + "repairs_like": "nomex_suit", "type": "ARMOR", "name": { "str": "military flight suit" }, "description": "A sage-green US military flight suit. It has various insignia embroidered onto it.", diff --git a/data/json/items/armor/torso_armor.json b/data/json/items/armor/torso_armor.json index 71bdd77498c48..bfe33ea7cb285 100644 --- a/data/json/items/armor/torso_armor.json +++ b/data/json/items/armor/torso_armor.json @@ -214,13 +214,18 @@ "price": 10000, "price_postapoc": 2000, "to_hit": -1, - "material": [ "steel", "cotton" ], "symbol": "[", "looks_like": "vest_leather", "color": "light_red", - "material_thickness": 3, "flags": [ "VARSIZE", "STURDY" ], - "armor": [ { "encumbrance": 20, "coverage": 95, "covers": [ "torso" ] } ] + "armor": [ + { + "material": [ { "type": "steel", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "torso" ], + "coverage": 95, + "encumbrance": 20 + } + ] }, { "id": "xl_chainmail_vest", @@ -234,18 +239,212 @@ "id": "xs_chainmail_vest", "type": "ARMOR", "copy-from": "chainmail_vest", - "looks_like": "chainmail_vest", "name": { "str": "XS chainmail vest" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, "flags": [ "VARSIZE", "STURDY", "UNDERSIZE" ] }, + { + "id": "lc_chainmail_vest", + "type": "ARMOR", + "category": "armor", + "name": { "str": "mild steel chainmail vest" }, + "description": "A customized mild steel chainmail vest. It's a sleeveless piece of chainmail with small straps designed to better distribute the weight.", + "weight": "6953 g", + "volume": "1 L", + "price": 10000, + "price_postapoc": 2000, + "to_hit": -1, + "symbol": "[", + "looks_like": "vest_leather", + "color": "light_red", + "flags": [ "VARSIZE", "STURDY", "OUTER" ], + "armor": [ + { + "material": [ { "type": "lc_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "torso" ], + "coverage": 95, + "encumbrance": 20 + } + ] + }, + { + "id": "xl_lc_chainmail_vest", + "type": "ARMOR", + "name": { "str": "XL mild steel chainmail vest" }, + "copy-from": "lc_chainmail_vest", + "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "xs_lc_chainmail_vest", + "type": "ARMOR", + "copy-from": "lc_chainmail_vest", + "name": { "str": "XS mild steel chainmail vest" }, + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "UNDERSIZE" ] } + }, + { + "id": "mc_chainmail_vest", + "type": "ARMOR", + "copy-from": "lc_chainmail_vest", + "name": { "str": "medium steel chainmail vest" }, + "description": "A customized medium steel chainmail vest. It's a sleeveless piece of chainmail with small straps designed to better distribute the weight.", + "armor": [ + { + "material": [ { "type": "mc_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "torso" ], + "coverage": 95, + "encumbrance": 20 + } + ] + }, + { + "id": "xl_mc_chainmail_vest", + "type": "ARMOR", + "name": { "str": "XL medium steel chainmail vest" }, + "copy-from": "mc_chainmail_vest", + "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "xs_mc_chainmail_vest", + "type": "ARMOR", + "copy-from": "mc_chainmail_vest", + "name": { "str": "XS medium steel chainmail vest" }, + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "UNDERSIZE" ] } + }, + { + "id": "hc_chainmail_vest", + "type": "ARMOR", + "copy-from": "lc_chainmail_vest", + "name": { "str": "high steel chainmail vest" }, + "description": "A customized high steel chainmail vest. It's a sleeveless piece of chainmail with small straps designed to better distribute the weight.", + "armor": [ + { + "material": [ { "type": "hc_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "torso" ], + "coverage": 95, + "encumbrance": 20 + } + ] + }, + { + "id": "xl_hc_chainmail_vest", + "type": "ARMOR", + "name": { "str": "XL high steel chainmail vest" }, + "copy-from": "hc_chainmail_vest", + "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "xs_hc_chainmail_vest", + "type": "ARMOR", + "copy-from": "hc_chainmail_vest", + "name": { "str": "XS high steel chainmail vest" }, + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "UNDERSIZE" ] } + }, + { + "id": "ch_chainmail_vest", + "type": "ARMOR", + "copy-from": "lc_chainmail_vest", + "name": { "str": "hardened steel chainmail vest" }, + "description": "A customized high steel chainmail vest. It's a sleeveless piece of chainmail with small straps designed to better distribute the weight.", + "armor": [ + { + "material": [ { "type": "ch_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "torso" ], + "coverage": 95, + "encumbrance": 20 + } + ] + }, + { + "id": "xl_ch_chainmail_vest", + "type": "ARMOR", + "name": { "str": "XL hardened steel chainmail vest" }, + "copy-from": "ch_chainmail_vest", + "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "xs_ch_chainmail_vest", + "type": "ARMOR", + "copy-from": "ch_chainmail_vest", + "name": { "str": "XS hardened steel chainmail vest" }, + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "UNDERSIZE" ] } + }, + { + "id": "ch_chainmail_vest", + "type": "ARMOR", + "copy-from": "lc_chainmail_vest", + "name": { "str": "hardened steel chainmail vest" }, + "description": "A customized hardened steel chainmail vest. It's a sleeveless piece of chainmail with small straps designed to better distribute the weight.", + "armor": [ + { + "material": [ { "type": "ch_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "torso" ], + "coverage": 95, + "encumbrance": 20 + } + ] + }, + { + "id": "xl_hc_chainmail_vest", + "type": "ARMOR", + "name": { "str": "XL hardened steel chainmail vest" }, + "copy-from": "hc_chainmail_vest", + "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "xs_hc_chainmail_vest", + "type": "ARMOR", + "copy-from": "hc_chainmail_vest", + "name": { "str": "XS hardened steel chainmail vest" }, + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "UNDERSIZE" ] } + }, + { + "id": "qt_chainmail_vest", + "type": "ARMOR", + "copy-from": "lc_chainmail_vest", + "name": { "str": "tempered steel chainmail vest" }, + "description": "A customized tempered steel chainmail vest. It's a sleeveless piece of chainmail with small straps designed to better distribute the weight.", + "armor": [ + { + "material": [ { "type": "qt_steel_chain", "covered_by_mat": 95, "thickness": 1.2 } ], + "covers": [ "torso" ], + "coverage": 95, + "encumbrance": 20 + } + ] + }, + { + "id": "xl_qt_chainmail_vest", + "type": "ARMOR", + "name": { "str": "XL tempered steel chainmail vest" }, + "copy-from": "qt_chainmail_vest", + "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "xs_qt_chainmail_vest", + "type": "ARMOR", + "copy-from": "qt_chainmail_vest", + "name": { "str": "XS tempered steel chainmail vest" }, + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "UNDERSIZE" ] } + }, { "id": "chestguard_hard", "repairs_like": "armor_larmor", "type": "ARMOR", "category": "armor", "name": { "str": "hard chest guard" }, - "description": "A plastron of interlocking plastic plate protecting your torso.", + "description": "A solid vest of plastic padding protecting your torso.", "weight": "1000 g", "volume": "7 L", "price": 60000, @@ -257,10 +456,10 @@ "color": "dark_gray", "warmth": 20, "longest_side": "20 cm", - "material_thickness": 3, + "material_thickness": 4, "environmental_protection": 1, "flags": [ "WATER_FRIENDLY", "STURDY", "OUTER" ], - "armor": [ { "encumbrance": 20, "coverage": 90, "covers": [ "torso" ] } ] + "armor": [ { "encumbrance": 4, "coverage": 90, "covers": [ "torso" ] } ] }, { "id": "cuirass_lightplate", @@ -728,8 +927,8 @@ "armor": [ { "material": [ - { "type": "low_steel", "covered_by_mat": 95, "thickness": 1.0 }, - { "type": "low_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "lc_steel", "covered_by_mat": 95, "thickness": 0.8 }, + { "type": "lc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "torso" ], @@ -755,8 +954,8 @@ "armor": [ { "material": [ - { "type": "med_steel", "covered_by_mat": 95, "thickness": 1.0 }, - { "type": "med_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "mc_steel", "covered_by_mat": 95, "thickness": 0.8 }, + { "type": "mc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "torso" ], @@ -782,8 +981,8 @@ "armor": [ { "material": [ - { "type": "high_steel", "covered_by_mat": 95, "thickness": 1.0 }, - { "type": "high_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "hc_steel", "covered_by_mat": 95, "thickness": 0.8 }, + { "type": "hc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "torso" ], @@ -809,8 +1008,8 @@ "armor": [ { "material": [ - { "type": "case_hardened_steel", "covered_by_mat": 95, "thickness": 1.0 }, - { "type": "case_hardened_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "ch_steel", "covered_by_mat": 95, "thickness": 0.8 }, + { "type": "ch_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "torso" ], @@ -836,8 +1035,8 @@ "armor": [ { "material": [ - { "type": "tempered_steel", "covered_by_mat": 95, "thickness": 1.0 }, - { "type": "tempered_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "qt_steel", "covered_by_mat": 95, "thickness": 0.8 }, + { "type": "qt_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "torso" ], @@ -876,8 +1075,8 @@ "armor": [ { "material": [ - { "type": "low_steel", "covered_by_mat": 95, "thickness": 3.0 }, - { "type": "low_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "lc_steel", "covered_by_mat": 95, "thickness": 2.8 }, + { "type": "lc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "torso" ], @@ -903,8 +1102,8 @@ "armor": [ { "material": [ - { "type": "med_steel", "covered_by_mat": 95, "thickness": 3.0 }, - { "type": "med_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "mc_steel", "covered_by_mat": 95, "thickness": 2.8 }, + { "type": "mc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "torso" ], @@ -930,8 +1129,8 @@ "armor": [ { "material": [ - { "type": "high_steel", "covered_by_mat": 95, "thickness": 3.0 }, - { "type": "high_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "hc_steel", "covered_by_mat": 95, "thickness": 2.8 }, + { "type": "hc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "torso" ], @@ -957,8 +1156,8 @@ "armor": [ { "material": [ - { "type": "case_hardened_steel", "covered_by_mat": 95, "thickness": 3.0 }, - { "type": "case_hardened_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "ch_steel", "covered_by_mat": 95, "thickness": 2.8 }, + { "type": "ch_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "torso" ], @@ -984,8 +1183,8 @@ "armor": [ { "material": [ - { "type": "tempered_steel", "covered_by_mat": 95, "thickness": 3.0 }, - { "type": "tempered_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "qt_steel", "covered_by_mat": 95, "thickness": 2.8 }, + { "type": "qt_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "torso" ], @@ -1024,8 +1223,8 @@ "armor": [ { "material": [ - { "type": "low_steel", "covered_by_mat": 95, "thickness": 5.0 }, - { "type": "low_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "lc_steel", "covered_by_mat": 95, "thickness": 4.8 }, + { "type": "lc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "torso" ], @@ -1051,8 +1250,8 @@ "armor": [ { "material": [ - { "type": "med_steel", "covered_by_mat": 95, "thickness": 5.0 }, - { "type": "med_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "mc_steel", "covered_by_mat": 95, "thickness": 4.8 }, + { "type": "mc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "torso" ], @@ -1078,8 +1277,8 @@ "armor": [ { "material": [ - { "type": "high_steel", "covered_by_mat": 95, "thickness": 5.0 }, - { "type": "high_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "hc_steel", "covered_by_mat": 95, "thickness": 4.8 }, + { "type": "hc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "torso" ], @@ -1105,8 +1304,8 @@ "armor": [ { "material": [ - { "type": "case_hardened_steel", "covered_by_mat": 95, "thickness": 5.0 }, - { "type": "case_hardened_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "ch_steel", "covered_by_mat": 95, "thickness": 4.8 }, + { "type": "ch_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "torso" ], @@ -1132,8 +1331,8 @@ "armor": [ { "material": [ - { "type": "tempered_steel", "covered_by_mat": 95, "thickness": 5.0 }, - { "type": "tempered_steel", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "qt_steel", "covered_by_mat": 95, "thickness": 4.8 }, + { "type": "qt_steel_chain", "covered_by_mat": 100, "thickness": 1.2 }, { "type": "leather", "covered_by_mat": 1, "thickness": 1.0 } ], "covers": [ "torso" ], diff --git a/data/json/items/armor/torso_clothes.json b/data/json/items/armor/torso_clothes.json index 2f8577035e6f3..ee8ccb348fbe5 100644 --- a/data/json/items/armor/torso_clothes.json +++ b/data/json/items/armor/torso_clothes.json @@ -100,7 +100,7 @@ }, { "id": "combat_shirt", - "repairs_like": "jacket_army_modern", + "repairs_like": "trenchcoat", "type": "ARMOR", "name": { "str_sp": "combat shirt" }, "description": "An oddly balanced long-sleeved shirt with a thin, moisture wicking torso and thicker arms more appropriate for a jacket. The arms are covered in a camouflage pattern and have two shoulder pockets. It has a pocket for your pen!", diff --git a/data/json/items/book/fabrication.json b/data/json/items/book/fabrication.json index d9f673b71bb73..819fab1eaa57d 100644 --- a/data/json/items/book/fabrication.json +++ b/data/json/items/book/fabrication.json @@ -573,5 +573,23 @@ "max_level": 4, "intelligence": 9, "time": "30 m" + }, + { + "id": "recipe_migo_plate", + "type": "BOOK", + "category": "manuals", + "name": { "str": "WX010 Living Armor Observations", "str_pl": "copies of WX010 Living Armor Observations" }, + "description": "This sheaf of papers seems to describe maintenance on a new form of ballistic armor. \"the regenerative plates though promising for field use do require maintenance or combat to stop from becoming overgrown\".", + "weight": "50 g", + "volume": "500 ml", + "price": 125000, + "price_postapoc": 10, + "material": [ "paper" ], + "symbol": "?", + "color": "blue", + "skill": "fabrication", + "required_level": 1, + "intelligence": 8, + "time": "15 m" } ] diff --git a/data/json/items/comestibles/alcohol.json b/data/json/items/comestibles/alcohol.json index 339c98af040e0..bd2d41132efe0 100644 --- a/data/json/items/comestibles/alcohol.json +++ b/data/json/items/comestibles/alcohol.json @@ -704,7 +704,7 @@ "flags": [ "EATEN_COLD" ], "freezing_point": -34, "fun": 20, - "vitamins": [ [ "vitA", 2 ], [ "vitC", 118 ], [ "calcium", 2 ], [ "iron", 1 ] ] + "vitamins": [ [ "vitC", 118 ], [ "calcium", 2 ], [ "iron", 1 ] ] }, { "type": "COMESTIBLE", @@ -1498,7 +1498,7 @@ "charges": 2, "flags": [ "EATEN_COLD", "EATEN_HOT", "FREEZERBURN" ], "fun": 20, - "vitamins": [ [ "vitA", 5 ], [ "vitC", 3 ], [ "calcium", 12 ], [ "iron", 2 ] ], + "vitamins": [ [ "vitC", 3 ], [ "calcium", 12 ], [ "iron", 2 ] ], "freezing_point": -11 }, { @@ -1556,7 +1556,7 @@ "flags": [ "EATEN_COLD" ], "freezing_point": -34, "fun": 25, - "vitamins": [ [ "vitA", 2 ], [ "vitC", 23 ], [ "calcium", 1 ], [ "iron", 2 ] ] + "vitamins": [ [ "vitC", 23 ], [ "calcium", 1 ], [ "iron", 2 ] ] }, { "type": "COMESTIBLE", diff --git a/data/json/items/comestibles/bread.json b/data/json/items/comestibles/bread.json index fadde78e2233b..90a52cc9be7e4 100644 --- a/data/json/items/comestibles/bread.json +++ b/data/json/items/comestibles/bread.json @@ -215,7 +215,7 @@ "charges": 14, "flags": [ "EATEN_HOT" ], "fun": 3, - "vitamins": [ [ "vitA", 1 ], [ "vitB", 3 ], [ "calcium", 2 ], [ "iron", 14 ] ] + "vitamins": [ [ "calcium", 2 ], [ "iron", 14 ] ] }, { "type": "COMESTIBLE", @@ -245,7 +245,7 @@ "name": { "str_sp": "buttered toast" }, "copy-from": "toast", "description": "Toast with butter spread on top to make it taste better.", - "relative": { "calories": 101, "fun": 4, "vitamins": [ [ "vitA", 7 ], [ "vitB", 3 ] ] } + "relative": { "calories": 101, "fun": 4 } }, { "type": "COMESTIBLE", @@ -253,7 +253,7 @@ "name": { "str_sp": "wheat-free buttered toast" }, "copy-from": "toast_wheat_free", "description": "Wheat-free toast with butter spread on top to make it taste better.", - "relative": { "calories": 101, "fun": 4, "vitamins": [ [ "vitA", 7 ], [ "vitB", 3 ] ] } + "relative": { "calories": 101, "fun": 4 } }, { "type": "COMESTIBLE", @@ -295,12 +295,7 @@ "name": { "str_sp": "toad in a hole" }, "copy-from": "toast", "description": "A cooked egg served inside a piece of toast.", - "relative": { - "calories": 80, - "fun": 4, - "flags": [ "FREEZERBURN" ], - "vitamins": [ [ "iron", 4 ], [ "vitB", 21 ], [ "vitA", 9 ], [ "calcium", 3 ] ] - } + "relative": { "calories": 80, "fun": 4, "flags": [ "FREEZERBURN" ], "vitamins": [ [ "iron", 4 ], [ "calcium", 3 ] ] } }, { "type": "COMESTIBLE", @@ -308,12 +303,7 @@ "name": { "str_sp": "wheat-free toad in a hole" }, "copy-from": "toast_wheat_free", "description": "A cooked egg served inside a piece of wheat-free toast.", - "relative": { - "calories": 80, - "fun": 4, - "flags": [ "FREEZERBURN" ], - "vitamins": [ [ "iron", 4 ], [ "vitB", 21 ], [ "vitA", 9 ], [ "calcium", 3 ] ] - } + "relative": { "calories": 80, "fun": 4, "flags": [ "FREEZERBURN" ], "vitamins": [ [ "iron", 4 ], [ "calcium", 3 ] ] } }, { "type": "COMESTIBLE", @@ -321,7 +311,7 @@ "name": { "str_sp": "PBJ Toast" }, "copy-from": "toast_wheat_free", "description": "A slice of toast with peanut butter and jelly on top of it with added butter for flavor.", - "relative": { "calories": 326, "fun": 7, "vitamins": [ [ "iron", 6 ], [ "vitB", 3 ], [ "vitA", 7 ], [ "vitC", 2 ] ] } + "relative": { "calories": 326, "fun": 7, "vitamins": [ [ "iron", 6 ], [ "vitC", 2 ] ] } }, { "type": "COMESTIBLE", @@ -329,7 +319,7 @@ "name": { "str_sp": "wheat-free PBJ Toast" }, "copy-from": "toast_wheat_free", "description": "A slice of wheat-free toast with peanut butter and jelly on top of it with added butter for flavor.", - "relative": { "calories": 326, "fun": 7, "vitamins": [ [ "iron", 6 ], [ "vitB", 3 ], [ "vitA", 7 ], [ "vitC", 2 ] ] } + "relative": { "calories": 326, "fun": 7, "vitamins": [ [ "iron", 6 ], [ "vitC", 2 ] ] } }, { "type": "COMESTIBLE", @@ -352,7 +342,7 @@ "charges": 6, "flags": [ "EATEN_HOT" ], "fun": 2, - "vitamins": [ [ "vitA", 2 ], [ "calcium", 8 ], [ "iron", 6 ] ] + "vitamins": [ [ "calcium", 8 ], [ "iron", 6 ] ] }, { "type": "COMESTIBLE", @@ -373,7 +363,7 @@ "charges": 6, "flags": [ "EATEN_HOT" ], "fun": 2, - "vitamins": [ [ "vitA", 1 ], [ "calcium", 4 ], [ "iron", 7 ] ] + "vitamins": [ [ "calcium", 4 ], [ "iron", 7 ] ] }, { "type": "COMESTIBLE", @@ -439,7 +429,7 @@ "charges": 10, "flags": [ "EATEN_HOT", "EDIBLE_FROZEN" ], "fun": 3, - "vitamins": [ [ "vitA", 1 ], [ "calcium", 11 ], [ "iron", 9 ] ] + "vitamins": [ [ "calcium", 11 ], [ "iron", 9 ] ] }, { "type": "COMESTIBLE", diff --git a/data/json/items/comestibles/brewing.json b/data/json/items/comestibles/brewing.json index 628a1c3ef8eab..7b9e1d468bc1a 100644 --- a/data/json/items/comestibles/brewing.json +++ b/data/json/items/comestibles/brewing.json @@ -680,7 +680,7 @@ "material": [ "veggy" ], "volume": "250 ml", "flags": [ "EDIBLE_FROZEN", "RAW" ], - "vitamins": [ [ "vitA", 33 ], [ "vitC", 23 ], [ "calcium", 11 ], [ "iron", 10 ] ], + "vitamins": [ [ "vitC", 23 ], [ "calcium", 11 ], [ "iron", 10 ] ], "fun": -4 } ] diff --git a/data/json/items/comestibles/carnivore.json b/data/json/items/comestibles/carnivore.json index 8cf98b2175451..4edff7a8645a7 100644 --- a/data/json/items/comestibles/carnivore.json +++ b/data/json/items/comestibles/carnivore.json @@ -25,7 +25,7 @@ "spoils_in": "12 hours", "flags": [ "SMOKABLE", "RAW" ], "smoking_result": "fish_smoked", - "vitamins": [ [ "vitA", 2 ], [ "vitC", 2 ], [ "calcium", 6 ], [ "iron", 14 ], [ "vitB", 154 ] ], + "vitamins": [ [ "vitC", 2 ], [ "calcium", 6 ], [ "iron", 14 ] ], "calories": 260 }, { @@ -119,7 +119,7 @@ "healthy": -1, "fun": -10, "cooks_like": "meat_cooked", - "vitamins": [ [ "calcium", 2 ], [ "iron", 12 ], [ "vitB", 80 ] ], + "vitamins": [ [ "calcium", 2 ], [ "iron", 12 ] ], "flags": [ "SMOKABLE", "RAW", "PREDATOR_FUN" ], "smoking_result": "meat_smoked" }, @@ -153,7 +153,7 @@ "calories": 1300, "healthy": -1, "fun": -10, - "vitamins": [ [ "vitC", 0 ], [ "calcium", 0 ], [ "iron", 0 ], [ "vitB", 0 ] ], + "vitamins": [ [ "vitC", 0 ], [ "calcium", 0 ], [ "iron", 0 ] ], "flags": [ "SMOKABLE", "RAW", "PREDATOR_FUN" ], "smoking_result": "meat_smoked" }, @@ -170,7 +170,7 @@ "price_postapoc": 300, "spoils_in": "14 days", "healthy": -5, - "vitamins": [ [ "vitA", 4 ], [ "vitC", 0 ], [ "calcium", 3 ], [ "iron", 22 ], [ "vitB", 136 ] ], + "vitamins": [ [ "vitC", 0 ], [ "calcium", 3 ], [ "iron", 22 ] ], "flags": [ "SMOKABLE", "RAW" ], "smoking_result": "bacon_uncut" }, @@ -188,7 +188,7 @@ "spoils_in": "24 days", "healthy": -1, "fun": 5, - "vitamins": [ [ "vitA", 4 ], [ "vitC", 0 ], [ "calcium", 3 ], [ "iron", 22 ], [ "vitB", 136 ] ], + "vitamins": [ [ "vitC", 0 ], [ "calcium", 3 ], [ "iron", 22 ] ], "flags": [ "EATEN_HOT", "SMOKED" ] }, { @@ -205,7 +205,7 @@ "spoils_in": "14 days", "healthy": -5, "fun": -15, - "vitamins": [ [ "vitA", 0 ], [ "vitC", 0 ], [ "calcium", 0 ], [ "iron", 0 ], [ "vitB", 0 ] ], + "vitamins": [ [ "vitC", 0 ], [ "calcium", 0 ], [ "iron", 0 ] ], "flags": [ ], "use_action": { "target": "raw_cured_fatty_meat", @@ -226,7 +226,7 @@ "cooks_like": "meat_scrap_cooked", "proportional": { "weight": 0.1, "volume": 0.1, "price": 0.1, "calories": 0.1 }, "delete": { "flags": [ "SMOKABLE" ] }, - "vitamins": [ [ "calcium", 0 ], [ "iron", 1 ], [ "vitB", 8 ] ] + "vitamins": [ [ "calcium", 0 ], [ "iron", 1 ] ] }, { "id": "mutant_meat", @@ -238,7 +238,7 @@ "looks_like": "meat", "cooks_like": "mutant_meat_cooked", "proportional": { "price": 0.2, "calories": 0.5 }, - "vitamins": [ [ "vitC", 2 ], [ "calcium", 1 ], [ "iron", 6 ], [ "vitB", 40 ], [ "mutant_toxin", 25 ] ], + "vitamins": [ [ "vitC", 2 ], [ "calcium", 1 ], [ "iron", 6 ], [ "mutant_toxin", 25 ] ], "flags": [ "SMOKABLE", "BAD_TASTE", "RAW", "PREDATOR_FUN" ] }, { @@ -380,7 +380,7 @@ "price_postapoc": 100, "parasites": 0, "calories": 402, - "vitamins": [ [ "calcium", 2 ], [ "iron", 12 ], [ "vitB", 80 ] ], + "vitamins": [ [ "calcium", 2 ], [ "iron", 12 ] ], "flags": [ "EATEN_HOT", "NUTRIENT_OVERRIDE" ] }, { @@ -449,7 +449,7 @@ "proportional": { "parasites": 2.0 }, "price_postapoc": 25, "delete": { "flags": [ "SMOKABLE" ] }, - "relative": { "vitamins": [ [ "vitA", 5 ], [ "iron", 4 ] ], "fun": -5 } + "relative": { "vitamins": [ [ "iron", 4 ] ], "fun": -5 } }, { "id": "offal_cooked", @@ -567,7 +567,7 @@ "quench": -5, "fun": 4, "calories": 348, - "vitamins": [ [ "vitA", 0 ], [ "vitC", 0 ], [ "calcium", 2 ], [ "iron", 26 ], [ "vitB", 35 ] ], + "vitamins": [ [ "vitC", 0 ], [ "calcium", 2 ], [ "iron", 26 ] ], "delete": { "flags": [ "RAW" ] } }, { @@ -636,7 +636,7 @@ "quench": 2, "fun": -10, "calories": 50, - "vitamins": [ [ "vitA", 0 ], [ "vitC", 9 ], [ "calcium", 0 ], [ "iron", 14 ], [ "vitB", 22 ] ], + "vitamins": [ [ "vitC", 9 ], [ "calcium", 0 ], [ "iron", 14 ] ], "extend": { "flags": [ "PREDATOR_FUN" ] } }, { @@ -693,7 +693,7 @@ "price_postapoc": 25, "quench": -4, "calories": 92, - "vitamins": [ [ "vitA", 635 ], [ "vitC", 0 ], [ "calcium", 1 ], [ "iron", 28 ], [ "vitB", 1632 ] ] + "vitamins": [ [ "vitC", 0 ], [ "calcium", 1 ], [ "iron", 28 ] ] }, { "id": "liver_cooked", @@ -739,7 +739,7 @@ "quench": 10, "parasites": 15, "calories": 78, - "vitamins": [ [ "vitA", 0 ], [ "vitC", 3 ], [ "calcium", 0 ], [ "iron", 10 ], [ "vitB", 233 ] ] + "vitamins": [ [ "vitC", 3 ], [ "calcium", 0 ], [ "iron", 10 ] ] }, { "id": "brain_cooked", @@ -785,7 +785,7 @@ "color": "brown", "price_postapoc": 25, "calories": 54, - "vitamins": [ [ "vitA", 0 ], [ "vitC", 0 ], [ "calcium", 1 ], [ "iron", 25 ], [ "vitB", 576 ] ] + "vitamins": [ [ "vitC", 0 ], [ "calcium", 1 ], [ "iron", 25 ] ] }, { "id": "kidney_cooked", @@ -833,7 +833,7 @@ "price_postapoc": 25, "quench": 0, "calories": 133, - "vitamins": [ [ "vitA", 0 ], [ "vitC", 11 ], [ "calcium", 0 ], [ "iron", 5 ], [ "vitB", 66 ] ] + "vitamins": [ [ "vitC", 11 ], [ "calcium", 0 ], [ "iron", 5 ] ] }, { "id": "sweetbread_cooked", @@ -1300,7 +1300,7 @@ "description": "The fleshy fronds harvested from an alien plant. Eating these membranous leaves and gut-like stems is likely a terrible idea, and yet they have a paradoxically pleasant and inviting sweet smell. Might be non-vegan.", "fun": 15, "stim": 3, - "vitamins": [ [ "vitA", 6 ], [ "vitC", 2 ], [ "calcium", 0 ], [ "iron", 8 ], [ "vitB", 6 ], [ "mutant_toxin", 8 ] ] + "vitamins": [ [ "vitC", 2 ], [ "calcium", 0 ], [ "iron", 8 ], [ "mutant_toxin", 8 ] ] }, { "id": "leech_flower", @@ -1336,7 +1336,7 @@ "name": { "str": "leech bark", "str_pl": "scraps of leech bark" }, "description": "Dry and tough bark matter harvested from an alien plant. It is slightly translucent, and if placed against the light you can distinguish glistening blue veins running through it.", "price_postapoc": 10, - "vitamins": [ [ "vitA", 6 ], [ "vitC", 0 ], [ "calcium", 2 ], [ "iron", 8 ], [ "vitB", 6 ], [ "mutant_toxin", 12 ] ] + "vitamins": [ [ "vitC", 0 ], [ "calcium", 2 ], [ "iron", 8 ], [ "mutant_toxin", 12 ] ] }, { "id": "demihuman_stomach", diff --git a/data/json/items/comestibles/cereal.json b/data/json/items/comestibles/cereal.json index 67bc16668a5d4..fc7cf9db4794e 100644 --- a/data/json/items/comestibles/cereal.json +++ b/data/json/items/comestibles/cereal.json @@ -19,7 +19,7 @@ "material": [ "wheat" ], "flags": [ "EDIBLE_FROZEN", "USE_EAT_VERB" ], "looks_like": "cereal", - "vitamins": [ [ "vitA", 10 ], [ "vitC", 7 ], [ "calcium", 7 ], [ "iron", 32 ] ], + "vitamins": [ [ "vitC", 7 ], [ "calcium", 7 ], [ "iron", 32 ] ], "fun": 8 }, { @@ -34,7 +34,7 @@ "charges": 6, "material": [ "foodplace_foodstuff" ], "looks_like": "cereal", - "vitamins": [ [ "vitA", 5 ], [ "vitC", 2 ], [ "calcium", 2 ], [ "iron", 16 ] ], + "vitamins": [ [ "vitC", 2 ], [ "calcium", 2 ], [ "iron", 16 ] ], "fun": 11, "addiction_potential": 5, "addiction_type": "caffeine", @@ -58,7 +58,7 @@ "description": "This is Foodplace brand \"Carpenter Crunch\" cereal with the iconic \"Breakfast Beaver\" mascot on the box. It tastes kind of like nails.", "material": [ "foodplace_foodstuff" ], "charges": 6, - "vitamins": [ [ "vitA", 2 ], [ "vitC", 2 ], [ "calcium", 2 ], [ "iron", 50 ] ], + "vitamins": [ [ "vitC", 2 ], [ "calcium", 2 ], [ "iron", 50 ] ], "fun": -1, "spoils_in": "540 days", "copy-from": "cereal_tpl" @@ -124,7 +124,7 @@ "charges": 4, "material": [ "junk" ], "volume": "250 ml", - "vitamins": [ [ "vitA", 21 ], [ "vitC", 17 ], [ "calcium", 13 ], [ "iron", 48 ] ], + "vitamins": [ [ "vitC", 17 ], [ "calcium", 13 ], [ "iron", 48 ] ], "fun": 10 }, { @@ -138,7 +138,7 @@ "price_postapoc": 600, "charges": 4, "flags": [ "EDIBLE_FROZEN" ], - "vitamins": [ [ "vitC", 2 ], [ "vitA", 2 ], [ "calcium", 2 ], [ "iron", 9 ] ], + "vitamins": [ [ "vitC", 2 ], [ "calcium", 2 ], [ "iron", 9 ] ], "copy-from": "cereal_tpl" }, { diff --git a/data/json/items/comestibles/dairy.json b/data/json/items/comestibles/dairy.json index 7ae92f3efe775..9e54793e05926 100644 --- a/data/json/items/comestibles/dairy.json +++ b/data/json/items/comestibles/dairy.json @@ -20,7 +20,7 @@ "volume": "250 ml", "phase": "liquid", "flags": [ "EATEN_COLD" ], - "vitamins": [ [ "vitA", 10 ], [ "vitB", 6 ], [ "vitC", 4 ], [ "calcium", 25 ] ], + "vitamins": [ [ "vitC", 4 ], [ "calcium", 25 ] ], "fun": 1 }, { @@ -90,7 +90,7 @@ "calories": 161, "description": "This is cultured milk defatted either due to churning or curdling. Spoils quickly.", "price": 1, - "vitamins": [ [ "vitA", 1 ], [ "vitB", 1 ], [ "vitC", 1 ], [ "calcium", 1 ] ] + "vitamins": [ [ "vitC", 1 ], [ "calcium", 1 ] ] }, { "type": "COMESTIBLE", @@ -111,7 +111,7 @@ "phase": "liquid", "flags": [ "FREEZERBURN" ], "fun": 15, - "vitamins": [ [ "vitA", 2 ], [ "vitB", 3 ], [ "vitC", 3 ], [ "calcium", 33 ], [ "iron", 1 ] ] + "vitamins": [ [ "vitC", 3 ], [ "calcium", 33 ], [ "iron", 1 ] ] }, { "type": "COMESTIBLE", @@ -131,7 +131,6 @@ "material": [ "milk" ], "volume": "500 ml", "charges": 32, - "vitamins": [ [ "vitA", 7 ], [ "vitB", 3 ] ], "fun": -1 }, { @@ -148,7 +147,7 @@ "price": 200, "price_postapoc": 500, "charges": 33, - "vitamins": [ [ "vitA", 7 ], [ "calcium", 3 ] ] + "vitamins": [ [ "calcium", 3 ] ] }, { "type": "COMESTIBLE", @@ -219,7 +218,7 @@ "price": 385, "price_postapoc": 150, "charges": 1, - "vitamins": [ [ "vitA", 5 ], [ "calcium", 32 ], [ "iron", 2 ] ], + "vitamins": [ [ "calcium", 32 ], [ "iron", 2 ] ], "fun": 5, "flags": [ "NUTRIENT_OVERRIDE" ] }, @@ -242,7 +241,7 @@ "volume": "250 ml", "charges": 8, "fun": 7, - "vitamins": [ [ "vitA", 8 ], [ "calcium", 16 ] ] + "vitamins": [ [ "calcium", 16 ] ] }, { "type": "COMESTIBLE", @@ -264,7 +263,7 @@ "volume": "250 ml", "flags": [ "EATEN_HOT" ], "fun": 6, - "vitamins": [ [ "vitA", 12 ], [ "calcium", 38 ], [ "iron", 10 ] ] + "vitamins": [ [ "calcium", 38 ], [ "iron", 10 ] ] }, { "type": "COMESTIBLE", @@ -286,7 +285,7 @@ "cooks_like": "milk", "flags": [ "EDIBLE_FROZEN" ], "charges": 4, - "vitamins": [ [ "vitA", 3 ], [ "vitB", 2 ], [ "vitC", 1 ], [ "calcium", 7 ] ], + "vitamins": [ [ "vitC", 1 ], [ "calcium", 7 ] ], "fun": -5, "freezing_point": -459 }, @@ -310,7 +309,7 @@ "volume": "500 ml", "phase": "liquid", "charges": 20, - "vitamins": [ [ "vitA", 2 ], [ "vitB", 1 ], [ "vitC", 1 ], [ "calcium", 7 ] ], + "vitamins": [ [ "vitC", 1 ], [ "calcium", 7 ] ], "fun": 3 }, { @@ -343,7 +342,7 @@ "material": [ "milk" ], "volume": "250 ml", "phase": "liquid", - "vitamins": [ [ "vitA", 2 ], [ "calcium", 7 ] ], + "vitamins": [ [ "calcium", 7 ] ], "flags": [ "NUTRIENT_OVERRIDE" ], "fun": 1 } diff --git a/data/json/items/comestibles/drink.json b/data/json/items/comestibles/drink.json index c6179f8f54351..cf64b96c26898 100644 --- a/data/json/items/comestibles/drink.json +++ b/data/json/items/comestibles/drink.json @@ -43,7 +43,7 @@ "material": [ "water", "nut" ], "volume": "250 ml", "phase": "liquid", - "vitamins": [ [ "vitA", 2 ], [ "calcium", 11 ] ], + "vitamins": [ [ "calcium", 11 ] ], "flags": [ "EATEN_COLD" ], "fun": 1 }, @@ -67,7 +67,7 @@ "material": [ "water", "veggy" ], "volume": "250 ml", "phase": "liquid", - "vitamins": [ [ "vitA", 2 ], [ "iron", 1 ], [ "calcium", 7 ] ], + "vitamins": [ [ "iron", 1 ], [ "calcium", 7 ] ], "flags": [ "EATEN_COLD" ], "fun": 1 }, @@ -197,7 +197,7 @@ "volume": "250 ml", "phase": "liquid", "flags": [ "EATEN_COLD" ], - "vitamins": [ [ "vitA", 9 ], [ "vitC", 8 ], [ "calcium", 18 ], [ "iron", 4 ] ], + "vitamins": [ [ "vitC", 8 ], [ "calcium", 18 ], [ "iron", 4 ] ], "fun": 7 }, { @@ -368,7 +368,7 @@ "volume": "250 ml", "phase": "liquid", "flags": [ "EATEN_COLD" ], - "vitamins": [ [ "vitA", 1 ], [ "vitC", 131 ], [ "calcium", 3 ], [ "iron", 1 ] ], + "vitamins": [ [ "vitC", 131 ], [ "calcium", 3 ], [ "iron", 1 ] ], "fun": -1 }, { @@ -457,7 +457,7 @@ "phase": "liquid", "charges": 2, "flags": [ "EATEN_COLD", "EATEN_HOT", "FREEZERBURN" ], - "vitamins": [ [ "vitA", 5 ], [ "vitC", 3 ], [ "calcium", 13 ], [ "iron", 2 ] ], + "vitamins": [ [ "vitC", 3 ], [ "calcium", 13 ], [ "iron", 2 ] ], "fun": 15 }, { @@ -787,7 +787,7 @@ "phase": "liquid", "charges": 2, "flags": [ "NO_AUTO_CONSUME" ], - "vitamins": [ [ "vitA", 5 ], [ "vitB", 3 ], [ "vitC", 2 ], [ "calcium", 12 ] ], + "vitamins": [ [ "vitC", 2 ], [ "calcium", 12 ] ], "fun": 10 }, { @@ -814,7 +814,7 @@ "volume": "500 ml", "phase": "liquid", "charges": 2, - "vitamins": [ [ "vitA", 5 ], [ "vitB", 3 ], [ "vitC", 2 ], [ "calcium", 12 ] ], + "vitamins": [ [ "vitC", 2 ], [ "calcium", 12 ] ], "fun": 10, "flags": [ "EATEN_HOT" ] }, @@ -841,7 +841,7 @@ "phase": "liquid", "flags": [ "EATEN_COLD" ], "//": "most store-bought oj is fortified with calcium.", - "vitamins": [ [ "vitA", 2 ], [ "vitC", 146 ], [ "calcium", 28 ], [ "iron", 2 ] ], + "vitamins": [ [ "vitC", 146 ], [ "calcium", 28 ], [ "iron", 2 ] ], "fun": 3 }, { @@ -937,7 +937,7 @@ "volume": "250 ml", "phase": "liquid", "flags": [ "EATEN_COLD", "MYCUS_OK", "NUTRIENT_OVERRIDE" ], - "vitamins": [ [ "vitA", 16 ], [ "vitB", 16 ], [ "vitC", 20 ], [ "calcium", 20 ], [ "iron", 16 ] ], + "vitamins": [ [ "vitC", 20 ], [ "calcium", 20 ], [ "iron", 16 ] ], "fun": 30 }, { @@ -1155,7 +1155,7 @@ "phase": "liquid", "flags": [ "EATEN_COLD" ], "fun": 1, - "vitamins": [ [ "vitA", 60 ], [ "vitC", 180 ], [ "calcium", 4 ], [ "iron", 4 ] ] + "vitamins": [ [ "vitC", 180 ], [ "calcium", 4 ], [ "iron", 4 ] ] }, { "id": "water", @@ -1254,7 +1254,7 @@ "description": "Hot tea with cold milk and added sweetener.", "price": 460, "price_postapoc": 60, - "vitamins": [ [ "vitA", 5 ], [ "vitB", 3 ], [ "vitC", 2 ], [ "calcium", 12 ] ], + "vitamins": [ [ "vitC", 2 ], [ "calcium", 12 ] ], "fun": 14 }, { @@ -1301,7 +1301,7 @@ "volume": "250 ml", "phase": "liquid", "flags": [ "EATEN_COLD" ], - "vitamins": [ [ "vitA", 10 ], [ "vitC", 120 ], [ "calcium", 2 ], [ "iron", 2 ] ], + "vitamins": [ [ "vitC", 120 ], [ "calcium", 2 ], [ "iron", 2 ] ], "fun": 2 } ] diff --git a/data/json/items/comestibles/egg.json b/data/json/items/comestibles/egg.json index 5c88f10e92d2a..f0665274b367c 100644 --- a/data/json/items/comestibles/egg.json +++ b/data/json/items/comestibles/egg.json @@ -20,7 +20,7 @@ "fun": -8, "flags": [ "FREEZERBURN", "RAW" ], "rot_spawn": "GROUP_EGG_BIRD_WILD", - "vitamins": [ [ "vitA", 9 ], [ "calcium", 3 ], [ "iron", 4 ], [ "vitB", 21 ] ], + "vitamins": [ [ "calcium", 3 ], [ "iron", 4 ] ], "rot_spawn_chance": 50 }, { @@ -105,7 +105,7 @@ "calories": 130, "volume": "83 ml", "weight": "70 g", - "vitamins": [ [ "vitA", 15 ], [ "calcium", 5 ], [ "iron", 15 ], [ "vitB", 158 ] ], + "vitamins": [ [ "calcium", 5 ], [ "iron", 15 ] ], "rot_spawn": "GROUP_EGG_DUCK" }, { @@ -116,7 +116,7 @@ "calories": 266, "volume": "125 ml", "weight": "144 g", - "vitamins": [ [ "vitA", 30 ], [ "calcium", 9 ], [ "iron", 29 ], [ "vitB", 306 ] ], + "vitamins": [ [ "calcium", 9 ], [ "iron", 29 ] ], "rot_spawn": "GROUP_EGG_GOOSE_CANADIAN" }, { @@ -127,7 +127,7 @@ "volume": "83 ml", "weight": "79 g", "calories": 135, - "vitamins": [ [ "vitA", 15 ], [ "calcium", 8 ], [ "iron", 18 ], [ "vitB", 56 ] ], + "vitamins": [ [ "calcium", 8 ], [ "iron", 18 ] ], "rot_spawn": "GROUP_EGG_TURKEY" }, { @@ -186,7 +186,7 @@ "price_postapoc": 100, "spoils_in": "5 days", "flags": [ "FREEZERBURN", "RAW" ], - "vitamins": [ [ "vitA", 19 ], [ "calcium", 7 ], [ "iron", 18 ], [ "vitB", 66 ], [ "mutant_toxin", 25 ] ] + "vitamins": [ [ "calcium", 7 ], [ "iron", 18 ], [ "mutant_toxin", 25 ] ] }, { "type": "COMESTIBLE", @@ -198,7 +198,7 @@ "price_postapoc": 500, "material": [ "egg" ], "proportional": { "weight": 4, "calories": 4, "volume": 4 }, - "vitamins": [ [ "vitA", 76 ], [ "calcium", 28 ], [ "iron", 72 ], [ "vitB", 264 ], [ "mutant_toxin", 100 ] ], + "vitamins": [ [ "calcium", 28 ], [ "iron", 72 ], [ "mutant_toxin", 100 ] ], "rot_spawn": "GROUP_EGG_ANT", "rot_spawn_chance": 60 }, @@ -278,7 +278,7 @@ "copy-from": "egg_insect", "color": "light_green", "proportional": { "weight": 2, "calories": 2, "volume": 2 }, - "vitamins": [ [ "vitA", 38 ], [ "calcium", 14 ], [ "iron", 36 ], [ "vitB", 132 ], [ "mutant_toxin", 50 ] ], + "vitamins": [ [ "calcium", 14 ], [ "iron", 36 ], [ "mutant_toxin", 50 ] ], "rot_spawn": "GROUP_EGG_CENTIPEDE", "rot_spawn_chance": 50 }, @@ -303,7 +303,7 @@ "symbol": "o", "spoils_in": "20 days", "proportional": { "weight": 5, "calories": 5, "volume": 5 }, - "vitamins": [ [ "vitA", 95 ], [ "calcium", 35 ], [ "iron", 90 ], [ "vitB", 330 ], [ "mutant_toxin", 125 ] ], + "vitamins": [ [ "calcium", 35 ], [ "iron", 90 ], [ "mutant_toxin", 125 ] ], "description": "A huge translucent beetle egg. You can see a larva slowly squirming inside, contorting uncomfortably outside of the soil.", "rot_spawn": "GROUP_EGG_STAG_BEETLE", "rot_spawn_chance": 100 @@ -316,7 +316,7 @@ "color": "yellow", "symbol": "o", "proportional": { "weight": 2, "calories": 2, "volume": 2 }, - "vitamins": [ [ "vitA", 38 ], [ "calcium", 14 ], [ "iron", 36 ], [ "vitB", 132 ], [ "mutant_toxin", 50 ] ], + "vitamins": [ [ "calcium", 14 ], [ "iron", 36 ], [ "mutant_toxin", 50 ] ], "description": "A large white antlion egg. There is something hard inside.", "rot_spawn": "GROUP_EGG_ANTLION", "rot_spawn_chance": 50 @@ -396,7 +396,7 @@ "price_postapoc": 750, "material": [ "flesh" ], "volume": "250 ml", - "vitamins": [ [ "vitA", 24 ], [ "vitC", 42 ], [ "calcium", 5 ], [ "iron", 8 ], [ "vitB", 985 ] ], + "vitamins": [ [ "vitC", 42 ], [ "calcium", 5 ], [ "iron", 8 ] ], "fun": 5, "flags": [ "RAW" ] }, @@ -419,7 +419,7 @@ "volume": "25 ml", "stack_size": 4, "fun": 1, - "vitamins": [ [ "vitC", 1 ], [ "vitB", 24 ] ], + "vitamins": [ [ "vitC", 1 ] ], "flags": [ "RAW" ] }, { @@ -442,8 +442,7 @@ "flags": [ "EDIBLE_FROZEN" ], "charges": 16, "fun": -4, - "freezing_point": -274, - "vitamins": [ [ "vitB", 2 ] ] + "freezing_point": -274 }, { "type": "COMESTIBLE", @@ -462,8 +461,7 @@ "material": [ "egg" ], "volume": "50 ml", "flags": [ ], - "fun": -2, - "vitamins": [ [ "vitB", 2 ] ] + "fun": -2 }, { "type": "COMESTIBLE", diff --git a/data/json/items/comestibles/frozen.json b/data/json/items/comestibles/frozen.json index 8a7ad6a5d8d17..0d5938e69a7c6 100644 --- a/data/json/items/comestibles/frozen.json +++ b/data/json/items/comestibles/frozen.json @@ -21,7 +21,7 @@ "material": [ "milk" ], "phase": "liquid", "charges": 2, - "vitamins": [ [ "vitA", 1 ], [ "calcium", 12 ] ], + "vitamins": [ [ "calcium", 12 ] ], "flags": [ "MELTS" ] }, { @@ -80,7 +80,7 @@ "calories": 220, "material": [ "water", "fruit" ], "primary_material": "water", - "vitamins": [ [ "vitA", 1 ], [ "vitC", 6 ] ] + "vitamins": [ [ "vitC", 6 ] ] }, { "type": "COMESTIBLE", @@ -104,7 +104,7 @@ "phase": "liquid", "//": "not technically a drink, but is quasi-liquid enough that it'd get all over everything if you carried it", "charges": 2, - "vitamins": [ [ "vitA", 9 ], [ "calcium", 9 ], [ "vitB", 11 ] ], + "vitamins": [ [ "calcium", 9 ] ], "flags": [ "MELTS" ] }, { @@ -154,7 +154,7 @@ "price_postapoc": 300, "calories": 330, "primary_material": "ice_cream", - "vitamins": [ [ "vitA", 9 ], [ "calcium", 8 ], [ "iron", 4 ], [ "vitB", 8 ] ], + "vitamins": [ [ "calcium", 8 ], [ "iron", 4 ] ], "material": [ "milk", "junk" ] }, { @@ -169,7 +169,7 @@ "price": 300, "price_postapoc": 300, "primary_material": "ice_cream", - "vitamins": [ [ "vitA", 8 ], [ "vitC", 6 ], [ "calcium", 8 ], [ "iron", 1 ], [ "vitB", 9 ] ], + "vitamins": [ [ "vitC", 6 ], [ "calcium", 8 ], [ "iron", 1 ] ], "material": [ "milk", "fruit" ] }, { @@ -183,7 +183,7 @@ "price": 300, "price_postapoc": 300, "primary_material": "ice_cream", - "vitamins": [ [ "vitA", 1 ], [ "calcium", 8 ], [ "vitB", 10 ] ], + "vitamins": [ [ "calcium", 8 ] ], "material": [ "milk", "egg" ] }, { diff --git a/data/json/items/comestibles/fruit_dishes.json b/data/json/items/comestibles/fruit_dishes.json index 64f067765b0c0..90e6380315123 100644 --- a/data/json/items/comestibles/fruit_dishes.json +++ b/data/json/items/comestibles/fruit_dishes.json @@ -105,7 +105,7 @@ "material": [ "fruit" ], "volume": "250 ml", "fun": 5, - "vitamins": [ [ "vitA", 4 ], [ "vitC", 9 ], [ "iron", 4 ] ] + "vitamins": [ [ "vitC", 9 ], [ "iron", 4 ] ] }, { "type": "COMESTIBLE", diff --git a/data/json/items/comestibles/junkfood.json b/data/json/items/comestibles/junkfood.json index f7150fa53074f..1a78ca5c6812e 100644 --- a/data/json/items/comestibles/junkfood.json +++ b/data/json/items/comestibles/junkfood.json @@ -18,7 +18,7 @@ "volume": "1 L", "charges": 8, "flags": [ "EATEN_HOT" ], - "vitamins": [ [ "vitA", 3 ], [ "iron", 10 ] ], + "vitamins": [ [ "iron", 10 ] ], "fun": 20 }, { @@ -65,7 +65,7 @@ "charges": 2, "flags": [ "EATEN_HOT" ], "fun": -10, - "vitamins": [ [ "vitA", 16 ], [ "iron", 10 ] ] + "vitamins": [ [ "iron", 10 ] ] }, { "type": "COMESTIBLE", @@ -764,7 +764,7 @@ "material": [ "junk" ], "volume": "150 ml", "charges": 5, - "vitamins": [ [ "calcium", 9 ], [ "vitB", 8 ] ], + "vitamins": [ [ "calcium", 9 ] ], "fun": 2 }, { @@ -783,7 +783,7 @@ "price_postapoc": 500, "material": [ "junk", "fruit" ], "volume": "150 ml", - "vitamins": [ [ "calcium", 9 ], [ "vitB", 8 ], [ "vitA", 2 ], [ "vitC", 14 ], [ "iron", 1 ] ], + "vitamins": [ [ "calcium", 9 ], [ "vitC", 14 ], [ "iron", 1 ] ], "fun": 5 }, { @@ -877,7 +877,7 @@ "volume": "250 ml", "flags": [ "EATEN_HOT" ], "fun": 16, - "vitamins": [ [ "vitC", 5 ], [ "calcium", 2 ], [ "iron", 24 ], [ "vitB", 259 ] ] + "vitamins": [ [ "vitC", 5 ], [ "calcium", 2 ], [ "iron", 24 ] ] }, { "type": "COMESTIBLE", @@ -904,7 +904,7 @@ "volume": "250 ml", "flags": [ "EATEN_HOT" ], "fun": 20, - "vitamins": [ [ "vitA", 10 ], [ "calcium", 10 ], [ "iron", 12 ], [ "vitB", 29 ] ] + "vitamins": [ [ "calcium", 10 ], [ "iron", 12 ] ] }, { "type": "COMESTIBLE", @@ -945,7 +945,7 @@ "volume": "500 ml", "flags": [ "EATEN_HOT" ], "fun": 20, - "vitamins": [ [ "vitA", 2 ], [ "calcium", 13 ], [ "iron", 17 ] ] + "vitamins": [ [ "calcium", 13 ], [ "iron", 17 ] ] }, { "type": "COMESTIBLE", @@ -966,7 +966,7 @@ "volume": "250 ml", "flags": [ "EDIBLE_FROZEN" ], "charges": 4, - "vitamins": [ [ "vitA", 1 ], [ "calcium", 8 ], [ "iron", 4 ] ], + "vitamins": [ [ "calcium", 8 ], [ "iron", 4 ] ], "fun": 4 }, { @@ -1076,7 +1076,7 @@ "charges": 2, "flags": [ "EATEN_HOT" ], "fun": 15, - "vitamins": [ [ "vitA", 7 ], [ "vitC", 46 ], [ "calcium", 14 ], [ "iron", 21 ] ] + "vitamins": [ [ "vitC", 46 ], [ "calcium", 14 ], [ "iron", 21 ] ] }, { "type": "COMESTIBLE", @@ -1098,7 +1098,7 @@ "charges": 2, "flags": [ "EATEN_HOT" ], "fun": 15, - "vitamins": [ [ "vitA", 7 ], [ "vitC", 46 ], [ "calcium", 14 ], [ "iron", 21 ] ] + "vitamins": [ [ "vitC", 46 ], [ "calcium", 14 ], [ "iron", 21 ] ] }, { "type": "COMESTIBLE", @@ -1120,7 +1120,7 @@ "charges": 2, "flags": [ "EATEN_HOT" ], "fun": -18, - "vitamins": [ [ "vitA", 4 ], [ "calcium", 6 ], [ "iron", 8 ], [ "vitB", 15 ] ] + "vitamins": [ [ "calcium", 6 ], [ "iron", 8 ] ] }, { "type": "COMESTIBLE", @@ -1159,7 +1159,7 @@ "material": [ "wheat", "junk", "milk" ], "primary_material": "processed_food", "fun": 6, - "vitamins": [ [ "vitA", 5 ], [ "calcium", 5 ], [ "iron", 17 ], [ "vitB", 33 ] ] + "vitamins": [ [ "calcium", 5 ], [ "iron", 17 ] ] }, { "type": "COMESTIBLE", @@ -1179,7 +1179,7 @@ "volume": "250 ml", "flags": [ "EATEN_HOT" ], "fun": 12, - "vitamins": [ [ "vitA", 7 ], [ "calcium", 25 ], [ "iron", 25 ], [ "vitB", 63 ] ] + "vitamins": [ [ "calcium", 25 ], [ "iron", 25 ] ] }, { "type": "COMESTIBLE", @@ -1201,7 +1201,7 @@ "charges": 8, "flags": [ "EATEN_HOT" ], "fun": 6, - "vitamins": [ [ "vitA", 1 ], [ "calcium", 15 ] ] + "vitamins": [ [ "calcium", 15 ] ] }, { "type": "COMESTIBLE", @@ -1223,7 +1223,7 @@ "volume": "250 ml", "flags": [ "EATEN_HOT" ], "fun": 6, - "vitamins": [ [ "vitA", 7 ], [ "vitC", 4 ], [ "calcium", 17 ], [ "iron", 3 ] ] + "vitamins": [ [ "vitC", 4 ], [ "calcium", 17 ], [ "iron", 3 ] ] }, { "type": "COMESTIBLE", @@ -1414,7 +1414,7 @@ "material": [ "flesh", "egg", "junk" ], "volume": "250ml", "flags": [ "EATEN_HOT" ], - "vitamins": [ [ "vitA", 3 ], [ "iron", 10 ] ], + "vitamins": [ [ "iron", 10 ] ], "fun": -2 }, { @@ -1435,7 +1435,7 @@ "material": [ "flesh", "egg", "junk" ], "volume": "500ml", "flags": [ "EATEN_HOT" ], - "vitamins": [ [ "vitA", 3 ], [ "iron", 10 ] ], + "vitamins": [ [ "iron", 10 ] ], "fun": 4 }, { diff --git a/data/json/items/comestibles/meat_dishes.json b/data/json/items/comestibles/meat_dishes.json index 90560a8bf891f..dffb49b323f86 100644 --- a/data/json/items/comestibles/meat_dishes.json +++ b/data/json/items/comestibles/meat_dishes.json @@ -24,7 +24,7 @@ "volume": "250 ml", "flags": [ "SMOKABLE" ], "smoking_result": "sausage", - "vitamins": [ [ "vitA", 2 ], [ "calcium", 2 ], [ "iron", 6 ], [ "vitB", 37 ] ], + "vitamins": [ [ "calcium", 2 ], [ "iron", 6 ] ], "fun": -10 }, { @@ -106,7 +106,7 @@ "material": [ "flesh" ], "volume": "250 ml", "price_postapoc": 250, - "vitamins": [ [ "vitA", 30 ], [ "vitC", 4 ], [ "iron", 22 ], [ "vitB", 36 ] ], + "vitamins": [ [ "vitC", 4 ], [ "iron", 22 ] ], "flags": [ "EATEN_HOT" ], "fun": 8 }, @@ -179,7 +179,7 @@ "material": [ "flesh" ], "volume": "500 ml", "fun": 7, - "vitamins": [ [ "vitC", 4 ], [ "calcium", 6 ], [ "iron", 69 ], [ "vitB", 323 ] ] + "vitamins": [ [ "vitC", 4 ], [ "calcium", 6 ], [ "iron", 69 ] ] }, { "type": "COMESTIBLE", @@ -202,7 +202,7 @@ "material": [ "flesh" ], "charges": 2, "flags": [ "EATEN_HOT", "SMOKED" ], - "vitamins": [ [ "vitA", 1 ], [ "vitC", 0 ], [ "calcium", 0 ], [ "iron", 6 ], [ "vitB", 39 ] ], + "vitamins": [ [ "vitC", 0 ], [ "calcium", 0 ], [ "iron", 6 ] ], "fun": 5 }, { @@ -247,7 +247,7 @@ "material": [ "flesh" ], "charges": 4, "flags": [ "EATEN_HOT" ], - "vitamins": [ [ "vitA", 1 ], [ "vitC", 0 ], [ "calcium", 0 ], [ "iron", 3 ], [ "vitB", 19 ] ], + "vitamins": [ [ "vitC", 0 ], [ "calcium", 0 ], [ "iron", 3 ] ], "fun": 4 }, { @@ -303,7 +303,7 @@ "charges": 3, "flags": [ "EATEN_HOT" ], "fun": 18, - "vitamins": [ [ "vitA", 5 ], [ "vitC", 17 ], [ "calcium", 8 ], [ "iron", 32 ], [ "vitB", 259 ] ] + "vitamins": [ [ "vitC", 17 ], [ "calcium", 8 ], [ "iron", 32 ] ] }, { "type": "COMESTIBLE", @@ -330,7 +330,7 @@ "charges": 2, "flags": [ "EATEN_HOT" ], "fun": 10, - "vitamins": [ [ "vitA", 2 ], [ "calcium", 20 ], [ "iron", 10 ] ] + "vitamins": [ [ "calcium", 20 ], [ "iron", 10 ] ] }, { "type": "COMESTIBLE", @@ -353,7 +353,7 @@ "price_postapoc": 150, "material": [ "flesh" ], "volume": "250 ml", - "vitamins": [ [ "vitA", 10 ], [ "vitC", 15 ], [ "calcium", 2 ], [ "iron", 8 ] ], + "vitamins": [ [ "vitC", 15 ], [ "calcium", 2 ], [ "iron", 8 ] ], "flags": [ "EATEN_COLD", "FREEZERBURN" ] }, { @@ -429,7 +429,7 @@ "volume": "250 ml", "flags": [ "EATEN_HOT" ], "fun": 10, - "vitamins": [ [ "calcium", 3 ], [ "iron", 5 ], [ "vitB", 94 ] ] + "vitamins": [ [ "calcium", 3 ], [ "iron", 5 ] ] }, { "type": "COMESTIBLE", @@ -456,7 +456,7 @@ "looks_like": "fish_fried", "fun": 13, "charges": 5, - "vitamins": [ [ "vitA", 6 ], [ "calcium", 2 ], [ "iron", 5 ], [ "vitB", 22 ] ] + "vitamins": [ [ "calcium", 2 ], [ "iron", 5 ] ] }, { "type": "COMESTIBLE", @@ -503,7 +503,7 @@ "material": [ "flesh" ], "volume": "750 ml", "charges": 10, - "vitamins": [ [ "vitA", 0 ], [ "vitC", 0 ], [ "calcium", 6 ], [ "iron", 5 ], [ "vitB", 11 ] ] + "vitamins": [ [ "vitC", 0 ], [ "calcium", 6 ], [ "iron", 5 ] ] }, { "type": "COMESTIBLE", @@ -549,7 +549,7 @@ "charges": 6, "flags": [ "EATEN_HOT" ], "fun": -8, - "vitamins": [ [ "iron", 3 ], [ "vitB", 11 ] ] + "vitamins": [ [ "iron", 3 ] ] }, { "type": "COMESTIBLE", @@ -559,7 +559,7 @@ "calories": 2150, "description": "A mysterious lump of SPAM that contains just enough calories and vitamins to feed you for a day. For debug use only.", "//": "This is used for the all_nutrient_starve_test.", - "vitamins": [ [ "vitA", 96 ], [ "vitB", 96 ], [ "vitC", 96 ], [ "calcium", 96 ], [ "iron", 96 ] ] + "vitamins": [ [ "vitC", 96 ], [ "calcium", 96 ], [ "iron", 96 ] ] }, { "type": "COMESTIBLE", @@ -633,7 +633,7 @@ "price_postapoc": 350, "material": [ "flesh", "veggy" ], "volume": "120 ml", - "vitamins": [ [ "vitA", 14 ], [ "vitC", 3 ], [ "calcium", 5 ], [ "iron", 21 ] ], + "vitamins": [ [ "vitC", 3 ], [ "calcium", 5 ], [ "iron", 21 ] ], "fun": 3 }, { @@ -661,7 +661,7 @@ "volume": "250 ml", "flags": [ "EATEN_HOT", "FREEZERBURN" ], "fun": 5, - "vitamins": [ [ "vitA", 15 ], [ "vitC", 4 ], [ "calcium", 32 ], [ "iron", 20 ], [ "vitB", 195 ] ] + "vitamins": [ [ "vitC", 4 ], [ "calcium", 32 ], [ "iron", 20 ] ] }, { "type": "COMESTIBLE", @@ -681,7 +681,7 @@ "volume": "500 ml", "flags": [ "EATEN_HOT" ], "charges": 2, - "vitamins": [ [ "vitA", 6 ], [ "calcium", 5 ], [ "iron", 27 ], [ "vitB", 64 ] ] + "vitamins": [ [ "calcium", 5 ], [ "iron", 27 ] ] }, { "type": "COMESTIBLE", @@ -716,7 +716,7 @@ "flags": [ "EATEN_HOT" ], "fun": 5, "charges": 2, - "vitamins": [ [ "vitA", 5 ], [ "vitC", 7 ], [ "calcium", 7 ], [ "iron", 27 ], [ "vitB", 66 ] ] + "vitamins": [ [ "vitC", 7 ], [ "calcium", 7 ], [ "iron", 27 ] ] }, { "type": "COMESTIBLE", @@ -757,7 +757,7 @@ "material": [ "flesh" ], "volume": "250 ml", "fun": 2, - "vitamins": [ [ "vitA", 4 ], [ "calcium", 2 ], [ "iron", 12 ], [ "vitB", 141 ] ] + "vitamins": [ [ "calcium", 2 ], [ "iron", 12 ] ] }, { "type": "COMESTIBLE", @@ -776,7 +776,7 @@ "material": [ "flesh" ], "volume": "250 ml", "fun": 1, - "vitamins": [ [ "vitA", 4 ], [ "calcium", 57 ], [ "iron", 9 ], [ "vitB", 413 ] ] + "vitamins": [ [ "calcium", 57 ], [ "iron", 9 ] ] }, { "type": "COMESTIBLE", @@ -796,7 +796,7 @@ "volume": "500 ml", "charges": 2, "fun": 1, - "vitamins": [ [ "vitA", 18 ], [ "calcium", 3 ], [ "iron", 18 ], [ "vitB", 34 ] ] + "vitamins": [ [ "calcium", 3 ], [ "iron", 18 ] ] }, { "type": "COMESTIBLE", @@ -836,7 +836,7 @@ "material": [ "flesh" ], "volume": "250 ml", "fun": 2, - "vitamins": [ [ "vitA", 28 ], [ "calcium", 11 ], [ "iron", 25 ], [ "vitB", 1312 ] ] + "vitamins": [ [ "calcium", 11 ], [ "iron", 25 ] ] }, { "type": "COMESTIBLE", @@ -862,7 +862,7 @@ "charges": 2, "flags": [ "EATEN_HOT" ], "fun": 6, - "vitamins": [ [ "vitA", 20 ], [ "vitC", 14 ], [ "calcium", 7 ], [ "iron", 16 ], [ "vitB", 348 ] ] + "vitamins": [ [ "vitC", 14 ], [ "calcium", 7 ], [ "iron", 16 ] ] }, { "type": "COMESTIBLE", @@ -884,7 +884,7 @@ "//": "One beans + one protein = 2 servings", "flags": [ "EATEN_HOT" ], "fun": 4, - "vitamins": [ [ "vitC", 10 ], [ "calcium", 6 ], [ "iron", 51 ], [ "vitB", 389 ] ] + "vitamins": [ [ "vitC", 10 ], [ "calcium", 6 ], [ "iron", 51 ] ] }, { "type": "COMESTIBLE", @@ -906,7 +906,7 @@ "//": "One rice + one protein/veg = 2 servings", "flags": [ "EATEN_HOT", "FREEZERBURN" ], "fun": 5, - "vitamins": [ [ "vitA", 1 ], [ "vitC", 8 ], [ "calcium", 1 ], [ "iron", 40 ], [ "vitB", 389 ] ] + "vitamins": [ [ "vitC", 8 ], [ "calcium", 1 ], [ "iron", 40 ] ] }, { "type": "COMESTIBLE", @@ -928,7 +928,7 @@ "charges": 2, "flags": [ "EATEN_HOT", "FREEZERBURN" ], "fun": 4, - "vitamins": [ [ "vitA", 2 ], [ "vitC", 5 ], [ "calcium", 4 ], [ "iron", 10 ] ] + "vitamins": [ [ "vitC", 5 ], [ "calcium", 4 ], [ "iron", 10 ] ] }, { "type": "COMESTIBLE", @@ -982,7 +982,7 @@ "charges": 4, "flags": [ "EATEN_HOT" ], "fun": 10, - "vitamins": [ [ "vitA", 19 ], [ "vitC", 0 ], [ "calcium", 44 ], [ "iron", 36 ], [ "vitB", 63 ] ] + "vitamins": [ [ "vitC", 0 ], [ "calcium", 44 ], [ "iron", 36 ] ] }, { "type": "COMESTIBLE", @@ -997,7 +997,7 @@ "price_postapoc": 1500, "material": [ "wheat", "flesh", "veggy", "milk" ], "fun": 11, - "vitamins": [ [ "vitA", 12 ], [ "vitC", 20 ], [ "calcium", 32 ], [ "iron", 28 ], [ "vitB", 53 ] ] + "vitamins": [ [ "vitC", 20 ], [ "calcium", 32 ], [ "iron", 28 ] ] }, { "type": "COMESTIBLE", @@ -1023,7 +1023,7 @@ "charges": 3, "flags": [ "EATEN_HOT", "FREEZERBURN" ], "fun": 4, - "vitamins": [ [ "vitA", 19 ], [ "vitC", 2 ], [ "calcium", 4 ], [ "iron", 39 ], [ "vitB", 97 ] ] + "vitamins": [ [ "vitC", 2 ], [ "calcium", 4 ], [ "iron", 39 ] ] }, { "type": "COMESTIBLE", @@ -1091,7 +1091,7 @@ "charges": 8, "flags": [ "EATEN_HOT", "FREEZERBURN" ], "fun": 4, - "vitamins": [ [ "vitA", 8 ], [ "vitC", 5 ], [ "calcium", 3 ], [ "iron", 9 ], [ "vitB", 17 ] ] + "vitamins": [ [ "vitC", 5 ], [ "calcium", 3 ], [ "iron", 9 ] ] }, { "type": "COMESTIBLE", @@ -1119,7 +1119,7 @@ "charges": 8, "flags": [ "EATEN_HOT", "FREEZERBURN" ], "fun": 15, - "vitamins": [ [ "vitA", 12 ], [ "vitC", 6 ], [ "calcium", 22 ], [ "iron", 17 ], [ "vitB", 79 ] ] + "vitamins": [ [ "vitC", 6 ], [ "calcium", 22 ], [ "iron", 17 ] ] }, { "type": "COMESTIBLE", @@ -1158,7 +1158,7 @@ "volume": "300 ml", "flags": [ "EATEN_HOT", "ALLERGEN_MILK" ], "fun": 5, - "vitamins": [ [ "vitA", 17 ], [ "vitC", 1 ], [ "calcium", 57 ], [ "iron", 65 ], [ "vitB", 213 ] ] + "vitamins": [ [ "vitC", 1 ], [ "calcium", 57 ], [ "iron", 65 ] ] }, { "type": "COMESTIBLE", @@ -1184,7 +1184,7 @@ "volume": "300 ml", "flags": [ "EATEN_HOT", "ALLERGEN_MILK" ], "fun": 5, - "vitamins": [ [ "vitA", 17 ], [ "vitC", 1 ], [ "calcium", 57 ], [ "iron", 65 ], [ "vitB", 213 ] ] + "vitamins": [ [ "vitC", 1 ], [ "calcium", 57 ], [ "iron", 65 ] ] }, { "type": "COMESTIBLE", @@ -1199,7 +1199,7 @@ "primary_material": "processed_food", "volume": "350 ml", "fun": 7, - "vitamins": [ [ "vitA", 35 ], [ "vitC", 30 ], [ "calcium", 60 ], [ "iron", 65 ], [ "vitB", 230 ] ] + "vitamins": [ [ "vitC", 30 ], [ "calcium", 60 ], [ "iron", 65 ] ] }, { "type": "COMESTIBLE", @@ -1214,7 +1214,7 @@ "primary_material": "processed_food", "volume": "350 ml", "fun": 7, - "vitamins": [ [ "vitA", 35 ], [ "vitC", 30 ], [ "calcium", 60 ], [ "iron", 65 ], [ "vitB", 230 ] ] + "vitamins": [ [ "vitC", 30 ], [ "calcium", 60 ], [ "iron", 65 ] ] }, { "type": "COMESTIBLE", @@ -1239,7 +1239,7 @@ "volume": "300 ml", "flags": [ "EATEN_HOT" ], "fun": 4, - "vitamins": [ [ "vitA", 17 ], [ "vitC", 1 ], [ "calcium", 57 ], [ "iron", 65 ], [ "vitB", 213 ] ] + "vitamins": [ [ "vitC", 1 ], [ "calcium", 57 ], [ "iron", 65 ] ] }, { "type": "COMESTIBLE", @@ -1264,7 +1264,7 @@ "volume": "300 ml", "flags": [ "EATEN_HOT" ], "fun": 4, - "vitamins": [ [ "vitA", 17 ], [ "vitC", 1 ], [ "calcium", 57 ], [ "iron", 65 ], [ "vitB", 213 ] ] + "vitamins": [ [ "vitC", 1 ], [ "calcium", 57 ], [ "iron", 65 ] ] }, { "type": "COMESTIBLE", @@ -1351,7 +1351,7 @@ "material": [ "flesh" ], "volume": "250 ml", "fun": 8, - "vitamins": [ [ "vitA", 6 ], [ "vitC", 1 ], [ "calcium", 8 ], [ "iron", 15 ], [ "vitB", 17 ] ] + "vitamins": [ [ "vitC", 1 ], [ "calcium", 8 ], [ "iron", 15 ] ] }, { "type": "COMESTIBLE", @@ -1436,7 +1436,7 @@ "volume": "250 ml", "flags": [ "EATEN_HOT" ], "fun": 2, - "vitamins": [ [ "vitA", 144 ], [ "vitC", 21 ], [ "calcium", 1 ], [ "iron", 29 ], [ "vitB", 87 ] ] + "vitamins": [ [ "vitC", 21 ], [ "calcium", 1 ], [ "iron", 29 ] ] }, { "type": "COMESTIBLE", @@ -1456,7 +1456,7 @@ "volume": "750 ml", "charges": 3, "fun": 14, - "vitamins": [ [ "vitA", 1 ], [ "vitC", 23 ], [ "calcium", 3 ], [ "iron", 3 ], [ "vitB", 22 ] ] + "vitamins": [ [ "vitC", 23 ], [ "calcium", 3 ], [ "iron", 3 ] ] }, { "type": "COMESTIBLE", @@ -1477,7 +1477,7 @@ "volume": "1 L", "charges": 2, "fun": 13, - "vitamins": [ [ "vitC", 36 ], [ "calcium", 4 ], [ "iron", 37 ], [ "vitB", 389 ] ] + "vitamins": [ [ "vitC", 36 ], [ "calcium", 4 ], [ "iron", 37 ] ] }, { "type": "COMESTIBLE", @@ -1554,7 +1554,7 @@ "charges": 3, "flags": [ "EATEN_HOT" ], "fun": 7, - "vitamins": [ [ "vitC", 3 ], [ "calcium", 19 ], [ "iron", 12 ], [ "vitB", 17 ] ] + "vitamins": [ [ "vitC", 3 ], [ "calcium", 19 ], [ "iron", 12 ] ] }, { "type": "COMESTIBLE", @@ -1578,7 +1578,7 @@ "price_postapoc": 200, "material": [ "flesh" ], "volume": "85 ml", - "vitamins": [ [ "vitA", 2 ], [ "vitC", 2 ], [ "calcium", 8 ], [ "iron", 4 ] ], + "vitamins": [ [ "vitC", 2 ], [ "calcium", 8 ], [ "iron", 4 ] ], "fun": -10 }, { diff --git a/data/json/items/comestibles/med.json b/data/json/items/comestibles/med.json index e238dced659cd..69c7cf3b3d503 100644 --- a/data/json/items/comestibles/med.json +++ b/data/json/items/comestibles/med.json @@ -1707,7 +1707,7 @@ "use_action": { "type": "consume_drug", "activation_message": "You take the %s.", - "vitamins": [ [ "calcium", 24, 48 ], [ "iron", 24, 48 ], [ "vitA", 24, 48 ], [ "vitB", 24, 48 ], [ "vitC", 24, 48 ] ] + "vitamins": [ [ "calcium", 24, 48 ], [ "iron", 24, 48 ], [ "vitC", 24, 48 ] ] } }, { @@ -1826,28 +1826,6 @@ } ] }, - { - "id": "inj_vitb", - "type": "COMESTIBLE", - "comestible_type": "MED", - "name": { "str": "injectable vitamin B" }, - "description": "Small vials of pale yellow liquid containing soluble vitamin B for injection.", - "weight": "40 g", - "volume": "250 ml", - "price": 150, - "price_postapoc": 500, - "charges": 2, - "stack_size": 10, - "symbol": "!", - "color": "magenta", - "flags": [ "NO_INGEST", "IRREPLACEABLE_CONSUMABLE" ], - "use_action": { - "type": "consume_drug", - "activation_message": "You inject some vitamin B.", - "tools_needed": { "syringe": -1 }, - "vitamins": [ [ "vitB", 100 ] ] - } - }, { "id": "inj_iron", "type": "COMESTIBLE", diff --git a/data/json/items/comestibles/nuts.json b/data/json/items/comestibles/nuts.json index 5b05170436f7f..21f4324898d26 100644 --- a/data/json/items/comestibles/nuts.json +++ b/data/json/items/comestibles/nuts.json @@ -39,7 +39,7 @@ "material": [ "fruit" ], "volume": "250 ml", "fun": -2, - "vitamins": [ [ "vitA", 12 ], [ "vitC", 12 ], [ "calcium", 1 ], [ "iron", 1 ] ] + "vitamins": [ [ "vitC", 12 ], [ "calcium", 1 ], [ "iron", 1 ] ] }, { "type": "COMESTIBLE", @@ -61,7 +61,7 @@ "volume": "250 ml", "flags": [ "EDIBLE_FROZEN", "NUTRIENT_OVERRIDE", "RAW" ], "charges": 4, - "vitamins": [ [ "vitA", 1 ], [ "vitC", 1 ], [ "calcium", 3 ], [ "iron", 7 ] ], + "vitamins": [ [ "vitC", 1 ], [ "calcium", 3 ], [ "iron", 7 ] ], "fun": 1 }, { diff --git a/data/json/items/comestibles/offal_dishes.json b/data/json/items/comestibles/offal_dishes.json index 39a0d838ab339..9849bab41c3c9 100644 --- a/data/json/items/comestibles/offal_dishes.json +++ b/data/json/items/comestibles/offal_dishes.json @@ -19,7 +19,7 @@ "fun": 15, "quench": 3, "flags": [ "EATEN_HOT", "FREEZERBURN" ], - "vitamins": [ [ "vitA", 4 ], [ "vitC", 5 ], [ "calcium", 0 ], [ "iron", 2 ], [ "vitB", 15 ] ] + "vitamins": [ [ "vitC", 5 ], [ "calcium", 0 ], [ "iron", 2 ] ] }, { "id": "liver_onion", @@ -39,7 +39,7 @@ "healthy": 4, "quench": -3, "flags": [ "EATEN_HOT", "FREEZERBURN" ], - "vitamins": [ [ "vitA", 75 ], [ "vitC", 1 ], [ "calcium", 0 ], [ "iron", 8 ], [ "vitB", 336 ] ] + "vitamins": [ [ "vitC", 1 ], [ "calcium", 0 ], [ "iron", 8 ] ] }, { "id": "fried_livers", @@ -62,7 +62,7 @@ "fun": 6, "quench": -4, "flags": [ "EATEN_HOT" ], - "vitamins": [ [ "vitA", 75 ], [ "vitC", 0 ], [ "calcium", 2 ], [ "iron", 9 ], [ "vitB", 337 ] ] + "vitamins": [ [ "vitC", 0 ], [ "calcium", 2 ], [ "iron", 9 ] ] }, { "id": "humble_pie", @@ -84,7 +84,7 @@ "weight": "249 g", "charges": 3, "flags": [ "EATEN_HOT" ], - "vitamins": [ [ "vitA", 36 ], [ "vitC", 15 ], [ "calcium", 1 ], [ "iron", 40 ], [ "vitB", 171 ] ] + "vitamins": [ [ "vitC", 15 ], [ "calcium", 1 ], [ "iron", 40 ] ] }, { "id": "stewed_tripe", @@ -146,7 +146,7 @@ "weight": "112 g", "charges": 14, "calories": 344, - "vitamins": [ [ "vitA", 43 ], [ "vitC", 0 ], [ "calcium", 1 ], [ "iron", 5 ], [ "vitB", 193 ] ] + "vitamins": [ [ "vitC", 0 ], [ "calcium", 1 ], [ "iron", 5 ] ] }, { "id": "fried_brain", @@ -168,7 +168,7 @@ "flags": [ "EATEN_HOT" ], "calories": 285, "charges": 3, - "vitamins": [ [ "vitA", 1 ], [ "vitB", 144 ], [ "vitC", 6 ], [ "iron", 13 ], [ "calcium", 1 ] ] + "vitamins": [ [ "vitC", 6 ], [ "iron", 13 ], [ "calcium", 1 ] ] }, { "id": "deviled_kidney", @@ -191,7 +191,7 @@ "charges": 3, "flags": [ "EATEN_HOT" ], "calories": 301, - "vitamins": [ [ "vitA", 5 ], [ "vitB", 104 ], [ "vitC", 1 ], [ "iron", 6 ], [ "calcium", 1 ] ] + "vitamins": [ [ "vitC", 1 ], [ "iron", 6 ], [ "calcium", 1 ] ] }, { "id": "grilled_sweetbread", diff --git a/data/json/items/comestibles/other.json b/data/json/items/comestibles/other.json index a1fc9af0e870c..e6491272f645f 100644 --- a/data/json/items/comestibles/other.json +++ b/data/json/items/comestibles/other.json @@ -168,7 +168,7 @@ "volume": "250 ml", "stack_size": 4, "flags": [ "MYCUS_OK" ], - "vitamins": [ [ "vitA", 25 ], [ "vitB", 25 ], [ "vitC", 25 ], [ "calcium", 25 ], [ "iron", 25 ] ], + "vitamins": [ [ "vitC", 25 ], [ "calcium", 25 ], [ "iron", 25 ] ], "fun": 30 }, { @@ -270,7 +270,7 @@ "price_postapoc": 50, "material": [ "flesh" ], "volume": "250 ml", - "vitamins": [ [ "vitA", 10 ], [ "vitC", 15 ], [ "calcium", 2 ], [ "iron", 8 ] ], + "vitamins": [ [ "vitC", 15 ], [ "calcium", 2 ], [ "iron", 8 ] ], "flags": [ "EATEN_COLD", "FREEZERBURN" ] }, { @@ -413,7 +413,7 @@ "volume": "250 ml", "flags": [ "EATEN_HOT", "NUTRIENT_OVERRIDE" ], "fun": 1, - "vitamins": [ [ "calcium", 8 ], [ "vitB", 32 ] ] + "vitamins": [ [ "calcium", 8 ] ] }, { "type": "COMESTIBLE", @@ -688,7 +688,7 @@ "material": [ "tomato" ], "volume": "250 ml", "stack_size": 2, - "vitamins": [ [ "vitA", 3 ], [ "vitC", 26 ], [ "calcium", 9 ], [ "iron", 18 ] ], + "vitamins": [ [ "vitC", 26 ], [ "calcium", 9 ], [ "iron", 18 ] ], "flags": [ "RAW" ] }, { @@ -704,7 +704,7 @@ "healthy": -20, "quench": -47, "calories": 78, - "vitamins": [ [ "vitA", 0 ], [ "vitC", 2 ], [ "calcium", 1 ], [ "iron", 8 ], [ "vitB", 54 ] ], + "vitamins": [ [ "vitC", 2 ], [ "calcium", 1 ], [ "iron", 8 ] ], "description": "This is a human brain soaked in a solution of highly toxic formaldehyde. Eating this would be a terrible idea.", "price": 80, "price_postapoc": 0, @@ -729,7 +729,7 @@ "healthy": 2, "quench": 1, "calories": 170, - "vitamins": [ [ "vitA", 20 ], [ "vitC", 45 ], [ "calcium", 5 ], [ "iron", 5 ] ], + "vitamins": [ [ "vitC", 45 ], [ "calcium", 5 ], [ "iron", 5 ] ], "fun": 5, "freezing_point": -274, "color": "brown", @@ -778,7 +778,7 @@ "healthy": 2, "quench": 2, "calories": 450, - "vitamins": [ [ "vitC", 4 ], [ "iron", 17 ], [ "vitB", 187 ], [ "calcium", 0 ] ], + "vitamins": [ [ "vitC", 4 ], [ "iron", 17 ], [ "calcium", 0 ] ], "fun": -15, "color": "brown", "flags": [ "LUPINE" ], @@ -803,7 +803,7 @@ "healthy": 1, "quench": -1, "calories": 380, - "vitamins": [ [ "vitA", 25 ], [ "iron", 25 ], [ "vitB", 20 ], [ "calcium", 30 ] ], + "vitamins": [ [ "iron", 25 ], [ "calcium", 30 ] ], "fun": -15, "freezing_point": -274, "color": "brown", @@ -829,7 +829,7 @@ "healthy": -1, "quench": 2, "calories": 800, - "vitamins": [ [ "vitC", 4 ], [ "iron", 17 ], [ "vitB", 187 ], [ "calcium", 0 ] ], + "vitamins": [ [ "vitC", 4 ], [ "iron", 17 ], [ "calcium", 0 ] ], "fun": -15, "color": "brown", "flags": [ "FELINE" ], @@ -854,7 +854,7 @@ "healthy": -1, "quench": -1, "calories": 380, - "vitamins": [ [ "vitA", 25 ], [ "iron", 25 ], [ "vitB", 20 ], [ "calcium", 30 ] ], + "vitamins": [ [ "iron", 25 ], [ "calcium", 30 ] ], "fun": -15, "freezing_point": -274, "color": "brown", diff --git a/data/json/items/comestibles/protein.json b/data/json/items/comestibles/protein.json index 51002129e27b4..b543e4058325d 100644 --- a/data/json/items/comestibles/protein.json +++ b/data/json/items/comestibles/protein.json @@ -74,7 +74,7 @@ "color": "green", "container": "wrapper_pr", "calories": 400, - "vitamins": [ [ "calcium", 30 ], [ "iron", 30 ], [ "vitA", 30 ], [ "vitB", 30 ], [ "vitC", 30 ], [ "bad_food", 5 ] ] + "vitamins": [ [ "calcium", 30 ], [ "iron", 30 ], [ "vitC", 30 ], [ "bad_food", 5 ] ] }, { "id": "protein_shake", @@ -107,7 +107,7 @@ { "type": "COMPONENT_ID", "condition": "mutant", "name": { "str_sp": "perturbing %s" } } ], "description": "A thick and tasty beverage made from pure refined protein and nutritious fruit. It has been supplemented with extra vitamins and minerals", - "relative": { "vitamins": [ [ "calcium", 5 ], [ "iron", 5 ], [ "vitA", 5 ], [ "vitB", 5 ], [ "vitC", 5 ] ] } + "relative": { "vitamins": [ [ "calcium", 5 ], [ "iron", 5 ], [ "vitC", 5 ] ] } }, { "id": "milk_fortified", @@ -135,7 +135,7 @@ "quench": 22, "healthy": 3, "fun": 1, - "vitamins": [ [ "vitA", 10 ], [ "vitB", 6 ], [ "vitC", 4 ], [ "calcium", 32 ] ], + "vitamins": [ [ "vitC", 4 ], [ "calcium", 32 ] ], "flags": [ "EATEN_COLD" ] }, { diff --git a/data/json/items/comestibles/raw_fruit.json b/data/json/items/comestibles/raw_fruit.json index cad456ec2c7ef..1d54cbcf11233 100644 --- a/data/json/items/comestibles/raw_fruit.json +++ b/data/json/items/comestibles/raw_fruit.json @@ -19,7 +19,7 @@ "fun": 3, "flags": [ "FREEZERBURN", "SMOKABLE" ], "smoking_result": "dry_fruit", - "vitamins": [ [ "vitA", 2 ], [ "vitC", 14 ], [ "iron", 1 ] ] + "vitamins": [ [ "vitC", 14 ], [ "iron", 1 ] ] }, { "type": "COMESTIBLE", @@ -40,7 +40,7 @@ "fun": 5, "flags": [ "SMOKABLE" ], "smoking_result": "dry_fruit", - "vitamins": [ [ "vitA", 1 ], [ "vitC", 17 ], [ "iron", 1 ] ] + "vitamins": [ [ "vitC", 17 ], [ "iron", 1 ] ] }, { "type": "COMESTIBLE", @@ -62,7 +62,7 @@ "fun": 3, "flags": [ "FREEZERBURN", "SMOKABLE" ], "smoking_result": "dry_fruit", - "vitamins": [ [ "vitA", 7 ], [ "vitC", 138 ], [ "calcium", 4 ], [ "iron", 1 ] ] + "vitamins": [ [ "vitC", 138 ], [ "calcium", 4 ], [ "iron", 1 ] ] }, { "type": "COMESTIBLE", @@ -106,7 +106,7 @@ "fun": 2, "flags": [ "SMOKABLE", "EDIBLE_FROZEN" ], "smoking_result": "dry_fruit", - "vitamins": [ [ "vitA", 1 ], [ "vitC", 24 ], [ "calcium", 1 ], [ "iron", 2 ] ] + "vitamins": [ [ "vitC", 24 ], [ "calcium", 1 ], [ "iron", 2 ] ] }, { "type": "COMESTIBLE", @@ -151,7 +151,7 @@ "charges": 3, "flags": [ "SMOKABLE", "RAW", "EDIBLE_FROZEN" ], "smoking_result": "dry_fruit", - "vitamins": [ [ "vitA", 1 ], [ "vitC", 27 ], [ "iron", 1 ] ] + "vitamins": [ [ "vitC", 27 ], [ "iron", 1 ] ] }, { "type": "COMESTIBLE", @@ -195,7 +195,7 @@ "fun": 2, "flags": [ "SMOKABLE", "EDIBLE_FROZEN" ], "smoking_result": "dry_fruit", - "vitamins": [ [ "vitA", 1 ], [ "vitC", 5 ], [ "calcium", 2 ], [ "iron", 3 ] ] + "vitamins": [ [ "vitC", 5 ], [ "calcium", 2 ], [ "iron", 3 ] ] }, { "type": "COMESTIBLE", @@ -239,7 +239,7 @@ "fun": -2, "flags": [ "SMOKABLE", "RAW", "EDIBLE_FROZEN" ], "smoking_result": "dry_fruit", - "vitamins": [ [ "vitA", 5 ], [ "vitC", 61 ], [ "calcium", 6 ], [ "iron", 14 ] ] + "vitamins": [ [ "vitC", 61 ], [ "calcium", 6 ], [ "iron", 14 ] ] }, { "type": "COMESTIBLE", @@ -261,7 +261,7 @@ "fun": 2, "flags": [ "SMOKABLE", "RAW", "EDIBLE_FROZEN" ], "smoking_result": "dry_fruit", - "vitamins": [ [ "vitA", 32 ], [ "vitC", 634 ], [ "calcium", 23 ], [ "iron", 8 ] ] + "vitamins": [ [ "vitC", 634 ], [ "calcium", 23 ], [ "iron", 8 ] ] }, { "type": "COMESTIBLE", @@ -326,7 +326,7 @@ "volume": "250 ml", "flags": [ "FREEZERBURN", "SMOKABLE" ], "smoking_result": "dry_fruit", - "vitamins": [ [ "vitA", 16 ], [ "vitC", 84 ], [ "calcium", 5 ], [ "iron", 1 ] ], + "vitamins": [ [ "vitC", 84 ], [ "calcium", 5 ], [ "iron", 1 ] ], "fun": 2 }, { @@ -460,7 +460,7 @@ "fun": 4, "flags": [ "SMOKABLE" ], "smoking_result": "dry_fruit", - "vitamins": [ [ "vitA", 3 ], [ "vitC", 12 ], [ "calcium", 1 ], [ "iron", 2 ] ] + "vitamins": [ [ "vitC", 12 ], [ "calcium", 1 ], [ "iron", 2 ] ] }, { "type": "COMESTIBLE", @@ -485,7 +485,7 @@ "flags": [ "EATEN_COLD", "FREEZERBURN", "SMOKABLE" ], "fun": 4, "smoking_result": "dry_fruit", - "vitamins": [ [ "vitA", 5 ], [ "vitC", 14 ], [ "calcium", 1 ], [ "iron", 2 ] ] + "vitamins": [ [ "vitC", 14 ], [ "calcium", 1 ], [ "iron", 2 ] ] }, { "type": "COMESTIBLE", @@ -510,7 +510,7 @@ "flags": [ "EATEN_COLD", "FREEZERBURN", "SMOKABLE" ], "fun": 4, "smoking_result": "dry_fruit", - "vitamins": [ [ "vitA", 30 ], [ "vitC", 65 ], [ "calcium", 1 ], [ "iron", 2 ] ] + "vitamins": [ [ "vitC", 65 ], [ "calcium", 1 ], [ "iron", 2 ] ] }, { "type": "COMESTIBLE", @@ -532,7 +532,7 @@ "fun": 4, "flags": [ "SMOKABLE", "RAW", "EDIBLE_FROZEN" ], "smoking_result": "dry_fruit", - "vitamins": [ [ "vitA", 1 ], [ "vitC", 9 ], [ "iron", 2 ] ] + "vitamins": [ [ "vitC", 9 ], [ "iron", 2 ] ] }, { "type": "COMESTIBLE", @@ -556,7 +556,7 @@ "fun": 5, "flags": [ "SMOKABLE" ], "smoking_result": "dry_fruit", - "vitamins": [ [ "vitA", 10 ], [ "vitC", 70 ], [ "calcium", 2 ], [ "iron", 2 ] ] + "vitamins": [ [ "vitC", 70 ], [ "calcium", 2 ], [ "iron", 2 ] ] }, { "type": "COMESTIBLE", @@ -602,7 +602,7 @@ "fun": 5, "flags": [ "SMOKABLE" ], "smoking_result": "dry_fruit", - "vitamins": [ [ "vitA", 13 ], [ "vitC", 164 ], [ "calcium", 5 ], [ "iron", 3 ] ] + "vitamins": [ [ "vitC", 164 ], [ "calcium", 5 ], [ "iron", 3 ] ] }, { "type": "COMESTIBLE", @@ -624,7 +624,7 @@ "fun": 3, "flags": [ "SMOKABLE" ], "smoking_result": "dry_fruit", - "vitamins": [ [ "vitA", 2 ], [ "vitC", 80 ], [ "calcium", 1 ], [ "iron", 1 ] ] + "vitamins": [ [ "vitC", 80 ], [ "calcium", 1 ], [ "iron", 1 ] ] }, { "type": "COMESTIBLE", @@ -647,7 +647,7 @@ "fun": 3, "flags": [ "SMOKABLE" ], "smoking_result": "dry_fruit", - "vitamins": [ [ "vitA", 17 ], [ "vitC", 18 ], [ "calcium", 2 ], [ "iron", 4 ] ] + "vitamins": [ [ "vitC", 18 ], [ "calcium", 2 ], [ "iron", 4 ] ] }, { "type": "COMESTIBLE", @@ -669,7 +669,7 @@ "fun": 6, "flags": [ "FREEZERBURN", "SMOKABLE" ], "smoking_result": "dry_fruit", - "vitamins": [ [ "vitA", 2 ], [ "vitC", 18 ], [ "iron", 1 ] ] + "vitamins": [ [ "vitC", 18 ], [ "iron", 1 ] ] }, { "type": "COMESTIBLE", @@ -690,6 +690,6 @@ "volume": "250 ml", "fun": -1, "flags": [ "RAW" ], - "vitamins": [ [ "vitA", 9 ], [ "vitC", 9 ], [ "calcium", 16 ], [ "iron", 3 ] ] + "vitamins": [ [ "vitC", 9 ], [ "calcium", 16 ], [ "iron", 3 ] ] } ] diff --git a/data/json/items/comestibles/raw_veggy.json b/data/json/items/comestibles/raw_veggy.json index b81624418a3f8..dcf7117dc3119 100644 --- a/data/json/items/comestibles/raw_veggy.json +++ b/data/json/items/comestibles/raw_veggy.json @@ -56,7 +56,7 @@ "volume": "180 ml", "flags": [ "EATEN_HOT", "SMOKABLE", "RAW" ], "smoking_result": "dry_veggy", - "vitamins": [ [ "vitA", 3 ], [ "vitC", 95 ], [ "calcium", 5 ], [ "iron", 4 ] ] + "vitamins": [ [ "vitC", 95 ], [ "calcium", 5 ], [ "iron", 4 ] ] }, { "type": "COMESTIBLE", @@ -121,7 +121,7 @@ "volume": "250 ml", "flags": [ "FREEZERBURN", "SMOKABLE", "RAW" ], "smoking_result": "dry_veggy", - "vitamins": [ [ "vitA", 21 ], [ "vitC", 2 ], [ "calcium", 4 ], [ "iron", 2 ] ] + "vitamins": [ [ "vitC", 2 ], [ "calcium", 4 ], [ "iron", 2 ] ] }, { "type": "COMESTIBLE", @@ -166,7 +166,7 @@ "fun": 1, "flags": [ "SMOKABLE", "RAW" ], "smoking_result": "dry_veggy", - "vitamins": [ [ "vitA", 63 ], [ "vitC", 5 ], [ "calcium", 3 ], [ "iron", 1 ] ] + "vitamins": [ [ "vitC", 5 ], [ "calcium", 3 ], [ "iron", 1 ] ] }, { "type": "COMESTIBLE", @@ -225,7 +225,7 @@ "volume": "190 ml", "flags": [ "FREEZERBURN", "SMOKABLE", "RAW" ], "smoking_result": "dry_veggy", - "vitamins": [ [ "vitA", 3 ], [ "vitC", 4 ], [ "calcium", 4 ], [ "iron", 1 ] ] + "vitamins": [ [ "vitC", 4 ], [ "calcium", 4 ], [ "iron", 1 ] ] }, { "type": "COMESTIBLE", @@ -245,7 +245,7 @@ "material": [ "veggy" ], "volume": "750 ml", "flags": [ "EATEN_HOT", "RAW" ], - "vitamins": [ [ "vitA", 2 ], [ "vitC", 12 ], [ "iron", 4 ] ], + "vitamins": [ [ "vitC", 12 ], [ "iron", 4 ] ], "use_action": { "type": "transform", "target": "empty_corn_cob", "moves": 500 } }, { @@ -266,7 +266,7 @@ "volume": "285 ml", "flags": [ "EATEN_HOT", "SMOKABLE", "RAW" ], "smoking_result": "dry_corn", - "vitamins": [ [ "vitA", 2 ], [ "vitC", 12 ], [ "iron", 4 ] ] + "vitamins": [ [ "vitC", 12 ], [ "iron", 4 ] ] }, { "type": "COMESTIBLE", @@ -324,7 +324,7 @@ "volume": "250 ml", "charges": 3, "flags": [ "FREEZERBURN", "RAW" ], - "vitamins": [ [ "vitA", 3 ], [ "vitC", 88 ], [ "calcium", 1 ], [ "iron", 3 ] ], + "vitamins": [ [ "vitC", 88 ], [ "calcium", 1 ], [ "iron", 3 ] ], "fun": -2 }, { @@ -521,7 +521,7 @@ "charges": 5, "flags": [ "FREEZERBURN", "SMOKABLE", "RAW" ], "smoking_result": "dry_veggy", - "vitamins": [ [ "vitA", 16 ], [ "vitC", 4 ], [ "calcium", 1 ], [ "iron", 2 ] ] + "vitamins": [ [ "vitC", 4 ], [ "calcium", 1 ], [ "iron", 2 ] ] }, { "type": "COMESTIBLE", @@ -601,7 +601,7 @@ "volume": "750 ml", "fun": -2, "flags": [ "EATEN_HOT", "RAW" ], - "vitamins": [ [ "vitA", 2 ], [ "vitC", 12 ], [ "iron", 4 ] ] + "vitamins": [ [ "vitC", 12 ], [ "iron", 4 ] ] }, { "type": "COMESTIBLE", @@ -646,7 +646,7 @@ "fun": -1, "flags": [ "SMOKABLE", "RAW" ], "smoking_result": "dry_veggy", - "vitamins": [ [ "vitA", 58 ], [ "vitC", 12 ], [ "calcium", 3 ], [ "iron", 5 ] ] + "vitamins": [ [ "vitC", 12 ], [ "calcium", 3 ], [ "iron", 5 ] ] }, { "type": "COMESTIBLE", @@ -666,7 +666,7 @@ "fun": -2, "flags": [ "FREEZERBURN", "SMOKABLE", "RAW" ], "smoking_result": "dry_veggy", - "vitamins": [ [ "vitA", 7 ], [ "vitC", 30 ], [ "calcium", 2 ], [ "iron", 3 ] ] + "vitamins": [ [ "vitC", 30 ], [ "calcium", 2 ], [ "iron", 3 ] ] }, { "type": "COMESTIBLE", @@ -688,7 +688,7 @@ "fun": -12, "flags": [ "FREEZERBURN", "SMOKABLE", "RAW" ], "smoking_result": "dry_veggy", - "vitamins": [ [ "vitA", 33 ], [ "vitC", 23 ], [ "calcium", 11 ], [ "iron", 10 ] ] + "vitamins": [ [ "vitC", 23 ], [ "calcium", 11 ], [ "iron", 10 ] ] }, { "type": "COMESTIBLE", @@ -731,7 +731,7 @@ "volume": "250 ml", "flags": [ "SMOKABLE", "RAW" ], "smoking_result": "dry_veggy", - "vitamins": [ [ "vitA", 1 ], [ "vitC", 11 ], [ "calcium", 11 ], [ "iron", 2 ] ] + "vitamins": [ [ "vitC", 11 ], [ "calcium", 11 ], [ "iron", 2 ] ] }, { "type": "COMESTIBLE", @@ -824,7 +824,7 @@ "smoking_result": "dry_veggy", "volume": "250 ml", "//": "average of broccoli, cabbage, carrot, cattail_stalk, celery, chili_pepper, cucumber, lettuce, onion, pumpkin, raw_dandelion, rhubarb, sugar_beet, tomato, zucchini", - "vitamins": [ [ "vitA", 16 ], [ "vitC", 36 ], [ "calcium", 4 ], [ "iron", 4 ] ] + "vitamins": [ [ "vitC", 36 ], [ "calcium", 4 ], [ "iron", 4 ] ] }, { "type": "COMESTIBLE", @@ -931,7 +931,7 @@ "cooks_like": "lentils_cooked", "flags": [ "SMOKABLE", "RAW" ], "smoking_result": "dry_lentils", - "vitamins": [ [ "calcium", 2 ], [ "iron", 3 ], [ "vitC", 1 ], [ "vitB", 1 ] ] + "vitamins": [ [ "calcium", 2 ], [ "iron", 3 ], [ "vitC", 1 ] ] }, { "type": "COMESTIBLE", @@ -952,7 +952,7 @@ "fun": -10, "healthy": -2, "//": "Fiddleheads that haven't been boiled can make you sick.", - "vitamins": [ [ "vitC", 6 ], [ "vitA", 10 ], [ "calcium", 4 ] ] + "vitamins": [ [ "vitC", 6 ], [ "calcium", 4 ] ] }, { "type": "COMESTIBLE", @@ -973,7 +973,7 @@ "flags": [ "SMOKABLE", "RAW" ], "smoking_result": "dry_veggy", "fun": -5, - "vitamins": [ [ "calcium", 2 ], [ "vitC", 12 ], [ "vitA", 8 ] ] + "vitamins": [ [ "calcium", 2 ], [ "vitC", 12 ] ] }, { "type": "COMESTIBLE", diff --git a/data/json/items/comestibles/sandwich.json b/data/json/items/comestibles/sandwich.json index 2afaaec06cee2..434bd4caceca3 100644 --- a/data/json/items/comestibles/sandwich.json +++ b/data/json/items/comestibles/sandwich.json @@ -19,7 +19,7 @@ "volume": "250 ml", "flags": [ "EATEN_HOT" ], "fun": 10, - "vitamins": [ [ "vitA", 18 ], [ "calcium", 50 ], [ "iron", 12 ] ] + "vitamins": [ [ "calcium", 50 ], [ "iron", 12 ] ] }, { "type": "COMESTIBLE", @@ -40,7 +40,7 @@ "primary_material": "wheat", "volume": "250 ml", "fun": 6, - "vitamins": [ [ "vitA", 18 ], [ "calcium", 50 ], [ "iron", 12 ] ] + "vitamins": [ [ "calcium", 50 ], [ "iron", 12 ] ] }, { "type": "COMESTIBLE", @@ -61,7 +61,7 @@ "primary_material": "veggy", "volume": "250 ml", "fun": 6, - "vitamins": [ [ "vitA", 18 ], [ "calcium", 50 ], [ "iron", 12 ] ] + "vitamins": [ [ "calcium", 50 ], [ "iron", 12 ] ] }, { "type": "COMESTIBLE", @@ -91,7 +91,7 @@ "volume": "250 ml", "charges": 2, "fun": 12, - "vitamins": [ [ "vitA", 8 ], [ "vitC", 26 ], [ "calcium", 8 ], [ "iron", 49 ], [ "vitB", 389 ] ] + "vitamins": [ [ "vitC", 26 ], [ "calcium", 8 ], [ "iron", 49 ] ] }, { "type": "COMESTIBLE", @@ -121,7 +121,7 @@ "volume": "250 ml", "charges": 2, "fun": 14, - "vitamins": [ [ "vitA", 8 ], [ "vitC", 26 ], [ "calcium", 8 ], [ "iron", 49 ], [ "vitB", 389 ] ] + "vitamins": [ [ "vitC", 26 ], [ "calcium", 8 ], [ "iron", 49 ] ] }, { "type": "COMESTIBLE", @@ -162,7 +162,7 @@ "primary_material": "wheat", "volume": "250 ml", "fun": 8, - "vitamins": [ [ "vitA", 18 ], [ "calcium", 50 ], [ "iron", 12 ] ] + "vitamins": [ [ "calcium", 50 ], [ "iron", 12 ] ] }, { "type": "COMESTIBLE", @@ -225,7 +225,7 @@ "primary_material": "wheat", "volume": "250 ml", "fun": 15, - "vitamins": [ [ "vitA", 7 ], [ "vitB", 3 ], [ "vitC", 6 ], [ "calcium", 7 ], [ "iron", 12 ] ] + "vitamins": [ [ "vitC", 6 ], [ "calcium", 7 ], [ "iron", 12 ] ] }, { "type": "COMESTIBLE", @@ -302,7 +302,7 @@ "volume": "250 ml", "flags": [ "EATEN_COLD" ], "fun": 1, - "vitamins": [ [ "vitA", 16 ], [ "vitC", 36 ], [ "calcium", 14 ], [ "iron", 28 ] ] + "vitamins": [ [ "vitC", 36 ], [ "calcium", 14 ], [ "iron", 28 ] ] }, { "type": "COMESTIBLE", @@ -331,7 +331,7 @@ "volume": "300 ml", "charges": 2, "fun": 2, - "vitamins": [ [ "vitC", 8 ], [ "calcium", 6 ], [ "iron", 47 ], [ "vitB", 389 ] ] + "vitamins": [ [ "vitC", 8 ], [ "calcium", 6 ], [ "iron", 47 ] ] }, { "type": "COMESTIBLE", @@ -432,7 +432,7 @@ "material": [ "flesh", "wheat" ], "volume": "250 ml", "fun": 14, - "vitamins": [ [ "vitA", 4 ], [ "vitC", 5 ], [ "calcium", 19 ], [ "iron", 17 ] ] + "vitamins": [ [ "vitC", 5 ], [ "calcium", 19 ], [ "iron", 17 ] ] }, { "type": "COMESTIBLE", @@ -451,7 +451,7 @@ "material": [ "flesh", "wheat" ], "volume": "250 ml", "fun": 14, - "vitamins": [ [ "vitA", 4 ], [ "vitC", 5 ], [ "calcium", 12 ], [ "iron", 24 ] ] + "vitamins": [ [ "vitC", 5 ], [ "calcium", 12 ], [ "iron", 24 ] ] }, { "type": "COMESTIBLE", @@ -474,7 +474,7 @@ "charges": 2, "flags": [ "EATEN_HOT" ], "fun": 8, - "vitamins": [ [ "vitA", 8 ], [ "vitC", 10 ], [ "calcium", 7 ], [ "iron", 18 ], [ "vitB", 20 ] ] + "vitamins": [ [ "vitC", 10 ], [ "calcium", 7 ], [ "iron", 18 ] ] }, { "type": "COMESTIBLE", @@ -496,7 +496,7 @@ "volume": "250 ml", "flags": [ "EATEN_HOT" ], "fun": 10, - "vitamins": [ [ "vitA", 18 ], [ "calcium", 50 ], [ "iron", 12 ] ] + "vitamins": [ [ "calcium", 50 ], [ "iron", 12 ] ] }, { "type": "COMESTIBLE", @@ -526,7 +526,7 @@ "volume": "250 ml", "charges": 2, "fun": 12, - "vitamins": [ [ "vitA", 8 ], [ "vitC", 26 ], [ "calcium", 8 ], [ "iron", 49 ], [ "vitB", 389 ] ] + "vitamins": [ [ "vitC", 26 ], [ "calcium", 8 ], [ "iron", 49 ] ] }, { "type": "COMESTIBLE", @@ -556,7 +556,7 @@ "volume": "250 ml", "charges": 2, "fun": 14, - "vitamins": [ [ "vitA", 8 ], [ "vitC", 26 ], [ "calcium", 8 ], [ "iron", 49 ], [ "vitB", 389 ] ] + "vitamins": [ [ "vitC", 26 ], [ "calcium", 8 ], [ "iron", 49 ] ] }, { "type": "COMESTIBLE", @@ -597,7 +597,7 @@ "primary_material": "veggy", "volume": "250 ml", "fun": 8, - "vitamins": [ [ "vitA", 18 ], [ "calcium", 50 ], [ "iron", 12 ] ] + "vitamins": [ [ "calcium", 50 ], [ "iron", 12 ] ] }, { "type": "COMESTIBLE", @@ -660,7 +660,7 @@ "primary_material": "veggy", "volume": "250 ml", "fun": 15, - "vitamins": [ [ "vitA", 7 ], [ "vitB", 3 ], [ "vitC", 6 ], [ "calcium", 7 ], [ "iron", 12 ] ] + "vitamins": [ [ "vitC", 6 ], [ "calcium", 7 ], [ "iron", 12 ] ] }, { "type": "COMESTIBLE", @@ -736,7 +736,7 @@ "volume": "250 ml", "flags": [ "EATEN_COLD" ], "fun": 1, - "vitamins": [ [ "vitA", 16 ], [ "vitC", 36 ], [ "calcium", 14 ], [ "iron", 28 ] ] + "vitamins": [ [ "calcium", 14 ], [ "iron", 28 ] ] }, { "type": "COMESTIBLE", @@ -769,7 +769,7 @@ "volume": "300 ml", "charges": 2, "fun": 2, - "vitamins": [ [ "vitC", 8 ], [ "calcium", 6 ], [ "iron", 47 ], [ "vitB", 389 ] ] + "vitamins": [ [ "vitC", 8 ], [ "calcium", 6 ], [ "iron", 47 ] ] }, { "type": "COMESTIBLE", @@ -870,7 +870,7 @@ "material": [ "flesh", "veggy" ], "volume": "250 ml", "fun": 14, - "vitamins": [ [ "vitA", 4 ], [ "vitC", 5 ], [ "calcium", 19 ], [ "iron", 17 ] ] + "vitamins": [ [ "vitC", 5 ], [ "calcium", 19 ], [ "iron", 17 ] ] }, { "type": "COMESTIBLE", @@ -893,6 +893,6 @@ "charges": 2, "flags": [ "EATEN_HOT" ], "fun": 8, - "vitamins": [ [ "vitA", 8 ], [ "vitC", 10 ], [ "calcium", 7 ], [ "iron", 18 ], [ "vitB", 20 ] ] + "vitamins": [ [ "vitC", 10 ], [ "calcium", 7 ], [ "iron", 18 ] ] } ] diff --git a/data/json/items/comestibles/soup.json b/data/json/items/comestibles/soup.json index 43debcfa80c6d..a474c53129f96 100644 --- a/data/json/items/comestibles/soup.json +++ b/data/json/items/comestibles/soup.json @@ -74,7 +74,7 @@ "charges": 2, "phase": "liquid", "flags": [ "EATEN_HOT", "USE_EAT_VERB" ], - "vitamins": [ [ "vitA", 43 ], [ "vitC", 4 ], [ "calcium", 1 ], [ "iron", 5 ] ], + "vitamins": [ [ "vitC", 4 ], [ "calcium", 1 ], [ "iron", 5 ] ], "fun": 1 }, { @@ -104,7 +104,7 @@ "charges": 2, "phase": "liquid", "flags": [ "EATEN_HOT", "USE_EAT_VERB" ], - "vitamins": [ [ "vitA", 80 ], [ "vitC", 36 ], [ "calcium", 3 ], [ "iron", 13 ], [ "vitB", 20 ] ], + "vitamins": [ [ "vitC", 36 ], [ "calcium", 3 ], [ "iron", 13 ] ], "fun": 1 }, { @@ -129,7 +129,7 @@ "charges": 2, "phase": "liquid", "flags": [ "EATEN_HOT", "USE_EAT_VERB" ], - "vitamins": [ [ "vitA", 12 ], [ "vitC", 28 ], [ "calcium", 4 ], [ "iron", 5 ], [ "vitB", 20 ] ], + "vitamins": [ [ "vitC", 28 ], [ "calcium", 4 ], [ "iron", 5 ] ], "fun": 1 }, { @@ -154,7 +154,7 @@ "volume": "500 ml", "phase": "liquid", "flags": [ "EATEN_HOT", "USE_EAT_VERB" ], - "vitamins": [ [ "vitA", 178 ], [ "vitC", 35 ], [ "calcium", 4 ], [ "iron", 12 ] ], + "vitamins": [ [ "vitC", 35 ], [ "calcium", 4 ], [ "iron", 12 ] ], "fun": 5 }, { @@ -180,7 +180,7 @@ "phase": "liquid", "charges": 2, "flags": [ "EATEN_HOT", "USE_EAT_VERB" ], - "vitamins": [ [ "vitA", 19 ], [ "vitC", 30 ], [ "calcium", 5 ], [ "iron", 28 ], [ "vitB", 24 ] ], + "vitamins": [ [ "vitC", 30 ], [ "calcium", 5 ], [ "iron", 28 ] ], "fun": 8 }, { @@ -206,7 +206,7 @@ "charges": 2, "phase": "liquid", "flags": [ "EATEN_HOT", "USE_EAT_VERB" ], - "vitamins": [ [ "vitA", 20 ], [ "vitC", 9 ], [ "iron", 3 ], [ "vitB", 5 ] ], + "vitamins": [ [ "vitC", 9 ], [ "iron", 3 ] ], "fun": 1 }, { @@ -232,7 +232,7 @@ "charges": 2, "phase": "liquid", "flags": [ "EATEN_HOT", "USE_EAT_VERB" ], - "vitamins": [ [ "vitA", 20 ], [ "vitC", 9 ], [ "iron", 3 ], [ "vitB", 5 ] ], + "vitamins": [ [ "vitC", 9 ], [ "iron", 3 ] ], "fun": 1 }, { @@ -258,7 +258,7 @@ "charges": 2, "phase": "liquid", "flags": [ "EATEN_HOT", "USE_EAT_VERB" ], - "vitamins": [ [ "vitA", 10 ], [ "calcium", 1 ], [ "iron", 9 ], [ "vitB", 8 ] ], + "vitamins": [ [ "calcium", 1 ], [ "iron", 9 ] ], "fun": 2 }, { @@ -333,7 +333,7 @@ "volume": "250 ml", "phase": "liquid", "flags": [ "EATEN_HOT", "USE_EAT_VERB" ], - "vitamins": [ [ "vitA", 7 ], [ "vitC", 10 ], [ "calcium", 1 ], [ "iron", 4 ] ], + "vitamins": [ [ "vitC", 10 ], [ "calcium", 1 ], [ "iron", 4 ] ], "fun": 2 }, { @@ -359,7 +359,7 @@ "charges": 2, "phase": "liquid", "flags": [ "EATEN_HOT", "USE_EAT_VERB" ], - "vitamins": [ [ "vitA", 81 ], [ "vitC", 7 ], [ "calcium", 9 ], [ "iron", 13 ], [ "vitB", 20 ] ], + "vitamins": [ [ "vitC", 7 ], [ "calcium", 9 ], [ "iron", 13 ] ], "fun": 3 }, { @@ -384,7 +384,7 @@ "charges": 2, "phase": "liquid", "flags": [ "EATEN_HOT", "USE_EAT_VERB" ], - "vitamins": [ [ "vitA", 15 ], [ "vitC", 8 ], [ "calcium", 7 ], [ "iron", 7 ], [ "vitB", 8 ] ], + "vitamins": [ [ "vitC", 8 ], [ "calcium", 7 ], [ "iron", 7 ] ], "fun": 3 }, { @@ -407,7 +407,7 @@ "volume": "170 ml", "phase": "liquid", "flags": [ "EATEN_HOT", "USE_EAT_VERB" ], - "vitamins": [ [ "vitA", 4 ], [ "iron", 2 ] ], + "vitamins": [ [ "iron", 2 ] ], "fun": 1 }, { @@ -429,7 +429,7 @@ "material": [ "powder", "flesh", "wheat" ], "volume": "13 ml", "flags": [ "EDIBLE_FROZEN" ], - "vitamins": [ [ "vitA", 4 ], [ "iron", 2 ] ], + "vitamins": [ [ "iron", 2 ] ], "fun": -10 }, { diff --git a/data/json/items/comestibles/veggy_dishes.json b/data/json/items/comestibles/veggy_dishes.json index ed9e9c5c7fc5b..687b2f6060b1d 100644 --- a/data/json/items/comestibles/veggy_dishes.json +++ b/data/json/items/comestibles/veggy_dishes.json @@ -235,7 +235,7 @@ "color": "yellow", "symbol": "%", "material": [ "veggy" ], - "vitamins": [ [ "vitA", 6 ], [ "vitC", 3 ], [ "iron", 3 ] ], + "vitamins": [ [ "vitC", 3 ], [ "iron", 3 ] ], "spoils_in": "2 days", "container": "can_medium", "quench": 5, @@ -256,7 +256,7 @@ "color": "yellow", "symbol": "%", "material": [ "veggy" ], - "vitamins": [ [ "vitA", 6 ], [ "vitC", 3 ], [ "iron", 3 ] ], + "vitamins": [ [ "vitC", 3 ], [ "iron", 3 ] ], "spoils_in": "2 days", "quench": -2, "calories": 370, @@ -275,7 +275,7 @@ "color": "yellow", "symbol": "%", "material": [ "veggy" ], - "vitamins": [ [ "vitA", 6 ], [ "vitC", 3 ], [ "iron", 3 ] ], + "vitamins": [ [ "vitC", 3 ], [ "iron", 3 ] ], "spoils_in": "2 days", "calories": 172, "fun": 3, @@ -294,7 +294,7 @@ "color": "yellow", "symbol": "%", "material": [ "veggy" ], - "vitamins": [ [ "vitA", 6 ], [ "vitC", 3 ], [ "iron", 3 ] ], + "vitamins": [ [ "vitC", 3 ], [ "iron", 3 ] ], "spoils_in": "2 days", "container": "bowl_plastic", "calories": 120, @@ -315,7 +315,7 @@ "symbol": "%", "quench": -1, "calories": 44, - "vitamins": [ [ "vitA", 2 ], [ "vitC", 12 ], [ "iron", 4 ] ], + "vitamins": [ [ "vitC", 12 ], [ "iron", 4 ] ], "description": "This yellow cornmeal is useful for baking.", "price": 450, "price_postapoc": 25, @@ -390,7 +390,7 @@ "flags": [ "EATEN_HOT", "FREEZERBURN", "NUTRIENT_OVERRIDE" ], "fun": 2, "charges": 1, - "vitamins": [ [ "vitA", 1 ], [ "iron", 11 ] ] + "vitamins": [ [ "iron", 11 ] ] }, { "type": "COMESTIBLE", @@ -411,7 +411,7 @@ "volume": "500 ml", "flags": [ "EATEN_HOT", "FREEZERBURN" ], "fun": 5, - "vitamins": [ [ "vitA", 2 ], [ "vitC", 4 ], [ "calcium", 3 ], [ "iron", 3 ] ] + "vitamins": [ [ "vitC", 4 ], [ "calcium", 3 ], [ "iron", 3 ] ] }, { "type": "COMESTIBLE", @@ -452,7 +452,7 @@ "volume": "250 ml", "flags": [ "EATEN_HOT", "NUTRIENT_OVERRIDE" ], "fun": 5, - "vitamins": [ [ "calcium", 17 ], [ "iron", 16 ], [ "vitC", 84 ], [ "vitA", 61 ] ] + "vitamins": [ [ "calcium", 17 ], [ "iron", 16 ], [ "vitC", 84 ] ] }, { "type": "COMESTIBLE", @@ -473,7 +473,7 @@ "volume": "1 L", "flags": [ "EATEN_HOT", "NUTRIENT_OVERRIDE" ], "fun": 19, - "vitamins": [ [ "vitA", 2 ], [ "calcium", 7 ], [ "iron", 5 ], [ "vitC", 24 ] ] + "vitamins": [ [ "calcium", 7 ], [ "iron", 5 ], [ "vitC", 24 ] ] }, { "type": "COMESTIBLE", @@ -514,7 +514,7 @@ "volume": "250 ml", "flags": [ "EATEN_HOT", "NUTRIENT_OVERRIDE" ], "fun": 3, - "vitamins": [ [ "vitA", 1 ], [ "vitC", 9 ], [ "calcium", 13 ], [ "iron", 8 ] ] + "vitamins": [ [ "vitC", 9 ], [ "calcium", 13 ], [ "iron", 8 ] ] }, { "type": "COMESTIBLE", @@ -534,7 +534,7 @@ "volume": "250 ml", "flags": [ "EATEN_HOT", "NUTRIENT_OVERRIDE" ], "fun": 4, - "vitamins": [ [ "vitA", 53 ], [ "vitC", 4 ], [ "calcium", 2 ], [ "iron", 1 ] ] + "vitamins": [ [ "vitC", 4 ], [ "calcium", 2 ], [ "iron", 1 ] ] }, { "type": "COMESTIBLE", @@ -575,7 +575,7 @@ "charges": 8, "flags": [ "EATEN_HOT" ], "fun": 3, - "vitamins": [ [ "vitA", 5 ], [ "vitC", 4 ], [ "calcium", 3 ], [ "iron", 14 ] ] + "vitamins": [ [ "vitC", 4 ], [ "calcium", 3 ], [ "iron", 14 ] ] }, { "type": "COMESTIBLE", @@ -596,7 +596,7 @@ "charges": 4, "flags": [ "EATEN_HOT" ], "fun": 10, - "vitamins": [ [ "vitA", 7 ], [ "vitC", 20 ], [ "calcium", 30 ], [ "iron", 20 ] ] + "vitamins": [ [ "vitC", 20 ], [ "calcium", 30 ], [ "iron", 20 ] ] }, { "type": "COMESTIBLE", @@ -617,7 +617,7 @@ "volume": "250 ml", "charges": 4, "phase": "liquid", - "vitamins": [ [ "vitA", 7 ], [ "calcium", 11 ], [ "iron", 3 ] ], + "vitamins": [ [ "calcium", 11 ], [ "iron", 3 ] ], "fun": 4 }, { @@ -666,7 +666,7 @@ "sealed": true, "material": [ "veggy" ], "volume": "250 ml", - "vitamins": [ [ "vitA", 73 ], [ "vitC", 11 ], [ "calcium", 5 ], [ "iron", 9 ] ] + "vitamins": [ [ "vitC", 11 ], [ "calcium", 5 ], [ "iron", 9 ] ] }, { "type": "COMESTIBLE", @@ -714,7 +714,7 @@ "price_postapoc": 100, "material": [ "veggy" ], "volume": "250 ml", - "vitamins": [ [ "vitA", 46 ], [ "vitC", 7 ], [ "calcium", 5 ], [ "iron", 9 ] ] + "vitamins": [ [ "vitC", 7 ], [ "calcium", 5 ], [ "iron", 9 ] ] }, { "type": "COMESTIBLE", @@ -878,7 +878,7 @@ "milling": { "into": "cornmeal", "conversion_rate": 3 }, "volume": "255 ml", "flags": [ "EDIBLE_FROZEN", "RAW" ], - "vitamins": [ [ "vitA", 2 ], [ "vitC", 12 ], [ "iron", 4 ] ], + "vitamins": [ [ "vitC", 12 ], [ "iron", 4 ] ], "fun": -10 }, { @@ -936,7 +936,7 @@ "smoking_result": "dry_corn", "volume": "95 ml", "delete": { "flags": [ "RAW" ] }, - "vitamins": [ [ "vitA", 2 ], [ "vitC", 12 ], [ "iron", 4 ] ], + "vitamins": [ [ "vitC", 12 ], [ "iron", 4 ] ], "fun": 2 }, { @@ -1075,7 +1075,7 @@ "material": [ "veggy" ], "volume": "250 ml", "fun": 12, - "vitamins": [ [ "vitA", 28 ], [ "vitC", 80 ], [ "calcium", 2 ], [ "iron", 4 ] ] + "vitamins": [ [ "vitC", 80 ], [ "calcium", 2 ], [ "iron", 4 ] ] }, { "type": "COMESTIBLE", @@ -1128,7 +1128,7 @@ "price_postapoc": 50, "material": [ "veggy" ], "volume": "500 ml", - "vitamins": [ [ "vitA", 27 ], [ "vitC", 27 ], [ "calcium", 48 ], [ "iron", 9 ] ], + "vitamins": [ [ "vitC", 27 ], [ "calcium", 48 ], [ "iron", 9 ] ], "fun": 3 }, { @@ -1149,7 +1149,7 @@ "volume": "120 ml", "fun": 1, "healthy": 1, - "vitamins": [ [ "vitC", 6 ], [ "vitA", 10 ], [ "calcium", 4 ] ] + "vitamins": [ [ "vitC", 6 ], [ "calcium", 4 ] ] }, { "type": "COMESTIBLE", @@ -1169,7 +1169,7 @@ "volume": "240 ml", "fun": 5, "healthy": 1, - "vitamins": [ [ "vitC", 32 ], [ "vitA", 40 ], [ "calcium", 4 ] ] + "vitamins": [ [ "vitC", 32 ], [ "calcium", 4 ] ] }, { "type": "COMESTIBLE", @@ -1182,6 +1182,6 @@ "price": 0, "delete": { "flags": [ "RAW" ] }, "fun": 1, - "vitamins": [ [ "vitC", 32 ], [ "vitA", 40 ], [ "calcium", 4 ] ] + "vitamins": [ [ "vitC", 32 ], [ "calcium", 4 ] ] } ] diff --git a/data/json/items/comestibles/wheat.json b/data/json/items/comestibles/wheat.json index 9c9eebd9f69cb..04f6c79c2d1a5 100644 --- a/data/json/items/comestibles/wheat.json +++ b/data/json/items/comestibles/wheat.json @@ -271,7 +271,7 @@ "charges": 2, "flags": [ "EATEN_HOT" ], "fun": 3, - "vitamins": [ [ "vitA", 1 ], [ "vitC", 30 ], [ "calcium", 1 ], [ "iron", 10 ] ] + "vitamins": [ [ "vitC", 30 ], [ "calcium", 1 ], [ "iron", 10 ] ] }, { "type": "COMESTIBLE", @@ -293,7 +293,7 @@ "charges": 4, "flags": [ "EATEN_HOT" ], "fun": 3, - "vitamins": [ [ "vitA", 1 ], [ "calcium", 6 ], [ "iron", 4 ] ] + "vitamins": [ [ "calcium", 6 ], [ "iron", 4 ] ] }, { "type": "COMESTIBLE", @@ -307,7 +307,7 @@ "price": 650, "price_postapoc": 75, "fun": 4, - "vitamins": [ [ "vitA", 2 ], [ "vitC", 30 ], [ "calcium", 4 ], [ "iron", 3 ] ] + "vitamins": [ [ "vitC", 30 ], [ "calcium", 4 ], [ "iron", 3 ] ] }, { "type": "COMESTIBLE", @@ -344,7 +344,7 @@ "charges": 2, "flags": [ "EATEN_HOT" ], "fun": 8, - "vitamins": [ [ "vitA", 4 ], [ "calcium", 3 ], [ "iron", 5 ] ] + "vitamins": [ [ "calcium", 3 ], [ "iron", 5 ] ] }, { "type": "COMESTIBLE", @@ -364,7 +364,7 @@ "volume": "250 ml", "flags": [ "EATEN_HOT" ], "fun": 5, - "vitamins": [ [ "vitA", 3 ], [ "calcium", 15 ], [ "iron", 9 ] ] + "vitamins": [ [ "calcium", 15 ], [ "iron", 9 ] ] }, { "type": "COMESTIBLE", @@ -385,7 +385,7 @@ "volume": "375 ml", "flags": [ "EATEN_HOT" ], "fun": 6, - "vitamins": [ [ "vitA", 6 ], [ "vitC", 120 ], [ "calcium", 2 ], [ "iron", 2 ] ] + "vitamins": [ [ "vitC", 120 ], [ "calcium", 2 ], [ "iron", 2 ] ] }, { "type": "COMESTIBLE", @@ -445,7 +445,7 @@ "flags": [ "EATEN_HOT" ], "fun": 3, "//": "these vitamins are only for pies that may spawn. generally they will be inherited from the fruit used.", - "vitamins": [ [ "vitA", 3 ], [ "vitC", 6 ], [ "calcium", 1 ], [ "iron", 3 ] ] + "vitamins": [ [ "vitC", 6 ], [ "calcium", 1 ], [ "iron", 3 ] ] }, { "type": "COMESTIBLE", @@ -467,7 +467,7 @@ "charges": 4, "flags": [ "EATEN_HOT" ], "fun": 10, - "vitamins": [ [ "vitA", 12 ], [ "vitC", 4 ], [ "calcium", 25 ], [ "iron", 23 ] ] + "vitamins": [ [ "vitC", 4 ], [ "calcium", 25 ], [ "iron", 23 ] ] }, { "type": "COMESTIBLE", @@ -515,7 +515,7 @@ "charges": 8, "flags": [ "EATEN_HOT" ], "fun": 6, - "vitamins": [ [ "vitA", 2 ], [ "calcium", 4 ], [ "iron", 8 ] ] + "vitamins": [ [ "calcium", 4 ], [ "iron", 8 ] ] }, { "type": "COMESTIBLE", @@ -579,7 +579,7 @@ "charges": 6, "flags": [ "EATEN_HOT" ], "fun": 6, - "vitamins": [ [ "vitA", 8 ], [ "calcium", 2 ], [ "iron", 4 ] ] + "vitamins": [ [ "calcium", 2 ], [ "iron", 4 ] ] }, { "id": "sponge_cake", @@ -599,7 +599,7 @@ "calories": 278, "fun": 4, "spoils_in": 420, - "vitamins": [ [ "vitA", 8 ], [ "calcium", 2 ], [ "iron", 5 ] ], + "vitamins": [ [ "calcium", 2 ], [ "iron", 5 ] ], "flags": [ "EATEN_HOT" ] }, { diff --git a/data/json/items/containers.json b/data/json/items/containers.json index a3ae34ef64aec..72ff87b22a826 100644 --- a/data/json/items/containers.json +++ b/data/json/items/containers.json @@ -1299,7 +1299,7 @@ "id": "jar_glass_sealed", "type": "GENERIC", "category": "container", - "name": { "str": "glass jar" }, + "name": { "str": "0.5L glass jar" }, "description": "A half-liter glass jar with a metal screw top lid, used for canning. Preserves content from rot until opened (assuming it was sterile before sealing).", "weight": "150 g", "volume": "680 ml", @@ -1625,6 +1625,32 @@ } ] }, + { + "id": "waterproof_smart_phone_case", + "type": "GENERIC", + "category": "container", + "name": { "str": "waterproof smartphone case" }, + "looks_like": "smart_phone", + "description": "A waterproof case designed for a standard smartphone. Will protect your smartphone from water damage entirely.", + "weight": "50 g", + "volume": "125 ml", + "price": 1000, + "price_postapoc": 100, + "material": [ "plastic" ], + "symbol": ";", + "color": "light_gray", + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "max_contains_volume": "100 ml", + "max_contains_weight": "230 g", + "moves": 100, + "watertight": true, + "rigid": true, + "item_restriction": [ "smart_phone" ] + } + ] + }, { "id": "waterskin", "type": "GENERIC", diff --git a/data/json/items/generic.json b/data/json/items/generic.json index 5e2df9674d4a0..5d3bae548f859 100644 --- a/data/json/items/generic.json +++ b/data/json/items/generic.json @@ -698,6 +698,49 @@ "volume": "100 ml", "to_hit": -2 }, + { + "type": "GENERIC", + "id": "lc_wire", + "symbol": ";", + "color": "light_gray", + "name": { "str": "mild steel wire" }, + "description": "A length of thin, relatively stiff, steel wire. Like the sort you find in wire fences.", + "category": "spare_parts", + "price": 20000, + "price_postapoc": 100, + "material": [ "lc_steel" ], + "weight": "151 g", + "volume": "100 ml", + "to_hit": -2 + }, + { + "type": "GENERIC", + "id": "mc_wire", + "copy-from": "lc_wire", + "name": { "str": "medium steel wire" }, + "material": [ "mc_steel" ] + }, + { + "type": "GENERIC", + "id": "hc_wire", + "copy-from": "lc_wire", + "name": { "str": "high steel wire" }, + "material": [ "hc_steel" ] + }, + { + "type": "GENERIC", + "id": "ch_wire", + "copy-from": "lc_wire", + "name": { "str": "hardened steel wire" }, + "material": [ "ch_steel" ] + }, + { + "type": "GENERIC", + "id": "qt_wire", + "copy-from": "lc_wire", + "name": { "str": "tempered steel wire" }, + "material": [ "qt_steel" ] + }, { "type": "GENERIC", "id": "wire_barbed", diff --git a/data/json/items/obsolete.json b/data/json/items/obsolete.json index 43101382d10fb..fe51b2704d108 100644 --- a/data/json/items/obsolete.json +++ b/data/json/items/obsolete.json @@ -272,6 +272,23 @@ "use_action": { "type": "unpack", "group": "mre_full_pack" }, "price": 1000 }, + { + "id": "inj_vitb", + "type": "COMESTIBLE", + "comestible_type": "MED", + "name": { "str": "injectable vitamin B" }, + "description": "Small vials of pale yellow liquid containing soluble vitamin B for injection.", + "weight": "40 g", + "volume": "250 ml", + "price": 150, + "price_postapoc": 500, + "charges": 2, + "stack_size": 10, + "symbol": "!", + "color": "magenta", + "flags": [ "NO_INGEST", "IRREPLACEABLE_CONSUMABLE" ], + "use_action": { "type": "consume_drug", "activation_message": "You inject some vitamin B.", "tools_needed": { "syringe": -1 } } + }, { "id": "aep_suit", "type": "ARMOR", @@ -531,5 +548,58 @@ "material_thickness": 4, "techniques": [ "WBLOCK_1" ], "flags": [ "VARSIZE", "WATERPROOF", "STURDY" ] + }, + { + "id": "kevlar_chainmail_hauberk", + "type": "ARMOR", + "name": { "str": "Kevlar chainmail hauberk" }, + "description": "A fully customized chainmail outfit, leaving the head uncovered. The shirt, arms, and leggings have been modified with straps and combined with a kevlar gambeson to deal with uneven weight distribution, cold environments and to allow them to be used separately.", + "copy-from": "chainmail_hauberk", + "material": [ { "type": "steel", "portion": 5 }, { "type": "kevlar_layered", "portion": 3 }, { "type": "kevlar", "portion": 2 } ] + }, + { + "id": "xl_kevlar_chainmail_hauberk", + "type": "ARMOR", + "name": { "str": "XL Kevlar chainmail hauberk" }, + "copy-from": "kevlar_chainmail_hauberk", + "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "kevlar_chainmail_hauberk_xs", + "type": "ARMOR", + "copy-from": "kevlar_chainmail_hauberk", + "looks_like": "kevlar_chainmail_hauberk", + "name": { "str": "XS kevlar chainmail hauberk" }, + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "flags": [ "UNDERSIZE" ] + }, + { + "id": "kevlar_chainmail_suit", + "type": "ARMOR", + "name": { "str": "Kevlar chainmail armor" }, + "description": "A fully customized chainmail suit. The shirt, arms, and leggings have been modified with straps and combined with a kevlar gambeson to deal with uneven weight distribution, cold environments and to allow them to be used separately.", + "copy-from": "chainmail_suit", + "material_thickness": 6, + "material": [ { "type": "steel", "portion": 5 }, { "type": "kevlar_layered", "portion": 3 }, { "type": "kevlar", "portion": 2 } ], + "armor": [ { "encumbrance": 20, "coverage": 95, "covers": [ "head", "torso", "leg_l", "leg_r", "arm_l", "arm_r" ] } ], + "flags": [ "VARSIZE", "STURDY", "HELMET_COMPAT", "OUTER", "NONCONDUCTIVE" ] + }, + { + "id": "xl_kevlar_chainmail_suit", + "type": "ARMOR", + "name": { "str": "XL kevlar chainmail armor" }, + "copy-from": "kevlar_chainmail_suit", + "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, + "extend": { "flags": [ "OVERSIZE" ] } + }, + { + "id": "kevlar_chainmail_suit_xs", + "type": "ARMOR", + "copy-from": "kevlar_chainmail_suit", + "looks_like": "kevlar_chainmail_suit", + "name": { "str": "XS kevlar chainmail armor" }, + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "flags": [ "VARSIZE", "STURDY", "HELMET_COMPAT", "OUTER", "NONCONDUCTIVE", "UNDERSIZE" ] } ] diff --git a/data/json/items/resources/metal.json b/data/json/items/resources/metal.json index 7a927dd34d000..cf208c9efd391 100644 --- a/data/json/items/resources/metal.json +++ b/data/json/items/resources/metal.json @@ -408,7 +408,7 @@ "bashing": 8, "to_hit": -2, "stack_size": 4, - "material": [ "low_steel" ], + "material": [ "lc_steel" ], "symbol": ",", "color": "light_gray", "ammo_type": "components", @@ -427,7 +427,7 @@ "bashing": 12, "to_hit": -4, "stack_size": 2, - "material": [ "low_steel" ], + "material": [ "lc_steel" ], "symbol": ",", "color": "light_gray", "ammo_type": "components", @@ -446,7 +446,7 @@ "bashing": 8, "to_hit": -2, "stack_size": 4, - "material": [ "med_steel" ], + "material": [ "mc_steel" ], "symbol": ",", "color": "light_gray", "ammo_type": "components", @@ -465,7 +465,7 @@ "bashing": 12, "to_hit": -4, "stack_size": 2, - "material": [ "med_steel" ], + "material": [ "mc_steel" ], "symbol": ",", "color": "light_gray", "ammo_type": "components", @@ -484,7 +484,7 @@ "bashing": 8, "to_hit": -2, "stack_size": 4, - "material": [ "high_steel" ], + "material": [ "hc_steel" ], "symbol": ",", "color": "light_gray", "ammo_type": "components", @@ -503,7 +503,7 @@ "bashing": 12, "to_hit": -4, "stack_size": 2, - "material": [ "high_steel" ], + "material": [ "hc_steel" ], "symbol": ",", "color": "light_gray", "ammo_type": "components", diff --git a/data/json/items/tool/cooking.json b/data/json/items/tool/cooking.json index 0a8d7578c5c88..af79c7c833ac8 100644 --- a/data/json/items/tool/cooking.json +++ b/data/json/items/tool/cooking.json @@ -641,7 +641,7 @@ "material": [ "stone" ], "symbol": ":", "color": "light_gray", - "qualities": [ [ "BOIL", 2 ], [ "CONTAIN", 1 ] ] + "qualities": [ [ "BOIL", 2 ], [ "CONTAIN", 1 ], [ "FINE_GRIND", 1 ] ] }, { "id": "multi_cooker", diff --git a/data/json/items/tool/metalworking.json b/data/json/items/tool/metalworking.json index 6ad9bbabb906d..10f4089f752ab 100644 --- a/data/json/items/tool/metalworking.json +++ b/data/json/items/tool/metalworking.json @@ -254,6 +254,49 @@ "color": "light_gray", "flags": [ "NO_SALVAGE" ] }, + { + "id": "lc_link_sheet", + "type": "TOOL", + "category": "spare_parts", + "name": { "str": "low steel chainmail sheet" }, + "description": "This is a sheet of riveted chainmail. With some skill, several of these sheets could be connected to make effective armor.", + "weight": "1000 g", + "volume": "500 ml", + "price": 1000, + "price_postapoc": 500, + "material": [ "lc_steel" ], + "symbol": ",", + "color": "light_gray", + "flags": [ "NO_SALVAGE" ] + }, + { + "id": "mc_link_sheet", + "type": "TOOL", + "copy-from": "lc_link_sheet", + "name": { "str": "medium steel chainmail sheet" }, + "material": [ "mc_steel" ] + }, + { + "id": "hc_link_sheet", + "type": "TOOL", + "copy-from": "lc_link_sheet", + "name": { "str": "high steel chainmail sheet" }, + "material": [ "hc_steel" ] + }, + { + "id": "ch_link_sheet", + "type": "TOOL", + "copy-from": "lc_link_sheet", + "name": { "str": "hardened steel chainmail sheet" }, + "material": [ "ch_steel" ] + }, + { + "id": "qt_link_sheet", + "type": "TOOL", + "copy-from": "lc_link_sheet", + "name": { "str": "tempered steel chainmail sheet" }, + "material": [ "qt_steel" ] + }, { "id": "swage", "type": "TOOL", diff --git a/data/json/items/tool/science.json b/data/json/items/tool/science.json index 6fcb489a55725..acef4ec945404 100644 --- a/data/json/items/tool/science.json +++ b/data/json/items/tool/science.json @@ -1435,7 +1435,7 @@ "description": "Touch the opening.", "effect_on_conditions": [ { - "id": "EOC_MIGO_BIO_TECH_INTEREST", + "id": "EOC_MIGO_BIO_TECH_INTEREST_SLIGHT", "condition": { "not": { "one_in_chance": 3 } }, "effect": [ { "u_message": "You have a slight feeling of being watched." }, @@ -1443,7 +1443,7 @@ ] }, { - "id": "EOC_MIGO_BIO_TECH_INTEREST", + "id": "EOC_MIGO_BIO_TECH_INTEREST_INTENSE", "condition": { "not": { "one_in_chance": 100 } }, "effect": [ { "u_message": "You have an intense feeling of being watched." }, diff --git a/data/json/items/tool/workshop.json b/data/json/items/tool/workshop.json index 3bbef811ec000..3b05beac54efb 100644 --- a/data/json/items/tool/workshop.json +++ b/data/json/items/tool/workshop.json @@ -1302,11 +1302,11 @@ "bronze", "silver", "gold", - "low_steel", - "med_steel", - "high_steel", - "case_hardened_steel", - "tempered_steel", + "lc_steel", + "mc_steel", + "hc_steel", + "ch_steel", + "qt_steel", "platinum", "superalloy" ], @@ -1358,11 +1358,11 @@ "gold", "platinum", "superalloy", - "low_steel", - "med_steel", - "high_steel", - "case_hardened_steel", - "tempered_steel" + "lc_steel", + "mc_steel", + "hc_steel", + "ch_steel", + "qt_steel" ], "skill": "fabrication", "tool_quality": 5, diff --git a/data/json/mapgen/collapsed_tower.json b/data/json/mapgen/collapsed_tower.json index ac7f75571f689..dca335509f0e0 100644 --- a/data/json/mapgen/collapsed_tower.json +++ b/data/json/mapgen/collapsed_tower.json @@ -194,7 +194,6 @@ { "item": "cleaning", "x": [ 11, 11 ], "y": [ 21, 22 ], "chance": 60 }, { "item": "cleaning", "x": [ 15, 15 ], "y": [ 21, 22 ], "chance": 60 } ], - "place_monster": [ { "monster": "mon_talon_m202a1", "x": [ 12, 13 ], "y": [ 20, 23 ] } ], "monster": { " ": { "monster": "mon_zombie_living_wall", "chance": 10 } }, "place_monsters": [ { "monster": "GROUP_COLLAPSED_TOWER_BASEMENT", "x": [ 0, 23 ], "y": [ 0, 15 ], "density": 2.5 }, diff --git a/data/json/mapgen/dive_shop.json b/data/json/mapgen/dive_shop.json new file mode 100644 index 0000000000000..b7aa07f7002ec --- /dev/null +++ b/data/json/mapgen/dive_shop.json @@ -0,0 +1,236 @@ +[ + { + "id": "dive_shop_tanks", + "type": "item_group", + "subtype": "distribution", + "items": [ + { "item": "small_scuba_tank", "prob": 40, "charges": [ 5, 20 ] }, + { "item": "scuba_tank", "prob": 60, "charges": [ 10, 60 ] } + ] + }, + { + "id": "dive_shop_books", + "type": "item_group", + "subtype": "distribution", + "entries": [ + { "item": "manual_swimming", "prob": 100 }, + { "item": "emergency_book", "prob": 50 }, + { "item": "manual_first_aid", "prob": 20 }, + { "item": "textbook_firstaid", "prob": 10 } + ] + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_dive_shop" ], + "weight": 200, + "object": { + "fill_ter": "t_floor", + "rows": [ + "____,____,____,____,____", + "____,____,____,____,____", + "____,____,____,____,____", + "____,____,____,____,____", + "____,____,____,____,____", + "FFFFFFFFFFFFFFFFFFFFFFFF", + "FFFFFFFFFFFFFFFFFFFFFFFF", + "|--OOOOOO--))--OOOOOO-|.", + "|^ |.", + "|] R R R ^RRR RRR^ |.", + "|] R R R |.", + "|] R R R #cDDDD#####$|.", + "|] R R R #L L |.", + "| |-----------|.", + "| hhhhh |*********|S|.", + "O ZZZZZ +*~~~~~~~*|S|.", + "|V hhhhh +*~~~~~~~*|+|.", + "|W |*~~~~~~~***|.", + "|--------+|*~~~~~~~*|+|.", + "|B C |*~~~~~~~*|*|.", + "|3 C |*********|t|.", + "|--------M-----M------|.", + ".4......____________<...", + "........................" + ], + "terrain": { + " ": "t_floor", + ")": "t_door_glass_c", + "+": "t_door_c", + ",": "t_pavement_y", + "-": "t_wall_w", + ".": [ [ "t_dirt", 5 ], [ "t_grass", 16 ], [ "t_grass_long", 5 ], [ "t_underbrush", 10 ] ], + "F": "t_sidewalk", + "O": "t_window", + "_": "t_pavement", + "M": "t_door_metal_pickable", + "4": "t_gutter_downspout", + "<": "t_ladder_up", + "|": "t_wall_w", + "C": "t_chaingate_c", + "*": "t_thconc_y", + "~": "t_water_pool" + }, + "furniture": { + "#": "f_counter", + "$": "f_counter_gate_c", + "c": "f_console_broken", + "D": "f_displaycase", + "R": "f_rack", + "]": "f_glass_cabinet", + "^": "f_indoor_plant", + "L": "f_stool", + "S": "f_shower", + "B": "f_workbench", + "3": "f_air_compressor", + "h": "f_chair", + "Z": "f_table" + }, + "vendingmachines": { "W": { "item_group": "vending_drink", "lootable": true }, "V": { "item_group": "vending_food", "lootable": true } }, + "toilets": { "t": { } }, + "items": { + "R": { "item": "SUS_scuba_gear", "chance": 20 }, + "D": { "item": "SUS_scuba_gear", "chance": 40 }, + "]": { "item": "swimmer_wetsuit", "chance": 80, "repeat": [ 0, 3 ] } + }, + "place_items": [ + { "item": "dive_shop_tanks", "x": [ 3, 6 ], "y": [ 19, 20 ], "chance": 90, "repeat": [ 2, 8 ] }, + { "item": "dive_shop_books", "x": [ 3, 7 ], "y": 15, "chance": 80, "repeat": [ 1, 5 ] } + ], + "place_monster": [ { "group": "GROUP_POOL_NOKIDS", "x": [ 12, 19 ], "y": [ 15, 19 ], "repeat": [ 2, 6 ] } ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_dive_shop" ], + "weight": 500, + "object": { + "fill_ter": "t_floor", + "rows": [ + "____,____,____,____,____", + "____,____,____,____,____", + "____,____,____,____,____", + "____,____,____,____,____", + "____,____,____,____,____", + "FFFFFFFFFFFFFFFFFFFFFFFF", + "FFFFFFFFFFFFFFFFFFFFFFFF", + "|--OOOOOO--))--OOOOOO-|.", + "|^ |.", + "|] R R R R ^RRR RRR^|.", + "|] R R R R |.", + "|] R R R R ^|.", + "|] R R R R #c#DDDD$#|.", + "|V #L ^|.", + "|W -========|.", + "|V : |.", + "|] R R R R : hhhhh |.", + "|] R R R R ) ZZZZZ O.", + "|^ R R R ) ZZZZZ O.", + "|--- : hhhhh |.", + "|t + ]^]^ : |.", + "|--------------M-OOO--|.", + ".4............._____<...", + "........................" + ], + "terrain": { + " ": "t_floor", + ")": "t_door_glass_c", + "+": "t_door_c", + ",": "t_pavement_y", + "-": "t_wall_w", + ".": [ [ "t_dirt", 5 ], [ "t_grass", 16 ], [ "t_grass_long", 5 ], [ "t_underbrush", 10 ] ], + "F": "t_sidewalk", + "O": "t_window", + "_": "t_pavement", + "M": "t_door_metal_pickable", + "4": "t_gutter_downspout", + "<": "t_ladder_up", + "|": "t_wall_w", + "=": "t_wall_glass_h", + ":": "t_wall_glass_v" + }, + "furniture": { + "#": "f_counter", + "$": "f_counter_gate_c", + "c": "f_console_broken", + "D": "f_displaycase", + "R": "f_rack", + "]": "f_glass_cabinet", + "^": "f_indoor_plant", + "L": "f_stool", + "h": "f_chair", + "Z": "f_table" + }, + "vendingmachines": { "W": { "item_group": "vending_drink", "lootable": true }, "V": { "item_group": "vending_food", "lootable": true } }, + "toilets": { "t": { } }, + "items": { + "R": { "item": "SUS_scuba_gear", "chance": 10 }, + "D": { "item": "SUS_scuba_gear", "chance": 40 }, + "]": { "item": "swimmer_wetsuit", "chance": 80, "repeat": [ 0, 3 ] } + }, + "place_items": [ { "item": "dive_shop_books", "x": [ 16, 20 ], "y": [ 17, 18 ], "chance": 80, "repeat": [ 2, 7 ] } ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_dive_shop_roof" ], + "weight": 500, + "object": { + "fill_ter": "t_tar_flat_roof", + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "|.....................3 ", + "|.c...................3 ", + "|.....................3 ", + "|.....................3 ", + "|.....................3 ", + "|.....................3 ", + "|.....................3 ", + "|.....................3 ", + "|.....................3 ", + "|..............ooo..:.3 ", + "|....A.........ooo..:.3 ", + "|....SS........ooo....3 ", + "|..................&..3 ", + "|.....................3 ", + "|5--------------------3 ", + " #>## ", + " " + ], + "terrain": { + ".": "t_tar_flat_roof", + "o": "t_glass_roof", + " ": "t_open_air", + "|": "t_gutter_west", + "-": "t_gutter_south", + "3": "t_gutter_east", + "#": "t_grate", + ">": "t_ladder_down", + "5": "t_gutter_drop" + }, + "furniture": { + "&": "f_roof_turbine_vent", + "c": "f_cellphone_booster", + "A": "f_air_conditioner", + ":": "f_standing_tank", + "S": "f_solar_unit" + }, + "place_items": [ { "item": "roof_trash", "x": [ 4, 16 ], "y": [ 8, 11 ], "chance": 50, "repeat": [ 1, 3 ] } ], + "place_nested": [ + { "chunks": [ [ "roof_2x2_golf", 5 ], [ "null", 85 ], [ "roof_3x3_wine", 10 ] ], "x": [ 13, 20 ], "y": 15 }, + { + "chunks": [ [ "null", 40 ], [ "roof_4x4_party", 5 ], [ "roof_4x4_utility", 50 ], [ "roof_4x4_holdout", 3 ] ], + "x": [ 4, 13 ], + "y": [ 8, 10 ] + } + ] + } + } +] diff --git a/data/json/mapgen/lab/lab_modular/lab_1x1x2_RES_8_apartments.json b/data/json/mapgen/lab/lab_modular/lab_1x1x2_RES_8_apartments.json index 91173bcc162c9..4a4f3bda97887 100644 --- a/data/json/mapgen/lab/lab_modular/lab_1x1x2_RES_8_apartments.json +++ b/data/json/mapgen/lab/lab_modular/lab_1x1x2_RES_8_apartments.json @@ -33,7 +33,7 @@ "|||||||||||±||||||||||||" ], "palettes": [ "lab_common_palette", "lab_residential_palette", "standard_domestic_lino_bathroom" ], - "place_monsters": [ { "monster": "GROUP_LAB_HOSPTIAL", "x": [ 1, 22 ], "y": [ 1, 22 ], "density": 0.1 } ], + "place_monsters": [ { "monster": "GROUP_LAB_HOSPITAL", "x": [ 1, 22 ], "y": [ 1, 22 ], "density": 0.1 } ], "terrain": { ":": "t_window_domestic", "Y": "t_linoleum_gray" } } }, @@ -71,7 +71,7 @@ "|||||||||||±||||||||||||" ], "palettes": [ "lab_common_palette", "lab_residential_palette", "standard_domestic_lino_bathroom" ], - "place_monsters": [ { "monster": "GROUP_LAB_HOSPTIAL", "x": [ 1, 22 ], "y": [ 1, 22 ], "density": 0.1 } ], + "place_monsters": [ { "monster": "GROUP_LAB_HOSPITAL", "x": [ 1, 22 ], "y": [ 1, 22 ], "density": 0.1 } ], "terrain": { ":": "t_window_domestic", "Y": "t_linoleum_gray" } } } diff --git a/data/json/mapgen/lab/lab_modular/lab_nests_modular/lab_nested_mutagen.json b/data/json/mapgen/lab/lab_modular/lab_nests_modular/lab_nested_mutagen.json index 1a3da3006b812..fec1d015a6cba 100644 --- a/data/json/mapgen/lab/lab_modular/lab_nests_modular/lab_nested_mutagen.json +++ b/data/json/mapgen/lab/lab_modular/lab_nests_modular/lab_nested_mutagen.json @@ -150,6 +150,7 @@ "method": "json", "//": "A nested map for lab mutagen research areas. Center of room design.", "nested_mapgen_id": "lab_mutagen_8x8_vault_east", + "weight": 100, "object": { "mapgensize": [ 8, 8 ], "rotation": [ 0, 3 ], @@ -185,6 +186,7 @@ "method": "json", "//": "A nested map for lab mutagen research areas. Center of room design.", "nested_mapgen_id": "lab_mutagen_8x8_vault_east", + "weight": 100, "object": { "mapgensize": [ 8, 8 ], "rotation": [ 0, 3 ], @@ -215,6 +217,48 @@ ] } }, + { + "type": "mapgen", + "method": "json", + "//": "A nested map for lab mutagen research areas. Center of room design.", + "nested_mapgen_id": "lab_mutagen_8x8_vault_east", + "weight": 50, + "object": { + "mapgensize": [ 8, 8 ], + "rotation": [ 0, 3 ], + "rows": [ + "||||||||", + "|mmmmmm|", + "|| m|", + " = JJJm|", + "θ| JJJm|", + "|| m|", + "|mmmmmm|", + "||||||||" + ], + "palettes": [ "lab_mutagen_palette" ], + "terrain": { "|": "t_wall_metal" }, + "computers": { + "θ": { + "name": "Alien-Sample Storage", + "security": 3, + "options": [ { "name": "UNLOCK ENTRANCE", "action": "unlock_disarm", "security": 5 } ], + "failures": [ { "action": "damage" }, { "action": "manhacks" }, { "action": "shutdown" } ] + } + }, + "item": { + "m": [ + { "item": "alien_pod_resin", "chance": 50, "repeat": [ 2, 5 ] }, + { "item": "fetid_goop", "chance": 40, "repeat": [ 2, 5 ] } + ] + }, + "place_loot": [ + { "group": "tools_mutation", "x": [ 3, 5 ], "y": 3, "chance": 70 }, + { "group": "common_mutation_books", "x": [ 3, 5 ], "y": 4, "chance": 70 }, + { "item": "migo_bio_tech", "x": 3, "y": 3, "chance": 100 } + ] + } + }, { "type": "mapgen", "method": "json", @@ -370,6 +414,99 @@ } } }, + { + "type": "mapgen", + "method": "json", + "//": "A nested map for lab mutagen research areas. Center of room design. This one is MIGO themed", + "nested_mapgen_id": "lab_mutagen_8x8_vault_west", + "//2": "A bit higher weighted since their are fewer MIGO themed rewards", + "weight": 50, + "object": { + "mapgensize": [ 8, 8 ], + "rotation": [ 0, 3 ], + "rows": [ + "||||||||", + "|JJJX!^|", + "|7A X!||", + "|2ւ - = ", + "|4 - |θ", + "|5 X!||", + "|JōJX!^|", + "||||||||" + ], + "palettes": [ "lab_mutagen_palette", "lab_vent_palette" ], + "terrain": { "|": "t_wall_metal" }, + "furniture": { "!": "f_chair", "ō": "f_glass_fridge" }, + "vehicles": { "ւ": { "vehicle": "hospital_bed", "chance": 100, "rotation": 270 } }, + "monster": { "ւ": { "monster": "mon_mi_go_captured" } }, + "item": { "ō": { "item": "migo_plate_overgrown", "chance": 100, "repeat": 2 } }, + "place_loot": [ { "item": "recipe_migo_plate", "x": [ 1, 3 ], "y": 1, "chance": 100 } ], + "computers": { + "θ": { + "name": "Specimen Processing", + "security": 3, + "options": [ { "name": "UNLOCK ENTRANCE", "action": "unlock_disarm", "security": 5 } ], + "failures": [ { "action": "damage" }, { "action": "manhacks" }, { "action": "shutdown" } ] + } + } + } + }, + { + "type": "mapgen", + "method": "json", + "//": "A nested map for lab mutagen research areas. Center of room design. This one is MIGO themed", + "nested_mapgen_id": "lab_mutagen_8x8_vault_west", + "//2": "A bit higher weighted since their are fewer MIGO themed rewards", + "weight": 50, + "object": { + "mapgensize": [ 8, 8 ], + "rotation": [ 0, 3 ], + "rows": [ + "||||||||", + "|ÆÇÆX!^|", + "|ւÇÇX!||", + "|ŏÇÇ- = ", + "|ւÇÇ- |θ", + "|ÀÇÇX!||", + "|ÆōÆX!^|", + "||||||||" + ], + "palettes": [ "lab_mutagen_palette", "lab_vent_palette" ], + "terrain": { + "|": "t_wall_metal", + "ւ": "t_floor_resin", + "À": "t_floor_resin", + "ŏ": "t_floor_resin", + "Æ": "t_floor_resin", + "Ç": "t_floor_resin" + }, + "furniture": { + "!": "f_chair", + "ō": "f_glass_fridge", + "ŏ": "f_sink", + "ւ": "f_alien_pod", + "À": "f_alien_gasper", + "Æ": "f_alien_pod_resin" + }, + "item": { + "ŏ": [ + { "item": "migo_skin_off", "chance": 100 }, + { "item": "blood", "chance": 100 }, + { "item": "feeding_kit", "chance": 100 }, + { "item": "corpse_half_beheaded", "chance": 100 } + ], + "ō": { "item": "blood", "chance": 100, "repeat": [ 2, 5 ] } + }, + "computers": { + "θ": { + "name": "Storage for Gary", + "security": 3, + "options": [ { "name": "UNLOCK ENTRANCE", "action": "unlock_disarm", "security": 5 } ], + "failures": [ { "action": "damage" }, { "action": "manhacks" }, { "action": "shutdown" } ] + } + } + } + }, { "type": "mapgen", "method": "json", diff --git a/data/json/mapgen/portal_storm.json b/data/json/mapgen/portal_storm.json index 247015ac29651..792ffc033c2c4 100644 --- a/data/json/mapgen/portal_storm.json +++ b/data/json/mapgen/portal_storm.json @@ -6,17 +6,34 @@ }, { "type": "mapgen", - "update_mapgen_id": "portal_dungeon", "method": "json", - "object": { "place_nested": [ { "chunks": [ "portal_dungeon_chunk" ], "x": 0, "y": 0 } ] } + "update_mapgen_id": "portal_cell", + "object": { + "flags": [ "ERASE_ALL_BEFORE_PLACING_TERRAIN", "NO_UNDERLYING_ROTATE" ], + "set": [ + { "square": "terrain", "id": "t_floor_warped", "x": 1, "y": 1, "x2": 3, "y2": 3 }, + { "line": "terrain", "id": "t_wall_warped", "x": 0, "y": 0, "x2": 0, "y2": 4 }, + { "line": "terrain", "id": "t_wall_warped", "x": 0, "y": 0, "x2": 4, "y2": 0 }, + { "line": "terrain", "id": "t_wall_warped", "x": 4, "y": 0, "x2": 4, "y2": 0 }, + { "line": "terrain", "id": "t_wall_warped", "x": 0, "y": 4, "x2": 4, "y2": 4 }, + { "point": "variable", "id": "cell_start", "x": 2, "y": 2 } + ] + } + }, + { + "type": "mapgen", + "method": "json", + "update_mapgen_id": "portal_cell_roof", + "object": { + "set": [ { "square": "terrain", "id": "t_warped_roof", "x": 0, "y": 0, "x2": 5, "y2": 5 } ], + "flags": [ "ERASE_ALL_BEFORE_PLACING_TERRAIN", "NO_UNDERLYING_ROTATE" ] + } }, { "type": "mapgen", "method": "json", - "nested_mapgen_id": "portal_dungeon_chunk", + "update_mapgen_id": "portal_dungeon", "object": { - "mapgensize": [ 24, 24 ], - "rotation": [ 0, 3 ], "rows": [ "aaaaaaaaaaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaaaaaaaaaa", @@ -44,6 +61,7 @@ "aaaaaaaaaaaaaaaaaaaaaaaa" ], "palettes": [ "portal_storm_palette" ], + "flags": [ "ERASE_ALL_BEFORE_PLACING_TERRAIN", "NO_UNDERLYING_ROTATE" ], "set": [ { "square": "furniture", "id": "f_null", "x": 0, "x2": 23, "y": 0, "y2": 23 } ] } }, @@ -58,47 +76,5 @@ { "point": "variable", "id": "nether_dungeon_door", "x": 4, "y": 2 } ] } - }, - { - "type": "mapgen", - "update_mapgen_id": "portal_dungeon_undo", - "method": "json", - "object": { "place_nested": [ { "chunks": [ "portal_dungeon_chunk_undo" ], "x": 0, "y": 0 } ] } - }, - { - "type": "mapgen", - "method": "json", - "nested_mapgen_id": "portal_dungeon_chunk_undo", - "object": { - "mapgensize": [ 24, 24 ], - "rotation": [ 0, 3 ], - "rows": [ - "GGGGGGGGGGGGGGGGGGGGGGGG", - "GGGGGGGGGGGGGGGGGGGGGGGG", - "GGGGGGGGGGGGGGGGGGGGGGGG", - "GGGGGGGGGGGGGGGGGGGGGGGG", - "GGGGGGGGGGGGGGGGGGGGGGGG", - "GGGGGGGGGGGGGGGGGGGGGGGG", - "GGGGGGGGGGGGGGGGGGGGGGGG", - "GGGGGGGGGGGGGGGGGGGGGGGG", - "GGGGGGGGGGGGGGGGGGGGGGGG", - "GGGGGGGGGGGGGGGGGGGGGGGG", - "GGGGGGGGGGGGGGGGGGGGGGGG", - "GGGGGGGGGGGGGGGGGGGGGGGG", - "GGGGGGGGGGGGGGGGGGGGGGGG", - "GGGGGGGGGGGGGGGGGGGGGGGG", - "GGGGGGGGGGGGGGGGGGGGGGGG", - "GGGGGGGGGGGGGGGGGGGGGGGG", - "GGGGGGGGGGGGGGGGGGGGGGGG", - "GGGGGGGGGGGGGGGGGGGGGGGG", - "GGGGGGGGGGGGGGGGGGGGGGGG", - "GGGGGGGGGGGGGGGGGGGGGGGG", - "GGGGGGGGGGGGGGGGGGGGGGGG", - "GGGGGGGGGGGGGGGGGGGGGGGG", - "GGGGGGGGGGGGGGGGGGGGGGGG", - "GGGGGGGGGGGGGGGGGGGGGGGG" - ], - "palettes": [ "portal_storm_palette" ] - } } ] diff --git a/data/json/martialarts.json b/data/json/martialarts.json index c71e72e5bc87c..1fa37a5b5c224 100644 --- a/data/json/martialarts.json +++ b/data/json/martialarts.json @@ -7,7 +7,7 @@ "initiate": [ "You decide to not use any martial arts.", "%s enters a generic combat stance." ], "arm_block": 1, "leg_block": 99, - "allow_melee": true + "allow_all_weapons": true }, { "type": "martial_art", @@ -282,6 +282,7 @@ "autolearn": [ [ "melee", 1 ] ], "arm_block": 1, "nonstandard_block": 5, + "allow_all_weapons": true, "static_buffs": [ { "id": "buff_brawling_block", @@ -293,7 +294,6 @@ "bonus_blocks": 1 } ], - "allow_melee": true, "techniques": [ "tec_brawl_disarm_unarmed", "tec_brawl_feint_unarmed", diff --git a/data/json/materials.json b/data/json/materials.json index 954e0dd3e515f..9e88bcb5986f8 100644 --- a/data/json/materials.json +++ b/data/json/materials.json @@ -133,6 +133,27 @@ { "fuel": 450, "smoke": 0, "burn": 3 } ] }, + { + "type": "material", + "id": "alien_liquid", + "name": "Non-Newtonian Fluid", + "//": "science values for this are probably all wrong taken partially from water", + "density": 1, + "specific_heat_liquid": 4.186, + "specific_heat_solid": 2.108, + "latent_heat": 333, + "bash_resist": 8, + "cut_resist": 0, + "bullet_resist": 4, + "acid_resist": 8, + "fire_resist": 4, + "elec_resist": 0, + "chip_resist": 10, + "dmg_adj": [ "agitated", "thinned", "culled", "eradicated" ], + "bash_dmg_verb": "ripples", + "cut_dmg_verb": "passed through", + "repaired_with": "blood" + }, { "type": "material", "id": "alien_resin", @@ -267,6 +288,25 @@ "cut_dmg_verb": "scratched", "burn_products": [ [ "scrap_bronze", 1 ] ] }, + { + "type": "material", + "id": "alien_carapace", + "name": "Carapace", + "density": 10, + "specific_heat_liquid": 1.8, + "specific_heat_solid": 1.8, + "latent_heat": 50, + "bash_resist": 8, + "cut_resist": 12, + "bullet_resist": 10, + "acid_resist": 20, + "fire_resist": 1, + "elec_resist": 8, + "chip_resist": 15, + "dmg_adj": [ "scratched", "cut", "cracked", "shattered" ], + "bash_dmg_verb": "dented", + "cut_dmg_verb": "gouged" + }, { "type": "material", "id": "fancy_bronze", @@ -557,7 +597,7 @@ "dmg_adj": [ "scratched", "damaged", "smashed", "crushed" ], "bash_dmg_verb": "damaged", "cut_dmg_verb": "damaged", - "vitamins": [ [ "vitA", 0.5 ], [ "vitB", 0.5 ], [ "calcium", 0.5 ], [ "iron", 0.5 ] ], + "vitamins": [ [ "calcium", 0.5 ], [ "iron", 0.5 ] ], "burn_data": [ { "fuel": 0, "smoke": 1, "burn": 1 }, { "fuel": 1, "smoke": 3, "burn": 2 }, { "fuel": 1, "smoke": 5, "burn": 5 } ] }, { @@ -580,7 +620,7 @@ "dmg_adj": [ "bruised", "mutilated", "badly mutilated", "thoroughly mutilated" ], "bash_dmg_verb": "bruised", "cut_dmg_verb": "sliced", - "vitamins": [ [ "calcium", 0.1 ], [ "vitB", 1 ], [ "iron", 1.3 ] ], + "vitamins": [ [ "calcium", 0.1 ], [ "iron", 1.3 ] ], "burn_data": [ { "fuel": 1, "smoke": 1, "burn": 1, "volume_per_turn": "2500 ml" }, { "fuel": 2, "smoke": 3, "burn": 2, "volume_per_turn": "10000 ml" }, @@ -806,7 +846,7 @@ "dmg_adj": [ "bruised", "mutilated", "badly mutilated", "thoroughly mutilated" ], "bash_dmg_verb": "bruised", "cut_dmg_verb": "sliced", - "vitamins": [ [ "calcium", 0.1 ], [ "vitB", 1 ], [ "iron", 1.3 ] ], + "vitamins": [ [ "calcium", 0.1 ], [ "iron", 1.3 ] ], "burn_data": [ { "fuel": 1, "smoke": 1, "burn": 1, "volume_per_turn": "2500 ml" }, { "fuel": 2, "smoke": 3, "burn": 2, "volume_per_turn": "10000 ml" }, @@ -1177,7 +1217,7 @@ "dmg_adj": [ "lightly damaged", "damaged", "very damaged", "thoroughly damaged" ], "bash_dmg_verb": "damaged", "cut_dmg_verb": "damaged", - "vitamins": [ [ "vitB", 0.5 ], [ "calcium", 1.5 ], [ "iron", 0.1 ] ], + "vitamins": [ [ "calcium", 1.5 ], [ "iron", 0.1 ] ], "burn_data": [ { "fuel": -100, "smoke": 1, "burn": 1 }, { "fuel": -50, "smoke": 2, "burn": 1 }, @@ -1534,7 +1574,7 @@ }, { "type": "material", - "id": "low_steel", + "id": "lc_steel", "name": "Low Carbon Steel", "//": "SAE 1010/UNS 10100, assumes .1% carbon content and zero slag.", "density": 8, @@ -1556,7 +1596,7 @@ }, { "type": "material", - "id": "med_steel", + "id": "mc_steel", "name": "Medium Carbon Steel", "//": "SAE 1050/UNS 10500, assumes .50% carbon content and zero slag.", "density": 8, @@ -1578,7 +1618,7 @@ }, { "type": "material", - "id": "high_steel", + "id": "hc_steel", "name": "High Carbon Steel", "//": "SAE 1085/UNS 10850, assumes .50% carbon content and zero slag.", "density": 8, @@ -1600,7 +1640,7 @@ }, { "type": "material", - "id": "case_hardened_steel", + "id": "ch_steel", "name": "Case Hardened Carbon Steel", "//": "Case hardening based on average between .1 and .95 carbon steel with a 1.25 multiplier.", "density": 8, @@ -1622,7 +1662,7 @@ }, { "type": "material", - "id": "tempered_steel", + "id": "qt_steel", "name": "Tempered Carbon Steel", "//": "Quench/tempering based on .6 carbon steel with a 1.5 multiplier.", "density": 8, @@ -1642,6 +1682,116 @@ "cut_dmg_verb": "scratched", "burn_products": [ [ "scrap", 1 ] ] }, + { + "type": "material", + "id": "lc_steel_chain", + "name": "Low Carbon Steel Chain", + "//": "SAE 1010/UNS 10100, assumes .1% carbon content and zero slag.", + "density": 8, + "specific_heat_liquid": 0.82, + "specific_heat_solid": 0.45, + "latent_heat": 273, + "bash_resist": 5, + "cut_resist": 5, + "bullet_resist": 3, + "acid_resist": 7, + "fire_resist": 3, + "elec_resist": 0, + "chip_resist": 17, + "repaired_with": "scrap", + "dmg_adj": [ "marked", "dented", "smashed", "shattered" ], + "bash_dmg_verb": "dented", + "cut_dmg_verb": "scratched", + "burn_products": [ [ "scrap", 1 ] ] + }, + { + "type": "material", + "id": "mc_steel_chain", + "name": "Medium Carbon Steel Chain", + "//": "SAE 1050/UNS 10500, assumes .50% carbon content and zero slag.", + "density": 8, + "specific_heat_liquid": 0.82, + "specific_heat_solid": 0.45, + "latent_heat": 273, + "bash_resist": 6, + "cut_resist": 6, + "bullet_resist": 3, + "acid_resist": 7, + "fire_resist": 3, + "elec_resist": 0, + "chip_resist": 18, + "repaired_with": "scrap", + "dmg_adj": [ "marked", "dented", "smashed", "shattered" ], + "bash_dmg_verb": "dented", + "cut_dmg_verb": "scratched", + "burn_products": [ [ "scrap", 1 ] ] + }, + { + "type": "material", + "id": "hc_steel_chain", + "name": "High Carbon Steel Chain", + "//": "SAE 1085/UNS 10850, assumes .50% carbon content and zero slag.", + "density": 8, + "specific_heat_liquid": 0.82, + "specific_heat_solid": 0.45, + "latent_heat": 273, + "bash_resist": 9, + "cut_resist": 9, + "bullet_resist": 5, + "acid_resist": 7, + "fire_resist": 3, + "elec_resist": 0, + "chip_resist": 18, + "repaired_with": "scrap", + "dmg_adj": [ "marked", "dented", "smashed", "shattered" ], + "bash_dmg_verb": "dented", + "cut_dmg_verb": "scratched", + "burn_products": [ [ "scrap", 1 ] ] + }, + { + "type": "material", + "id": "ch_steel_chain", + "name": "Case Hardened Carbon Steel Chain", + "//": "Case hardening based on average between .1 and .95 carbon steel with a 1.25 multiplier.", + "density": 8, + "specific_heat_liquid": 0.82, + "specific_heat_solid": 0.45, + "latent_heat": 273, + "bash_resist": 9, + "cut_resist": 9, + "bullet_resist": 5, + "acid_resist": 7, + "fire_resist": 3, + "elec_resist": 0, + "chip_resist": 20, + "repaired_with": "scrap", + "dmg_adj": [ "marked", "dented", "smashed", "shattered" ], + "bash_dmg_verb": "dented", + "cut_dmg_verb": "scratched", + "burn_products": [ [ "scrap", 1 ] ] + }, + { + "type": "material", + "id": "qt_steel_chain", + "name": "Tempered Carbon Steel Chain", + "//": "Quench/tempering based on .6 carbon steel with a 1.5 multiplier.", + "density": 8, + "specific_heat_liquid": 0.82, + "specific_heat_solid": 0.45, + "latent_heat": 273, + "bash_resist": 10, + "cut_resist": 10, + "bullet_resist": 6, + "acid_resist": 7, + "fire_resist": 3, + "elec_resist": 0, + "chip_resist": 20, + "repaired_with": "scrap", + "dmg_adj": [ "marked", "dented", "smashed", "shattered" ], + "bash_dmg_verb": "dented", + "cut_dmg_verb": "scratched", + "burn_products": [ [ "scrap", 1 ] ] + }, { "type": "material", "id": "steel", @@ -1841,6 +1991,26 @@ { "fuel": 1, "smoke": 1, "burn": 2 } ] }, + { + "type": "material", + "id": "unobtanium", + "//": "this isn't supposed to be a super impressive material, just impossible to repair", + "name": "Strange Metal", + "density": 59, + "specific_heat_liquid": 0.49, + "specific_heat_solid": 0.39, + "latent_heat": 205, + "bash_resist": 2, + "cut_resist": 3, + "bullet_resist": 2, + "acid_resist": 0, + "fire_resist": 3, + "elec_resist": 0, + "chip_resist": 10, + "dmg_adj": [ "marked", "dented", "smashed", "shattered" ], + "bash_dmg_verb": "dented", + "cut_dmg_verb": "scratched" + }, { "type": "material", "id": "tin", @@ -1887,7 +2057,7 @@ "dmg_adj": [ "lightly damaged", "damaged", "very damaged", "thoroughly damaged" ], "bash_dmg_verb": "squished", "cut_dmg_verb": "cut", - "vitamins": [ [ "calcium", 0.1 ], [ "vitA", 1 ], [ "vitC", 0.5 ] ], + "vitamins": [ [ "calcium", 0.1 ], [ "vitC", 0.5 ] ], "burn_data": [ { "fuel": 1, "smoke": 1, "burn": 1, "volume_per_turn": "1250 ml" }, { "fuel": 2, "smoke": 1, "burn": 2, "volume_per_turn": "2500 ml" }, @@ -1914,7 +2084,7 @@ "dmg_adj": [ "lightly damaged", "damaged", "very damaged", "thoroughly damaged" ], "bash_dmg_verb": "squished", "cut_dmg_verb": "cut", - "vitamins": [ [ "calcium", 0.1 ], [ "vitA", 2 ], [ "vitC", 4 ], [ "iron", 0.1 ] ], + "vitamins": [ [ "calcium", 0.1 ], [ "vitC", 4 ], [ "iron", 0.1 ] ], "burn_data": [ { "fuel": 1, "smoke": 1, "burn": 1, "volume_per_turn": "1250 ml" }, { "fuel": 2, "smoke": 1, "burn": 2, "volume_per_turn": "2500 ml" }, @@ -2059,7 +2229,7 @@ "id": "blood", "name": "blood", "copy-from": "water", - "vitamins": [ [ "calcium", 0.1 ], [ "vitB", 1 ], [ "iron", 1.3 ] ] + "vitamins": [ [ "calcium", 0.1 ], [ "iron", 1.3 ] ] }, { "type": "material", @@ -2087,7 +2257,7 @@ "dmg_adj": [ "lightly damaged", "damaged", "very damaged", "thoroughly damaged" ], "bash_dmg_verb": "squished", "cut_dmg_verb": "cut", - "vitamins": [ [ "vitB", 1 ], [ "iron", 0.1 ] ], + "vitamins": [ [ "iron", 0.1 ] ], "burn_data": [ { "fuel": 1, "smoke": 2, "burn": 1 }, { "fuel": 1, "smoke": 2, "burn": 2 }, { "fuel": 1, "smoke": 1, "burn": 3 } ] }, { @@ -2232,7 +2402,7 @@ "dmg_adj": [ "bruised", "mutilated", "badly mutilated", "thoroughly mutilated" ], "bash_dmg_verb": "bruised", "cut_dmg_verb": "sliced", - "vitamins": [ [ "calcium", 0.1 ], [ "vitB", 1 ], [ "iron", 1.3 ] ], + "vitamins": [ [ "calcium", 0.1 ], [ "iron", 1.3 ] ], "burn_data": [ { "fuel": 1, "smoke": 1, "burn": 1, "volume_per_turn": "2500 ml" }, { "fuel": 2, "smoke": 3, "burn": 2, "volume_per_turn": "10000 ml" }, @@ -2281,7 +2451,7 @@ "dmg_adj": [ "lightly damaged", "damaged", "very damaged", "thoroughly damaged" ], "bash_dmg_verb": "smashed", "cut_dmg_verb": "cut", - "vitamins": [ [ "vitB", 0.5 ], [ "calcium", 1.5 ], [ "iron", 0.1 ] ], + "vitamins": [ [ "calcium", 1.5 ], [ "iron", 0.1 ] ], "burn_data": [ { "fuel": -100, "smoke": 1, "burn": 1 }, { "fuel": -50, "smoke": 2, "burn": 1 }, diff --git a/data/json/monstergroups/lab.json b/data/json/monstergroups/lab.json index 537deebd40d7d..3c7e7d748e9b2 100644 --- a/data/json/monstergroups/lab.json +++ b/data/json/monstergroups/lab.json @@ -297,7 +297,7 @@ }, { "type": "monstergroup", - "name": "GROUP_LAB_HOSPTIAL", + "name": "GROUP_LAB_HOSPITAL", "monsters": [ { "monster": "mon_zombie_medical", "weight": 20, "cost_multiplier": 0, "pack_size": [ 1, 2 ] }, { "monster": "mon_zombie_medical_brute", "weight": 10, "cost_multiplier": 3 }, diff --git a/data/json/monsters/mi-go.json b/data/json/monsters/mi-go.json index bdd79b5f314c1..4b9897729b6df 100644 --- a/data/json/monsters/mi-go.json +++ b/data/json/monsters/mi-go.json @@ -277,6 +277,45 @@ "PRIORITIZE_TARGETS" ] }, + { + "id": "mon_mi_go_captured", + "type": "MONSTER", + "name": { "str": "partially harvested mi-go" }, + "description": "This creature resembles the smaller mi-go like a grizzly bear resembles a human. Its enormous, thick body is covered in an iridescent segmented carapace, like a scarab crossed with an isopod. It has been mostly pulled apart and is stuck to a surgical table that seems to be keeping it alive.", + "default_faction": "mi-go", + "bodytype": "migo", + "species": [ "MIGO" ], + "looks_like": "mon_mi_go_myrmidon", + "volume": "875 L", + "weight": "260 kg", + "hp": 20, + "material": [ "flesh" ], + "symbol": "&", + "color": "light_gray", + "aggression": 20, + "morale": 50, + "armor_bash": 10, + "armor_cut": 10, + "armor_bullet": 10, + "armor_elec": 6, + "bleed_rate": 25, + "vision_day": 50, + "vision_night": 25, + "harvest": "zombie_meatslug", + "scents_ignored": [ "sc_fetid" ], + "special_attacks": [ [ "PARROT", 4 ] ], + "flags": [ + "WARM", + "NO_BREATHE", + "ARTHROPOD_BLOOD", + "PATH_AVOID_DANGER_1", + "CAN_OPEN_DOORS", + "PRIORITIZE_TARGETS", + "SEES", + "SMELLS", + "HEARS" + ] + }, { "id": "mon_mi_go_scout", "type": "MONSTER", diff --git a/data/json/mutations/mutations.json b/data/json/mutations/mutations.json index c158097b2ebf6..37af7b7dc046a 100644 --- a/data/json/mutations/mutations.json +++ b/data/json/mutations/mutations.json @@ -1205,7 +1205,7 @@ "description": "You have problems with eating meat. It's possible for you to eat it, but you will suffer morale penalties and obtain less nutrition from it.", "starting_trait": true, "valid": false, - "vitamins_absorb_multi": [ [ "flesh", [ [ "vitA", 0 ], [ "vitB", 0 ], [ "vitC", 0 ], [ "calcium", 0 ], [ "iron", 0 ] ] ] ], + "vitamins_absorb_multi": [ [ "flesh", [ [ "vitC", 0 ], [ "calcium", 0 ], [ "iron", 0 ] ] ] ], "cancels": [ "CARNIVORE", "CANNIBAL", "EATDEAD", "STRICT_HUMANITARIAN", "SAPIOVORE" ], "changes_to": [ "HERBIVORE" ] }, @@ -1226,7 +1226,7 @@ "description": "You have problems with eating vegetables. It's possible for you to eat them, but you will suffer morale penalties and obtain less nutrition from them.", "valid": false, "starting_trait": true, - "vitamins_absorb_multi": [ [ "veggy", [ [ "vitA", 0 ], [ "vitB", 0 ], [ "vitC", 0 ], [ "calcium", 0 ], [ "iron", 0 ] ] ] ], + "vitamins_absorb_multi": [ [ "veggy", [ [ "vitC", 0 ], [ "calcium", 0 ], [ "iron", 0 ] ] ] ], "cancels": [ "HERBIVORE", "RUMINANT", "GRAZER" ] }, { @@ -1246,7 +1246,7 @@ "description": "Eating fruits always causes your stomach to ache. It's possible for you to eat them, but you will suffer morale penalties and obtain less nutrition from them.", "valid": false, "starting_trait": true, - "vitamins_absorb_multi": [ [ "fruit", [ [ "vitA", 0 ], [ "vitB", 0 ], [ "vitC", 0 ], [ "calcium", 0 ], [ "iron", 0 ] ] ] ], + "vitamins_absorb_multi": [ [ "fruit", [ [ "vitC", 0 ], [ "calcium", 0 ], [ "iron", 0 ] ] ] ], "cancels": [ "HERBIVORE", "RUMINANT", "GRAZER" ] }, { @@ -1255,7 +1255,7 @@ "name": { "str": "Lactose Intolerance" }, "points": -1, "description": "You, like 75 percent of the world, cannot tolerate milk or milk based products. It's possible for you to eat them, but you will suffer morale penalties and obtain less nutrition from them.", - "vitamins_absorb_multi": [ [ "milk", [ [ "vitA", 0 ], [ "vitB", 0 ], [ "vitC", 0 ], [ "calcium", 0 ], [ "iron", 0 ] ] ] ], + "vitamins_absorb_multi": [ [ "milk", [ [ "vitC", 0 ], [ "calcium", 0 ], [ "iron", 0 ] ] ] ], "starting_trait": true }, { @@ -1266,7 +1266,7 @@ "description": "Something in those heavily processed foods doesn't agree with you. It's possible for you to eat them, but you will suffer morale penalties and obtain less nutrition from them.", "starting_trait": true, "cancels": [ "PROJUNK" ], - "vitamins_absorb_multi": [ [ "junk", [ [ "vitA", 0 ], [ "vitB", 0 ], [ "vitC", 0 ], [ "calcium", 0 ], [ "iron", 0 ] ] ] ], + "vitamins_absorb_multi": [ [ "junk", [ [ "vitC", 0 ], [ "calcium", 0 ], [ "iron", 0 ] ] ] ], "category": [ "BEAST", "RAPTOR", "ALPHA", "ELFA", "RABBIT", "GASTROPOD" ] }, { @@ -1275,7 +1275,7 @@ "name": { "str": "Grain Intolerance" }, "points": -2, "description": "You have a rare allergy that prevents you from eating wheat. It's possible for you to eat wheat-based products, but you will suffer morale penalties and obtain less nutrition from them.", - "vitamins_absorb_multi": [ [ "wheat", [ [ "vitA", 0 ], [ "vitB", 0 ], [ "vitC", 0 ], [ "calcium", 0 ], [ "iron", 0 ] ] ] ], + "vitamins_absorb_multi": [ [ "wheat", [ [ "vitC", 0 ], [ "calcium", 0 ], [ "iron", 0 ] ] ] ], "starting_trait": true }, { diff --git a/data/json/npcs/TALK_COMMON_ALLY.json b/data/json/npcs/TALK_COMMON_ALLY.json index a3a8968e71126..b1e224c83f1c3 100644 --- a/data/json/npcs/TALK_COMMON_ALLY.json +++ b/data/json/npcs/TALK_COMMON_ALLY.json @@ -276,7 +276,7 @@ "npc_rule": "use_guns", "yes": { "and": [ - { "npc_override": "use_silent", "yes": " OVERRIDE: ", "no": " " }, + { "npc_override": "use_silent", "yes": " OVERRIDE: ", "no": "" }, { "npc_rule": "use_silent", "yes": "", diff --git a/data/json/npcs/TALK_TEST.json b/data/json/npcs/TALK_TEST.json index 50c58feb78ccd..7340e5a7440d8 100644 --- a/data/json/npcs/TALK_TEST.json +++ b/data/json/npcs/TALK_TEST.json @@ -1104,7 +1104,7 @@ "condition": { "compare_int": [ { "u_val": "cash" }, "=", { "const": 13 } ] } }, { - "text": "Owed ammount equals 14", + "text": "Owed amount equals 14", "topic": "TALK_DONE", "condition": { "compare_int": [ { "u_val": "owed" }, "=", { "const": 14 } ] } }, diff --git a/data/json/npcs/refugee_center/surface_refugees/NPC_Dana_Nunez.json b/data/json/npcs/refugee_center/surface_refugees/NPC_Dana_Nunez.json index f2535f307e6c7..bfdb65b63395b 100644 --- a/data/json/npcs/refugee_center/surface_refugees/NPC_Dana_Nunez.json +++ b/data/json/npcs/refugee_center/surface_refugees/NPC_Dana_Nunez.json @@ -8,7 +8,7 @@ "class": "NC_REFUGEE_Dana", "attitude": 0, "mission": 7, - "chat": "TALK_REFUGEE_Dana_1", + "chat": "TALK_REFUGEE_Dana_1_firstmeet", "faction": "free_merchants", "mission_offered": "MISSION_REFUGEE_Dana_Sourdough" }, @@ -83,7 +83,7 @@ "type": "talk_topic", "//": "common talk responses", "id": [ - "TALK_REFUGEE_Dana_2", + "TALK_REFUGEE_Dana_1", "TALK_REFUGEE_Dana_Background", "TALK_REFUGEE_Dana_Background_baking", "TALK_REFUGEE_Dana_Background_baking_revival", @@ -334,7 +334,7 @@ "failure": { "topic": "TALK_REFUGEE_Dana_Background_baking2_nobarter" }, "success": { "topic": "TALK_REFUGEE_Dana_Background_baking2_yesbarter" } }, - { "text": "Thanks, can we talk about something else?", "topic": "TALK_REFUGEE_Dana_2" }, + { "text": "Thanks, can we talk about something else?", "topic": "TALK_REFUGEE_Dana_1" }, { "text": "I'll look into that. I'd better get going though.", "topic": "TALK_DONE" } ] }, @@ -345,7 +345,7 @@ "//": "see above for responses to buy bread at original price.", "speaker_effect": { "effect": { "npc_add_effect": "dana_barter_fail", "duration": "24 h" } }, "responses": [ - { "text": "Well, I tried. Can we talk about something else?", "topic": "TALK_REFUGEE_Dana_2" }, + { "text": "Well, I tried. Can we talk about something else?", "topic": "TALK_REFUGEE_Dana_1" }, { "text": "Thanks, but I think I'll pass. I gotta run.", "topic": "TALK_DONE" } ] }, @@ -355,7 +355,7 @@ "dynamic_line": "Oh, fine. Six cups of flour, or one merch. I'm not going any lower, I got a business to run here.", "speaker_effect": { "effect": { "npc_add_effect": "dana_barter_success", "duration": "24 h" } }, "responses": [ - { "text": "You know, I think I changed my mind. Can we talk about something else?", "topic": "TALK_REFUGEE_Dana_2" }, + { "text": "You know, I think I changed my mind. Can we talk about something else?", "topic": "TALK_REFUGEE_Dana_1" }, { "text": "I guess I'm outta here then.", "topic": "TALK_DONE" } ] }, @@ -391,7 +391,7 @@ "topic": "TALK_MISSION_LIST", "condition": { "not": { "u_has_var": "Dana_Sourdough", "type": "mission", "context": "flag", "value": "yes" } } }, - { "text": "Thanks, can we talk about something else?", "topic": "TALK_REFUGEE_Dana_2" }, + { "text": "Thanks, can we talk about something else?", "topic": "TALK_REFUGEE_Dana_1" }, { "text": "It smells awesome. I'm going to head out now, thanks!", "topic": "TALK_DONE" } ] }, diff --git a/data/json/npcs/refugee_center/surface_staff/NPC_free_merchant_shopkeep.json b/data/json/npcs/refugee_center/surface_staff/NPC_free_merchant_shopkeep.json index a605fe196bde9..0b3b084eaadf4 100644 --- a/data/json/npcs/refugee_center/surface_staff/NPC_free_merchant_shopkeep.json +++ b/data/json/npcs/refugee_center/surface_staff/NPC_free_merchant_shopkeep.json @@ -499,286 +499,5 @@ "id": "TALK_EVAC_MERCHANT_Boris_Mission_1c", "dynamic_line": "Woah, you're really intent hey? Okay, if you feel so strongly, ten Merch is enough to get a couple people out of guard duty to help, and you know what? If you feel that strongly about it, I'll come help out in my down time too. I respect someone putting their money where their mouth is.", "speaker_effect": { "effect": { "npc_add_var": "cleanup_asked", "type": "mission", "context": "Boris_mission_1", "value": "yes" } } - }, - { - "id": "MISSION_FREE_MERCHANTS_EVAC_1", - "type": "mission_definition", - "name": { "str": "Clear Back Bay" }, - "description": "Clear out the barricaded back area in the refugee center and lay the former leader of the Free Merchants to rest, in exchange for the local currency: Free Merchant certified notes.", - "goal": "MGOAL_KILL_MONSTER", - "difficulty": 2, - "value": 50000, - "start": { - "assign_mission_target": { "om_terrain": "evac_center_9", "reveal_radius": 1 }, - "update_mapgen": { - "om_terrain": "evac_center_9", - "place_monster": [ { "group": "GROUP_REFUGEE_BOSS_ZOMBIE", "name": "Sean McLaughlin", "x": 10, "y": 10, "target": true } ] - } - }, - "end": { - "effect": [ - { "u_spawn_item": "FMCNote", "count": 25 }, - { "u_add_var": "FMShopkeep_Mission1", "type": "mission", "context": "flag", "value": "yes" }, - { "u_adjust_var": "refugee_happiness", "type": "counter", "context": "refugee_center", "adjustment": 3 } - ], - "update_mapgen": { - "om_terrain": "evac_center_9", - "set": [ { "square": "terrain", "id": "t_floor", "x": 0, "y": 23, "x2": 1, "y2": 23 } ] - } - }, - "origins": [ "ORIGIN_SECONDARY" ], - "followup": "MISSION_FREE_MERCHANTS_EVAC_2", - "dialogue": { - "describe": "We need help…", - "offer": "If you really want to lend a hand we could use your help clearing out the dead in the back bay. Fearful of going outside during the first days of the Cataclysm we ended up throwing our dead and the zombies we managed to kill in the sealed back bay. Our promising leader at the time even fell… he turned into something different. Kill all of them and make sure they won't bother us again. We can't pay much, besides some of our own internal money which isn't good for that much yet, but it would help us to reclaim the bay.", - "accepted": "Please be careful, we don't need any more deaths.", - "rejected": "Come back when you get a chance, we really need to start reclaiming the region.", - "advice": "If you can, get a friend or two to help you.", - "inquire": "Will they be bothering us any longer?", - "success": "Thank you, having that big of a threat close to home was nerve wracking. Here's some of our local certified notes, we've been paying these to our workers in exchange for supplies. They're getting some value in the center as a trade item, I'm afraid they're all we have to spare at the moment.", - "success_lie": "What good does this do us?", - "failure": "It was a lost cause anyways…" - } - }, - { - "id": "MISSION_FREE_MERCHANTS_EVAC_2", - "type": "mission_definition", - "name": { "str": "Missing Caravan" }, - "description": "Investigate the last known location of a disappeared scavenger trading party, and eliminate any bandits or raiders in the vicinity in exchange for certified notes.", - "goal": "MGOAL_ASSASSINATE", - "difficulty": 5, - "value": 5000, - "start": { - "assign_mission_target": { "om_terrain": "field", "reveal_radius": 1, "random": true, "search_range": 80 }, - "update_mapgen": { - "rows": [ - " ", - " ", - " ", - " ggggggggggggg ", - " ggggggggggggg ", - " gg....R...ggg ", - " gg........ggg ", - " gg.......Rggg ", - " gg.F..a...ggg ", - " gg........ggg ", - " gg........ggg ", - " gg........ggg ", - " gg........ggg ", - " gg........ggg ", - " ggggggggggggg ", - " ggggggggggggg ", - " ", - " ", - " ", - " b b ", - " b bb ", - " b ", - " ", - " " - ], - "terrain": { "g": "t_grass", ".": "t_dirt", "a": "t_dirt", "b": "t_dirt", "R": "t_dirt", "F": "t_dirt" }, - "furniture": { "a": "f_ash" }, - "traps": { "F": "tr_fur_rollmat", "R": "tr_rollmat" }, - "fields": { "b": { "field": "fd_blood", "intensity": 1 } }, - "place_loot": [ - { "group": "cannedfood", "x": [ 6, 18 ], "y": [ 3, 15 ], "chance": 100 }, - { "group": "alcohol_bottled_canned", "x": [ 6, 18 ], "y": [ 3, 15 ], "repeat": 2, "chance": 75 }, - { "group": "trash_forest", "x": [ 6, 18 ], "y": [ 3, 15 ], "repeat": 2, "chance": 75 }, - { "group": "stash_drugs", "x": [ 6, 18 ], "y": [ 3, 15 ], "chance": 75 }, - { "group": "dresser", "x": [ 9, 10 ], "y": [ 10, 14 ], "chance": 75 }, - { "group": "softdrugs", "x": [ 9, 10 ], "y": [ 10, 14 ], "chance": 50 }, - { "group": "camping", "x": [ 9, 10 ], "y": [ 10, 14 ], "chance": 75 }, - { "group": "casings", "x": [ 10, 15 ], "y": [ 15, 18 ], "repeat": 5, "chance": 100 }, - { "item": "corpse", "x": 13, "y": 19, "chance": 100 }, - { "item": "corpse", "x": 12, "y": 20, "chance": 100 } - ], - "place_npcs": [ - { "class": "bandit", "x": 15, "y": 7 }, - { "class": "thug", "x": 12, "y": 5 }, - { "class": "bandit", "x": 9, "y": 8, "target": true } - ], - "place_vehicles": [ - { "vehicle": "cube_van", "x": 12, "y": 12 }, - { "vehicle": "quad_bike", "x": 18, "y": 7, "rotation": 270, "fuel": 500, "status": -1, "chance": 100 }, - { "vehicle": "motorcycle", "x": 10, "y": 3, "rotation": 315, "fuel": 500, "status": -1, "chance": 100 }, - { "vehicle": "motorcycle", "x": 7, "y": 7, "rotation": 90, "fuel": 500, "status": -1, "chance": 100 } - ] - } - }, - "end": { - "effect": [ - { "u_spawn_item": "FMCNote", "count": 30 }, - { "u_add_var": "FMShopkeep_Mission2", "type": "mission", "context": "flag", "value": "yes" } - ] - }, - "origins": [ "ORIGIN_SECONDARY" ], - "followup": "MISSION_FREE_MERCHANTS_EVAC_3", - "dialogue": { - "describe": "We need help…", - "offer": "This is a bit more involved than the last request, we recently lost a scavenger party coming to trade with us and would like you to investigate. We strongly suspect a raider band or horde caught them off-guard. I can give you the coordinates of their last radio message but little else. In either case, deal with the threat so that the scavengers can continue to pass through in relative safety. The best reward I can offer is a claim to the supplies they were carrying, plus thirty certified notes - that's our own internal money, good for trading and such.", - "accepted": "Our community survives on trade, we appreciate it.", - "rejected": "Come back when you get a chance, we really need to start reclaiming the region.", - "advice": "If you can, get a friend or two to help you.", - "inquire": "Have you dealt with them?", - "success": "Thank you, the world is a better place without them. Two of our more skilled individuals accepted the assistance of the Old Guard in setting up an outpost while you were out. We didn't have many other options, refugees are still streaming in and we don't know what else to do with our limited food supply. If you get a chance, you should see if they need your assistance in the future…", - "success_lie": "What good does this do us?", - "failure": "It was a lost cause anyways…" - } - }, - { - "id": "MISSION_FREE_MERCHANTS_EVAC_3", - "type": "mission_definition", - "name": { "str": "Retrieve Prospectus" }, - "description": "Visit the farming commune and bring the foreman's prospectus back to the refugee center, for certified notes.", - "goal": "MGOAL_FIND_ITEM", - "difficulty": 5, - "value": 50000, - "item": "commune_prospectus", - "start": { - "assign_mission_target": { "om_terrain": "ranch_camp_67", "om_special": "ranch_camp", "reveal_radius": 1, "search_range": 200 }, - "update_mapgen": { - "place_npcs": [ - { "class": "ranch_foreman", "x": 16, "y": 15, "target": true, "add_trait": "NPC_MISSION_LEV_1" }, - { "class": "ranch_construction_1", "x": 9, "y": 17 } - ] - }, - "effect": [ { "u_add_var": "tacoma_started", "type": "knowledge", "context": "flag", "value": "yes" } ] - }, - "end": { - "effect": [ - { "u_spawn_item": "FMCNote", "count": 50 }, - { "u_add_var": "FMShopkeep_Mission3", "type": "mission", "context": "flag", "value": "yes" } - ], - "update_mapgen": { - "om_terrain": "evac_center_8", - "set": [ - { "point": "terrain", "id": "t_gates_mech_control_lab", "x": 17, "y": 1 }, - { "point": "terrain", "id": "t_gates_mech_control_lab", "x": 17, "y": 3 } - ] - } - }, - "origins": [ "ORIGIN_SECONDARY" ], - "followup": "MISSION_FREE_MERCHANTS_EVAC_4", - "dialogue": { - "describe": "We need help…", - "offer": "We recently set out some skilled people to start an outpost, to secure us some food supplies in a safer location. The new outpost that we've started could use your assistance. I need you to get the foreman's prospectus before we begin to send additional refugees to the farming commune. Consult with the foreman to get more detailed tasks. We've got 50 Certified Notes for you if you can do this for us.", - "accepted": "I'm sure the outpost will expand quickly with your assistance.", - "rejected": "Come back when you get a chance, we really need to start reclaiming the region.", - "advice": "Just follow your map.", - "inquire": "Do you have the prospectus?", - "success": "With this we'll be able to convince others to invest in the commune. Thank you, here's your money. We also managed to get a manual crank hooked up to the garage in the back, so feel free to make use of that - you've been a great help to us.", - "success_lie": "What good does this do us?", - "failure": "It was a lost cause anyways…" - } - }, - { - "id": "MISSION_FREE_MERCHANTS_EVAC_4", - "type": "mission_definition", - "name": { "str": "Solar Power" }, - "description": "Deliver 10 solar panels to help the Free Merchants set up a renewable power grid, in exchange for a handsome reward.", - "goal": "MGOAL_FIND_ITEM", - "difficulty": 5, - "value": 400000, - "item": "solar_panel", - "count": 10, - "origins": [ "ORIGIN_SECONDARY" ], - "followup": "MISSION_FREE_MERCHANTS_EVAC_5", - "end": { - "effect": [ - { "u_spawn_item": "FMCNote", "count": 100 }, - { "u_add_var": "FMShopkeep_Mission4", "type": "mission", "context": "flag", "value": "yes" } - ], - "update_mapgen": [ - { - "om_terrain": "evac_center_8_z1", - "set": [ { "line": "furniture", "id": "f_solar_unit", "x": 11, "y": 12, "x2": 12, "y2": 12 } ] - }, - { - "om_terrain": "evac_center_12_z1", - "set": [ { "line": "furniture", "id": "f_solar_unit", "x": 21, "y": 12, "x2": 21, "y2": 14 } ] - }, - { - "om_terrain": "evac_center_14_z1", - "set": [ { "line": "furniture", "id": "f_solar_unit", "x": 1, "y": 12, "x2": 1, "y2": 14 } ] - }, - { - "om_terrain": "evac_center_18_z1", - "set": [ { "line": "furniture", "id": "f_solar_unit", "x": 11, "y": 3, "x2": 12, "y2": 3 } ] - } - ] - }, - "dialogue": { - "describe": "We need help…", - "offer": "We are starting to build new infrastructure here and would like to get a few new electrical systems online… unfortunately our existing system relies on an array of something called RTGs. Running generators isn't a viable option underground, of course. We have a big flat roof up top, and if we had a few solar panels we could use them to top up our usage. We could pay you pretty handsomely to bring us, say, ten solar panels?", - "accepted": "If you can do this for us our survival options would vastly increase.", - "rejected": "Come back when you get a chance, we really need to start reclaiming the region.", - "advice": "Solar panels are pretty common on electric cars and on rooftops.", - "inquire": "How is the search going?", - "success": "Great, I know it isn't much but we hope to continue to expand thanks to your help.", - "success_lie": "What good does this do us?", - "failure": "It was a lost cause anyways…" - } - }, - { - "id": "MISSION_FREE_MERCHANTS_EVAC_5", - "type": "mission_definition", - "name": { "str": "In a Pickle" }, - "description": "Deliver 100 half-liter glass canning jars to the Free Merchants to kickstart their food storage plans.", - "goal": "MGOAL_FIND_ITEM", - "difficulty": 3, - "value": 400000, - "item": "jar_glass_sealed", - "count": 100, - "end": { - "effect": [ - { "u_spawn_item": "FMCNote", "count": 25 }, - { "u_add_var": "FMShopkeep_Mission5", "type": "mission", "context": "flag", "value": "yes" } - ] - }, - "origins": [ "ORIGIN_SECONDARY" ], - "dialogue": { - "describe": "We need help…", - "offer": "While we've managed to secure day to day food supplies, it's very much hand to mouth. Our reserves would barely last a few days if something kept our people locked in. We need a stockpile to avoid that. Thanks to our outpost we have a bit of meat and vegetables coming in, but we need a better way to preserve them. Some of our people know enough about food canning that if we had a good stock of canning jars, we could make pickles and canned meats to get us set for the winter. I'll pay you a premium rate if you can bring us around a hundred jars to get us started.", - "accepted": "It'll take a load off my shoulders if I can finally stop worrying about this.", - "rejected": "We'll hold for the moment, but I'll get an ulcer if I have to keep worrying. If you reconsider let me know.", - "advice": "Grocery stores, house kitchens, there's plenty of places to look.", - "inquire": "How is the search going?", - "success": "That's one less thing to worry about. Glad to have someone like you on our side. Here's 25 merch, and the broker will buy any further glass jars you can find - at a reduced price, we can't keep up the premium rate. Actually, the broker was saying they had some jobs like this for you, and that it might be easier to just go straight through their office if you want more work.", - "success_lie": "What good does this do us?", - "failure": "It was a lost cause anyways…" - } - }, - { - "id": "MISSION_FREE_MERCHANTS_HUB_DELIVERY_1", - "type": "mission_definition", - "name": { "str": "Unknown Recipient" }, - "description": "Deliver the hdd to the military remnant. Return to the Evacuation Center when the trade is complete.", - "goal": "MGOAL_CONDITION", - "difficulty": 5, - "start": { - "effect": [ { "u_spawn_item": "fema_data", "count": 1 } ], - "assign_mission_target": { - "om_terrain": "robofachq_surface_entrance", - "om_special": "hub_01", - "reveal_radius": 1, - "random": true, - "search_range": 240 - } - }, - "goal_condition": { "u_has_var": "completed_free_merchants_hub_delivery_1", "type": "dialogue", "context": "intercom", "value": "yes" }, - "value": 5000, - "origins": [ "ORIGIN_SECONDARY" ], - "dialogue": { - "describe": "…", - "offer": "…", - "accepted": "…", - "rejected": "…", - "advice": "…", - "inquire": "Have you finished the delivery already?", - "success": "Good, that's one less thing to worry about.", - "success_lie": "What good does this do us?", - "failure": "At least you came back with your life…" - } } ] diff --git a/data/json/npcs/refugee_center/surface_staff/Smokes/free_merchant_shopkeep_missions.json b/data/json/npcs/refugee_center/surface_staff/Smokes/free_merchant_shopkeep_missions.json index c64fdcc5f0c77..c15764cebc0df 100644 --- a/data/json/npcs/refugee_center/surface_staff/Smokes/free_merchant_shopkeep_missions.json +++ b/data/json/npcs/refugee_center/surface_staff/Smokes/free_merchant_shopkeep_missions.json @@ -245,7 +245,7 @@ "id": "MISSION_FREE_MERCHANTS_EVAC_5", "type": "mission_definition", "name": { "str": "In a Pickle" }, - "description": "Deliver 100 half-liter glass canning jars to the Free Merchants to kickstart their food storage plans.", + "description": "Deliver 100 0.5L glass jars to the Free Merchants to kickstart their food storage plans.", "goal": "MGOAL_FIND_ITEM", "difficulty": 3, "value": 400000, diff --git a/data/json/obsolete.json b/data/json/obsolete.json index bdad8607de62c..0b6f831674818 100644 --- a/data/json/obsolete.json +++ b/data/json/obsolete.json @@ -64,6 +64,24 @@ "name": "otter", "base_faction": "animal" }, + { + "id": "vitA", + "type": "vitamin", + "vit_type": "vitamin", + "name": { "str": "Vitamin A" }, + "min": -8400, + "max": 3600, + "rate": "180 m" + }, + { + "id": "vitB", + "type": "vitamin", + "vit_type": "vitamin", + "name": { "str": "Vitamin B12" }, + "min": -5600, + "max": 2000, + "rate": "360 m" + }, { "id": "1st_aid", "type": "GENERIC", diff --git a/data/json/overmap/multitile_city_buildings.json b/data/json/overmap/multitile_city_buildings.json index 9aeaf94e3f482..c0bb1f2a29107 100644 --- a/data/json/overmap/multitile_city_buildings.json +++ b/data/json/overmap/multitile_city_buildings.json @@ -1508,6 +1508,15 @@ "locations": [ "land" ], "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "s_antique_north" }, { "point": [ 0, 0, 1 ], "overmap": "s_antique_roof_north" } ] }, + { + "type": "city_building", + "id": "s_dive_shop", + "locations": [ "land" ], + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "s_dive_shop_north" }, + { "point": [ 0, 0, 1 ], "overmap": "s_dive_shop_roof_north" } + ] + }, { "//": "All of those overmap specials that spawn also outside of town require a second declare as city_building.", "type": "city_building", diff --git a/data/json/overmap/overmap_special/specials.json b/data/json/overmap/overmap_special/specials.json index 349eb29729904..a81cff7ff8d4f 100644 --- a/data/json/overmap/overmap_special/specials.json +++ b/data/json/overmap/overmap_special/specials.json @@ -1234,29 +1234,6 @@ "occurrences": [ 10, 100 ], "flags": [ "LAB", "UNIQUE" ] }, - { - "type": "overmap_special", - "id": "Mine Entrance", - "overmaps": [ - { "point": [ 0, 0, 0 ], "overmap": "s_lot_north" }, - { "point": [ 0, 1, 0 ], "overmap": "mine_entrance_north" }, - { "point": [ 1, 1, 0 ], "overmap": "mine_entrance_loading_zone_north" }, - { "point": [ 1, 0, 0 ], "overmap": "road_end_north" }, - { "point": [ 0, 1, 1 ], "overmap": "mine_entrance_roof_north" }, - { "point": [ 0, 1, -1 ], "overmap": "mine_shaft_middle_north" }, - { "point": [ 0, 1, -2 ], "overmap": "mine_shaft_lower_north" }, - { "point": [ 1, 1, -2 ], "overmap": "mine_shaft_lower_east_north" } - ], - "connections": [ - { "point": [ 0, -1, 0 ], "terrain": "road", "connection": "local_road", "from": [ 0, 0, 0 ] }, - { "point": [ 1, -1, 0 ], "terrain": "road", "connection": "local_road", "from": [ 1, 0, 0 ] } - ], - "locations": [ "wilderness" ], - "city_distance": [ 10, 40 ], - "city_sizes": [ 4, -1 ], - "occurrences": [ 0, 2 ], - "flags": [ "WILDERNESS" ] - }, { "type": "overmap_special", "id": "Spider Pit", diff --git a/data/json/overmap/overmap_terrain/overmap_terrain.json b/data/json/overmap/overmap_terrain/overmap_terrain.json index cdcb81be88699..5bf55f71544d5 100644 --- a/data/json/overmap/overmap_terrain/overmap_terrain.json +++ b/data/json/overmap/overmap_terrain/overmap_terrain.json @@ -573,7 +573,8 @@ "id": "cs_public_space", "copy-from": "generic_city_building", "name": "public space", - "color": "i_white" + "sym": "g", + "color": "light_green" }, { "type": "overmap_terrain", diff --git a/data/json/overmap/overmap_terrain/overmap_terrain_agricultural.json b/data/json/overmap/overmap_terrain/overmap_terrain_agricultural.json index 4de14ba6201a8..cee4f830380fa 100644 --- a/data/json/overmap/overmap_terrain/overmap_terrain_agricultural.json +++ b/data/json/overmap/overmap_terrain/overmap_terrain_agricultural.json @@ -271,7 +271,7 @@ "id": [ "farm_stills_4", "farm_stills_8", "farm_stills_12" ], "copy-from": "generic_rural_building", "spawns": { "group": "GROUP_WASP_FORAGER", "population": [ 1, 4 ], "chance": 10 }, - "name": "grape farm" + "name": "vineyard" }, { "type": "overmap_terrain", diff --git a/data/json/overmap/overmap_terrain/overmap_terrain_commercial.json b/data/json/overmap/overmap_terrain/overmap_terrain_commercial.json index ff9f6600fe50b..397df44ff813b 100644 --- a/data/json/overmap/overmap_terrain/overmap_terrain_commercial.json +++ b/data/json/overmap/overmap_terrain/overmap_terrain_commercial.json @@ -52,7 +52,7 @@ }, { "type": "overmap_terrain", - "id": [ "office_cubical", "office_cubical_1" ], + "id": [ "office_cubical", "office_cubical_1", "small_office" ], "copy-from": "generic_city_building", "looks_like": "office_cubical", "name": "office", @@ -60,7 +60,7 @@ }, { "type": "overmap_terrain", - "id": [ "office_cubical_roof", "office_cubical_roof_1" ], + "id": [ "office_cubical_roof", "office_cubical_roof_1", "small_office_roof", "small_office_upper_roof" ], "copy-from": "generic_city_building", "looks_like": "office_cubical_roof", "name": "office roof", @@ -338,14 +338,7 @@ }, { "type": "overmap_terrain", - "id": [ - "s_bookstore_roof", - "s_bookstore_roof_1", - "s_bookstore_roof_2", - "s_bookstore_upper_roof", - "s_bookstore_upper_roof_1", - "s_bookstore_upper_roof_1" - ], + "id": [ "s_bookstore_roof", "s_bookstore_roof_1", "s_bookstore_roof_2", "s_bookstore_upper_roof", "s_bookstore_upper_roof_1" ], "copy-from": "generic_city_building", "looks_like": "s_bookstore_roof", "name": "bookstore roof", @@ -356,8 +349,8 @@ "id": "s_diner", "name": "diner", "copy-from": "generic_city_building", - "sym": "d", - "color": "green", + "looks_like": "s_restaurant", + "color": "pink", "extend": { "flags": [ "SOURCE_FOOD", "SOURCE_DRINK", "SOURCE_COOKING" ] } }, { @@ -365,8 +358,8 @@ "id": [ "s_diner_2ndfloor", "s_diner_roof" ], "name": "diner", "copy-from": "generic_city_building", - "sym": "d", - "color": "green" + "looks_like": "s_restaurant", + "color": "pink" }, { "type": "overmap_terrain", @@ -829,12 +822,11 @@ "hdwr_large_0_1_1", "hdwr_large_1_1_1", "hdwr_large_0_2_1", - "hdwr_large_1_2_1", "hdwr_large_1_2_1" ], - "name": "home improvement superstore", - "sym": ".", - "color": "light_blue", + "name": "home improvement superstore roof", + "sym": "H", + "color": "light_green_yellow", "see_cost": 5 }, { @@ -883,22 +875,6 @@ "sym": "D", "color": "i_green" }, - { - "id": "small_office", - "type": "overmap_terrain", - "copy-from": "generic_city_building", - "name": "small office", - "sym": "o", - "color": "brown" - }, - { - "type": "overmap_terrain", - "id": [ "small_office_roof", "small_office_upper_roof" ], - "copy-from": "generic_city_building", - "name": "small office roof", - "sym": "o", - "color": "brown" - }, { "type": "overmap_terrain", "id": [ "candy_shop", "candy_shop_1" ], @@ -1186,7 +1162,6 @@ "2fmotel_1_f2", "2fmotel_2_f2", "2fmotel_3_f2", - "2fmotel_3_f2", "2fmotel_1_r", "2fmotel_2_r", "2fmotel_3_r" @@ -1235,8 +1210,7 @@ "loffice_tower_12", "loffice_tower_13", "loffice_tower_14", - "loffice_tower_15", - "loffice_tower_16" + "loffice_tower_15" ], "copy-from": "generic_large_office_tower" }, @@ -1264,6 +1238,22 @@ "sym": "A", "color": "brown" }, + { + "type": "overmap_terrain", + "id": "s_dive_shop", + "name": "dive shop", + "copy-from": "generic_city_building", + "sym": "D", + "color": "blue" + }, + { + "type": "overmap_terrain", + "id": "s_dive_shop_roof", + "name": "dive shop roof", + "copy-from": "generic_city_building", + "sym": "D", + "color": "blue" + }, { "type": "overmap_terrain", "id": "s_arcade", @@ -1591,7 +1581,15 @@ "city_block2_roof_1", "city_block2_roof_2", "city_block2_roof_3", - "city_block2_roof_4", + "city_block2_roof_4" + ], + "copy-from": "generic_city_building", + "name": "urban city block", + "color": "light_blue" + }, + { + "type": "overmap_terrain", + "id": [ "urban_25_3", "urban_25_4", "urban_25_5", @@ -1604,7 +1602,8 @@ ], "copy-from": "generic_city_building", "name": "urban city block", - "color": "light_blue" + "color": "light_blue", + "sym": "v" }, { "type": "overmap_terrain", @@ -1627,7 +1626,10 @@ "urban_14_8", "urban_14_9" ], - "copy-from": "urban_13_3" + "copy-from": "generic_city_house", + "name": "dense urban", + "color": "i_white", + "see_cost": 40 }, { "type": "overmap_terrain", diff --git a/data/json/overmap/overmap_terrain/overmap_terrain_industrial.json b/data/json/overmap/overmap_terrain/overmap_terrain_industrial.json index 9f568477348f5..948bc1b0654fb 100644 --- a/data/json/overmap/overmap_terrain/overmap_terrain_industrial.json +++ b/data/json/overmap/overmap_terrain/overmap_terrain_industrial.json @@ -21,7 +21,7 @@ }, { "type": "overmap_terrain", - "id": [ "public_works_NE_roof", "public_works_NW_roof", "public_works_SW_roof", "public_works_SE_roof" ], + "id": [ "public_works_NE_roof", "public_works_NW_roof", "public_works_SE_roof" ], "name": "public works roof", "sym": "w", "color": "light_gray", @@ -269,7 +269,6 @@ "steel_mill_4_2_3", "steel_mill_4_3", "steel_mill_4_3_2", - "steel_mill_4_3_3", "steel_mill_4_3_3" ], "copy-from": "generic_city_building_no_sidewalk", @@ -289,7 +288,7 @@ ], "copy-from": "generic_city_building_no_sidewalk", "name": "steel mill depot", - "sym": "|", + "sym": "│", "color": "dark_gray" }, { diff --git a/data/json/overmap/overmap_terrain/overmap_terrain_lab.json b/data/json/overmap/overmap_terrain/overmap_terrain_lab.json index 7d80614cf85bd..1faad653f8c41 100644 --- a/data/json/overmap/overmap_terrain/overmap_terrain_lab.json +++ b/data/json/overmap/overmap_terrain/overmap_terrain_lab.json @@ -653,7 +653,7 @@ "sym": "M", "color": "red", "see_cost": 5, - "spawns": { "group": "GROUP_LAB_HOSPTIAL", "population": [ 7, 15 ], "chance": 100 }, + "spawns": { "group": "GROUP_LAB_HOSPITAL", "population": [ 7, 15 ], "chance": 100 }, "flags": [ "RISK_HIGH", "SOURCE_CHEMISTRY", "SOURCE_MEDICINE" ] }, { diff --git a/data/json/overmap/overmap_terrain/overmap_terrain_public_institutional.json b/data/json/overmap/overmap_terrain/overmap_terrain_public_institutional.json index 61bb3f0b4d18e..b5341c3736fb5 100644 --- a/data/json/overmap/overmap_terrain/overmap_terrain_public_institutional.json +++ b/data/json/overmap/overmap_terrain/overmap_terrain_public_institutional.json @@ -118,10 +118,6 @@ "police_dept_u011", "police_dept_u101", "police_dept_u111", - "police_dept_u002", - "police_dept_u012", - "police_dept_u102", - "police_dept_u112", "police_dept_d000", "police_dept_d010", "police_dept_d100", @@ -129,11 +125,7 @@ "police_dept_d001", "police_dept_d011", "police_dept_d101", - "police_dept_d111", - "police_dept_d002", - "police_dept_d012", - "police_dept_d102", - "police_dept_d112" + "police_dept_d111" ], "name": "police department", "copy-from": "generic_city_building", @@ -519,10 +511,10 @@ "type": "overmap_terrain", "id": [ "town_hall_0_0_roof", "town_hall_1_0_roof", "town_hall_0_1_roof", "town_hall_1_1_roof" ], "name": "town hall", - "sym": ".", - "color": "light_blue", + "sym": "^", + "color": "i_black", "see_cost": 2, - "mondensity": 2 + "mondensity": 1 }, { "type": "overmap_terrain", diff --git a/data/json/overmap/overmap_terrain/overmap_terrain_recreational.json b/data/json/overmap/overmap_terrain/overmap_terrain_recreational.json index 9ee8b602a0aa8..1b8550699e9f0 100644 --- a/data/json/overmap/overmap_terrain/overmap_terrain_recreational.json +++ b/data/json/overmap/overmap_terrain/overmap_terrain_recreational.json @@ -155,7 +155,7 @@ { "type": "overmap_terrain", "id": [ "PublicPond_1a", "PublicPond_1b" ], - "copy-from": "generic_city_building_no_sidewalk", + "copy-from": "generic_city_building", "name": "public pond", "sym": "P", "color": "i_green" @@ -168,17 +168,16 @@ "color": "yellow", "see_cost": 5, "mondensity": 2, - "flags": [ "SOURCE_FARMING" ] + "flags": [ "SIDEWALK", "SOURCE_FARMING" ] }, { "type": "overmap_terrain", "id": [ "publicgarden", "publicgarden_2" ], + "copy-from": "generic_city_building", "name": "public garden", "looks_like": "publicgarden", "sym": "g", - "color": "light_green", - "see_cost": 5, - "mondensity": 2 + "color": "light_green" }, { "type": "overmap_terrain", @@ -372,6 +371,7 @@ "stadium_3_1", "stadium_0_2", "stadium_0_3", + "stadium_3_2", "stadium_3_3", "stadium_1_4", "stadium_2_4" @@ -391,7 +391,7 @@ }, { "type": "overmap_terrain", - "id": [ "stadium_1_2", "stadium_2_2", "stadium_3_2", "stadium_1_3", "stadium_2_3" ], + "id": [ "stadium_1_2", "stadium_2_2", "stadium_1_3", "stadium_2_3" ], "copy-from": "generic_city_building", "name": "stadium field", "sym": "X", @@ -700,10 +700,9 @@ { "type": "overmap_terrain", "id": [ "park_maze", "park_maze_2" ], + "copy-from": "generic_city_building", "name": "hedge maze", "sym": "g", - "color": "light_green", - "see_cost": 5, - "mondensity": 2 + "color": "light_green" } ] diff --git a/data/json/overmap/overmap_terrain/overmap_terrain_residential.json b/data/json/overmap/overmap_terrain/overmap_terrain_residential.json index 610fe546200e4..515bee07e0fac 100644 --- a/data/json/overmap/overmap_terrain/overmap_terrain_residential.json +++ b/data/json/overmap/overmap_terrain/overmap_terrain_residential.json @@ -156,23 +156,6 @@ "id": [ "urban_29_3", "urban_29_4", - "urban_1_1", - "urban_1_2", - "urban_1_3", - "urban_1_4", - "urban_1_6", - "urban_2_1", - "urban_2_2", - "urban_3_1", - "urban_3_2", - "urban_4_3", - "urban_4_4", - "urban_5_1", - "urban_5_2", - "urban_6_1", - "urban_6_2", - "urban_7_1", - "urban_7_2", "urban_8_1", "urban_8_2", "urban_9_1", @@ -195,6 +178,31 @@ "copy-from": "generic_city_house", "see_cost": 10 }, + { + "type": "overmap_terrain", + "id": [ + "urban_1_1", + "urban_1_2", + "urban_1_3", + "urban_1_4", + "urban_1_6", + "urban_2_1", + "urban_2_2", + "urban_3_1", + "urban_3_2", + "urban_4_3", + "urban_4_4", + "urban_5_1", + "urban_5_2", + "urban_6_1", + "urban_6_2", + "urban_7_1", + "urban_7_2" + ], + "copy-from": "generic_city_house", + "sym": "v", + "see_cost": 10 + }, { "type": "overmap_terrain", "id": [ @@ -204,30 +212,6 @@ "urban_29_8", "urban_29_9", "urban_29_10", - "urban_2_3", - "urban_2_4", - "urban_2_5", - "urban_2_6", - "urban_3_3", - "urban_3_4", - "urban_3_5", - "urban_3_6", - "urban_4_5", - "urban_4_6", - "urban_4_7", - "urban_4_8", - "urban_5_3", - "urban_5_4", - "urban_5_5", - "urban_5_6", - "urban_6_3", - "urban_6_4", - "urban_6_5", - "urban_6_6", - "urban_7_3", - "urban_7_4", - "urban_7_5", - "urban_7_6", "urban_8_3", "urban_8_4", "urban_8_6", @@ -265,6 +249,38 @@ "copy-from": "generic_city_house_no_sidewalk", "see_cost": 10 }, + { + "type": "overmap_terrain", + "id": [ + "urban_2_3", + "urban_2_4", + "urban_2_5", + "urban_2_6", + "urban_3_3", + "urban_3_4", + "urban_3_5", + "urban_3_6", + "urban_4_5", + "urban_4_6", + "urban_4_7", + "urban_4_8", + "urban_5_3", + "urban_5_4", + "urban_5_5", + "urban_5_6", + "urban_6_3", + "urban_6_4", + "urban_6_5", + "urban_6_6", + "urban_7_3", + "urban_7_4", + "urban_7_5", + "urban_7_6" + ], + "copy-from": "generic_city_house_no_sidewalk", + "sym": "v", + "see_cost": 10 + }, { "type": "overmap_terrain", "id": [ @@ -593,7 +609,7 @@ { "id": "derelict_property", "type": "overmap_terrain", - "copy-from": "generic_city_building", + "copy-from": "generic_city_building_no_sidewalk", "name": "derelict property", "sym": "X", "color": "i_brown" diff --git a/data/json/overmap/overmap_terrain/overmap_terrain_transportation.json b/data/json/overmap/overmap_terrain/overmap_terrain_transportation.json index 0da354614f599..51a5c93e1a6bb 100644 --- a/data/json/overmap/overmap_terrain/overmap_terrain_transportation.json +++ b/data/json/overmap/overmap_terrain/overmap_terrain_transportation.json @@ -445,8 +445,6 @@ "id": [ "parking_garage_down_0", "parking_garage_down_1", - "parking_garage_0_0", - "parking_garage_0_1", "parking_garage_1_0", "parking_garage_1_1", "parking_garage_2_0", @@ -459,7 +457,14 @@ "sym": "O", "color": "dark_gray", "see_cost": 5, - "extras": "build" + "extras": "build", + "flags": [ "SIDEWALK" ] + }, + { + "type": "overmap_terrain", + "id": [ "parking_garage_0_0", "parking_garage_0_1" ], + "copy-from": "parking_garage_1_0", + "flags": [ "SIDEWALK" ] }, { "type": "overmap_terrain", diff --git a/data/json/portal_storm_effect_on_condition.json b/data/json/portal_storm_effect_on_condition.json index 6a227d8aea477..9b159adf374d3 100644 --- a/data/json/portal_storm_effect_on_condition.json +++ b/data/json/portal_storm_effect_on_condition.json @@ -264,7 +264,8 @@ [ "EOC_PORTAL_LIGHT", 2 ], [ "EOC_PORTAL_TELEPORT_STUCK_START", 3 ], [ "EOC_PORTAL_GRASS_CHANGE", 5 ], - [ "EOC_PORTAL_MESSAGE", 5 ] + [ "EOC_PORTAL_MESSAGE", 5 ], + [ "EOC_PORTAL_DOOR_OPEN", 1 ] ] } }, @@ -294,7 +295,8 @@ [ "EOC_PORTAL_GRASS_CHANGE", 1 ], [ "EOC_PORTAL_TELEPORT_STUCK_START", 2 ], [ "EOC_PORTAL_SMOKE", 2 ], - [ "EOC_PORTAL_MESSAGE", 7 ] + [ "EOC_PORTAL_MESSAGE", 7 ], + [ "EOC_PORTAL_DOOR_OPEN", 1 ] ] } }, @@ -322,7 +324,8 @@ [ "EOC_PORTAL_LIGHT", 2 ], [ "EOC_PORTAL_TELEPORT_STUCK_START", 1 ], [ "EOC_PORTAL_MESSAGE", 5 ], - [ "EOC_PORTAL_STORM_POPUP", 1 ] + [ "EOC_PORTAL_STORM_POPUP", 1 ], + [ "EOC_PORTAL_DOOR_OPEN", 1 ] ] } }, @@ -633,6 +636,339 @@ "id": "portal_alien_grass_transform", "terrain": [ { "result": [ "t_grass" ], "valid_terrain": [ "t_grass_alien" ] } ] }, + { + "type": "effect_on_condition", + "id": "EOC_PORTAL_DOOR_OPEN", + "global": true, + "effect": [ + { "u_location_variable": { "global_val": "door_transform" }, "min_radius": 1, "max_radius": 15, "outdoor_only": true }, + { + "u_transform_radius": 20, + "ter_furn_transform": "portal_door_transform", + "target_var": { "global_val": "door_transform" } + }, + { + "u_transform_radius": 20, + "ter_furn_transform": "portal_door_close_transform", + "target_var": { "global_val": "door_transform" }, + "time_in_future": [ "2 seconds", "10 seconds" ] + } + ] + }, + { + "type": "ter_furn_transform", + "id": "portal_door_transform", + "terrain": [ + { "result": [ "t_door_o" ], "valid_terrain": [ "t_door_c" ], "message": " A door flies open!", "message_good": false }, + { + "result": [ "f_beaded_door_o" ], + "valid_terrain": [ "f_beaded_door" ], + "message": " A door flies open!", + "message_good": false + }, + { + "result": [ "f_canvas_door_o" ], + "valid_terrain": [ "f_canvas_door" ], + "message": " A door flies open!", + "message_good": false + }, + { + "result": [ "f_large_canvas_door_o" ], + "valid_terrain": [ "f_large_canvas_door" ], + "message": " A door flies open!", + "message_good": false + }, + { + "result": [ "t_laminated_door_glass_o" ], + "valid_terrain": [ "t_laminated_door_glass_c" ], + "message": " A door flies open!", + "message_good": false + }, + { + "result": [ "t_door_lab_o" ], + "valid_terrain": [ "t_door_lab_c" ], + "message": " A door flies open!", + "message_good": false + }, + { + "result": [ "t_door_white_o" ], + "valid_terrain": [ "t_door_white_c" ], + "message": " A door flies open!", + "message_good": false + }, + { + "result": [ "t_door_gray_o" ], + "valid_terrain": [ "t_door_gray_c" ], + "message": " A door flies open!", + "message_good": false + }, + { + "result": [ "t_door_red_o" ], + "valid_terrain": [ "t_door_red_c" ], + "message": " A door flies open!", + "message_good": false + }, + { + "result": [ "t_door_green_o" ], + "valid_terrain": [ "t_door_green_c" ], + "message": " A door flies open!", + "message_good": false + }, + { + "result": [ "t_door_glass_red_o" ], + "valid_terrain": [ "t_door_glass_red_c" ], + "message": " A door flies open!", + "message_good": false + }, + { + "result": [ "t_door_glass_green_o" ], + "valid_terrain": [ "t_door_glass_green_c" ], + "message": " A door flies open!", + "message_good": false + }, + { + "result": [ "t_door_glass_white_o" ], + "valid_terrain": [ "t_door_glass_white_c" ], + "message": " A door flies open!", + "message_good": false + }, + { + "result": [ "t_door_glass_gray_o" ], + "valid_terrain": [ "t_door_glass_gray_c" ], + "message": " A door flies open!", + "message_good": false + }, + { + "result": [ "t_door_o_peep" ], + "valid_terrain": [ "t_door_c_peep" ], + "message": " A door flies open!", + "message_good": false + }, + { + "result": [ "t_door_curtain_o" ], + "valid_terrain": [ "t_door_curtain_c" ], + "message": " A door flies open!", + "message_good": false + }, + { + "result": [ "t_door_makeshift_o" ], + "valid_terrain": [ "t_door_makeshift_c" ], + "message": " A door flies open!", + "message_good": false + }, + { + "result": [ "t_door_glass_o" ], + "valid_terrain": [ "t_door_glass_c" ], + "message": " A door flies open!", + "message_good": false + }, + { + "result": [ "t_door_glass_lab_o" ], + "valid_terrain": [ "t_door_glass_lab_c" ], + "message": " A door flies open!", + "message_good": false + }, + { + "result": [ "t_door_glass_frosted_o" ], + "valid_terrain": [ "t_door_glass_frosted_c" ], + "message": " A door flies open!", + "message_good": false + }, + { + "result": [ "t_door_glass_frosted_lab_o" ], + "valid_terrain": [ "t_door_glass_frosted_lab_c" ], + "message": " A door flies open!", + "message_good": false + }, + { + "result": [ "t_chaingate_o" ], + "valid_terrain": [ "t_chaingate_c" ], + "message": " A door flies open!", + "message_good": false + }, + { + "result": [ "t_fencegate_o" ], + "valid_terrain": [ "t_fencegate_c" ], + "message": " A door flies open!", + "message_good": false + }, + { + "result": [ "t_screen_door_o" ], + "valid_terrain": [ "t_screen_door_c" ], + "message": " A door flies open!", + "message_good": false + }, + { + "result": [ "t_chickenwire_gate_o" ], + "valid_terrain": [ "t_chickenwire_gate_c" ], + "message": " A door flies open!", + "message_good": false + }, + { + "result": [ "t_gate_metal_o" ], + "valid_terrain": [ "t_gate_metal_c" ], + "message": " A door flies open!", + "message_good": false + } + ] + }, + { + "type": "ter_furn_transform", + "id": "portal_door_close_transform", + "terrain": [ + { "result": [ "t_door_c" ], "valid_terrain": [ "t_door_o" ], "message": " A door slams shut!", "message_good": false }, + { + "result": [ "f_beaded_door" ], + "valid_terrain": [ "f_beaded_door_o" ], + "message": " A door slams shut!", + "message_good": false + }, + { + "result": [ "f_canvas_door" ], + "valid_terrain": [ "f_canvas_door_o" ], + "message": " A door slams shut!", + "message_good": false + }, + { + "result": [ "f_large_canvas_door" ], + "valid_terrain": [ "f_large_canvas_door_o" ], + "message": " A door slams shut!", + "message_good": false + }, + { + "result": [ "t_laminated_door_glass_c" ], + "valid_terrain": [ "t_laminated_door_glass_o" ], + "message": " A door slams shut!", + "message_good": false + }, + { + "result": [ "t_door_lab_c" ], + "valid_terrain": [ "t_door_lab_o" ], + "message": " A door slams shut!", + "message_good": false + }, + { + "result": [ "t_door_white_c" ], + "valid_terrain": [ "t_door_white_o" ], + "message": " A door slams shut!", + "message_good": false + }, + { + "result": [ "t_door_gray_c" ], + "valid_terrain": [ "t_door_gray_o" ], + "message": " A door slams shut!", + "message_good": false + }, + { + "result": [ "t_door_red_c" ], + "valid_terrain": [ "t_door_red_o" ], + "message": " A door slams shut!", + "message_good": false + }, + { + "result": [ "t_door_green_c" ], + "valid_terrain": [ "t_door_green_o" ], + "message": " A door slams shut!", + "message_good": false + }, + { + "result": [ "t_door_glass_red_c" ], + "valid_terrain": [ "t_door_glass_red_o" ], + "message": " A door slams shut!", + "message_good": false + }, + { + "result": [ "t_door_glass_green_o" ], + "valid_terrain": [ "t_door_glass_green_o" ], + "message": " A door slams shut!", + "message_good": false + }, + { + "result": [ "t_door_glass_white_c" ], + "valid_terrain": [ "t_door_glass_white_o" ], + "message": " A door slams shut!", + "message_good": false + }, + { + "result": [ "t_door_glass_gray_c" ], + "valid_terrain": [ "t_door_glass_gray_o" ], + "message": " A door slams shut!", + "message_good": false + }, + { + "result": [ "t_door_c_peep" ], + "valid_terrain": [ "t_door_o_peep" ], + "message": " A door slams shut!", + "message_good": false + }, + { + "result": [ "t_door_curtain_c" ], + "valid_terrain": [ "t_door_curtain_o" ], + "message": " A door slams shut!", + "message_good": false + }, + { + "result": [ "t_door_makeshift_c" ], + "valid_terrain": [ "t_door_makeshift_o" ], + "message": " A door slams shut!", + "message_good": false + }, + { + "result": [ "t_door_glass_c" ], + "valid_terrain": [ "t_door_glass_o" ], + "message": " A door slams shut!", + "message_good": false + }, + { + "result": [ "t_door_glass_lab_c" ], + "valid_terrain": [ "t_door_glass_lab_o" ], + "message": " A door slams shut!", + "message_good": false + }, + { + "result": [ "t_door_glass_frosted_c" ], + "valid_terrain": [ "t_door_glass_frosted_o" ], + "message": " A door slams shut!", + "message_good": false + }, + { + "result": [ "t_door_glass_frosted_lab_c" ], + "valid_terrain": [ "t_door_glass_frosted_lab_o" ], + "message": " A door slams shut!", + "message_good": false + }, + { + "result": [ "t_chaingate_c" ], + "valid_terrain": [ "t_chaingate_o" ], + "message": " A door slams shut!", + "message_good": false + }, + { + "result": [ "t_fencegate_c" ], + "valid_terrain": [ "t_fencegate_o" ], + "message": " A door slams shut!", + "message_good": false + }, + { + "result": [ "t_screen_door_c" ], + "valid_terrain": [ "t_screen_door_o" ], + "message": " A door slams shut!", + "message_good": false + }, + { + "result": [ "t_chickenwire_gate_c" ], + "valid_terrain": [ "t_chickenwire_gate_o" ], + "message": " A door slams shut!", + "message_good": false + }, + { + "result": [ "t_gate_metal_c" ], + "valid_terrain": [ "t_gate_metal_o" ], + "message": " A door slams shut!", + "message_good": false + } + ] + }, { "type": "effect_on_condition", "id": "EOC_PORTAL_STORM_VOICES_1", @@ -716,6 +1052,40 @@ "condition": { "and": [ { "not": { "u_has_effect": "sleep" } }, { "x_in_y_chance": { "x": 1, "y": 30 } } ] }, "effect": { "u_message": "PORTAL_STORM_INDOOR_MESSAGES_3", "snippet": true } }, + { + "type": "effect_on_condition", + "id": "EOC_PORTAL_STORM_CELL", + "effect": [ + { "u_location_variable": { "global_val": "cell_loc" } }, + { "u_location_variable": { "global_val": "cell_roof_loc" }, "z_offset": 1 }, + { + "arithmetic": [ { "u_val": "var", "var_name": "cell_time" }, "=", { "time": "30 seconds" }, "+", { "rand": 30 } ] + }, + { + "mapgen_update": "portal_cell", + "target_var": { "global_val": "cell_loc" }, + "revert": true, + "time_in_future": { "u_val": "cell_time", "default": "1 minutes" } + }, + { + "mapgen_update": "portal_cell_roof", + "target_var": { "global_val": "cell_roof_loc" }, + "revert": true, + "time_in_future": { "u_val": "cell_time", "default": "1 minutes" } + }, + { "mapgen_update": "portal_cell_roof", "target_var": { "global_val": "cell_roof_loc" } }, + { "mapgen_update": "portal_cell", "target_var": { "global_val": "cell_loc" } }, + { "u_teleport": { "global_val": "cell_start" }, "fail_message": "that sucks" }, + { + "queue_eocs": { + "id": "EOC_PORTAL_STORM_CELL_TELEPORT", + "effect": [ { "u_teleport": { "global_val": "cell_loc" } }, { "u_message": "You came back, this time at least." } ] + }, + "time_in_future": { "u_val": "cell_time", "default": "1 minutes" } + }, + { "u_message": "You are trapped in a warped area." } + ] + }, { "type": "effect_on_condition", "id": "EOC_PORTAL_STORM_MAPGEN", diff --git a/data/json/recipes/ammo/components.json b/data/json/recipes/ammo/components.json index b60aadc296246..f24842a673bf1 100644 --- a/data/json/recipes/ammo/components.json +++ b/data/json/recipes/ammo/components.json @@ -24,7 +24,8 @@ "time": "15 s", "charges": 10, "book_learn": [ [ "pocket_firearms", 3 ], [ "manual_gun", 2 ], [ "recipe_bullets", 1 ], [ "textbook_anarch", 0 ] ], - "tools": [ [ [ "mortar_pestle", -1 ] ], [ [ "sieve_steel", -1 ] ] ], + "qualities": [ { "id": "FINE_GRIND", "level": 1 } ], + "tools": [ [ [ "sieve_steel", -1 ] ] ], "components": [ [ [ "gunpowder_shotgun", 10 ], diff --git a/data/json/recipes/armor/arms.json b/data/json/recipes/armor/arms.json index 341a3cf60bb62..2badc137dbdfa 100644 --- a/data/json/recipes/armor/arms.json +++ b/data/json/recipes/armor/arms.json @@ -482,6 +482,210 @@ "byproducts": [ [ "rag", 3 ], [ "scrap_cotton", 86 ] ], "using": [ [ "armor_chainmail_assembling", 3 ], [ "tailoring_cotton_patchwork", 11 ] ] }, + { + "result": "lc_chainmail_arms", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_ARMS", + "skill_used": "fabrication", + "difficulty": 7, + "skills_required": [ [ "tailor", 2 ] ], + "time": "840 m", + "book_learn": [ [ "textbook_armwest", 6 ], [ "textbook_fabrication", 6 ], [ "recipe_melee", 6 ] ], + "byproducts": [ [ "rag", 1 ], [ "scrap_cotton", 66 ] ], + "using": [ [ "armor_lc_chainmail_assembling", 2 ], [ "tailoring_cotton_patchwork", 8 ] ], + "proficiencies": [ + { "proficiency": "prof_chain_armour", "required": false, "time_multiplier": 3 }, + { "proficiency": "prof_articulation", "required": false, "time_multiplier": 2, "fail_multiplier": 1.15 } + ] + }, + { + "result": "xs_lc_chainmail_arms", + "type": "recipe", + "copy-from": "lc_chainmail_arms", + "time": "840 m", + "byproducts": [ [ "rag", 1 ], [ "scrap_cotton", 49 ] ], + "using": [ [ "armor_lc_chainmail_assembling", 1 ], [ "tailoring_cotton_patchwork", 6 ] ] + }, + { + "result": "xl_lc_chainmail_arms", + "type": "recipe", + "copy-from": "lc_chainmail_arms", + "time": "945 m", + "byproducts": [ [ "rag", 3 ], [ "scrap_cotton", 86 ] ], + "using": [ [ "armor_lc_chainmail_assembling", 3 ], [ "tailoring_cotton_patchwork", 11 ] ] + }, + { + "result": "lc_chainmail_arms", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_ARMS", + "skill_used": "fabrication", + "difficulty": 7, + "skills_required": [ [ "tailor", 2 ] ], + "time": "840 m", + "book_learn": [ [ "textbook_armwest", 6 ], [ "textbook_fabrication", 6 ], [ "recipe_melee", 6 ] ], + "byproducts": [ [ "rag", 1 ], [ "scrap_cotton", 66 ] ], + "using": [ [ "armor_lc_chainmail_assembling", 2 ], [ "tailoring_cotton_patchwork", 8 ] ], + "proficiencies": [ + { "proficiency": "prof_chain_armour", "required": false, "time_multiplier": 3 }, + { "proficiency": "prof_articulation", "required": false, "time_multiplier": 2, "fail_multiplier": 1.15 } + ] + }, + { + "result": "xs_lc_chainmail_arms", + "type": "recipe", + "copy-from": "lc_chainmail_arms", + "time": "840 m", + "byproducts": [ [ "rag", 1 ], [ "scrap_cotton", 49 ] ], + "using": [ [ "armor_lc_chainmail_assembling", 1 ], [ "tailoring_cotton_patchwork", 6 ] ] + }, + { + "result": "xl_lc_chainmail_arms", + "type": "recipe", + "copy-from": "lc_chainmail_arms", + "time": "945 m", + "byproducts": [ [ "rag", 3 ], [ "scrap_cotton", 86 ] ], + "using": [ [ "armor_lc_chainmail_assembling", 3 ], [ "tailoring_cotton_patchwork", 11 ] ] + }, + { + "result": "mc_chainmail_arms", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_ARMS", + "skill_used": "fabrication", + "difficulty": 7, + "skills_required": [ [ "tailor", 2 ] ], + "time": "840 m", + "book_learn": [ [ "textbook_armwest", 6 ], [ "textbook_fabrication", 6 ], [ "recipe_melee", 6 ] ], + "byproducts": [ [ "rag", 1 ], [ "scrap_cotton", 66 ] ], + "using": [ [ "armor_mc_chainmail_assembling", 2 ], [ "tailoring_cotton_patchwork", 8 ] ], + "proficiencies": [ + { "proficiency": "prof_chain_armour", "required": false, "time_multiplier": 3 }, + { "proficiency": "prof_articulation", "required": false, "time_multiplier": 2, "fail_multiplier": 1.15 } + ] + }, + { + "result": "xs_mc_chainmail_arms", + "type": "recipe", + "copy-from": "mc_chainmail_arms", + "time": "840 m", + "byproducts": [ [ "rag", 1 ], [ "scrap_cotton", 49 ] ], + "using": [ [ "armor_mc_chainmail_assembling", 1 ], [ "tailoring_cotton_patchwork", 6 ] ] + }, + { + "result": "xl_mc_chainmail_arms", + "type": "recipe", + "copy-from": "mc_chainmail_arms", + "time": "945 m", + "byproducts": [ [ "rag", 3 ], [ "scrap_cotton", 86 ] ], + "using": [ [ "armor_mc_chainmail_assembling", 3 ], [ "tailoring_cotton_patchwork", 11 ] ] + }, + { + "result": "hc_chainmail_arms", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_ARMS", + "skill_used": "fabrication", + "difficulty": 7, + "skills_required": [ [ "tailor", 2 ] ], + "time": "840 m", + "book_learn": [ [ "textbook_armwest", 6 ], [ "textbook_fabrication", 6 ], [ "recipe_melee", 6 ] ], + "byproducts": [ [ "rag", 1 ], [ "scrap_cotton", 66 ] ], + "using": [ [ "armor_hc_chainmail_assembling", 2 ], [ "tailoring_cotton_patchwork", 8 ] ], + "proficiencies": [ + { "proficiency": "prof_chain_armour", "required": false, "time_multiplier": 3 }, + { "proficiency": "prof_articulation", "required": false, "time_multiplier": 2, "fail_multiplier": 1.15 } + ] + }, + { + "result": "xs_hc_chainmail_arms", + "type": "recipe", + "copy-from": "hc_chainmail_arms", + "time": "840 m", + "byproducts": [ [ "rag", 1 ], [ "scrap_cotton", 49 ] ], + "using": [ [ "armor_hc_chainmail_assembling", 1 ], [ "tailoring_cotton_patchwork", 6 ] ] + }, + { + "result": "xl_hc_chainmail_arms", + "type": "recipe", + "copy-from": "hc_chainmail_arms", + "time": "945 m", + "byproducts": [ [ "rag", 3 ], [ "scrap_cotton", 86 ] ], + "using": [ [ "armor_hc_chainmail_assembling", 3 ], [ "tailoring_cotton_patchwork", 11 ] ] + }, + { + "result": "ch_chainmail_arms", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_ARMS", + "skill_used": "fabrication", + "difficulty": 7, + "skills_required": [ [ "tailor", 2 ] ], + "time": "840 m", + "book_learn": [ [ "textbook_armwest", 6 ], [ "textbook_fabrication", 6 ], [ "recipe_melee", 6 ] ], + "byproducts": [ [ "rag", 1 ], [ "scrap_cotton", 66 ] ], + "using": [ [ "armor_ch_chainmail_assembling", 2 ], [ "tailoring_cotton_patchwork", 8 ] ], + "proficiencies": [ + { "proficiency": "prof_chain_armour", "required": false, "time_multiplier": 3 }, + { "proficiency": "prof_articulation", "required": false, "time_multiplier": 2, "fail_multiplier": 1.15 } + ] + }, + { + "result": "xs_ch_chainmail_arms", + "type": "recipe", + "copy-from": "ch_chainmail_arms", + "time": "840 m", + "byproducts": [ [ "rag", 1 ], [ "scrap_cotton", 49 ] ], + "using": [ [ "armor_ch_chainmail_assembling", 1 ], [ "tailoring_cotton_patchwork", 6 ] ] + }, + { + "result": "xl_ch_chainmail_arms", + "type": "recipe", + "copy-from": "ch_chainmail_arms", + "time": "945 m", + "byproducts": [ [ "rag", 3 ], [ "scrap_cotton", 86 ] ], + "using": [ [ "armor_ch_chainmail_assembling", 3 ], [ "tailoring_cotton_patchwork", 11 ] ] + }, + { + "result": "qt_chainmail_arms", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_ARMS", + "skill_used": "fabrication", + "difficulty": 7, + "skills_required": [ [ "tailor", 2 ] ], + "time": "840 m", + "book_learn": [ [ "textbook_armwest", 6 ], [ "textbook_fabrication", 6 ], [ "recipe_melee", 6 ] ], + "byproducts": [ [ "rag", 1 ], [ "scrap_cotton", 66 ] ], + "using": [ [ "armor_qt_chainmail_assembling", 2 ], [ "tailoring_cotton_patchwork", 8 ] ], + "proficiencies": [ + { "proficiency": "prof_chain_armour", "required": false, "time_multiplier": 3 }, + { "proficiency": "prof_articulation", "required": false, "time_multiplier": 2, "fail_multiplier": 1.15 } + ] + }, + { + "result": "xs_qt_chainmail_arms", + "type": "recipe", + "copy-from": "qt_chainmail_arms", + "time": "840 m", + "byproducts": [ [ "rag", 1 ], [ "scrap_cotton", 49 ] ], + "using": [ [ "armor_qt_chainmail_assembling", 1 ], [ "tailoring_cotton_patchwork", 6 ] ] + }, + { + "result": "xl_qt_chainmail_arms", + "type": "recipe", + "copy-from": "qt_chainmail_arms", + "time": "945 m", + "byproducts": [ [ "rag", 3 ], [ "scrap_cotton", 86 ] ], + "using": [ [ "armor_qt_chainmail_assembling", 3 ], [ "tailoring_cotton_patchwork", 11 ] ] + }, { "result": "gambeson_sleeve", "type": "recipe", diff --git a/data/json/recipes/armor/bespoke_armor/nomad.json b/data/json/recipes/armor/bespoke_armor/nomad.json index 1de4f75a1c513..f578760c5a19d 100644 --- a/data/json/recipes/armor/bespoke_armor/nomad.json +++ b/data/json/recipes/armor/bespoke_armor/nomad.json @@ -146,7 +146,6 @@ "qualities": [ { "id": "LEATHER_AWL", "level": 1 } ], "components": [ [ [ "exodii_wire_kit", 1 ] ], - [ [ "exodii_ac_kit", 1 ] ], [ [ "flashlight", 1 ], [ "heavy_flashlight", 1 ] ], [ [ "plastic_sheet", 2 ] ], [ [ "vest", 1 ], [ "tacvest", 1 ], [ "light_load_bearing_vest", 1 ], [ "load_bearing_vest", 1 ] ], diff --git a/data/json/recipes/armor/feet.json b/data/json/recipes/armor/feet.json index f6930eff72e19..8a1220ab048d5 100644 --- a/data/json/recipes/armor/feet.json +++ b/data/json/recipes/armor/feet.json @@ -1011,6 +1011,141 @@ "time": "5 h", "using": [ [ "armor_chainmail_assembling", 4 ], [ "strap_small", 2 ] ] }, + { + "result": "lc_chainmail_feet", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_FEET", + "skill_used": "fabrication", + "difficulty": 7, + "time": "3 h", + "book_learn": [ [ "textbook_armwest", 6 ], [ "textbook_fabrication", 6 ], [ "recipe_melee", 6 ] ], + "proficiencies": [ { "proficiency": "prof_cobbling" }, { "proficiency": "prof_chain_armour" } ], + "using": [ [ "armor_lc_chainmail_assembling", 2 ], [ "strap_small", 2 ] ] + }, + { + "result": "xs_lc_chainmail_feet", + "type": "recipe", + "copy-from": "lc_chainmail_feet", + "time": "3 h", + "using": [ [ "armor_lc_chainmail_assembling", 1 ], [ "strap_small", 1 ] ] + }, + { + "result": "xl_lc_chainmail_feet", + "type": "recipe", + "copy-from": "lc_chainmail_feet", + "time": "5 h", + "using": [ [ "armor_lc_chainmail_assembling", 4 ], [ "strap_small", 2 ] ] + }, + { + "result": "mc_chainmail_feet", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_FEET", + "skill_used": "fabrication", + "difficulty": 7, + "time": "3 h", + "book_learn": [ [ "textbook_armwest", 6 ], [ "textbook_fabrication", 6 ], [ "recipe_melee", 6 ] ], + "proficiencies": [ { "proficiency": "prof_cobbling" }, { "proficiency": "prof_chain_armour" } ], + "using": [ [ "armor_mc_chainmail_assembling", 2 ], [ "strap_small", 2 ] ] + }, + { + "result": "xs_mc_chainmail_feet", + "type": "recipe", + "copy-from": "mc_chainmail_feet", + "time": "3 h", + "using": [ [ "armor_mc_chainmail_assembling", 1 ], [ "strap_small", 1 ] ] + }, + { + "result": "xl_mc_chainmail_feet", + "type": "recipe", + "copy-from": "mc_chainmail_feet", + "time": "5 h", + "using": [ [ "armor_mc_chainmail_assembling", 4 ], [ "strap_small", 2 ] ] + }, + { + "result": "hc_chainmail_feet", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_FEET", + "skill_used": "fabrication", + "difficulty": 7, + "time": "3 h", + "book_learn": [ [ "textbook_armwest", 6 ], [ "textbook_fabrication", 6 ], [ "recipe_melee", 6 ] ], + "proficiencies": [ { "proficiency": "prof_cobbling" }, { "proficiency": "prof_chain_armour" } ], + "using": [ [ "armor_hc_chainmail_assembling", 2 ], [ "strap_small", 2 ] ] + }, + { + "result": "xs_hc_chainmail_feet", + "type": "recipe", + "copy-from": "hc_chainmail_feet", + "time": "3 h", + "using": [ [ "armor_hc_chainmail_assembling", 1 ], [ "strap_small", 1 ] ] + }, + { + "result": "xl_hc_chainmail_feet", + "type": "recipe", + "copy-from": "hc_chainmail_feet", + "time": "5 h", + "using": [ [ "armor_hc_chainmail_assembling", 4 ], [ "strap_small", 2 ] ] + }, + { + "result": "ch_chainmail_feet", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_FEET", + "skill_used": "fabrication", + "difficulty": 7, + "time": "3 h", + "book_learn": [ [ "textbook_armwest", 6 ], [ "textbook_fabrication", 6 ], [ "recipe_melee", 6 ] ], + "proficiencies": [ { "proficiency": "prof_cobbling" }, { "proficiency": "prof_chain_armour" } ], + "using": [ [ "armor_ch_chainmail_assembling", 2 ], [ "strap_small", 2 ] ] + }, + { + "result": "xs_ch_chainmail_feet", + "type": "recipe", + "copy-from": "ch_chainmail_feet", + "time": "3 h", + "using": [ [ "armor_ch_chainmail_assembling", 1 ], [ "strap_small", 1 ] ] + }, + { + "result": "xl_ch_chainmail_feet", + "type": "recipe", + "copy-from": "ch_chainmail_feet", + "time": "5 h", + "using": [ [ "armor_ch_chainmail_assembling", 4 ], [ "strap_small", 2 ] ] + }, + { + "result": "qt_chainmail_feet", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_FEET", + "skill_used": "fabrication", + "difficulty": 7, + "time": "3 h", + "book_learn": [ [ "textbook_armwest", 6 ], [ "textbook_fabrication", 6 ], [ "recipe_melee", 6 ] ], + "proficiencies": [ { "proficiency": "prof_cobbling" }, { "proficiency": "prof_chain_armour" } ], + "using": [ [ "armor_qt_chainmail_assembling", 2 ], [ "strap_small", 2 ] ] + }, + { + "result": "xs_qt_chainmail_feet", + "type": "recipe", + "copy-from": "qt_chainmail_feet", + "time": "3 h", + "using": [ [ "armor_qt_chainmail_assembling", 1 ], [ "strap_small", 1 ] ] + }, + { + "result": "xl_qt_chainmail_feet", + "type": "recipe", + "copy-from": "qt_chainmail_feet", + "time": "5 h", + "using": [ [ "armor_qt_chainmail_assembling", 4 ], [ "strap_small", 2 ] ] + }, { "result": "roller_blades", "type": "recipe", diff --git a/data/json/recipes/armor/hands.json b/data/json/recipes/armor/hands.json index d9568817f5f24..5f5e68a51afab 100644 --- a/data/json/recipes/armor/hands.json +++ b/data/json/recipes/armor/hands.json @@ -935,6 +935,141 @@ "time": "2 h 15 m", "using": [ [ "armor_chainmail_assembling", 3 ], [ "strap_small", 2 ] ] }, + { + "result": "lc_chainmail_hands", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_HANDS", + "skill_used": "fabrication", + "difficulty": 7, + "time": "2 h", + "book_learn": [ [ "textbook_armwest", 6 ], [ "textbook_fabrication", 6 ], [ "recipe_melee", 6 ] ], + "proficiencies": [ { "proficiency": "prof_chain_armour" } ], + "using": [ [ "armor_lc_chainmail_assembling", 2 ], [ "strap_small", 2 ] ] + }, + { + "result": "xs_lc_chainmail_hands", + "type": "recipe", + "copy-from": "lc_chainmail_hands", + "time": "2 h", + "using": [ [ "armor_lc_chainmail_assembling", 1 ], [ "strap_small", 1 ] ] + }, + { + "result": "xl_lc_chainmail_hands", + "type": "recipe", + "copy-from": "lc_chainmail_hands", + "time": "2 h 15 m", + "using": [ [ "armor_lc_chainmail_assembling", 3 ], [ "strap_small", 2 ] ] + }, + { + "result": "mc_chainmail_hands", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_HANDS", + "skill_used": "fabrication", + "difficulty": 7, + "time": "2 h", + "book_learn": [ [ "textbook_armwest", 6 ], [ "textbook_fabrication", 6 ], [ "recipe_melee", 6 ] ], + "proficiencies": [ { "proficiency": "prof_chain_armour" } ], + "using": [ [ "armor_mc_chainmail_assembling", 2 ], [ "strap_small", 2 ] ] + }, + { + "result": "xs_mc_chainmail_hands", + "type": "recipe", + "copy-from": "mc_chainmail_hands", + "time": "2 h", + "using": [ [ "armor_mc_chainmail_assembling", 1 ], [ "strap_small", 1 ] ] + }, + { + "result": "xl_mc_chainmail_hands", + "type": "recipe", + "copy-from": "mc_chainmail_hands", + "time": "2 h 15 m", + "using": [ [ "armor_mc_chainmail_assembling", 3 ], [ "strap_small", 2 ] ] + }, + { + "result": "hc_chainmail_hands", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_HANDS", + "skill_used": "fabrication", + "difficulty": 7, + "time": "2 h", + "book_learn": [ [ "textbook_armwest", 6 ], [ "textbook_fabrication", 6 ], [ "recipe_melee", 6 ] ], + "proficiencies": [ { "proficiency": "prof_chain_armour" } ], + "using": [ [ "armor_hc_chainmail_assembling", 2 ], [ "strap_small", 2 ] ] + }, + { + "result": "xs_hc_chainmail_hands", + "type": "recipe", + "copy-from": "hc_chainmail_hands", + "time": "2 h", + "using": [ [ "armor_hc_chainmail_assembling", 1 ], [ "strap_small", 1 ] ] + }, + { + "result": "xl_hc_chainmail_hands", + "type": "recipe", + "copy-from": "hc_chainmail_hands", + "time": "2 h 15 m", + "using": [ [ "armor_hc_chainmail_assembling", 3 ], [ "strap_small", 2 ] ] + }, + { + "result": "ch_chainmail_hands", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_HANDS", + "skill_used": "fabrication", + "difficulty": 7, + "time": "2 h", + "book_learn": [ [ "textbook_armwest", 6 ], [ "textbook_fabrication", 6 ], [ "recipe_melee", 6 ] ], + "proficiencies": [ { "proficiency": "prof_chain_armour" } ], + "using": [ [ "armor_ch_chainmail_assembling", 2 ], [ "strap_small", 2 ] ] + }, + { + "result": "xs_ch_chainmail_hands", + "type": "recipe", + "copy-from": "ch_chainmail_hands", + "time": "2 h", + "using": [ [ "armor_ch_chainmail_assembling", 1 ], [ "strap_small", 1 ] ] + }, + { + "result": "xl_ch_chainmail_hands", + "type": "recipe", + "copy-from": "ch_chainmail_hands", + "time": "2 h 15 m", + "using": [ [ "armor_ch_chainmail_assembling", 3 ], [ "strap_small", 2 ] ] + }, + { + "result": "qt_chainmail_hands", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_HANDS", + "skill_used": "fabrication", + "difficulty": 7, + "time": "2 h", + "book_learn": [ [ "textbook_armwest", 6 ], [ "textbook_fabrication", 6 ], [ "recipe_melee", 6 ] ], + "proficiencies": [ { "proficiency": "prof_chain_armour" } ], + "using": [ [ "armor_qt_chainmail_assembling", 2 ], [ "strap_small", 2 ] ] + }, + { + "result": "xs_qt_chainmail_hands", + "type": "recipe", + "copy-from": "qt_chainmail_hands", + "time": "2 h", + "using": [ [ "armor_qt_chainmail_assembling", 1 ], [ "strap_small", 1 ] ] + }, + { + "result": "xl_qt_chainmail_hands", + "type": "recipe", + "copy-from": "qt_chainmail_hands", + "time": "2 h 15 m", + "using": [ [ "armor_qt_chainmail_assembling", 3 ], [ "strap_small", 2 ] ] + }, { "result": "gloves_studded", "type": "recipe", diff --git a/data/json/recipes/armor/head.json b/data/json/recipes/armor/head.json index ff1082b570647..975ebf7bbfd55 100644 --- a/data/json/recipes/armor/head.json +++ b/data/json/recipes/armor/head.json @@ -2269,6 +2269,226 @@ "time": "3 h 20 m", "components": [ [ [ "link_sheet", 2 ] ], [ [ "chain_link", 50 ] ], [ [ "wire", 2 ] ], [ [ "rag", 4 ] ] ] }, + { + "result": "lc_chainmail_hood", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_HEAD", + "skill_used": "fabrication", + "difficulty": 7, + "time": "3 h", + "reversible": true, + "book_learn": [ [ "textbook_armwest", 6 ], [ "textbook_fabrication", 6 ], [ "recipe_melee", 6 ] ], + "using": [ [ "chainmail_standard", 2 ] ], + "components": [ [ [ "lc_link_sheet", 2 ] ], [ [ "lc_chain_link", 50 ] ], [ [ "lc_wire", 1 ] ], [ [ "rag", 4 ] ] ], + "proficiencies": [ { "proficiency": "prof_chain_armour" } ] + }, + { + "result": "xs_lc_chainmail_hood", + "type": "recipe", + "copy-from": "lc_chainmail_hood", + "time": "3 h", + "using": [ [ "chainmail_standard", 1 ] ], + "components": [ [ [ "lc_link_sheet", 2 ] ], [ [ "lc_chain_link", 38 ] ], [ [ "lc_wire", 2 ] ], [ [ "rag", 3 ] ] ] + }, + { + "result": "xl_lc_chainmail_hood", + "type": "recipe", + "copy-from": "lc_chainmail_hood", + "time": "3 h 20 m", + "using": [ [ "chainmail_standard", 4 ] ], + "components": [ [ [ "lc_link_sheet", 3 ] ], [ [ "lc_chain_link", 75 ] ], [ [ "lc_wire", 2 ] ], [ [ "rag", 6 ] ] ] + }, + { + "result": "xl_lc_chainmail_hood", + "type": "recipe", + "copy-from": "lc_chainmail_hood", + "components": [ [ [ "lc_link_sheet", 3 ] ], [ [ "lc_chain_link", 75 ] ], [ [ "lc_wire", 2 ] ], [ [ "rag", 6 ] ] ] + }, + { + "result": "xs_lc_chainmail_hood", + "type": "recipe", + "copy-from": "lc_chainmail_hood", + "time": "3 h 20 m", + "components": [ [ [ "lc_link_sheet", 2 ] ], [ [ "lc_chain_link", 50 ] ], [ [ "lc_wire", 2 ] ], [ [ "rag", 4 ] ] ] + }, + { + "result": "mc_chainmail_hood", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_HEAD", + "skill_used": "fabrication", + "difficulty": 7, + "time": "3 h", + "reversible": true, + "book_learn": [ [ "textbook_armwest", 6 ], [ "textbook_fabrication", 6 ], [ "recipe_melee", 6 ] ], + "using": [ [ "chainmail_standard", 2 ] ], + "components": [ [ [ "mc_link_sheet", 2 ] ], [ [ "mc_chain_link", 50 ] ], [ [ "mc_wire", 1 ] ], [ [ "rag", 4 ] ] ], + "proficiencies": [ { "proficiency": "prof_chain_armour" } ] + }, + { + "result": "xs_mc_chainmail_hood", + "type": "recipe", + "copy-from": "mc_chainmail_hood", + "time": "3 h", + "using": [ [ "chainmail_standard", 1 ] ], + "components": [ [ [ "mc_link_sheet", 2 ] ], [ [ "mc_chain_link", 38 ] ], [ [ "mc_wire", 2 ] ], [ [ "rag", 3 ] ] ] + }, + { + "result": "xl_mc_chainmail_hood", + "type": "recipe", + "copy-from": "mc_chainmail_hood", + "time": "3 h 20 m", + "using": [ [ "chainmail_standard", 4 ] ], + "components": [ [ [ "mc_link_sheet", 3 ] ], [ [ "mc_chain_link", 75 ] ], [ [ "mc_wire", 2 ] ], [ [ "rag", 6 ] ] ] + }, + { + "result": "xl_mc_chainmail_hood", + "type": "recipe", + "copy-from": "mc_chainmail_hood", + "components": [ [ [ "mc_link_sheet", 3 ] ], [ [ "mc_chain_link", 75 ] ], [ [ "mc_wire", 2 ] ], [ [ "rag", 6 ] ] ] + }, + { + "result": "xs_mc_chainmail_hood", + "type": "recipe", + "copy-from": "mc_chainmail_hood", + "time": "3 h 20 m", + "components": [ [ [ "mc_link_sheet", 2 ] ], [ [ "mc_chain_link", 50 ] ], [ [ "mc_wire", 2 ] ], [ [ "rag", 4 ] ] ] + }, + { + "result": "hc_chainmail_hood", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_HEAD", + "skill_used": "fabrication", + "difficulty": 7, + "time": "3 h", + "reversible": true, + "book_learn": [ [ "textbook_armwest", 6 ], [ "textbook_fabrication", 6 ], [ "recipe_melee", 6 ] ], + "using": [ [ "chainmail_standard", 2 ] ], + "components": [ [ [ "hc_link_sheet", 2 ] ], [ [ "hc_chain_link", 50 ] ], [ [ "hc_wire", 1 ] ], [ [ "rag", 4 ] ] ], + "proficiencies": [ { "proficiency": "prof_chain_armour" } ] + }, + { + "result": "xs_hc_chainmail_hood", + "type": "recipe", + "copy-from": "hc_chainmail_hood", + "time": "3 h", + "using": [ [ "chainmail_standard", 1 ] ], + "components": [ [ [ "hc_link_sheet", 2 ] ], [ [ "hc_chain_link", 38 ] ], [ [ "hc_wire", 2 ] ], [ [ "rag", 3 ] ] ] + }, + { + "result": "xl_hc_chainmail_hood", + "type": "recipe", + "copy-from": "hc_chainmail_hood", + "time": "3 h 20 m", + "using": [ [ "chainmail_standard", 4 ] ], + "components": [ [ [ "hc_link_sheet", 3 ] ], [ [ "hc_chain_link", 75 ] ], [ [ "hc_wire", 2 ] ], [ [ "rag", 6 ] ] ] + }, + { + "result": "xl_hc_chainmail_hood", + "type": "recipe", + "copy-from": "hc_chainmail_hood", + "components": [ [ [ "hc_link_sheet", 3 ] ], [ [ "hc_chain_link", 75 ] ], [ [ "hc_wire", 2 ] ], [ [ "rag", 6 ] ] ] + }, + { + "result": "xs_hc_chainmail_hood", + "type": "recipe", + "copy-from": "hc_chainmail_hood", + "time": "3 h 20 m", + "components": [ [ [ "hc_link_sheet", 2 ] ], [ [ "hc_chain_link", 50 ] ], [ [ "hc_wire", 2 ] ], [ [ "rag", 4 ] ] ] + }, + { + "result": "ch_chainmail_hood", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_HEAD", + "skill_used": "fabrication", + "difficulty": 7, + "time": "3 h", + "reversible": true, + "book_learn": [ [ "textbook_armwest", 6 ], [ "textbook_fabrication", 6 ], [ "recipe_melee", 6 ] ], + "using": [ [ "chainmail_standard", 2 ] ], + "components": [ [ [ "ch_link_sheet", 2 ] ], [ [ "ch_chain_link", 50 ] ], [ [ "ch_wire", 1 ] ], [ [ "rag", 4 ] ] ], + "proficiencies": [ { "proficiency": "prof_chain_armour" } ] + }, + { + "result": "xs_ch_chainmail_hood", + "type": "recipe", + "copy-from": "ch_chainmail_hood", + "time": "3 h", + "using": [ [ "chainmail_standard", 1 ] ], + "components": [ [ [ "ch_link_sheet", 2 ] ], [ [ "ch_chain_link", 38 ] ], [ [ "ch_wire", 2 ] ], [ [ "rag", 3 ] ] ] + }, + { + "result": "xl_ch_chainmail_hood", + "type": "recipe", + "copy-from": "ch_chainmail_hood", + "time": "3 h 20 m", + "using": [ [ "chainmail_standard", 4 ] ], + "components": [ [ [ "ch_link_sheet", 3 ] ], [ [ "ch_chain_link", 75 ] ], [ [ "ch_wire", 2 ] ], [ [ "rag", 6 ] ] ] + }, + { + "result": "xl_ch_chainmail_hood", + "type": "recipe", + "copy-from": "ch_chainmail_hood", + "components": [ [ [ "ch_link_sheet", 3 ] ], [ [ "ch_chain_link", 75 ] ], [ [ "ch_wire", 2 ] ], [ [ "rag", 6 ] ] ] + }, + { + "result": "xs_ch_chainmail_hood", + "type": "recipe", + "copy-from": "ch_chainmail_hood", + "time": "3 h 20 m", + "components": [ [ [ "ch_link_sheet", 2 ] ], [ [ "ch_chain_link", 50 ] ], [ [ "ch_wire", 2 ] ], [ [ "rag", 4 ] ] ] + }, + { + "result": "qt_chainmail_hood", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_HEAD", + "skill_used": "fabrication", + "difficulty": 7, + "time": "3 h", + "reversible": true, + "book_learn": [ [ "textbook_armwest", 6 ], [ "textbook_fabrication", 6 ], [ "recipe_melee", 6 ] ], + "using": [ [ "chainmail_standard", 2 ] ], + "components": [ [ [ "qt_link_sheet", 2 ] ], [ [ "qt_chain_link", 50 ] ], [ [ "qt_wire", 1 ] ], [ [ "rag", 4 ] ] ], + "proficiencies": [ { "proficiency": "prof_chain_armour" } ] + }, + { + "result": "xs_qt_chainmail_hood", + "type": "recipe", + "copy-from": "qt_chainmail_hood", + "time": "3 h", + "using": [ [ "chainmail_standard", 1 ] ], + "components": [ [ [ "qt_link_sheet", 2 ] ], [ [ "qt_chain_link", 38 ] ], [ [ "qt_wire", 2 ] ], [ [ "rag", 3 ] ] ] + }, + { + "result": "xl_qt_chainmail_hood", + "type": "recipe", + "copy-from": "qt_chainmail_hood", + "time": "3 h 20 m", + "using": [ [ "chainmail_standard", 4 ] ], + "components": [ [ [ "qt_link_sheet", 3 ] ], [ [ "qt_chain_link", 75 ] ], [ [ "qt_wire", 2 ] ], [ [ "rag", 6 ] ] ] + }, + { + "result": "xl_qt_chainmail_hood", + "type": "recipe", + "copy-from": "qt_chainmail_hood", + "components": [ [ [ "qt_link_sheet", 3 ] ], [ [ "qt_chain_link", 75 ] ], [ [ "qt_wire", 2 ] ], [ [ "rag", 6 ] ] ] + }, + { + "result": "xs_qt_chainmail_hood", + "type": "recipe", + "copy-from": "qt_chainmail_hood", + "time": "3 h 20 m", + "components": [ [ [ "qt_link_sheet", 2 ] ], [ [ "qt_chain_link", 50 ] ], [ [ "qt_wire", 2 ] ], [ [ "rag", 4 ] ] ] + }, { "result": "pot_xlhelmet", "type": "recipe", diff --git a/data/json/recipes/armor/legs.json b/data/json/recipes/armor/legs.json index 4c68fe51cfb73..b3db133f72e7a 100644 --- a/data/json/recipes/armor/legs.json +++ b/data/json/recipes/armor/legs.json @@ -1046,6 +1046,141 @@ "time": "4 h 30 m", "using": [ [ "armor_chainmail_assembling", 6 ], [ "strap_small", 4 ], [ "clasps", 4 ] ] }, + { + "result": "lc_chainmail_legs", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_LEGS", + "skill_used": "fabrication", + "difficulty": 7, + "time": "4 h", + "book_learn": [ [ "textbook_armwest", 6 ], [ "textbook_fabrication", 6 ], [ "recipe_melee", 6 ] ], + "using": [ [ "armor_lc_chainmail_assembling", 4 ], [ "strap_small", 4 ], [ "clasps", 4 ] ], + "proficiencies": [ { "proficiency": "prof_chain_armour" } ] + }, + { + "result": "xs_lc_chainmail_legs", + "type": "recipe", + "copy-from": "lc_chainmail_legs", + "time": "4 h", + "using": [ [ "armor_lc_chainmail_assembling", 3 ], [ "strap_small", 3 ], [ "clasps", 3 ] ] + }, + { + "result": "xl_lc_chainmail_legs", + "type": "recipe", + "copy-from": "lc_chainmail_legs", + "time": "4 h 30 m", + "using": [ [ "armor_lc_chainmail_assembling", 6 ], [ "strap_small", 4 ], [ "clasps", 4 ] ] + }, + { + "result": "mc_chainmail_legs", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_LEGS", + "skill_used": "fabrication", + "difficulty": 7, + "time": "4 h", + "book_learn": [ [ "textbook_armwest", 6 ], [ "textbook_fabrication", 6 ], [ "recipe_melee", 6 ] ], + "using": [ [ "armor_mc_chainmail_assembling", 4 ], [ "strap_small", 4 ], [ "clasps", 4 ] ], + "proficiencies": [ { "proficiency": "prof_chain_armour" } ] + }, + { + "result": "xs_mc_chainmail_legs", + "type": "recipe", + "copy-from": "mc_chainmail_legs", + "time": "4 h", + "using": [ [ "armor_mc_chainmail_assembling", 3 ], [ "strap_small", 3 ], [ "clasps", 3 ] ] + }, + { + "result": "xl_mc_chainmail_legs", + "type": "recipe", + "copy-from": "mc_chainmail_legs", + "time": "4 h 30 m", + "using": [ [ "armor_mc_chainmail_assembling", 6 ], [ "strap_small", 4 ], [ "clasps", 4 ] ] + }, + { + "result": "hc_chainmail_legs", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_LEGS", + "skill_used": "fabrication", + "difficulty": 7, + "time": "4 h", + "book_learn": [ [ "textbook_armwest", 6 ], [ "textbook_fabrication", 6 ], [ "recipe_melee", 6 ] ], + "using": [ [ "armor_hc_chainmail_assembling", 4 ], [ "strap_small", 4 ], [ "clasps", 4 ] ], + "proficiencies": [ { "proficiency": "prof_chain_armour" } ] + }, + { + "result": "xs_hc_chainmail_legs", + "type": "recipe", + "copy-from": "hc_chainmail_legs", + "time": "4 h", + "using": [ [ "armor_hc_chainmail_assembling", 3 ], [ "strap_small", 3 ], [ "clasps", 3 ] ] + }, + { + "result": "xl_hc_chainmail_legs", + "type": "recipe", + "copy-from": "hc_chainmail_legs", + "time": "4 h 30 m", + "using": [ [ "armor_hc_chainmail_assembling", 6 ], [ "strap_small", 4 ], [ "clasps", 4 ] ] + }, + { + "result": "ch_chainmail_legs", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_LEGS", + "skill_used": "fabrication", + "difficulty": 7, + "time": "4 h", + "book_learn": [ [ "textbook_armwest", 6 ], [ "textbook_fabrication", 6 ], [ "recipe_melee", 6 ] ], + "using": [ [ "armor_ch_chainmail_assembling", 4 ], [ "strap_small", 4 ], [ "clasps", 4 ] ], + "proficiencies": [ { "proficiency": "prof_chain_armour" } ] + }, + { + "result": "xs_ch_chainmail_legs", + "type": "recipe", + "copy-from": "ch_chainmail_legs", + "time": "4 h", + "using": [ [ "armor_ch_chainmail_assembling", 3 ], [ "strap_small", 3 ], [ "clasps", 3 ] ] + }, + { + "result": "xl_ch_chainmail_legs", + "type": "recipe", + "copy-from": "ch_chainmail_legs", + "time": "4 h 30 m", + "using": [ [ "armor_ch_chainmail_assembling", 6 ], [ "strap_small", 4 ], [ "clasps", 4 ] ] + }, + { + "result": "qt_chainmail_legs", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_LEGS", + "skill_used": "fabrication", + "difficulty": 7, + "time": "4 h", + "book_learn": [ [ "textbook_armwest", 6 ], [ "textbook_fabrication", 6 ], [ "recipe_melee", 6 ] ], + "using": [ [ "armor_qt_chainmail_assembling", 4 ], [ "strap_small", 4 ], [ "clasps", 4 ] ], + "proficiencies": [ { "proficiency": "prof_chain_armour" } ] + }, + { + "result": "xs_qt_chainmail_legs", + "type": "recipe", + "copy-from": "qt_chainmail_legs", + "time": "4 h", + "using": [ [ "armor_qt_chainmail_assembling", 3 ], [ "strap_small", 3 ], [ "clasps", 3 ] ] + }, + { + "result": "xl_qt_chainmail_legs", + "type": "recipe", + "copy-from": "qt_chainmail_legs", + "time": "4 h 30 m", + "using": [ [ "armor_qt_chainmail_assembling", 6 ], [ "strap_small", 4 ], [ "clasps", 4 ] ] + }, { "result": "legguard_bronze", "type": "recipe", diff --git a/data/json/recipes/armor/pets_dog.json b/data/json/recipes/armor/pets_dog.json index 88935e486176f..e26e018347b77 100644 --- a/data/json/recipes/armor/pets_dog.json +++ b/data/json/recipes/armor/pets_dog.json @@ -38,16 +38,16 @@ "result": "chainmail_harness_dog", "type": "recipe", "activity_level": "LIGHT_EXERCISE", - "copy-from": "chainmail_vest", + "copy-from": "lc_chainmail_vest", "category": "CC_ANIMALS", "subcategory": "CSC_ANIMALS_CANINE ARMOR", "time": "4 h 30 m", "reversible": true, "using": [ [ "chainmail_standard", 5 ], [ "clasps", 3 ] ], "components": [ - [ [ "link_sheet", 5 ] ], - [ [ "chain_link", 131 ] ], - [ [ "wire", 1 ] ], + [ [ "lc_link_sheet", 5 ] ], + [ [ "lc_chain_link", 131 ] ], + [ [ "lc_wire", 1 ] ], [ [ "fur", 6 ], [ "tanned_pelt", 1 ], [ "leather", 6 ], [ "tanned_hide", 1 ] ] ], "proficiencies": [ diff --git a/data/json/recipes/armor/pets_horse.json b/data/json/recipes/armor/pets_horse.json index bd6122a769323..31dbff57ad742 100644 --- a/data/json/recipes/armor/pets_horse.json +++ b/data/json/recipes/armor/pets_horse.json @@ -38,16 +38,16 @@ "result": "chainmail_armor_horse", "type": "recipe", "activity_level": "LIGHT_EXERCISE", - "copy-from": "chainmail_vest", + "copy-from": "lc_chainmail_vest", "category": "CC_ANIMALS", "subcategory": "CSC_ANIMALS_EQUINE ARMOR", "time": "6 h 30 m", "reversible": true, "using": [ [ "chainmail_standard", 7 ], [ "clasps", 4 ] ], "components": [ - [ [ "link_sheet", 35 ] ], - [ [ "chain_link", 917 ] ], - [ [ "wire", 7 ] ], + [ [ "lc_link_sheet", 35 ] ], + [ [ "lc_chain_link", 917 ] ], + [ [ "lc_wire", 7 ] ], [ [ "fur", 42 ], [ "tanned_pelt", 7 ], [ "leather", 42 ], [ "tanned_hide", 7 ] ] ], "proficiencies": [ diff --git a/data/json/recipes/armor/suit.json b/data/json/recipes/armor/suit.json index 4f57901c8076a..c353d087699c4 100644 --- a/data/json/recipes/armor/suit.json +++ b/data/json/recipes/armor/suit.json @@ -512,78 +512,335 @@ "activity_level": "LIGHT_EXERCISE", "category": "CC_ARMOR", "subcategory": "CSC_ARMOR_SUIT", - "skill_used": "tailor", + "skill_used": "fabrication", "difficulty": 2, "time": "1 h 45 m", "reversible": true, "autolearn": true, "flags": [ "NO_RESIZE" ], "proficiencies": [ { "proficiency": "prof_closures" }, { "proficiency": "prof_chain_armour" } ], - "components": [ - [ [ "chainmail_vest", 1 ] ], - [ [ "chainmail_arms", 1 ] ], - [ [ "chainmail_legs", 1 ] ], - [ [ "gambeson", 1 ] ], - [ [ "gambeson_pants", 1 ] ] - ] + "components": [ [ [ "chainmail_vest", 1 ] ], [ [ "chainmail_arms", 1 ] ], [ [ "chainmail_legs", 1 ] ] ] }, { "result": "chainmail_hauberk_xs", "type": "recipe", "copy-from": "chainmail_hauberk", "time": "1 h 45 m", - "components": [ [ [ "chainmail_vest", 1 ] ], [ [ "chainmail_arms", 1 ] ], [ [ "chainmail_legs", 1 ] ], [ [ "gambeson", 1 ] ] ] + "components": [ [ [ "chainmail_vest", 1 ] ], [ [ "chainmail_arms", 1 ] ], [ [ "chainmail_legs", 1 ] ] ] }, { - "result": "kevlar_chainmail_hauberk", + "result": "xl_chainmail_hauberk", "type": "recipe", "copy-from": "chainmail_hauberk", + "time": "1h 45m", + "components": [ [ [ "xl_chainmail_vest", 1 ] ], [ [ "xl_chainmail_arms", 1 ] ], [ [ "xl_chainmail_legs", 1 ] ] ] + }, + { + "result": "lc_chainmail_hauberk", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_SUIT", + "skill_used": "fabrication", + "difficulty": 2, + "time": "1 h 45 m", + "reversible": true, + "autolearn": true, + "flags": [ "NO_RESIZE" ], + "proficiencies": [ { "proficiency": "prof_closures" }, { "proficiency": "prof_chain_armour" } ], + "components": [ [ [ "lc_chainmail_vest", 1 ] ], [ [ "lc_chainmail_arms", 1 ] ], [ [ "lc_chainmail_legs", 1 ] ] ] + }, + { + "result": "lc_chainmail_hauberk_xs", + "type": "recipe", + "copy-from": "lc_chainmail_hauberk", + "time": "1 h 45 m", + "components": [ [ [ "lc_chainmail_vest", 1 ] ], [ [ "lc_chainmail_arms", 1 ] ], [ [ "lc_chainmail_legs", 1 ] ] ] + }, + { + "result": "xl_lc_chainmail_hauberk", + "type": "recipe", + "copy-from": "lc_chainmail_hauberk", + "time": "1h 45m", + "components": [ [ [ "xl_lc_chainmail_vest", 1 ] ], [ [ "xl_lc_chainmail_arms", 1 ] ], [ [ "xl_lc_chainmail_legs", 1 ] ] ] + }, + { + "result": "mc_chainmail_hauberk", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_SUIT", + "skill_used": "fabrication", + "difficulty": 2, + "time": "1 h 45 m", + "reversible": true, + "autolearn": true, + "flags": [ "NO_RESIZE" ], + "proficiencies": [ { "proficiency": "prof_closures" }, { "proficiency": "prof_chain_armour" } ], + "components": [ [ [ "mc_chainmail_vest", 1 ] ], [ [ "mc_chainmail_arms", 1 ] ], [ [ "mc_chainmail_legs", 1 ] ] ] + }, + { + "result": "mc_chainmail_hauberk_xs", + "type": "recipe", + "copy-from": "mc_chainmail_hauberk", + "time": "1 h 45 m", + "components": [ [ [ "mc_chainmail_vest", 1 ] ], [ [ "mc_chainmail_arms", 1 ] ], [ [ "mc_chainmail_legs", 1 ] ] ] + }, + { + "result": "xl_mc_chainmail_hauberk", + "type": "recipe", + "copy-from": "mc_chainmail_hauberk", + "time": "1h 45m", + "components": [ [ [ "xl_mc_chainmail_vest", 1 ] ], [ [ "xl_mc_chainmail_arms", 1 ] ], [ [ "xl_mc_chainmail_legs", 1 ] ] ] + }, + { + "result": "hc_chainmail_hauberk", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_SUIT", + "skill_used": "fabrication", + "difficulty": 2, + "time": "1 h 45 m", + "reversible": true, + "autolearn": true, + "flags": [ "NO_RESIZE" ], + "proficiencies": [ { "proficiency": "prof_closures" }, { "proficiency": "prof_chain_armour" } ], + "components": [ [ [ "hc_chainmail_vest", 1 ] ], [ [ "hc_chainmail_arms", 1 ] ], [ [ "hc_chainmail_legs", 1 ] ] ] + }, + { + "result": "hc_chainmail_hauberk_xs", + "type": "recipe", + "copy-from": "hc_chainmail_hauberk", + "time": "1 h 45 m", + "components": [ [ [ "hc_chainmail_vest", 1 ] ], [ [ "hc_chainmail_arms", 1 ] ], [ [ "hc_chainmail_legs", 1 ] ] ] + }, + { + "result": "xl_hc_chainmail_hauberk", + "type": "recipe", + "copy-from": "hc_chainmail_hauberk", + "time": "1h 45m", + "components": [ [ [ "xl_hc_chainmail_vest", 1 ] ], [ [ "xl_hc_chainmail_arms", 1 ] ], [ [ "xl_hc_chainmail_legs", 1 ] ] ] + }, + { + "result": "ch_chainmail_hauberk", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_SUIT", + "skill_used": "fabrication", + "difficulty": 2, + "time": "1 h 45 m", + "reversible": true, + "autolearn": true, + "flags": [ "NO_RESIZE" ], + "proficiencies": [ { "proficiency": "prof_closures" }, { "proficiency": "prof_chain_armour" } ], + "components": [ [ [ "ch_chainmail_vest", 1 ] ], [ [ "ch_chainmail_arms", 1 ] ], [ [ "ch_chainmail_legs", 1 ] ] ] + }, + { + "result": "ch_chainmail_hauberk_xs", + "type": "recipe", + "copy-from": "ch_chainmail_hauberk", + "time": "1 h 45 m", + "components": [ [ [ "ch_chainmail_vest", 1 ] ], [ [ "ch_chainmail_arms", 1 ] ], [ [ "ch_chainmail_legs", 1 ] ] ] + }, + { + "result": "xl_ch_chainmail_hauberk", + "type": "recipe", + "copy-from": "ch_chainmail_hauberk", + "time": "1h 45m", + "components": [ [ [ "xl_ch_chainmail_vest", 1 ] ], [ [ "xl_ch_chainmail_arms", 1 ] ], [ [ "xl_ch_chainmail_legs", 1 ] ] ] + }, + { + "result": "qt_chainmail_hauberk", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_SUIT", + "skill_used": "fabrication", + "difficulty": 2, + "time": "1 h 45 m", + "reversible": true, + "autolearn": true, + "flags": [ "NO_RESIZE" ], + "proficiencies": [ { "proficiency": "prof_closures" }, { "proficiency": "prof_chain_armour" } ], + "components": [ [ [ "qt_chainmail_vest", 1 ] ], [ [ "qt_chainmail_arms", 1 ] ], [ [ "qt_chainmail_legs", 1 ] ] ] + }, + { + "result": "qt_chainmail_hauberk_xs", + "type": "recipe", + "copy-from": "qt_chainmail_hauberk", + "time": "1 h 45 m", + "components": [ [ [ "qt_chainmail_vest", 1 ] ], [ [ "qt_chainmail_arms", 1 ] ], [ [ "qt_chainmail_legs", 1 ] ] ] + }, + { + "result": "xl_qt_chainmail_hauberk", + "type": "recipe", + "copy-from": "qt_chainmail_hauberk", + "time": "1h 45m", + "components": [ [ [ "xl_qt_chainmail_vest", 1 ] ], [ [ "xl_qt_chainmail_arms", 1 ] ], [ [ "xl_qt_chainmail_legs", 1 ] ] ] + }, + { + "result": "chainmail_suit", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_SUIT", + "skill_used": "fabrication", + "difficulty": 3, + "time": "1 h 50 m", + "reversible": true, + "autolearn": true, + "flags": [ "NO_RESIZE" ], + "proficiencies": [ { "proficiency": "prof_closures" }, { "proficiency": "prof_chain_armour" } ], + "components": [ [ [ "chainmail_hood", 1 ] ], [ [ "chainmail_vest", 1 ] ], [ [ "chainmail_arms", 1 ] ], [ [ "chainmail_legs", 1 ] ] ] + }, + { + "result": "chainmail_suit_xs", + "type": "recipe", + "copy-from": "chainmail_suit", + "time": "1 h 50 m", + "components": [ [ [ "chainmail_hood", 1 ] ], [ [ "chainmail_vest", 1 ] ], [ [ "chainmail_arms", 1 ] ], [ [ "chainmail_legs", 1 ] ] ] + }, + { + "result": "xl_chainmail_suit", + "type": "recipe", + "copy-from": "chainmail_suit", + "time": "1h 50m", "components": [ + [ [ "xl_chainmail_hood", 1 ] ], [ [ "xl_chainmail_vest", 1 ] ], [ [ "xl_chainmail_arms", 1 ] ], - [ [ "xl_chainmail_legs", 1 ] ], - [ [ "xl_k_gambeson", 1 ] ], - [ [ "xl_k_gambeson_pants", 1 ] ] + [ [ "xl_chainmail_legs", 1 ] ] ] }, { - "result": "kevlar_chainmail_hauberk_xs", + "result": "chainmail_suit", "type": "recipe", - "copy-from": "kevlar_chainmail_hauberk", - "components": [ [ [ "chainmail_vest", 1 ] ], [ [ "chainmail_arms", 1 ] ], [ [ "chainmail_legs", 1 ] ], [ [ "k_gambeson", 1 ] ] ] + "activity_level": "LIGHT_EXERCISE", + "id_suffix": "hauberk", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_SUIT", + "skill_used": "fabrication", + "difficulty": 3, + "time": "5 m", + "reversible": true, + "autolearn": true, + "flags": [ "NO_RESIZE" ], + "proficiencies": [ + { "proficiency": "prof_closures", "fail_multiplier": 1 }, + { "proficiency": "prof_chain_armour", "fail_multiplier": 1 } + ], + "components": [ [ [ "chainmail_hood", 1 ] ], [ [ "chainmail_hauberk", 1 ] ] ] }, { - "result": "xl_chainmail_hauberk", + "result": "xl_chainmail_suit", "type": "recipe", - "copy-from": "chainmail_hauberk", - "time": "1h 45m", + "activity_level": "MODERATE_EXERCISE", + "id_suffix": "hauberk", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_SUIT", + "skill_used": "fabrication", + "difficulty": 3, + "time": "5 m", + "reversible": true, + "autolearn": true, + "flags": [ "NO_RESIZE" ], + "proficiencies": [ + { "proficiency": "prof_closures", "fail_multiplier": 1 }, + { "proficiency": "prof_chain_armour", "fail_multiplier": 1 } + ], + "components": [ [ [ "xl_chainmail_hood", 1 ] ], [ [ "xl_chainmail_hauberk", 1 ] ] ] + }, + { + "result": "lc_chainmail_suit", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_SUIT", + "skill_used": "fabrication", + "difficulty": 3, + "time": "1 h 50 m", + "reversible": true, + "autolearn": true, + "flags": [ "NO_RESIZE" ], + "proficiencies": [ { "proficiency": "prof_closures" }, { "proficiency": "prof_chain_armour" } ], "components": [ - [ [ "xl_chainmail_vest", 1 ] ], - [ [ "xl_chainmail_arms", 1 ] ], - [ [ "xl_chainmail_legs", 1 ] ], - [ [ "xl_gambeson", 1 ] ], - [ [ "xl_gambeson_pants", 1 ] ] + [ [ "lc_chainmail_hood", 1 ] ], + [ [ "lc_chainmail_vest", 1 ] ], + [ [ "lc_chainmail_arms", 1 ] ], + [ [ "lc_chainmail_legs", 1 ] ] ] }, { - "result": "xl_kevlar_chainmail_hauberk", + "result": "lc_chainmail_suit_xs", "type": "recipe", - "copy-from": "xl_chainmail_hauberk", + "copy-from": "lc_chainmail_suit", + "time": "1 h 50 m", "components": [ - [ [ "xl_chainmail_vest", 1 ] ], - [ [ "xl_chainmail_arms", 1 ] ], - [ [ "xl_chainmail_legs", 1 ] ], - [ [ "xl_k_gambeson", 1 ] ], - [ [ "xl_k_gambeson_pants", 1 ] ] + [ [ "lc_chainmail_hood", 1 ] ], + [ [ "lc_chainmail_vest", 1 ] ], + [ [ "lc_chainmail_arms", 1 ] ], + [ [ "lc_chainmail_legs", 1 ] ] ] }, { - "result": "chainmail_suit", + "result": "xl_lc_chainmail_suit", + "type": "recipe", + "copy-from": "lc_chainmail_suit", + "time": "1h 50m", + "components": [ + [ [ "xl_lc_chainmail_hood", 1 ] ], + [ [ "xl_lc_chainmail_vest", 1 ] ], + [ [ "xl_lc_chainmail_arms", 1 ] ], + [ [ "xl_lc_chainmail_legs", 1 ] ] + ] + }, + { + "result": "lc_chainmail_suit", "type": "recipe", "activity_level": "LIGHT_EXERCISE", + "id_suffix": "hauberk", "category": "CC_ARMOR", "subcategory": "CSC_ARMOR_SUIT", - "skill_used": "tailor", + "skill_used": "fabrication", + "difficulty": 3, + "time": "5 m", + "reversible": true, + "autolearn": true, + "flags": [ "NO_RESIZE" ], + "proficiencies": [ + { "proficiency": "prof_closures", "fail_multiplier": 1 }, + { "proficiency": "prof_chain_armour", "fail_multiplier": 1 } + ], + "components": [ [ [ "lc_chainmail_hood", 1 ] ], [ [ "lc_chainmail_hauberk", 1 ] ] ] + }, + { + "result": "xl_lc_chainmail_suit", + "type": "recipe", + "activity_level": "MODERATE_EXERCISE", + "id_suffix": "hauberk", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_SUIT", + "skill_used": "fabrication", + "difficulty": 3, + "time": "5 m", + "reversible": true, + "autolearn": true, + "flags": [ "NO_RESIZE" ], + "proficiencies": [ + { "proficiency": "prof_closures", "fail_multiplier": 1 }, + { "proficiency": "prof_chain_armour", "fail_multiplier": 1 } + ], + "components": [ [ [ "xl_lc_chainmail_hood", 1 ] ], [ [ "xl_lc_chainmail_hauberk", 1 ] ] ] + }, + { + "result": "mc_chainmail_suit", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_SUIT", + "skill_used": "fabrication", "difficulty": 3, "time": "1 h 50 m", "reversible": true, @@ -591,87 +848,126 @@ "flags": [ "NO_RESIZE" ], "proficiencies": [ { "proficiency": "prof_closures" }, { "proficiency": "prof_chain_armour" } ], "components": [ - [ [ "chainmail_hood", 1 ] ], - [ [ "chainmail_vest", 1 ] ], - [ [ "chainmail_arms", 1 ] ], - [ [ "chainmail_legs", 1 ] ], - [ [ "gambeson", 1 ] ], - [ [ "gambeson_pants", 1 ] ] + [ [ "mc_chainmail_hood", 1 ] ], + [ [ "mc_chainmail_vest", 1 ] ], + [ [ "mc_chainmail_arms", 1 ] ], + [ [ "mc_chainmail_legs", 1 ] ] ] }, { - "result": "chainmail_suit_xs", + "result": "mc_chainmail_suit_xs", "type": "recipe", - "copy-from": "chainmail_suit", + "copy-from": "mc_chainmail_suit", "time": "1 h 50 m", "components": [ - [ [ "chainmail_hood", 1 ] ], - [ [ "chainmail_vest", 1 ] ], - [ [ "chainmail_arms", 1 ] ], - [ [ "chainmail_legs", 1 ] ], - [ [ "gambeson", 1 ] ] + [ [ "mc_chainmail_hood", 1 ] ], + [ [ "mc_chainmail_vest", 1 ] ], + [ [ "mc_chainmail_arms", 1 ] ], + [ [ "mc_chainmail_legs", 1 ] ] ] }, { - "result": "kevlar_chainmail_suit", + "result": "xl_mc_chainmail_suit", "type": "recipe", - "copy-from": "chainmail_suit", + "copy-from": "mc_chainmail_suit", + "time": "1h 50m", "components": [ - [ [ "chainmail_hood", 1 ] ], - [ [ "chainmail_vest", 1 ] ], - [ [ "chainmail_arms", 1 ] ], - [ [ "chainmail_legs", 1 ] ], - [ [ "k_gambeson", 1 ] ], - [ [ "k_gambeson_pants", 1 ] ] + [ [ "xl_mc_chainmail_hood", 1 ] ], + [ [ "xl_mc_chainmail_vest", 1 ] ], + [ [ "xl_mc_chainmail_arms", 1 ] ], + [ [ "xl_mc_chainmail_legs", 1 ] ] ] }, { - "result": "kevlar_chainmail_suit_xs", + "result": "mc_chainmail_suit", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "id_suffix": "hauberk", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_SUIT", + "skill_used": "fabrication", + "difficulty": 3, + "time": "5 m", + "reversible": true, + "autolearn": true, + "flags": [ "NO_RESIZE" ], + "proficiencies": [ + { "proficiency": "prof_closures", "fail_multiplier": 1 }, + { "proficiency": "prof_chain_armour", "fail_multiplier": 1 } + ], + "components": [ [ [ "mc_chainmail_hood", 1 ] ], [ [ "mc_chainmail_hauberk", 1 ] ] ] + }, + { + "result": "xl_mc_chainmail_suit", + "type": "recipe", + "activity_level": "MODERATE_EXERCISE", + "id_suffix": "hauberk", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_SUIT", + "skill_used": "fabrication", + "difficulty": 3, + "time": "5 m", + "reversible": true, + "autolearn": true, + "flags": [ "NO_RESIZE" ], + "proficiencies": [ + { "proficiency": "prof_closures", "fail_multiplier": 1 }, + { "proficiency": "prof_chain_armour", "fail_multiplier": 1 } + ], + "components": [ [ [ "xl_mc_chainmail_hood", 1 ] ], [ [ "xl_mc_chainmail_hauberk", 1 ] ] ] + }, + { + "result": "hc_chainmail_suit", "type": "recipe", - "copy-from": "kevlar_chainmail_suit", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_SUIT", + "skill_used": "fabrication", + "difficulty": 3, + "time": "1 h 50 m", + "reversible": true, + "autolearn": true, + "flags": [ "NO_RESIZE" ], + "proficiencies": [ { "proficiency": "prof_closures" }, { "proficiency": "prof_chain_armour" } ], "components": [ - [ [ "chainmail_hood", 1 ] ], - [ [ "chainmail_vest", 1 ] ], - [ [ "chainmail_arms", 1 ] ], - [ [ "chainmail_legs", 1 ] ], - [ [ "k_gambeson", 1 ] ] + [ [ "hc_chainmail_hood", 1 ] ], + [ [ "hc_chainmail_vest", 1 ] ], + [ [ "hc_chainmail_arms", 1 ] ], + [ [ "hc_chainmail_legs", 1 ] ] ] }, { - "result": "xl_chainmail_suit", + "result": "hc_chainmail_suit_xs", "type": "recipe", - "copy-from": "chainmail_suit", - "time": "1h 50m", + "copy-from": "hc_chainmail_suit", + "time": "1 h 50 m", "components": [ - [ [ "xl_chainmail_hood", 1 ] ], - [ [ "xl_chainmail_vest", 1 ] ], - [ [ "xl_chainmail_arms", 1 ] ], - [ [ "xl_chainmail_legs", 1 ] ], - [ [ "xl_gambeson", 1 ] ], - [ [ "xl_gambeson_pants", 1 ] ] + [ [ "hc_chainmail_hood", 1 ] ], + [ [ "hc_chainmail_vest", 1 ] ], + [ [ "hc_chainmail_arms", 1 ] ], + [ [ "hc_chainmail_legs", 1 ] ] ] }, { - "result": "xl_kevlar_chainmail_suit", + "result": "xl_hc_chainmail_suit", "type": "recipe", - "copy-from": "chainmail_suit", + "copy-from": "hc_chainmail_suit", + "time": "1h 50m", "components": [ - [ [ "xl_chainmail_hood", 1 ] ], - [ [ "xl_chainmail_vest", 1 ] ], - [ [ "xl_chainmail_arms", 1 ] ], - [ [ "xl_chainmail_legs", 1 ] ], - [ [ "xl_k_gambeson", 1 ] ], - [ [ "xl_k_gambeson_pants", 1 ] ] + [ [ "xl_hc_chainmail_hood", 1 ] ], + [ [ "xl_hc_chainmail_vest", 1 ] ], + [ [ "xl_hc_chainmail_arms", 1 ] ], + [ [ "xl_hc_chainmail_legs", 1 ] ] ] }, { - "result": "chainmail_suit", + "result": "hc_chainmail_suit", "type": "recipe", "activity_level": "LIGHT_EXERCISE", "id_suffix": "hauberk", "category": "CC_ARMOR", "subcategory": "CSC_ARMOR_SUIT", - "skill_used": "tailor", + "skill_used": "fabrication", "difficulty": 3, "time": "5 m", "reversible": true, @@ -681,22 +977,98 @@ { "proficiency": "prof_closures", "fail_multiplier": 1 }, { "proficiency": "prof_chain_armour", "fail_multiplier": 1 } ], - "components": [ [ [ "chainmail_hood", 1 ] ], [ [ "chainmail_hauberk", 1 ] ], [ [ "gambeson", 1 ] ], [ [ "gambeson_pants", 1 ] ] ] + "components": [ [ [ "hc_chainmail_hood", 1 ] ], [ [ "hc_chainmail_hauberk", 1 ] ] ] }, { - "result": "kevlar_chainmail_suit", + "result": "xl_hc_chainmail_suit", "type": "recipe", - "copy-from": "chainmail_suit", - "components": [ [ [ "chainmail_hood", 1 ] ], [ [ "chainmail_hauberk", 1 ] ], [ [ "k_gambeson", 1 ] ], [ [ "k_gambeson_pants", 1 ] ] ] + "activity_level": "MODERATE_EXERCISE", + "id_suffix": "hauberk", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_SUIT", + "skill_used": "fabrication", + "difficulty": 3, + "time": "5 m", + "reversible": true, + "autolearn": true, + "flags": [ "NO_RESIZE" ], + "proficiencies": [ + { "proficiency": "prof_closures", "fail_multiplier": 1 }, + { "proficiency": "prof_chain_armour", "fail_multiplier": 1 } + ], + "components": [ [ [ "xl_hc_chainmail_hood", 1 ] ], [ [ "xl_hc_chainmail_hauberk", 1 ] ] ] }, { - "result": "xl_chainmail_suit", + "result": "ch_chainmail_suit", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_SUIT", + "skill_used": "fabrication", + "difficulty": 3, + "time": "1 h 50 m", + "reversible": true, + "autolearn": true, + "flags": [ "NO_RESIZE" ], + "proficiencies": [ { "proficiency": "prof_closures" }, { "proficiency": "prof_chain_armour" } ], + "components": [ + [ [ "ch_chainmail_hood", 1 ] ], + [ [ "ch_chainmail_vest", 1 ] ], + [ [ "ch_chainmail_arms", 1 ] ], + [ [ "ch_chainmail_legs", 1 ] ] + ] + }, + { + "result": "ch_chainmail_suit_xs", + "type": "recipe", + "copy-from": "ch_chainmail_suit", + "time": "1 h 50 m", + "components": [ + [ [ "ch_chainmail_hood", 1 ] ], + [ [ "ch_chainmail_vest", 1 ] ], + [ [ "ch_chainmail_arms", 1 ] ], + [ [ "ch_chainmail_legs", 1 ] ] + ] + }, + { + "result": "xl_ch_chainmail_suit", + "type": "recipe", + "copy-from": "ch_chainmail_suit", + "time": "1h 50m", + "components": [ + [ [ "xl_ch_chainmail_hood", 1 ] ], + [ [ "xl_ch_chainmail_vest", 1 ] ], + [ [ "xl_ch_chainmail_arms", 1 ] ], + [ [ "xl_ch_chainmail_legs", 1 ] ] + ] + }, + { + "result": "ch_chainmail_suit", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "id_suffix": "hauberk", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_SUIT", + "skill_used": "fabrication", + "difficulty": 3, + "time": "5 m", + "reversible": true, + "autolearn": true, + "flags": [ "NO_RESIZE" ], + "proficiencies": [ + { "proficiency": "prof_closures", "fail_multiplier": 1 }, + { "proficiency": "prof_chain_armour", "fail_multiplier": 1 } + ], + "components": [ [ [ "ch_chainmail_hood", 1 ] ], [ [ "ch_chainmail_hauberk", 1 ] ] ] + }, + { + "result": "xl_ch_chainmail_suit", "type": "recipe", "activity_level": "MODERATE_EXERCISE", "id_suffix": "hauberk", "category": "CC_ARMOR", "subcategory": "CSC_ARMOR_SUIT", - "skill_used": "tailor", + "skill_used": "fabrication", "difficulty": 3, "time": "5 m", "reversible": true, @@ -706,24 +1078,90 @@ { "proficiency": "prof_closures", "fail_multiplier": 1 }, { "proficiency": "prof_chain_armour", "fail_multiplier": 1 } ], + "components": [ [ [ "xl_ch_chainmail_hood", 1 ] ], [ [ "xl_ch_chainmail_hauberk", 1 ] ] ] + }, + { + "result": "qt_chainmail_suit", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_SUIT", + "skill_used": "fabrication", + "difficulty": 3, + "time": "1 h 50 m", + "reversible": true, + "autolearn": true, + "flags": [ "NO_RESIZE" ], + "proficiencies": [ { "proficiency": "prof_closures" }, { "proficiency": "prof_chain_armour" } ], "components": [ - [ [ "xl_chainmail_hood", 1 ] ], - [ [ "xl_chainmail_hauberk", 1 ] ], - [ [ "xl_gambeson", 1 ] ], - [ [ "xl_gambeson_pants", 1 ] ] + [ [ "qt_chainmail_hood", 1 ] ], + [ [ "qt_chainmail_vest", 1 ] ], + [ [ "qt_chainmail_arms", 1 ] ], + [ [ "qt_chainmail_legs", 1 ] ] ] }, { - "result": "xl_kevlar_chainmail_suit", + "result": "qt_chainmail_suit_xs", "type": "recipe", - "copy-from": "chainmail_suit", + "copy-from": "qt_chainmail_suit", + "time": "1 h 50 m", "components": [ - [ [ "xl_chainmail_hood", 1 ] ], - [ [ "xl_chainmail_hauberk", 1 ] ], - [ [ "xl_k_gambeson", 1 ] ], - [ [ "xl_k_gambeson_pants", 1 ] ] + [ [ "qt_chainmail_hood", 1 ] ], + [ [ "qt_chainmail_vest", 1 ] ], + [ [ "qt_chainmail_arms", 1 ] ], + [ [ "qt_chainmail_legs", 1 ] ] + ] + }, + { + "result": "xl_qt_chainmail_suit", + "type": "recipe", + "copy-from": "qt_chainmail_suit", + "time": "1h 50m", + "components": [ + [ [ "xl_qt_chainmail_hood", 1 ] ], + [ [ "xl_qt_chainmail_vest", 1 ] ], + [ [ "xl_qt_chainmail_arms", 1 ] ], + [ [ "xl_qt_chainmail_legs", 1 ] ] ] }, + { + "result": "qt_chainmail_suit", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "id_suffix": "hauberk", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_SUIT", + "skill_used": "fabrication", + "difficulty": 3, + "time": "5 m", + "reversible": true, + "autolearn": true, + "flags": [ "NO_RESIZE" ], + "proficiencies": [ + { "proficiency": "prof_closures", "fail_multiplier": 1 }, + { "proficiency": "prof_chain_armour", "fail_multiplier": 1 } + ], + "components": [ [ [ "qt_chainmail_hood", 1 ] ], [ [ "qt_chainmail_hauberk", 1 ] ] ] + }, + { + "result": "xl_qt_chainmail_suit", + "type": "recipe", + "activity_level": "MODERATE_EXERCISE", + "id_suffix": "hauberk", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_SUIT", + "skill_used": "fabrication", + "difficulty": 3, + "time": "5 m", + "reversible": true, + "autolearn": true, + "flags": [ "NO_RESIZE" ], + "proficiencies": [ + { "proficiency": "prof_closures", "fail_multiplier": 1 }, + { "proficiency": "prof_chain_armour", "fail_multiplier": 1 } + ], + "components": [ [ [ "xl_qt_chainmail_hood", 1 ] ], [ [ "xl_qt_chainmail_hauberk", 1 ] ] ] + }, { "result": "chainmail_suit_faraday", "type": "recipe", diff --git a/data/json/recipes/armor/torso.json b/data/json/recipes/armor/torso.json index 5744fffceab39..3779f150d58cb 100644 --- a/data/json/recipes/armor/torso.json +++ b/data/json/recipes/armor/torso.json @@ -1978,6 +1978,156 @@ "using": [ [ "chainmail_standard", 10 ], [ "fabric_standard_nostretch", 9 ] ], "components": [ [ [ "link_sheet", 10 ] ], [ [ "chain_link", 210 ] ], [ [ "wire", 2 ] ] ] }, + { + "result": "lc_chainmail_vest", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_TORSO", + "skill_used": "fabrication", + "difficulty": 7, + "time": "7 h 10 m", + "book_learn": [ [ "textbook_armwest", 6 ], [ "textbook_fabrication", 6 ], [ "recipe_melee", 6 ] ], + "using": [ [ "chainmail_standard", 7 ], [ "fabric_standard_nostretch", 6 ] ], + "components": [ [ [ "lc_link_sheet", 7 ] ], [ [ "lc_chain_link", 175 ] ], [ [ "lc_wire", 1 ] ] ], + "proficiencies": [ { "proficiency": "prof_closures" }, { "proficiency": "prof_chain_armour" } ] + }, + { + "result": "xs_lc_chainmail_vest", + "type": "recipe", + "copy-from": "lc_chainmail_vest", + "time": "7 h 10 m", + "using": [ [ "chainmail_standard", 5 ], [ "fabric_standard_nostretch", 4 ] ], + "components": [ [ [ "lc_link_sheet", 5 ] ], [ [ "lc_chain_link", 131 ] ], [ [ "lc_wire", 1 ] ] ] + }, + { + "result": "xl_lc_chainmail_vest", + "type": "recipe", + "copy-from": "lc_chainmail_vest", + "time": "8 h 5 m", + "using": [ [ "chainmail_standard", 10 ], [ "fabric_standard_nostretch", 9 ] ], + "components": [ [ [ "lc_link_sheet", 10 ] ], [ [ "lc_chain_link", 210 ] ], [ [ "lc_wire", 2 ] ] ] + }, + { + "result": "mc_chainmail_vest", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_TORSO", + "skill_used": "fabrication", + "difficulty": 7, + "time": "7 h 10 m", + "book_learn": [ [ "textbook_armwest", 6 ], [ "textbook_fabrication", 6 ], [ "recipe_melee", 6 ] ], + "using": [ [ "chainmail_standard", 7 ], [ "fabric_standard_nostretch", 6 ] ], + "components": [ [ [ "mc_link_sheet", 7 ] ], [ [ "mc_chain_link", 175 ] ], [ [ "mc_wire", 1 ] ] ], + "proficiencies": [ { "proficiency": "prof_closures" }, { "proficiency": "prof_chain_armour" } ] + }, + { + "result": "xs_mc_chainmail_vest", + "type": "recipe", + "copy-from": "mc_chainmail_vest", + "time": "7 h 10 m", + "using": [ [ "chainmail_standard", 5 ], [ "fabric_standard_nostretch", 4 ] ], + "components": [ [ [ "mc_link_sheet", 5 ] ], [ [ "mc_chain_link", 131 ] ], [ [ "mc_wire", 1 ] ] ] + }, + { + "result": "xl_mc_chainmail_vest", + "type": "recipe", + "copy-from": "mc_chainmail_vest", + "time": "8 h 5 m", + "using": [ [ "chainmail_standard", 10 ], [ "fabric_standard_nostretch", 9 ] ], + "components": [ [ [ "mc_link_sheet", 10 ] ], [ [ "mc_chain_link", 210 ] ], [ [ "mc_wire", 2 ] ] ] + }, + { + "result": "hc_chainmail_vest", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_TORSO", + "skill_used": "fabrication", + "difficulty": 7, + "time": "7 h 10 m", + "book_learn": [ [ "textbook_armwest", 6 ], [ "textbook_fabrication", 6 ], [ "recipe_melee", 6 ] ], + "using": [ [ "chainmail_standard", 7 ], [ "fabric_standard_nostretch", 6 ] ], + "components": [ [ [ "hc_link_sheet", 7 ] ], [ [ "hc_chain_link", 175 ] ], [ [ "hc_wire", 1 ] ] ], + "proficiencies": [ { "proficiency": "prof_closures" }, { "proficiency": "prof_chain_armour" } ] + }, + { + "result": "xs_hc_chainmail_vest", + "type": "recipe", + "copy-from": "hc_chainmail_vest", + "time": "7 h 10 m", + "using": [ [ "chainmail_standard", 5 ], [ "fabric_standard_nostretch", 4 ] ], + "components": [ [ [ "hc_link_sheet", 5 ] ], [ [ "hc_chain_link", 131 ] ], [ [ "hc_wire", 1 ] ] ] + }, + { + "result": "xl_hc_chainmail_vest", + "type": "recipe", + "copy-from": "hc_chainmail_vest", + "time": "8 h 5 m", + "using": [ [ "chainmail_standard", 10 ], [ "fabric_standard_nostretch", 9 ] ], + "components": [ [ [ "hc_link_sheet", 10 ] ], [ [ "hc_chain_link", 210 ] ], [ [ "hc_wire", 2 ] ] ] + }, + { + "result": "ch_chainmail_vest", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_TORSO", + "skill_used": "fabrication", + "difficulty": 7, + "time": "7 h 10 m", + "book_learn": [ [ "textbook_armwest", 6 ], [ "textbook_fabrication", 6 ], [ "recipe_melee", 6 ] ], + "using": [ [ "chainmail_standard", 7 ], [ "fabric_standard_nostretch", 6 ] ], + "components": [ [ [ "ch_link_sheet", 7 ] ], [ [ "ch_chain_link", 175 ] ], [ [ "ch_wire", 1 ] ] ], + "proficiencies": [ { "proficiency": "prof_closures" }, { "proficiency": "prof_chain_armour" } ] + }, + { + "result": "xs_ch_chainmail_vest", + "type": "recipe", + "copy-from": "ch_chainmail_vest", + "time": "7 h 10 m", + "using": [ [ "chainmail_standard", 5 ], [ "fabric_standard_nostretch", 4 ] ], + "components": [ [ [ "ch_link_sheet", 5 ] ], [ [ "ch_chain_link", 131 ] ], [ [ "ch_wire", 1 ] ] ] + }, + { + "result": "xl_ch_chainmail_vest", + "type": "recipe", + "copy-from": "ch_chainmail_vest", + "time": "8 h 5 m", + "using": [ [ "chainmail_standard", 10 ], [ "fabric_standard_nostretch", 9 ] ], + "components": [ [ [ "ch_link_sheet", 10 ] ], [ [ "ch_chain_link", 210 ] ], [ [ "ch_wire", 2 ] ] ] + }, + { + "result": "qt_chainmail_vest", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_TORSO", + "skill_used": "fabrication", + "difficulty": 7, + "time": "7 h 10 m", + "book_learn": [ [ "textbook_armwest", 6 ], [ "textbook_fabrication", 6 ], [ "recipe_melee", 6 ] ], + "using": [ [ "chainmail_standard", 7 ], [ "fabric_standard_nostretch", 6 ] ], + "components": [ [ [ "qt_link_sheet", 7 ] ], [ [ "qt_chain_link", 175 ] ], [ [ "qt_wire", 1 ] ] ], + "proficiencies": [ { "proficiency": "prof_closures" }, { "proficiency": "prof_chain_armour" } ] + }, + { + "result": "xs_qt_chainmail_vest", + "type": "recipe", + "copy-from": "qt_chainmail_vest", + "time": "7 h 10 m", + "using": [ [ "chainmail_standard", 5 ], [ "fabric_standard_nostretch", 4 ] ], + "components": [ [ [ "qt_link_sheet", 5 ] ], [ [ "qt_chain_link", 131 ] ], [ [ "qt_wire", 1 ] ] ] + }, + { + "result": "xl_qt_chainmail_vest", + "type": "recipe", + "copy-from": "qt_chainmail_vest", + "time": "8 h 5 m", + "using": [ [ "chainmail_standard", 10 ], [ "fabric_standard_nostretch", 9 ] ], + "components": [ [ [ "qt_link_sheet", 10 ] ], [ [ "qt_chain_link", 210 ] ], [ [ "qt_wire", 2 ] ] ] + }, { "result": "armor_cuirass", "type": "recipe", @@ -2479,5 +2629,19 @@ "time": "5 m", "autolearn": true, "components": [ [ [ "heavy_load_bearing_vest", 1 ] ], [ [ "single_sling", 1 ] ] ] + }, + { + "result": "migo_plate", + "type": "recipe", + "activity_level": "BRISK_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_TORSO", + "skill_used": "fabrication", + "difficulty": 1, + "book_learn": [ [ "recipe_migo_plate", 1 ] ], + "time": "10 m", + "qualities": [ { "id": "GRIND", "level": 2 }, { "id": "FILE", "level": 1 } ], + "tools": [ [ [ "water", -10 ] ] ], + "components": [ [ [ "migo_plate_overgrown", 1 ] ] ] } ] diff --git a/data/json/recipes/basecamps/base/recipe_modular_firestation_1/modular_firestation_recipe_groups.json b/data/json/recipes/basecamps/base/recipe_modular_firestation_1/modular_firestation_recipe_groups.json index ca180702f739f..41f0f71d60b7a 100644 --- a/data/json/recipes/basecamps/base/recipe_modular_firestation_1/modular_firestation_recipe_groups.json +++ b/data/json/recipes/basecamps/base/recipe_modular_firestation_1/modular_firestation_recipe_groups.json @@ -88,25 +88,6 @@ { "id": "steel_lump", "description": " Craft: Steel, Lump" } ] }, - { - "type": "recipe_group", - "id": "blacksmith_recipes_2", - "building_type": "SMITH", - "recipes": [ - { "id": "copper_knife", "description": " Craft: Knife, Copper" }, - { "id": "sword_crude", "description": " Craft: Sword, Crude" }, - { "id": "pot_copper", "description": " Craft: Pot, Copper" }, - { "id": "bolt_metal", "description": " Craft: Crossbow Bolt, Steel" }, - { "id": "armor_scrapsuit", "description": " Craft: Armor, Scrap Suit" }, - { "id": "helmet_scrap", "description": " Craft: Armor, Scrap Helmet" }, - { "id": "cuirass_scrap", "description": " Craft: Armor, Scrap Cuirass" }, - { "id": "armguard_scrap", "description": " Craft: Armor, Scrap Arm Guards" }, - { "id": "legguard_scrap", "description": " Craft: Armor, Scrap Leg Guards" }, - { "id": "boots_scrap", "description": " Craft: Armor, Scrap Boots" }, - { "id": "copper_ax", "description": " Craft: Axe, Copper" }, - { "id": "spear_copper", "description": " Craft: Spear, Copper" } - ] - }, { "type": "recipe_group", "id": "fbmc_firestation_blacksmith_recipes_3", diff --git a/data/json/recipes/basecamps/legacy_recipe_groups.json b/data/json/recipes/basecamps/legacy_recipe_groups.json deleted file mode 100644 index 606f5a3b66ab8..0000000000000 --- a/data/json/recipes/basecamps/legacy_recipe_groups.json +++ /dev/null @@ -1,371 +0,0 @@ -[ - { - "type": "recipe_group", - "id": "kitchen_recipes_1", - "building_type": "COOK", - "recipes": [ - { "id": "tinder", "description": " Craft: Tinder" }, - { "id": "meat_cooked", "description": " Cook: Meat, Cooked" }, - { "id": "fish_cooked", "description": " Cook: Fish, Cooked" }, - { "id": "veggy_cooked", "description": " Cook: Veggy, Cooked" }, - { "id": "boiled_egg", "description": " Cook: Egg, Boiled" }, - { "id": "starch", "description": " Cook: Starch" }, - { "id": "starch_from_fibrous_stuff", "description": " Cook: Cattail Starch" }, - { "id": "flatbread", "description": " Cook: Flatbread" }, - { "id": "veggy_wild_cooked", "description": " Cook: Veggy, Cooked Wild" } - ] - }, - { - "type": "recipe_group", - "id": "kitchen_recipes_2", - "building_type": "COOK", - "recipes": [ - { "id": "flour", "description": " Cook: Flour" }, - { "id": "salt", "description": " Cook: Salt" }, - { "id": "bread", "description": " Cook: Bread" }, - { "id": "fruit_leather", "description": " Cook: Fruit Leather" }, - { "id": "jerky", "description": " Cook: Meat Jerky" }, - { "id": "mushroom_cooked", "description": " Cook: Mushroom, Cooked" }, - { "id": "lard", "description": " Cook: Lard" }, - { "id": "cornmeal", "description": " Cook: Cornmeal" }, - { "id": "meat_smoked", "description": " Cook: Meat, Smoked" }, - { "id": "fish_smoked", "description": " Cook: Fish, Smoked" }, - { "id": "dry_mushroom", "description": " Cook: Mushroom, Dried" }, - { "id": "dry_fruit", "description": " Cook: Fruit, Dehydrated" }, - { "id": "sausage", "description": " Cook: Sausage" }, - { "id": "sausage_wasteland", "description": " Cook: Sausage, Wasteland" } - ] - }, - { - "type": "recipe_group", - "id": "kitchen_recipes_3", - "building_type": "COOK", - "recipes": [ - { "id": "pie_meat", "description": " Cook: Meat Pie" }, - { "id": "pie_veggy", "description": " Cook: Veggy Pie" }, - { "id": "sugar", "description": " Cook: Sugar" }, - { "id": "hardtack", "description": " Cook: Hardtack" }, - { "id": "veggy_pickled_jarred", "description": " Cook: Veggy, Pickled" }, - { "id": "cheese_hard", "description": " Cook: Cheese, Hard" }, - { "id": "pemmican", "description": " Cook: Pemmican" }, - { "id": "veggy_aspic", "description": " Cook: Veggy Aspic" }, - { "id": "meat_canned_jarred", "description": " Cook: Meat, Canned" }, - { "id": "meat_aspic", "description": " Cook: Meat Aspic" }, - { "id": "kompot", "description": " Cook: Kompot" } - ] - }, - { - "type": "recipe_group", - "id": "saltworks_recipes_1", - "building_type": "COOK", - "recipes": [ - { "id": "salt_from_salt_water", "description": " Craft: Salt from salt water" }, - { "id": "salted_fish", "description": " Cook: Fish, Salted" } - ] - }, - { - "type": "recipe_group", - "id": "saltworks_recipes_2", - "building_type": "COOK", - "recipes": [ - { "id": "brew_fruit_wine", "description": " Brew: Fruit Wine Must" }, - { "id": "brew_mead", "description": " Brew: Spiced Wine Must" }, - { "id": "brew_dandelion_wine", "description": " Brew: Dandelion Wine Must" }, - { "id": "brew_burdock_wine", "description": " Brew: Burdock Wine Must" }, - { "id": "brew_pine_wine", "description": " Brew: Pine Wine Must" }, - { "id": "brew_hb_beer", "description": " Brew: Beer" } - ] - }, - { - "type": "recipe_group", - "id": "saltworks_recipes_3", - "building_type": "COOK", - "recipes": [ - { "id": "brandy", "description": " Distill: Brandy" }, - { "id": "gin_from_mash", "description": " Distill: Gin" }, - { "id": "vodka_from_wash", "description": " Distill: Vodka" }, - { "id": "rum", "description": " Distill: Rum" } - ] - }, - { - "type": "recipe_group", - "id": "primitive_camp_recipes_1", - "building_type": "BASE", - "recipes": [ - { "id": "tinder", "description": " Craft: Tinder" }, - { "id": "pointy_stick", "description": " Craft: Pointy Sticks" }, - { "id": "wood_panel_from nailed planks", "description": " Craft: Wooden Panel, Nailed Planks" }, - { "id": "wood_panel_from wooden beams", "description": " Craft: Wooden Panel, Wooden Beams" }, - { "id": "wood_beam_from logs", "description": " Craft: Wooden Beam" } - ] - }, - { - "type": "recipe_group", - "id": "farm_recipes_1", - "building_type": "FARM", - "recipes": [ - { "id": "seed_veggy_wild", "description": " Craft: Wild Veggy Stems" }, - { "id": "seed_raw_dandelion", "description": " Craft: Dandelion Seeds" }, - { "id": "seed_potato_raw", "description": " Craft: Potato, Starter" }, - { "id": "seed_buckwheat", "description": " Craft: Buckwheat Seeds" } - ] - }, - { - "type": "recipe_group", - "id": "blacksmith_recipes_1", - "building_type": "SMITH", - "recipes": [ - { "id": "scrap_copper", "description": " Craft: Copper, Scrap" }, - { "id": "charcoal_npc", "description": " Craft: Charcoal" }, - { "id": "spike", "description": " Craft: Spike" }, - { "id": "caltrops_glass", "description": " Craft: Glass Caltrops" }, - { "id": "steel_chunk", "description": " Craft: Steel, Chunk" }, - { "id": "anvil", "description": " Craft: Anvil" }, - { "id": "steel_lump", "description": " Craft: Steel, Lump" } - ] - }, - { - "type": "recipe_group", - "id": "blacksmith_recipes_2", - "building_type": "SMITH", - "recipes": [ - { "id": "copper_knife", "description": " Craft: Knife, Copper" }, - { "id": "sword_crude", "description": " Craft: Sword, Crude" }, - { "id": "pot_copper", "description": " Craft: Pot, Copper" }, - { "id": "bolt_metal", "description": " Craft: Crossbow Bolt, Steel" }, - { "id": "armor_scrapsuit", "description": " Craft: Armor, Scrap Suit" }, - { "id": "helmet_scrap", "description": " Craft: Armor, Scrap Helmet" }, - { "id": "cuirass_scrap", "description": " Craft: Armor, Scrap Cuirass" }, - { "id": "armguard_scrap", "description": " Craft: Armor, Scrap Arm Guards" }, - { "id": "legguard_scrap", "description": " Craft: Armor, Scrap Leg Guards" }, - { "id": "boots_scrap", "description": " Craft: Armor, Scrap Boots" }, - { "id": "copper_ax", "description": " Craft: Axe, Copper" }, - { "id": "spear_copper", "description": " Craft: Spear, Copper" } - ] - }, - { - "type": "recipe_group", - "id": "blacksmith_recipes_3", - "building_type": "SMITH", - "recipes": [ - { "id": "chisel", "description": " Craft: Metalworking Chisel" }, - { "id": "hammer", "description": " Craft: Hammer" }, - { "id": "tongs", "description": " Craft: Metal Tongs" }, - { "id": "nail", "description": " Craft: Nail" }, - { "id": "wire", "description": " Craft: Wire" }, - { "id": "swage", "description": " Craft: Swage and Die Set" } - ] - }, - { - "type": "recipe_group", - "id": "blacksmith_recipes_4", - "building_type": "SMITH", - "recipes": [ - { "id": "blade", "description": " Craft: Blade" }, - { "id": "bearing", "description": " Craft: Bearings" }, - { "id": "caltrops", "description": " Craft: Caltrops" }, - { "id": "hand_drill", "description": " Craft: Hand Drill" }, - { "id": "sheet_metal", "description": " Craft: Sheet Metal" }, - { "id": "chain", "description": " Craft: Chain" }, - { "id": "shovel", "description": " Craft: Shovel" }, - { "id": "rebar", "description": " Craft: Rebar" }, - { "id": "gold_ring", "description": " Craft: Gold Ring" }, - { "id": "hammer_sledge", "description": " Craft: Hammer, Sledge" } - ] - }, - { - "type": "recipe_group", - "id": "blacksmith_recipes_5", - "building_type": "SMITH", - "recipes": [ - { "id": "knife_combat", "description": " Craft: Knife, Combat" }, - { "id": "spear_steel", "description": " Craft: Spear, Steel" }, - { "id": "machete", "description": " Craft: Machete" }, - { "id": "pipe", "description": " Craft: Pipe" }, - { "id": "screwdriver", "description": " Craft: Screwdriver" }, - { "id": "throwing_axe", "description": " Craft: Axe, Throwing" }, - { "id": "wrench", "description": " Craft: Wrench" }, - { "id": "hatchet", "description": " Craft: Hatchet" }, - { "id": "throwing_knife", "description": " Craft: Knife, Throwing" }, - { "id": "crowbar", "description": " Craft: Crowbar" }, - { "id": "pot", "description": " Craft: Pot" }, - { "id": "hoe", "description": " Craft: Hoe" } - ] - }, - { - "type": "recipe_group", - "id": "blacksmith_recipes_6", - "building_type": "SMITH", - "recipes": [ - { "id": "pliers", "description": " Craft: Pliers" }, - { "id": "halberd", "description": " Craft: Halberd" }, - { "id": "cuirass_lightplate", "description": " Craft: Armor, Cuirass" }, - { "id": "pockknife", "description": " Craft: Knife, Pocket" }, - { "id": "warhammer", "description": " Craft: Hammer, War" }, - { "id": "helmet_plate", "description": " Craft: Helm, Great" }, - { "id": "armor_ch_heavy_chestplate", "description": " Craft: Armor, Hardened Heavy Chestplate" }, - { "id": "armor_ch_light_chestplate", "description": " Craft: Armor, Hardened Light Chestplate" }, - { "id": "armor_ch_heavy_leg_guard", "description": " Craft: Armor, Hardened Heavy Leg Guard" }, - { "id": "armor_ch_light_leg_guard", "description": " Craft: Armor, Hardened Light Leg Guard" }, - { "id": "armor_ch_armguard", "description": " Craft: Armor, Hardened Armguard" }, - { "id": "armor_ch_heavyarmguard", "description": " Craft: Armor, Hardened Heavy Armguard" }, - { "id": "armor_ch_lightarmguard", "description": " Craft: Armor, Hardened Light Armguard" }, - { "id": "armor_ch_chestplate", "description": " Craft: Armor, Hardened Chestplate" }, - { "id": "armor_ch_leg_guard", "description": " Craft: Armor, Hardened Leg Guard" }, - { "id": "armor_ch_heavyplate", "description": " Craft: Armor, Hardened Heavy Plate" }, - { "id": "armor_ch_lightplate", "description": " Craft: Armor, Hardened Light Plate" }, - { "id": "armor_ch_plate", "description": " Craft: Armor, Hardened Plate" }, - { "id": "armor_hc_heavy_chestplate", "description": " Craft: Armor, High Steel Heavy Chestplate" }, - { "id": "armor_hc_light_chestplate", "description": " Craft: Armor, High Steel Light Chestplate" }, - { "id": "armor_hc_heavy_leg_guard", "description": " Craft: Armor, High Steel Heavy Leg Guard" }, - { "id": "armor_hc_light_leg_guard", "description": " Craft: Armor, High Steel Light Leg Guard" }, - { "id": "armor_hc_armguard", "description": " Craft: Armor, High Steel Armguard" }, - { "id": "armor_hc_heavyarmguard", "description": " Craft: Armor, High Steel Heavy Armguard" }, - { "id": "armor_hc_lightarmguard", "description": " Craft: Armor, High Steel Light Armguard" }, - { "id": "armor_hc_chestplate", "description": " Craft: Armor, High Steel Chestplate" }, - { "id": "armor_hc_leg_guard", "description": " Craft: Armor, High Steel Leg Guard" }, - { "id": "armor_hc_heavyplate", "description": " Craft: Armor, High Steel Heavy Plate" }, - { "id": "armor_hc_lightplate", "description": " Craft: Armor, High Steel Light Plate" }, - { "id": "armor_hc_plate", "description": " Craft: Armor, High Steel Plate" }, - { "id": "armor_lc_heavy_chestplate", "description": " Craft: Armor, Mild Steel Heavy Chestplate" }, - { "id": "armor_lc_light_chestplate", "description": " Craft: Armor, Mild Steel Light Chestplate" }, - { "id": "armor_lc_heavy_leg_guard", "description": " Craft: Armor, Mild Steel Heavy Leg Guard" }, - { "id": "armor_lc_light_leg_guard", "description": " Craft: Armor, Mild Steel Light Leg Guard" }, - { "id": "armor_lc_armguard", "description": " Craft: Armor, Mild Steel Armguard" }, - { "id": "armor_lc_heavyarmguard", "description": " Craft: Armor, Mild Steel Heavy Armguard" }, - { "id": "armor_lc_lightarmguard", "description": " Craft: Armor, Mild Steel Light Armguard" }, - { "id": "armor_lc_chestplate", "description": " Craft: Armor, Mild Steel Chestplate" }, - { "id": "armor_lc_leg_guard", "description": " Craft: Armor, Mild Steel Leg Guard" }, - { "id": "armor_lc_heavyplate", "description": " Craft: Armor, Mild Steel Heavy Plate" }, - { "id": "armor_lc_lightplate", "description": " Craft: Armor, Mild Steel Light Plate" }, - { "id": "armor_lc_plate", "description": " Craft: Armor, Mild Steel Plate" }, - { "id": "armor_mc_heavy_chestplate", "description": " Craft: Armor, Medium Steel Heavy Chestplate" }, - { "id": "armor_mc_light_chestplate", "description": " Craft: Armor, Medium Steel Light Chestplate" }, - { "id": "armor_mc_heavy_leg_guard", "description": " Craft: Armor, Medium Steel Heavy Leg Guard" }, - { "id": "armor_mc_light_leg_guard", "description": " Craft: Armor, Medium Steel Light Leg Guard" }, - { "id": "armor_mc_armguard", "description": " Craft: Armor, Medium Steel Armguard" }, - { "id": "armor_mc_heavyarmguard", "description": " Craft: Armor, Medium Steel Heavy Armguard" }, - { "id": "armor_mc_lightarmguard", "description": " Craft: Armor, Medium Steel Light Armguard" }, - { "id": "armor_mc_chestplate", "description": " Craft: Armor, Medium Steel Chestplate" }, - { "id": "armor_mc_leg_guard", "description": " Craft: Armor, Medium Steel Leg Guard" }, - { "id": "armor_mc_heavyplate", "description": " Craft: Armor, Medium Steel Heavy Plate" }, - { "id": "armor_mc_lightplate", "description": " Craft: Armor, Medium Steel Light Plate" }, - { "id": "armor_mc_plate", "description": " Craft: Armor, Medium Steel Plate" }, - { "id": "armor_qt_heavy_chestplate", "description": " Craft: Armor, Tempered Heavy Chestplate" }, - { "id": "armor_qt_light_chestplate", "description": " Craft: Armor, Tempered Light Chestplate" }, - { "id": "armor_qt_heavy_leg_guard", "description": " Craft: Armor, Tempered Heavy Leg Guard" }, - { "id": "armor_qt_light_leg_guard", "description": " Craft: Armor, Tempered Light Leg Guard" }, - { "id": "armor_qt_armguard", "description": " Craft: Armor, Tempered Armguard" }, - { "id": "armor_qt_heavyarmguard", "description": " Craft: Armor, Tempered Heavy Armguard" }, - { "id": "armor_qt_lightarmguard", "description": " Craft: Armor, Tempered Light Armguard" }, - { "id": "armor_qt_chestplate", "description": " Craft: Armor, Tempered Chestplate" }, - { "id": "armor_qt_leg_guard", "description": " Craft: Armor, Tempered Leg Guard" }, - { "id": "armor_qt_heavyplate", "description": " Craft: Armor, Tempered Heavy Plate" }, - { "id": "armor_qt_lightplate", "description": " Craft: Armor, Tempered Light Plate" }, - { "id": "armor_qt_plate", "description": " Craft: Armor, Tempered Plate" }, - { "id": "ch_demi_gaunt", "description": " Craft: Armor, Hardened Demi Gauntlet" }, - { "id": "ch_helm_close", "description": " Craft: Armor, Hardened Close Helm" }, - { "id": "ch_mitten_gaunt", "description": " Craft: Armor, Hardened Mitten Gauntlet" }, - { "id": "ch_sabaton", "description": " Craft: Armor, Hardened Sabaton" }, - { "id": "hc_demi_gaunt", "description": " Craft: Armor, High Steel Demi Gauntlet" }, - { "id": "hc_helm_close", "description": " Craft: Armor, High Steel Close Helm" }, - { "id": "hc_mitten_gaunt", "description": " Craft: Armor, High Steel Mitten Gauntlet" }, - { "id": "hc_sabaton", "description": " Craft: Armor, High Steel Sabaton" }, - { "id": "lc_demi_gaunt", "description": " Craft: Armor, Mild Steel Demi Gauntlet" }, - { "id": "lc_helm_close", "description": " Craft: Armor, Mild Steel Close Helm" }, - { "id": "lc_mitten_gaunt", "description": " Craft: Armor, Mild Steel Mitten Gauntlet" }, - { "id": "lc_sabaton", "description": " Craft: Armor, Mild Steel Sabaton" }, - { "id": "mc_demi_gaunt", "description": " Craft: Armor, Medium Steel Demi Gauntlet" }, - { "id": "mc_helm_close", "description": " Craft: Armor, Medium Steel Close Helm" }, - { "id": "mc_mitten_gaunt", "description": " Craft: Armor, Medium Steel Mitten Gauntlet" }, - { "id": "mc_sabaton", "description": " Craft: Armor, Medium Steel Sabaton" }, - { "id": "qt_demi_gaunt", "description": " Craft: Armor, Tempered Demi Gauntlet" }, - { "id": "qt_helm_close", "description": " Craft: Armor, Tempered Close Helm" }, - { "id": "qt_mitten_gaunt", "description": " Craft: Armor, Tempered Mitten Gauntlet" }, - { "id": "qt_sabaton", "description": " Craft: Armor, Tempered Sabaton" }, - { "id": "xl_armor_ch_heavy_chestplate", "description": " Craft: Armor, XL Hardened Heavy Chestplate" }, - { "id": "xl_armor_ch_light_chestplate", "description": " Craft: Armor, XL Hardened Light Chestplate" }, - { "id": "xl_armor_ch_heavy_leg_guard", "description": " Craft: Armor, XL Hardened Heavy Leg Guard" }, - { "id": "xl_armor_ch_light_leg_guard", "description": " Craft: Armor, XL Hardened Light Leg Guard" }, - { "id": "xl_armor_ch_armguard", "description": " Craft: Armor, XL Hardened Armguard" }, - { "id": "xl_armor_ch_heavyarmguard", "description": " Craft: Armor, XL Hardened Heavy Armguard" }, - { "id": "xl_armor_ch_lightarmguard", "description": " Craft: Armor, XL Hardened Light Armguard" }, - { "id": "xl_armor_ch_chestplate", "description": " Craft: Armor, XL Hardened Chestplate" }, - { "id": "xl_armor_ch_leg_guard", "description": " Craft: Armor, XL Hardened Leg Guard" }, - { "id": "xl_armor_ch_heavyplate", "description": " Craft: Armor, XL Hardened Heavy Plate" }, - { "id": "xl_armor_ch_lightplate", "description": " Craft: Armor, XL Hardened Light Plate" }, - { "id": "xl_armor_ch_plate", "description": " Craft: Armor, XL Hardened Plate" }, - { "id": "xl_armor_hc_heavy_chestplate", "description": " Craft: Armor, XL High Steel Heavy Chestplate" }, - { "id": "xl_armor_hc_light_chestplate", "description": " Craft: Armor, XL High Steel Light Chestplate" }, - { "id": "xl_armor_hc_heavy_leg_guard", "description": " Craft: Armor, XL High Steel Heavy Leg Guard" }, - { "id": "xl_armor_hc_light_leg_guard", "description": " Craft: Armor, XL High Steel Light Leg Guard" }, - { "id": "xl_armor_hc_armguard", "description": " Craft: Armor, XL High Steel Armguard" }, - { "id": "xl_armor_hc_heavyarmguard", "description": " Craft: Armor, XL High Steel Heavy Armguard" }, - { "id": "xl_armor_hc_lightarmguard", "description": " Craft: Armor, XL High Steel Light Armguard" }, - { "id": "xl_armor_hc_chestplate", "description": " Craft: Armor, XL High Steel Chestplate" }, - { "id": "xl_armor_hc_leg_guard", "description": " Craft: Armor, XL High Steel Leg Guard" }, - { "id": "xl_armor_hc_heavyplate", "description": " Craft: Armor, XL High Steel Heavy Plate" }, - { "id": "xl_armor_hc_lightplate", "description": " Craft: Armor, XL High Steel Light Plate" }, - { "id": "xl_armor_hc_plate", "description": " Craft: Armor, XL High Steel Plate" }, - { "id": "xl_armor_lc_heavy_chestplate", "description": " Craft: Armor, XL Mild Steel Heavy Chestplate" }, - { "id": "xl_armor_lc_light_chestplate", "description": " Craft: Armor, XL Mild Steel Light Chestplate" }, - { "id": "xl_armor_lc_heavy_leg_guard", "description": " Craft: Armor, XL Mild Steel Heavy Leg Guard" }, - { "id": "xl_armor_lc_light_leg_guard", "description": " Craft: Armor, XL Mild Steel Light Leg Guard" }, - { "id": "xl_armor_lc_armguard", "description": " Craft: Armor, XL Mild Steel Armguard" }, - { "id": "xl_armor_lc_heavyarmguard", "description": " Craft: Armor, XL Mild Steel Heavy Armguard" }, - { "id": "xl_armor_lc_lightarmguard", "description": " Craft: Armor, XL Mild Steel Light Armguard" }, - { "id": "xl_armor_lc_chestplate", "description": " Craft: Armor, XL Mild Steel Chestplate" }, - { "id": "xl_armor_lc_leg_guard", "description": " Craft: Armor, XL Mild Steel Leg Guard" }, - { "id": "xl_armor_lc_heavyplate", "description": " Craft: Armor, XL Mild Steel Heavy Plate" }, - { "id": "xl_armor_lc_lightplate", "description": " Craft: Armor, XL Mild Steel Light Plate" }, - { "id": "xl_armor_lc_plate", "description": " Craft: Armor, XL Mild Steel Plate" }, - { "id": "xl_armor_mc_heavy_chestplate", "description": " Craft: Armor, XL Medium Steel Heavy Chestplate" }, - { "id": "xl_armor_mc_light_chestplate", "description": " Craft: Armor, XL Medium Steel Light Chestplate" }, - { "id": "xl_armor_mc_heavy_leg_guard", "description": " Craft: Armor, XL Medium Steel Heavy Leg Guard" }, - { "id": "xl_armor_mc_light_leg_guard", "description": " Craft: Armor, XL Medium Steel Light Leg Guard" }, - { "id": "xl_armor_mc_armguard", "description": " Craft: Armor, XL Medium Steel Armguard" }, - { "id": "xl_armor_mc_heavyarmguard", "description": " Craft: Armor, XL Medium Steel Heavy Armguard" }, - { "id": "xl_armor_mc_lightarmguard", "description": " Craft: Armor, XL Medium Steel Light Armguard" }, - { "id": "xl_armor_mc_chestplate", "description": " Craft: Armor, XL Medium Steel Chestplate" }, - { "id": "xl_armor_mc_leg_guard", "description": " Craft: Armor, XL Medium Steel Leg Guard" }, - { "id": "xl_armor_mc_heavyplate", "description": " Craft: Armor, XL Medium Steel Heavy Plate" }, - { "id": "xl_armor_mc_lightplate", "description": " Craft: Armor, XL Medium Steel Light Plate" }, - { "id": "xl_armor_mc_plate", "description": " Craft: Armor, XL Medium Steel Plate" }, - { "id": "xl_armor_qt_heavy_chestplate", "description": " Craft: Armor, XL Tempered Heavy Chestplate" }, - { "id": "xl_armor_qt_light_chestplate", "description": " Craft: Armor, XL Tempered Light Chestplate" }, - { "id": "xl_armor_qt_heavy_leg_guard", "description": " Craft: Armor, XL Tempered Heavy Leg Guard" }, - { "id": "xl_armor_qt_light_leg_guard", "description": " Craft: Armor, XL Tempered Light Leg Guard" }, - { "id": "xl_armor_qt_armguard", "description": " Craft: Armor, XL Tempered Armguard" }, - { "id": "xl_armor_qt_heavyarmguard", "description": " Craft: Armor, XL Tempered Heavy Armguard" }, - { "id": "xl_armor_qt_lightarmguard", "description": " Craft: Armor, XL Tempered Light Armguard" }, - { "id": "xl_armor_qt_chestplate", "description": " Craft: Armor, XL Tempered Chestplate" }, - { "id": "xl_armor_qt_leg_guard", "description": " Craft: Armor, XL Tempered Leg Guard" }, - { "id": "xl_armor_qt_heavyplate", "description": " Craft: Armor, XL Tempered Heavy Plate" }, - { "id": "xl_armor_qt_lightplate", "description": " Craft: Armor, XL Tempered Light Plate" }, - { "id": "xl_armor_qt_plate", "description": " Craft: Armor, XL Tempered Plate" }, - { "id": "broadsword", "description": " Craft: Sword, Broadsword" }, - { "id": "scimitar", "description": " Craft: Sword, Scimitar" }, - { "id": "fire_ax", "description": " Craft: Axe, Fire" }, - { "id": "hacksaw", "description": " Craft: Hacksaw" }, - { "id": "saw", "description": " Craft: Woodsaw" }, - { "id": "pike", "description": " Craft: Spear, Awl Pike" }, - { "id": "rapier", "description": " Craft: Sword, Rapier" }, - { "id": "halligan", "description": " Craft: Halligan Bar" }, - { "id": "zweihander", "description": " Craft: Sword, Zweihander" }, - { "id": "pickaxe", "description": " Craft: Pickaxe" } - ] - }, - { - "type": "recipe_group", - "id": "blacksmith_recipes_7", - "building_type": "SMITH", - "recipes": [ - { "id": "sheet_metal_npc_drop", "description": " Craft: Sheet Metal, Drop Hammer" }, - { "id": "chain_npc_drop", "description": " Craft: Chain, Drop Hammer" }, - { "id": "nail_npc_drop", "description": " Craft: Nail, Drop Hammer" }, - { "id": "wire_npc_drop", "description": " Craft: Wire, Drop Hammer" }, - { "id": "pipe_npc_drop", "description": " Craft: Pipe, Drop Hammer" }, - { "id": "rebar_npc_drop", "description": " Craft: Rebar, Drop Hammer" } - ] - } -] diff --git a/data/json/recipes/food/dry.json b/data/json/recipes/food/dry.json index 7d18e8d7061fb..c6e2ddf3623f5 100644 --- a/data/json/recipes/food/dry.json +++ b/data/json/recipes/food/dry.json @@ -376,8 +376,8 @@ "time": "12 m", "batch_time_factors": [ 83, 3 ], "autolearn": true, - "qualities": [ { "id": "CHEM", "level": 2 } ], - "tools": [ [ [ "mortar_pestle", -1 ] ], [ [ "surface_heat", 25, "LIST" ] ] ], + "qualities": [ { "id": "CHEM", "level": 2 }, { "id": "FINE_GRIND", "level": 1 } ], + "tools": [ [ [ "surface_heat", 25, "LIST" ] ] ], "components": [ [ [ "dry_meat", 1 ], [ "dry_fish", 3 ] ] ] }, { diff --git a/data/json/recipes/food/offal_dishes.json b/data/json/recipes/food/offal_dishes.json index 3d584fa6c9eac..5c1eed9f0b81a 100644 --- a/data/json/recipes/food/offal_dishes.json +++ b/data/json/recipes/food/offal_dishes.json @@ -482,7 +482,17 @@ "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 1 } ], "tools": [ [ [ "funnel", -1 ], [ "makeshift_funnel", -1 ] ] ], "components": [ - [ [ "meat_nofish", 2, "LIST" ] ], + [ + [ "meat_nofish", 2, "LIST" ], + [ "bacon", 8 ], + [ "bologna", 10 ], + [ "meat_pickled", 2 ], + [ "dry_meat", 2 ], + [ "jerky", 2 ], + [ "meat_smoked", 2 ], + [ "meat_salted", 2 ], + [ "meat_fried", 2 ] + ], [ [ "sausage_casings", 6 ], [ "sausage_casings_artificial", 6 ] ], [ [ "salt_water", 4 ], diff --git a/data/json/recipes/other/materials.json b/data/json/recipes/other/materials.json index 74ea50aa015dc..7d497bd4cbfda 100644 --- a/data/json/recipes/other/materials.json +++ b/data/json/recipes/other/materials.json @@ -175,8 +175,7 @@ "charges": 1562, "time": "5 m", "autolearn": true, - "tools": [ [ [ "mortar_pestle", -1 ] ] ], - "qualities": [ { "id": "HAMMER", "level": 1 } ], + "qualities": [ { "id": "HAMMER", "level": 1 }, { "id": "FINE_GRIND", "level": 1 } ], "components": [ [ [ "chunk_sulfur", 1 ] ] ] }, { diff --git a/data/json/recipes/other/medical.json b/data/json/recipes/other/medical.json index b350c3494a7c9..615fb0648e0f4 100644 --- a/data/json/recipes/other/medical.json +++ b/data/json/recipes/other/medical.json @@ -249,8 +249,7 @@ "difficulty": 4, "time": "1 m 12 s", "autolearn": true, - "qualities": [ { "id": "CHEM", "level": 1 } ], - "tools": [ [ [ "mortar_pestle", -1 ] ] ], + "qualities": [ { "id": "CHEM", "level": 1 }, { "id": "FINE_GRIND", "level": 1 } ], "components": [ [ [ "alder_bark", 6 ] ], [ [ "lye", 5 ] ], [ [ "water_clean", 10 ] ] ] }, { diff --git a/data/json/recipes/other/power_supplies.json b/data/json/recipes/other/power_supplies.json index 07df9b068015d..b526f103922f2 100644 --- a/data/json/recipes/other/power_supplies.json +++ b/data/json/recipes/other/power_supplies.json @@ -733,13 +733,8 @@ "skills_required": [ "chemistry", 2 ], "time": "20 m", "autolearn": true, - "tools": [ - [ [ "mortar_pestle", -1 ] ], - [ [ "tongs", -1 ] ], - [ [ "surface_heat", 10, "LIST" ] ], - [ [ "paper", -1 ], [ "aluminum_foil", -1 ] ] - ], - "qualities": [ { "id": "BOIL", "level": 2 }, { "id": "CONTAIN", "level": 1 } ], + "tools": [ [ [ "tongs", -1 ] ], [ [ "surface_heat", 10, "LIST" ] ], [ [ "paper", -1 ], [ "aluminum_foil", -1 ] ] ], + "qualities": [ { "id": "BOIL", "level": 2 }, { "id": "CONTAIN", "level": 1 }, { "id": "FINE_GRIND", "level": 1 } ], "components": [ [ [ "water_clean", 1 ] ], [ [ "sugar", 2 ] ], [ [ "charcoal", 3 ] ] ] }, { @@ -753,8 +748,7 @@ "difficulty": 2, "time": "10 m", "autolearn": true, - "tools": [ [ [ "mortar_pestle", -1 ] ] ], - "qualities": [ { "id": "CONTAIN", "level": 1 } ], + "qualities": [ { "id": "CONTAIN", "level": 1 }, { "id": "FINE_GRIND", "level": 1 } ], "components": [ [ [ "chem_muriatic_acid", 1 ] ], [ [ "chem_zinc_powder", 200 ] ], [ [ "chem_manganese_dioxide", 262 ] ] ] } ] diff --git a/data/json/recipes/recipe_deconstruction.json b/data/json/recipes/recipe_deconstruction.json index e16c58a3ad782..0c8087b8dedd7 100644 --- a/data/json/recipes/recipe_deconstruction.json +++ b/data/json/recipes/recipe_deconstruction.json @@ -402,6 +402,14 @@ "qualities": [ { "id": "CUT", "level": 2 } ], "components": [ [ [ "leather", 1 ] ] ] }, + { + "result": "jacket_leather", + "type": "uncraft", + "time": "10 m", + "activity_level": "LIGHT_EXERCISE", + "qualities": [ { "id": "CUT", "level": 2 } ], + "components": [ [ [ "leather", 18 ] ], [ [ "zipper_long_plastic", 1 ] ] ] + }, { "result": "rad_badge", "type": "uncraft", @@ -5836,5 +5844,13 @@ "difficulty": 3, "qualities": [ { "id": "FABRIC_CUT", "level": 2 } ], "components": [ [ [ "thread_kevlar", 2 ] ] ] + }, + { + "result": "office_letter_opener", + "type": "uncraft", + "activity_level": "LIGHT_EXERCISE", + "time": "2 m", + "qualities": [ { "id": "HAMMER", "level": 1 } ], + "components": [ [ [ "silver_small", 8 ] ] ] } ] diff --git a/data/json/recipes/recipe_food.json b/data/json/recipes/recipe_food.json index 21668ef2451d2..6e34e4d46b631 100644 --- a/data/json/recipes/recipe_food.json +++ b/data/json/recipes/recipe_food.json @@ -2261,8 +2261,8 @@ "skill_used": "cooking", "difficulty": 1, "time": "15 m", - "qualities": [ { "id": "CONTAIN", "level": 1 } ], - "tools": [ [ [ "rag", -1 ] ], [ [ "mortar_pestle", -1 ] ] ], + "qualities": [ { "id": "CONTAIN", "level": 1 }, { "id": "FINE_GRIND", "level": 1 } ], + "tools": [ [ [ "rag", -1 ] ] ], "autolearn": true, "batch_time_factors": [ 30, 1 ], "proficiencies": [ { "proficiency": "prof_food_prep" } ], @@ -7756,7 +7756,20 @@ "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 1 } ], "tools": [ [ [ "char_smoker", 10 ] ], [ [ "funnel", -1 ], [ "makeshift_funnel", -1 ] ] ], "components": [ - [ [ "offal", 4 ], [ "mutant_bug_organs", 4 ], [ "meat_nofish", 2, "LIST" ], [ "brain", 10 ] ], + [ + [ "offal", 4 ], + [ "mutant_bug_organs", 4 ], + [ "meat_nofish", 2, "LIST" ], + [ "bacon", 8 ], + [ "bologna", 10 ], + [ "meat_pickled", 2 ], + [ "dry_meat", 2 ], + [ "jerky", 2 ], + [ "meat_smoked", 2 ], + [ "meat_salted", 2 ], + [ "meat_fried", 2 ], + [ "brain", 10 ] + ], [ [ "sausage_casings", 2 ], [ "sausage_casings_artificial", 2 ] ], [ [ "salt_water", 4 ], @@ -7804,7 +7817,20 @@ "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 1 } ], "tools": [ [ [ "funnel", -1 ], [ "makeshift_funnel", -1 ] ] ], "components": [ - [ [ "offal", 4 ], [ "mutant_bug_organs", 4 ], [ "meat_nofish", 2, "LIST" ], [ "brain", 10 ] ], + [ + [ "offal", 4 ], + [ "mutant_bug_organs", 4 ], + [ "meat_nofish", 2, "LIST" ], + [ "bacon", 8 ], + [ "bologna", 10 ], + [ "meat_pickled", 2 ], + [ "dry_meat", 2 ], + [ "jerky", 2 ], + [ "meat_smoked", 2 ], + [ "meat_salted", 2 ], + [ "meat_fried", 2 ], + [ "brain", 10 ] + ], [ [ "sausage_casings", 2 ], [ "sausage_casings_artificial", 2 ] ], [ [ "salt_water", 4 ], @@ -7833,7 +7859,8 @@ "time": "1 h 7 m 30 s", "autolearn": true, "batch_time_factors": [ 83, 3 ], - "tools": [ [ [ "surface_heat", 5, "LIST" ] ], [ [ "mortar_pestle", -1 ] ] ], + "qualities": [ { "id": "FINE_GRIND", "level": 1 } ], + "tools": [ [ [ "surface_heat", 5, "LIST" ] ] ], "components": [ [ [ "oats", 2 ] ] ] }, { @@ -7851,7 +7878,7 @@ "autolearn": true, "batch_time_factors": [ 83, 3 ], "flags": [ "BLIND_EASY" ], - "tools": [ [ [ "mortar_pestle", -1 ] ] ], + "qualities": [ { "id": "FINE_GRIND", "level": 1 } ], "components": [ [ [ "wheat", 1 ], [ "barley", 1 ], [ "oats", 4 ], [ "starch", 1 ] ] ] }, { @@ -7869,7 +7896,7 @@ "autolearn": true, "batch_time_factors": [ 83, 3 ], "flags": [ "BLIND_EASY" ], - "tools": [ [ [ "mortar_pestle", -1 ] ] ], + "qualities": [ { "id": "FINE_GRIND", "level": 1 } ], "components": [ [ [ "buckwheat", 1 ], [ "acorns_cooked", 10 ], [ "dry_rice", 5 ], [ "chestnut_roasted", 12 ] ] ] }, { @@ -7886,7 +7913,8 @@ "time": "1 h 7 m 30 s", "autolearn": true, "batch_time_factors": [ 83, 3 ], - "tools": [ [ [ "surface_heat", 5, "LIST" ] ], [ [ "mortar_pestle", -1 ] ] ], + "tools": [ [ [ "surface_heat", 5, "LIST" ] ] ], + "qualities": [ { "id": "FINE_GRIND", "level": 1 } ], "components": [ [ [ "dry_corn", 1 ] ] ] }, { @@ -7903,7 +7931,7 @@ "autolearn": true, "batch_time_factors": [ 83, 3 ], "flags": [ "BLIND_EASY" ], - "tools": [ [ [ "mortar_pestle", -1 ] ] ], + "qualities": [ { "id": "FINE_GRIND", "level": 1 } ], "components": [ [ [ "bone_edible", 1, "LIST" ] ] ] }, { @@ -7920,7 +7948,7 @@ "autolearn": true, "batch_time_factors": [ 83, 3 ], "flags": [ "BLIND_EASY" ], - "tools": [ [ [ "mortar_pestle", -1 ] ] ], + "qualities": [ { "id": "FINE_GRIND", "level": 1 } ], "components": [ [ [ "bone_tainted", 1 ], [ "skewer_bone", 25 ] ] ] }, { @@ -7936,8 +7964,8 @@ "time": "1 h 7 m 30 s", "autolearn": true, "batch_time_factors": [ 30, 1 ], - "qualities": [ { "id": "COOK", "level": 2 }, { "id": "CUT", "level": 2 } ], - "tools": [ [ [ "surface_heat", 5, "LIST" ] ], [ [ "mortar_pestle", -1 ] ] ], + "qualities": [ { "id": "COOK", "level": 2 }, { "id": "CUT", "level": 2 }, { "id": "FINE_GRIND", "level": 1 } ], + "tools": [ [ [ "surface_heat", 5, "LIST" ] ] ], "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_forage_cooking" }, diff --git a/data/json/recipes/recipe_medsandchemicals.json b/data/json/recipes/recipe_medsandchemicals.json index 993b1fbc6e631..a8029515b0034 100644 --- a/data/json/recipes/recipe_medsandchemicals.json +++ b/data/json/recipes/recipe_medsandchemicals.json @@ -890,7 +890,8 @@ "charges": 100, "time": "5 m", "autolearn": true, - "tools": [ [ [ "mortar_pestle", -1 ] ], [ [ "sieve_steel", -1 ] ] ], + "qualities": [ { "id": "FINE_GRIND", "level": 1 } ], + "tools": [ [ [ "sieve_steel", -1 ] ] ], "components": [ [ [ "chem_ammonium_nitrate_pellets", 100 ] ] ] }, { @@ -969,8 +970,30 @@ "book_learn": [ [ "textbook_anarch", 6 ], [ "recipe_labchem", 4 ], [ "textbook_chemistry", 5 ], [ "textbook_armschina", 5 ] ], "charges": 470, "qualities": [ { "id": "CONTAIN", "level": 1 } ], + "tools": [ [ [ "mortar_pestle", -1 ] ] ], "components": [ [ [ "chem_saltpetre", 10 ] ], [ [ "chem_sulphur", 23 ] ], [ [ "charcoal", 1 ] ] ] }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "result": "chem_black_powder", + "id_suffix": "sulpherless", + "category": "CC_AMMO", + "subcategory": "CSC_AMMO_COMPONENTS", + "skill_used": "chemistry", + "difficulty": 4, + "time": "5 m", + "book_learn": [ [ "textbook_anarch", 6 ], [ "recipe_labchem", 4 ], [ "textbook_chemistry", 5 ], [ "textbook_armschina", 5 ] ], + "charges": 421, + "qualities": [ { "id": "CONTAIN", "level": 1 } ], + "tools": [ [ [ "mortar_pestle", -1 ] ] ], + "components": [ + [ [ "chem_saltpetre", 10 ] ], + [ [ "water_clean", 1 ] ], + [ [ "chem_ethanol", 83 ], [ "chem_methanol", 83 ], [ "ether", 83 ], [ "denat_alcohol", 83 ] ], + [ [ "charcoal", 1 ] ] + ] + }, { "type": "recipe", "activity_level": "LIGHT_EXERCISE", @@ -1005,7 +1028,8 @@ "skill_used": "fabrication", "time": "10 m", "autolearn": true, - "tools": [ [ [ "matches", 20 ] ], [ [ "mortar_pestle", -1 ] ] ] + "qualities": [ { "id": "FINE_GRIND", "level": 1 } ], + "tools": [ [ [ "matches", 20 ] ] ] }, { "type": "recipe", @@ -1614,8 +1638,7 @@ "skill_used": "chemistry", "difficulty": 2, "time": "3 m", - "qualities": [ { "id": "CONTAIN", "level": 1 } ], - "tools": [ [ [ "mortar_pestle", -1 ] ] ], + "qualities": [ { "id": "CONTAIN", "level": 1 }, { "id": "FINE_GRIND", "level": 1 } ], "components": [ [ [ "spurge", 20 ] ] ] }, { diff --git a/data/json/recipes/recipe_obsolete.json b/data/json/recipes/recipe_obsolete.json index 780c484729af1..d41efd409c2a8 100644 --- a/data/json/recipes/recipe_obsolete.json +++ b/data/json/recipes/recipe_obsolete.json @@ -304,5 +304,155 @@ "type": "recipe", "result": "xlsurvivor_suit", "obsolete": true + }, + { + "type": "recipe", + "result": "kevlar_chainmail_hauberk", + "obsolete": true + }, + { + "type": "recipe", + "result": "kevlar_chainmail_hauberk_xs", + "obsolete": true + }, + { + "type": "recipe", + "result": "xl_kevlar_chainmail_hauberk", + "obsolete": true + }, + { + "type": "recipe", + "result": "kevlar_chainmail_suit", + "obsolete": true + }, + { + "type": "recipe", + "result": "kevlar_chainmail_suit_xs", + "obsolete": true + }, + { + "type": "recipe", + "result": "xl_kevlar_chainmail_suit", + "obsolete": true + }, + { + "type": "recipe", + "result": "chainmail_vest", + "obsolete": true + }, + { + "type": "recipe", + "result": "xs_chainmail_vest", + "obsolete": true + }, + { + "type": "recipe", + "result": "xl_chainmail_vest", + "obsolete": true + }, + { + "type": "recipe", + "result": "chainmail_hauberk", + "obsolete": true + }, + { + "type": "recipe", + "result": "chainmail_hauberk_xs", + "obsolete": true + }, + { + "type": "recipe", + "result": "xl_chainmail_hauberk", + "obsolete": true + }, + { + "type": "recipe", + "result": "chainmail_suit", + "obsolete": true + }, + { + "type": "recipe", + "result": "chainmail_suit_xs", + "obsolete": true + }, + { + "type": "recipe", + "result": "xl_chainmail_suit", + "obsolete": true + }, + { + "type": "recipe", + "result": "chainmail_legs", + "obsolete": true + }, + { + "type": "recipe", + "result": "xs_chainmail_legs", + "obsolete": true + }, + { + "type": "recipe", + "result": "xl_chainmail_legs", + "obsolete": true + }, + { + "type": "recipe", + "result": "chainmail_hood", + "obsolete": true + }, + { + "type": "recipe", + "result": "xs_chainmail_hood", + "obsolete": true + }, + { + "type": "recipe", + "result": "xl_chainmail_hood", + "obsolete": true + }, + { + "type": "recipe", + "result": "chainmail_hands", + "obsolete": true + }, + { + "type": "recipe", + "result": "xs_chainmail_hands", + "obsolete": true + }, + { + "type": "recipe", + "result": "xl_chainmail_hands", + "obsolete": true + }, + { + "type": "recipe", + "result": "chainmail_feet", + "obsolete": true + }, + { + "type": "recipe", + "result": "xs_chainmail_feet", + "obsolete": true + }, + { + "type": "recipe", + "result": "xl_chainmail_feet", + "obsolete": true + }, + { + "type": "recipe", + "result": "chainmail_arms", + "obsolete": true + }, + { + "type": "recipe", + "result": "xs_chainmail_arms", + "obsolete": true + }, + { + "type": "recipe", + "result": "xl_chainmail_arms", + "obsolete": true } ] diff --git a/data/json/recipes/recipe_others.json b/data/json/recipes/recipe_others.json index af8ed765c9781..756dcb47a5ee9 100644 --- a/data/json/recipes/recipe_others.json +++ b/data/json/recipes/recipe_others.json @@ -212,7 +212,7 @@ "autolearn": true, "batch_time_factors": [ 83, 3 ], "flags": [ "BLIND_EASY" ], - "tools": [ [ [ "mortar_pestle", -1 ] ] ], + "qualities": [ { "id": "FINE_GRIND", "level": 1 } ], "components": [ [ [ "chitin_piece", 1 ], [ "acidchitin_piece", 1 ], [ "endochitin", 1 ] ] ] }, { @@ -1971,6 +1971,76 @@ "using": [ [ "chainmail_standard", 1 ] ], "components": [ [ [ "chain_link", 1000 ] ], [ [ "wire", 1 ] ] ] }, + { + "type": "recipe", + "activity_level": "fake", + "result": "lc_link_sheet", + "id_suffix": "fabrication", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "fabrication", + "difficulty": 3, + "time": "1 h", + "book_learn": [ [ "textbook_armwest", 2 ], [ "textbook_fabrication", 2 ], [ "recipe_melee", 2 ] ], + "using": [ [ "chainmail_standard", 1 ] ], + "components": [ [ [ "lc_chain_link", 1000 ] ], [ [ "lc_wire", 1 ] ] ] + }, + { + "type": "recipe", + "activity_level": "fake", + "result": "mc_link_sheet", + "id_suffix": "fabrication", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "fabrication", + "difficulty": 3, + "time": "1 h", + "book_learn": [ [ "textbook_armwest", 2 ], [ "textbook_fabrication", 2 ], [ "recipe_melee", 2 ] ], + "using": [ [ "chainmail_standard", 1 ] ], + "components": [ [ [ "mc_chain_link", 1000 ] ], [ [ "mc_wire", 1 ] ] ] + }, + { + "type": "recipe", + "activity_level": "fake", + "result": "hc_link_sheet", + "id_suffix": "fabrication", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "fabrication", + "difficulty": 3, + "time": "1 h", + "book_learn": [ [ "textbook_armwest", 2 ], [ "textbook_fabrication", 2 ], [ "recipe_melee", 2 ] ], + "using": [ [ "chainmail_standard", 1 ] ], + "components": [ [ [ "hc_chain_link", 1000 ] ], [ [ "hc_wire", 1 ] ] ] + }, + { + "type": "recipe", + "activity_level": "fake", + "result": "ch_link_sheet", + "id_suffix": "fabrication", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "fabrication", + "difficulty": 3, + "time": "1 h", + "book_learn": [ [ "textbook_armwest", 2 ], [ "textbook_fabrication", 2 ], [ "recipe_melee", 2 ] ], + "using": [ [ "chainmail_standard", 1 ] ], + "components": [ [ [ "ch_chain_link", 1000 ] ], [ [ "ch_wire", 1 ] ] ] + }, + { + "type": "recipe", + "activity_level": "fake", + "result": "qt_link_sheet", + "id_suffix": "fabrication", + "category": "CC_OTHER", + "subcategory": "CSC_OTHER_MATERIALS", + "skill_used": "fabrication", + "difficulty": 3, + "time": "1 h", + "book_learn": [ [ "textbook_armwest", 2 ], [ "textbook_fabrication", 2 ], [ "recipe_melee", 2 ] ], + "using": [ [ "chainmail_standard", 1 ] ], + "components": [ [ [ "qt_chain_link", 1000 ] ], [ [ "qt_wire", 1 ] ] ] + }, { "result": "bundle_rag", "type": "recipe", diff --git a/data/json/regional_map_settings.json b/data/json/regional_map_settings.json index e39f7103d2517..b2c247d2e92e3 100644 --- a/data/json/regional_map_settings.json +++ b/data/json/regional_map_settings.json @@ -954,6 +954,7 @@ "s_jewelry_shop": 200, "s_antique": 200, "s_gardening": 200, + "s_dive_shop": 300, "museum": 100, "s_music": 200, "s_laundromat": 100, diff --git a/data/json/requirements/cooking_components.json b/data/json/requirements/cooking_components.json index 047bed248d049..de82f5538e3ea 100644 --- a/data/json/requirements/cooking_components.json +++ b/data/json/requirements/cooking_components.json @@ -514,6 +514,14 @@ [ [ "broth", 2 ], [ "broth_bone", 2 ], [ "pine_tea", 2 ] ], [ [ "meat_nofish", 1, "LIST" ], + [ "bacon", 4 ], + [ "bologna", 5 ], + [ "meat_pickled", 1 ], + [ "dry_meat", 1 ], + [ "jerky", 1 ], + [ "meat_smoked", 1 ], + [ "meat_salted", 1 ], + [ "meat_fried", 1 ], [ "fish", 1 ], [ "fish_smoked", 1 ], [ "dry_fish", 1 ], diff --git a/data/json/requirements/tailoring.json b/data/json/requirements/tailoring.json index dba06f019a58b..cdb26e5c8411d 100644 --- a/data/json/requirements/tailoring.json +++ b/data/json/requirements/tailoring.json @@ -13,6 +13,41 @@ "tools": [ [ [ "pliers", -1 ], [ "multitool", -1 ], [ "toolset", -1 ] ], [ [ "boltcutters", -1 ], [ "toolset", -1 ] ] ], "components": [ [ [ "link_sheet", 1 ] ], [ [ "chain_link", 25 ] ] ] }, + { + "id": "armor_lc_chainmail_assembling", + "type": "requirement", + "//": "Assembling chainmail rings into finished products, and riveting rings closed, per 1025 g of steel. It is assumed that each ring used comes with a prepared rivet. Time needed is 1 hour per unit (most of the time goes into making rings and then chainmail sheets first)", + "tools": [ [ [ "pliers", -1 ], [ "multitool", -1 ], [ "toolset", -1 ] ], [ [ "boltcutters", -1 ], [ "toolset", -1 ] ] ], + "components": [ [ [ "lc_link_sheet", 1 ] ], [ [ "lc_chain_link", 25 ] ] ] + }, + { + "id": "armor_mc_chainmail_assembling", + "type": "requirement", + "//": "Assembling chainmail rings into finished products, and riveting rings closed, per 1025 g of steel. It is assumed that each ring used comes with a prepared rivet. Time needed is 1 hour per unit (most of the time goes into making rings and then chainmail sheets first)", + "tools": [ [ [ "pliers", -1 ], [ "multitool", -1 ], [ "toolset", -1 ] ], [ [ "boltcutters", -1 ], [ "toolset", -1 ] ] ], + "components": [ [ [ "mc_link_sheet", 1 ] ], [ [ "mc_chain_link", 25 ] ] ] + }, + { + "id": "armor_hc_chainmail_assembling", + "type": "requirement", + "//": "Assembling chainmail rings into finished products, and riveting rings closed, per 1025 g of steel. It is assumed that each ring used comes with a prepared rivet. Time needed is 1 hour per unit (most of the time goes into making rings and then chainmail sheets first)", + "tools": [ [ [ "pliers", -1 ], [ "multitool", -1 ], [ "toolset", -1 ] ], [ [ "boltcutters", -1 ], [ "toolset", -1 ] ] ], + "components": [ [ [ "hc_link_sheet", 1 ] ], [ [ "hc_chain_link", 25 ] ] ] + }, + { + "id": "armor_ch_chainmail_assembling", + "type": "requirement", + "//": "Assembling chainmail rings into finished products, and riveting rings closed, per 1025 g of steel. It is assumed that each ring used comes with a prepared rivet. Time needed is 1 hour per unit (most of the time goes into making rings and then chainmail sheets first)", + "tools": [ [ [ "pliers", -1 ], [ "multitool", -1 ], [ "toolset", -1 ] ], [ [ "boltcutters", -1 ], [ "toolset", -1 ] ] ], + "components": [ [ [ "ch_link_sheet", 1 ] ], [ [ "ch_chain_link", 25 ] ] ] + }, + { + "id": "armor_qt_chainmail_assembling", + "type": "requirement", + "//": "Assembling chainmail rings into finished products, and riveting rings closed, per 1025 g of steel. It is assumed that each ring used comes with a prepared rivet. Time needed is 1 hour per unit (most of the time goes into making rings and then chainmail sheets first)", + "tools": [ [ [ "pliers", -1 ], [ "multitool", -1 ], [ "toolset", -1 ] ], [ [ "boltcutters", -1 ], [ "toolset", -1 ] ] ], + "components": [ [ [ "qt_link_sheet", 1 ] ], [ [ "qt_chain_link", 25 ] ] ] + }, { "id": "armor_chitin", "type": "requirement", diff --git a/data/json/snippets/effect_on_conditions.json b/data/json/snippets/effect_on_conditions.json index f25bf52718067..37559db7bd462 100644 --- a/data/json/snippets/effect_on_conditions.json +++ b/data/json/snippets/effect_on_conditions.json @@ -210,7 +210,7 @@ "text": [ "a voice saying \"All your leaders have walked this path and have chosen salvation. It was a wise decision. The right decision.\"", "a voice saying \"The beyond can give you what you have always craved, purpose.\"", - "a voice saying \"Never before has the path to freedom been so strait. Never before has it been so close.\"", + "a voice saying \"Never before has the path to freedom been so straight. Never before has it been so close.\"", "a voice saying \"Remember when you were young and dreams could still come true? Outside they still can.\"", "a voice saying \"The wonders in the sky are beyond your imagination. Can you even guess at what you are missing right now?\"", "a voice saying \"All your life you have been oppressed by cruel physics, come outside and see freedom.\"", diff --git a/data/json/tool_qualities.json b/data/json/tool_qualities.json index 565ff251161da..59925180a62b5 100644 --- a/data/json/tool_qualities.json +++ b/data/json/tool_qualities.json @@ -283,6 +283,11 @@ "id": "GRIND", "name": { "str": "grinding" } }, + { + "type": "tool_quality", + "id": "FINE_GRIND", + "name": { "str": "fine grinding" } + }, { "type": "tool_quality", "id": "REAM", diff --git a/data/json/ui/move_counter.json b/data/json/ui/move_counter.json deleted file mode 100644 index 25e4c3eebebfb..0000000000000 --- a/data/json/ui/move_counter.json +++ /dev/null @@ -1,9 +0,0 @@ -[ - { - "id": "move_num", - "type": "widget", - "label": "Move count", - "var": "move", - "style": "number" - } -] diff --git a/data/json/uncraft/armor/pets_dog.json b/data/json/uncraft/armor/pets_dog.json index e3d47b077fb74..5b42542994193 100644 --- a/data/json/uncraft/armor/pets_dog.json +++ b/data/json/uncraft/armor/pets_dog.json @@ -7,7 +7,7 @@ "difficulty": 3, "time": "2 m", "qualities": [ { "id": "SAW_M_FINE", "level": 1 } ], - "components": [ [ [ "link_sheet", 3 ] ], [ [ "leather", 3 ] ], [ [ "chain_link", 70 ] ] ] + "components": [ [ [ "lc_link_sheet", 3 ] ], [ [ "leather", 3 ] ], [ [ "lc_chain_link", 70 ] ] ] }, { "result": "superalloy_harness_dog", diff --git a/data/json/vehicleparts/windshields.json b/data/json/vehicleparts/windshields.json index d2e55e845989b..f5eb4c67e64e6 100644 --- a/data/json/vehicleparts/windshields.json +++ b/data/json/vehicleparts/windshields.json @@ -53,7 +53,8 @@ "copy-from": "windshield_abstract", "id": "windshield_full", "looks_like": "windshield", - "type": "vehicle_part" + "type": "vehicle_part", + "name": { "str": "full windshield" } }, { "abstract": "reinforced_windshield_abstract", @@ -104,6 +105,7 @@ "copy-from": "reinforced_windshield_abstract", "id": "reinforced_windshield_full", "looks_like": "reinforced_windshield", - "type": "vehicle_part" + "type": "vehicle_part", + "name": { "str": "reinforced full windshield" } } ] diff --git a/data/json/vitamin.json b/data/json/vitamin.json index f719679d4d0b0..8f30acd33befa 100644 --- a/data/json/vitamin.json +++ b/data/json/vitamin.json @@ -19,25 +19,6 @@ "rate": "30 m", "disease": [ [ -4800, -5600 ], [ -5601, -6400 ], [ -6401, -12000 ] ] }, - { - "id": "vitA", - "type": "vitamin", - "vit_type": "vitamin", - "name": { "str": "Vitamin A" }, - "excess": "hypervitaminosis", - "min": -8400, - "max": 3600, - "rate": "180 m" - }, - { - "id": "vitB", - "type": "vitamin", - "vit_type": "vitamin", - "name": { "str": "Vitamin B12" }, - "min": -5600, - "max": 2000, - "rate": "360 m" - }, { "id": "vitC", "type": "vitamin", diff --git a/data/mods/Aftershock/itemgroups/bionics_groups.json b/data/mods/Aftershock/itemgroups/bionics_groups.json index fb1dcc0f2a82b..a84c914e1c888 100644 --- a/data/mods/Aftershock/itemgroups/bionics_groups.json +++ b/data/mods/Aftershock/itemgroups/bionics_groups.json @@ -109,26 +109,5 @@ { "drop": "fat_tainted", "type": "flesh", "mass_ratio": 0.08 }, { "drop": "bone_tainted", "type": "bone", "mass_ratio": 0.1 } ] - }, - { - "id": "CBM_CIV", - "type": "harvest", - "entries": [ - { - "drop": "bio_power_storage", - "type": "bionic", - "flags": [ "FILTHY", "NO_STERILE", "NO_PACKED" ], - "faults": [ "fault_bionic_salvaged" ] - }, - { - "drop": "bionics_common", - "type": "bionic_group", - "flags": [ "FILTHY", "NO_STERILE", "NO_PACKED" ], - "faults": [ "fault_bionic_salvaged" ] - }, - { "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 } - ] } ] diff --git a/data/mods/Aftershock/items/alien_organics.json b/data/mods/Aftershock/items/alien_organics.json index 135f2e4cbd585..a42c665c228b3 100644 --- a/data/mods/Aftershock/items/alien_organics.json +++ b/data/mods/Aftershock/items/alien_organics.json @@ -5,6 +5,6 @@ "copy-from": "mutant_bug_hydrogen_sacs", "category": "spare_parts", "name": { "str": "cluster of gas sacs", "str_pl": "clusters of gas sacs" }, - "description": "This is a cluster of multicolored membranous bubbles, each about the size of a grape, retrieved from inside an alien animal. They float like tiny helium balloons - perhaps they are full of a lighter-than-air gas." + "description": "This is a cluster of multicolored membranous bubbles, each about the size of a grape, retrieved from inside an alien animal. They float like tiny helium balloons - perhaps they are full of lighter-than-air gas." } ] diff --git a/data/mods/Aftershock/items/ammo/7.50mm.json b/data/mods/Aftershock/items/ammo/7.50mm.json index 43a949af6248a..626a854a3132d 100644 --- a/data/mods/Aftershock/items/ammo/7.50mm.json +++ b/data/mods/Aftershock/items/ammo/7.50mm.json @@ -23,7 +23,7 @@ "id": "afs_7.50mm_rp", "type": "AMMO", "name": { "str_sp": "7.50mm RP" }, - "description": "Civilian-legal 7.50mm ammunition featuring a reduced propellant case and unjacketed projectiles. The 7.50mm RP round is extremely weak with very low stopping power, short range, and negligible recoil. While cheaper than military grade rounds, its only really useful for rifle training, and for hunting small animals. Being caseless, these cannot be disassembled or reloaded.", + "description": "Civilian-legal 7.50mm ammunition featuring a reduced propellant case and unjacketed projectiles. The 7.50mm RP round is extremely weak with very low stopping power, short range, and negligible recoil. While cheaper than military grade rounds, it's only really useful for rifle training, and for hunting small animals. Being caseless, these cannot be disassembled or reloaded.", "weight": "3 g", "volume": "65 ml", "price": 150, diff --git a/data/mods/Aftershock/items/armor.json b/data/mods/Aftershock/items/armor.json index 4a2c2d4863b10..9ed8e6c106ed5 100644 --- a/data/mods/Aftershock/items/armor.json +++ b/data/mods/Aftershock/items/armor.json @@ -41,7 +41,7 @@ "type": "TOOL_ARMOR", "copy-from": "afs_sentinel_cloak", "name": { "str": "hologram cloak mk.2", "str_pl": "hologram cloaks mk.2" }, - "description": "When activated, creates an holographic decoy of its wearer. Powered by an experimental n-space energy generator, it slowly recharges itself for free, probably by siphoning excess energy from some unknown hyperdimensional space.", + "description": "When activated, creates a holographic decoy of its wearer. Powered by an experimental n-space energy generator, it slowly recharges itself for free, probably by siphoning excess energy from some unknown hyperdimensional space.", "charges_per_use": 1, "//": "Change charges and charge_regen only", "relic_data": { "charge_info": { "recharge_type": "periodic", "time": "1 h", "regenerate_ammo": true } }, @@ -54,7 +54,7 @@ "type": "ARMOR", "copy-from": "jedi_cloak", "name": { "str": "sentinel-lx cloak" }, - "description": "The vantablack cloak of sentinel-lx hangs around ones shoulders as a solid, unnatural shadow. Made from woven graphene, its lightweight and resistant, but cannot be repaired", + "description": "The vantablack cloak of sentinel-lx hangs around ones shoulders as a solid, unnatural shadow. Made from woven graphene, it's lightweight and resistant, but cannot be repaired.", "price": 1500000, "material": [ "graphene_weave" ], "symbol": "[", @@ -134,7 +134,7 @@ "id": "q_solarpack", "type": "TOOL_ARMOR", "name": { "str": "quantum solar backpack (folded)", "str_pl": "quantum solar backpacks (folded)" }, - "description": "Personal portable charging system consisting of an array of quantum solar panels neatly folded in a form of a large backpack. It can be worn as one, and has an integrated cable to plug it into a cable charger system. Cutting edge technology.", + "description": "Personal portable charging system consisting of an array of quantum solar panels neatly folded in the form of a large backpack. It can be worn as one, and has an integrated cable to plug it into a cable charger system. Cutting edge technology.", "weight": "7500 g", "volume": "5 L", "price": 1500000, diff --git a/data/mods/Aftershock/items/cast_spell_items.json b/data/mods/Aftershock/items/cast_spell_items.json index 4b1f85a5a28f2..8d582d1d8c029 100644 --- a/data/mods/Aftershock/items/cast_spell_items.json +++ b/data/mods/Aftershock/items/cast_spell_items.json @@ -30,7 +30,7 @@ "type": "TOOL_ARMOR", "copy-from": "afs_caster", "name": { "str": "hologram flare caster" }, - "description": "A small metallic sphere with a recessed bottom up top. When activated it will allow you to select an hologram, which will explode in a blinding flash, stunning anything nearby.", + "description": "A small metallic sphere with a recessed bottom up top. When activated it will allow you to select a hologram, which will explode in a blinding flash, stunning anything nearby.", "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "battery": 15 } } ], "use_action": { "type": "cast_spell", "spell_id": "afs_holo_flare", "no_fail": true, "level": 1 }, "relic_data": { "charge_info": { "regenerate_ammo": true, "recharge_type": "periodic", "time": "1 h" } } @@ -60,7 +60,7 @@ "type": "TOOL_ARMOR", "copy-from": "dimensional_anchor", "name": { "str": "recall rig" }, - "description": "A complex antennae assembly worn around the upper torso that allows its user to home and teleport towards previously configured teleport pads. Although relatively functional, its much inferior to the translocation systems of old, and a successful teleport requires standing perfectly still for several minutes.", + "description": "A complex antennae assembly worn around the upper torso that allows its user to home and teleport towards previously configured teleport pads. Although relatively functional, it's much inferior to the translocation systems of old, and a successful teleport requires standing perfectly still for several minutes.", "charges_per_use": 1000, "pocket_data": [ { diff --git a/data/mods/Aftershock/items/cbms.json b/data/mods/Aftershock/items/cbms.json index b96706ae04c07..a9df1608a75e1 100644 --- a/data/mods/Aftershock/items/cbms.json +++ b/data/mods/Aftershock/items/cbms.json @@ -151,7 +151,7 @@ "copy-from": "bionic_general", "type": "BIONIC_ITEM", "name": { "str": "Pattern-U15 Attenuation Field CBM" }, - "description": "A military grade kinetic attenuation system developed for use within UICA's special service branches. Although much more effective than anything that could be conceived with current technology, it remains a pale imitation of the Hyperspace Age systems it was reverse engineered from. A side effect modern engineering seems unable to address is the tendency for this unit to release electrical fields when hit. This field is rated to reduce ballistic and piercing damage as viewed in your HUD by 20 points", + "description": "A military grade kinetic attenuation system developed for use within UICA's special service branches. Although much more effective than anything that could be conceived with current technology, it remains a pale imitation of the Hyperspace Age systems it was reverse engineered from. A side effect modern engineering seems unable to address is the tendency for this unit to release electrical fields when hit. This field is rated to reduce ballistic and piercing damage as viewed in your HUD by 20 points.", "price": 100000, "price_postapoc": 6500, "difficulty": 10 @@ -161,7 +161,7 @@ "copy-from": "bionic_general", "type": "BIONIC_ITEM", "name": { "str": "Kinetic annulment system CBM" }, - "description": "A kinetic attenuation system salvaged from a pre-discontinuity robotic warframe, crudely adapted for compatibility with biological hosts. Powerful enough to completely stop most rifle cartridges. This field is rated to reduce ballistic and piercing damage as viewed in your HUD by 40 points", + "description": "A kinetic attenuation system salvaged from a pre-discontinuity robotic warframe, crudely adapted for compatibility with biological hosts. Powerful enough to completely stop most rifle cartridges. This field is rated to reduce ballistic and piercing damage as viewed in your HUD by 40 points.", "price": 100000, "price_postapoc": 12500, "difficulty": 16 diff --git a/data/mods/Aftershock/items/comestibles/alienfood.json b/data/mods/Aftershock/items/comestibles/alienfood.json index 405d934267c62..30f8e0cf5560e 100644 --- a/data/mods/Aftershock/items/comestibles/alienfood.json +++ b/data/mods/Aftershock/items/comestibles/alienfood.json @@ -16,7 +16,7 @@ "volume": "80 ml", "charges": 3, "fun": -8, - "vitamins": [ [ "calcium", 5 ], [ "iron", 12 ], [ "vitA", 20 ], [ "vitC", 56 ], [ "mutant_toxin", 25 ] ], + "vitamins": [ [ "calcium", 5 ], [ "iron", 12 ], [ "vitC", 56 ], [ "mutant_toxin", 25 ] ], "flags": [ "RAW" ] }, { @@ -35,7 +35,7 @@ "volume": "75 ml", "charges": 3, "fun": -3, - "vitamins": [ [ "calcium", 5 ], [ "iron", 12 ], [ "vitA", 20 ], [ "vitC", 56 ] ], + "vitamins": [ [ "calcium", 5 ], [ "iron", 12 ], [ "vitC", 56 ] ], "flags": [ "NUTRIENT_OVERRIDE" ] }, { @@ -53,7 +53,7 @@ "healthy": -1, "fun": -10, "cooks_like": "meat_cooked", - "vitamins": [ [ "vitC", 13 ], [ "calcium", 2 ], [ "iron", 53 ], [ "vitB", 778 ], [ "mutant_toxin", 25 ] ], + "vitamins": [ [ "vitC", 13 ], [ "calcium", 2 ], [ "iron", 53 ], [ "mutant_toxin", 25 ] ], "flags": [ "SMOKABLE", "RAW" ], "smoking_result": "meat_smoked" }, @@ -137,7 +137,7 @@ "healthy": -5, "price_postapoc": 250, "calories": 1923, - "description": "A smooth light green block of cleaned and rendered human fat. While it'll remain edible for a very long time, it won't be the most appetizing", + "description": "A smooth light green block of cleaned and rendered human fat. While it'll remain edible for a very long time, it won't be the most appetizing.", "price": 500, "volume": "250 ml", "vitamins": [ [ "mutant_toxin", 25 ] ], @@ -191,7 +191,7 @@ "healthy": -1, "fun": -10, "cooks_like": "meat_cooked", - "vitamins": [ [ "vitC", 13 ], [ "calcium", 2 ], [ "iron", 53 ], [ "vitB", 778 ], [ "mutant_toxin", 25 ] ], + "vitamins": [ [ "vitC", 13 ], [ "calcium", 2 ], [ "iron", 53 ], [ "mutant_toxin", 25 ] ], "flags": [ "SMOKABLE", "RAW", "PREDATOR_FUN" ], "smoking_result": "meat_smoked" }, @@ -208,7 +208,7 @@ "price_postapoc": 100, "parasites": 0, "calories": 402, - "vitamins": [ [ "vitC", 16 ], [ "calcium", 2 ], [ "iron", 69 ], [ "vitB", 778 ], [ "mutant_toxin", 25 ] ], + "vitamins": [ [ "vitC", 16 ], [ "calcium", 2 ], [ "iron", 69 ], [ "mutant_toxin", 25 ] ], "flags": [ "EATEN_HOT", "NUTRIENT_OVERRIDE" ] }, { @@ -220,7 +220,7 @@ "cooks_like": "meat_scrap_cooked", "proportional": { "weight": 0.1, "volume": 0.1, "price": 0.1, "calories": 0.1 }, "delete": { "flags": [ "SMOKABLE" ] }, - "vitamins": [ [ "vitA", 0 ], [ "vitC", 0 ], [ "calcium", 0 ], [ "iron", 0 ], [ "vitB", 0 ], [ "mutant_toxin", 5 ] ] + "vitamins": [ [ "vitC", 0 ], [ "calcium", 0 ], [ "iron", 0 ], [ "mutant_toxin", 5 ] ] }, { "id": "alien_meat_scrap_cooked", @@ -276,7 +276,7 @@ "quench": 2, "fun": -10, "calories": 50, - "vitamins": [ [ "vitA", 0 ], [ "vitC", 9 ], [ "calcium", 0 ], [ "iron", 14 ], [ "vitB", 22 ], [ "mutant_toxin", 25 ] ], + "vitamins": [ [ "vitC", 9 ], [ "calcium", 0 ], [ "iron", 14 ], [ "mutant_toxin", 25 ] ], "extend": { "flags": [ "PREDATOR_FUN" ] } }, { @@ -299,7 +299,7 @@ "price_postapoc": 25, "quench": -4, "calories": 92, - "vitamins": [ [ "vitA", 75 ], [ "vitC", 0 ], [ "calcium", 0 ], [ "iron", 8 ], [ "vitB", 336 ], [ "mutant_toxin", 25 ] ] + "vitamins": [ [ "vitC", 0 ], [ "calcium", 0 ], [ "iron", 8 ], [ "mutant_toxin", 25 ] ] }, { "id": "alien_liver_cooked", @@ -328,7 +328,7 @@ "fun": -20, "parasites": 15, "calories": 78, - "vitamins": [ [ "vitA", 0 ], [ "vitC", 2 ], [ "calcium", 1 ], [ "iron", 8 ], [ "vitB", 54 ], [ "mutant_toxin", 25 ] ] + "vitamins": [ [ "vitC", 2 ], [ "calcium", 1 ], [ "iron", 8 ], [ "mutant_toxin", 25 ] ] }, { "id": "alien_brain_cooked", @@ -355,7 +355,7 @@ "price_postapoc": 25, "quench": -5, "calories": 54, - "vitamins": [ [ "vitA", 6 ], [ "vitC", 2 ], [ "calcium", 0 ], [ "iron", 8 ], [ "vitB", 155 ], [ "mutant_toxin", 25 ] ] + "vitamins": [ [ "vitC", 2 ], [ "calcium", 0 ], [ "iron", 8 ], [ "mutant_toxin", 25 ] ] }, { "id": "alien_kidney_cooked", @@ -383,7 +383,7 @@ "price_postapoc": 25, "quench": 0, "calories": 133, - "vitamins": [ [ "vitA", 0 ], [ "vitC", 32 ], [ "calcium", 0 ], [ "iron", 6 ], [ "vitB", 20 ], [ "mutant_toxin", 25 ] ] + "vitamins": [ [ "vitC", 32 ], [ "calcium", 0 ], [ "iron", 6 ], [ "mutant_toxin", 25 ] ] }, { "id": "alien_sweetbread_cooked", diff --git a/data/mods/Aftershock/items/comestibles/bug_brew.json b/data/mods/Aftershock/items/comestibles/bug_brew.json index 8fbcf8b84a655..eca0de9cd331e 100644 --- a/data/mods/Aftershock/items/comestibles/bug_brew.json +++ b/data/mods/Aftershock/items/comestibles/bug_brew.json @@ -20,7 +20,7 @@ "charges": 5, "category": "chems", "fun": -30, - "vitamins": [ [ "calcium", 2 ], [ "iron", 2 ], [ "vitA", 1 ], [ "vitB", 2 ], [ "bad_food", 1 ] ] + "vitamins": [ [ "calcium", 2 ], [ "iron", 2 ], [ "bad_food", 1 ] ] }, { "type": "COMESTIBLE", @@ -102,7 +102,7 @@ "description": "A handful of edible and heavily genemoded grubs, each only slightly thinner than your thumb. Engineered in the wake of the XXII century to feed an overpopulated Earth and its fledgling colonies these are sturdy, easily grown and scalable crop.\n\nRemoved from their growth solution they'll quickly die and desiccate, as these already have. They could be safely eaten with no further processing, for a nutritious if somewhat striking meal.", "fun": 0, "freezing_point": -9999, - "vitamins": [ [ "calcium", 2 ], [ "iron", 2 ], [ "vitA", 1 ], [ "vitB", 2 ], [ "bad_food", 1 ] ] + "vitamins": [ [ "calcium", 2 ], [ "iron", 2 ], [ "bad_food", 1 ] ] }, { "type": "recipe", diff --git a/data/mods/Aftershock/items/comestibles/cheap_food.json b/data/mods/Aftershock/items/comestibles/cheap_food.json index c0104064297f3..f09acda98d04a 100644 --- a/data/mods/Aftershock/items/comestibles/cheap_food.json +++ b/data/mods/Aftershock/items/comestibles/cheap_food.json @@ -17,14 +17,7 @@ "looks_like": "vitamins", "fun": -8, "freezing_point": -9999, - "vitamins": [ - [ "calcium", 24, 48 ], - [ "iron", 24, 48 ], - [ "vitA", 24, 48 ], - [ "vitB", 24, 48 ], - [ "vitC", 24, 48 ], - [ "bad_food", 10 ] - ] + "vitamins": [ [ "calcium", 24, 48 ], [ "iron", 24, 48 ], [ "vitC", 24, 48 ], [ "bad_food", 10 ] ] }, { "id": "afs_calorie_water", @@ -39,14 +32,7 @@ "price": 10000, "looks_like": "bleach", "fun": -2, - "vitamins": [ - [ "calcium", 24, 48 ], - [ "iron", 24, 48 ], - [ "vitA", 24, 48 ], - [ "vitB", 24, 48 ], - [ "vitC", 24, 48 ], - [ "bad_food", 10 ] - ] + "vitamins": [ [ "calcium", 24, 48 ], [ "iron", 24, 48 ], [ "vitC", 24, 48 ], [ "bad_food", 10 ] ] }, { "id": "afs_sundew", @@ -102,7 +88,7 @@ "description": "Smoothly blended edibles, neatly shaped into cubes for maximum enjoyment.", "fun": 2, "freezing_point": -9999, - "vitamins": [ [ "calcium", 30 ], [ "iron", 30 ], [ "vitA", 30 ], [ "vitB", 30 ], [ "vitC", 30 ], [ "bad_food", 1 ] ] + "vitamins": [ [ "calcium", 30 ], [ "iron", 30 ], [ "vitC", 30 ], [ "bad_food", 1 ] ] }, { "id": "afs_food_to_go", @@ -131,7 +117,7 @@ "description": "Rings of caramelized yellow colorant, tasting not exactly like apple.", "fun": 2, "freezing_point": -9999, - "vitamins": [ [ "iron", 1 ], [ "vitA", 1 ], [ "vitC", 10 ] ] + "vitamins": [ [ "iron", 1 ], [ "vitC", 10 ] ] }, { "id": "afs_cee_wafers", @@ -159,11 +145,11 @@ "calories": 250, "material": [ "flesh", "veggy" ], "healthy": 3, - "description": "Soy or pureed rat? Better not to know.\n(But its probably both.) ", + "description": "Soy or pureed rat? Better not to know.\n(But its probably both.)", "fun": 0, "charges": 2, "freezing_point": -9999, - "vitamins": [ [ "calcium", 5 ], [ "iron", 5 ], [ "vitC", 10 ], [ "vitB", 10 ], [ "bad_food", 1 ] ] + "vitamins": [ [ "calcium", 5 ], [ "iron", 5 ], [ "vitC", 10 ], [ "bad_food", 1 ] ] }, { "id": "afs_soup_27", @@ -178,7 +164,7 @@ "description": "Yellow chunks float on creamy liquid, like flotsam on a filthy summer pond. Branding implies at least 26 other flavors, but you have neither seen or heard about any of them.", "fun": 0, "freezing_point": -9999, - "vitamins": [ [ "calcium", 1 ], [ "iron", 10 ], [ "vitC", 5 ], [ "vitB", 10 ], [ "vitA", 5 ], [ "bad_food", 1 ] ] + "vitamins": [ [ "calcium", 1 ], [ "iron", 10 ], [ "vitC", 5 ], [ "bad_food", 1 ] ] }, { "id": "afs_escapepod_ration", diff --git a/data/mods/Aftershock/items/crafting_scrap/magnet_scrap.json b/data/mods/Aftershock/items/crafting_scrap/magnet_scrap.json index fb07ece9a7ef2..40830e4706cd6 100644 --- a/data/mods/Aftershock/items/crafting_scrap/magnet_scrap.json +++ b/data/mods/Aftershock/items/crafting_scrap/magnet_scrap.json @@ -12,7 +12,7 @@ "id": "afs_magnet_2", "copy-from": "afs_scrap_2", "name": { "str": "cryo electromagnet" }, - "description": "A powerful super conductive electromagnet, that must be kept at very low temperatures to operate.", + "description": "A powerful super conductive electromagnet, that must be kept at very low temperatures to operate.", "looks_like": "scrap" }, { diff --git a/data/mods/Aftershock/items/crafting_scrap/material_scrap.json b/data/mods/Aftershock/items/crafting_scrap/material_scrap.json index f68289fe2e573..47a8189a88367 100644 --- a/data/mods/Aftershock/items/crafting_scrap/material_scrap.json +++ b/data/mods/Aftershock/items/crafting_scrap/material_scrap.json @@ -28,7 +28,7 @@ "id": "afs_material_4", "copy-from": "afs_scrap_4", "name": { "str": "crystal forged neutrite" }, - "description": "Great forges within the Earth's core wrought hydrogen into flaming metal and poured it within lattices of super conductive lanthanum. Locked in magnetic equilibrium, it was left to cool into a dark unbreakable metal", + "description": "Great forges within the Earth's core wrought hydrogen into flaming metal and poured it within lattices of super conductive lanthanum. Locked in magnetic equilibrium, it was left to cool into a dark unbreakable metal.", "looks_like": "scrap" }, { diff --git a/data/mods/Aftershock/items/grenades.json b/data/mods/Aftershock/items/grenades.json index 5a5afa6e2d8e8..b98182616921b 100644 --- a/data/mods/Aftershock/items/grenades.json +++ b/data/mods/Aftershock/items/grenades.json @@ -44,7 +44,7 @@ "category": "weapons", "looks_like": "grenade_emp", "name": "electroshock grenade", - "description": "This is an electronic weapon that will emit a short ranged electric field. When activated, you'll have five turns before it starts doing so; throwing it before that would be a good idea.", + "description": "This is an electronic weapon that will emit a short-ranged electric field. When activated, you'll have five turns before it starts doing so; throwing it before that would be a good idea.", "use_action": { "menu_text": "Pull pin", "need_wielding": true, "type": "transform", "target": "afs_electroshock_grenade_1_act" } }, { @@ -64,7 +64,7 @@ "type": "TOOL", "category": "weapons", "name": { "str": "cryo grenade" }, - "description": "This is a military-grade cryo hand grenade. Once it explodes it spreads exotic highly radioactive shrapnel. Use this item to pull the pin and light the fuse. You will then have five seconds before it explodes; throwing it would be a good idea.", + "description": "This is a military-grade cryo hand grenade. Once it explodes it spreads exotic highly-radioactive shrapnel. Use this item to pull the pin and light the fuse. You will then have five seconds before it explodes; throwing it would be a good idea.", "weight": "397 g", "volume": "250 ml", "price": 1500, @@ -90,7 +90,7 @@ "type": "TOOL", "category": "weapons", "name": { "str": "active cryo grenade" }, - "description": "This is an active grenade, and will explode any second now. Once it explodes it spreads exotic highly thermodynamic shrapnel. Better throw it!", + "description": "This is an active grenade, and will explode any second now. Once it explodes it spreads exotic highly-thermodynamic shrapnel. Better throw it!", "weight": "397 g", "volume": "250 ml", "price": 0, diff --git a/data/mods/Aftershock/items/gun/5x50.json b/data/mods/Aftershock/items/gun/5x50.json index b71d8d237ec53..827f744203b85 100644 --- a/data/mods/Aftershock/items/gun/5x50.json +++ b/data/mods/Aftershock/items/gun/5x50.json @@ -5,7 +5,7 @@ "copy-from": "needlepistol", "name": { "str": "eidolon derringer" }, "volume": "500 ml", - "description": "A slick, miniature derringer designed as a backup weapon for covert operations and close range assassination. It will fire up to four 5x50mm penetrators simultaneously, to devastating effect.", + "description": "A slick, miniature derringer designed as a backup weapon for covert operations and close-range assassination. It will fire up to four 5x50mm penetrators simultaneously, to devastating effect.", "dispersion": 410, "range": -48, "valid_mod_locations": [ [ "accessories", 2 ] ], diff --git a/data/mods/Aftershock/items/gun/7.50mm.json b/data/mods/Aftershock/items/gun/7.50mm.json index 483e77a8f31f9..40514b5056457 100644 --- a/data/mods/Aftershock/items/gun/7.50mm.json +++ b/data/mods/Aftershock/items/gun/7.50mm.json @@ -69,7 +69,7 @@ "looks_like": "ar15", "type": "GUN", "name": { "str": "G&W SR-P9" }, - "description": "An eminently sturdy and reliable bullpup rifle issued by UICA's military during early reclamation expeditions. Although its been out of service for nearly two decades, many a private military and contractor has found a use for the SR-P9, and it remains common long past its initial introduction into service.", + "description": "An eminently sturdy and reliable bullpup rifle issued by UICA's military during early reclamation expeditions. Although it's been out of service for nearly two decades, many a private military and contractor has found a use for the SR-P9, and it remains common long past its initial introduction into service.", "weight": "3170 g", "volume": "3100 ml", "longest_side": "630 mm", diff --git a/data/mods/Aftershock/items/gun/laser.json b/data/mods/Aftershock/items/gun/laser.json index d27ce8bccbbc4..4dff4241885c5 100644 --- a/data/mods/Aftershock/items/gun/laser.json +++ b/data/mods/Aftershock/items/gun/laser.json @@ -45,7 +45,7 @@ "type": "GUN", "reload_noise_volume": 10, "name": { "str": "handheld x-ray cannon" }, - "description": "This is an x-ray laser stripped a TX-5LR Cerberus laser turret that has been modified to use UPS power for firing. Single shot then requires reloading. Nicknamed the 'Tin Can Killer' for it's ability to destroy power armor.", + "description": "This is an x-ray laser stripped from a TX-5LR Cerberus laser turret that has been modified to use UPS power for firing. Single shot then requires reloading. Nicknamed the 'Tin Can Killer' for its ability to destroy power armor.", "weight": "5140 g", "volume": "1500 ml", "price": 400000, diff --git a/data/mods/Aftershock/items/gun/plasma.json b/data/mods/Aftershock/items/gun/plasma.json index 356d7016893a9..342a75a698263 100644 --- a/data/mods/Aftershock/items/gun/plasma.json +++ b/data/mods/Aftershock/items/gun/plasma.json @@ -75,7 +75,7 @@ "type": "TOOL", "name": { "str_sp": "377-UASTA (weaponized)" }, "copy-from": "afs_plasma_base", - "description": "A common modification for directed plasma torches that involves the installation of oversize capacitor banks and judiciously bypassed safety mechanisms, allowing them to function as a deadly if decidedly short ranged weapons. In most cases, the resulting \"gun\" can still perform its original metalworking functions, albeit at a much lower efficiency.\n\nUnlike purposefully made plasma weapons, the propelled plasma bottle wont cause a considerable explosion upon contact, allowing for relatively safe operation within enclosed spaces.", + "description": "A common modification for directed plasma torches that involves the installation of oversize capacitor banks and judiciously bypassed safety mechanisms, allowing them to function as a deadly if decidedly short-ranged weapons. In most cases, the resulting \"gun\" can still perform its original metalworking functions, albeit at a much lower efficiency.\n\nUnlike purposefully made plasma weapons, the propelled plasma bottle won't cause a considerable explosion upon contact, allowing for relatively safe operation within enclosed spaces.", "weight": "4200 g", "volume": "4500 ml", "longest_side": "60 cm", diff --git a/data/mods/Aftershock/items/inactiverobot.json b/data/mods/Aftershock/items/inactiverobot.json index 8e8f6b9fbd35e..1194ef2d690b5 100644 --- a/data/mods/Aftershock/items/inactiverobot.json +++ b/data/mods/Aftershock/items/inactiverobot.json @@ -316,7 +316,7 @@ "type": "TOOL", "copy-from": "bot_hack_base", "name": "inactive floating lantern", - "description": "An inactive floating lantern, a fist-sized robots that flies through the air and illuminates its surroundings with bright LEDs. The lantern is non aggressive and has no means of attack. Activate this item to deploy the salvaged robot.", + "description": "An inactive floating lantern, a fist-sized robot that flies through the air and illuminates its surroundings with bright LEDs. The lantern is non aggressive and has no means of attack. Activate this item to deploy the salvaged robot.", "color": "yellow", "looks_like": "bot_manhack", "use_action": { @@ -413,7 +413,7 @@ "type": "TOOL", "copy-from": "bot_skitterbot_base", "name": "inactive rat snatcher", - "description": "A small hexapod drone designed to hold small pests, folded into a small cube for easy of storage. Its capable of hunting all sorts of small mammals with remarkable efficiency, but shouldn't be expected to handle anything much bigger than a rat.", + "description": "A small hexapod drone designed to hold small pests, folded into a small cube for easy storage. It's capable of hunting all sorts of small mammals with remarkable efficiency, but shouldn't be expected to handle anything much bigger than a rat.", "color": "dark_gray", "weight": "750 g", "volume": "1 L", diff --git a/data/mods/Aftershock/items/obsolete.json b/data/mods/Aftershock/items/obsolete.json index 702e2f0e3d386..b6d350b187c71 100644 --- a/data/mods/Aftershock/items/obsolete.json +++ b/data/mods/Aftershock/items/obsolete.json @@ -330,7 +330,7 @@ "type": "TOOL_ARMOR", "copy-from": "afs_hev_helmet", "name": { "str": "hazardous environment helmet (on)", "str_pl": "hazardous environment helmets (on)" }, - "description": "Meant to pair with a compatible HEV suit, this helmet's physical protection is basic at best, but makes up for it with an air recycler that provides excellent protection from airborne contaminants. Its light is on, illuminating the area at a cost of batteries.", + "description": "Meant to pair with a compatible HEV suit, this helmet's physical protection is basic at best, but makes up for it with an air recycler that provides excellent protection from airborne contaminants. Its light is on, illuminating the area at the cost of battery power.", "revert_to": "afs_hev_helmet", "turns_per_charge": 20, "use_action": { "menu_text": "Turn off", "type": "transform", "msg": "The %s flicks off.", "target": "afs_hev_helmet" }, diff --git a/data/mods/Aftershock/items/tools.json b/data/mods/Aftershock/items/tools.json index 033c8adba84dd..2a54f6a186ce2 100644 --- a/data/mods/Aftershock/items/tools.json +++ b/data/mods/Aftershock/items/tools.json @@ -69,7 +69,7 @@ "id": "afs_plasma_torch", "type": "TOOL", "name": { "str": "377-UASTA plasma torch", "str_pl": "377-UASTA plasma torches" }, - "description": "One of the many versions of UASTA certified plasma torches, essentially a civilian plasma railgun used to deliver focused waves of plasma for precision welding or metal cutting. It is an indispensable tool for construction or demolition work, and is sometimes transformed into weapon by mining & salvage outfits of questionable repute.", + "description": "One of the many versions of UASTA certified plasma torches, essentially a civilian plasma railgun used to deliver focused waves of plasma for precision welding or metal cutting. It is an indispensable tool for construction or demolition work, and is sometimes transformed into a weapon by mining & salvage outfits of questionable repute.", "weight": "4200 g", "volume": "4500 ml", "longest_side": "60 cm", @@ -194,7 +194,7 @@ "type": "TOOL", "name": { "str": "atompot" }, "copy-from": "pressure_cooker", - "description": "Rivtech's premiere self-heating kitchen appliance, complete with lid, hand-crafted with the power of the atom to reach any temperature in thirty seconds. As bulky as it is, its plutonium power source means that it can be used to cook an absurd amount of meals without ever worrying about running low on power. Unsurprisingly, sales weren't particularly good because of the prospect of irradiating your food, but internal shielding ensures that only trace amounts find its way into the center.", + "description": "Rivtech's premiere self-heating kitchen appliance, complete with lid, hand-crafted with the power of the atom to reach any temperature in thirty seconds. As bulky as it is, its plutonium power source means that it can be used to cook an absurd amount of meals without ever worrying about running low on power. Unsurprisingly, sales weren't particularly good because of the prospect of irradiating your food, but internal shielding ensures that only trace amounts find their way into the center.", "price": 30000, "price_postapoc": 5000, "material": [ "steel", "plastic" ], diff --git a/data/mods/Aftershock/maps/furniture_and_terrain/furniture_habitat.json b/data/mods/Aftershock/maps/furniture_and_terrain/furniture_habitat.json index 48ddba49cbb07..cba0941bba24c 100644 --- a/data/mods/Aftershock/maps/furniture_and_terrain/furniture_habitat.json +++ b/data/mods/Aftershock/maps/furniture_and_terrain/furniture_habitat.json @@ -5,7 +5,7 @@ "name": "habitat kitchenette", "symbol": "#", "looks_like": "f_oven", - "description": "A tiny sink and cooking surface only big enough to fit an electric hotplate, placed above and below many integrated storage units. The minimal space in which you could technically cook", + "description": "A tiny sink and cooking surface only big enough to fit an electric hotplate, placed above and below many integrated storage units. The minimal space in which you could technically cook.", "color": "blue", "move_cost_mod": -1, "coverage": 55, diff --git a/data/mods/Aftershock/maps/furniture_and_terrain/terrain_floraxeno.json b/data/mods/Aftershock/maps/furniture_and_terrain/terrain_floraxeno.json index 11cb14aedf709..c227166303937 100644 --- a/data/mods/Aftershock/maps/furniture_and_terrain/terrain_floraxeno.json +++ b/data/mods/Aftershock/maps/furniture_and_terrain/terrain_floraxeno.json @@ -169,7 +169,7 @@ "type": "furniture", "id": "f_moxie_tube", "name": "breather", - "description": "On the ground here lays several colorless coral reefs, the black veins are noticeably more engorged as they breathe.", + "description": "On the ground here lay several colorless coral reefs, the black veins are noticeably more engorged as they breathe.", "symbol": "+", "color": "light_gray", "move_cost_mod": 8, diff --git a/data/mods/Aftershock/maps/furniture_lab.json b/data/mods/Aftershock/maps/furniture_lab.json index 71e11e9489447..5bf41413f5464 100644 --- a/data/mods/Aftershock/maps/furniture_lab.json +++ b/data/mods/Aftershock/maps/furniture_lab.json @@ -203,7 +203,7 @@ { "type": "furniture", "id": "f_HPLC", - "name": "high performance liquid chromatographer", + "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 the stationary phase in a tube. At least, that's what the label says.", "symbol": ":", "color": "red_white", diff --git a/data/mods/Aftershock/mobs/aliens.json b/data/mods/Aftershock/mobs/aliens.json index 937ec1391e5c8..4ee948324194c 100644 --- a/data/mods/Aftershock/mobs/aliens.json +++ b/data/mods/Aftershock/mobs/aliens.json @@ -210,7 +210,7 @@ "id": "afs_venandi", "type": "MONSTER", "name": { "str": "venandi", "str_pl": "venatores" }, - "description": "A six legged animal, showing relative intelligence in not only its ability to track and hunt down prey, but its strategy of covering itself with the skin of its hunts to warm itself.", + "description": "A six-legged animal, showing relative intelligence in not only its ability to track and hunt down prey, but its strategy of covering itself with the skin of its hunts to warm itself.", "default_faction": "venandi", "bodytype": "dog", "categories": [ "WILDLIFE" ], diff --git a/data/mods/Aftershock/mobs/robots.json b/data/mods/Aftershock/mobs/robots.json index b44ced51ea396..bfb7ea514e197 100644 --- a/data/mods/Aftershock/mobs/robots.json +++ b/data/mods/Aftershock/mobs/robots.json @@ -3,7 +3,7 @@ "id": "afs_mon_migoturret", "type": "MONSTER", "name": { "str": "brain blaster" }, - "description": "The mi-go have set up some defenses here. This horrifying techo-organic amalgamation appears to use brains in jars as their operating system. On the plus side it looks like it can be headshot.", + "description": "The mi-go have set up some defenses here. This horrifying techo-organic amalgamation appears to use brains in jars as their operating system. On the plus side it looks like an easy headshot.", "default_faction": "mi-go", "species": [ "ROBOT" ], "diff": 20, @@ -288,7 +288,7 @@ "copy-from": "mon_utilibot", "name": { "str": "ENIAC Famulus", "str_pl": "ENIAC Famuli" }, "color": "dark_gray", - "description": "A top of the line luxury model, the Famulus is a humaniform robot, derived from Wraitheon schematics with slight alterations to give it a more human appearance. Designed to be a robotic servant, its AI tailored for the needs for each customer, it is arguably one of the few commercial robots to pass the Turing test." + "description": "A top of the line luxury model, the Famulus is a humaniform robot, derived from Wraitheon schematics with slight alterations to give it a more human appearance. Designed to be a robotic servant, its AI tailored for the needs of each customer, it is arguably one of the few commercial robots to pass the Turing test." }, { "id": "mon_utilibot_const", @@ -420,7 +420,7 @@ "type": "MONSTER", "copy-from": "mon_skitterbot", "name": "pest hunter", - "description": "A salvaged skitterbot refitted with an 8mm integrated firearm. The robot's small size precludes rapid fire, due to recoil, and requires the use of lightweight caseless ammo.", + "description": "A salvaged skitterbot refitted with an 8mm integrated firearm. The robot's small size precludes rapid-fire, due to recoil, and requires the use of lightweight caseless ammo.", "color": "dark_gray", "aggression": 50, "speed": 200, diff --git a/data/mods/Aftershock/mobs/scavbots.json b/data/mods/Aftershock/mobs/scavbots.json index 285da2c0e3eb1..2f671b48da2a7 100644 --- a/data/mods/Aftershock/mobs/scavbots.json +++ b/data/mods/Aftershock/mobs/scavbots.json @@ -22,7 +22,7 @@ "type": "MONSTER", "name": "floating lantern", "looks_like": "bot_manhack", - "description": "A salvaged drone repurposed into a mobile lightsource.", + "description": "A salvaged drone repurposed into a mobile light source.", "speed": 250, "color": "yellow", "luminance": 100, diff --git a/data/mods/Aftershock/mobs/turrets.json b/data/mods/Aftershock/mobs/turrets.json index dd66f296d7e8c..65da26d926fea 100644 --- a/data/mods/Aftershock/mobs/turrets.json +++ b/data/mods/Aftershock/mobs/turrets.json @@ -3,7 +3,7 @@ "id": "mon_laserturret_xray", "type": "MONSTER", "name": { "str": "x-ray laser turret" }, - "description": "The TX-5LR Cerberus is an upgrade to its predecessors. It features a state of the x-ray laser cannon system with three barrels. Each barrel will fire once and be exhausted until the part can be replaced.", + "description": "The TX-5LR Cerberus is an upgrade to its predecessors. It features a state of the art x-ray laser cannon system with three barrels. Each barrel will fire once and be exhausted until the part can be replaced.", "default_faction": "military", "species": [ "ROBOT" ], "diff": 20, diff --git a/data/mods/Aftershock/mobs/uplifted_monsters.json b/data/mods/Aftershock/mobs/uplifted_monsters.json index 8909083df1e94..952f4e2ab0136 100644 --- a/data/mods/Aftershock/mobs/uplifted_monsters.json +++ b/data/mods/Aftershock/mobs/uplifted_monsters.json @@ -3,7 +3,7 @@ "id": "mon_uplifted_bear", "type": "MONSTER", "name": { "str": "Schwarz Walder" }, - "description": "Schwarz Walders are an uplifted animal originally developed by a German company as forest rangers for the expanded Black Forest Conservation Area. Like all Uplifts they have a human level of intelligence and are indentured laborers to the corporation that grew and raised them, until they reach age of enfranchisement dictated by UICA regulations or they earn their citizenship early. Shortly afterward the creation of the first Schwarz Walders it was determined that they also made excellent long range reconnaissance units that could operate independently indefinitely. This was one of the most popular Uplift models before the Discontinuity, and many frontier planet still retain significant feral and otherwise independent populations. They are skilled marksmen and this one appears to be armed with an smg.", + "description": "Schwarz Walders are an uplifted animal originally developed by a German company as forest rangers for the expanded Black Forest Conservation Area. Like all Uplifts they have a human level of intelligence and are indentured laborers to the corporation that grew and raised them, until they reach age of enfranchisement dictated by UICA regulations or they earn their citizenship early. Shortly afterward the creation of the first Schwarz Walders it was determined that they also made excellent long-range reconnaissance units that could operate independently indefinitely. This was one of the most popular Uplift models before the Discontinuity, and many frontier planets still retain a significant feral and otherwise independent populations. They are skilled marksmen and this one appears to be armed with an smg.", "default_faction": "UPLIFT", "bodytype": "bear", "categories": [ "WILDLIFE" ], @@ -81,7 +81,7 @@ "id": "mon_uplifted_ape", "type": "MONSTER", "name": { "str": "infeme" }, - "description": "The Infeme are uplifted from apes and other near human ancestors. The Zulu word for monkey became the catch-all term for many species of uplifts whether majority chimp, gorilla or baboon. They've probably formed colonies hidden from the Cataclysm.", + "description": "The Infeme are uplifted from apes and other near-human ancestors. The Zulu word for monkey became the catch-all term for many species of uplifts whether majority chimp, gorilla or baboon. Several worlds experienced a series of events similar to the old pre-spaceflight movie series 'Planet of the Apes' during the discontinuity.", "default_faction": "UPLIFT", "bodytype": "human", "species": [ "UPLIFT" ], diff --git a/data/mods/Aftershock/mobs/zombies.json b/data/mods/Aftershock/mobs/zombies.json index 2f73081003b6b..e55f09efa3c56 100644 --- a/data/mods/Aftershock/mobs/zombies.json +++ b/data/mods/Aftershock/mobs/zombies.json @@ -182,7 +182,7 @@ "id": "mon_moxie_scavenger", "type": "MONSTER", "name": { "str": "MoxPhore Scavenger" }, - "description": "A human stands here, towering around 2 meters high. It's flesh is frozen solid, colored black and blue from frostbite. It constantly scratches at its flesh with its claw like hands, surveying the land with frozen and foggy eyes.", + "description": "A human stands here, towering around 2 meters high. Its flesh is frozen solid, colored black and blue from frostbite. It constantly scratches at its flesh with its claw-like hands, surveying the land with frozen and foggy eyes.", "default_faction": "moxie", "bodytype": "human", "species": [ "MOXIE" ], @@ -291,7 +291,7 @@ "id": "mon_moxie_regenerator", "type": "MONSTER", "name": { "str": "MoxPhore Regenerator" }, - "description": "A human stands here, comically thin and scratching It's scar-ridden flesh, any flesh it rips off grows back in seconds.", + "description": "A human stands here, comically thin and scratching its scar-ridden flesh, any flesh it rips off grows back in seconds.", "default_faction": "moxie", "bodytype": "human", "species": [ "MOXIE" ], @@ -340,7 +340,7 @@ "id": "mon_moxie_grabby", "type": "MONSTER", "name": { "str": "MoxPhore Tangler" }, - "description": "A human stands here, several rust-colored limbs jut out of its back, moving around and grabbing at the air while the person looks blankly around…", + "description": "A human stands here, several rust-colored limbs jut out of its back, moving around and grabbing at the air while the person looks blankly around….", "default_faction": "moxie", "bodytype": "human", "species": [ "MOXIE" ], @@ -384,7 +384,7 @@ "id": "mon_human_biomachine", "type": "MONSTER", "name": { "str": "Speaker" }, - "description": "A starfish like creature stands here, covered in black metallic fur as it stands out, pointing in a specific direction.", + "description": "A starfish-like creature stands here, covered in black metallic fur as it stands out, pointing in a specific direction.", "default_faction": "bio_machine", "bodytype": "human", "species": [ "BIOMACHINE" ], @@ -429,7 +429,7 @@ "id": "mon_moxie_elder", "type": "MONSTER", "name": { "str": "MoxPhore Elder" }, - "description": "Numerous claw-like limbs closely wrap around this alien arachnid's head and thorax, forming a protective barrier. Its antennae twitch and writhe, and it seems to grope wildly toward threats", + "description": "Numerous claw-like limbs closely wrap around this alien arachnid's head and thorax, forming a protective barrier. Its antennae twitch and writhe, and it seems to grope wildly toward threats.", "default_faction": "moxie", "bodytype": "human", "species": [ "MOXIE" ], @@ -538,7 +538,7 @@ "id": "mon_moxphore_emetic", "type": "MONSTER", "name": { "str": "Moxphore Emetic" }, - "description": "Unidentifiable walking remains, hunched and wandering in apparent pain. An alien plant peeks meekly from its open mouth, leaking green liquid as its host stumbles.", + "description": "Unidentifiable walking remains, hunched and wandering in apparent pain. An alien plant peeks meekly from its open mouth, leaking green liquid as its host stumbles.", "default_faction": "moxie", "bodytype": "human", "species": [ "MOXIE" ], diff --git a/data/mods/Aftershock/mutations/mutations.json b/data/mods/Aftershock/mutations/mutations.json index 24122b71cf8ab..017b842c5a430 100644 --- a/data/mods/Aftershock/mutations/mutations.json +++ b/data/mods/Aftershock/mutations/mutations.json @@ -597,7 +597,7 @@ "visibility": 3, "ugliness": 2, "mixed_effect": true, - "description": "Your hands have fused into three fingered paws. Fine manipulation is a challenge: permanent hand encumbrance of 10, difficulty with delicate craftwork, and your gloves don't fit. But they handle water better.", + "description": "Your hands have fused into three-fingered paws. Fine manipulation is a challenge: permanent hand encumbrance of 10, difficulty with delicate craftwork, and your gloves don't fit. But they handle water better.", "encumbrance_always": [ [ "hand_l", 10 ], [ "hand_r", 10 ] ], "restricts_gear": [ "hand_l", "hand_r" ], "craft_skill_bonus": [ [ "electronics", -2 ], [ "tailor", -2 ], [ "mechanics", -2 ] ], diff --git a/data/mods/Aftershock/mutations/obsolete.json b/data/mods/Aftershock/mutations/obsolete.json index de26e8af447dc..858a225250764 100644 --- a/data/mods/Aftershock/mutations/obsolete.json +++ b/data/mods/Aftershock/mutations/obsolete.json @@ -68,7 +68,7 @@ "points": -2, "description": "You have problems with eating meat. It's possible for you to eat it, but you will suffer morale penalties and obtain less nutrition from it.", "valid": false, - "vitamins_absorb_multi": [ [ "flesh", [ [ "vitA", 0 ], [ "vitB", 0 ], [ "vitC", 0 ], [ "calcium", 0 ], [ "iron", 0 ] ] ] ], + "vitamins_absorb_multi": [ [ "flesh", [ [ "vitC", 0 ], [ "calcium", 0 ], [ "iron", 0 ] ] ] ], "cancels": [ "CANNIBAL", "MEATARIAN", "ANTIFRUIT" ] }, { diff --git a/data/mods/Aftershock/npcs/cyborg_npcs/backgrounds/bg_traits_cyborg.json b/data/mods/Aftershock/npcs/cyborg_npcs/backgrounds/bg_traits_cyborg.json index 9962fc07f65b3..67253e45bb229 100644 --- a/data/mods/Aftershock/npcs/cyborg_npcs/backgrounds/bg_traits_cyborg.json +++ b/data/mods/Aftershock/npcs/cyborg_npcs/backgrounds/bg_traits_cyborg.json @@ -34,17 +34,5 @@ "purifiable": false, "types": [ "BACKGROUND_SURVIVAL_STORY" ], "flags": [ "BG_SURVIVAL_STORY" ] - }, - { - "type": "mutation", - "id": "BGSS_CYBERNINJA", - "name": { "str": "Survivor Story" }, - "points": 0, - "description": "This NPC could tell you about how they survived the Cataclysm", - "player_display": false, - "valid": false, - "purifiable": false, - "types": [ "BACKGROUND_SURVIVAL_STORY" ], - "flags": [ "BG_SURVIVAL_STORY" ] } ] diff --git a/data/mods/Aftershock/npcs/mutant_npcs/npc_classes_mutant.json b/data/mods/Aftershock/npcs/mutant_npcs/npc_classes_mutant.json deleted file mode 100644 index accfd7bd7275c..0000000000000 --- a/data/mods/Aftershock/npcs/mutant_npcs/npc_classes_mutant.json +++ /dev/null @@ -1,427 +0,0 @@ -[ - { - "type": "npc_class", - "id": "NC_NPC_MUTANT_LIZARD", - "name": "Lizard Mutant", - "job_description": "I'm looking for lizard mutagen… this world is no place for humans anymore, and I don't plan to keep being one.", - "skills": [ - { "skill": "dodge", "bonus": { "rng": [ 3, 6 ] } }, - { "skill": "melee", "bonus": { "rng": [ 3, 6 ] } }, - { "skill": "unarmed", "bonus": { "rng": [ 3, 6 ] } } - ], - "bonus_str": 4, - "bonus_dex": 2, - "traits": [ - { "group": "trait_mutant_npc_common" }, - { "group": "BG_survival_story_MUTANTS" }, - { "group": "trait_group_lizard" }, - { "distribution": [ { "group": "trait_group_lizard_nonthres" }, { "group": "trait_group_lizard_postthres" } ] } - ] - }, - { - "type": "npc_class", - "id": "NC_NPC_MUTANT_MEDICAL", - "name": "Medical Mutant", - "job_description": "I'm looking for medical mutagen… this world is no place for humans anymore, and I don't plan to keep being one.", - "skills": [ - { "skill": "dodge", "bonus": { "rng": [ 3, 6 ] } }, - { "skill": "melee", "bonus": { "rng": [ 3, 6 ] } }, - { "skill": "unarmed", "bonus": { "rng": [ 3, 6 ] } } - ], - "traits": [ - { "group": "trait_mutant_npc_common" }, - { "group": "BG_survival_story_MUTANTS" }, - { "group": "trait_group_medical" }, - { - "distribution": [ { "group": "trait_group_medical_nonthres" }, { "group": "trait_group_medical_postthres" } ] - } - ] - }, - { - "type": "npc_class", - "id": "NC_NPC_MUTANT_BIRD", - "name": "Bird Mutant", - "job_description": "I'm looking for bird mutagen… this world is no place for humans anymore, and I don't plan to keep being one.", - "skills": [ - { "skill": "dodge", "bonus": { "rng": [ 4, 8 ] } }, - { "skill": "melee", "bonus": { "rng": [ 3, 6 ] } }, - { "skill": "unarmed", "bonus": { "rng": [ 3, 6 ] } } - ], - "bonus_dex": 4, - "bonus_per": 7, - "traits": [ - { "group": "trait_mutant_npc_common" }, - { "group": "BG_survival_story_MUTANTS" }, - { "group": "trait_group_bird" }, - { "distribution": [ { "group": "trait_group_bird_nonthres" }, { "group": "trait_group_bird_postthres" } ] } - ] - }, - { - "type": "npc_class", - "id": "NC_NPC_MUTANT_FISH", - "name": "Fish Mutant", - "job_description": "I'm looking for fish mutagen… this world is no place for humans anymore, and I don't plan to keep being one.", - "skills": [ - { "skill": "dodge", "bonus": { "rng": [ 4, 8 ] } }, - { "skill": "melee", "bonus": { "rng": [ 3, 6 ] } }, - { "skill": "unarmed", "bonus": { "rng": [ 3, 6 ] } }, - { "skill": "swimming", "bonus": { "rng": [ 5, 15 ] } } - ], - "bonus_dex": 7, - "traits": [ - { "group": "trait_mutant_npc_common" }, - { "group": "BG_survival_story_MUTANTS" }, - { "group": "trait_group_fish" }, - { "distribution": [ { "group": "trait_group_fish_nonthres" }, { "group": "trait_group_fish_postthres" } ] } - ] - }, - { - "type": "npc_class", - "id": "NC_NPC_MUTANT_BEAST", - "name": "Beast Mutant", - "job_description": "I'm looking for beast mutagen… this world is no place for humans anymore, and I don't plan to keep being one.", - "skills": [ - { "skill": "dodge", "bonus": { "rng": [ 4, 8 ] } }, - { "skill": "melee", "bonus": { "rng": [ 4, 8 ] } }, - { "skill": "unarmed", "bonus": { "rng": [ 4, 8 ] } } - ], - "bonus_str": 7, - "traits": [ - { "group": "trait_mutant_npc_common" }, - { "group": "BG_survival_story_MUTANTS" }, - { "group": "trait_group_beast" }, - { "distribution": [ { "group": "trait_group_beast_nonthres" }, { "group": "trait_group_beast_postthres" } ] } - ] - }, - { - "type": "npc_class", - "id": "NC_NPC_MUTANT_URSINE", - "name": "Ursine Mutant", - "job_description": "I'm looking for ursine mutagen… this world is no place for humans anymore, and I don't plan to keep being one.", - "skills": [ - { "skill": "dodge", "bonus": { "rng": [ 2, 4 ] } }, - { "skill": "melee", "bonus": { "rng": [ 3, 6 ] } }, - { "skill": "unarmed", "bonus": { "rng": [ 3, 6 ] } } - ], - "bonus_str": 11, - "traits": [ - { "group": "trait_mutant_npc_common" }, - { "group": "BG_survival_story_MUTANTS" }, - { "group": "trait_group_ursine" }, - { "distribution": [ { "group": "trait_group_ursine_nonthres" }, { "group": "trait_group_ursine_postthres" } ] } - ] - }, - { - "type": "npc_class", - "id": "NC_NPC_MUTANT_FELINE", - "name": "Feline Mutant", - "job_description": "I'm looking for feline mutagen… this world is no place for humans anymore, and I don't plan to keep being one.", - "skills": [ - { "skill": "dodge", "bonus": { "rng": [ 3, 6 ] } }, - { "skill": "melee", "bonus": { "rng": [ 3, 6 ] } }, - { "skill": "unarmed", "bonus": { "rng": [ 3, 6 ] } } - ], - "bonus_dex": 4, - "traits": [ - { "group": "trait_mutant_npc_common" }, - { "group": "BG_survival_story_MUTANTS" }, - { "group": "trait_group_feline" }, - { "distribution": [ { "group": "trait_group_feline_nonthres" }, { "group": "trait_group_feline_postthres" } ] } - ] - }, - { - "type": "npc_class", - "id": "NC_NPC_MUTANT_LUPINE", - "name": "Lupine Mutant", - "job_description": "I'm looking for lupine mutagen… this world is no place for humans anymore, and I don't plan to keep being one.", - "skills": [ - { "skill": "dodge", "bonus": { "rng": [ 3, 6 ] } }, - { "skill": "melee", "bonus": { "rng": [ 3, 6 ] } }, - { "skill": "unarmed", "bonus": { "rng": [ 3, 6 ] } } - ], - "bonus_str": 4, - "traits": [ - { "group": "trait_mutant_npc_common" }, - { "group": "trait_group_lupine" }, - { "group": "BG_survival_story_MUTANTS" }, - { "distribution": [ { "group": "trait_group_lupine_nonthres" }, { "group": "trait_group_lupine_postthres" } ] } - ] - }, - { - "type": "npc_class", - "id": "NC_NPC_MUTANT_CATTLE", - "name": "Cattle Mutant", - "job_description": "I'm looking for cattle mutagen… this world is no place for humans anymore, and I don't plan to keep being one.", - "skills": [ - { "skill": "dodge", "bonus": { "rng": [ 2, 4 ] } }, - { "skill": "melee", "bonus": { "rng": [ 3, 6 ] } }, - { "skill": "unarmed", "bonus": { "rng": [ 3, 6 ] } } - ], - "bonus_str": 6, - "traits": [ - { "group": "trait_mutant_npc_common" }, - { "group": "BG_survival_story_MUTANTS" }, - { "group": "trait_group_cattle" }, - { "distribution": [ { "group": "trait_group_cattle_nonthres" }, { "group": "trait_group_cattle_postthres" } ] } - ] - }, - { - "type": "npc_class", - "id": "NC_NPC_MUTANT_INSECT", - "name": "Insect Mutant", - "job_description": "I'm looking for insect mutagen… this world is no place for humans anymore, and I don't plan to keep being one.", - "skills": [ - { "skill": "dodge", "bonus": { "rng": [ 3, 6 ] } }, - { "skill": "melee", "bonus": { "rng": [ 3, 6 ] } }, - { "skill": "unarmed", "bonus": { "rng": [ 3, 6 ] } } - ], - "bonus_str": 1, - "bonus_dex": 1, - "traits": [ - { "group": "trait_mutant_npc_common" }, - { "group": "BG_survival_story_MUTANTS" }, - { "group": "trait_group_insect" }, - { "distribution": [ { "group": "trait_group_insect_nonthres" }, { "group": "trait_group_insect_postthres" } ] } - ] - }, - { - "type": "npc_class", - "id": "NC_NPC_MUTANT_PLANT", - "name": "Plant Mutant", - "job_description": "I'm looking for plant mutagen… this world is no place for humans anymore, and I don't plan to keep being one.", - "skills": [ - { "skill": "dodge", "bonus": { "rng": [ 2, 4 ] } }, - { "skill": "melee", "bonus": { "rng": [ 3, 6 ] } }, - { "skill": "unarmed", "bonus": { "rng": [ 3, 6 ] } } - ], - "bonus_str": 2, - "traits": [ - { "group": "trait_mutant_npc_common" }, - { "group": "BG_survival_story_MUTANTS" }, - { "group": "trait_group_plant" }, - { "distribution": [ { "group": "trait_group_plant_nonthres" }, { "group": "trait_group_plant_postthres" } ] } - ] - }, - { - "type": "npc_class", - "id": "NC_NPC_MUTANT_SLIME", - "name": "Slime Mutant", - "job_description": "I'm looking for slime mutagen… this world is no place for humans anymore, and I don't plan to keep being one.", - "skills": [ - { "skill": "dodge", "bonus": { "rng": [ 2, 4 ] } }, - { "skill": "melee", "bonus": { "rng": [ 2, 4 ] } }, - { "skill": "unarmed", "bonus": { "rng": [ 2, 4 ] } } - ], - "bonus_str": -4, - "bonus_dex": 5, - "bonus_int": 10, - "bonus_per": 5, - "traits": [ - { "group": "trait_mutant_npc_common" }, - { "group": "BG_survival_story_MUTANTS" }, - { "group": "trait_group_slime" }, - { "distribution": [ { "group": "trait_group_slime_nonthres" }, { "group": "trait_group_slime_postthres" } ] } - ] - }, - { - "type": "npc_class", - "id": "NC_NPC_MUTANT_TROGLOBITE", - "name": "Troglobite Mutant", - "job_description": "I'm looking for troglobite mutagen… this world is no place for humans anymore, and I don't plan to keep being one.", - "skills": [ - { "skill": "dodge", "bonus": { "rng": [ 2, 4 ] } }, - { "skill": "melee", "bonus": { "rng": [ 4, 8 ] } }, - { "skill": "unarmed", "bonus": { "rng": [ 4, 8 ] } } - ], - "bonus_str": 6, - "bonus_dex": -2, - "traits": [ - { "group": "trait_mutant_npc_common" }, - { "group": "BG_survival_story_MUTANTS" }, - { "group": "trait_group_troglobite" }, - { - "distribution": [ { "group": "trait_group_troglobite_nonthres" }, { "group": "trait_group_troglobite_postthres" } ] - } - ] - }, - { - "type": "npc_class", - "id": "NC_NPC_MUTANT_CEPHALOPOD", - "name": "Cephalopod Mutant", - "job_description": "I'm looking for cephalopod mutagen… this world is no place for humans anymore, and I don't plan to keep being one.", - "skills": [ - { "skill": "dodge", "bonus": { "rng": [ 3, 6 ] } }, - { "skill": "melee", "bonus": { "rng": [ 2, 4 ] } }, - { "skill": "unarmed", "bonus": { "rng": [ 2, 4 ] } }, - { "skill": "swimming", "bonus": { "rng": [ 3, 6 ] } } - ], - "bonus_dex": 7, - "bonus_int": 7, - "traits": [ - { "group": "trait_mutant_npc_common" }, - { "group": "BG_survival_story_MUTANTS" }, - { "group": "trait_group_cephalopod" }, - { - "distribution": [ { "group": "trait_group_cephalopod_nonthres" }, { "group": "trait_group_cephalopod_postthres" } ] - } - ] - }, - { - "type": "npc_class", - "id": "NC_NPC_MUTANT_SPIDER", - "name": "Spider Mutant", - "job_description": "I'm looking for spider mutagen… this world is no place for humans anymore, and I don't plan to keep being one.", - "skills": [ - { "skill": "dodge", "bonus": { "rng": [ 3, 6 ] } }, - { "skill": "melee", "bonus": { "rng": [ 3, 6 ] } }, - { "skill": "unarmed", "bonus": { "rng": [ 3, 6 ] } } - ], - "bonus_dex": 2, - "traits": [ - { "group": "trait_mutant_npc_common" }, - { "group": "BG_survival_story_MUTANTS" }, - { "group": "trait_group_spider" }, - { "distribution": [ { "group": "trait_group_spider_nonthres" }, { "group": "trait_group_spider_postthres" } ] } - ] - }, - { - "type": "npc_class", - "id": "NC_NPC_MUTANT_RAT", - "name": "Rat Mutant", - "job_description": "I'm looking for rat mutagen… this world is no place for humans anymore, and I don't plan to keep being one.", - "skills": [ - { "skill": "dodge", "bonus": { "rng": [ 3, 6 ] } }, - { "skill": "melee", "bonus": { "rng": [ 3, 6 ] } }, - { "skill": "unarmed", "bonus": { "rng": [ 3, 6 ] } } - ], - "traits": [ - { "group": "trait_mutant_npc_common" }, - { "group": "BG_survival_story_MUTANTS" }, - { "group": "trait_group_rat" }, - { "distribution": [ { "group": "trait_group_rat_nonthres" }, { "group": "trait_group_rat_postthres" } ] } - ] - }, - { - "type": "npc_class", - "id": "NC_NPC_MUTANT_MOUSE", - "name": "Mouse Mutant", - "job_description": "I'm looking for mouse mutagen… this world is no place for humans anymore, and I don't plan to keep being one.", - "skills": [ - { "skill": "dodge", "bonus": { "rng": [ 4, 7 ] } }, - { "skill": "melee", "bonus": { "rng": [ 2, 5 ] } }, - { "skill": "unarmed", "bonus": { "rng": [ 2, 5 ] } } - ], - "bonus_dex": 6, - "traits": [ - { "group": "trait_mutant_npc_common" }, - { "group": "BG_survival_story_MUTANTS" }, - { "group": "trait_group_mouse" }, - { "distribution": [ { "group": "trait_group_mouse_nonthres" }, { "group": "trait_group_mouse_postthres" } ] } - ] - }, - { - "type": "npc_class", - "id": "NC_NPC_MUTANT_ALPHA", - "name": "Alpha Mutant", - "job_description": "I'm looking for alpha mutagen… this world is no place for humans anymore, and I don't plan to keep being one.", - "skills": [ - { "skill": "dodge", "bonus": { "rng": [ 3, 6 ] } }, - { "skill": "melee", "bonus": { "rng": [ 3, 6 ] } }, - { "skill": "unarmed", "bonus": { "rng": [ 3, 6 ] } } - ], - "bonus_str": 5, - "bonus_dex": 5, - "bonus_int": 5, - "bonus_per": 5, - "traits": [ - { "group": "trait_mutant_npc_common" }, - { "group": "BG_survival_story_MUTANTS" }, - { "group": "trait_group_alpha" }, - { "distribution": [ { "group": "trait_group_alpha_nonthres" }, { "group": "trait_group_alpha_postthres" } ] } - ] - }, - { - "type": "npc_class", - "id": "NC_NPC_MUTANT_ELFA", - "name": "Elfa Mutant", - "job_description": "I'm looking for elfa mutagen… this world is no place for humans anymore, and I don't plan to keep being one.", - "skills": [ - { "skill": "dodge", "bonus": { "rng": [ 4, 8 ] } }, - { "skill": "melee", "bonus": { "rng": [ 2, 4 ] } }, - { "skill": "unarmed", "bonus": { "rng": [ 2, 4 ] } } - ], - "bonus_str": 1, - "bonus_dex": 5, - "bonus_int": 4, - "bonus_per": 4, - "traits": [ - { "group": "trait_mutant_npc_common" }, - { "group": "BG_survival_story_MUTANTS" }, - { "group": "trait_group_elfa" }, - { "distribution": [ { "group": "trait_group_elfa_nonthres" }, { "group": "trait_group_elfa_postthres" } ] } - ] - }, - { - "type": "npc_class", - "id": "NC_NPC_MUTANT_CHIMERA", - "name": "Chimera Mutant", - "job_description": "I'm looking for chimera mutagen… this world is no place for humans anymore, and I don't plan to keep being one.", - "skills": [ - { "skill": "dodge", "bonus": { "rng": [ 4, 8 ] } }, - { "skill": "melee", "bonus": { "rng": [ 4, 8 ] } }, - { "skill": "unarmed", "bonus": { "rng": [ 4, 8 ] } } - ], - "bonus_str": 4, - "bonus_dex": 2, - "bonus_per": 2, - "traits": [ - { "group": "trait_mutant_npc_common" }, - { "group": "BG_survival_story_MUTANTS" }, - { "group": "trait_group_chimera" }, - { - "distribution": [ { "group": "trait_group_chimera_nonthres" }, { "group": "trait_group_chimera_postthres" } ] - } - ] - }, - { - "type": "npc_class", - "id": "NC_NPC_MUTANT_RAPTOR", - "name": "Raptor Mutant", - "job_description": "I'm looking for raptor mutagen… this world is no place for humans anymore, and I don't plan to keep being one.", - "skills": [ - { "skill": "dodge", "bonus": { "rng": [ 6, 10 ] } }, - { "skill": "melee", "bonus": { "rng": [ 6, 10 ] } }, - { "skill": "unarmed", "bonus": { "rng": [ 6, 10 ] } } - ], - "bonus_str": 1, - "bonus_dex": 2, - "bonus_per": 4, - "traits": [ - { "group": "trait_mutant_npc_common" }, - { "group": "BG_survival_story_MUTANTS" }, - { "group": "trait_group_raptor" }, - { "distribution": [ { "group": "trait_group_raptor_nonthres" }, { "group": "trait_group_raptor_postthres" } ] }, - { "group": "trait_group_raptor" }, - { "distribution": [ { "group": "trait_group_raptor_nonthres" }, { "group": "trait_group_raptor_postthres" } ] } - ] - }, - { - "type": "npc_class", - "id": "NC_NPC_MUTANT_MASTODON", - "name": "Mastodon Uplift", - "job_description": "Humans created me. Let's see what I can be on my own.", - "skills": [ - { "skill": "survival", "bonus": { "rng": [ 2, 4 ] } }, - { "skill": "melee", "bonus": { "rng": [ 6, 10 ] } }, - { "skill": "unarmed", "bonus": { "rng": [ 6, 10 ] } } - ], - "bonus_str": 3, - "traits": [ - { "group": "trait_mutant_npc_common" }, - { "group": "trait_group_mastodon" }, - { - "distribution": [ { "group": "trait_group_mastodon_nonthres" }, { "group": "trait_group_mastodon_postthres" } ] - } - ] - } -] diff --git a/data/mods/Aftershock/vehicles/part_items.json b/data/mods/Aftershock/vehicles/part_items.json index b91af0ac643fe..ba9ed78510214 100644 --- a/data/mods/Aftershock/vehicles/part_items.json +++ b/data/mods/Aftershock/vehicles/part_items.json @@ -43,7 +43,7 @@ "type": "GENERIC", "id": "solar_panel_v3", "name": "quantum solar panel", - "description": "This solar panel is obviously cutting-edge technology and given where you found it, should probably provide a LOT of power. It's covered in strange-looking material, but the covering looks rather fragile; it doesn't look like it could support a reinforcing sheet, either.", + "description": "This solar panel is obviously cutting-edge technology and given where you found it, it should probably provide a LOT of power. It's covered in strange-looking material, but the covering looks rather fragile; it doesn't look like it could support a reinforcing sheet, either.", "to_hit": -5, "material": [ "glass", "steel" ], "volume": "4500 ml", diff --git a/data/mods/Aftershock/vehicles/vehicle_parts.json b/data/mods/Aftershock/vehicles/vehicle_parts.json index c65dd74eff96c..daa21efd718f7 100644 --- a/data/mods/Aftershock/vehicles/vehicle_parts.json +++ b/data/mods/Aftershock/vehicles/vehicle_parts.json @@ -10,7 +10,7 @@ "looks_like": "trunk", "location": "center", "durability": 200, - "description": "This is little more than a sheetmetal basin welded to the bottom of the vehicle, extending below it. Though it holds a lot of stuff, its shoddiness makes it fragile.", + "description": "This is little more than a sheet metal basin welded to the bottom of the vehicle, extending below it. Though it holds a lot of stuff, its shoddiness makes it fragile.", "size": 600, "breaks_into": [ { "item": "steel_lump", "count": [ 4, 6 ] }, { "item": "scrap", "count": [ 4, 6 ] } ] }, @@ -325,7 +325,7 @@ "proportional": { "epower": 6.0 }, "item": "solar_panel_v3", "durability": 40, - "description": "An extremely high performance solar panel. Will recharge the vehicle's electrical power when exposed to the sun. Clouds will slow the recharge speed. Extremely fragile and cannot be armored.", + "description": "An extremely high-performance solar panel. Will recharge the vehicle's electrical power when exposed to the sun. Clouds will slow the recharge speed. Extremely fragile and cannot be armored.", "requirements": { "install": { "skills": [ [ "mechanics", 8 ] ], "time": "60 m", "using": [ [ "vehicle_wrench_2", 1 ] ] }, "removal": { "skills": [ [ "mechanics", 6 ] ], "time": "30 m", "using": [ [ "vehicle_wrench_2", 1 ] ] } diff --git a/data/mods/CRT_EXPANSION/items/crt_armor.json b/data/mods/CRT_EXPANSION/items/crt_armor.json index fedefa62b6778..88fa4b4a4c229 100644 --- a/data/mods/CRT_EXPANSION/items/crt_armor.json +++ b/data/mods/CRT_EXPANSION/items/crt_armor.json @@ -94,8 +94,8 @@ "id": "crt_chestrig", "copy-from": "chestrig", "type": "ARMOR", - "name": "CRIT chestrig", - "description": "A slightly modified chestrig, has mesh and MOLLE loops for gear and slots with light-armor padding.", + "name": "CRIT chest rig", + "description": "A slightly modified chest rig, has mesh and MOLLE loops for gear and slots with light-armor padding.", "color": "dark_gray", "material": [ "kevlar", "plastic" ], "flags": [ "STURDY", "WATER_FRIENDLY", "ALLOWS_NATURAL_ATTACKS" ] diff --git a/data/mods/CRT_EXPANSION/martial/crt_gun_techniques.json b/data/mods/CRT_EXPANSION/martial/crt_gun_techniques.json index 9acc3d4967e6a..8006395a80a0f 100644 --- a/data/mods/CRT_EXPANSION/martial/crt_gun_techniques.json +++ b/data/mods/CRT_EXPANSION/martial/crt_gun_techniques.json @@ -15,28 +15,5 @@ "stun_dur": 2, "messages": [ "Your pistol whip sends %s careening", " smacks %s" ], "description": "95% moves, 88% Bash, 66% Cut, 66% Stab, Down two turns, STR (C) greatly reduces action cost" - }, - { - "type": "technique", - "id": "INERTIAL", - "name": "Crowd Control", - "skill_requirements": [ { "name": "melee", "level": 2 } ], - "melee_allowed": true, - "knockback_dist": 1, - "mult_bonuses": [ - { "stat": "movecost", "scale": 0.6 }, - { "stat": "damage", "type": "bash", "scale": 0.5 }, - { "stat": "damage", "type": "cut", "scale": 0.5 }, - { "stat": "damage", "type": "stab", "scale": 0.5 } - ], - "flat_bonuses": [ - { "stat": "movecost", "scaling-stat": "str", "scale": -1.0 }, - { "stat": "damage", "type": "bash", "scaling-stat": "per", "scale": 0.15 }, - { "stat": "damage", "type": "stab", "scaling-stat": "per", "scale": 0.1 }, - { "stat": "damage", "type": "cut", "scaling-stat": "per", "scale": 0.1 } - ], - "messages": [ "Your swing the stock of your weapon at %s", " strikes at %s" ], - "aoe": "wide", - "description": "60% moves, 50% damage, wide arc, STR (S) dramatically reduces action cost, and adds a (C) damage bonus, min 4 melee" } ] diff --git a/data/mods/CRT_EXPANSION/martial/generaltechn.json b/data/mods/CRT_EXPANSION/martial/generaltechn.json index 43a42599a717e..b031c90d7c6c5 100644 --- a/data/mods/CRT_EXPANSION/martial/generaltechn.json +++ b/data/mods/CRT_EXPANSION/martial/generaltechn.json @@ -17,9 +17,8 @@ { "type": "technique", "id": "INERTIAL", - "name": "INERTIAL SWING", - "skill_requirements": [ { "name": "melee", "level": 4 } ], - "unarmed_allowed": true, + "name": "Crowd Control", + "skill_requirements": [ { "name": "melee", "level": 2 } ], "melee_allowed": true, "knockback_dist": 1, "mult_bonuses": [ @@ -30,13 +29,13 @@ ], "flat_bonuses": [ { "stat": "movecost", "scaling-stat": "str", "scale": -1.0 }, - { "stat": "damage", "type": "bash", "scaling-stat": "str", "scale": 0.1 }, - { "stat": "damage", "type": "stab", "scaling-stat": "str", "scale": 0.1 }, - { "stat": "damage", "type": "cut", "scaling-stat": "str", "scale": 0.1 } + { "stat": "damage", "type": "bash", "scaling-stat": "per", "scale": 0.15 }, + { "stat": "damage", "type": "stab", "scaling-stat": "per", "scale": 0.1 }, + { "stat": "damage", "type": "cut", "scaling-stat": "per", "scale": 0.1 } ], - "messages": [ "Your momentum causes your weapon to glance off of %s", " inertially strikes %s" ], + "messages": [ "Your swing the stock of your weapon at %s", " strikes at %s" ], "aoe": "wide", - "description": "75% AP, 60% DMG, WIDE AOE, STR (S) reduces AP cost, and adds a (C) DMG, melee (4)" + "description": "60% moves, 50% damage, wide arc, STR (S) dramatically reduces action cost, and adds a (C) damage bonus, min 4 melee" }, { "type": "technique", diff --git a/data/mods/Dark-Skies-Above/overrides/professions.json b/data/mods/Dark-Skies-Above/overrides/professions.json index c43470a33a026..bb910ff358582 100644 --- a/data/mods/Dark-Skies-Above/overrides/professions.json +++ b/data/mods/Dark-Skies-Above/overrides/professions.json @@ -146,13 +146,6 @@ "name": { "male": "Paperboy", "female": "Papergirl" }, "description": "You set out this morning to deliver the news of the apocalypse. The aliens don't seem to value the latest news, but at least your trusty bicycle is still in working order." }, - { - "type": "profession", - "id": "labtech", - "copy-from": "labtech", - "name": "Lab Technician", - "description": "Thanks to years of study and hard work in the lab, you're familiar with the basics of scientific inquiry. Only one question remains: can you avoid getting experimented on in return?" - }, { "type": "profession", "id": "national_guard", diff --git a/data/mods/Graphical_Overmap/go_overmap_terrain_hardcoded.json b/data/mods/Graphical_Overmap/go_overmap_terrain_hardcoded.json index 578d88f3519a2..e61cb1570053f 100644 --- a/data/mods/Graphical_Overmap/go_overmap_terrain_hardcoded.json +++ b/data/mods/Graphical_Overmap/go_overmap_terrain_hardcoded.json @@ -83,18 +83,6 @@ "copy-from": "mine_shaft_lower", "sym": "\u00D3" }, - { - "type": "overmap_terrain", - "id": "mine_shaft_middle", - "copy-from": "mine_shaft_middle", - "sym": "\u00D3" - }, - { - "type": "overmap_terrain", - "id": "mine_shaft_lower", - "copy-from": "mine_shaft_lower", - "sym": "\u00D3" - }, { "type": "overmap_terrain", "id": "mine", diff --git a/data/mods/Graphical_Overmap/go_overmap_terrain_military.json b/data/mods/Graphical_Overmap/go_overmap_terrain_military.json index 865e19e63d208..42200fcc25b4a 100644 --- a/data/mods/Graphical_Overmap/go_overmap_terrain_military.json +++ b/data/mods/Graphical_Overmap/go_overmap_terrain_military.json @@ -55,13 +55,6 @@ "sym": "\u00C5", "color": "white" }, - { - "type": "overmap_terrain", - "id": "FEMA_le", - "copy-from": "FEMA_le", - "sym": "\u00C5", - "color": "white" - }, { "type": "overmap_terrain", "id": "FEMA_blc", diff --git a/data/mods/Graphical_Overmap/go_overmap_terrain_recreational.json b/data/mods/Graphical_Overmap/go_overmap_terrain_recreational.json index 2b51bfe473897..07848216cae86 100644 --- a/data/mods/Graphical_Overmap/go_overmap_terrain_recreational.json +++ b/data/mods/Graphical_Overmap/go_overmap_terrain_recreational.json @@ -1211,13 +1211,6 @@ "sym": "\u00F8", "color": "white" }, - { - "type": "overmap_terrain", - "id": "cs_public_space", - "copy-from": "cs_public_space", - "sym": "\u00EE", - "color": "white" - }, { "type": "overmap_terrain", "id": "lake_dock_small", diff --git a/data/mods/Magiclysm/Spells/debug.json b/data/mods/Magiclysm/Spells/debug.json index 02fd4b51ee7bc..d597f097e3b76 100644 --- a/data/mods/Magiclysm/Spells/debug.json +++ b/data/mods/Magiclysm/Spells/debug.json @@ -42,6 +42,24 @@ "//7": "Learn spells by adding map of 'spell_id': 'level' ", "learn_spells": { "create_atomic_light": 1, "megablast": 2 } }, + { + "type": "SPELL", + "id": "debug_inaccurate", + "name": "debug inaccurate spell", + "description": "This spell is less accurate.", + "valid_targets": [ "hostile" ], + "effect": "attack", + "shape": "blast", + "damage_type": "pure", + "min_damage": 80, + "max_damage": 80, + "min_accuracy": -10, + "max_accuracy": 10, + "accuracy_increment": 1, + "min_range": 20, + "max_range": 20, + "max_level": 20 + }, { "type": "SPELL", "id": "debug_push_basic", diff --git a/data/mods/Magiclysm/items/comestibles.json b/data/mods/Magiclysm/items/comestibles.json index e7b113ba7df07..27ce03986cc87 100644 --- a/data/mods/Magiclysm/items/comestibles.json +++ b/data/mods/Magiclysm/items/comestibles.json @@ -19,7 +19,7 @@ "fun": -18, "flags": [ "FREEZERBURN" ], "rot_spawn": "GROUP_EGG_OWLBEAR", - "vitamins": [ [ "vitA", 360 ], [ "calcium", 120 ], [ "iron", 160 ], [ "vitB", 840 ] ], + "vitamins": [ [ "calcium", 120 ], [ "iron", 160 ] ], "rot_spawn_chance": 80, "//": "Alchemically speaking, I see this egg as having the elements of Growth, Stone, and Egg. Growth would make things grow faster, the simplest example being a magical liquid fertilizer. Stone would be a defensive element, used in creating something like a potion of stoneskin. Egg would be interesting though. What if instead of being imbibed there were potions that instead functioned similarly to the sourdough items, or the blob vehicle parts, in that they take a gestation period and then you could activate them and have a new item pop out. Creatures sure but especially biomancers could have temporarily-lived tools, weapons, and armor." }, diff --git a/data/mods/Magiclysm/mutations/debug_mutations.json b/data/mods/Magiclysm/mutations/debug_mutations.json new file mode 100644 index 0000000000000..2adc19cbe21c7 --- /dev/null +++ b/data/mods/Magiclysm/mutations/debug_mutations.json @@ -0,0 +1,17 @@ +[ + { + "type": "mutation", + "id": "DEBUG_MANA", + "name": { "str": "Debug Mana" }, + "points": 99, + "valid": false, + "description": "To cast bug killing spells.", + "debug": true, + "enchantments": [ + { + "condition": "ALWAYS", + "values": [ { "value": "MAX_MANA", "add": 500000 }, { "value": "REGEN_MANA", "multiply": 1000 } ] + } + ] + } +] diff --git a/data/mods/Magiclysm/mutations/mutations.json b/data/mods/Magiclysm/mutations/mutations.json index f4fa16663346f..fdb8bdc09700b 100644 --- a/data/mods/Magiclysm/mutations/mutations.json +++ b/data/mods/Magiclysm/mutations/mutations.json @@ -381,7 +381,7 @@ "prereqs": [ "NAUSEA" ], "category": [ "DRAGON_BLACK", "SLIME" ], "metabolism_modifier": 0.5, - "vitamins_absorb_multi": [ [ "all", [ [ "vitA", 0.5 ], [ "vitB", 0.5 ], [ "vitC", 0.5 ], [ "calcium", 0.5 ], [ "iron", 0.5 ] ] ] ] + "vitamins_absorb_multi": [ [ "all", [ [ "vitC", 0.5 ], [ "calcium", 0.5 ], [ "iron", 0.5 ] ] ] ] }, { "type": "mutation", diff --git a/data/mods/Magiclysm/ter_fur_transform/ter_fur_transform.json b/data/mods/Magiclysm/ter_fur_transform/ter_fur_transform.json index 48fb703a70eb1..9f63bb18286a9 100644 --- a/data/mods/Magiclysm/ter_fur_transform/ter_fur_transform.json +++ b/data/mods/Magiclysm/ter_fur_transform/ter_fur_transform.json @@ -2,7 +2,6 @@ { "type": "ter_furn_transform", "id": "move_earth", - "fail_message": "The earth here does not listen to your command to move.", "terrain": [ { "result": "t_hole", "valid_terrain": [ "t_pit", "t_slope_down" ], "message": "The pit has deepened further." }, { diff --git a/data/mods/My_Sweet_Cataclysm/sweet_mutations.json b/data/mods/My_Sweet_Cataclysm/sweet_mutations.json index 6cf1e1159746b..cde5f15fa76d9 100644 --- a/data/mods/My_Sweet_Cataclysm/sweet_mutations.json +++ b/data/mods/My_Sweet_Cataclysm/sweet_mutations.json @@ -32,7 +32,7 @@ "can_only_eat": [ "junk", "sugar", "honey" ], "can_only_heal_with": [ "caramel_ointement" ], "description": "You are literally made of sugar.", - "vitamin_rates": [ [ "vitC", -900 ], [ "vitB", -900 ], [ "vitA", -900 ], [ "iron", -900 ], [ "calcium", -900 ] ], + "vitamin_rates": [ [ "vitC", -900 ], [ "iron", -900 ], [ "calcium", -900 ] ], "starting_trait": true, "healing_awake": 0.0, "healing_resting": -1.0, diff --git a/data/mods/TEST_DATA/items.json b/data/mods/TEST_DATA/items.json index ac9320bf24aa3..08e83685888af 100644 --- a/data/mods/TEST_DATA/items.json +++ b/data/mods/TEST_DATA/items.json @@ -1107,7 +1107,7 @@ "coverage": 100, "covers": [ "torso" ], "material": [ - { "type": "tempered_steel", "covered_by_mat": 95, "thickness": 1 }, + { "type": "qt_steel", "covered_by_mat": 95, "thickness": 1 }, { "type": "cotton", "covered_by_mat": 100, "thickness": 1 }, { "type": "hardsteel", "covered_by_mat": 5, "thickness": 1 } ], @@ -1247,7 +1247,7 @@ "fun": 10, "flags": [ "FREEZERBURN", "SMOKABLE" ], "smoking_result": "dry_fruit", - "vitamins": [ [ "vitA", 2 ], [ "vitC", 14 ], [ "iron", 1 ] ] + "vitamins": [ [ "vitC", 14 ], [ "iron", 1 ] ] }, { "id": "test_egg", @@ -1271,7 +1271,7 @@ "//": "Omitting the RAW flag so calories will be taken at face value.", "flags": [ "FREEZERBURN" ], "rot_spawn": "GROUP_EGG_BIRD_WILD", - "vitamins": [ [ "vitA", 9 ], [ "calcium", 3 ], [ "iron", 4 ], [ "vitB", 21 ] ], + "vitamins": [ [ "calcium", 3 ], [ "iron", 4 ] ], "rot_spawn_chance": 50 }, { @@ -2033,7 +2033,7 @@ "volume": "250 ml", "phase": "liquid", "flags": [ "EATEN_COLD" ], - "vitamins": [ [ "vitA", 10 ], [ "vitB", 6 ], [ "vitC", 4 ], [ "calcium", 25 ] ], + "vitamins": [ [ "vitC", 4 ], [ "calcium", 25 ] ], "fun": 1 }, { @@ -2391,16 +2391,16 @@ "encumbrance": [ 12, 25 ], "material": [ { "type": "cotton", "covered_by_mat": 100, "thickness": 1 }, - { "type": "steel", "covered_by_mat": 80, "thickness": 0.1 }, - { "type": "steel", "covered_by_mat": 80, "thickness": 0.1 }, - { "type": "steel", "covered_by_mat": 80, "thickness": 0.1 }, - { "type": "steel", "covered_by_mat": 80, "thickness": 0.1 }, - { "type": "steel", "covered_by_mat": 80, "thickness": 0.1 }, - { "type": "steel", "covered_by_mat": 80, "thickness": 0.1 }, - { "type": "steel", "covered_by_mat": 80, "thickness": 0.1 }, - { "type": "steel", "covered_by_mat": 80, "thickness": 0.1 }, - { "type": "steel", "covered_by_mat": 80, "thickness": 0.1 }, - { "type": "steel", "covered_by_mat": 80, "thickness": 0.1 } + { "type": "steel", "covered_by_mat": 50, "thickness": 1 }, + { "type": "steel", "covered_by_mat": 50, "thickness": 1 }, + { "type": "steel", "covered_by_mat": 50, "thickness": 1 }, + { "type": "steel", "covered_by_mat": 50, "thickness": 1 }, + { "type": "steel", "covered_by_mat": 50, "thickness": 1 }, + { "type": "steel", "covered_by_mat": 50, "thickness": 1 }, + { "type": "steel", "covered_by_mat": 50, "thickness": 1 }, + { "type": "steel", "covered_by_mat": 50, "thickness": 1 }, + { "type": "steel", "covered_by_mat": 50, "thickness": 1 }, + { "type": "steel", "covered_by_mat": 50, "thickness": 1 } ] }, { @@ -2409,16 +2409,16 @@ "encumbrance": [ 12, 25 ], "material": [ { "type": "cotton", "covered_by_mat": 100, "thickness": 1 }, - { "type": "steel", "covered_by_mat": 80, "thickness": 0.1 }, - { "type": "steel", "covered_by_mat": 80, "thickness": 0.1 }, - { "type": "steel", "covered_by_mat": 80, "thickness": 0.1 }, - { "type": "steel", "covered_by_mat": 80, "thickness": 0.1 }, - { "type": "steel", "covered_by_mat": 80, "thickness": 0.1 }, - { "type": "steel", "covered_by_mat": 80, "thickness": 0.1 }, - { "type": "steel", "covered_by_mat": 80, "thickness": 0.1 }, - { "type": "steel", "covered_by_mat": 80, "thickness": 0.1 }, - { "type": "steel", "covered_by_mat": 80, "thickness": 0.1 }, - { "type": "steel", "covered_by_mat": 80, "thickness": 0.1 } + { "type": "steel", "covered_by_mat": 50, "thickness": 1 }, + { "type": "steel", "covered_by_mat": 50, "thickness": 1 }, + { "type": "steel", "covered_by_mat": 50, "thickness": 1 }, + { "type": "steel", "covered_by_mat": 50, "thickness": 1 }, + { "type": "steel", "covered_by_mat": 50, "thickness": 1 }, + { "type": "steel", "covered_by_mat": 50, "thickness": 1 }, + { "type": "steel", "covered_by_mat": 50, "thickness": 1 }, + { "type": "steel", "covered_by_mat": 50, "thickness": 1 }, + { "type": "steel", "covered_by_mat": 50, "thickness": 1 }, + { "type": "steel", "covered_by_mat": 50, "thickness": 1 } ] }, { @@ -2427,16 +2427,51 @@ "encumbrance": [ 12, 25 ], "material": [ { "type": "cotton", "covered_by_mat": 100, "thickness": 1 }, - { "type": "steel", "covered_by_mat": 80, "thickness": 0.1 }, - { "type": "steel", "covered_by_mat": 80, "thickness": 0.1 }, - { "type": "steel", "covered_by_mat": 80, "thickness": 0.1 }, - { "type": "steel", "covered_by_mat": 80, "thickness": 0.1 }, - { "type": "steel", "covered_by_mat": 80, "thickness": 0.1 }, - { "type": "steel", "covered_by_mat": 80, "thickness": 0.1 }, - { "type": "steel", "covered_by_mat": 80, "thickness": 0.1 }, - { "type": "steel", "covered_by_mat": 80, "thickness": 0.1 }, - { "type": "steel", "covered_by_mat": 80, "thickness": 0.1 }, - { "type": "steel", "covered_by_mat": 80, "thickness": 0.1 } + { "type": "steel", "covered_by_mat": 50, "thickness": 1 }, + { "type": "steel", "covered_by_mat": 50, "thickness": 1 }, + { "type": "steel", "covered_by_mat": 50, "thickness": 1 }, + { "type": "steel", "covered_by_mat": 50, "thickness": 1 }, + { "type": "steel", "covered_by_mat": 50, "thickness": 1 }, + { "type": "steel", "covered_by_mat": 50, "thickness": 1 }, + { "type": "steel", "covered_by_mat": 50, "thickness": 1 }, + { "type": "steel", "covered_by_mat": 50, "thickness": 1 }, + { "type": "steel", "covered_by_mat": 50, "thickness": 1 }, + { "type": "steel", "covered_by_mat": 50, "thickness": 1 } + ] + } + ] + }, + { + "id": "test_portion_segmented_armor", + "type": "ARMOR", + "name": "Segmented armor", + "copy-from": "test_swat_armor", + "armor": [ + { + "covers": [ "torso", "head", "mouth", "eyes" ], + "coverage": 100, + "encumbrance": [ 12, 25 ], + "material": [ + { "type": "cotton", "covered_by_mat": 100, "thickness": 1 }, + { "type": "steel", "covered_by_mat": 50, "thickness": 10 } + ] + }, + { + "covers": [ "leg_l", "leg_r", "foot_l", "foot_r" ], + "coverage": 100, + "encumbrance": [ 12, 25 ], + "material": [ + { "type": "cotton", "covered_by_mat": 100, "thickness": 1 }, + { "type": "steel", "covered_by_mat": 50, "thickness": 10 } + ] + }, + { + "covers": [ "arm_l", "arm_r", "hand_l", "hand_r" ], + "coverage": 100, + "encumbrance": [ 12, 25 ], + "material": [ + { "type": "cotton", "covered_by_mat": 100, "thickness": 1 }, + { "type": "steel", "covered_by_mat": 50, "thickness": 10 } ] } ] @@ -2941,5 +2976,96 @@ "qualities": [ [ "GLARE", 1 ] ], "flags": [ "SUN_GLASSES", "FLASH_PROTECTION" ], "armor": [ { "encumbrance": 60, "coverage": 100, "covers": [ "eyes" ] } ] + }, + { + "id": "test_longshirt", + "type": "ARMOR", + "name": { "str": "debug long-sleeved shirt" }, + "description": "A long-sleeved cotton shirt.", + "weight": "146 g", + "volume": "750 ml", + "price": 2000, + "price_postapoc": 50, + "material": [ "cotton" ], + "symbol": "[", + "looks_like": "dress_shirt", + "color": "blue", + "warmth": 5, + "material_thickness": 0.2, + "flags": [ "VARSIZE" ], + "armor": [ { "encumbrance": 3, "coverage": 90, "covers": [ "torso", "arm_l", "arm_r" ] } ] + }, + { + "id": "test_jacket_jean", + "repairs_like": "trenchcoat", + "type": "ARMOR", + "name": { "str": "jean jacket" }, + "description": "A jacket made from denim.", + "weight": "800 g", + "volume": "3250 ml", + "price": 4000, + "price_postapoc": 250, + "material": [ "cotton" ], + "symbol": "[", + "looks_like": "jacket_windbreaker", + "color": "light_blue", + "armor": [ + { "covers": [ "torso" ], "coverage": 90, "encumbrance": [ 9, 11 ] }, + { "covers": [ "arm_l", "arm_r" ], "coverage": 90, "encumbrance": [ 9, 9 ] } + ], + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "max_contains_volume": "800 ml", + "max_contains_weight": "1 kg", + "max_item_length": "13 cm", + "moves": 80 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "800 ml", + "max_contains_weight": "1 kg", + "max_item_length": "13 cm", + "moves": 80 + } + ], + "warmth": 30, + "material_thickness": 0.2, + "flags": [ "VARSIZE", "POCKETS", "OUTER" ] + }, + { + "id": "test_postman_shirt", + "repairs_like": "tshirt", + "type": "ARMOR", + "name": { "str": "mail carrier shirt" }, + "description": "A light blue button down shirt with a couple of pockets in front and the US postal service logo embroidered on it.", + "weight": "110 g", + "volume": "500 ml", + "price": 1500, + "price_postapoc": 50, + "material": [ "cotton" ], + "symbol": "[", + "looks_like": "polo_shirt", + "color": "light_blue", + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "max_contains_volume": "800 ml", + "max_contains_weight": "3 kg", + "max_item_length": "15 cm", + "moves": 80 + }, + { + "pocket_type": "CONTAINER", + "max_contains_volume": "800 ml", + "max_contains_weight": "3 kg", + "max_item_length": "15 cm", + "moves": 80 + } + ], + "warmth": 5, + "material_thickness": 0.1, + "flags": [ "VARSIZE" ], + "armor": [ { "coverage": 90, "covers": [ "torso" ] } ] } ] diff --git a/data/mods/TEST_DATA/martialarts.json b/data/mods/TEST_DATA/martialarts.json index 9268bcb9d6e60..090e88f3781f9 100644 --- a/data/mods/TEST_DATA/martialarts.json +++ b/data/mods/TEST_DATA/martialarts.json @@ -15,7 +15,7 @@ "name": { "str": "Test Style 1" }, "description": "Test martial arts 1", "initiate": [ "You use a test martial art.", "%s enters a generic combat stance." ], - "allow_melee": true, + "allow_all_weapons": true, "weapons": [ "test_weapon1" ], "onmiss_buffs": [ { diff --git a/data/mods/TropiCataclysm/items/comestibles/egg.json b/data/mods/TropiCataclysm/items/comestibles/egg.json index b8e7e4a2143b1..2ae2e03272d44 100644 --- a/data/mods/TropiCataclysm/items/comestibles/egg.json +++ b/data/mods/TropiCataclysm/items/comestibles/egg.json @@ -15,7 +15,7 @@ "calories": 266, "volume": "125 ml", "weight": "144 g", - "vitamins": [ [ "vitA", 30 ], [ "calcium", 9 ], [ "iron", 29 ], [ "vitB", 306 ] ], + "vitamins": [ [ "calcium", 9 ], [ "iron", 29 ] ], "rot_spawn": "GROUP_EGG_GOOSE" }, { @@ -26,7 +26,7 @@ "calories": 300, "volume": "125 ml", "weight": "144 g", - "vitamins": [ [ "vitA", 30 ], [ "calcium", 9 ], [ "iron", 29 ], [ "vitB", 306 ] ], + "vitamins": [ [ "calcium", 9 ], [ "iron", 29 ] ], "rot_spawn": "GROUP_EGG_GOOSE" }, { diff --git a/data/mods/TropiCataclysm/items/comestibles/raw_veggy.json b/data/mods/TropiCataclysm/items/comestibles/raw_veggy.json index 33378d37cf0fc..33cba240f5541 100644 --- a/data/mods/TropiCataclysm/items/comestibles/raw_veggy.json +++ b/data/mods/TropiCataclysm/items/comestibles/raw_veggy.json @@ -17,6 +17,6 @@ "flags": [ "TRADER_AVOID", "RAW" ], "volume": "250 ml", "//": "average of broccoli, cabbage, carrot, cattail_stalk, celery, chili_pepper, cucumber, lettuce, onion, pumpkin, raw_dandelion, rhubarb, sugar_beet, tomato, zucchini", - "vitamins": [ [ "vitA", 16 ], [ "vitC", 36 ], [ "calcium", 4 ], [ "iron", 4 ], [ "mutant_toxin", 10 ] ] + "vitamins": [ [ "vitC", 36 ], [ "calcium", 4 ], [ "iron", 4 ], [ "mutant_toxin", 10 ] ] } ] diff --git a/data/mods/TropiCataclysm/mapgen/triffid/overgrown_lot.json b/data/mods/TropiCataclysm/mapgen/triffid/overgrown_lot.json new file mode 100644 index 0000000000000..a45492885e223 --- /dev/null +++ b/data/mods/TropiCataclysm/mapgen/triffid/overgrown_lot.json @@ -0,0 +1,235 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": "overgrownlot", + "weight": 100, + "object": { + "furniture": { + "#": "f_null", + ".": "f_null", + "1": "f_null", + "4": "f_null", + "7": "f_null", + "P": "f_sign", + "T": "f_null", + "_": "f_null", + "t": "f_null" + }, + "rows": [ + "..._....._._..._..._....", + "............P...._......", + "._...._.._..P..._...._..", + "...........__..........7", + "...._..__........_....._", + "_.7....Y...........__...", + "........_.._._.._...t._.", + ".....1_.................", + "..._...._........_Y.....", + "..__.......__.._......7.", + "..4......._..._.._.._...", + "#_....Y_....._......Y...", + ".1_._.._.._.X...._....._", + "_..._....._..__..._..1..", + "..#........_._....._.._4", + "..._...Y__...._..._.....", + "._#..................._.", + "...._._..__..._...Y.....", + "...._.1.....Y..._......#", + "..4....._.........._....", + "...#._......_........._1", + "_4._T..._.._t._._.4_#...", + "1....._..#.....#T..._.7.", + "..#...#.7._#..1_.._..#.." + ], + "terrain": { + "#": "t_underbrush", + ".": "t_grass", + "1": "t_tree_young", + "4": "t_tree_pine", + "7": "t_tree_maple_tapped", + "P": "t_grass", + "T": "t_tree_deadpine", + "_": "t_dirt", + "t": "t_tree_maple", + "X": "t_dirtmound", + "Y": "t_dirtmound" + }, + "place_signs": [ + { "signage": "Property for sale!", "x": 12, "y": 1 }, + { "signage": "Call with Realty at 555-6288!", "x": 12, "y": 2 } + ], + "monster": { "X": { "monster": "mon_triffid_overqueen" }, "Y": { "monster": "mon_triffid_flower" } } + } + }, + { + "method": "json", + "object": { + "furniture": { ".": "f_null", "4": "f_null", "P": "f_sign", "_": "f_null", "d": "f_null" }, + "rows": [ + ".........d......______..", + "................______..", + "...............d______..", + ".d..............______..", + "..............P.______..", + "..4.............______..", + "......d.........______..", + "................______d.", + "........................", + "d...............Y.......", + "........................", + "......Y.................", + "..d.....................", + "...d........d.......Y...", + ".................d......", + ".........d.............d", + "........................", + "......X.................", + "..............****..d...", + "d.......d..***~~~~***...", + "..........**~~~~~~~~**..", + "....Y.....****~~~~****..", + "............*******.....", + "........................" + ], + "terrain": { + ".": "t_grass", + "4": "t_tree_willow", + "P": "t_grass", + "_": "t_pavement", + "d": "t_dirt", + "X": "t_dirtmound", + "Y": "t_dirtmound", + "*": "t_water_sh", + "~": "t_water_dp" + }, + "place_signs": [ { "signage": "Lot SOLD!", "x": 14, "y": 4 } ], + "monster": { "X": { "monster": "mon_triffid_overqueen" }, "Y": { "monster": "mon_triffid_flower" } } + }, + "om_terrain": "overgrownlot", + "type": "mapgen", + "weight": 100 + }, + { + "method": "json", + "object": { + "furniture": { ".": "f_null", "P": "f_sign", "#": "f_null", "_": "f_null", "s": "f_sign" }, + "place_items": [ { "chance": 35, "item": "trash", "x": 16, "y": 17 }, { "chance": 35, "item": "trash", "x": 7, "y": 11 } ], + "place_vehicles": [ + { "chance": 20, "fuel": 0, "rotation": 0, "status": 1, "vehicle": "bicycle", "x": 6, "y": 17 }, + { "chance": 20, "fuel": 0, "rotation": 0, "status": 1, "vehicle": "shopping_cart", "x": 17, "y": 19 } + ], + "rows": [ + "..._..._........_...._..", + "._.........._._.........", + "....#_..............._._", + "_.Y..._..._..._...._..._", + ".._..........._.._......", + "..._._...._..P.....Y_...", + "_............s_.........", + "......__._........._._._", + "..._.._..........._..#..", + "._......#.._............", + "_......._..#..._........", + "..#.._............._....", + "_.._.........._.._....._", + "....._....#._._....#....", + "..Y....._.._......._.._.", + "_._.__......X..._..._.#.", + "...#.._....._...........", + ".........._..#..._..Y.._", + "..._...._...............", + "__............_._..._...", + "_.._..#_.._........_#...", + "....._....._..._...._...", + "...._...Y....#........._", + "..#..._.._...._.._._...." + ], + "terrain": { + ".": "t_dirt", + "#": "t_underbrush", + "P": "t_dirt", + "_": "t_grass", + "s": "t_grass", + "X": "t_dirtmound", + "Y": "t_dirtmound" + }, + "place_signs": [ + { "signage": "Empty lot for sale!", "x": 13, "y": 5 }, + { "signage": "Call Family Realty at 555-3130!", "x": 13, "y": 6 } + ], + "monster": { "X": { "monster": "mon_triffid_overqueen" }, "Y": { "monster": "mon_triffid_flower" } } + }, + "om_terrain": "overgrownlot", + "type": "mapgen", + "weight": 100 + }, + { + "method": "json", + "object": { + "furniture": { + "#": "f_null", + "+": "f_null", + ".": "f_null", + "P": "f_sign", + "^": "f_rubble_rock", + "_": "f_null", + "d": "f_null", + "g": "f_null", + "r": "f_rubble_rock", + "|": "f_null" + }, + "place_items": [ + { "chance": 15, "item": "trash", "x": 13, "y": 20 }, + { "chance": 15, "item": "trash", "x": 6, "y": 19 }, + { "chance": 15, "item": "trash", "x": 6, "y": 16 }, + { "chance": 15, "item": "trash", "x": 4, "y": 12 } + ], + "rows": [ + "________________________", + "________________________", + "________________________", + "g|..||.||P|++|||||.||||g", + "g|.............d......|d", + "d|d....d...dd.......d.|g", + "g|..........g....Y.dd.|d", + "g|.dg......d.g.....g..|g", + "d|............d......d|d", + "g...Y..d............d..g", + "g|.g.gd....d..........|g", + "g|...d....d...Y.d.g...|g", + "g|.d^..^..dd....d.....|d", + "d|.d..d....g.....d.g...g", + "g....^^.^d...d.....d..|d", + "g|.........X....g.....|g", + "g|dd...g..r.d..d.....d|g", + "d|...#.....#..dd......|d", + "g|.Y#...#.......d..dd.|g", + "g....^.g....dd..#..g..|g", + "g|....dd#.g........Y..|d", + "d|.^d.....d.d^....d.d.|g", + "g||||||..|||||||.||||||g", + "gggdgggdggdggdgdggdgdggg" + ], + "terrain": { + "#": "t_dirtmound", + "+": "t_chaingate_l", + ".": "t_concrete", + "^": "t_concrete", + "_": "t_sidewalk", + "d": "t_dirt", + "g": "t_grass", + "r": "t_grass", + "P": "t_chainfence_v", + "|": "t_chainfence_v", + "X": "t_dirtmound", + "Y": "t_dirtmound" + }, + "place_signs": [ { "signage": "Empty lot, great for your small business! Call at 555-2117!", "x": 9, "y": 3 } ], + "monster": { "X": { "monster": "mon_triffid_overqueen" }, "Y": { "monster": "mon_triffid_flower" } } + }, + "om_terrain": "overgrownlot", + "type": "mapgen", + "weight": 100 + } +] diff --git a/data/mods/TropiCataclysm/mapgen/triffid/triffid_blossom.json b/data/mods/TropiCataclysm/mapgen/triffid/triffid_blossom.json index 6266b9c870086..d6a7fd44f3768 100644 --- a/data/mods/TropiCataclysm/mapgen/triffid/triffid_blossom.json +++ b/data/mods/TropiCataclysm/mapgen/triffid/triffid_blossom.json @@ -54,7 +54,7 @@ "_": [ [ "f_null", 10 ], [ "f_bluebell", 2 ], "f_brambles" ], "&": [ [ "f_brambles", 8 ], "f_glowingbulb", "f_dandelion" ] }, - "monster": { "X": { "monster": "mon_triffid_flower" }, "Y": { "monster": "mon_triffid_lifegiver" } } + "monster": { "X": { "monster": "mon_triffid_flower" }, "Y": { "monster": "mon_triffid_overqueen" } } } } ] diff --git a/data/mods/TropiCataclysm/monster_special_attacks/monster_deaths,json b/data/mods/TropiCataclysm/monster_special_attacks/monster_deaths,json new file mode 100644 index 0000000000000..3dfd108d8bd2c --- /dev/null +++ b/data/mods/TropiCataclysm/monster_special_attacks/monster_deaths,json @@ -0,0 +1,35 @@ +[ +{ + "id": "death_sap", + "type": "SPELL", + "name": { "str": "Death Sap" }, + "description": "Sap Explosion", + "valid_targets": [ "ground", "hostile", "ally", "self" ], + "min_aoe": 1, + "max_aoe": 2, + "aoe_increment": 1, + "max_level": 1, + "min_duration": 2400, + "max_duration": 2400, + "shape": "blast", + "effect": "attack", + "effect_str": "sap", + "field_chance": 1, + "field_id": "fd_bile", + "max_field_intensity": 2, + "min_field_intensity": 2, + "affected_body_parts": [ "TORSO", "ARM_R", "ARM_L", "LEG_R", "LEG_L" ], + "extra_effects": [ { "id": "death_explosion", "hit_self": true } ] + }, + { + "id": "death_pollen", + "type": "SPELL", + "name": { "str": "Triffid Pollen Explosion" }, + "description": "Causes a small explosion of alien pollen.", + "valid_targets": [ "self" ], + "shape": "blast", + "effect": "emit", + "effect_str": "emit_pollen", + "extra_effects": [ { "id": "death_explosion", "hit_self": true } ] + } +] diff --git a/data/mods/TropiCataclysm/monstergroups/eggs.json b/data/mods/TropiCataclysm/monstergroups/eggs.json index b0eec73ea83f6..aaa6df2681768 100644 --- a/data/mods/TropiCataclysm/monstergroups/eggs.json +++ b/data/mods/TropiCataclysm/monstergroups/eggs.json @@ -128,10 +128,7 @@ { "name": "GROUP_EGG_TRIFFID", "type": "monstergroup", - "default": "mon_triffid_sprig", - "monsters": [ - { "monster": "mon_biollante_sprig", "freq": 100, "cost_multiplier": 1 }, - { "monster": "mon_triffid_sprig", "freq": 100, "cost_multiplier": 1 } - ] + "default": "mon_triffid_podling", + "monsters": [ { "monster": "mon_triffid_podling", "freq": 100, "cost_multiplier": 1 } ] } ] diff --git a/data/mods/TropiCataclysm/monstergroups/triffid.json b/data/mods/TropiCataclysm/monstergroups/triffid.json index 090b35921a6a2..25573189025b9 100644 --- a/data/mods/TropiCataclysm/monstergroups/triffid.json +++ b/data/mods/TropiCataclysm/monstergroups/triffid.json @@ -19,6 +19,66 @@ { "monster": "mon_triffid_flower", "weight": 100, "cost_multiplier": 4 } ] }, + { + "type": "monstergroup", + "name": "GROUP_TRIFFID_URBAN", + "default": "mon_triffid", + "//": "Group for triffids + plant zeds on special urban locations", + "monsters": [ + { "monster": "mon_triffid_gardenling", "weight": 300, "cost_multiplier": 0, "pack_size": [ 2, 4 ] }, + { "monster": "mon_fungal_fighter", "weight": 100 }, + { "monster": "mon_triffid", "weight": 80 }, + { "monster": "mon_triffid", "weight": 100, "cost_multiplier": 2, "pack_size": [ 2, 3 ] }, + { "monster": "mon_vinebeast", "weight": 160, "cost_multiplier": 10 }, + { "monster": "mon_triffid_biter", "weight": 160, "cost_multiplier": 10 }, + { "monster": "mon_triffid_acid", "weight": 160, "cost_multiplier": 10 }, + { "monster": "mon_triffid_queen", "weight": 60, "cost_multiplier": 20 }, + { "monster": "mon_biollante", "weight": 100, "cost_multiplier": 2, "pack_size": [ 1, 3 ] }, + { "monster": "mon_triffid_gas", "weight": 100, "cost_multiplier": 2, "pack_size": [ 1, 3 ] }, + { "monster": "mon_triffid_lasher", "weight": 100, "cost_multiplier": 2, "pack_size": [ 1, 3 ] }, + { "monster": "mon_triffid_lifegiver", "weight": 100, "cost_multiplier": 4 }, + { "monster": "mon_triffid_flower", "weight": 100, "cost_multiplier": 4 }, + { "monster": "mon_zombie_garden", "weight": 100, "cost_multiplier": 0, "pack_size": [ 1, 3 ] }, + { "monster": "mon_zombie_seedling", "weight": 100, "cost_multiplier": 0, "pack_size": [ 2, 4 ] }, + { "monster": "mon_boomer_moss", "weight": 60, "cost_multiplier": 0 }, + { "monster": "mon_swimmer_swamped", "weight": 60, "cost_multiplier": 0 }, + { "monster": "mon_shrieker_vines", "weight": 60, "cost_multiplier": 0 }, + { "monster": "mon_brute_thorns", "weight": 60, "cost_multiplier": 0 } + ] + }, + { + "type": "monstergroup", + "name": "GROUP_TRIFFID_GARDENLING", + "default": "mon_triffid", + "//": "Group for triffids gardenlings to evolve", + "monsters": [ + { "monster": "mon_triffid", "weight": 30 }, + { "monster": "mon_fungal_fighter", "weight": 20 }, + { "monster": "mon_vinebeast", "weight": 20 }, + { "monster": "mon_triffid_biter", "weight": 20 }, + { "monster": "mon_triffid_acid", "weight": 20 }, + { "monster": "mon_triffid_queen", "weight": 10 }, + { "monster": "mon_biollante", "weight": 20 }, + { "monster": "mon_triffid_gas", "weight": 20 }, + { "monster": "mon_triffid_lasher", "weight": 20 }, + { "monster": "mon_triffid_lifegiver", "weight": 10 }, + { "monster": "mon_triffid_flower", "weight": 10 } + ] + }, + { + "type": "monstergroup", + "name": "GROUP_PLANT_ZEDS", + "default": "mon_zombie_garden", + "//": "Group for plant zeds", + "monsters": [ + { "monster": "mon_zombie_garden", "weight": 150, "cost_multiplier": 0, "pack_size": [ 1, 3 ] }, + { "monster": "mon_zombie_seedling", "weight": 150, "cost_multiplier": 0, "pack_size": [ 2, 4 ] }, + { "monster": "mon_boomer_moss", "weight": 70, "cost_multiplier": 0 }, + { "monster": "mon_swimmer_swamped", "weight": 70, "cost_multiplier": 0 }, + { "monster": "mon_shrieker_vines", "weight": 30, "cost_multiplier": 0 }, + { "monster": "mon_brute_thorns", "weight": 30, "cost_multiplier": 0 } + ] + }, { "type": "monstergroup", "name": "GROUP_TRIFFID_OUTER", diff --git a/data/mods/TropiCataclysm/monstergroups/zombie_upgrades.json b/data/mods/TropiCataclysm/monstergroups/zombie_upgrades.json index 6745755fe27a0..73787ed724396 100644 --- a/data/mods/TropiCataclysm/monstergroups/zombie_upgrades.json +++ b/data/mods/TropiCataclysm/monstergroups/zombie_upgrades.json @@ -1,41 +1,26 @@ [ { "type": "monstergroup", - "name": "GROUP_THORNY_BOOMER_UPGRADE", - "default": "mon_boomer_thorny", + "name": "GROUP_MOSSY_BOOMER_UPGRADE", + "default": "mon_boomer_moss", "//": "Upgrades for the Thorny Boomer.", "monsters": [ - { "monster": "mon_boomer_thorny" }, + { "monster": "mon_boomer_moss" }, { "monster": "mon_boomer_sap", "weight": 250 }, { "monster": "mon_boomer_pollen", "weight": 250 } ] }, { "type": "monstergroup", - "name": "GROUP_THORNY_SHAMBLER_UPGRADE", - "default": "mon_zombie_thorny", + "name": "GROUP_GARDEN_ZOMBIE_UPGRADE", + "default": "mon_zombie_garden", "//": "Upgrades for the Thorny Shambler.", "monsters": [ - { "monster": "mon_zombie_thorny" }, - { "monster": "mon_brute_thorny", "weight": 15 }, - { "monster": "mon_swimmer_thorny", "weight": 30 }, - { "monster": "mon_shrieker_thorny", "weight": 15 }, - { "monster": "mon_boomer_thorny", "weight": 30 } - ] - }, - { - "type": "monstergroup", - "name": "GROUP_CHILD_ZOMBIE_UPGRADE", - "default": "mon_zombie_shriekling", - "//": "Copy of the vanilla zombie child upgrade group to see if it can override with the new thorny children.", - "monsters": [ - { "monster": "mon_zombie_anklebiter", "weight": 30 }, - { "monster": "mon_zombie_sproglodyte", "weight": 100 }, - { "monster": "mon_czombie_thorny", "weight": 40 }, - { "monster": "mon_zombie_shriekling", "weight": 300 }, - { "monster": "mon_zombie_creepy", "weight": 30 }, - { "monster": "mon_zombie_snotgobbler", "weight": 300 }, - { "monster": "mon_zombie_waif", "weight": 200 } + { "monster": "mon_zombie_garden" }, + { "monster": "mon_brute_thorns", "weight": 15 }, + { "monster": "mon_swimmer_swamped", "weight": 30 }, + { "monster": "mon_shrieker_vines", "weight": 15 }, + { "monster": "mon_boomer_moss", "weight": 30 } ] } ] diff --git a/data/mods/TropiCataclysm/monsters/tropical_triffid.json b/data/mods/TropiCataclysm/monsters/tropical_triffid.json index 8b64c4a98d04c..269355498eece 100644 --- a/data/mods/TropiCataclysm/monsters/tropical_triffid.json +++ b/data/mods/TropiCataclysm/monsters/tropical_triffid.json @@ -10,7 +10,36 @@ "volume": "875000 ml", "weight": "200 kg", "hp": 500, - "speed": 80, + "speed": 30, + "material": [ "veggy" ], + "symbol": "T", + "color": "red", + "aggression": 100, + "morale": 100, + "melee_skill": 3, + "melee_dice": 1, + "melee_dice_sides": 4, + "melee_cut": 4, + "armor_bash": 12, + "armor_cut": 16, + "armor_bullet": 13, + "armor_elec": 7, + "harvest": "triffid_queen", + "special_attacks": [ [ "SPIT_SAP", 5 ] ], + "reproduction": { "baby_egg": "triffid_pod", "baby_count": 6, "baby_timer": 3 }, + "flags": [ "HEARS", "SMELLS", "NOHEAD", "PARALYZEVENOM", "QUEEN" ] + }, + { + "id": "mon_triffid_overqueen", + "type": "MONSTER", + "name": { "str": "triffid overqueen" }, + "description": "An enormous triffid rooted to the ground. It absorbs nutrients and sunlight all day and night to release new podlings into the garden.", + "default_faction": "triffid", + "species": [ "PLANT" ], + "diff": 50, + "volume": "875000 ml", + "weight": "200 kg", + "hp": 500, "material": [ "veggy" ], "symbol": "T", "color": "red", @@ -23,9 +52,61 @@ "armor_elec": 7, "harvest": "triffid_queen", "special_attacks": [ [ "SPIT_SAP", 5 ] ], - "reproduction": { "baby_egg": "triffid_pod", "baby_count": 1, "baby_timer": 2 }, + "reproduction": { "baby_monster": "mon_triffid_podling", "baby_count": 1, "baby_timer": 1 }, "flags": [ "HEARS", "SMELLS", "NOHEAD", "PARALYZEVENOM", "QUEEN" ] }, + { + "id": "mon_triffid_podling", + "type": "MONSTER", + "name": { "str": "triffid podling" }, + "description": "A very small triffid born out of a triffid pod. Like all triffids its a very dangerous plant but for now its just a harmless colorful flower.", + "default_faction": "triffid", + "species": [ "PLANT" ], + "volume": "750 ml", + "weight": "1 kg", + "hp": 3, + "speed": 40, + "material": [ "veggy" ], + "symbol": "1", + "color": "light_green", + "aggression": -99, + "morale": -8, + "melee_skill": 1, + "melee_dice": 1, + "melee_dice_sides": 1, + "melee_cut": 1, + "armor_elec": 1, + "harvest": "triffid_small", + "upgrades": { "age_grow": 14, "into": "mon_triffid_gardenling" }, + "flags": [ "HEARS", "SMELLS", "NOHEAD", "STUMBLES" ] + }, + { + "id": "mon_triffid_gardenling", + "type": "MONSTER", + "name": { "str": "triffid gardenling" }, + "description": "A young triffid that has grown some time on the garden grounds. It is still a juvenile but it can already fend for itself to a degree.", + "default_faction": "triffid", + "species": [ "PLANT" ], + "volume": "30000 ml", + "weight": "40750 g", + "hp": 40, + "speed": 50, + "material": [ "veggy" ], + "symbol": "1", + "color": "light_green", + "morale": 10, + "melee_skill": 3, + "melee_dice": 1, + "melee_dice_sides": 4, + "melee_cut": 4, + "armor_elec": 2, + "bleed_rate": 75, + "harvest": "triffid_paralytic", + "upgrades": { "age_grow": 14, "into_group": "GROUP_TRIFFID_GARDENLING" }, + "special_attacks": [ [ "TRIFFID_GROWTH", 28800 ] ], + "fungalize_into": "mon_fungaloid", + "flags": [ "HEARS", "SMELLS", "NOHEAD", "PARALYZEVENOM" ] + }, { "id": "mon_triffid_biter", "type": "MONSTER", diff --git a/data/mods/TropiCataclysm/monsters/zed_plant.json b/data/mods/TropiCataclysm/monsters/zed_plant.json index 6479b647abbfd..fc4af747551a0 100644 --- a/data/mods/TropiCataclysm/monsters/zed_plant.json +++ b/data/mods/TropiCataclysm/monsters/zed_plant.json @@ -1,16 +1,9 @@ [ - { - "id": "mon_zombie_thorny", - "type": "MONSTER", - "name": { "str": "thorny shambler" }, - "copy-from": "mon_zombie_thorny", - "upgrades": { "half_life": 20, "into_group": "GROUP_THORNY_SHAMBLER_UPGRADE" } - }, { "id": "mon_zombie_garden", "type": "MONSTER", "name": { "str": "garden zombie" }, - "description": "This zombie seems to be wearing some kind of gardener or botanic atire and is smeared full of pollen and sap. The triffids have it controlled somehow but its purpose remains unclear.", + "description": "This zombie seems to be wearing some kind of gardener or botanic atire and is smeared full of vines, thorns, pollen and sap. The triffids have it controlled somehow but its purpose remains unclear.", "copy-from": "mon_beekeeper", "default_faction": "triffid", "harvest": "zombie_thorny", @@ -20,6 +13,15 @@ "color": "light_green", "death_drops": "mon_zombie_thorny_death_drops", "attack_effs": [ { "id": "paralyzepoison", "duration": 33 } ], + "special_attacks": [ + { + "type": "spell", + "spell_data": { "id": "pollen_breath", "min_level": 1 }, + "cooldown": 15, + "monster_message": "The zombie spews a cloud of pollen!" + } + ], + "upgrades": { "half_life": 20, "into_group": "GROUP_GARDEN_ZOMBIE_UPGRADE" }, "flags": [ "SEES", "HEARS", @@ -37,11 +39,11 @@ ] }, { - "id": "mon_czombie_thorny", + "id": "mon_zombie_seedling", "type": "MONSTER", - "name": { "str": "thorny child", "str_pl": "thorny children" }, - "description": "This particular child zombie seems to have been overtaken by plants. It has a several thorny vines covering its head and body.", - "default_faction": "zombie", + "name": { "str": "garden child", "str_pl": "garden children" }, + "description": "This child zombie seems to have been adopted by plants. It has a several thorny vines and sprouts covering its head and body.", + "default_faction": "triffid", "bodytype": "human", "species": [ "ZOMBIE", "PLANT" ], "volume": "30000 ml", @@ -70,7 +72,7 @@ "death_function": { "effect": { "id": "death_guilt", "min_level": 4 } }, "burn_into": "mon_zombie_child_scorched", "fungalize_into": "mon_zombie_child_fungus", - "upgrades": { "half_life": 20, "into": "mon_czombie_poison" }, + "upgrades": { "half_life": 20, "into": "mon_zombie_flowerchild" }, "flags": [ "SEES", "HEARS", @@ -87,19 +89,19 @@ ] }, { - "id": "mon_czombie_poison", + "id": "mon_zombie_flowerchild", "type": "MONSTER", "name": { "str": "spriteling" }, - "copy-from": "mon_czombie_thorny", - "description": "An undead child seemingly mutated by alien flora. It has several colorful flowers on its head.", + "copy-from": "mon_zombie_seedling", + "description": "An undead child seemingly mutated by alien flora. It has several colorful flowers on its head and an uncanningly serene expression.", "attack_effs": [ { "id": "paralyzepoison", "duration": 33 } ] }, { - "id": "mon_boomer_thorny", + "id": "mon_boomer_moss", "type": "MONSTER", - "name": { "str": "thorny boomer" }, + "name": { "str": "mossy boomer" }, "description": "A fat and slow zombie covered in plant growths of unknown origin. Some vines seem to extend into its mouth and guts.", - "default_faction": "zombie", + "default_faction": "triffid", "bodytype": "human", "species": [ "ZOMBIE", "PLANT" ], "diff": 5, @@ -121,7 +123,7 @@ "special_attacks": [ [ "BOOMER", 20 ], [ "scratch", 20 ] ], "death_drops": "mon_zombie_thorny_death_drops", "death_function": { "effect": { "id": "death_boomer", "hit_self": true }, "message": "A %s explodes!", "corpse_type": "NO_CORPSE" }, - "upgrades": { "half_life": 14, "into_group": "GROUP_THORNY_BOOMER_UPGRADE" }, + "upgrades": { "half_life": 14, "into_group": "GROUP_MOSSY_BOOMER_UPGRADE" }, "fungalize_into": "mon_boomer_fungus", "flags": [ "SEES", @@ -146,7 +148,7 @@ "type": "MONSTER", "name": { "str": "sap belcher" }, "description": "This big and bloated zombie seems full of sap. Its already overgrown body shows several flowering plants growing over it.", - "default_faction": "zombie", + "default_faction": "triffid", "bodytype": "human", "species": [ "ZOMBIE", "PLANT" ], "diff": 20, @@ -169,7 +171,7 @@ "special_attacks": [ [ "scratch", 20 ] ], "attack_effs": [ { "id": "paralyzepoison", "duration": 33 } ], "death_drops": "mon_zombie_thorny_death_drops", - "death_function": { "effect": { "id": "sap", "hit_self": true }, "message": "A %s explodes!", "corpse_type": "NO_CORPSE" }, + "death_function": { "effect": { "id": "death_sap", "hit_self": true }, "message": "A %s explodes!", "corpse_type": "NO_CORPSE" }, "flags": [ "SEES", "HEARS", @@ -190,7 +192,7 @@ "type": "MONSTER", "name": { "str": "pollinated eructor" }, "description": "This engorged zombie has smears of strange pollen on its mouth and plants over its body. It shambles around eructing the stuff all over the place.", - "default_faction": "zombie", + "default_faction": "triffid", "bodytype": "human", "species": [ "ZOMBIE", "PLANT" ], "diff": 5, @@ -210,25 +212,17 @@ "vision_night": 3, "harvest": "exempt", "attack_effs": [ { "id": "paralyzepoison", "duration": 33 } ], - "special_attacks": [ - { - "type": "spell", - "spell_data": { "id": "pollen_breath", "min_level": 1 }, - "cooldown": 15, - "monster_message": "The zombie spews a cloud of pollen!" - } - ], "death_drops": "mon_zombie_thorny_death_drops", - "death_function": { "message": "A %s explodes!", "effect": { "id": "death_boomer", "hit_self": true }, "corpse_type": "NO_CORPSE" }, + "death_function": { "message": "A %s explodes!", "effect": { "id": "death_pollen", "hit_self": true }, "corpse_type": "NO_CORPSE" }, "fungalize_into": "mon_zombie_gasbag_fungus", "flags": [ "SEES", "HEARS", "SMELLS", "STUMBLES", "WARM", "POISON", "NO_BREATHE", "REVIVES", "FILTHY", "PARALYZEVENOM" ] }, { - "id": "mon_brute_thorny", + "id": "mon_brute_thorns", "type": "MONSTER", "name": { "str": "bramble brute" }, "description": "A large and muscular zombie covered in thick alien vegetation.", - "default_faction": "zombie", + "default_faction": "triffid", "bodytype": "human", "species": [ "ZOMBIE", "PLANT" ], "volume": "62500 ml", @@ -252,7 +246,7 @@ "special_attacks": [ [ "GRAB", 7 ], [ "scratch", 20 ], [ "PARA_STING", 30 ] ], "death_drops": "mon_zombie_thorny_death_drops", "burn_into": "mon_zombie_fiend", - "upgrades": { "half_life": 21, "into": "mon_hulk_thorny" }, + "upgrades": { "half_life": 21, "into": "mon_hulk_thorns" }, "flags": [ "SEES", "HEARS", @@ -269,11 +263,11 @@ ] }, { - "id": "mon_hulk_thorny", + "id": "mon_hulk_thorns", "type": "MONSTER", "name": { "str": "overgrown terror" }, "description": "This massive zombie has the equivalent of a small garden growing all over its body.", - "default_faction": "zombie", + "default_faction": "triffid", "bodytype": "human", "species": [ "ZOMBIE", "PLANT" ], "diff": 5, @@ -316,11 +310,11 @@ ] }, { - "id": "mon_shrieker_thorny", + "id": "mon_shrieker_vines", "type": "MONSTER", "name": { "str": "forest screamer" }, "description": "The plant growth on this slender zombie make it look like some kind of forest apparition. It looks like it could throw a curse at you at any moment.", - "default_faction": "zombie", + "default_faction": "triffid", "bodytype": "human", "species": [ "ZOMBIE", "PLANT" ], "diff": 2, @@ -345,7 +339,7 @@ "death_drops": "mon_zombie_thorny_death_drops", "burn_into": "mon_zombie_scorched", "fungalize_into": "mon_zombie_fungus", - "upgrades": { "half_life": 10, "into": "mon_screecher_thorny" }, + "upgrades": { "half_life": 10, "into": "mon_screecher_vines" }, "flags": [ "SEES", "HEARS", @@ -363,11 +357,11 @@ ] }, { - "id": "mon_screecher_thorny", + "id": "mon_screecher_vines", "type": "MONSTER", "name": { "str": "glade banshee" }, "description": "With its ragged looks and overgrown coverage this zombie looks like a hag from some cursed forest.", - "default_faction": "zombie", + "default_faction": "triffid", "bodytype": "human", "species": [ "ZOMBIE", "PLANT" ], "diff": 2, @@ -408,11 +402,11 @@ ] }, { - "id": "mon_swimmer_thorny", + "id": "mon_swimmer_swamped", "type": "MONSTER", "name": { "str": "mire walker" }, "description": "This zombie seems to have been roaming the surrounding swamps and rivers. It has several water plants clinging to its body", - "default_faction": "zombie", + "default_faction": "triffid", "bodytype": "human", "species": [ "ZOMBIE", "PLANT" ], "volume": "62500 ml", @@ -435,7 +429,7 @@ "death_drops": "mon_zombie_swimmer_death_drops", "burn_into": "mon_zombie_scorched", "fungalize_into": "mon_zombie_fungus", - "upgrades": { "half_life": 28, "into": "mon_swimmer_biter" }, + "upgrades": { "half_life": 28, "into": "mon_swimmer_swampbiter" }, "flags": [ "SEES", "HEARS", @@ -454,11 +448,11 @@ ] }, { - "id": "mon_swimmer_biter", + "id": "mon_swimmer_swampbiter", "type": "MONSTER", "name": { "str": "mangrove lurker" }, "description": "This zombie seems to have adapted to move around on the water. It uses the aquatic plants on its body to hide before hitting with its teeth.", - "default_faction": "zombie", + "default_faction": "triffid", "bodytype": "human", "species": [ "ZOMBIE", "PLANT" ], "volume": "62500 ml", diff --git a/data/mods/TropiCataclysm/overmap/overmap_terrain/overmap_terrain_residential.json b/data/mods/TropiCataclysm/overmap/overmap_terrain/overmap_terrain_residential.json new file mode 100644 index 0000000000000..f8b55beb0d27e --- /dev/null +++ b/data/mods/TropiCataclysm/overmap/overmap_terrain/overmap_terrain_residential.json @@ -0,0 +1,12 @@ +[ + { + "type": "overmap_terrain", + "id": "overgrownlot", + "copy-from": "generic_city_building", + "name": "overgrown lot", + "sym": "O", + "color": "i_green", + "spawns": { "group": "GROUP_TRIFFID_URBAN", "population": [ 8, 12 ], "chance": 100 }, + "extend": { "flags": [ "GENERIC_LOOT" ] } + } +] diff --git a/data/mods/TropiCataclysm/tropical_regional_map_settings.json b/data/mods/TropiCataclysm/tropical_regional_map_settings.json index ca70ebebe9e84..436b288a2f1f6 100644 --- a/data/mods/TropiCataclysm/tropical_regional_map_settings.json +++ b/data/mods/TropiCataclysm/tropical_regional_map_settings.json @@ -785,6 +785,7 @@ "urban_17_house_ranch": 50, "urban_18_victorian": 50, "emptyresidentiallot": 20, + "overgrownlot": 20, "house_vacant": 20, "house_vacant2": 20, "apartments_con_new": 10, diff --git a/data/mods/alt_map_key/overmap_terrain.json b/data/mods/alt_map_key/overmap_terrain.json index c07463b158cf7..00d54493f3df1 100644 --- a/data/mods/alt_map_key/overmap_terrain.json +++ b/data/mods/alt_map_key/overmap_terrain.json @@ -686,14 +686,6 @@ "sym": "c", "color": "light_green" }, - { - "type": "overmap_terrain", - "id": "sugar_house", - "copy-from": "sugar_house", - "name": "sugar house", - "sym": "S", - "color": "green" - }, { "type": "overmap_terrain", "id": "farm_1", @@ -1432,14 +1424,6 @@ "sym": "#", "color": "green" }, - { - "type": "overmap_terrain", - "id": "cabin_aban1", - "copy-from": "cabin_aban1", - "name": "ruined cabin", - "sym": "#", - "color": "green" - }, { "type": "overmap_terrain", "id": "barn_aban1", @@ -6586,38 +6570,6 @@ "sym": "A", "color": "i_green" }, - { - "id": "dairy_farm_NW", - "copy-from": "dairy_farm_NW", - "type": "overmap_terrain", - "name": "dairy farm", - "sym": "d", - "color": "i_green" - }, - { - "id": "dairy_farm_NE", - "copy-from": "dairy_farm_NE", - "type": "overmap_terrain", - "name": "dairy farm", - "sym": "d", - "color": "i_green" - }, - { - "id": "dairy_farm_SE", - "copy-from": "dairy_farm_SE", - "type": "overmap_terrain", - "name": "dairy farm", - "sym": "d", - "color": "i_green" - }, - { - "id": "dairy_farm_SW", - "copy-from": "dairy_farm_SW", - "type": "overmap_terrain", - "name": "dairy farm", - "sym": "d", - "color": "i_green" - }, { "id": "orchard", "copy-from": "orchard", @@ -7239,14 +7191,6 @@ "sym": "#", "color": "green" }, - { - "id": "pavilion", - "copy-from": "pavilion", - "type": "overmap_terrain", - "name": "pavilion", - "sym": "p", - "color": "brown" - }, { "id": "animalpound", "copy-from": "animalpound", @@ -7271,14 +7215,6 @@ "sym": "d", "color": "magenta" }, - { - "id": "cemetery_small", - "copy-from": "cemetery_small", - "type": "overmap_terrain", - "name": "small cemetery", - "sym": "c", - "color": "white" - }, { "type": "overmap_terrain", "id": "Cemetery_1a", @@ -7295,38 +7231,6 @@ "sym": "c", "color": "i_white" }, - { - "type": "overmap_terrain", - "id": "cemetery_4square_00", - "copy-from": "cemetery_4square_00", - "name": "religious cemetery", - "sym": "c", - "color": "white" - }, - { - "type": "overmap_terrain", - "id": "cemetery_4square_10", - "copy-from": "cemetery_4square_10", - "name": "religious cemetery", - "sym": "c", - "color": "white" - }, - { - "type": "overmap_terrain", - "id": "cemetery_4square_01", - "copy-from": "cemetery_4square_01", - "name": "religious cemetery", - "sym": "c", - "color": "white" - }, - { - "type": "overmap_terrain", - "id": "cemetery_4square_11", - "copy-from": "cemetery_4square_11", - "name": "religious cemetery", - "sym": "c", - "color": "white" - }, { "type": "overmap_terrain", "id": "emptyresidentiallot", @@ -7679,38 +7583,6 @@ "sym": "p", "color": "magenta" }, - { - "type": "overmap_terrain", - "id": "shipwreck_river_1", - "copy-from": "shipwreck_river_1", - "name": "shipwreck", - "sym": "s", - "color": "i_pink" - }, - { - "type": "overmap_terrain", - "id": "shipwreck_river_2", - "copy-from": "shipwreck_river_2", - "name": "shipwreck", - "sym": "s", - "color": "i_pink" - }, - { - "type": "overmap_terrain", - "id": "shipwreck_river_3", - "copy-from": "shipwreck_river_3", - "name": "razorclaw nest", - "sym": "s", - "color": "i_pink" - }, - { - "type": "overmap_terrain", - "id": "shipwreck_river_4", - "copy-from": "shipwreck_river_4", - "name": "shipwreck", - "sym": "s", - "color": "i_pink" - }, { "type": "overmap_terrain", "id": "trailerparksmall0", @@ -7863,14 +7735,6 @@ "sym": "h", "color": "light_green" }, - { - "type": "overmap_terrain", - "id": "ranch_camp_17", - "copy-from": "ranch_camp_17", - "name": "pond", - "sym": "#", - "color": "blue" - }, { "type": "overmap_terrain", "id": "recyclecenter", @@ -7887,14 +7751,6 @@ "sym": "m", "color": "blue" }, - { - "type": "overmap_terrain", - "id": "mine_entrance", - "copy-from": "mine_entrance", - "name": "mine entrance", - "sym": "m", - "color": "light_gray" - }, { "type": "overmap_terrain", "id": "s_bike_shop", @@ -8175,22 +8031,6 @@ "sym": "r", "color": "i_red" }, - { - "type": "overmap_terrain", - "id": "barn_aban1", - "copy-from": "barn_aban1", - "name": "ruined cabin - barn", - "sym": "r", - "color": "i_light_gray" - }, - { - "type": "overmap_terrain", - "id": "car_corner_aban1", - "copy-from": "car_corner_aban1", - "name": "ruined cabin - car corner", - "sym": "r", - "color": "i_light_gray" - }, { "type": "overmap_terrain", "id": "cabin_aban1", @@ -8199,30 +8039,6 @@ "sym": "r", "color": "i_light_gray" }, - { - "type": "overmap_terrain", - "id": "dirtplaza_aban1", - "copy-from": "dirtplaza_aban1", - "name": "ruined cabin - dirt plaza", - "sym": "r", - "color": "i_light_gray" - }, - { - "type": "overmap_terrain", - "id": "dirtroad1_aban1", - "copy-from": "dirtroad1_aban1", - "name": "forest", - "sym": "#", - "color": "green" - }, - { - "type": "overmap_terrain", - "id": "dirtroad2_aban1", - "copy-from": "dirtroad2_aban1", - "name": "forest", - "sym": "#", - "color": "green" - }, { "type": "overmap_terrain", "id": "irradiator_1_1", diff --git a/data/mods/innawood/overmap/specials_removed.json b/data/mods/innawood/overmap/specials_removed.json index 16aefb701caad..7f7f22b9b540d 100644 --- a/data/mods/innawood/overmap/specials_removed.json +++ b/data/mods/innawood/overmap/specials_removed.json @@ -2466,53 +2466,6 @@ "occurrences": [ 0, 0 ], "flags": [ "LAKE" ] }, - { - "type": "overmap_special", - "id": "Island", - "overmaps": [ - { "point": [ 0, 0, 0 ], "overmap": "lake_surface" }, - { "point": [ 1, 0, 0 ], "overmap": "lake_surface" }, - { "point": [ 2, 0, 0 ], "overmap": "lake_surface" }, - { "point": [ 3, 0, 0 ], "overmap": "lake_surface" }, - { "point": [ 4, 0, 0 ], "overmap": "lake_surface" }, - { "point": [ 5, 0, 0 ], "overmap": "lake_surface" }, - { "point": [ 0, 1, 0 ], "overmap": "lake_surface" }, - { "point": [ 1, 1, 0 ], "overmap": "lake_surface" }, - { "point": [ 2, 1, 0 ], "overmap": "lake_surface" }, - { "point": [ 3, 1, 0 ], "overmap": "lake_shore" }, - { "point": [ 4, 1, 0 ], "overmap": "lake_shore" }, - { "point": [ 5, 1, 0 ], "overmap": "lake_surface" }, - { "point": [ 0, 2, 0 ], "overmap": "lake_surface" }, - { "point": [ 1, 2, 0 ], "overmap": "lake_shore" }, - { "point": [ 2, 2, 0 ], "overmap": "lake_shore" }, - { "point": [ 3, 2, 0 ], "overmap": "lake_shore" }, - { "point": [ 4, 2, 0 ], "overmap": "lake_shore" }, - { "point": [ 5, 2, 0 ], "overmap": "lake_surface" }, - { "point": [ 0, 3, 0 ], "overmap": "lake_surface" }, - { "point": [ 1, 3, 0 ], "overmap": "lake_shore" }, - { "point": [ 2, 3, 0 ], "overmap": "forest_water" }, - { "point": [ 3, 3, 0 ], "overmap": "island_forest_thick_north" }, - { "point": [ 4, 3, 0 ], "overmap": "lake_shore" }, - { "point": [ 5, 3, 0 ], "overmap": "lake_surface" }, - { "point": [ 0, 4, 0 ], "overmap": "lake_surface" }, - { "point": [ 1, 4, 0 ], "overmap": "lake_shore" }, - { "point": [ 2, 4, 0 ], "overmap": "lake_shore" }, - { "point": [ 3, 4, 0 ], "overmap": "lake_shore" }, - { "point": [ 4, 4, 0 ], "overmap": "lake_shore" }, - { "point": [ 5, 4, 0 ], "overmap": "lake_surface" }, - { "point": [ 0, 5, 0 ], "overmap": "lake_surface" }, - { "point": [ 1, 5, 0 ], "overmap": "lake_surface" }, - { "point": [ 2, 5, 0 ], "overmap": "lake_surface" }, - { "point": [ 3, 5, 0 ], "overmap": "lake_surface" }, - { "point": [ 4, 5, 0 ], "overmap": "lake_surface" }, - { "point": [ 5, 5, 0 ], "overmap": "lake_surface" } - ], - "locations": [ "lake_surface" ], - "city_distance": [ 3, -1 ], - "city_sizes": [ 4, 12 ], - "occurrences": [ 0, 1 ], - "flags": [ "CLASSIC", "LAKE", "WILDERNESS" ] - }, { "type": "overmap_special", "id": "Lighthouse Island", diff --git a/doc/COMPILING/COMPILING-VS-VCPKG.md b/doc/COMPILING/COMPILING-VS-VCPKG.md index c48fc6b51e4f1..f6ff1101cae36 100644 --- a/doc/COMPILING/COMPILING-VS-VCPKG.md +++ b/doc/COMPILING/COMPILING-VS-VCPKG.md @@ -19,7 +19,7 @@ Steps from current guide were tested on Windows 10 (64 bit), Visual Studio 2019 1. Install `Visual Studio` (installer can be downloaded from [Visual Studio homepage](https://visualstudio.microsoft.com/)). -- Select the "Desktop development with C++" and "Game development with C++" workloads. + - Select the "Desktop development with C++" and "Game development with C++" workloads. 2. Install `Git for Windows` (installer can be downloaded from [Git homepage](https://git-scm.com/)). @@ -27,13 +27,24 @@ Steps from current guide were tested on Windows 10 (64 bit), Visual Studio 2019 ***WARNING: It is important that, wherever you decide to clone this repo, the path does not include whitespace. That is, `C:/dev/vcpkg` is acceptable, but `C:/dev test/vcpkg` is not.*** +In a `cmd.exe` shell: ```cmd +REM cd to the appropriate folder first git clone https://github.com/Microsoft/vcpkg.git cd vcpkg git checkout 49b67d9cb856424ff69f10e7721aec5299624268 .\bootstrap-vcpkg.bat -disableMetrics .\vcpkg integrate install ``` +In a Git Bash shell, the commands are almost the same except the filesystem path separator is `/` instead of `\`. +``` +# cd to the appropriate folder first +git clone https://github.com/Microsoft/vcpkg.git +cd vcpkg +git checkout 49b67d9cb856424ff69f10e7721aec5299624268 +./bootstrap-vcpkg.bat -disableMetrics +./vcpkg.exe integrate install +``` ## Cloning and compilation: @@ -48,9 +59,12 @@ cd Cataclysm-DDA 2. Open the provided solution (`msvc-full-features\Cataclysm-vcpkg-static.sln`) in `Visual Studio`. + - **Note:** If you are using Visual Studio 2022, the first time you open the solution, it will prompt you to "Retarget Projects". Unless you know what you are doing, hit cancel on this dialog. + 3. Open the `Build > Configuration Manager` menu and adjust `Active solution configuration` and `Active solution platform` to match your intended target. -This will configure Visual Studio to compile the release version, with support for Sound, Tiles, and Localization (note, however, that language files themselves are not automatically compiled; this will be done later). + - The `Release` configuration and `x64` platform together make a good default setting. `Debug` is too slow and should be reserved for breakpoint debugging with code stepping. + - This will configure Visual Studio to compile the release version, with support for Sound, Tiles, and Localization (note, however, that language files themselves are not automatically compiled; this will be done later). 4. Start the build process by selecting either `Build > Build Solution` or `Build > Build > 1 Cataclysm-vcpkg-static`. The process may take a long period of time, so you'd better prepare a cup of coffee and some books in front of your computer :) The first build of each architecture will also download and install dependencies through vcpkg, which can take an especially long time. @@ -60,7 +74,15 @@ Even if you do not need languages other than English, you may still want to exec ### Debugging -Ensure that the Cataclysm project (`Cataclysm-vcpkg-static`) is the selected startup project, configure the working directory in the project settings to `$(ProjectDir)..` (under Debugging section), and then press the debug button (or use the appropriate shortcut, e.g. F5). +1. Ensure that the Cataclysm project (`Cataclysm-vcpkg-static`) is the selected startup project. + + - Right click the project in the Solution Explorer pane, select `Set as Startup Project` + +2. Configure the working directory in the project settings to `$(ProjectDir)..` + + - Right click the project in the Solution Explorer pane, select `Properties` + - Under `Configuration Properties > Debugging`, change `Working Directory` to `$(ProjectDir)..` + - **Note:** If you change configurations (eg from `Release` to `Debug`), you will have to repeat this step. You only have to do it once per configuration, the setting will persist. If you discover that after pressing the debug button in Visual Studio, Cataclysm just exits after launch with return code 1, that is because of the wrong working directory. diff --git a/doc/MAGIC.md b/doc/MAGIC.md index 8463750b2c2c1..1fca77db2fa73 100644 --- a/doc/MAGIC.md +++ b/doc/MAGIC.md @@ -26,6 +26,9 @@ In `data/mods/Magiclysm` there is a template spell, copied here for your perusal "components": [requirement_id] // an id from a requirement, like the ones you use for crafting. spell components require to cast. "difficulty": 12, // the difficulty to learn/cast the spell "max_level": 10, // maximum level you can achieve in the spell + "min_accuracy" -20, // the accuracy bonus of the spell. around -15 and it gets blocked all the time + "max_accuracy": 20, // around 20 accuracy and it's basically impossible to block + "accuracy_increment": 1.5 "min_damage": 0, // minimum damage (or "starting" damage) "max_damage": 100, // maximum damage the spell can achieve "damage_increment": 2.5, // to get damage (and any of the other below stats) multiply this by spell's level and add to minimum damage @@ -181,6 +184,7 @@ Spells may have any number of flags, for example: | `TARGET_TELEPORT` | teleport spell changes to maximum range target with aoe as variation around target | `SPAWN_GROUP` | spawn or summon from an item or monster group, instead of individual item/monster ID | `SPAWN_WITH_DEATH_DROPS` | allows summoned monsters to retain their usual death drops, otherwise they drop nothing +| `NON_MAGICAL` | ignores spell resistance when calculating damage mitigation | `NO_PROJECTILE` | the "projectile" portion of the spell phases through walls. the epicenter of the spell effect is exactly where you target it with no regards to obstacles diff --git a/doc/MAPGEN.md b/doc/MAPGEN.md index 92739bbb724a1..95c5dfc51875b 100644 --- a/doc/MAPGEN.md +++ b/doc/MAPGEN.md @@ -427,6 +427,7 @@ Currently the defined flags are as follows: can be provided by these flags, then each of these things can be removed either individually or together. See the other entries below, such as `remove_all`. + `NO_UNDERLYING_ROTATE` The map won't be rotated even if the underlying tile is. ## Set terrain, furniture, or traps with a "set" array **optional** Specific commands to set terrain, furniture, traps, radiation, etc. Array is processed in order. @@ -1355,9 +1356,7 @@ other half to use `cabin_palette_abandoned`. # Using `update_mapgen` **update_mapgen** is a variant of normal JSON mapgen. Instead of creating a new overmap tile, it -updates an existing overmap tile with a specific set of changes. Currently, it only works within -the NPC mission interface, but it will be expanded to be a general purpose tool for modifying -existing maps. +updates an existing overmap tile with a specific set of changes. update_mapgen generally uses the same fields as JSON mapgen, with a few exceptions. update_mapgen has a few new fields to support missions, as well as ways to specify which overmap tile will be updated. diff --git a/doc/NPCs.md b/doc/NPCs.md index 423a332cdb347..66cad131bbd91 100644 --- a/doc/NPCs.md +++ b/doc/NPCs.md @@ -634,7 +634,8 @@ Effect | Description `u_add_var, npc_add_var`: `var_name, type: type_str`, `context: context_str`, either `value: value_str` or `time: true` or `possible_values: string_array` | Your character or the NPC will store `value_str` as a variable that can be later retrieved by `u_has_var` or `npc_has_var`. `npc_add_var` can be used to store arbitrary local variables, and `u_add_var` can be used to store arbitrary "global" variables, and should be used in preference to setting effects. If `time` is used instead of `value_str`, then the current turn of the game is stored. If `possible_values` is used one of the values given at random will be used. `u_lose_var`, `npc_lose_var`: `var_name`, `type: type_str`, `context: context_str` | Your character or the NPC will clear any stored variable that has the same `var_name`, `type_str`, and `context_str`. `u_adjust_var, npc_adjust_var`: `var_name, type: type_str`, `context: context_str`, `adjustment: adjustment_num or adjustment_variable_object` | Your character or the NPC will adjust the stored variable by `adjustment_num` (or the value of the variable described by `adjustment_num` see `variable_object` above). -`u_location_variable, npc_location_variable`: `target_var`,*optional* `min_radius: min_radius_int or min_radius_variable_object`,*optional* `max_radius: max_radius_int or max_radius_variable_object`, *optional* `outdoor_only: outdoor_only_bool`, *optional* `target_params: assign_mission_target` parameters | If `target_params` is defined it will be used to find a tile. See [the missions docs](MISSIONS_JSON.md) for `assign_mission_target` parameters. Otherwise targets a point between `min_radius_int`( or `min_radius_variable_object`)(defaults to 0) and `max_radius_int`( or `max_radius_variable_object`)(defaults to 0) spaces of the target and if `outdoor_only_bool` is true(defaults to false) will only choose outdoor spaces. The chosen point will be saved to `target_var` which is a `variable_object`. +`set_string_var`: `type: string or variable object`, `target_var: variable_object`| Store string (or the variable described) from `set_string_var` in the variable object `target_var`. +`u_location_variable, npc_location_variable`: `target_var`,*optional* `min_radius: min_radius_int or min_radius_variable_object`,*optional* `max_radius: max_radius_int or max_radius_variable_object`, *optional* `outdoor_only: outdoor_only_bool`, *optional* `target_params: assign_mission_target` parameters, *optional* `z_offset: z_int` | If `target_params` is defined it will be used to find a tile. See [the missions docs](MISSIONS_JSON.md) for `assign_mission_target` parameters. Otherwise targets a point between `min_radius_int`( or `min_radius_variable_object`)(defaults to 0) and `max_radius_int`( or `max_radius_variable_object`)(defaults to 0) spaces of the target and if `outdoor_only_bool` is true(defaults to false) will only choose outdoor spaces. The chosen point will be saved to `target_var` which is a `variable_object`. `z_offset` will be added to the Z value. `barber_hair` | Opens a menu allowing the player to choose a new hair style. `barber_beard` | Opens a menu allowing the player to choose a new beard style. `u_learn_recipe: recipe_string` | Your character will learn and memorize the recipe `recipe_string`. @@ -645,7 +646,7 @@ Effect | Description `u_add_morale: morale_string`, (*optional* `bonus: bonus_int` ), (*optional* `max_bonus: max_bonus_int or max_bonus_variable_object` ), (*optional* `duration: duration_string or duration_variable_object`), (*optional* `decay_start` : `decay_string or decay_variable_object`), (*optional* `capped`: `capped_bool`)
`npc_add_morale: morale_string`, (*optional* `bonus: bonus_int or bonus_variable_object` ), (*optional* `max_bonus: max_bonus_int` ), (*optional* `duration: duration_int`), (*optional*`decay_start` : `decay_int`), (*optional* `capped`: `capped_bool`)| Your character or the NPC will gain a morale bonus of type `morale_string`. Morale is changed by `bonus_int`( or the value of the variable described by `bonus_variable_object` see `variable_object` above) (default 1), with a maximum of up to `max_bonus_int`(or `max_bonus_variable_object`) (default 1). It will last for `duration: duration_string` time (default 1 hour) or `duration_variable_object`. It will begin to decay after `decay_string` time (default 30 minutes) or `decay_variable_object`. `capped_bool` Whether this morale is capped or not, defaults to false. `u_lose_morale: morale_string`
`npc_lose_morale: morale_string` | Your character or the NPC will lose any morale of type `morale_string`. `u_add_faction_trust: amount_int`
`u_lose_faction_trust: amount_int` | Your character gains or loses trust with the speaking NPC's faction, which affects which items become available for trading from shopkeepers of that faction. -`u_message, npc_message: message_string`, (*optional* `sound: sound_bool`),(*optional* `outdoor_only: outdoor_only_bool`),(*optional* `snippet: snippet_bool`),(*optional* `same_snippet: snippet_bool`,(*optional* `type: type_string`),(*optional* `popup: popup_bool`) | Displays a message to either the player or the npc of `message_string`. Will not display unless the player or npc is the actual player. If `snippet_bool` is true(defaults to false) it will instead display a random snippet from `message_string` category, if `same_snippet_bool` is true(defaults to false) it will always use the same snippet and will set a variable that can be used for custom item names(this requires the snippets to have id's set). If `sound` is true (defaults to false) it will only display the message if the player is not deaf. `outdoor_only`(defaults to false) only matters when `sound` is true and will make the message less likely to be heard if the player is underground. Message will display as type of `type_string`. Type affects the color of message and can be any of the following values: good, neutral, bad, mixed, warning, info, debug, headshot, critical, grazing. enums.h has more info on each types use. If `popup_bool` is true the message will be in a modal popup the user has to dismiss to continue. +`u_message, npc_message: message_string`, (*optional* `sound: sound_bool`),(*optional* `outdoor_only: outdoor_only_bool`),(*optional* `snippet: snippet_bool`),(*optional* `same_snippet: snippet_bool`,(*optional* `type: type_string`),(*optional* `popup: popup_bool`) | Displays a message to either the player or the npc of `message_string`. Will not display unless the player or npc is the actual player. If `snippet_bool` is true(defaults to false) it will instead display a random snippet from `message_string` category, if `same_snippet_bool` is true(defaults to false) it will always use the same snippet and will set a variable that can be used for custom item names(this requires the snippets to have id's set). If `sound` is true (defaults to false) it will only display the message if the player is not deaf. `outdoor_only`(defaults to false) only matters when `sound` is true and will make the message less likely to be heard if the player is underground. Message will display as type of `type_string`. Type affects the color of message and can be any of the following values: good, neutral, bad, mixed, warning, info, debug, headshot, critical, grazing. enums.h has more info on each types use. If `popup_bool` is true the message will be in a modal popup the user has to dismiss to continue. You can add variable values into a message by use of the tags ``, `` or ``. `u_cast_spell, npc_cast_spell : fake_spell_data` | The spell described by fake_spell_data will be cast with u or the npc as the caster and u or the npc's location as the target. Fake spell data can have the following attributes: `id:string`: the id of the spell to cast, (*optional* `hit_self`: bool ( defaults to false ) if true can hit the caster, `trigger_message`: string to display on trigger, `npc_message`: string for message if npc uses, `max_level` int max level of the spell, `min_level` int min level of the spell ) `u_assign_activity, npc_assign_activity: activity_id_string`, `duration: duration_string or duration_variable_object`) | Your character or the NPC will start activity `activity_id_string`. It will last for `duration: duration_string` time or `duration_variable_object`. `u_teleport, npc_teleport: target_var_object`, (*optional* `success_message: success_message_string`), (*optional* `fail_message: fail_message_string`) | u or npc are teleported to the destination stored in the variable named by `target_var`. `target_var` is an object with `value`,`type` and `context` as string values and a bool `global` which determines if the variable is global or not. If the teleport succeeds and `success_message` is defined it will be displayed, if it fails and `fail_message` is defined it will be displayed. @@ -817,6 +818,7 @@ Condition | Type | Description `"u_has_var"`, `"npc_has_var"` | string | `"type": type_str`, `"context": context_str`, and `"value": value_str` are required fields in the same dictionary as `"u_has_var"` or `"npc_has_var"`.
`true` is the player character or NPC has a variable set by `"u_add_var"` or `"npc_add_var"` with the string, `type_str`, `context_str`, and `value_str`. `"u_compare_var"`, `"npc_compare_var"` | dictionary | `"type": type_str`, `"context": context_str`, `"op": op_str`, `"value": value_num or variable_object` are required fields, referencing a var as in `"u_add_var"` or `"npc_add_var"`.
`true` if the player character or NPC has a stored variable that is true for the provided operator `op_str` (one of `==`, `!=`, `<`, `>`, `<=`, `>=`) and value (or the value of the variable described by `value` see `variable_object` above). `"u_compare_time_since_var"`, `"npc_compare_time_since_var_"` | dictionary | `"type": type_str`, `"context": context_str`, `"op": op_str`, `"time": time_string` are required fields, referencing a var as in `"u_add_var"` or `"npc_add_var"`.
`true` if the player character or NPC has a stored variable and the current turn and that value (converted to a time point) plus the time_string is true for the provided operator `op_str` (one of `==`, `!=`, `<`, `>`, `<=`, `>=`). *example*: `{ "u_compare_time_since_var": "test", "type": "test", "context": "var_time_test", "op": ">", "time": "3 days" }` returns true if the player character has a "test", "test", "var_time_test" variable and the current turn is greater than that value plus 3 days' worth of turns. +`"compare_string"` | array | The array must contain exactly two entries. They can be either strings or objects containing a variable object. Returns true if the strings are the same. `"u_has_strength"`
`"npc_has_strength"` | int or variable_object | `true` if the player character's or NPC's strength is at least the value of `u_has_strength` or `npc_has_strength` (or the value of the variable described see `variable_object` above). `"u_has_dexterity"`
`"npc_has_dexterity"` | int or variable_object | `true` if the player character's or NPC's dexterity is at least the value of `u_has_dexterity` or `npc_has_dexterity` ( or the value of the variable described see `variable_object` above). `"u_has_intelligence"`
`"npc_has_intelligence"` | int or variable_object| `true` if the player character's or NPC's intelligence is at least the value of `u_has_intelligence` or `npc_has_intelligence` ( or the value of the variable described see `variable_object` above). diff --git a/doc/TER_FURN_TRANSFORM.md b/doc/TER_FURN_TRANSFORM.md index 152c4ff776750..58e407e4c9148 100644 --- a/doc/TER_FURN_TRANSFORM.md +++ b/doc/TER_FURN_TRANSFORM.md @@ -19,18 +19,17 @@ A ter_furn_transform is a type of json object that allows you to specify a trans ] ``` -The example above turns "sand" into "dirt". It does so by comparing the direct terrain ids. In addition, we can add a fail message to the transform. +The example above turns "sand" into "dirt". It does so by comparing the direct terrain ids. If, however, we wanted to turn sand into "dirt or grass" we can do: ```json "terrain": [ - { - "fail_message": "no sand!", + { "result": [ "t_dirt", "t_grass" ], "valid_terrain": [ "t_sand" ], "message": "sandy!" } -] +], ``` message_good is optional and defaults to true. diff --git a/gfx/NeoDaysTileset/tile_config.json b/gfx/NeoDaysTileset/tile_config.json index 82cc750ce47d0..bec7b8579f440 100644 --- a/gfx/NeoDaysTileset/tile_config.json +++ b/gfx/NeoDaysTileset/tile_config.json @@ -1356,6 +1356,7 @@ "rotates": false }, { "id": "1st_aid", "fg": 1966, "rotates": false }, + { "id": "1st_aid_box", "fg": 1966, "rotates": false }, { "id": [ "20x66_10_mag", diff --git a/src/achievement.h b/src/achievement.h index b09250e7d7156..84175b9df5185 100644 --- a/src/achievement.h +++ b/src/achievement.h @@ -70,6 +70,7 @@ class achievement static void reset(); achievement_id id; + std::vector> src; bool was_loaded = false; const translation &name() const { diff --git a/src/activity_actor.cpp b/src/activity_actor.cpp index c8fc58b4486ce..9b37d7ff5f05d 100644 --- a/src/activity_actor.cpp +++ b/src/activity_actor.cpp @@ -1263,7 +1263,7 @@ void bikerack_racking_activity_actor::finish( player_activity &act, Character & { if( parent_vehicle.try_to_rack_nearby_vehicle( parts ) ) { map &here = get_map(); - here.invalidate_map_cache( here.get_abs_sub().z ); + here.invalidate_map_cache( here.get_abs_sub().z() ); here.rebuild_vehicle_level_caches(); } else { debugmsg( "Racking task failed. Parent-Vehicle:" + parent_vehicle.name + @@ -1304,7 +1304,7 @@ void bikerack_unracking_activity_actor::finish( player_activity &act, Character if( parent_vehicle.remove_carried_vehicle( parts ) ) { parent_vehicle.clear_bike_racks( racks ); map &here = get_map(); - here.invalidate_map_cache( here.get_abs_sub().z ); + here.invalidate_map_cache( here.get_abs_sub().z() ); here.rebuild_vehicle_level_caches(); } else { debugmsg( "Unracking task failed. Parent-Vehicle:" + parent_vehicle.name + diff --git a/src/activity_handlers.cpp b/src/activity_handlers.cpp index 97b1eb43a7555..5fc8153537c6f 100644 --- a/src/activity_handlers.cpp +++ b/src/activity_handlers.cpp @@ -1419,7 +1419,7 @@ void activity_handlers::fill_liquid_do_turn( player_activity *act, Character *yo break; } case liquid_target_type::CONTAINER: - you->pour_into( *act_ref.targets.at( 0 ), liquid ); + you->pour_into( *act_ref.targets.at( 0 ), liquid, true ); break; case liquid_target_type::MAP: if( iexamine::has_keg( act_ref.coords.at( 1 ) ) ) { @@ -1936,7 +1936,7 @@ void activity_handlers::vehicle_finish( player_activity *act, Character *you ) act->values.size() ); } else { if( vp ) { - here.invalidate_map_cache( here.get_abs_sub().z ); + here.invalidate_map_cache( here.get_abs_sub().z() ); // TODO: Z (and also where the activity is queued) // Or not, because the vehicle coordinates are dropped anyway if( !resume_for_multi_activities( *you ) ) { diff --git a/src/activity_item_handling.cpp b/src/activity_item_handling.cpp index cc27cce0365f9..bb3357d217d0b 100644 --- a/src/activity_item_handling.cpp +++ b/src/activity_item_handling.cpp @@ -1979,7 +1979,7 @@ void activity_on_turn_move_loot( player_activity &act, Character &you ) map &here = get_map(); const tripoint_abs_ms abspos = you.get_location(); auto &mgr = zone_manager::get_manager(); - if( here.check_vehicle_zones( here.get_abs_sub().z ) ) { + if( here.check_vehicle_zones( here.get_abs_sub().z() ) ) { mgr.cache_vzones(); } diff --git a/src/ammo_effect.h b/src/ammo_effect.h index f34d1dfca9891..dd9f7d7039aba 100644 --- a/src/ammo_effect.h +++ b/src/ammo_effect.h @@ -48,6 +48,7 @@ struct ammo_effect { public: // Used by generic_factory string_id id; + std::vector, mod_id>> src; bool was_loaded = false; public: diff --git a/src/anatomy.h b/src/anatomy.h index 3d7a5dd854dd2..6a2d85ef67ce3 100644 --- a/src/anatomy.h +++ b/src/anatomy.h @@ -31,6 +31,7 @@ class anatomy public: anatomy_id id; + std::vector> src; bool was_loaded = false; anatomy() = default; diff --git a/src/ascii_art.h b/src/ascii_art.h index 56b41370b6274..08095d00fa3f6 100644 --- a/src/ascii_art.h +++ b/src/ascii_art.h @@ -17,6 +17,7 @@ class ascii_art bool was_loaded = false; ascii_art_id id; + std::vector> src; std::vector picture; }; diff --git a/src/avatar.h b/src/avatar.h index 2cc16b472fc60..72060c6c48e5a 100644 --- a/src/avatar.h +++ b/src/avatar.h @@ -346,7 +346,7 @@ class avatar : public Character int movecounter = 0; - // ammount of turns since last check for pocket noise + // amount of turns since last check for pocket noise time_point last_pocket_noise = time_point( 0 ); vproto_id starting_vehicle; diff --git a/src/basecamp.cpp b/src/basecamp.cpp index 49d6f5c645bcc..81264d907d01e 100644 --- a/src/basecamp.cpp +++ b/src/basecamp.cpp @@ -609,7 +609,7 @@ void basecamp::form_crafting_inventory( map &target_map ) const tripoint &origin = target_map.getlocal( dump_spot ); auto &mgr = zone_manager::get_manager(); map &here = get_map(); - if( here.check_vehicle_zones( here.get_abs_sub().z ) ) { + if( here.check_vehicle_zones( here.get_abs_sub().z() ) ) { mgr.cache_vzones(); } if( mgr.has_near( zone_type_CAMP_STORAGE, dump_spot, 60 ) ) { diff --git a/src/behavior.h b/src/behavior.h index 71a364251c41f..8f8cbeac732c8 100644 --- a/src/behavior.h +++ b/src/behavior.h @@ -9,6 +9,7 @@ #include #include "string_id.h" +#include "type_id.h" class JsonObject; @@ -73,6 +74,7 @@ class node_t void load( const JsonObject &jo, const std::string &src ); void check() const; string_id id; + std::vector, mod_id>> src; bool was_loaded = false; private: std::vector children; diff --git a/src/bionics.cpp b/src/bionics.cpp index fb057b279cea6..ba77bed26e536 100644 --- a/src/bionics.cpp +++ b/src/bionics.cpp @@ -2387,7 +2387,7 @@ void Character::perform_uninstall( const bionic &bio, int difficulty, int succes bionics_uninstall_failure( difficulty, success, adjusted_skill ); } - here.invalidate_map_cache( here.get_abs_sub().z ); + here.invalidate_map_cache( here.get_abs_sub().z() ); } bool Character::uninstall_bionic( const bionic &bio, monster &installer, Character &patient, @@ -2687,7 +2687,7 @@ void Character::perform_install( const bionic_id &bid, bionic_uid upbio_uid, int bionics_install_failure( bid, installer_name, difficulty, success, adjusted_skill, patient_pos ); } map &here = get_map(); - here.invalidate_map_cache( here.get_abs_sub().z ); + here.invalidate_map_cache( here.get_abs_sub().z() ); } void Character::bionics_install_failure( const bionic_id &bid, const std::string &installer, diff --git a/src/bionics.h b/src/bionics.h index 68e41086ad67b..75ce188c129d1 100644 --- a/src/bionics.h +++ b/src/bionics.h @@ -31,6 +31,7 @@ struct bionic_data { bionic_data(); bionic_id id; + std::vector> src; translation name; translation description; diff --git a/src/bodypart.h b/src/bodypart.h index 6c95994298246..250dd75ed0c5f 100644 --- a/src/bodypart.h +++ b/src/bodypart.h @@ -15,6 +15,7 @@ #include "enums.h" #include "flat_set.h" #include "int_id.h" +#include "mod_tracker.h" #include "string_id.h" #include "translations.h" #include "subbodypart.h" @@ -122,11 +123,13 @@ struct limb_score { } private: limb_score_id id; + std::vector> src; translation _name; bool wound_affect = true; bool encumb_affect = true; bool was_loaded = false; friend class generic_factory; + friend struct mod_tracker; }; struct bp_limb_score { @@ -169,6 +172,7 @@ struct body_part_type { bodypart_str_id id; + std::vector> src; bool was_loaded = false; // Those are stored untranslated diff --git a/src/butchery_requirements.cpp b/src/butchery_requirements.cpp index a78212d1b13a0..2c38c9ca9019f 100644 --- a/src/butchery_requirements.cpp +++ b/src/butchery_requirements.cpp @@ -54,8 +54,6 @@ bool butchery_requirements::is_valid() const void butchery_requirements::load( const JsonObject &jo, const std::string & ) { - mandatory( jo, was_loaded, "id", id ); - for( const JsonMember member : jo.get_object( "requirements" ) ) { float modifier = std::stof( member.name() ); requirements.emplace( modifier, std::map> {} ); diff --git a/src/butchery_requirements.h b/src/butchery_requirements.h index a45a308b985be..82c8dcb1c36c2 100644 --- a/src/butchery_requirements.h +++ b/src/butchery_requirements.h @@ -26,6 +26,7 @@ class butchery_requirements public: bool was_loaded = false; string_id id; + std::vector, mod_id>> src; // tries to find the requirement with the highest speed bonus. if it fails it returns cata::nullopt std::pair get_fastest_requirements( diff --git a/src/character.cpp b/src/character.cpp index 0b1d02667b72e..927639e8d0e21 100644 --- a/src/character.cpp +++ b/src/character.cpp @@ -5354,7 +5354,7 @@ bool Character::is_immune_effect( const efftype_id &eff ) const return worn_with_flag( flag_DEAF ) || has_flag( json_flag_DEAF ) || worn_with_flag( flag_PARTIAL_DEAF ) || has_flag( json_flag_IMMUNE_HEARING_DAMAGE ) || - is_wearing( itype_rm13_armor_on ); + is_wearing( itype_rm13_armor_on ) || is_deaf(); } else if( eff == effect_mute ) { return has_bionic( bio_voice ); } else if( eff == effect_corroding ) { @@ -5561,7 +5561,7 @@ bool Character::sees_with_specials( const Creature &critter ) const return false; } -bool Character::pour_into( item &container, item &liquid ) +bool Character::pour_into( item &container, item &liquid, bool ignore_settings ) { std::string err; const int amount = container.get_remaining_capacity_for_liquid( liquid, *this, &err ); @@ -5581,7 +5581,7 @@ bool Character::pour_into( item &container, item &liquid ) add_msg_if_player( _( "You pour %1$s into the %2$s." ), liquid.tname(), container.tname() ); - liquid.charges -= container.fill_with( liquid, amount ); + liquid.charges -= container.fill_with( liquid, amount, false, false, ignore_settings ); inv->unsort(); if( liquid.charges > 0 ) { @@ -7162,15 +7162,16 @@ std::string Character::weapname() const { if( weapon.is_gun() ) { gun_mode current_mode = weapon.gun_current_mode(); + const bool no_mode = !current_mode.target; std::string gunmode; - std::string gun_name = current_mode->tname(); + std::string gun_name = no_mode ? weapon.display_name() : current_mode->tname(); // only required for empty mags and empty guns std::string mag_ammo; - if( current_mode->gun_all_modes().size() > 1 ) { + if( !no_mode && current_mode->gun_all_modes().size() > 1 ) { gunmode = current_mode.tname() + " "; } - if( current_mode->uses_magazine() || current_mode->magazine_integral() ) { + if( !no_mode && ( current_mode->uses_magazine() || current_mode->magazine_integral() ) ) { if( current_mode->uses_magazine() && !current_mode->magazine_current() ) { mag_ammo = _( " (empty)" ); } else { diff --git a/src/character.h b/src/character.h index fe96756d553c9..b15e60a85bf76 100644 --- a/src/character.h +++ b/src/character.h @@ -624,6 +624,8 @@ class Character : public Creature, public visitable float dodge_roll() const override; /** Returns Creature::get_dodge() modified by any Character effects */ float get_dodge() const override; + /** in this case spell resistance is just the spellcraft skill for characters. */ + int get_spell_resist() const override; /** Handles the uncanny dodge bionic and effects, returns true if the player successfully dodges */ bool uncanny_dodge() override; float get_hit_base() const override; @@ -1760,7 +1762,7 @@ class Character : public Creature, public visitable * possible at all. `true` indicates at least some of the liquid has been moved. */ /**@{*/ - bool pour_into( item &container, item &liquid ); + bool pour_into( item &container, item &liquid, bool ignore_settings ); bool pour_into( const vpart_reference &vp, item &liquid ) const; /**@}*/ @@ -2755,7 +2757,7 @@ class Character : public Creature, public visitable * @details Accesses level of a given vitamin. If the vitamin_id specified does not * exist then this function simply returns 0. * - * @param vit ID of vitamin to check level for (ie "vitA", "vitB"). + * @param vit ID of vitamin to check level for (ie "vitC", "iron"). * @returns character's current level for specified vitamin */ int vitamin_get( const vitamin_id &vit ) const; diff --git a/src/character_martial_arts.cpp b/src/character_martial_arts.cpp index c086de31cdbfd..9379241e70b62 100644 --- a/src/character_martial_arts.cpp +++ b/src/character_martial_arts.cpp @@ -26,9 +26,9 @@ character_martial_arts::character_martial_arts() }; } -bool character_martial_arts::selected_allow_melee() const +bool character_martial_arts::selected_allow_all_weapons() const { - return style_selected->allow_melee; + return style_selected->allow_all_weapons; } bool character_martial_arts::selected_strictly_melee() const diff --git a/src/character_martial_arts.h b/src/character_martial_arts.h index 64787d358f95f..62079c12835cf 100644 --- a/src/character_martial_arts.h +++ b/src/character_martial_arts.h @@ -37,7 +37,7 @@ class character_martial_arts bool knows_selected_style() const; bool selected_strictly_melee() const; - bool selected_allow_melee() const; + bool selected_allow_all_weapons() const; bool selected_has_weapon( const itype_id &weap ) const; bool selected_force_unarmed() const; bool selected_is_none() const; diff --git a/src/character_modifier.h b/src/character_modifier.h index 0fc532e67fa65..676c679bef3d7 100644 --- a/src/character_modifier.h +++ b/src/character_modifier.h @@ -62,6 +62,7 @@ struct character_modifier { character_modifier_id id = character_modifier_id::NULL_ID(); std::map limbscores; mod_type limbscore_modop = MULT; + std::vector> src; body_part_type::type limbtype = body_part_type::type::num_types; translation desc = translation(); mod_type modtype = mod_type::NONE; @@ -75,6 +76,7 @@ struct character_modifier { std::string builtin; bool was_loaded = false; friend class generic_factory; + friend struct mod_tracker; }; -#endif // CATA_SRC_CHARACTER_MODIFIER_H \ No newline at end of file +#endif // CATA_SRC_CHARACTER_MODIFIER_H diff --git a/src/clothing_mod.h b/src/clothing_mod.h index 7465c9cc97efa..e62ec36975753 100644 --- a/src/clothing_mod.h +++ b/src/clothing_mod.h @@ -45,6 +45,7 @@ struct clothing_mod { bool has_mod_type( const clothing_mod_type &type ) const; clothing_mod_id id; + std::vector> src; bool was_loaded = false; flag_id flag; diff --git a/src/clzones.cpp b/src/clzones.cpp index 5e52f4d98f622..ff35264f567da 100644 --- a/src/clzones.cpp +++ b/src/clzones.cpp @@ -661,7 +661,7 @@ void zone_manager::cache_vzones() { vzone_cache.clear(); map &here = get_map(); - auto vzones = here.get_vehicle_zones( here.get_abs_sub().z ); + auto vzones = here.get_vehicle_zones( here.get_abs_sub().z() ); for( zone_data *elem : vzones ) { if( !elem->get_enabled() ) { continue; @@ -786,7 +786,7 @@ const zone_data *zone_manager::get_zone_at( const tripoint_abs_ms &where, } } map &here = get_map(); - auto vzones = here.get_vehicle_zones( here.get_abs_sub().z ); + auto vzones = here.get_vehicle_zones( here.get_abs_sub().z() ); for( const zone_data *zone : vzones ) { if( zone->has_inside( where ) && zone->get_type() == type ) { return zone; @@ -1006,7 +1006,7 @@ const zone_data *zone_manager::get_bottom_zone( } } map &here = get_map(); - auto vzones = here.get_vehicle_zones( here.get_abs_sub().z ); + auto vzones = here.get_vehicle_zones( here.get_abs_sub().z() ); for( auto it = vzones.rbegin(); it != vzones.rend(); ++it ) { const zone_data *zone = *it; if( zone->get_faction() != fac ) { @@ -1032,7 +1032,7 @@ void zone_manager::create_vehicle_loot_zone( vehicle &vehicle, const point &moun new_zone.set_is_vehicle( true ); auto nz = vehicle.loot_zones.emplace( mount_point, new_zone ); map &here = get_map(); - here.register_vehicle_zone( &vehicle, here.get_abs_sub().z ); + here.register_vehicle_zone( &vehicle, here.get_abs_sub().z() ); vehicle.zones_dirty = false; added_vzones.push_back( &nz->second ); cache_vzones(); @@ -1177,7 +1177,7 @@ std::vector zone_manager::get_zones( const faction_ } map &here = get_map(); - auto vzones = here.get_vehicle_zones( here.get_abs_sub().z ); + auto vzones = here.get_vehicle_zones( here.get_abs_sub().z() ); for( zone_data *zone : vzones ) { if( zone->get_faction() == fac ) { @@ -1200,7 +1200,7 @@ std::vector zone_manager::get_zones( } map &here = get_map(); - auto vzones = here.get_vehicle_zones( here.get_abs_sub().z ); + auto vzones = here.get_vehicle_zones( here.get_abs_sub().z() ); for( zone_data *zone : vzones ) { if( zone->get_faction() == fac ) { @@ -1398,7 +1398,7 @@ void zone_manager::revert_vzones() zone.set_is_vehicle( true ); vp->vehicle().loot_zones.emplace( vp->mount(), zone ); vp->vehicle().zones_dirty = false; - here.register_vehicle_zone( &vp->vehicle(), here.get_abs_sub().z ); + here.register_vehicle_zone( &vp->vehicle(), here.get_abs_sub().z() ); cache_vzones(); } } diff --git a/src/clzones.h b/src/clzones.h index a3d6baf35239c..7b712a4e463c8 100644 --- a/src/clzones.h +++ b/src/clzones.h @@ -45,6 +45,7 @@ class zone_type public: zone_type_id id; + std::vector> src; bool was_loaded = false; zone_type() = default; diff --git a/src/computer_session.cpp b/src/computer_session.cpp index e9815a538e683..f71839ed9a241 100644 --- a/src/computer_session.cpp +++ b/src/computer_session.cpp @@ -579,7 +579,7 @@ void computer_session::action_research() map &here = get_map(); // TODO: seed should probably be a member of the computer, or better: of the computer action. // It is here to ensure one computer reporting the same text on each invocation. - const int seed = std::hash {}( here.get_abs_sub() ) + comp.alerts; + const int seed = std::hash {}( here.get_abs_sub() ) + comp.alerts; cata::optional log = SNIPPET.random_from_category( "lab_notes", seed ); if( !log.has_value() ) { log = to_translation( "No data found." ); @@ -713,9 +713,9 @@ void computer_session::action_miss_launch() //...ERASE MISSILE, OPEN SILO, DISABLE COMPUTER // For each level between here and the surface, remove the missile - for( int level = get_map().get_abs_sub().z; level <= 0; level++ ) { + for( int level = get_map().get_abs_sub().z(); level <= 0; level++ ) { map tmpmap; - tmpmap.load( tripoint_abs_sm( get_map().get_abs_sub().x, get_map().get_abs_sub().y, level ), + tmpmap.load( tripoint_abs_sm( get_map().get_abs_sub().xy(), level ), false ); if( level < 0 ) { @@ -793,8 +793,8 @@ void computer_session::action_amigara_log() Character &player_character = get_player_character(); player_character.moves -= 30; reset_terminal(); - point abs_sub = get_map().get_abs_sub().xy(); - print_line( _( "NEPower Mine(%d:%d) Log" ), abs_sub.x, abs_sub.y ); + point_abs_sm abs_sub = get_map().get_abs_sub().xy(); + print_line( _( "NEPower Mine%s Log" ), abs_sub.to_string() ); print_text( "%s", SNIPPET.random_from_category( "amigara1" ).value_or( translation() ) ); if( !query_bool( _( "Continue reading?" ) ) ) { @@ -802,7 +802,7 @@ void computer_session::action_amigara_log() } player_character.moves -= 30; reset_terminal(); - print_line( _( "NEPower Mine(%d:%d) Log" ), abs_sub.x, abs_sub.y ); + print_line( _( "NEPower Mine%s Log" ), abs_sub.to_string() ); print_text( "%s", SNIPPET.random_from_category( "amigara2" ).value_or( translation() ) ); if( !query_bool( _( "Continue reading?" ) ) ) { @@ -810,7 +810,7 @@ void computer_session::action_amigara_log() } player_character.moves -= 30; reset_terminal(); - print_line( _( "NEPower Mine(%d:%d) Log" ), abs_sub.x, abs_sub.y ); + print_line( _( "NEPower Mine%s Log" ), abs_sub.to_string() ); print_text( "%s", SNIPPET.random_from_category( "amigara3" ).value_or( translation() ) ); if( !query_bool( _( "Continue reading?" ) ) ) { @@ -831,10 +831,10 @@ void computer_session::action_amigara_log() } player_character.moves -= 30; reset_terminal(); - tripoint abs_loc = get_map().get_abs_sub(); + tripoint_abs_sm abs_loc = get_map().get_abs_sub(); print_line( _( "SITE %d%d%d\n" "PERTINENT FOREMAN LOGS WILL BE PREPENDED TO NOTES" ), - abs_loc.x, abs_loc.y, std::abs( abs_loc.z ) ); + abs_loc.x(), abs_loc.y(), std::abs( abs_loc.z() ) ); print_text( "%s", SNIPPET.random_from_category( "amigara4" ).value_or( translation() ) ); print_gibberish_line(); print_gibberish_line(); @@ -1496,7 +1496,7 @@ void computer_session::failure_alarm() sounds::sound( player_character.pos(), 60, sounds::sound_t::alarm, _( "an alarm sound!" ), false, "environment", "alarm" ); - if( get_map().get_abs_sub().z > 0 && !get_timed_events().queued( timed_event_type::WANTED ) ) { + if( get_map().get_abs_sub().z() > 0 && !get_timed_events().queued( timed_event_type::WANTED ) ) { get_timed_events().add( timed_event_type::WANTED, calendar::turn + 30_minutes, 0, player_character.global_sm_location() ); } @@ -1587,9 +1587,9 @@ void computer_session::failure_amigara() get_player_character().add_effect( effect_amigara, 2_minutes ); map &here = get_map(); explosion_handler::explosion( tripoint( rng( 0, MAPSIZE_X ), rng( 0, MAPSIZE_Y ), - here.get_abs_sub().z ), 10, 0.7, false, 10 ); + here.get_abs_sub().z() ), 10, 0.7, false, 10 ); explosion_handler::explosion( tripoint( rng( 0, MAPSIZE_X ), rng( 0, MAPSIZE_Y ), - here.get_abs_sub().z ), 10, 0.7, false, 10 ); + here.get_abs_sub().z() ), 10, 0.7, false, 10 ); comp.remove_option( COMPACT_AMIGARA_START ); } diff --git a/src/condition.cpp b/src/condition.cpp index a0a42e9a4e033..00ada4f2026b6 100644 --- a/src/condition.cpp +++ b/src/condition.cpp @@ -171,6 +171,25 @@ duration_or_var get_duration_or_var( const JsonObject &jo, std::string member, b return ret_val; } +str_or_var get_str_or_var( const JsonValue &jv, std::string member, bool required, + std::string default_val ) +{ + str_or_var ret_val; + if( jv.test_string() ) { + ret_val.str_val = jv.get_string(); + } else if( jv.test_object() ) { + var_info var = read_var_info( jv.get_object(), true ); + ret_val.type = var.type; + ret_val.var_val = var.name; + ret_val.default_val = var.default_val; + } else if( required ) { + jv.throw_error( "No valid value for " + member ); + } else { + ret_val.str_val = default_val; + } + return ret_val; +} + tripoint get_tripoint_from_var( talker *target, cata::optional target_var, var_type vtype, talker *var_source ) { @@ -188,7 +207,9 @@ tripoint get_tripoint_from_var( talker *target, cata::optional targ var_info read_var_info( JsonObject jo, bool require_default ) { std::string default_val; - if( jo.has_string( "default" ) ) { + if( jo.has_string( "default_str" ) ) { + default_val = jo.get_string( "default_str" ); + } else if( jo.has_string( "default" ) ) { default_val = std::to_string( to_turns( read_from_json_string ( jo.get_member( "default" ), time_duration::units ) ) ); } else if( jo.has_int( "default" ) ) { @@ -1104,6 +1125,36 @@ static tripoint get_tripoint_from_string( std::string type, T &d ) return tripoint(); } +template +void conditional_t::set_compare_string( const JsonObject &jo, const std::string &member ) +{ + str_or_var first; + str_or_var second; + JsonArray objects = jo.get_array( member ); + if( objects.size() != 2 ) { + jo.throw_error( "incorrect number of values. Expected 2 in " + jo.str() ); + condition = []( const T & ) { + return false; + }; + return; + } + + if( objects.has_object( 0 ) ) { + first = get_str_or_var( objects.next(), member, true ); + } else { + first.str_val = objects.next_string(); + } + if( objects.has_object( 1 ) ) { + second = get_str_or_var( objects.next(), member, true ); + } else { + second.str_val = objects.next_string(); + } + + condition = [first, second]( const T & d ) { + return first.evaluate( d.actor( first.is_npc() ) ) == second.evaluate( d.actor( second.is_npc() ) ); + }; +} + template void conditional_t::set_compare_int( const JsonObject &jo, const std::string &member ) { @@ -1312,7 +1363,7 @@ std::function conditional_t::get_get_int( const JsonObject } } else if( checked_value == "owed" ) { if( is_npc ) { - jo.throw_error( "owed ammount not supported for NPCs. In " + jo.str() ); + jo.throw_error( "owed amount not supported for NPCs. In " + jo.str() ); } else { return []( const T & d ) { return d.actor( true )->debt(); @@ -1320,7 +1371,7 @@ std::function conditional_t::get_get_int( const JsonObject } } else if( checked_value == "sold" ) { if( is_npc ) { - jo.throw_error( "owed ammount not supported for NPCs. In " + jo.str() ); + jo.throw_error( "owed amount not supported for NPCs. In " + jo.str() ); } else { return []( const T & d ) { return d.actor( true )->sold(); @@ -1938,6 +1989,8 @@ conditional_t::conditional_t( const JsonObject &jo ) set_has_faction_trust( jo, "u_has_faction_trust" ); } else if( jo.has_member( "compare_int" ) ) { set_compare_int( jo, "compare_int" ); + } else if( jo.has_member( "compare_string" ) ) { + set_compare_string( jo, "compare_string" ); } else { for( const std::string &sub_member : dialogue_data::simple_string_conds ) { if( jo.has_string( sub_member ) ) { diff --git a/src/condition.h b/src/condition.h index c9028464de592..c7011fef87439 100644 --- a/src/condition.h +++ b/src/condition.h @@ -46,10 +46,12 @@ const std::unordered_set complex_conds = { { "is_temperature", "is_windpower", "is_humidity", "is_pressure", "u_is_height", "npc_is_height", "u_has_worn_with_flag", "npc_has_worn_with_flag", "u_has_wielded_with_flag", "npc_has_wielded_with_flag", "u_has_pain", "npc_has_pain", "u_has_power", "npc_has_power", "u_has_focus", "npc_has_focus", "u_has_morale", - "npc_has_morale", "u_is_on_terrain", "npc_is_on_terrain", "u_is_in_field", "npc_is_in_field", "compare_int" + "npc_has_morale", "u_is_on_terrain", "npc_is_on_terrain", "u_is_in_field", "npc_is_in_field", "compare_int", "compare_string" } }; } // namespace dialogue_data +str_or_var get_str_or_var( const JsonValue &jv, std::string member, bool required = true, + std::string default_val = "" ); int_or_var get_int_or_var( const JsonObject &jo, std::string member, bool required = true, int default_val = 0 ); int_or_var_part get_int_or_var_part( const JsonValue &jv, std::string member, bool required = true, @@ -171,6 +173,7 @@ struct conditional_t { void set_u_know_recipe( const JsonObject &jo, const std::string &member ); void set_mission_has_generic_rewards(); void set_can_see( bool is_npc = false ); + void set_compare_string( const JsonObject &jo, const std::string &member ); void set_compare_int( const JsonObject &jo, const std::string &member ); static std::function get_get_int( const JsonObject &jo ); static std::function get_get_int( std::string value, const JsonObject &jo ); diff --git a/src/construction.cpp b/src/construction.cpp index 43dab1374d96e..c793e9c537ccc 100644 --- a/src/construction.cpp +++ b/src/construction.cpp @@ -1199,13 +1199,13 @@ bool construct::check_empty_up_OK( const tripoint &p ) bool construct::check_up_OK( const tripoint & ) { // You're not going above +OVERMAP_HEIGHT. - return ( get_map().get_abs_sub().z < OVERMAP_HEIGHT ); + return ( get_map().get_abs_sub().z() < OVERMAP_HEIGHT ); } bool construct::check_down_OK( const tripoint & ) { // You're not going below -OVERMAP_DEPTH. - return ( get_map().get_abs_sub().z > -OVERMAP_DEPTH ); + return ( get_map().get_abs_sub().z() > -OVERMAP_DEPTH ); } bool construct::check_no_trap( const tripoint &p ) diff --git a/src/construction_category.h b/src/construction_category.h index 5ab19ebe793a9..ba1feaa7caa8f 100644 --- a/src/construction_category.h +++ b/src/construction_category.h @@ -15,6 +15,7 @@ struct construction_category { void load( const JsonObject &jo, const std::string &src ); construction_category_id id; + std::vector> src; bool was_loaded = false; std::string name() const { diff --git a/src/construction_group.h b/src/construction_group.h index b5d091336ff42..dffc42e6e74bd 100644 --- a/src/construction_group.h +++ b/src/construction_group.h @@ -15,6 +15,7 @@ struct construction_group { void load( const JsonObject &jo, const std::string &src ); construction_group_str_id id; + std::vector> src; bool was_loaded = false; std::string name() const; diff --git a/src/coordinates.h b/src/coordinates.h index 0a7f88c133e92..b204b23936cf9 100644 --- a/src/coordinates.h +++ b/src/coordinates.h @@ -95,6 +95,7 @@ class coord_point { public: static constexpr int dimension = Point::dimension; + using this_as_tripoint = coord_point; constexpr coord_point() = default; explicit constexpr coord_point( const Point &p ) : @@ -186,24 +187,24 @@ class coord_point return coord_point( l.raw() + r ); } - friend inline coord_point operator+( const coord_point &l, const tripoint &r ) { - return coord_point( l.raw() + r ); + friend inline this_as_tripoint operator+( const coord_point &l, const tripoint &r ) { + return this_as_tripoint( l.raw() + r ); } friend inline coord_point operator+( const point &l, const coord_point &r ) { return coord_point( l + r.raw() ); } - friend inline coord_point operator+( const tripoint &l, const coord_point &r ) { - return coord_point( l + r.raw() ); + friend inline this_as_tripoint operator+( const tripoint &l, const coord_point &r ) { + return this_as_tripoint( l + r.raw() ); } friend inline coord_point operator-( const coord_point &l, const point &r ) { return coord_point( l.raw() - r ); } - friend inline coord_point operator-( const coord_point &l, const tripoint &r ) { - return coord_point( l.raw() - r ); + friend inline this_as_tripoint operator-( const coord_point &l, const tripoint &r ) { + return this_as_tripoint( l.raw() - r ); } private: Point raw_; @@ -487,6 +488,7 @@ using point_rel_ms = coords::coord_point; using point_sm_ms = coords::coord_point; using point_omt_ms = coords::coord_point; +using point_rel_sm = coords::coord_point; using point_abs_sm = coords::coord_point; using point_omt_sm = coords::coord_point; using point_om_sm = coords::coord_point; diff --git a/src/creature.cpp b/src/creature.cpp index 44ae993f983f3..6628242e62a6a 100644 --- a/src/creature.cpp +++ b/src/creature.cpp @@ -939,7 +939,7 @@ projectile_attack_results Creature::select_body_part_projectile_attack( const float crit_multiplier = proj.critical_multiplier; const float std_hit_mult = std::sqrt( 2.0 * crit_multiplier ); if( magic ) { - ret.damage_mult *= rng_float( 0.9, 1.1 ); + // do nothing special, no damage mults, nothing } else if( goodhit < accuracy_headshot && ret.max_damage * crit_multiplier > get_hp_max( bodypart_id( "head" ) ) ) { ret.message = _( "Headshot!" ); @@ -1869,6 +1869,13 @@ int Creature::get_armor_bullet_bonus() const { return armor_bullet_bonus; } + +int Creature::get_spell_resist() const +{ + // TODO: add spell resistance to monsters, then make this pure virtual + return 0; +} + int Creature::get_speed() const { return get_speed_base() + get_speed_bonus(); @@ -2061,8 +2068,9 @@ float Creature::get_part_wetness_percentage( const bodypart_id &id ) const void Creature::set_part_hp_cur( const bodypart_id &id, int set ) { + bool was_broken = is_avatar() && as_character()->is_limb_broken( id ); set_part_helper( *this, id, &bodypart::set_hp_cur, set ); - if( is_avatar() && as_character()->is_limb_broken( id ) ) { + if( !was_broken && is_avatar() && as_character()->is_limb_broken( id ) ) { get_event_bus().send( as_character()->getID(), id ); } } @@ -2119,8 +2127,9 @@ void Creature::set_part_mut_drench( const bodypart_id &id, std::pairis_limb_broken( id ); set_part_helper( *this, id, &bodypart::mod_hp_cur, mod ); - if( is_avatar() && as_character()->is_limb_broken( id ) ) { + if( !was_broken && is_avatar() && as_character()->is_limb_broken( id ) ) { get_event_bus().send( as_character()->getID(), id ); } } diff --git a/src/creature.h b/src/creature.h index 016c5151467ff..2b76e0ee8b86d 100644 --- a/src/creature.h +++ b/src/creature.h @@ -680,6 +680,7 @@ class Creature : public viewer virtual int get_armor_bash_bonus() const; virtual int get_armor_cut_bonus() const; virtual int get_armor_bullet_bonus() const; + virtual int get_spell_resist() const; virtual int get_armor_type( damage_type dt, bodypart_id bp ) const = 0; diff --git a/src/debug.cpp b/src/debug.cpp index 5262e4f7f640f..5d8f5d6e31b69 100644 --- a/src/debug.cpp +++ b/src/debug.cpp @@ -1560,8 +1560,17 @@ static std::string windows_version() } if( success && major_version == 10 ) { buffer_size = c_buffer_size; - success = RegQueryValueExA( handle_key, "ReleaseId", nullptr, &value_type, &byte_buffer[0], + // present in Windows 10 version >= 20H2, aka 2009 + success = RegQueryValueExA( handle_key, "DisplayVersion", nullptr, &value_type, &byte_buffer[0], &buffer_size ) == ERROR_SUCCESS && value_type == REG_SZ; + + if( !success ) { + // only accurate in Windows 10 version <= 2009 + buffer_size = c_buffer_size; + success = RegQueryValueExA( handle_key, "ReleaseId", nullptr, &value_type, &byte_buffer[0], + &buffer_size ) == ERROR_SUCCESS && value_type == REG_SZ; + } + if( success ) { output.append( " " ); output.append( std::string( reinterpret_cast( byte_buffer.data() ) ) ); diff --git a/src/debug_menu.cpp b/src/debug_menu.cpp index ac5b94aa8e884..5c01638249f59 100644 --- a/src/debug_menu.cpp +++ b/src/debug_menu.cpp @@ -196,6 +196,7 @@ std::string enum_to_string( debug_menu::debug_menu case debug_menu::debug_menu_index::TEST_WEATHER: return "TEST_WEATHER"; case debug_menu::debug_menu_index::WRITE_GLOBAL_EOCS: return "WRITE_GLOBAL_EOCS"; case debug_menu::debug_menu_index::WRITE_GLOBAL_VARS: return "WRITE_GLOBAL_VARS"; + case debug_menu::debug_menu_index::EDIT_GLOBAL_VARS: return "SET_GLOBAL_VARS"; case debug_menu::debug_menu_index::SAVE_SCREENSHOT: return "SAVE_SCREENSHOT"; case debug_menu::debug_menu_index::GAME_REPORT: return "GAME_REPORT"; case debug_menu::debug_menu_index::DISPLAY_SCENTS_LOCAL: return "DISPLAY_SCENTS_LOCAL"; @@ -214,7 +215,7 @@ std::string enum_to_string( debug_menu::debug_menu case debug_menu::debug_menu_index::EDIT_CAMP_LARDER: return "EDIT_CAMP_LARDER"; case debug_menu::debug_menu_index::VEHICLE_BATTERY_CHARGE: return "VEHICLE_BATTERY_CHARGE"; case debug_menu::debug_menu_index::GENERATE_EFFECT_LIST: return "GENERATE_EFFECT_LIST"; - case debug_menu::debug_menu_index::ACTIVATE_EOC: return "ACTIVATE_EOC"; + case debug_menu::debug_menu_index::ACTIVATE_EOC: return "ACTIVATE_EOC"; // *INDENT-ON* case debug_menu::debug_menu_index::last: break; @@ -316,7 +317,8 @@ static int info_uilist( bool display_all_entries = true ) { uilist_entry( debug_menu_index::PRINT_NPC_MAGIC, true, 'M', _( "Print NPC magic info to console" ) ) }, { uilist_entry( debug_menu_index::TEST_WEATHER, true, 'W', _( "Test weather" ) ) }, { uilist_entry( debug_menu_index::WRITE_GLOBAL_EOCS, true, 'C', _( "Write global effect_on_condition(s) to eocs.output" ) ) }, - { uilist_entry( debug_menu_index::WRITE_GLOBAL_VARS, true, 'G', _( "Write global vars(s) to var_list.output" ) ) }, + { uilist_entry( debug_menu_index::WRITE_GLOBAL_VARS, true, 'G', _( "Write global var(s) to var_list.output" ) ) }, + { uilist_entry( debug_menu_index::EDIT_GLOBAL_VARS, true, 'e', _( "Edit global var(s)" ) ) }, { uilist_entry( debug_menu_index::TEST_MAP_EXTRA_DISTRIBUTION, true, 'e', _( "Test map extra list" ) ) }, { uilist_entry( debug_menu_index::GENERATE_EFFECT_LIST, true, 'L', _( "Generate effect list" ) ) }, }; @@ -1189,7 +1191,7 @@ static void spawn_nested_mapgen() ( *ptr )->nest( md, local_ms.xy(), "debug menu" ); target_map.save(); g->load_npcs(); - here.invalidate_map_cache( here.get_abs_sub().z ); + here.invalidate_map_cache( here.get_abs_sub().z() ); } } @@ -1634,7 +1636,7 @@ static void character_edit_menu() D_DESC, D_SKILLS, D_THEORY, D_PROF, D_STATS, D_SPELLS, D_ITEMS, D_DELETE_ITEMS, D_ITEM_WORN, D_HP, D_STAMINA, D_MORALE, D_PAIN, D_NEEDS, D_HEALTHY, D_STATUS, D_MISSION_ADD, D_MISSION_EDIT, D_TELE, D_MUTATE, D_CLASS, D_ATTITUDE, D_OPINION, D_ADD_EFFECT, D_ASTHMA, D_PRINT_VARS, - D_WRITE_EOCS, D_KILL_XP + D_WRITE_EOCS, D_KILL_XP, D_EDIT_VARS }; nmenu.addentry( D_DESC, true, 'D', "%s", _( "Edit [D]escription - Name, Age, Height or Blood type" ) ); @@ -1667,6 +1669,9 @@ static void character_edit_menu() nmenu.addentry( D_PRINT_VARS, true, 'V', "%s", _( "Print [V]ars to file" ) ); nmenu.addentry( D_WRITE_EOCS, true, 'w', "%s", _( "[w]rite effect_on_condition(s) to eocs.output." ) ); + nmenu.addentry( D_EDIT_VARS, true, 'v', "%s", + _( "Edit [v]ars" ) ); + if( you.is_npc() ) { nmenu.addentry( D_MISSION_ADD, true, 'm', "%s", _( "Add [m]ission" ) ); nmenu.addentry( D_CLASS, true, 'c', "%s", _( "Randomize with [c]lass" ) ); @@ -1896,8 +1901,24 @@ static void character_edit_menu() case D_WRITE_EOCS: { effect_on_conditions::write_eocs_to_file( you ); popup( _( "effect_on_condition list written to eocs.output" ) ); + break; + } + case D_EDIT_VARS: { + std::string key; + std::string value; + string_input_popup popup_key; + string_input_popup popup_val; + popup_key + .title( _( "Key" ) ) + .width( 85 ) + .edit( key ); + popup_val + .title( _( "Value" ) ) + .width( 85 ) + .edit( value ); + you.set_value( "npctalk_var_" + key, value ); + break; } - break; } } @@ -2122,7 +2143,7 @@ static void debug_menu_game_state() { avatar &player_character = get_avatar(); map &here = get_map(); - tripoint abs_sub = here.get_abs_sub(); + tripoint_abs_sm abs_sub = here.get_abs_sub(); std::string mfus; std::vector> sorted; sorted.reserve( m_flag::MF_MAX ); @@ -2172,7 +2193,7 @@ static void debug_menu_game_state() popup_top( s.c_str(), - player_character.posx(), player_character.posy(), abs_sub.x, abs_sub.y, + player_character.posx(), player_character.posy(), abs_sub.x(), abs_sub.y(), overmap_buffer.ter( player_character.global_omt_location() )->get_name(), to_turns( calendar::turn - calendar::turn_zero ), g->num_creatures() ); @@ -2837,7 +2858,7 @@ void debug() mx_map.load( where_sm, false ); MapExtras::apply_function( mx_str[mx_choice], mx_map, where_sm ); g->load_npcs(); - here.invalidate_map_cache( here.get_abs_sub().z ); + here.invalidate_map_cache( here.get_abs_sub().z() ); } } break; @@ -2915,6 +2936,24 @@ void debug() } break; + case debug_menu_index::EDIT_GLOBAL_VARS: { + std::string key; + std::string value; + string_input_popup popup_key; + string_input_popup popup_val; + popup_key + .title( _( "Key" ) ) + .width( 85 ) + .edit( key ); + popup_val + .title( _( "Value" ) ) + .width( 85 ) + .edit( value ); + global_variables &globvars = get_globals(); + globvars.set_global_value( "npctalk_var_" + key, value ); + } + break; + case debug_menu_index::SAVE_SCREENSHOT: g->queue_screenshot = true; break; @@ -2997,7 +3036,7 @@ void debug() case debug_menu_index::last: return; } - here.invalidate_map_cache( here.get_abs_sub().z ); + here.invalidate_map_cache( here.get_abs_sub().z() ); } } // namespace debug_menu diff --git a/src/debug_menu.h b/src/debug_menu.h index 773aaff8ca20e..ea2b1b2889a91 100644 --- a/src/debug_menu.h +++ b/src/debug_menu.h @@ -92,6 +92,7 @@ enum class debug_menu_index : int { EDIT_CAMP_LARDER, WRITE_GLOBAL_EOCS, WRITE_GLOBAL_VARS, + EDIT_GLOBAL_VARS, ACTIVATE_EOC, last }; diff --git a/src/dialogue.h b/src/dialogue.h index 665741dfe554c..9ebe49053a514 100644 --- a/src/dialogue.h +++ b/src/dialogue.h @@ -158,6 +158,7 @@ struct talk_effect_fun_t { void set_add_faction_trust( const JsonObject &jo, const std::string &member ); void set_lose_faction_trust( const JsonObject &jo, const std::string &member ); void set_arithmetic( const JsonObject &jo, const std::string &member ); + void set_set_string_var( const JsonObject &jo, const std::string &member ); void set_custom_light_level( const JsonObject &jo, const std::string &member ); void set_spawn_monster( const JsonObject &jo, const std::string &member, bool is_npc ); void set_field( const JsonObject &jo, const std::string &member, bool is_npc ); @@ -428,6 +429,30 @@ static std::string read_var_value( var_type type, std::string name, talker *talk return ""; } +struct str_or_var { + cata::optional str_val; + cata::optional var_val; + cata::optional default_val; + var_type type = var_type::u; + bool is_npc() const { + return type == var_type::npc; + } + std::string evaluate( talker *talk ) const { + if( str_val.has_value() ) { + return str_val.value(); + } else if( var_val.has_value() ) { + std::string val = read_var_value( type, var_val.value(), talk ); + if( !val.empty() ) { + return std::string( val ); + } + return default_val.value(); + } else { + debugmsg( "No valid value." ); + return ""; + } + } +}; + struct int_or_var_part { cata::optional int_val; cata::optional var_val; diff --git a/src/disease.h b/src/disease.h index 9a1f0ebb198e0..ddfcbded3e93f 100644 --- a/src/disease.h +++ b/src/disease.h @@ -23,6 +23,7 @@ class disease_type bool was_loaded = false; diseasetype_id id; + std::vector> src; time_duration min_duration = 1_turns; time_duration max_duration = 1_turns; int min_intensity = 1; diff --git a/src/display.cpp b/src/display.cpp index 6a96dd93abd79..b24bd6072646a 100644 --- a/src/display.cpp +++ b/src/display.cpp @@ -205,7 +205,7 @@ std::string display::time_string( const Character &u ) // Return exact time if character has a watch, or approximate time if aboveground if( u.has_watch() ) { return to_string_time_of_day( calendar::turn ); - } else if( get_map().get_abs_sub().z >= 0 ) { + } else if( get_map().get_abs_sub().z() >= 0 ) { return display::time_approx(); } else { // NOLINTNEXTLINE(cata-text-style): the question mark does not end a sentence @@ -1137,7 +1137,7 @@ std::string display::colorized_overmap_text( const avatar &u, const int width, c mission_xyz.y() <= center_xyz.y() + bottom ) && ( row == top || row == bottom || col == left || col == right ); // Get colorized symbol for this point - const tripoint_abs_omt omt( center_xyz.xy() + point( col, row ), here.get_abs_sub().z ); + const tripoint_abs_omt omt( center_xyz.xy() + point( col, row ), here.get_abs_sub().z() ); std::pair sym_color = display::overmap_tile_symbol_color( u, omt, edge, found_mi ); diff --git a/src/do_turn.cpp b/src/do_turn.cpp index cc64da2bf090c..ac8276bc82739 100644 --- a/src/do_turn.cpp +++ b/src/do_turn.cpp @@ -766,7 +766,7 @@ bool do_turn() // Apply sounds from previous turn to monster and NPC AI. sounds::process_sounds(); - const int levz = m.get_abs_sub().z; + const int levz = m.get_abs_sub().z(); // Update vision caches for monsters. If this turns out to be expensive, // consider a stripped down cache just for monsters. m.build_map_cache( levz, true ); diff --git a/src/effect_on_condition.cpp b/src/effect_on_condition.cpp index 0461f3f5cee02..619447ddd7f3a 100644 --- a/src/effect_on_condition.cpp +++ b/src/effect_on_condition.cpp @@ -99,6 +99,7 @@ effect_on_condition_id effect_on_conditions::load_inline_eoc( const JsonValue &j } else if( jv.test_object() ) { effect_on_condition inline_eoc; inline_eoc.load( jv.get_object(), src ); + mod_tracker::assign_src( inline_eoc, src ); effect_on_condition_factory.insert( inline_eoc ); return inline_eoc.id; } else { diff --git a/src/effect_on_condition.h b/src/effect_on_condition.h index 41c87d6a904e9..5c87b6b115d2f 100644 --- a/src/effect_on_condition.h +++ b/src/effect_on_condition.h @@ -31,6 +31,7 @@ struct effect_on_condition { /* If this is true it will be run on the player and every npc. Deactivate conditions will work based on the player. */ bool global = false; effect_on_condition_id id; + std::vector> src; eoc_type type; std::function condition; std::function deactivate_condition; diff --git a/src/event_statistics.h b/src/event_statistics.h index 9c844d5cbd8f8..22dc1502fdaac 100644 --- a/src/event_statistics.h +++ b/src/event_statistics.h @@ -10,6 +10,7 @@ #include "clone_ptr.h" #include "string_id.h" #include "translations.h" +#include "type_id.h" class cata_variant; @@ -53,6 +54,7 @@ class event_transformation static void reset(); string_id id; + std::vector, mod_id>> src; bool was_loaded = false; event_fields_type fields() const; @@ -78,6 +80,7 @@ class event_statistic static void reset(); string_id id; + std::vector, mod_id>> src; bool was_loaded = false; const translation &description() const { @@ -110,6 +113,7 @@ class score static void reset(); string_id id; + std::vector, mod_id>> src; bool was_loaded = false; private: translation description_; diff --git a/src/faction_camp.cpp b/src/faction_camp.cpp index 4c5d6f43e2451..b0bd294f9c05b 100644 --- a/src/faction_camp.cpp +++ b/src/faction_camp.cpp @@ -819,7 +819,7 @@ void talk_function::basecamp_mission( npc &p ) if( bcp->get_dumping_spot() == tripoint_abs_ms{} ) { map &here = get_map(); auto &mgr = zone_manager::get_manager(); - if( here.check_vehicle_zones( here.get_abs_sub().z ) ) { + if( here.check_vehicle_zones( here.get_abs_sub().z() ) ) { mgr.cache_vzones(); } tripoint src_loc; @@ -1664,10 +1664,10 @@ bool basecamp::handle_mission( const std::string &miss_id, gathering_return( base_camps::miss_info[base_camps::faction_mission::Foraging].id, 4_hours ); } if( miss_id == base_camps::miss_info[base_camps::faction_mission::Trapping].miss_id ) { - start_mission( base_camps::miss_info[base_camps::faction_mission::Foraging].id, 6_hours, true, + start_mission( base_camps::miss_info[base_camps::faction_mission::Trapping].id, 6_hours, true, _( "departs to set traps for small animals…" ), false, {}, skill_traps, 0 ); - } else if( miss_id == base_camps::miss_info[base_camps::faction_mission::Foraging].ret_miss_id ) { - gathering_return( base_camps::miss_info[base_camps::faction_mission::Foraging].id, 6_hours ); + } else if( miss_id == base_camps::miss_info[base_camps::faction_mission::Trapping].ret_miss_id ) { + gathering_return( base_camps::miss_info[base_camps::faction_mission::Trapping].id, 6_hours ); } if( miss_id == base_camps::miss_info[base_camps::faction_mission::Hunting].miss_id ) { @@ -4490,7 +4490,7 @@ bool basecamp::validate_sort_points() { auto &mgr = zone_manager::get_manager(); map &here = get_map(); - if( here.check_vehicle_zones( here.get_abs_sub().z ) ) { + if( here.check_vehicle_zones( here.get_abs_sub().z() ) ) { mgr.cache_vzones(); } tripoint src_loc = here.getlocal( bb_pos ) + point_north; @@ -4765,7 +4765,7 @@ bool basecamp::distribute_food() map &here = get_map(); auto &mgr = zone_manager::get_manager(); - if( here.check_vehicle_zones( here.get_abs_sub().z ) ) { + if( here.check_vehicle_zones( here.get_abs_sub().z() ) ) { mgr.cache_vzones(); } const tripoint_abs_ms &abspos = get_dumping_spot(); @@ -4896,7 +4896,7 @@ void basecamp::place_results( const item &result ) } else { map &here = get_map(); auto &mgr = zone_manager::get_manager(); - if( here.check_vehicle_zones( here.get_abs_sub().z ) ) { + if( here.check_vehicle_zones( here.get_abs_sub().z() ) ) { mgr.cache_vzones(); } Character &player_character = get_player_character(); diff --git a/src/field_type.h b/src/field_type.h index ee829a38de8c1..988fb550ff004 100644 --- a/src/field_type.h +++ b/src/field_type.h @@ -56,6 +56,7 @@ struct enum_traits { struct field_effect { efftype_id id; + std::vector> src; time_duration min_duration = 0_seconds; time_duration max_duration = 0_seconds; int intensity = 0; @@ -172,6 +173,7 @@ struct field_type { // Used by generic_factory field_type_str_id id; + std::vector> src; bool was_loaded = false; int legacy_enum_id = -1; diff --git a/src/flag.cpp b/src/flag.cpp index 3cc0513727d8e..e19f6119ecafb 100644 --- a/src/flag.cpp +++ b/src/flag.cpp @@ -192,6 +192,7 @@ const flag_id flag_NONCONDUCTIVE( "NONCONDUCTIVE" ); const flag_id flag_NON_FOULING( "NON_FOULING" ); const flag_id flag_NORMAL( "NORMAL" ); const flag_id flag_NOT_FOOTWEAR( "NOT_FOOTWEAR" ); +const flag_id flag_NO_CLEAN( "NO_CLEAN" ); const flag_id flag_NO_CVD( "NO_CVD" ); const flag_id flag_NO_DROP( "NO_DROP" ); const flag_id flag_NO_INGEST( "NO_INGEST" ); diff --git a/src/flag.h b/src/flag.h index 4740569a49cea..bcc951429d4f3 100644 --- a/src/flag.h +++ b/src/flag.h @@ -350,6 +350,7 @@ extern const flag_id flag_ZOOM; extern const flag_id flag_wooled; extern const flag_id flag_MUTE; extern const flag_id flag_NOT_FOOTWEAR; +extern const flag_id flag_NO_CLEAN; extern const flag_id flag_SOFT; extern const flag_id flag_HARD; @@ -372,6 +373,7 @@ class json_flag public: // used by generic_factory flag_id id = flag_NULL; + std::vector> src; bool was_loaded = false; json_flag() = default; diff --git a/src/game.cpp b/src/game.cpp index 89182b87499fc..a2795bea7eb06 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -813,7 +813,7 @@ bool game::start_game() lev -= point( HALF_MAPSIZE, HALF_MAPSIZE ); load_map( lev, /*pump_events=*/true ); - int level = m.get_abs_sub().z; + int level = m.get_abs_sub().z(); u.setpos( m.getlocal( project_to( omtstart ) ) ); m.invalidate_map_cache( level ); m.build_map_cache( level ); @@ -2753,7 +2753,7 @@ bool game::load( const save_t &name ) effect_on_conditions::load_existing_character( u ); // recalculate light level for correctly resuming crafting and disassembly - m.build_map_cache( m.get_abs_sub().z ); + m.build_map_cache( m.get_abs_sub().z() ); return true; } @@ -3563,7 +3563,7 @@ void game::draw_minimap() const tripoint_abs_omt targ = u.get_active_mission_target(); bool drew_mission = targ == overmap::invalid_tripoint; - const int levz = m.get_abs_sub().z; + const int levz = m.get_abs_sub().z(); for( int i = -2; i <= 2; i++ ) { for( int j = -2; j <= 2; j++ ) { const point_abs_omt om( curs2 + point( i, j ) ); @@ -6601,7 +6601,7 @@ void game::zones_manager() //show zone position on overmap; tripoint_abs_omt player_overmap_position = u.global_omt_location(); tripoint_abs_omt zone_overmap = - coords::project_to( zones[active_index].get().get_center_point() ); + project_to( zones[active_index].get().get_center_point() ); ui::omap::display_zones( player_overmap_position, zone_overmap, active_index ); } else if( action == "ENABLE_ZONE" ) { @@ -6797,7 +6797,7 @@ look_around_result game::look_around( const bool show_window, tripoint ¢er, ctxt.register_action( "zoom_in" ); ctxt.register_action( "toggle_pixel_minimap" ); - const int old_levz = m.get_abs_sub().z; + const int old_levz = m.get_abs_sub().z(); const int min_levz = std::max( old_levz - fov_3d_z_range, -OVERMAP_DEPTH ); const int max_levz = std::min( old_levz + fov_3d_z_range, OVERMAP_HEIGHT ); @@ -6829,13 +6829,16 @@ look_around_result game::look_around( const bool show_window, tripoint ¢er, std::string fast_scroll_text = string_format( _( "%s - %s" ), ctxt.get_desc( "TOGGLE_FAST_SCROLL" ), ctxt.get_action_name( "TOGGLE_FAST_SCROLL" ) ); - std::string pixel_minimap_text = string_format( _( "%s - %s" ), - ctxt.get_desc( "toggle_pixel_minimap" ), - ctxt.get_action_name( "toggle_pixel_minimap" ) ); mvwprintz( w_info, point( 1, getmaxy( w_info ) - 1 ), fast_scroll ? c_light_green : c_green, fast_scroll_text ); - right_print( w_info, getmaxy( w_info ) - 1, 1, pixel_minimap_option ? c_light_green : c_green, - pixel_minimap_text ); + + if( !ctxt.keys_bound_to( "toggle_pixel_minimap" ).empty() ) { + std::string pixel_minimap_text = string_format( _( "%s - %s" ), + ctxt.get_desc( "toggle_pixel_minimap" ), + ctxt.get_action_name( "toggle_pixel_minimap" ) ); + right_print( w_info, getmaxy( w_info ) - 1, 1, pixel_minimap_option ? c_light_green : c_green, + pixel_minimap_text ); + } int first_line = 1; const int last_line = getmaxy( w_info ) - 2; @@ -6912,7 +6915,7 @@ look_around_result game::look_around( const bool show_window, tripoint ¢er, center.z = clamp( center.z + dz, min_levz, max_levz ); add_msg_debug( debugmode::DF_GAME, "levx: %d, levy: %d, levz: %d", - get_map().get_abs_sub().x, get_map().get_abs_sub().y, center.z ); + get_map().get_abs_sub().x(), get_map().get_abs_sub().y(), center.z ); u.view_offset.z = center.z - u.posz(); m.invalidate_map_cache( center.z ); if( select_zone && has_first_point ) { // is blinking @@ -9835,7 +9838,7 @@ point game::place_player( const tripoint &dest_loc ) // Move the player // Start with z-level, to make it less likely that old functions (2D ones) freak out bool z_level_changed = false; - if( dest_loc.z != m.get_abs_sub().z ) { + if( dest_loc.z != m.get_abs_sub().z() ) { z_level_changed = vertical_shift( dest_loc.z ); } @@ -10077,7 +10080,7 @@ void game::place_player_overmap( const tripoint_abs_omt &om_dest, bool move_play m.clear_vehicle_list( z ); } m.rebuild_vehicle_level_caches(); - m.access_cache( m.get_abs_sub().z ).map_memory_seen_cache.reset(); + m.access_cache( m.get_abs_sub().z() ).map_memory_seen_cache.reset(); // offset because load_map expects the coordinates of the top left corner, but the // player will be centered in the middle of the map. const tripoint_abs_sm map_sm_pos = @@ -10873,7 +10876,7 @@ void game::vertical_move( int movez, bool force, bool peeking ) } // TODO: Use u.posz() instead of m.abs_sub - const int z_after = m.get_abs_sub().z + movez; + const int z_after = m.get_abs_sub().z() + movez; if( z_after < -OVERMAP_DEPTH || z_after > OVERMAP_HEIGHT ) { debugmsg( "Tried to move outside allowed range of z-levels" ); return; @@ -11014,7 +11017,7 @@ void game::vertical_move( int movez, bool force, bool peeking ) start_hauling( adjusted_pos ); } - here.invalidate_map_cache( here.get_abs_sub().z ); + here.invalidate_map_cache( here.get_abs_sub().z() ); // Upon force movement, traps can not be avoided. if( !wall_cling ) { here.creature_on_trap( u, !force ); @@ -11059,7 +11062,7 @@ cata::optional game::find_or_make_stairs( map &mp, const int z_after, // Try to find the stairs. cata::optional stairs; int best = INT_MAX; - const int movez = z_after - m.get_abs_sub().z; + const int movez = z_after - m.get_abs_sub().z(); const bool going_down_1 = movez == -1; const bool going_up_1 = movez == 1; // If there are stairs on the same x and y as we currently are, use those @@ -11290,7 +11293,7 @@ point game::update_map( int &x, int &y, bool z_level_changed ) if( shift == point_zero ) { // adjust player position - u.setpos( tripoint( x, y, m.get_abs_sub().z ) ); + u.setpos( tripoint( x, y, m.get_abs_sub().z() ) ); if( z_level_changed ) { // Update what parts of the world map we can see // We may be able to see farther now that the z-level has changed. @@ -11333,7 +11336,7 @@ point game::update_map( int &x, int &y, bool z_level_changed ) // Also ensure the player is on current z-level // m.get_abs_sub().z should later be removed, when there is no longer such a thing // as "current z-level" - u.setpos( tripoint( x, y, m.get_abs_sub().z ) ); + u.setpos( tripoint( x, y, m.get_abs_sub().z() ) ); // Only do the loading after all coordinates have been shifted. @@ -11345,7 +11348,7 @@ point game::update_map( int &x, int &y, bool z_level_changed ) for( int zlev = -OVERMAP_DEPTH; zlev <= OVERMAP_HEIGHT; ++zlev ) { m.invalidate_map_cache( zlev ); } - m.build_map_cache( m.get_abs_sub().z ); + m.build_map_cache( m.get_abs_sub().z() ); // Spawn monsters if appropriate // This call will generate new monsters in addition to loading, so it's placed after NPC loading @@ -11791,10 +11794,9 @@ void game::start_calendar() overmap &game::get_cur_om() const { // The player is located in the middle submap of the map. - const tripoint sm = m.get_abs_sub() + tripoint( HALF_MAPSIZE, HALF_MAPSIZE, 0 ); - const tripoint pos_om = sm_to_om_copy( sm ); - // TODO: fix point types - return overmap_buffer.get( point_abs_om( pos_om.xy() ) ); + const tripoint_abs_sm sm = m.get_abs_sub() + tripoint( HALF_MAPSIZE, HALF_MAPSIZE, 0 ); + const tripoint_abs_om pos_om = project_to( sm ); + return overmap_buffer.get( pos_om.xy() ); } std::vector game::allies() diff --git a/src/gamemode_defense.cpp b/src/gamemode_defense.cpp index ccc5775b98358..7222934c8f47d 100644 --- a/src/gamemode_defense.cpp +++ b/src/gamemode_defense.cpp @@ -195,12 +195,12 @@ void defense_game::pre_action( action_id &act ) case ACTION_MOVE_LEFT: case ACTION_MOVE_FORTH_LEFT: { Character &player_character = get_player_character(); - const tripoint abs_sub = get_map().get_abs_sub(); + const tripoint_abs_sm abs_sub = get_map().get_abs_sub(); const point delta = get_delta_from_movement_action( act, iso_rotate::yes ); - if( ( delta.y < 0 && player_character.posy() == HALF_MAPSIZE_Y && abs_sub.y <= 93 ) || - ( delta.y > 0 && player_character.posy() == HALF_MAPSIZE_Y + SEEY - 1 && abs_sub.y >= 98 ) || - ( delta.x < 0 && player_character.posx() == HALF_MAPSIZE_X && abs_sub.x <= 93 ) || - ( delta.x > 0 && player_character.posx() == HALF_MAPSIZE_X + SEEX - 1 && abs_sub.x >= 98 ) ) { + if( ( delta.y < 0 && player_character.posy() == HALF_MAPSIZE_Y && abs_sub.y() <= 93 ) || + ( delta.y > 0 && player_character.posy() == HALF_MAPSIZE_Y + SEEY - 1 && abs_sub.y() >= 98 ) || + ( delta.x < 0 && player_character.posx() == HALF_MAPSIZE_X && abs_sub.x() <= 93 ) || + ( delta.x > 0 && player_character.posx() == HALF_MAPSIZE_X + SEEX - 1 && abs_sub.x() >= 98 ) ) { action_error_message = string_format( _( "You cannot leave the %s behind!" ), defense_location_name( location ) ); } @@ -1399,7 +1399,7 @@ void defense_game::spawn_wave_monster( const mtype_id &type ) pnt = point( -pnt.x, pnt.y ) + point( MAPSIZE_X - 1, 0 ); } } - monster *const mon = g->place_critter_at( type, tripoint( pnt, here.get_abs_sub().z ) ); + monster *const mon = g->place_critter_at( type, tripoint( pnt, here.get_abs_sub().z() ) ); if( !mon ) { continue; } diff --git a/src/gates.cpp b/src/gates.cpp index 022d638d2ac2b..b1069ad1ca2be 100644 --- a/src/gates.cpp +++ b/src/gates.cpp @@ -52,6 +52,7 @@ struct gate_data { was_loaded( false ) {} gate_id id; + std::vector> src; ter_str_id door; ter_str_id floor; diff --git a/src/generic_factory.h b/src/generic_factory.h index 0848ad7c71bdb..1ca3da615be82 100644 --- a/src/generic_factory.h +++ b/src/generic_factory.h @@ -268,7 +268,7 @@ class generic_factory } if( jo.has_string( id_member_name ) ) { def.id = string_id( jo.get_string( id_member_name ) ); - assign_src( def, src ); + mod_tracker::assign_src( def, src ); def.load( jo, src ); insert( def ); @@ -289,7 +289,7 @@ class generic_factory break; } def.id = string_id( e ); - assign_src( def, src ); + mod_tracker::assign_src( def, src ); def.load( jo, src ); insert( def ); } @@ -300,7 +300,7 @@ class generic_factory } else if( jo.has_string( legacy_id_member_name ) ) { def.id = string_id( jo.get_string( legacy_id_member_name ) ); - assign_src( def, src ); + mod_tracker::assign_src( def, src ); def.load( jo, src ); insert( def ); @@ -321,7 +321,7 @@ class generic_factory break; } def.id = string_id( e ); - assign_src( def, src ); + mod_tracker::assign_src( def, src ); def.load( jo, src ); insert( def ); } @@ -349,6 +349,7 @@ class generic_factory inc_version(); const auto iter = map.find( obj.id ); if( iter != map.end() ) { + mod_tracker::check_duplicate_entries( obj, list[iter->second.to_i()] ); T &result = list[iter->second.to_i()]; result = obj; result.id.set_cid_version( iter->second.to_i(), version ); diff --git a/src/handle_action.cpp b/src/handle_action.cpp index 3608faec3e77c..9285ccf3eb24e 100644 --- a/src/handle_action.cpp +++ b/src/handle_action.cpp @@ -329,7 +329,7 @@ input_context game::get_player_input( std::string &action ) const direction oCurDir = iter->getDirection(); const int width = utf8_width( iter->getText() ); for( int i = 0; i < width; ++i ) { - tripoint tmp( iter->getPosX() + i, iter->getPosY(), get_map().get_abs_sub().z ); + tripoint tmp( iter->getPosX() + i, iter->getPosY(), get_map().get_abs_sub().z() ); const Creature *critter = creatures.creature_at( tmp, true ); if( critter != nullptr && u.sees( *critter ) ) { @@ -967,7 +967,7 @@ static void wait() } } - if( here.get_abs_sub().z >= 0 || has_watch ) { + if( here.get_abs_sub().z() >= 0 || has_watch ) { const time_point last_midnight = calendar::turn - time_past_midnight( calendar::turn ); const auto diurnal_time_before = []( const time_point & p ) { // Either the given time is in the future (e.g. waiting for sunset while it's early morning), diff --git a/src/handle_liquid.cpp b/src/handle_liquid.cpp index 1e908f70884e2..a4872583be2ea 100644 --- a/src/handle_liquid.cpp +++ b/src/handle_liquid.cpp @@ -372,7 +372,7 @@ static bool perform_liquid_transfer( item &liquid, const tripoint *const source_ // not on ground or similar. TODO: implement storing arbitrary container locations. if( target.item_loc && create_activity() ) { serialize_liquid_target( player_character.activity, target.item_loc ); - } else if( player_character.pour_into( *target.item_loc, liquid ) ) { + } else if( player_character.pour_into( *target.item_loc, liquid, true ) ) { if( target.item_loc->needs_processing() ) { // Polymorphism fail, have to introspect into the type to set the target container as active. switch( target.item_loc.where() ) { diff --git a/src/harvest.h b/src/harvest.h index 1aee1f2a11c16..71c288d91bda5 100644 --- a/src/harvest.h +++ b/src/harvest.h @@ -54,6 +54,7 @@ class harvest_drop_type private: harvest_drop_type_id id; + std::vector> src; bool is_group_; bool dissect_only_; bool was_loaded = false; @@ -65,6 +66,7 @@ class harvest_drop_type std::string msg_dissect_success; std::string msg_dissect_fail; friend class generic_factory; + friend struct mod_tracker; }; // Could be reused for butchery @@ -98,6 +100,7 @@ class harvest_list itype_id leftovers = itype_id( "ruined_chunks" ); harvest_id id; + std::vector> src; std::string message() const; diff --git a/src/iexamine.cpp b/src/iexamine.cpp index 0d0bd93588553..efa5000e6adf9 100644 --- a/src/iexamine.cpp +++ b/src/iexamine.cpp @@ -115,6 +115,8 @@ static const bionic_id bio_lighter( "bio_lighter" ); static const bionic_id bio_lockpick( "bio_lockpick" ); static const bionic_id bio_painkiller( "bio_painkiller" ); +static const character_modifier_id character_modifier_obstacle_climb_mod( "obstacle_climb_mod" ); + static const efftype_id effect_antibiotic( "antibiotic" ); static const efftype_id effect_bite( "bite" ); static const efftype_id effect_bleed( "bleed" ); @@ -1317,39 +1319,45 @@ void iexamine::chainfence( Character &you, const tripoint &examp ) } map &here = get_map(); - if( here.has_flag( ter_furn_flag::TFLAG_CLIMB_SIMPLE, examp ) && - you.has_proficiency( proficiency_prof_parkour ) ) { - add_msg( _( "You vault over the obstacle with ease." ) ); - you.moves -= 100; // Not tall enough to warrant spider-climbing, so only relevant trait. - } else if( here.has_flag( ter_furn_flag::TFLAG_CLIMB_SIMPLE, examp ) ) { - add_msg( _( "You vault over the obstacle." ) ); - you.moves -= 300; // Most common move cost for barricades pre-change. + int move_cost = 400; + // TODO: Remove hardcoded trait checks when new arthropod bits happen + if( here.has_flag( ter_furn_flag::TFLAG_CLIMB_SIMPLE, examp ) ) { + + if( you.has_proficiency( proficiency_prof_parkour ) ) { + add_msg( _( "You vault over the obstacle with ease." ) ); + move_cost = 100; // Not tall enough to warrant spider-climbing, so only relevant trait. + } else { + add_msg( _( "You vault over the obstacle." ) ); + move_cost = 300; // Most common move cost for barricades pre-change. + } } else if( you.has_trait( trait_ARACHNID_ARMS_OK ) && !you.wearing_something_on( bodypart_id( "torso" ) ) ) { add_msg( _( "Climbing this obstacle is trivial for one such as you." ) ); - you.moves -= 75; // Yes, faster than walking. 6-8 limbs are impressive. + move_cost = 75; // Yes, faster than walking. 6-8 limbs are impressive. } else if( you.has_trait( trait_INSECT_ARMS_OK ) && !you.wearing_something_on( bodypart_id( "torso" ) ) ) { add_msg( _( "You quickly scale the fence." ) ); - you.moves -= 90; + move_cost = 90; } else if( you.has_proficiency( proficiency_prof_parkour ) ) { add_msg( _( "This obstacle is no match for your freerunning abilities." ) ); - you.moves -= 100; + move_cost = 100; } else { - you.moves -= 400; - ///\EFFECT_DEX decreases chances of slipping while climbing - int climb = you.dex_cur; - if( you.has_trait( trait_BADKNEES ) ) { - climb = climb / 2; - } + move_cost = you.has_trait( trait_BADKNEES ) ? 800 : 400; if( g->slip_down() ) { + you.moves -= move_cost; return; } - you.moves += climb * 10; - Character &player_character = get_player_character(); - sfx::play_variant_sound( "plmove", "clear_obstacle", - sfx::get_heard_volume( player_character.pos() ) ); } + Character &player_character = get_player_character(); + sfx::play_variant_sound( "plmove", "clear_obstacle", + sfx::get_heard_volume( player_character.pos() ) ); + add_msg_debug( debugmode::DF_IEXAMINE, + "Move cost to vault: %d, limb score modifier %.1f", move_cost, + you.get_modifier( character_modifier_obstacle_climb_mod ) ); + move_cost /= you.get_modifier( character_modifier_obstacle_climb_mod ); + add_msg_debug( debugmode::DF_IEXAMINE, + "Final move cost %d", move_cost ); + you.moves -= move_cost; if( you.in_vehicle ) { here.unboard_vehicle( you.pos() ); } diff --git a/src/input.cpp b/src/input.cpp index 4d92a7c9dd0da..c57989969fa4c 100644 --- a/src/input.cpp +++ b/src/input.cpp @@ -1644,7 +1644,7 @@ cata::optional input_context::get_coordinates( const catacurses::windo } const point p = view_offset - ( view_size / 2 - coordinate ); - return tripoint( p, get_map().get_abs_sub().z ); + return tripoint( p, get_map().get_abs_sub().z() ); } #endif diff --git a/src/inventory_ui.cpp b/src/inventory_ui.cpp index 807886d60727f..399c113a211c8 100644 --- a/src/inventory_ui.cpp +++ b/src/inventory_ui.cpp @@ -3062,7 +3062,9 @@ void pickup_selector::apply_selection( std::vector selection ) { for( drop_location &loc : selection ) { inventory_entry *entry = find_entry_by_location( loc.first ); - set_chosen_count( *entry, loc.second + entry->chosen_count ); + if( entry != nullptr ) { + set_chosen_count( *entry, loc.second + entry->chosen_count ); + } } } diff --git a/src/item.cpp b/src/item.cpp index 06589dac2b6b8..14e780fa5b52c 100644 --- a/src/item.cpp +++ b/src/item.cpp @@ -12972,7 +12972,7 @@ units::volume item::check_for_free_space() const int item::get_pocket_size() const { - // set the ammount of space that will be used on the vest based on the size of the item + // set the amount of space that will be used on the vest based on the size of the item if( has_flag( flag_PALS_SMALL ) ) { return 1; } else if( has_flag( flag_PALS_MEDIUM ) ) { diff --git a/src/item_category.h b/src/item_category.h index 5a592f852b854..6d47594484046 100644 --- a/src/item_category.h +++ b/src/item_category.h @@ -45,6 +45,7 @@ class item_category public: /** Unique ID of this category, used when loading from JSON. */ item_category_id id; + std::vector> src; item_category() = default; /** diff --git a/src/item_factory.cpp b/src/item_factory.cpp index adaf8229fe2bb..a57dfa6e5ceb2 100644 --- a/src/item_factory.cpp +++ b/src/item_factory.cpp @@ -683,7 +683,7 @@ void Item_factory::finalize_post( itype &obj ) it.encumber += sub_armor.encumber; it.max_encumber += sub_armor.max_encumber; - // get the ammount of the limb that is covered with sublocations + // get the amount of the limb that is covered with sublocations // for overall coverage we need to scale coverage by that float scale = sub_armor.max_coverage( bp ) / 100.0; @@ -767,7 +767,7 @@ void Item_factory::finalize_post( itype &obj ) new_limb.covers->clear(); new_limb.covers->set( bp ); - // get the ammount of the limb that is covered with sublocations + // get the amount of the limb that is covered with sublocations // for overall coverage we need to scale coverage by that float scale = new_limb.max_coverage( bp ) / 100.0; @@ -788,7 +788,13 @@ void Item_factory::finalize_post( itype &obj ) // scale the value of portion covered based on how much total is covered // if you proportionally only cover 5% of the arm but overall cover 50% // you actually proportionally cover 10% of the armor - mat.cover = static_cast( mat.cover ) / ( static_cast( it.coverage ) / 100.0f ); + + // in case of 0 coverage just say the mats cover it all + if( it.coverage == 0 ) { + mat.cover = 100; + } else { + mat.cover = static_cast( mat.cover ) / ( static_cast( it.coverage ) / 100.0f ); + } } } @@ -1693,7 +1699,7 @@ void Item_factory::check_definitions() const for( const armor_portion_data &portion : type->armor->sub_data ) { if( 100 < portion.coverage || 100 < portion.cover_melee || 100 < portion.cover_ranged ) { - msg += string_format( "coverage exceeds the maximum ammount for the sub locations coverage can't exceed 100, item coverage: %d\n", + msg += string_format( "coverage exceeds the maximum amount for the sub locations coverage can't exceed 100, item coverage: %d\n", portion.coverage ); } } @@ -1701,7 +1707,7 @@ void Item_factory::check_definitions() const for( const armor_portion_data &portion : type->armor->data ) { if( 100 < portion.coverage || 100 < portion.cover_melee || 100 < portion.cover_ranged ) { - msg += string_format( "coverage exceeds the maximum ammount for the sub locations coverage can't exceed 100, item coverage: %d\n", + msg += string_format( "coverage exceeds the maximum amount for the sub locations coverage can't exceed 100, item coverage: %d\n", portion.coverage ); } } diff --git a/src/item_pocket.cpp b/src/item_pocket.cpp index a15ad6679a23d..f9ad471d5ed4e 100644 --- a/src/item_pocket.cpp +++ b/src/item_pocket.cpp @@ -1008,6 +1008,10 @@ void item_pocket::general_info( std::vector &info, int pocket_number, info.emplace_back( "DESCRIPTION", _( "This pocket is rigid." ) ); } + if( data->holster ) { + info.emplace_back( "DESCRIPTION", _( "This pocket only holds one item at a time." ) ); + } + if( data->extra_encumbrance > 0 ) { info.emplace_back( "DESCRIPTION", string_format( _( "Causes %d additional encumbrance while in use." ), diff --git a/src/iuse.cpp b/src/iuse.cpp index b7c4e2330c948..ff479f25da0c1 100644 --- a/src/iuse.cpp +++ b/src/iuse.cpp @@ -7386,7 +7386,7 @@ static extended_photo_def photo_def_for_camera_point( const tripoint &aim_point, } photo_text += "\n" + overmap_desc + "."; - if( get_map().get_abs_sub().z >= 0 && need_store_weather ) { + if( get_map().get_abs_sub().z() >= 0 && need_store_weather ) { photo_text += "\n\n"; if( is_dawn( calendar::turn ) ) { photo_text += _( "It is sunrise. " ); @@ -8896,7 +8896,7 @@ cata::optional iuse::tow_attach( Character *p, item *it, bool, const tripoi const tripoint abspos = here.getabs( posp ); it->set_var( "source_x", abspos.x ); it->set_var( "source_y", abspos.y ); - it->set_var( "source_z", here.get_abs_sub().z ); + it->set_var( "source_z", here.get_abs_sub().z() ); set_cable_active( p, it, "pay_out_cable" ); } } else { @@ -9073,7 +9073,7 @@ cata::optional iuse::cable_attach( Character *p, item *it, bool, const trip const tripoint abspos = here.getabs( posp ); it->set_var( "source_x", abspos.x ); it->set_var( "source_y", abspos.y ); - it->set_var( "source_z", here.get_abs_sub().z ); + it->set_var( "source_z", here.get_abs_sub().z() ); set_cable_active( p, it, "pay_out_cable" ); } } else { @@ -9187,7 +9187,7 @@ cata::optional iuse::cable_attach( Character *p, item *it, bool, const trip const tripoint abspos = here.getabs( vpos ); it->set_var( "source_x", abspos.x ); it->set_var( "source_y", abspos.y ); - it->set_var( "source_z", here.get_abs_sub().z ); + it->set_var( "source_z", here.get_abs_sub().z() ); set_cable_active( p, it, "cable_charger_link" ); p->add_msg_if_player( m_good, _( "You are now plugged into the vehicle." ) ); return 0; @@ -9668,8 +9668,8 @@ cata::optional iuse::wash_items( Character *p, bool soft_items, bool hard_i crafting_inv.charges_of( itype_liquid_soap, INT_MAX, is_liquid ) ) ); const inventory_filter_preset preset( [soft_items, hard_items]( const item_location & location ) { - return location->has_flag( flag_FILTHY ) && ( ( soft_items && location->is_soft() ) || - ( hard_items && !location->is_soft() ) ); + return location->has_flag( flag_FILTHY ) && !location->has_flag( flag_NO_CLEAN ) && + ( ( soft_items && location->is_soft() ) || ( hard_items && !location->is_soft() ) ); } ); auto make_raw_stats = [available_water, available_cleanser]( const std::vector> &locs diff --git a/src/jmapgen_flags.h b/src/jmapgen_flags.h index e3046fe03c4fe..f6d0536d6fde2 100644 --- a/src/jmapgen_flags.h +++ b/src/jmapgen_flags.h @@ -4,6 +4,7 @@ enum class jmapgen_flags { allow_terrain_under_other_data, erase_all_before_placing_terrain, + no_underlying_rotate, last }; diff --git a/src/magic.cpp b/src/magic.cpp index c190c407c1b4b..d549b19e7ad7e 100644 --- a/src/magic.cpp +++ b/src/magic.cpp @@ -149,6 +149,7 @@ std::string enum_to_string( spell_flag data ) case spell_flag::WONDER: return "WONDER"; case spell_flag::MUST_HAVE_CLASS_TO_LEARN: return "MUST_HAVE_CLASS_TO_LEARN"; case spell_flag::SPAWN_WITH_DEATH_DROPS: return "SPAWN_WITH_DEATH_DROPS"; + case spell_flag::NON_MAGICAL: return "NON_MAGICAL"; case spell_flag::LAST: break; } cata_fatal( "Invalid spell_flag" ); @@ -193,6 +194,9 @@ const int spell_type::min_field_intensity_default = 0; const int spell_type::max_field_intensity_default = 0; const float spell_type::field_intensity_increment_default = 0.0f; const float spell_type::field_intensity_variance_default = 0.0f; +const int spell_type::min_accuracy_default = 20; +const float spell_type::accuracy_increment_default = 0.0f; +const int spell_type::max_accuracy_default = 20; const int spell_type::min_damage_default = 0; const float spell_type::damage_increment_default = 0.0f; const int spell_type::max_damage_default = 0; @@ -309,6 +313,10 @@ void spell_type::load( const JsonObject &jo, const std::string & ) optional( jo, was_loaded, "field_intensity_variance", field_intensity_variance, field_intensity_variance_default ); + optional( jo, was_loaded, "min_accuracy", min_accuracy, min_accuracy_default ); + optional( jo, was_loaded, "accuracy_increment", accuracy_increment, accuracy_increment_default ); + optional( jo, was_loaded, "max_accuracy", max_accuracy, max_accuracy_default ); + optional( jo, was_loaded, "min_damage", min_damage, min_damage_default ); optional( jo, was_loaded, "damage_increment", damage_increment, damage_increment_default ); optional( jo, was_loaded, "max_damage", max_damage, max_damage_default ); @@ -394,6 +402,9 @@ void spell_type::serialize( JsonOut &json ) const json.member( "min_damage", min_damage, min_damage_default ); json.member( "max_damage", max_damage, max_damage_default ); json.member( "damage_increment", damage_increment, damage_increment_default ); + json.member( "min_accuracy", min_accuracy, min_accuracy_default ); + json.member( "accuracy_increment", accuracy_increment, accuracy_increment_default ); + json.member( "max_accuracy", max_accuracy, max_accuracy_default ); json.member( "min_range", min_range, min_range_default ); json.member( "max_range", max_range, min_range_default ); json.member( "range_increment", range_increment, range_increment_default ); @@ -603,6 +614,21 @@ int spell::damage() const } } +int spell::min_leveled_accuracy() const +{ + return type->min_accuracy + std::round( get_level() * type->accuracy_increment ); +} + +int spell::accuracy() const +{ + const int leveled_accuracy = min_leveled_accuracy(); + if( type->min_accuracy >= 0 || type->max_accuracy >= type->min_accuracy ) { + return std::min( leveled_accuracy, type->max_accuracy ); + } else { // if it's negative, min and max work differently + return std::max( leveled_accuracy, type->max_accuracy ); + } +} + int spell::min_leveled_dot() const { return type->min_dot + std::round( get_level() * type->dot_increment ); diff --git a/src/magic.h b/src/magic.h index c81fe0c0f3dc6..8caef095121ac 100644 --- a/src/magic.h +++ b/src/magic.h @@ -75,6 +75,7 @@ enum class spell_flag : int { IGNITE_FLAMMABLE, // if spell effect area has any thing flammable, a fire will be produced MUST_HAVE_CLASS_TO_LEARN, // you can't learn the spell unless you already have the class. SPAWN_WITH_DEATH_DROPS, // allow summoned monsters to drop their usual death drops + NON_MAGICAL, // ignores spell resistance LAST }; @@ -191,6 +192,8 @@ class spell_type bool was_loaded = false; spell_id id; + // NOLINTNEXTLINE(cata-serialize) + std::vector> src; // spell name translation name; // spell description @@ -234,6 +237,14 @@ class spell_type // field intensity added to the map is +- ( 1 + field_intensity_variance ) * field_intensity float field_intensity_variance = 0.0f; + // accuracy is a bonus against dodge, block, and spellcraft + // which allows the target to mitigate up to 33% damage for each type of resistance + // this could theoretically add up to 100% + + int min_accuracy = 20; + float accuracy_increment = 0.0f; + int max_accuracy = 20; + // minimum damage this spell can cause int min_damage = 0; // amount of damage increase per spell level @@ -355,6 +366,9 @@ class spell_type static const int max_field_intensity_default; static const float field_intensity_increment_default; static const float field_intensity_variance_default; + static const int min_accuracy_default; + static const float accuracy_increment_default; + static const int max_accuracy_default; static const int min_damage_default; static const float damage_increment_default; static const int max_damage_default; @@ -414,6 +428,7 @@ class spell int min_leveled_aoe() const; // minimum duration including levels (moves) int min_leveled_duration() const; + int min_leveled_accuracy() const; public: spell() = default; @@ -451,6 +466,7 @@ class spell int field_intensity() const; // how much damage does the spell do int damage() const; + int accuracy() const; int damage_dot() const; damage_over_time_data damage_over_time( const std::vector &bps ) const; dealt_damage_instance get_dealt_damage_instance() const; diff --git a/src/magic_enchantment.h b/src/magic_enchantment.h index e4b09d5664653..d2560d3c770be 100644 --- a/src/magic_enchantment.h +++ b/src/magic_enchantment.h @@ -186,6 +186,8 @@ class enchantment void activate_passive( Character &guy ) const; enchantment_id id; + // NOLINTNEXTLINE(cata-serialize) + std::vector> src; bool was_loaded = false; diff --git a/src/magic_spell_effect.cpp b/src/magic_spell_effect.cpp index e85803a794141..7d66103b0f6d1 100644 --- a/src/magic_spell_effect.cpp +++ b/src/magic_spell_effect.cpp @@ -519,10 +519,34 @@ static void damage_targets( const spell &sp, Creature &caster, } dealt_projectile_attack atk = sp.get_projectile_attack( target, *cr ); + const int spell_accuracy = sp.accuracy(); + double damage_mitigation_multiplier = 1.0; + if( const int spell_block = cr->get_block_bonus() - spell_accuracy > 0 ) { + const int roll = std::round( rng( 1, 20 ) ); + // 5% per point (linear) ranging from 0-33%, capped at block score + damage_mitigation_multiplier -= ( 1 - 0.05 * std::max( roll, spell_block ) ) / 3.0; + } + + if( const int spell_dodge = cr->get_dodge() - spell_accuracy > 0 ) { + const int roll = std::round( rng( 1, 20 ) ); + // 5% per point (linear) ranging from 0-33%, capped at block score + damage_mitigation_multiplier -= ( 1 - 0.05 * std::max( roll, spell_dodge ) ) / 3.0; + } + + if( const int spell_resist = cr->get_spell_resist() - spell_accuracy > 0 && + !sp.has_flag( spell_flag::NON_MAGICAL ) ) { + const int roll = std::round( rng( 1, 20 ) ); + // 5% per point (linear) ranging from 0-33%, capped at block score + damage_mitigation_multiplier -= ( 1 - 0.05 * std::max( roll, spell_resist ) ) / 3.0; + } + if( !sp.effect_data().empty() ) { add_effect_to_target( target, sp ); } if( sp.damage() > 0 ) { + for( damage_unit &val : atk.proj.impact.damage_units ) { + val.amount *= damage_mitigation_multiplier; + } cr->deal_projectile_attack( &caster, atk, true ); } else if( sp.damage() < 0 ) { sp.heal( target ); @@ -1218,7 +1242,6 @@ void spell_effect::transform_blast( const spell &sp, Creature &caster, for( const tripoint &location : area ) { if( one_in( sp.damage() ) ) { transform->transform( location ); - transform->add_all_messages( caster, location ); } } } diff --git a/src/magic_ter_fur_transform.cpp b/src/magic_ter_fur_transform.cpp index d736aef214f4d..741a5e8da3a01 100644 --- a/src/magic_ter_fur_transform.cpp +++ b/src/magic_ter_fur_transform.cpp @@ -6,6 +6,7 @@ #include #include +#include "avatar.h" #include "creature.h" #include "enums.h" #include "generic_factory.h" @@ -82,7 +83,6 @@ void ter_furn_transform::load( const JsonObject &jo, const std::string & ) std::string input; mandatory( jo, was_loaded, "id", input ); id = ter_furn_transform_id( input ); - optional( jo, was_loaded, "fail_message", fail_message, "" ); if( jo.has_member( "terrain" ) ) { for( JsonObject ter_obj : jo.get_array( "terrain" ) ) { @@ -153,130 +153,91 @@ cata::optional> ter_furn_transform::find_transform( const } template -cata::optional ter_furn_transform::next( const std::map> &list, +cata::optional>> ter_furn_transform::next( const + std::map> &list, const K &key ) const { const cata::optional> result = find_transform( list, key ); - if( result ) { - return result->pick(); + if( result.has_value() ) { + return std::make_pair( result.value().pick().value(), std::make_pair( result->message, + result->message_good ) ); } return cata::nullopt; } -cata::optional ter_furn_transform::next_ter( const ter_str_id &ter ) const +cata::optional>> ter_furn_transform::next_ter( + const ter_str_id &ter ) const { return next( ter_transform, ter ); } -cata::optional ter_furn_transform::next_ter( const std::string &flag ) const +cata::optional>> ter_furn_transform::next_ter( + const std::string &flag ) const { return next( ter_flag_transform, flag ); } -cata::optional ter_furn_transform::next_furn( const furn_str_id &furn ) const +cata::optional>> ter_furn_transform::next_furn( + const furn_str_id &furn ) const { return next( furn_transform, furn ); } -cata::optional ter_furn_transform::next_furn( const std::string &flag ) const +cata::optional>> ter_furn_transform::next_furn( + const std::string &flag ) const { return next( furn_flag_transform, flag ); } -cata::optional ter_furn_transform::next_field( const field_type_id &field ) const +cata::optional>> +ter_furn_transform::next_field( + const field_type_id &field ) const { return next( field_transform, field ); } -cata::optional ter_furn_transform::next_trap( const trap_str_id &trap ) const +cata::optional>> ter_furn_transform::next_trap( + const trap_str_id &trap ) const { return next( trap_transform, trap ); } -cata::optional ter_furn_transform::next_trap( const std::string &flag ) const +cata::optional>> ter_furn_transform::next_trap( + const std::string &flag ) const { return next( trap_flag_transform, flag ); } -template -bool ter_furn_transform::add_message( const std::map> &list, const K &key, - const Creature &critter, const tripoint &location ) const -{ - const cata::optional> result = find_transform( list, key ); - if( result && !result->has_msg() ) { - if( critter.sees( location ) ) { - result->add_msg( critter ); - } - return true; - } - return false; -} - -void ter_furn_transform::add_all_messages( const Creature &critter, const tripoint &location ) const +void ter_furn_transform::transform( const tripoint &location, bool shifted ) const { - add_all_messages( get_map(), critter, location ); + transform( get_map(), location, shifted ); } -void ter_furn_transform::add_all_messages( const map &m, const Creature &critter, - const tripoint &location ) const +void ter_furn_transform::transform( map &m, const tripoint &location, bool shifted ) const { + avatar &you = get_avatar(); const ter_id ter_at_loc = m.ter( location ); - if( !add_message( ter_transform, ter_at_loc->id, critter, location ) ) { - for( const std::pair> &data : ter_flag_transform ) { - if( data.second.has_msg() && ter_at_loc->has_flag( data.first ) ) { - data.second.add_msg( critter ); - break; - } - } - } - + cata::optional>> ter_potential = next_ter( + ter_at_loc->id ); const furn_id furn_at_loc = m.furn( location ); - if( !add_message( furn_transform, furn_at_loc->id, critter, location ) ) { - for( const std::pair> &data : furn_flag_transform ) { - if( data.second.has_msg() && furn_at_loc->has_flag( data.first ) ) { - data.second.add_msg( critter ); - break; - } - } - } - + cata::optional>> furn_potential = next_furn( + furn_at_loc->id ); const trap_str_id trap_at_loc = m.maptile_at( location ).get_trap().id(); - if( !add_message( trap_transform, trap_at_loc->id, critter, location ) ) { - for( const std::pair> &data : trap_flag_transform ) { - if( data.second.has_msg() && trap_at_loc->has_flag( flag_id( data.first ) ) ) { - data.second.add_msg( critter ); - break; - } - } - } + cata::optional>> trap_potential = next_trap( + trap_at_loc ); const field &field_at_loc = m.field_at( location ); for( auto &fld : field_at_loc ) { - add_message( field_transform, fld.first, critter, location ); - } -} - -void ter_furn_transform::transform( const tripoint &location ) const -{ - transform( get_map(), location ); -} - -void ter_furn_transform::transform( map &m, const tripoint &location ) const -{ - const ter_id ter_at_loc = m.ter( location ); - cata::optional ter_potential = next_ter( ter_at_loc->id ); - const furn_id furn_at_loc = m.furn( location ); - cata::optional furn_potential = next_furn( furn_at_loc->id ); - const trap_str_id trap_at_loc = m.maptile_at( location ).get_trap().id(); - cata::optional trap_potential = next_trap( trap_at_loc ); - - const field &field_at_loc = m.field_at( location ); - for( auto &fld : field_at_loc ) { - cata::optional field_potential = next_field( fld.first ); + cata::optional>> field_potential = next_field( + fld.first ); if( field_potential ) { - m.add_field( location, *field_potential, fld.second.get_field_intensity(), + m.add_field( location, field_potential->first, fld.second.get_field_intensity(), fld.second.get_field_age(), true ); m.remove_field( location, fld.first ); + if( !shifted && you.sees( location ) ) { + you.add_msg_if_player( field_potential->second.first, + field_potential->second.second ? m_good : m_bad ); + } } } @@ -317,13 +278,24 @@ void ter_furn_transform::transform( map &m, const tripoint &location ) const } if( ter_potential ) { - m.ter_set( location, *ter_potential ); + m.ter_set( location, ter_potential->first ); + if( !shifted && you.sees( location ) ) { + you.add_msg_if_player( ter_potential->second.first, ter_potential->second.second ? m_good : m_bad ); + } } if( furn_potential ) { - m.furn_set( location, *furn_potential ); + m.furn_set( location, furn_potential->first ); + if( !shifted && you.sees( location ) ) { + you.add_msg_if_player( furn_potential->second.first, + furn_potential->second.second ? m_good : m_bad ); + } } if( trap_potential ) { - m.trap_set( location, *trap_potential ); + m.trap_set( location, trap_potential->first ); + if( !shifted && you.sees( location ) ) { + you.add_msg_if_player( trap_potential->second.first, + trap_potential->second.second ? m_good : m_bad ); + } } } @@ -342,9 +314,3 @@ bool ter_furn_data::has_msg() const { return !message.empty(); } - -template -void ter_furn_data::add_msg( const Creature &critter ) const -{ - critter.add_msg_if_player( message_good ? m_good : m_bad, message ); -} diff --git a/src/magic_ter_furn_transform.h b/src/magic_ter_furn_transform.h index d2cfa52dcd379..944272f9ebac2 100644 --- a/src/magic_ter_furn_transform.h +++ b/src/magic_ter_furn_transform.h @@ -14,33 +14,27 @@ class JsonObject; struct tripoint; // this is a small class that contains the "results" of a terrain transform. -// T can be either ter_str_id or furn_str_id +// T can be either ter_str_id, furn_str_id, trap_str_id, or field_type_id template class ter_furn_data { - private: + public: weighted_int_list list; std::string message; bool message_good = false; - public: ter_furn_data() = default; ter_furn_data( const weighted_int_list &list, const std::string &message, const bool message_good ) : list( list ), message( message ), message_good( message_good ) {} bool has_msg() const; - void add_msg( const Creature &critter ) const; cata::optional pick() const; void load( const JsonObject &jo ); }; class ter_furn_transform { - private: - - std::string fail_message; - std::map> ter_transform; std::map> ter_flag_transform; @@ -52,36 +46,39 @@ class ter_furn_transform std::map> field_transform; - cata::optional next_ter( const ter_str_id &ter ) const; - cata::optional next_ter( const std::string &flag ) const; - cata::optional next_furn( const furn_str_id &furn ) const; - cata::optional next_furn( const std::string &flag ) const; - cata::optional next_trap( const trap_str_id &trap ) const; - cata::optional next_trap( const std::string &flag ) const; - cata::optional next_field( const field_type_id &field ) const; + cata::optional>> next_ter( + const ter_str_id &ter ) const; + cata::optional>> next_ter( + const std::string &flag ) const; + cata::optional>> next_furn( + const furn_str_id &furn ) const; + cata::optional>> next_furn( + const std::string &flag ) const; + cata::optional>> next_trap( + const trap_str_id &trap ) const; + cata::optional>> next_trap( + const std::string &flag ) const; + cata::optional>> next_field( + const field_type_id &field ) + const; template cata::optional> find_transform( const std::map> &list, const K &key ) const; template - cata::optional next( const std::map> &list, const K &key ) const; - - // return value is success of message found - template - bool add_message( const std::map> &list, const K &key, const Creature &critter, - const tripoint &location ) const; + cata::optional>> next( const std::map> + &list, + const K &key ) const; public: ter_furn_transform_id id; + std::vector> src; bool was_loaded = false; - void add_all_messages( const Creature &critter, const tripoint &location ) const; - void add_all_messages( const map &m, const Creature &critter, const tripoint &location ) const; - - void transform( const tripoint &location ) const; - void transform( map &m, const tripoint &location ) const; + void transform( const tripoint &location, bool shifted = false ) const; + void transform( map &m, const tripoint &location, bool shifted = false ) const; static void load_transform( const JsonObject &jo, const std::string &src ); void load( const JsonObject &jo, const std::string & ); diff --git a/src/map.cpp b/src/map.cpp index b485a21a7f95c..34541fc349d16 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -229,8 +229,8 @@ maptile map::maptile_at_internal( const tripoint &p ) VehicleList map::get_vehicles() { if( !zlevels ) { - return get_vehicles( tripoint( 0, 0, abs_sub.z ), - tripoint( SEEX * my_MAPSIZE, SEEY * my_MAPSIZE, abs_sub.z ) ); + return get_vehicles( tripoint( 0, 0, abs_sub.z() ), + tripoint( SEEX * my_MAPSIZE, SEEY * my_MAPSIZE, abs_sub.z() ) ); } return get_vehicles( tripoint( 0, 0, -OVERMAP_DEPTH ), @@ -333,7 +333,7 @@ std::unique_ptr map::detach_vehicle( vehicle *veh ) debugmsg( "detach_vehicle got a vehicle outside allowed z-level range! name=%s, submap:%d,%d,%d", veh->name, veh->sm_pos.x, veh->sm_pos.y, veh->sm_pos.z ); // Try to fix by moving the vehicle here - z = veh->sm_pos.z = abs_sub.z; + z = veh->sm_pos.z = abs_sub.z(); } // Unboard all passengers before detaching @@ -395,8 +395,8 @@ void map::vehmove() { // give vehicles movement points VehicleList vehicle_list; - int minz = zlevels ? -OVERMAP_DEPTH : abs_sub.z; - int maxz = zlevels ? OVERMAP_HEIGHT : abs_sub.z; + int minz = zlevels ? -OVERMAP_DEPTH : abs_sub.z(); + int maxz = zlevels ? OVERMAP_HEIGHT : abs_sub.z(); const tripoint player_pos = get_player_character().pos(); for( int zlev = minz; zlev <= maxz; ++zlev ) { level_cache *cache_lazy = get_cache_lazy( zlev ); @@ -2843,7 +2843,7 @@ void map::decay_fields_and_scent( const time_duration &amount ) // Coordinate code copied from lightmap calculations // TODO: Z - const int smz = abs_sub.z; + const int smz = abs_sub.z(); const auto &outside_cache = get_cache_ref( smz ).outside_cache; for( int smx = 0; smx < my_MAPSIZE; ++smx ) { for( int smy = 0; smy < my_MAPSIZE; ++smy ) { @@ -2857,7 +2857,7 @@ void map::decay_fields_and_scent( const time_duration &amount ) if( to_proc < 0 ) { cur_submap->field_count = 0; dbg( D_ERROR ) << "map::decay_fields_and_scent: submap at " - << abs_sub.x + smx << "," << abs_sub.y + smy << "," << abs_sub.z + << ( abs_sub + point( smx, smy ) ).to_string() << "has " << to_proc << " field_count"; } get_cache( smz ).field_cache.reset( smx + ( smy * MAPSIZE ) ); @@ -2896,7 +2896,7 @@ void map::decay_fields_and_scent( const time_duration &amount ) if( to_proc > 0 ) { cur_submap->field_count = cur_submap->field_count - to_proc; dbg( D_ERROR ) << "map::decay_fields_and_scent: submap at " - << abs_sub.x + smx << "," << abs_sub.y + smy << "," << abs_sub.z + << abs_sub.to_string() << "has " << cur_submap->field_count - to_proc << "fields, but " << cur_submap->field_count << " field_count"; } @@ -4107,7 +4107,7 @@ void map::transform_radius( const ter_furn_transform_id transform, float radi, c const float radiX = trig_dist( p, getabs( t ) ); // within distance, and either no submap limitation or same overmap coords. if( radiX <= radi ) { - transform->transform( t ); + transform->transform( t, shifted ); } } if( shifted ) { @@ -4297,7 +4297,9 @@ map_stack::iterator map::i_rem( const tripoint &p, const map_stack::const_iterat // remove from the active items cache (if it isn't there does nothing) current_submap->active_items.remove( &*it ); if( current_submap->active_items.empty() ) { - submaps_with_active_items.erase( tripoint( abs_sub.x + p.x / SEEX, abs_sub.y + p.y / SEEY, p.z ) ); + // TODO: fix point types + submaps_with_active_items.erase( tripoint_abs_sm( abs_sub.x() + p.x / SEEX, + abs_sub.y() + p.y / SEEY, p.z ) ); } current_submap->update_lum_rem( l, *it ); @@ -4328,7 +4330,9 @@ void map::i_clear( const tripoint &p ) current_submap->active_items.remove( &it ); } if( current_submap->active_items.empty() ) { - submaps_with_active_items.erase( tripoint( abs_sub.x + p.x / SEEX, abs_sub.y + p.y / SEEY, p.z ) ); + // TODO: fix point types + submaps_with_active_items.erase( tripoint_abs_sm( abs_sub.x() + p.x / SEEX, + abs_sub.y() + p.y / SEEY, p.z ) ); } current_submap->set_lum( l, 0 ); @@ -4596,7 +4600,9 @@ item &map::add_item( const tripoint &p, item new_item ) const map_stack::iterator new_pos = current_submap->get_items( l ).insert( new_item ); if( new_item.needs_processing() ) { if( current_submap->active_items.empty() ) { - submaps_with_active_items.insert( tripoint( abs_sub.x + p.x / SEEX, abs_sub.y + p.y / SEEY, p.z ) ); + // TODO: fix point types + submaps_with_active_items.insert( tripoint_abs_sm( abs_sub.x() + p.x / SEEX, + abs_sub.y() + p.y / SEEY, p.z ) ); } current_submap->active_items.add( *new_pos, l ); } @@ -4691,8 +4697,9 @@ void map::make_active( item_location &loc ) cata::colony::iterator iter = item_stack.get_iterator_from_pointer( target ); if( current_submap->active_items.empty() ) { - submaps_with_active_items.insert( tripoint( abs_sub.x + loc.position().x / SEEX, - abs_sub.y + loc.position().y / SEEY, loc.position().z ) ); + // TODO: fix point types + submaps_with_active_items.insert( tripoint_abs_sm( abs_sub.x() + loc.position().x / SEEX, + abs_sub.y() + loc.position().y / SEEY, loc.position().z ) ); } current_submap->active_items.add( *iter, l ); } @@ -4826,9 +4833,9 @@ static void process_vehicle_items( vehicle &cur_veh, int part ) } } -std::vector map::check_submap_active_item_consistency() +std::vector map::check_submap_active_item_consistency() { - std::vector result; + std::vector result; for( int z = -OVERMAP_DEPTH; z < OVERMAP_HEIGHT; ++z ) { for( int x = 0; x < MAPSIZE; ++x ) { for( int y = 0; y < MAPSIZE; ++y ) { @@ -4846,9 +4853,9 @@ std::vector map::check_submap_active_item_consistency() } } } - for( const tripoint &p : submaps_with_active_items ) { - tripoint rel = p - abs_sub.xy(); - half_open_rectangle map( point_zero, point( MAPSIZE, MAPSIZE ) ); + for( const tripoint_abs_sm &p : submaps_with_active_items ) { + tripoint_rel_sm rel = p - abs_sub.xy(); + half_open_rectangle map( point_rel_sm(), point_rel_sm( MAPSIZE, MAPSIZE ) ); if( !map.contains( rel.xy() ) ) { result.push_back( p ); } @@ -4858,8 +4865,8 @@ std::vector map::check_submap_active_item_consistency() void map::process_items() { - const int minz = zlevels ? -OVERMAP_DEPTH : abs_sub.z; - const int maxz = zlevels ? OVERMAP_HEIGHT : abs_sub.z; + const int minz = zlevels ? -OVERMAP_DEPTH : abs_sub.z(); + const int maxz = zlevels ? OVERMAP_HEIGHT : abs_sub.z(); for( int gz = minz; gz <= maxz; ++gz ) { level_cache &cache = access_cache( gz ); std::set submaps_with_vehicles; @@ -4879,17 +4886,19 @@ void map::process_items() } } // Making a copy, in case the original variable gets modified during `process_items_in_submap` - const std::set submaps_with_active_items_copy = submaps_with_active_items; - for( const tripoint &abs_pos : submaps_with_active_items_copy ) { - const tripoint local_pos = abs_pos - abs_sub.xy(); - submap *const current_submap = get_submap_at_grid( local_pos ); + const std::set submaps_with_active_items_copy = submaps_with_active_items; + for( const tripoint_abs_sm &abs_pos : submaps_with_active_items_copy ) { + const tripoint_rel_sm local_pos = abs_pos - abs_sub.xy(); + // TODO: fix point types + submap *const current_submap = get_submap_at_grid( local_pos.raw() ); if( current_submap == nullptr ) { - debugmsg( "Tried to process items at (%d,%d,%d) but the submap is not loaded", local_pos.x, - local_pos.y, local_pos.z ); + debugmsg( "Tried to process items at %s but the submap is not loaded", + local_pos.to_string() ); continue; } if( !current_submap->active_items.empty() ) { - process_items_in_submap( *current_submap, local_pos ); + // TODO: fix point types + process_items_in_submap( *current_submap, local_pos.raw() ); } } } @@ -5319,7 +5328,7 @@ std::list > map::get_rc_items( const tripoint &p ) { std::list > rc_pairs; tripoint pos; - pos.z = abs_sub.z; + pos.z = abs_sub.z(); for( pos.x = 0; pos.x < MAPSIZE_X; pos.x++ ) { if( p.x != -1 && p.x != pos.x ) { continue; @@ -5821,7 +5830,9 @@ void map::update_submap_active_item_status( const tripoint &p ) return; } if( current_submap->active_items.empty() ) { - submaps_with_active_items.erase( tripoint( abs_sub.x + p.x / SEEX, abs_sub.y + p.y / SEEY, p.z ) ); + // TODO: fix point types + submaps_with_active_items.erase( + tripoint_abs_sm( abs_sub.x() + p.x / SEEX, abs_sub.y() + p.y / SEEY, p.z ) ); } } @@ -5863,9 +5874,8 @@ void map::update_visibility_cache( const int zlev ) for( int gridy = 0; gridy < my_MAPSIZE; gridy++ ) { if( sm_squares_seen[gridx][gridy] > 36 ) { // 25% of the submap is visible const tripoint sm( gridx, gridy, 0 ); - const tripoint abs_sm = map::abs_sub + sm; - // TODO: fix point types - const tripoint_abs_omt abs_omt( sm_to_omt_copy( abs_sm ) ); + const tripoint_abs_sm abs_sm = map::abs_sub + sm; + const tripoint_abs_omt abs_omt = project_to( abs_sm ); overmap_buffer.set_seen( abs_omt, true ); } } @@ -6752,7 +6762,7 @@ void map::save() saven( tripoint( gridx, gridy, gridz ) ); } } else { - saven( tripoint( gridx, gridy, abs_sub.z ) ); + saven( tripoint( gridx, gridy, abs_sub.z() ) ); } } } @@ -6780,8 +6790,7 @@ void map::load( const tripoint_abs_sm &w, const bool update_vehicle, field_furn_locs.clear(); field_ter_locs.clear(); submaps_with_active_items.clear(); - // TODO: fix point types - set_abs_sub( w.raw() ); + set_abs_sub( w ); clear_vehicle_level_caches(); for( int gridx = 0; gridx < my_MAPSIZE; gridx++ ) { for( int gridy = 0; gridy < my_MAPSIZE; gridy++ ) { @@ -6886,8 +6895,9 @@ void map::shift( const point &sp ) debugmsg( "map::shift called with a shift of more than one submap" ); } - const tripoint abs = get_abs_sub(); + const tripoint_abs_sm abs = get_abs_sub(); + // TODO: fix point types (sp should be relative?) set_abs_sub( abs + sp ); g->shift_destination_preview( point( -sp.x * SEEX, -sp.y * SEEY ) ); @@ -6896,8 +6906,8 @@ void map::shift( const point &sp ) vehicle *remoteveh = g->remoteveh(); - const int zmin = zlevels ? -OVERMAP_DEPTH : abs.z; - const int zmax = zlevels ? OVERMAP_HEIGHT : abs.z; + const int zmin = zlevels ? -OVERMAP_DEPTH : abs.z(); + const int zmax = zlevels ? OVERMAP_HEIGHT : abs.z(); for( int gridz = zmin; gridz <= zmax; gridz++ ) { level_cache *cache = get_cache_lazy( gridz ); if( !cache ) { @@ -6926,40 +6936,38 @@ void map::shift( const point &sp ) for( int gridx = 0; gridx < my_MAPSIZE; gridx++ ) { if( sp.y >= 0 ) { for( int gridy = 0; gridy < my_MAPSIZE; gridy++ ) { + const tripoint grid( gridx, gridy, gridz ); if( ( sp.x > 0 && gridx == 0 ) || ( sp.y > 0 && gridy == 0 ) ) { - submaps_with_active_items.erase( { abs.x + gridx, abs.y + gridy, gridz } ); + submaps_with_active_items.erase( abs.xy() + grid ); } if( gridx + sp.x < my_MAPSIZE && gridy + sp.y < my_MAPSIZE ) { - copy_grid( tripoint( gridx, gridy, gridz ), - tripoint( gridx + sp.x, gridy + sp.y, gridz ) ); - submap *const cur_submap = get_submap_at_grid( {gridx, gridy, gridz} ); + copy_grid( grid, grid + sp ); + submap *const cur_submap = get_submap_at_grid( grid ); if( cur_submap == nullptr ) { - debugmsg( "Tried to update vehicle list at (%d,%d,%d) but the submap is not loaded", gridx, gridy, - gridz ); + debugmsg( "Tried to update vehicle list at %s but the submap is not loaded", grid.to_string() ); continue; } update_vehicle_list( cur_submap, gridz ); } else { - loadn( tripoint( gridx, gridy, gridz ), true ); + loadn( grid, true ); } } } else { // sy < 0; work through it backwards for( int gridy = my_MAPSIZE - 1; gridy >= 0; gridy-- ) { + const tripoint grid( gridx, gridy, gridz ); if( ( sp.x > 0 && gridx == 0 ) || gridy == my_MAPSIZE - 1 ) { - submaps_with_active_items.erase( { abs.x + gridx, abs.y + gridy, gridz } ); + submaps_with_active_items.erase( abs.xy() + grid ); } if( gridx + sp.x < my_MAPSIZE && gridy + sp.y >= 0 ) { - copy_grid( tripoint( gridx, gridy, gridz ), - tripoint( gridx + sp.x, gridy + sp.y, gridz ) ); - submap *const cur_submap = get_submap_at_grid( {gridx, gridy, gridz} ); + copy_grid( grid, grid + sp ); + submap *const cur_submap = get_submap_at_grid( grid ); if( cur_submap == nullptr ) { - debugmsg( "Tried to update vehicle list at (%d,%d,%d) but the submap is not loaded", gridx, gridy, - gridz ); + debugmsg( "Tried to update vehicle list at %s but the submap is not loaded", grid.to_string() ); continue; } update_vehicle_list( cur_submap, gridz ); } else { - loadn( tripoint( gridx, gridy, gridz ), true ); + loadn( grid, true ); } } } @@ -6968,40 +6976,38 @@ void map::shift( const point &sp ) for( int gridx = my_MAPSIZE - 1; gridx >= 0; gridx-- ) { if( sp.y >= 0 ) { for( int gridy = 0; gridy < my_MAPSIZE; gridy++ ) { + const tripoint grid( gridx, gridy, gridz ); if( gridx == my_MAPSIZE - 1 || ( sp.y > 0 && gridy == 0 ) ) { - submaps_with_active_items.erase( { abs.x + gridx, abs.y + gridy, gridz } ); + submaps_with_active_items.erase( abs.xy() + grid ); } if( gridx + sp.x >= 0 && gridy + sp.y < my_MAPSIZE ) { - copy_grid( tripoint( gridx, gridy, gridz ), - tripoint( gridx + sp.x, gridy + sp.y, gridz ) ); - submap *const cur_submap = get_submap_at_grid( {gridx, gridy, gridz} ); + copy_grid( grid, grid + sp ); + submap *const cur_submap = get_submap_at_grid( grid ); if( cur_submap == nullptr ) { - debugmsg( "Tried to update vehicle list at (%d,%d,%d) but the submap is not loaded", gridx, gridy, - gridz ); + debugmsg( "Tried to update vehicle list at %s but the submap is not loaded", grid.to_string() ); continue; } update_vehicle_list( cur_submap, gridz ); } else { - loadn( tripoint( gridx, gridy, gridz ), true ); + loadn( grid, true ); } } } else { // sy < 0; work through it backwards for( int gridy = my_MAPSIZE - 1; gridy >= 0; gridy-- ) { + const tripoint grid( gridx, gridy, gridz ); if( gridx == my_MAPSIZE - 1 || gridy == my_MAPSIZE - 1 ) { - submaps_with_active_items.erase( { abs.x + gridx, abs.y + gridy, gridz } ); + submaps_with_active_items.erase( abs.xy() + grid ); } if( gridx + sp.x >= 0 && gridy + sp.y >= 0 ) { - copy_grid( tripoint( gridx, gridy, gridz ), - tripoint( gridx + sp.x, gridy + sp.y, gridz ) ); - submap *const cur_submap = get_submap_at_grid( {gridx, gridy, gridz} ); + copy_grid( grid, grid + sp ); + submap *const cur_submap = get_submap_at_grid( grid ); if( cur_submap == nullptr ) { - debugmsg( "Tried to update vehicle list at (%d,%d,%d) but the submap is not loaded", gridx, gridy, - gridz ); + debugmsg( "Tried to update vehicle list at %s but the submap is not loaded", grid.to_string() ); continue; } update_vehicle_list( cur_submap, gridz ); } else { - loadn( tripoint( gridx, gridy, gridz ), true ); + loadn( grid, true ); } } } @@ -7035,8 +7041,8 @@ void map::vertical_shift( const int newz ) return; } - tripoint trp = get_abs_sub(); - set_abs_sub( tripoint( trp.xy(), newz ) ); + tripoint_abs_sm trp = get_abs_sub(); + set_abs_sub( tripoint_abs_sm( trp.xy(), newz ) ); // TODO: Remove the function when it's safe } @@ -7051,8 +7057,8 @@ void map::vertical_shift( const int newz ) // in grid[0]. void map::saven( const tripoint &grid ) { - dbg( D_INFO ) << "map::saven(worldx[" << abs_sub.x << "], worldy[" << abs_sub.y << "], worldz[" << - abs_sub.z + dbg( D_INFO ) << "map::saven(worldx[" << abs_sub.x() << "], worldy[" << abs_sub.y() + << "], worldz[" << abs_sub.z() << "], gridx[" << grid.x << "], gridy[" << grid.y << "], gridz[" << grid.z << "])"; const int gridn = get_nonant( grid ); submap *submap_to_save = getsubmap( gridn ); @@ -7066,11 +7072,11 @@ void map::saven( const tripoint &grid ) return; } - const tripoint abs = abs_sub.xy() + grid; + const tripoint_abs_sm abs = abs_sub.xy() + grid; - if( !zlevels && grid.z != abs_sub.z ) { + if( !zlevels && grid.z != abs_sub.z() ) { debugmsg( "Tried to save submap (%d,%d,%d) as (%d,%d,%d), which isn't supported in non-z-level builds", - abs.x, abs.y, abs_sub.z, abs.x, abs.y, grid.z ); + abs.x(), abs.y(), abs_sub.z(), abs.x(), abs.y(), grid.z ); } dbg( D_INFO ) << "map::saven abs: " << abs @@ -7081,7 +7087,7 @@ void map::saven( const tripoint &grid ) // Optimized mapgen function that only works properly for very simple overmap types // Does not create or require a temporary map and does its own saving -static void generate_uniform( const tripoint &p, const ter_id &terrain_type ) +static void generate_uniform( const tripoint_abs_sm &p, const ter_id &terrain_type ) { dbg( D_INFO ) << "generate_uniform p: " << p << " terrain_type: " << terrain_type.id().str(); @@ -7099,16 +7105,16 @@ static void generate_uniform( const tripoint &p, const ter_id &terrain_type ) void map::loadn( const tripoint &grid, const bool update_vehicles, bool _actualize ) { - dbg( D_INFO ) << "map::loadn(game[" << g.get() << "], worldx[" << abs_sub.x - << "], worldy[" << abs_sub.y << "], grid " << grid << ")"; + dbg( D_INFO ) << "map::loadn(game[" << g.get() << "], worldx[" << abs_sub.x() + << "], worldy[" << abs_sub.y() << "], grid " << grid << ")"; - const tripoint grid_abs_sub = abs_sub.xy() + grid; + const tripoint_abs_sm grid_abs_sub = abs_sub.xy() + grid; const size_t gridn = get_nonant( grid ); dbg( D_INFO ) << "map::loadn grid_abs_sub: " << grid_abs_sub << " gridn: " << gridn; - const int old_abs_z = abs_sub.z; // Ugly, but necessary at the moment - abs_sub.z = grid.z; + const int old_abs_z = abs_sub.z(); // Ugly, but necessary at the moment + abs_sub.z() = grid.z; submap *tmpsub = MAPBUFFER.lookup_submap( grid_abs_sub ); if( tmpsub == nullptr ) { @@ -7117,9 +7123,8 @@ void map::loadn( const tripoint &grid, const bool update_vehicles, bool _actuali // Each overmap square is two nonants; to prevent overlap, generate only at // squares divisible by 2. - // TODO: fix point types - const tripoint_abs_omt grid_abs_omt( sm_to_omt_copy( grid_abs_sub ) ); - const tripoint grid_abs_sub_rounded = omt_to_sm_copy( grid_abs_omt.raw() ); + const tripoint_abs_omt grid_abs_omt = project_to( grid_abs_sub ); + const tripoint_abs_sm grid_abs_sub_rounded = project_to( grid_abs_omt ); const oter_id terrain_type = overmap_buffer.ter( grid_abs_omt ); @@ -7195,7 +7200,7 @@ void map::loadn( const tripoint &grid, const bool update_vehicles, bool _actuali actualize( grid ); } - abs_sub.z = old_abs_z; + abs_sub.z() = old_abs_z; } void map::rotten_item_spawn( const item &item, const tripoint &pnt ) @@ -7830,8 +7835,8 @@ void map::spawn_monsters_submap( const tripoint &gp, bool ignore_sight ) void map::spawn_monsters( bool ignore_sight ) { - const int zmin = zlevels ? -OVERMAP_DEPTH : abs_sub.z; - const int zmax = zlevels ? OVERMAP_HEIGHT : abs_sub.z; + const int zmin = zlevels ? -OVERMAP_DEPTH : abs_sub.z(); + const int zmax = zlevels ? OVERMAP_HEIGHT : abs_sub.z(); tripoint gp; int &gx = gp.x; int &gy = gp.y; @@ -7914,7 +7919,7 @@ bool tinymap::inbounds( const tripoint &p ) const // this tinymap should never, ever get saved fake_map::fake_map( const ter_id &ter_type ) { - const tripoint tripoint_below_zero( 0, 0, fake_map_z ); + const tripoint_abs_sm tripoint_below_zero( 0, 0, fake_map_z ); set_abs_sub( tripoint_below_zero ); for( int gridx = 0; gridx < my_MAPSIZE; gridx++ ) { @@ -8256,8 +8261,8 @@ bool map::build_floor_cache( const int zlev ) void map::build_floor_caches() { - const int minz = zlevels ? -OVERMAP_DEPTH : abs_sub.z; - const int maxz = zlevels ? OVERMAP_HEIGHT : abs_sub.z; + const int minz = zlevels ? -OVERMAP_DEPTH : abs_sub.z(); + const int maxz = zlevels ? OVERMAP_HEIGHT : abs_sub.z(); for( int z = minz; z <= maxz; z++ ) { build_floor_cache( z ); } @@ -8366,7 +8371,8 @@ void map::build_map_cache( const int zlev, bool skip_lightmap ) tripoint map::getabs( const tripoint &p ) const { - return sm_to_ms_copy( abs_sub.xy() ) + p; + // TODO: fix point types + return sm_to_ms_copy( abs_sub.xy().raw() ) + p; } tripoint_abs_ms map::getglobal( const tripoint &p ) const @@ -8376,7 +8382,8 @@ tripoint_abs_ms map::getglobal( const tripoint &p ) const tripoint map::getlocal( const tripoint &p ) const { - return p - sm_to_ms_copy( abs_sub.xy() ); + // TODO: fix point types + return p - sm_to_ms_copy( abs_sub.xy().raw() ); } tripoint map::getlocal( const tripoint_abs_ms &p ) const @@ -8385,12 +8392,12 @@ tripoint map::getlocal( const tripoint_abs_ms &p ) const return getlocal( p.raw() ); } -void map::set_abs_sub( const tripoint &p ) +void map::set_abs_sub( const tripoint_abs_sm &p ) { abs_sub = p; } -tripoint map::get_abs_sub() const +tripoint_abs_sm map::get_abs_sub() const { return abs_sub; } @@ -8464,10 +8471,10 @@ void map::draw_line_furn( const furn_id &type, const point &p1, const point &p2 void map::draw_fill_background( const ter_id &type ) { // Need to explicitly set caches dirty - set_ter would do it before - set_transparency_cache_dirty( abs_sub.z ); - set_seen_cache_dirty( abs_sub.z ); - set_outside_cache_dirty( abs_sub.z ); - set_pathfinding_cache_dirty( abs_sub.z ); + set_transparency_cache_dirty( abs_sub.z() ); + set_seen_cache_dirty( abs_sub.z() ); + set_outside_cache_dirty( abs_sub.z() ); + set_pathfinding_cache_dirty( abs_sub.z() ); // Fill each submap rather than each tile for( int gridx = 0; gridx < my_MAPSIZE; gridx++ ) { @@ -8532,7 +8539,7 @@ void map::draw_rough_circle_ter( const ter_id &type, const point &p, int rad ) void map::draw_rough_circle_furn( const furn_id &type, const point &p, int rad ) { draw_rough_circle( [this, type]( const point & q ) { - if( !is_open_air( tripoint( q, abs_sub.z ) ) ) { + if( !is_open_air( tripoint( q, abs_sub.z() ) ) ) { this->furn_set( q, type ); } }, p, rad ); @@ -8707,7 +8714,7 @@ void map::scent_blockers( std::array, MAPSIZE_Y> &bl return ITER_CONTINUE; }; - function_over( tripoint( min, abs_sub.z ), tripoint( max, abs_sub.z ), fill_values ); + function_over( tripoint( min, abs_sub.z() ), tripoint( max, abs_sub.z() ), fill_values ); const inclusive_rectangle local_bounds( min, max ); @@ -8770,7 +8777,7 @@ tripoint_range map::points_on_zlevel( const int z ) const tripoint_range map::points_on_zlevel() const { - return points_on_zlevel( abs_sub.z ); + return points_on_zlevel( abs_sub.z() ); } std::list map::get_active_items_in_radius( const tripoint ¢er, @@ -8792,8 +8799,9 @@ std::list map::get_active_items_in_radius( const tripoint ¢er const point maxg( std::min( maxp.x / SEEX, my_MAPSIZE - 1 ), std::min( maxp.y / SEEY, my_MAPSIZE - 1 ) ); - for( const tripoint &abs_submap_loc : submaps_with_active_items ) { - const tripoint submap_loc{ -abs_sub.xy() + abs_submap_loc }; + for( const tripoint_abs_sm &abs_submap_loc : submaps_with_active_items ) { + // TODO: fix point types + const tripoint submap_loc = ( abs_submap_loc - abs_sub.xy() ).raw(); if( submap_loc.x < ming.x || submap_loc.y < ming.y || submap_loc.x > maxg.x || submap_loc.y > maxg.y ) { continue; @@ -9101,7 +9109,7 @@ int map::calc_max_populated_zlev() } } - max_populated_zlev = std::pair( get_abs_sub(), max_z ); + max_populated_zlev = std::make_pair( get_abs_sub(), max_z ); return max_z; } diff --git a/src/map.h b/src/map.h index 4a815b93ea4ea..67d9cd1329ca5 100644 --- a/src/map.h +++ b/src/map.h @@ -578,7 +578,7 @@ class map */ int move_cost( const tripoint &p, const vehicle *ignored_vehicle = nullptr ) const; int move_cost( const point &p, const vehicle *ignored_vehicle = nullptr ) const { - return move_cost( tripoint( p, abs_sub.z ), ignored_vehicle ); + return move_cost( tripoint( p, abs_sub.z() ), ignored_vehicle ); } bool impassable( const tripoint &p ) const; bool impassable( const point &p ) const { @@ -586,7 +586,7 @@ class map } bool passable( const tripoint &p ) const; bool passable( const point &p ) const { - return passable( tripoint( p, abs_sub.z ) ); + return passable( tripoint( p, abs_sub.z() ) ); } bool is_wall_adjacent( const tripoint ¢er ) const; @@ -597,7 +597,7 @@ class map */ int move_cost_ter_furn( const tripoint &p ) const; int move_cost_ter_furn( const point &p ) const { - return move_cost_ter_furn( tripoint( p, abs_sub.z ) ); + return move_cost_ter_furn( tripoint( p, abs_sub.z() ) ); } bool impassable_ter_furn( const tripoint &p ) const; bool passable_ter_furn( const tripoint &p ) const; @@ -790,7 +790,7 @@ class map } std::string name( const tripoint &p ); std::string name( const point &p ) { - return name( tripoint( p, abs_sub.z ) ); + return name( tripoint( p, abs_sub.z() ) ); } std::string disp_name( const tripoint &p ); /** @@ -800,11 +800,11 @@ class map std::string obstacle_name( const tripoint &p ); bool has_furn( const tripoint &p ) const; bool has_furn( const point &p ) const { - return has_furn( tripoint( p, abs_sub.z ) ); + return has_furn( tripoint( p, abs_sub.z() ) ); } furn_id furn( const tripoint &p ) const; furn_id furn( const point &p ) const { - return furn( tripoint( p, abs_sub.z ) ); + return furn( tripoint( p, abs_sub.z() ) ); } /** * furn_reset should be true if new_furniture is being set to f_null @@ -812,24 +812,24 @@ class map */ bool furn_set( const tripoint &p, const furn_id &new_furniture, bool furn_reset = false ); bool furn_set( const point &p, const furn_id &new_furniture ) { - return furn_set( tripoint( p, abs_sub.z ), new_furniture ); + return furn_set( tripoint( p, abs_sub.z() ), new_furniture ); } void furn_clear( const tripoint &p ) { furn_set( p, f_clear ); }; void furn_clear( const point &p ) { - furn_clear( tripoint( p, abs_sub.z ) ); + furn_clear( tripoint( p, abs_sub.z() ) ); } std::string furnname( const tripoint &p ); std::string furnname( const point &p ) { - return furnname( tripoint( p, abs_sub.z ) ); + return furnname( tripoint( p, abs_sub.z() ) ); } bool can_move_furniture( const tripoint &pos, Character *you = nullptr ); // Terrain ter_id ter( const tripoint &p ) const; ter_id ter( const point &p ) const { - return ter( tripoint( p, abs_sub.z ) ); + return ter( tripoint( p, abs_sub.z() ) ); } // Return a bitfield of the adjacent tiles which connect to the given @@ -856,12 +856,12 @@ class map bool ter_set( const tripoint &p, const ter_id &new_terrain ); bool ter_set( const point &p, const ter_id &new_terrain ) { - return ter_set( tripoint( p, abs_sub.z ), new_terrain ); + return ter_set( tripoint( p, abs_sub.z() ), new_terrain ); } std::string tername( const tripoint &p ) const; std::string tername( const point &p ) const { - return tername( tripoint( p, abs_sub.z ) ); + return tername( tripoint( p, abs_sub.z() ) ); } // Check for terrain/furniture/field that provide a @@ -918,96 +918,96 @@ class map // Words relevant to terrain (sharp, etc) std::string features( const tripoint &p ); std::string features( const point &p ) { - return features( tripoint( p, abs_sub.z ) ); + return features( tripoint( p, abs_sub.z() ) ); } // Checks terrain, furniture and vehicles bool has_flag( const std::string &flag, const tripoint &p ) const; bool has_flag( const std::string &flag, const point &p ) const { - return has_flag( flag, tripoint( p, abs_sub.z ) ); + return has_flag( flag, tripoint( p, abs_sub.z() ) ); } // True if items can be dropped in this tile bool can_put_items( const tripoint &p ) const; bool can_put_items( const point &p ) const { - return can_put_items( tripoint( p, abs_sub.z ) ); + return can_put_items( tripoint( p, abs_sub.z() ) ); } // True if items can be placed in this tile bool can_put_items_ter_furn( const tripoint &p ) const; bool can_put_items_ter_furn( const point &p ) const { - return can_put_items_ter_furn( tripoint( p, abs_sub.z ) ); + return can_put_items_ter_furn( tripoint( p, abs_sub.z() ) ); } // Checks terrain bool has_flag_ter( const std::string &flag, const tripoint &p ) const; bool has_flag_ter( const std::string &flag, const point &p ) const { - return has_flag_ter( flag, tripoint( p, abs_sub.z ) ); + return has_flag_ter( flag, tripoint( p, abs_sub.z() ) ); } // Checks furniture bool has_flag_furn( const std::string &flag, const tripoint &p ) const; bool has_flag_furn( const std::string &flag, const point &p ) const { - return has_flag_furn( flag, tripoint( p, abs_sub.z ) ); + return has_flag_furn( flag, tripoint( p, abs_sub.z() ) ); } // Checks terrain or furniture bool has_flag_ter_or_furn( const std::string &flag, const tripoint &p ) const; bool has_flag_ter_or_furn( const std::string &flag, const point &p ) const { - return has_flag_ter_or_furn( flag, tripoint( p, abs_sub.z ) ); + return has_flag_ter_or_furn( flag, tripoint( p, abs_sub.z() ) ); } // Fast "oh hai it's update_scent/lightmap/draw/monmove/self/etc again, what about this one" flag checking // Checks terrain, furniture and vehicles bool has_flag( ter_furn_flag flag, const tripoint &p ) const; bool has_flag( ter_furn_flag flag, const point &p ) const { - return has_flag( flag, tripoint( p, abs_sub.z ) ); + return has_flag( flag, tripoint( p, abs_sub.z() ) ); } // Checks terrain bool has_flag_ter( ter_furn_flag flag, const tripoint &p ) const; bool has_flag_ter( ter_furn_flag flag, const point &p ) const { - return has_flag_ter( flag, tripoint( p, abs_sub.z ) ); + return has_flag_ter( flag, tripoint( p, abs_sub.z() ) ); } // Checks furniture bool has_flag_furn( ter_furn_flag flag, const tripoint &p ) const; bool has_flag_furn( ter_furn_flag flag, const point &p ) const { - return has_flag_furn( flag, tripoint( p, abs_sub.z ) ); + return has_flag_furn( flag, tripoint( p, abs_sub.z() ) ); } // Checks terrain or furniture bool has_flag_ter_or_furn( ter_furn_flag flag, const tripoint &p ) const; bool has_flag_ter_or_furn( ter_furn_flag flag, const point &p ) const { - return has_flag_ter_or_furn( flag, tripoint( p, abs_sub.z ) ); + return has_flag_ter_or_furn( flag, tripoint( p, abs_sub.z() ) ); } // Bashable /** Returns true if there is a bashable vehicle part or the furn/terrain is bashable at p */ bool is_bashable( const tripoint &p, bool allow_floor = false ) const; bool is_bashable( const point &p ) const { - return is_bashable( tripoint( p, abs_sub.z ) ); + return is_bashable( tripoint( p, abs_sub.z() ) ); } /** Returns true if the terrain at p is bashable */ bool is_bashable_ter( const tripoint &p, bool allow_floor = false ) const; bool is_bashable_ter( const point &p ) const { - return is_bashable_ter( tripoint( p, abs_sub.z ) ); + return is_bashable_ter( tripoint( p, abs_sub.z() ) ); } /** Returns true if the furniture at p is bashable */ bool is_bashable_furn( const tripoint &p ) const; bool is_bashable_furn( const point &p ) const { - return is_bashable_furn( tripoint( p, abs_sub.z ) ); + return is_bashable_furn( tripoint( p, abs_sub.z() ) ); } /** Returns true if the furniture or terrain at p is bashable */ bool is_bashable_ter_furn( const tripoint &p, bool allow_floor = false ) const; bool is_bashable_ter_furn( const point &p ) const { - return is_bashable_ter_furn( tripoint( p, abs_sub.z ) ); + return is_bashable_ter_furn( tripoint( p, abs_sub.z() ) ); } /** Returns max_str of the furniture or terrain at p */ int bash_strength( const tripoint &p, bool allow_floor = false ) const; int bash_strength( const point &p ) const { - return bash_strength( tripoint( p, abs_sub.z ) ); + return bash_strength( tripoint( p, abs_sub.z() ) ); } /** Returns min_str of the furniture or terrain at p */ int bash_resistance( const tripoint &p, bool allow_floor = false ) const; int bash_resistance( const point &p ) const { - return bash_resistance( tripoint( p, abs_sub.z ) ); + return bash_resistance( tripoint( p, abs_sub.z() ) ); } /** Returns a success rating from -1 to 10 for a given tile based on a set strength, used for AI movement planning * Values roughly correspond to 10% increment chances of success on a given bash, rounded down. -1 means the square is not bashable */ int bash_rating( int str, const tripoint &p, bool allow_floor = false ) const; int bash_rating( const int str, const point &p ) const { - return bash_rating( str, tripoint( p, abs_sub.z ) ); + return bash_rating( str, tripoint( p, abs_sub.z() ) ); } // Rubble @@ -1024,7 +1024,7 @@ class map bool is_outside( const tripoint &p ) const; bool is_outside( const point &p ) const { - return is_outside( tripoint( p, abs_sub.z ) ); + return is_outside( tripoint( p, abs_sub.z() ) ); } /** * Returns whether or not the terrain at the given location can be dived into @@ -1034,11 +1034,11 @@ class map */ bool is_divable( const tripoint &p ) const; bool is_divable( const point &p ) const { - return is_divable( tripoint( p, abs_sub.z ) ); + return is_divable( tripoint( p, abs_sub.z() ) ); } bool is_water_shallow_current( const tripoint &p ) const; bool is_water_shallow_current( const point &p ) const { - return is_water_shallow_current( tripoint( p, abs_sub.z ) ); + return is_water_shallow_current( tripoint( p, abs_sub.z() ) ); } /** Check if the last terrain is wall in direction NORTH, SOUTH, WEST or EAST @@ -1167,7 +1167,7 @@ class map int get_radiation( const tripoint &p ) const; void set_radiation( const tripoint &p, int value ); void set_radiation( const point &p, const int value ) { - set_radiation( tripoint( p, abs_sub.z ), value ); + set_radiation( tripoint( p, abs_sub.z() ), value ); } /** Increment the radiation in the given tile by the given delta @@ -1175,7 +1175,7 @@ class map */ void adjust_radiation( const tripoint &p, int delta ); void adjust_radiation( const point &p, const int delta ) { - adjust_radiation( tripoint( p, abs_sub.z ), delta ); + adjust_radiation( tripoint( p, abs_sub.z() ), delta ); } // Temperature @@ -1184,31 +1184,31 @@ class map // Set temperature for all four submap quadrants void set_temperature( const tripoint &p, int temperature ); void set_temperature( const point &p, int new_temperature ) { - set_temperature( tripoint( p, abs_sub.z ), new_temperature ); + set_temperature( tripoint( p, abs_sub.z() ), new_temperature ); } // Returns points for all submaps with inconsistent state relative to // the list in map. Used in tests. - std::vector check_submap_active_item_consistency(); + std::vector check_submap_active_item_consistency(); // Accessor that returns a wrapped reference to an item stack for safe modification. map_stack i_at( const tripoint &p ); map_stack i_at( const point &p ) { - return i_at( tripoint( p, abs_sub.z ) ); + return i_at( tripoint( p, abs_sub.z() ) ); } item water_from( const tripoint &p ); void i_clear( const tripoint &p ); void i_clear( const point &p ) { - i_clear( tripoint( p, abs_sub.z ) ); + i_clear( tripoint( p, abs_sub.z() ) ); } // i_rem() methods that return values act like container::erase(), // returning an iterator to the next item after removal. map_stack::iterator i_rem( const tripoint &p, const map_stack::const_iterator &it ); map_stack::iterator i_rem( const point &location, const map_stack::const_iterator &it ) { - return i_rem( tripoint( location, abs_sub.z ), it ); + return i_rem( tripoint( location, abs_sub.z() ), it ); } void i_rem( const tripoint &p, item *it ); void i_rem( const point &p, item *it ) { - i_rem( tripoint( p, abs_sub.z ), it ); + i_rem( tripoint( p, abs_sub.z() ), it ); } void spawn_artifact( const tripoint &p, const relic_procgen_id &id, const int max_attributes = 5, const int power_level = 1000, const int max_negative_power = -2000 ); @@ -1220,7 +1220,7 @@ class map unsigned quantity = 1, int charges = 0, const time_point &birthday = calendar::start_of_cataclysm, int damlevel = 0, const std::set &flags = {}, const std::string &variant = "" ) { - spawn_item( tripoint( p, abs_sub.z ), type_id, quantity, charges, birthday, damlevel, flags, + spawn_item( tripoint( p, abs_sub.z() ), type_id, quantity, charges, birthday, damlevel, flags, variant ); } @@ -1236,7 +1236,7 @@ class map unsigned quantity = 1, int charges = 0, const time_point &birthday = calendar::start_of_cataclysm, int damlevel = 0, const std::set &flags = {}, const std::string &variant = "" ) { - spawn_item( tripoint( p, abs_sub.z ), type_id, quantity, charges, birthday, damlevel, flags, + spawn_item( tripoint( p, abs_sub.z() ), type_id, quantity, charges, birthday, damlevel, flags, variant ); } units::volume max_volume( const tripoint &p ); @@ -1253,7 +1253,7 @@ class map */ item &add_item_or_charges( const tripoint &pos, item obj, bool overflow = true ); item &add_item_or_charges( const point &p, const item &obj, bool overflow = true ) { - return add_item_or_charges( tripoint( p, abs_sub.z ), obj, overflow ); + return add_item_or_charges( tripoint( p, abs_sub.z() ), obj, overflow ); } /** @@ -1265,7 +1265,7 @@ class map */ item &add_item( const tripoint &p, item new_item ); void add_item( const point &p, const item &new_item ) { - add_item( tripoint( p, abs_sub.z ), new_item ); + add_item( tripoint( p, abs_sub.z() ), new_item ); } /** @@ -1338,8 +1338,8 @@ class map std::vector place_items( const item_group_id &group_id, int chance, const point &p1, const point &p2, bool ongrass, const time_point &turn, int magazine = 0, int ammo = 0 ) { - return place_items( group_id, chance, tripoint( p1, abs_sub.z ), - tripoint( p2, abs_sub.z ), ongrass, turn, magazine, ammo ); + return place_items( group_id, chance, tripoint( p1, abs_sub.z() ), + tripoint( p2, abs_sub.z() ), ongrass, turn, magazine, ammo ); } /** * Place items from an item group at p. Places as much items as the item group says. @@ -1356,12 +1356,12 @@ class map // Places a list of items, or nothing if the list is empty. std::vector spawn_items( const tripoint &p, const std::vector &new_items ); void spawn_items( const point &p, const std::vector &new_items ) { - spawn_items( tripoint( p, abs_sub.z ), new_items ); + spawn_items( tripoint( p, abs_sub.z() ), new_items ); } void create_anomaly( const tripoint &p, artifact_natural_property prop, bool create_rubble = true ); void create_anomaly( const point &cp, artifact_natural_property prop, bool create_rubble = true ) { - create_anomaly( tripoint( cp, abs_sub.z ), prop, create_rubble ); + create_anomaly( tripoint( cp, abs_sub.z() ), prop, create_rubble ); } // Partial construction functions @@ -1586,7 +1586,9 @@ class map bool is_cornerfloor( const tripoint &p ) const; // mapgen.cpp functions + // TODO: fix point types (remove the first overload) void generate( const tripoint &p, const time_point &when ); + void generate( const tripoint_abs_sm &p, const time_point &when ); void place_spawns( const mongroup_id &group, int chance, const point &p1, const point &p2, float density, bool individual = false, bool friendly = false, const std::string &name = "NONE", @@ -1656,7 +1658,7 @@ class map std::set dirty_vehicle_list; /** return @ref abs_sub */ - tripoint get_abs_sub() const; + tripoint_abs_sm get_abs_sub() const; /** * Translates local (to this map) coordinates of a square to global absolute coordinates. * Coordinates is in the system that is used by the ter/furn/i_at functions. @@ -1665,7 +1667,7 @@ class map tripoint getabs( const tripoint &p ) const; tripoint_abs_ms getglobal( const tripoint &p ) const; point getabs( const point &p ) const { - return getabs( tripoint( p, abs_sub.z ) ).xy(); + return getabs( tripoint( p, abs_sub.z() ) ).xy(); } /** * Inverse of @ref getabs @@ -1673,7 +1675,7 @@ class map tripoint getlocal( const tripoint &p ) const; tripoint getlocal( const tripoint_abs_ms &p ) const; point getlocal( const point &p ) const { - return getlocal( tripoint( p, abs_sub.z ) ).xy(); + return getlocal( tripoint( p, abs_sub.z() ) ).xy(); } virtual bool inbounds( const tripoint &p ) const; bool inbounds( const tripoint_abs_ms &p ) const; @@ -1754,7 +1756,7 @@ class map add_roofs( tripoint( grid, gridz ) ); } } else { - loadn( tripoint( grid, abs_sub.z ), update_vehicles, _actualize ); + loadn( tripoint( grid, abs_sub.z() ), update_vehicles, _actualize ); } } /** @@ -1845,11 +1847,11 @@ class map * - generating submaps (@ref generate) * - shifting the map with @ref shift */ - tripoint abs_sub; + tripoint_abs_sm abs_sub; /** * Sets @ref abs_sub, see there. Uses the same coordinate system as @ref abs_sub. */ - void set_abs_sub( const tripoint &p ); + void set_abs_sub( const tripoint_abs_sm &p ); private: field &get_field( const tripoint &p ); @@ -1868,7 +1870,7 @@ class map } submap *get_submap_at( const tripoint &p ) const; submap *get_submap_at( const point &p ) const { - return get_submap_at( tripoint( p, abs_sub.z ) ); + return get_submap_at( tripoint( p, abs_sub.z() ) ); } /** * Get the submap pointer containing the specified position within the reality bubble. @@ -1886,7 +1888,7 @@ class map return get_submap_at( p ); } submap *get_submap_at( const point &p, point &offset_p ) const { - return get_submap_at( { p, abs_sub.z }, offset_p ); + return get_submap_at( { p, abs_sub.z() }, offset_p ); } /** * Get submap pointer in the grid at given grid coordinates. Grid coordinates must @@ -1905,7 +1907,7 @@ class map */ size_t get_nonant( const tripoint &gridp ) const; size_t get_nonant( const point &gridp ) const { - return get_nonant( { gridp, abs_sub.z } ); + return get_nonant( { gridp, abs_sub.z() } ); } /** * Set the submap pointer in @ref grid at the give index. This is the inverse of @@ -2035,7 +2037,7 @@ class map /** * Set of submaps that contain active items in absolute coordinates. */ - std::set submaps_with_active_items; + std::set submaps_with_active_items; /** * Cache of coordinate pairs recently checked for visibility. @@ -2061,7 +2063,7 @@ class map // caches the highest zlevel above which all zlevels are uniform // !value || value->first != map::abs_sub means cache is invalid - cata::optional> max_populated_zlev = cata::nullopt; + cata::optional> max_populated_zlev = cata::nullopt; public: const level_cache &get_cache_ref( int zlev ) const { @@ -2078,7 +2080,7 @@ class map void update_submap_active_item_status( const tripoint &p ); // Just exposed for unit test introspection. - const std::set &get_submaps_with_active_items() const { + const std::set &get_submaps_with_active_items() const { return submaps_with_active_items; } // Clips the area to map bounds diff --git a/src/map_extras.cpp b/src/map_extras.cpp index 362d17711e170..0f95f9c174b2d 100644 --- a/src/map_extras.cpp +++ b/src/map_extras.cpp @@ -377,7 +377,7 @@ static bool mx_house_spider( map &m, const tripoint &loc ) madd_field( &m, point( x, y ), fd_web, rng( 2, 3 ) ); if( one_in( 4 ) ) { m.furn_set( point( i, j ), egg_type ); - m.remove_field( {i, j, m.get_abs_sub().z}, fd_web ); + m.remove_field( {i, j, m.get_abs_sub().z()}, fd_web ); } } } @@ -947,7 +947,7 @@ static bool mx_supplydrop( map &m, const tripoint &/*abs_sub*/ ) static void place_trap_if_clear( map &m, const point &target, trap_id trap_type ) { - tripoint tri_target( target, m.get_abs_sub().z ); + tripoint tri_target( target, m.get_abs_sub().z() ); if( m.ter( tri_target ).obj().trap == tr_null ) { mtrap_set( &m, target, trap_type ); } diff --git a/src/map_extras.h b/src/map_extras.h index f9f025568aabf..f3ee1d0a667d3 100644 --- a/src/map_extras.h +++ b/src/map_extras.h @@ -40,6 +40,7 @@ class map_extra { public: map_extra_id id = string_id::NULL_ID(); + std::vector> src; std::string generator_id; map_extra_method generator_method = map_extra_method::null; bool autonote = false; diff --git a/src/mapbuffer.cpp b/src/mapbuffer.cpp index fb2d94ada8f0f..528232acefbb3 100644 --- a/src/mapbuffer.cpp +++ b/src/mapbuffer.cpp @@ -33,16 +33,16 @@ extern std::unique_ptr g; // NOLINTNEXTLINE(cata-static-declarations) extern const int savegame_version; -static std::string find_quad_path( const std::string &dirname, const tripoint &om_addr ) +static std::string find_quad_path( const std::string &dirname, const tripoint_abs_omt &om_addr ) { - return string_format( "%s/%d.%d.%d.map", dirname, om_addr.x, om_addr.y, om_addr.z ); + return string_format( "%s/%d.%d.%d.map", dirname, om_addr.x(), om_addr.y(), om_addr.z() ); } -static std::string find_dirname( const tripoint &om_addr ) +static std::string find_dirname( const tripoint_abs_omt &om_addr ) { - const tripoint segment_addr = omt_to_seg_copy( om_addr ); - return string_format( "%s/maps/%d.%d.%d", PATH_INFO::world_base_save_path(), segment_addr.x, - segment_addr.y, segment_addr.z ); + const tripoint_abs_seg segment_addr = project_to( om_addr ); + return string_format( "%s/maps/%d.%d.%d", PATH_INFO::world_base_save_path(), segment_addr.x(), + segment_addr.y(), segment_addr.z() ); } mapbuffer MAPBUFFER; @@ -55,7 +55,7 @@ void mapbuffer::clear() submaps.clear(); } -bool mapbuffer::add_submap( const tripoint &p, std::unique_ptr &sm ) +bool mapbuffer::add_submap( const tripoint_abs_sm &p, std::unique_ptr &sm ) { if( submaps.count( p ) ) { return false; @@ -66,7 +66,7 @@ bool mapbuffer::add_submap( const tripoint &p, std::unique_ptr &sm ) return true; } -bool mapbuffer::add_submap( const tripoint &p, submap *sm ) +bool mapbuffer::add_submap( const tripoint_abs_sm &p, submap *sm ) { // FIXME: get rid of this overload and make submap ownership semantics sane. std::unique_ptr temp( sm ); @@ -78,26 +78,27 @@ bool mapbuffer::add_submap( const tripoint &p, submap *sm ) return result; } -void mapbuffer::remove_submap( tripoint addr ) +void mapbuffer::remove_submap( tripoint_abs_sm addr ) { auto m_target = submaps.find( addr ); if( m_target == submaps.end() ) { - debugmsg( "Tried to remove non-existing submap %d,%d,%d", addr.x, addr.y, addr.z ); + debugmsg( "Tried to remove non-existing submap %s", addr.to_string() ); return; } submaps.erase( m_target ); } -submap *mapbuffer::lookup_submap( const tripoint &p ) +submap *mapbuffer::lookup_submap( const tripoint_abs_sm &p ) { - dbg( D_INFO ) << "mapbuffer::lookup_submap( x[" << p.x << "], y[" << p.y << "], z[" << p.z << "])"; + dbg( D_INFO ) << "mapbuffer::lookup_submap( x[" << p.x() << "], y[" << p.y() << "], z[" + << p.z() << "])"; const auto iter = submaps.find( p ); if( iter == submaps.end() ) { try { return unserialize_submaps( p ); } catch( const std::exception &err ) { - debugmsg( "Failed to load submap (%d,%d,%d): %s", p.x, p.y, p.z, err.what() ); + debugmsg( "Failed to load submap %s: %s", p.to_string(), err.what() ); } return nullptr; } @@ -113,14 +114,14 @@ void mapbuffer::save( bool delete_after_save ) int num_total_submaps = submaps.size(); map &here = get_map(); - const tripoint map_origin = sm_to_omt_copy( here.get_abs_sub() ); + const tripoint_abs_omt map_origin = project_to( here.get_abs_sub() ); const bool map_has_zlevels = g != nullptr; static_popup popup; // A set of already-saved submaps, in global overmap coordinates. - std::set saved_submaps; - std::list submaps_to_delete; + std::set saved_submaps; + std::list submaps_to_delete; static constexpr std::chrono::milliseconds update_interval( 500 ); auto last_update = std::chrono::steady_clock::now(); @@ -138,7 +139,7 @@ void mapbuffer::save( bool delete_after_save ) // we're saving a 2x2 quad of submaps at a time. // Submaps are generated in quads, so we know if we have one member of a quad, // we have the rest of it, if that assumption is broken we have REAL problems. - const tripoint om_addr = sm_to_omt_copy( elem.first ); + const tripoint_abs_omt om_addr = project_to( elem.first ); if( saved_submaps.count( om_addr ) != 0 ) { // Already handled this one. continue; @@ -153,12 +154,12 @@ void mapbuffer::save( bool delete_after_save ) // delete_on_save deletes everything, otherwise delete submaps // outside the current map. - const bool zlev_del = !map_has_zlevels && om_addr.z != get_map().get_abs_sub().z; + const bool zlev_del = !map_has_zlevels && om_addr.z() != get_map().get_abs_sub().z(); save_quad( dirname, quad_path, om_addr, submaps_to_delete, delete_after_save || zlev_del || - om_addr.x < map_origin.x || om_addr.y < map_origin.y || - om_addr.x > map_origin.x + HALF_MAPSIZE || - om_addr.y > map_origin.y + HALF_MAPSIZE ); + om_addr.x() < map_origin.x() || om_addr.y() < map_origin.y() || + om_addr.x() > map_origin.x() + HALF_MAPSIZE || + om_addr.y() > map_origin.y() + HALF_MAPSIZE ); num_saved_submaps += 4; } for( auto &elem : submaps_to_delete ) { @@ -166,12 +167,12 @@ void mapbuffer::save( bool delete_after_save ) } } -void mapbuffer::save_quad( const std::string &dirname, const std::string &filename, - const tripoint &om_addr, std::list &submaps_to_delete, - bool delete_after_save ) +void mapbuffer::save_quad( + const std::string &dirname, const std::string &filename, const tripoint_abs_omt &om_addr, + std::list &submaps_to_delete, bool delete_after_save ) { std::vector offsets; - std::vector submap_addrs; + std::vector submap_addrs; offsets.push_back( point_zero ); offsets.push_back( point_south ); offsets.push_back( point_east ); @@ -179,9 +180,8 @@ void mapbuffer::save_quad( const std::string &dirname, const std::string &filena bool all_uniform = true; for( auto &offsets_offset : offsets ) { - tripoint submap_addr = omt_to_sm_copy( om_addr ); - submap_addr.x += offsets_offset.x; - submap_addr.y += offsets_offset.y; + tripoint_abs_sm submap_addr = project_to( om_addr ); + submap_addr += offsets_offset; submap_addrs.push_back( submap_addr ); submap *sm = submaps[submap_addr].get(); if( sm != nullptr && !sm->is_uniform ) { @@ -224,9 +224,9 @@ void mapbuffer::save_quad( const std::string &dirname, const std::string &filena jsout.member( "coordinates" ); jsout.start_array(); - jsout.write( submap_addr.x ); - jsout.write( submap_addr.y ); - jsout.write( submap_addr.z ); + jsout.write( submap_addr.x() ); + jsout.write( submap_addr.y() ); + jsout.write( submap_addr.z() ); jsout.end_array(); sm->store( jsout ); @@ -244,10 +244,10 @@ void mapbuffer::save_quad( const std::string &dirname, const std::string &filena // We're reading in way too many entities here to mess around with creating sub-objects and // seeking around in them, so we're using the json streaming API. -submap *mapbuffer::unserialize_submaps( const tripoint &p ) +submap *mapbuffer::unserialize_submaps( const tripoint_abs_sm &p ) { // Map the tripoint to the submap quad that stores it. - const tripoint om_addr = sm_to_omt_copy( p ); + const tripoint_abs_omt om_addr = project_to( p ); const std::string dirname = find_dirname( om_addr ); std::string quad_path = find_quad_path( dirname, om_addr ); @@ -257,7 +257,8 @@ submap *mapbuffer::unserialize_submaps( const tripoint &p ) // thousands separators, so the resulting path is "map/1,234.7.8.map" instead // of "map/1234.7.8.map". std::ostringstream buffer; - buffer << dirname << "/" << om_addr.x << "." << om_addr.y << "." << om_addr.z << ".map"; + buffer << dirname << "/" << om_addr.x() << "." << om_addr.y() << "." << om_addr.z() + << ".map"; if( file_exist( buffer.str() ) ) { quad_path = buffer.str(); } @@ -269,8 +270,7 @@ submap *mapbuffer::unserialize_submaps( const tripoint &p ) return nullptr; } if( submaps.count( p ) == 0 ) { - debugmsg( "file %s did not contain the expected submap %d,%d,%d", - quad_path, p.x, p.y, p.z ); + debugmsg( "file %s did not contain the expected submap %s", quad_path, p.to_string() ); return nullptr; } return submaps[ p ].get(); @@ -281,7 +281,7 @@ void mapbuffer::deserialize( JsonIn &jsin ) jsin.start_array(); while( !jsin.end_array() ) { std::unique_ptr sm = std::make_unique(); - tripoint submap_coordinates; + tripoint_abs_sm submap_coordinates; jsin.start_object(); int version = 0; while( !jsin.end_object() ) { @@ -290,7 +290,7 @@ void mapbuffer::deserialize( JsonIn &jsin ) version = jsin.get_int(); } else if( submap_member_name == "coordinates" ) { jsin.start_array(); - tripoint loc{ jsin.get_int(), jsin.get_int(), jsin.get_int() }; + tripoint_abs_sm loc{ jsin.get_int(), jsin.get_int(), jsin.get_int() }; jsin.end_array(); submap_coordinates = loc; } else { @@ -299,8 +299,7 @@ void mapbuffer::deserialize( JsonIn &jsin ) } if( !add_submap( submap_coordinates, sm ) ) { - debugmsg( "submap %d,%d,%d was already loaded", submap_coordinates.x, submap_coordinates.y, - submap_coordinates.z ); + debugmsg( "submap %s was already loaded", submap_coordinates.to_string() ); } } } diff --git a/src/mapbuffer.h b/src/mapbuffer.h index f4d6723eaaa76..b2d5464a0c6b4 100644 --- a/src/mapbuffer.h +++ b/src/mapbuffer.h @@ -7,6 +7,7 @@ #include #include +#include "coordinates.h" #include "point.h" class JsonIn; @@ -40,9 +41,9 @@ class mapbuffer * is already a submap with the specified coordinates. The submap * is not stored and the given unique_ptr retains ownsership. */ - bool add_submap( const tripoint &p, std::unique_ptr &sm ); + bool add_submap( const tripoint_abs_sm &p, std::unique_ptr &sm ); // Old overload that we should stop using, but it's complicated - bool add_submap( const tripoint &p, submap *sm ); + bool add_submap( const tripoint_abs_sm &p, submap *sm ); /** Get a submap stored in this buffer. * @@ -52,10 +53,10 @@ class mapbuffer * and could not be loaded. The mapbuffer takes care of the returned * submap object, don't delete it on your own. */ - submap *lookup_submap( const tripoint &p ); + submap *lookup_submap( const tripoint_abs_sm &p ); private: - using submap_map_t = std::map>; + using submap_map_t = std::map>; public: inline submap_map_t::iterator begin() { @@ -68,12 +69,13 @@ class mapbuffer private: // There's a very good reason this is private, // if not handled carefully, this can erase in-use submaps and crash the game. - void remove_submap( tripoint addr ); - submap *unserialize_submaps( const tripoint &p ); + void remove_submap( tripoint_abs_sm addr ); + submap *unserialize_submaps( const tripoint_abs_sm &p ); void deserialize( JsonIn &jsin ); - void save_quad( const std::string &dirname, const std::string &filename, - const tripoint &om_addr, std::list &submaps_to_delete, - bool delete_after_save ); + void save_quad( + const std::string &dirname, const std::string &filename, + const tripoint_abs_omt &om_addr, std::list &submaps_to_delete, + bool delete_after_save ); submap_map_t submaps; // NOLINT(cata-serialize) }; diff --git a/src/mapgen.cpp b/src/mapgen.cpp index 8eaed0fcad958..92b9f510bc3af 100644 --- a/src/mapgen.cpp +++ b/src/mapgen.cpp @@ -193,7 +193,8 @@ void map::generate( const tripoint &p, const time_point &when ) dbg( D_INFO ) << "map::generate( g[" << g.get() << "], p[" << p << "], " "when[" << to_string( when ) << "] )"; - set_abs_sub( p ); + // TODO: fix point types + set_abs_sub( tripoint_abs_sm( p ) ); // First we have to create new submaps and initialize them to 0 all over // We create all the submaps, even if we're not a tinymap, so that map @@ -295,6 +296,12 @@ void map::generate( const tripoint &p, const time_point &when ) } } +void map::generate( const tripoint_abs_sm &p, const time_point &when ) +{ + // TODO: fix point types + generate( p.raw(), when ); +} + void mapgen_function_builtin::generate( mapgendata &mgd ) { ( *fptr )( mgd ); @@ -1455,6 +1462,7 @@ std::string enum_to_string( jmapgen_flags v ) case jmapgen_flags::allow_terrain_under_other_data: return "ALLOW_TERRAIN_UNDER_OTHER_DATA"; case jmapgen_flags::erase_all_before_placing_terrain: return "ERASE_ALL_BEFORE_PLACING_TERRAIN"; + case jmapgen_flags::no_underlying_rotate: return "NO_UNDERLYING_ROTATE"; // *INDENT-ON* case jmapgen_flags::last: break; @@ -1707,9 +1715,9 @@ class jmapgen_field : public jmapgen_piece return; } if( remove ) { - dat.m.remove_field( tripoint( x.get(), y.get(), dat.m.get_abs_sub().z ), chosen_id ); + dat.m.remove_field( tripoint( x.get(), y.get(), dat.m.get_abs_sub().z() ), chosen_id ); } else { - dat.m.add_field( tripoint( x.get(), y.get(), dat.m.get_abs_sub().z ), chosen_id, + dat.m.add_field( tripoint( x.get(), y.get(), dat.m.get_abs_sub().z() ), chosen_id, intensity, age ); } } @@ -1827,15 +1835,14 @@ class jmapgen_sign : public jmapgen_piece if( !signtext.empty() ) { // replace tags std::string cityname = "illegible city name"; - tripoint abs_sub = dat.m.get_abs_sub(); - // TODO: fix point types - const city *c = overmap_buffer.closest_city( tripoint_abs_sm( abs_sub ) ).city; + tripoint_abs_sm abs_sub = dat.m.get_abs_sub(); + const city *c = overmap_buffer.closest_city( abs_sub ).city; if( c != nullptr ) { cityname = c->name; } signtext = apply_all_tags( signtext, cityname ); } - dat.m.set_signage( tripoint( r, dat.m.get_abs_sub().z ), signtext ); + dat.m.set_signage( tripoint( r, dat.m.get_abs_sub().z() ), signtext ); } std::string apply_all_tags( std::string signtext, const std::string &cityname ) const { replace_city_tag( signtext, cityname ); @@ -1878,15 +1885,14 @@ class jmapgen_graffiti : public jmapgen_piece if( !graffiti.empty() ) { // replace tags std::string cityname = "illegible city name"; - tripoint abs_sub = dat.m.get_abs_sub(); - // TODO: fix point types - const city *c = overmap_buffer.closest_city( tripoint_abs_sm( abs_sub ) ).city; + tripoint_abs_sm abs_sub = dat.m.get_abs_sub(); + const city *c = overmap_buffer.closest_city( abs_sub ).city; if( c != nullptr ) { cityname = c->name; } graffiti = apply_all_tags( graffiti, cityname ); } - dat.m.set_graffiti( tripoint( r, dat.m.get_abs_sub().z ), graffiti ); + dat.m.set_graffiti( tripoint( r, dat.m.get_abs_sub().z() ), graffiti ); } std::string apply_all_tags( std::string graffiti, const std::string &cityname ) const { replace_city_tag( graffiti, cityname ); @@ -2050,8 +2056,8 @@ class jmapgen_liquid_item : public jmapgen_piece } } if( newliquid.charges > 0 ) { - dat.m.add_item_or_charges( tripoint( x.get(), y.get(), dat.m.get_abs_sub().z ), - newliquid ); + dat.m.add_item_or_charges( + tripoint( x.get(), y.get(), dat.m.get_abs_sub().z() ), newliquid ); } } } @@ -2081,7 +2087,8 @@ class jmapgen_corpse : public jmapgen_piece MonsterGroupManager::GetMonstersFromGroup( group, true ); const mtype_id &corpse_type = random_entry_ref( monster_group ); item corpse = item::make_corpse( corpse_type, calendar::start_of_cataclysm ); - dat.m.add_item_or_charges( tripoint( x.get(), y.get(), dat.m.get_abs_sub().z ), corpse ); + dat.m.add_item_or_charges( tripoint( x.get(), y.get(), dat.m.get_abs_sub().z() ), + corpse ); } }; @@ -2163,7 +2170,7 @@ class jmapgen_loot : public jmapgen_piece isd->create( spawn, calendar::start_of_cataclysm, spawn_flags::use_spawn_rate ); dat.m.spawn_items( tripoint( rng( x.val, x.valmax ), rng( y.val, y.valmax ), - dat.m.get_abs_sub().z ), spawn ); + dat.m.get_abs_sub().z() ), spawn ); } } @@ -2319,13 +2326,13 @@ class jmapgen_monster : public jmapgen_piece MonsterGroupResult spawn_details = MonsterGroupManager::GetResultFromGroup( chosen_group ); dat.m.add_spawn( spawn_details.name, spawn_count * pack_size.get(), - { x.get(), y.get(), dat.m.get_abs_sub().z }, + { x.get(), y.get(), dat.m.get_abs_sub().z() }, friendly, -1, mission_id, name, data ); } else { mtype_id chosen_type = ids.pick()->get( dat ); if( !chosen_type.is_null() ) { dat.m.add_spawn( chosen_type, spawn_count * pack_size.get(), - { x.get(), y.get(), dat.m.get_abs_sub().z }, + { x.get(), y.get(), dat.m.get_abs_sub().z() }, friendly, -1, mission_id, name, data ); } } @@ -2469,7 +2476,7 @@ class jmapgen_trap : public jmapgen_piece if( chosen_id.id().is_null() ) { return; } - const tripoint actual_loc = tripoint( x.get(), y.get(), dat.m.get_abs_sub().z ); + const tripoint actual_loc = tripoint( x.get(), y.get(), dat.m.get_abs_sub().z() ); if( remove ) { dat.m.remove_trap( actual_loc ); } else { @@ -2550,7 +2557,7 @@ class jmapgen_terrain : public jmapgen_piece return; } point p( x.get(), y.get() ); - tripoint tp( p, dat.m.get_abs_sub().z ); + tripoint tp( p, dat.m.get_abs_sub().z() ); ter_id terrain_here = dat.m.ter( p ); const ter_t &chosen_ter = *chosen_id; @@ -2619,7 +2626,7 @@ class jmapgen_ter_furn_transform: public jmapgen_piece if( chosen_id.is_null() ) { return; } - chosen_id->transform( dat.m, tripoint( x.get(), y.get(), dat.m.get_abs_sub().z ) ); + chosen_id->transform( dat.m, tripoint( x.get(), y.get(), dat.m.get_abs_sub().z() ) ); } void check( const std::string &oter_name, const mapgen_parameters ¶meters, @@ -2660,7 +2667,7 @@ class jmapgen_make_rubble : public jmapgen_piece debugmsg( "null floor type when making rubble" ); chosen_floor_type = t_dirt; } - dat.m.make_rubble( tripoint( x.get(), y.get(), dat.m.get_abs_sub().z ), + dat.m.make_rubble( tripoint( x.get(), y.get(), dat.m.get_abs_sub().z() ), chosen_rubble_type, items, chosen_floor_type, overwrite ); } @@ -2718,8 +2725,9 @@ class jmapgen_computer : public jmapgen_piece const std::string &/*context*/ ) const override { const point r( x.get(), y.get() ); dat.m.furn_set( r, furn_f_console ); - computer *cpu = dat.m.add_computer( tripoint( r, dat.m.get_abs_sub().z ), name.translated(), - security ); + computer *cpu = + dat.m.add_computer( tripoint( r, dat.m.get_abs_sub().z() ), name.translated(), + security ); for( const auto &opt : options ) { cpu->add_option( opt ); } @@ -4285,11 +4293,11 @@ bool jmapgen_setmap::apply( const mapgendata &dat, const point &offset ) const } break; case JMAPGEN_SETMAP_BASH: { - m.bash( tripoint( x_get(), y_get(), m.get_abs_sub().z ), 9999 ); + m.bash( tripoint( x_get(), y_get(), m.get_abs_sub().z() ), 9999 ); } break; case JMAPGEN_SETMAP_VARIABLE: { - tripoint point( x_get(), y_get(), m.get_abs_sub().z ); + tripoint point( x_get(), y_get(), m.get_abs_sub().z() ); get_globals().set_global_value( string_val, m.getabs( point ).to_string() ); } break; @@ -4791,7 +4799,9 @@ void map::draw_lab( mapgendata &dat ) const auto predicate = [this]( const tripoint & p ) { return ter( p ) == t_thconc_floor && furn( p ) == f_null && tr_at( p ).is_null(); }; - const auto range = points_in_rectangle( { 0, 0, abs_sub.z }, { SEEX * 2 - 2, SEEY * 2 - 2, abs_sub.z } ); + const auto range = + points_in_rectangle( { 0, 0, abs_sub.z() }, + { SEEX * 2 - 2, SEEY * 2 - 2, abs_sub.z() } ); if( const auto p = random_point( range, predicate ) ) { ter_set( *p, t_stair_type ); @@ -4825,7 +4835,7 @@ void map::draw_lab( mapgendata &dat ) // Rotated maps cannot handle borders and have to be caught in code. // We determine if a border isn't handled by checking the east-facing // border space where the door normally is -- it should be a wall or door. - tripoint east_border( 23, 11, abs_sub.z ); + tripoint east_border( 23, 11, abs_sub.z() ); if( !has_flag_ter( ter_furn_flag::TFLAG_WALL, east_border ) && !has_flag_ter( ter_furn_flag::TFLAG_DOOR, east_border ) ) { // TODO: create a ter_reset function that does ter_set, @@ -4839,21 +4849,21 @@ void map::draw_lab( mapgendata &dat ) for( int i = 0; i < SEEX * 2; i++ ) { ter_set( point( 23, i ), rw_type ); furn_set( point( 23, i ), f_null ); - i_clear( tripoint( 23, i, get_abs_sub().z ) ); + i_clear( tripoint( 23, i, get_abs_sub().z() ) ); ter_set( point( i, 23 ), bw_type ); furn_set( point( i, 23 ), f_null ); - i_clear( tripoint( i, 23, get_abs_sub().z ) ); + i_clear( tripoint( i, 23, get_abs_sub().z() ) ); if( lw == 2 ) { ter_set( point( 0, i ), lw_type ); furn_set( point( 0, i ), f_null ); - i_clear( tripoint( 0, i, get_abs_sub().z ) ); + i_clear( tripoint( 0, i, get_abs_sub().z() ) ); } if( tw == 2 ) { ter_set( point( i, 0 ), tw_type ); furn_set( point( i, 0 ), f_null ); - i_clear( tripoint( i, 0, get_abs_sub().z ) ); + i_clear( tripoint( i, 0, get_abs_sub().z() ) ); } } if( rw != 2 ) { @@ -5081,7 +5091,7 @@ void map::draw_lab( mapgendata &dat ) ( !one_in( 3 ) && ( i == 11 || i == 12 || j == 11 || j == 12 ) ) || one_in( 4 ) ) { // bash and usually remove the rubble. - make_rubble( { i, j, abs_sub.z } ); + make_rubble( { i, j, abs_sub.z() } ); ter_set( point( i, j ), t_rock_floor ); if( !one_in( 3 ) ) { furn_set( point( i, j ), f_null ); @@ -5091,7 +5101,7 @@ void map::draw_lab( mapgendata &dat ) } else if( one_in( 20 ) && !has_flag_ter( ter_furn_flag::TFLAG_GOES_DOWN, p2 ) && !has_flag_ter( ter_furn_flag::TFLAG_GOES_UP, p2 ) ) { - destroy( { i, j, abs_sub.z } ); + destroy( { i, j, abs_sub.z() } ); // bashed squares can create dirt & floors, but we want rock floors. if( t_dirt == ter( point( i, j ) ) || t_floor == ter( point( i, j ) ) ) { ter_set( point( i, j ), t_rock_floor ); @@ -5113,7 +5123,7 @@ void map::draw_lab( mapgendata &dat ) if( ( ( j <= tw || i >= rw ) && i >= j && ( EAST_EDGE - i ) <= j ) || ( ( j >= bw || i <= lw ) && i <= j && ( SOUTH_EDGE - j ) <= i ) ) { if( one_in( 5 ) ) { - make_rubble( tripoint( i, j, abs_sub.z ), f_rubble_rock, true, + make_rubble( tripoint( i, j, abs_sub.z() ), f_rubble_rock, true, t_slime ); } else if( !one_in( 5 ) ) { ter_set( point( i, j ), t_slime ); @@ -5145,7 +5155,8 @@ void map::draw_lab( mapgendata &dat ) } if( tower_lab ) { - place_spawns( GROUP_LAB, 1, point_zero, point( EAST_EDGE, EAST_EDGE ), abs_sub.z * 0.02f ); + place_spawns( GROUP_LAB, 1, point_zero, point( EAST_EDGE, EAST_EDGE ), + abs_sub.z() * 0.02f ); } // Lab special effects. @@ -5170,7 +5181,7 @@ void map::draw_lab( mapgendata &dat ) ter_set( point( i, j ), fluid_type ); } else if( has_flag_ter( ter_furn_flag::TFLAG_DOOR, point( i, j ) ) && !one_in( 3 ) ) { // We want the actual debris, but not the rubble marker or dirt. - make_rubble( { i, j, abs_sub.z } ); + make_rubble( { i, j, abs_sub.z() } ); ter_set( point( i, j ), fluid_type ); furn_set( point( i, j ), f_null ); } @@ -5195,7 +5206,7 @@ void map::draw_lab( mapgendata &dat ) ter_set( p, fluid_type ); } else if( has_flag_ter( ter_furn_flag::TFLAG_DOOR, p ) ) { // We want the actual debris, but not the rubble marker or dirt. - make_rubble( { p, abs_sub.z } ); + make_rubble( { p, abs_sub.z() } ); ter_set( p, fluid_type ); furn_set( p, f_null ); } @@ -5212,9 +5223,9 @@ void map::draw_lab( mapgendata &dat ) if( one_in( 200 ) && ( t_thconc_floor == ter( point( i, j ) ) || t_strconc_floor == ter( point( i, j ) ) ) ) { if( is_toxic ) { - add_field( {i, j, abs_sub.z}, fd_gas_vent, 1 ); + add_field( {i, j, abs_sub.z()}, fd_gas_vent, 1 ); } else { - add_field( {i, j, abs_sub.z}, fd_smoke_vent, 2 ); + add_field( {i, j, abs_sub.z()}, fd_smoke_vent, 2 ); } } } @@ -5224,8 +5235,8 @@ void map::draw_lab( mapgendata &dat ) // portal with an artifact effect. case 5: { tripoint_range options = - points_in_rectangle( { 6, 6, abs_sub.z }, - { SEEX * 2 - 7, SEEY * 2 - 7, abs_sub.z } ); + points_in_rectangle( { 6, 6, abs_sub.z() }, + { SEEX * 2 - 7, SEEY * 2 - 7, abs_sub.z() } ); cata::optional center = random_point( options, [&]( const tripoint & p ) { return tr_at( p ).is_null(); @@ -5247,7 +5258,7 @@ void map::draw_lab( mapgendata &dat ) has_flag_ter( ter_furn_flag::TFLAG_CONSOLE, p ) ) { return; // spare stairs and consoles. } - make_rubble( {p, abs_sub.z } ); + make_rubble( {p, abs_sub.z() } ); ter_set( p, t_thconc_floor ); }, center->xy(), 4 ); furn_set( center->xy(), f_null ); @@ -5259,7 +5270,7 @@ void map::draw_lab( mapgendata &dat ) } // radioactive accident. case 6: { - tripoint center( rng( 6, SEEX * 2 - 7 ), rng( 6, SEEY * 2 - 7 ), abs_sub.z ); + tripoint center( rng( 6, SEEX * 2 - 7 ), rng( 6, SEEY * 2 - 7 ), abs_sub.z() ); if( has_flag_ter( ter_furn_flag::TFLAG_WALL, center.xy() ) ) { // just skip it, we don't want to risk embedding radiation out of sight. break; @@ -5282,7 +5293,7 @@ void map::draw_lab( mapgendata &dat ) has_flag_ter( ter_furn_flag::TFLAG_CONSOLE, p ) ) { return; // spare stairs and consoles. } - make_rubble( {p, abs_sub.z } ); + make_rubble( {p, abs_sub.z() } ); ter_set( p, t_thconc_floor ); }, center.xy(), 1 ); @@ -5299,7 +5310,7 @@ void map::draw_lab( mapgendata &dat ) } else { item newliquid( "plut_slurry_dense", calendar::start_of_cataclysm ); newliquid.charges = 1; - add_item_or_charges( tripoint( marker, get_abs_sub().z ), + add_item_or_charges( tripoint( marker, get_abs_sub().z() ), newliquid ); } break; @@ -5321,7 +5332,7 @@ void map::draw_lab( mapgendata &dat ) } } } - tripoint center( rng( 6, SEEX * 2 - 7 ), rng( 6, SEEY * 2 - 7 ), abs_sub.z ); + tripoint center( rng( 6, SEEX * 2 - 7 ), rng( 6, SEEY * 2 - 7 ), abs_sub.z() ); // Make a portal surrounded by more dense fungal stuff and a fungaloid. draw_rough_circle( [this]( const point & p ) { @@ -5378,7 +5389,7 @@ void map::draw_lab( mapgendata &dat ) // Rotated maps cannot handle borders and have to be caught in code. // We determine if a border isn't handled by checking the east-facing // border space where the door normally is -- it should be a wall or door. - tripoint east_border( 23, 11, abs_sub.z ); + tripoint east_border( 23, 11, abs_sub.z() ); if( !has_flag_ter( ter_furn_flag::TFLAG_WALL, east_border ) && !has_flag_ter( ter_furn_flag::TFLAG_DOOR, east_border ) ) { // TODO: create a ter_reset function that does ter_set, furn_set, and i_clear? @@ -5389,21 +5400,21 @@ void map::draw_lab( mapgendata &dat ) for( int i = 0; i < SEEX * 2; i++ ) { ter_set( point( 23, i ), rw_type ); furn_set( point( 23, i ), f_null ); - i_clear( tripoint( 23, i, get_abs_sub().z ) ); + i_clear( tripoint( 23, i, get_abs_sub().z() ) ); ter_set( point( i, 23 ), bw_type ); furn_set( point( i, 23 ), f_null ); - i_clear( tripoint( i, 23, get_abs_sub().z ) ); + i_clear( tripoint( i, 23, get_abs_sub().z() ) ); if( lw == 2 ) { ter_set( point( 0, i ), lw_type ); furn_set( point( 0, i ), f_null ); - i_clear( tripoint( 0, i, get_abs_sub().z ) ); + i_clear( tripoint( 0, i, get_abs_sub().z() ) ); } if( tw == 2 ) { ter_set( point( i, 0 ), tw_type ); furn_set( point( i, 0 ), f_null ); - i_clear( tripoint( i, 0, get_abs_sub().z ) ); + i_clear( tripoint( i, 0, get_abs_sub().z() ) ); } } if( rw != 2 ) { @@ -5543,7 +5554,7 @@ void map::draw_lab( mapgendata &dat ) } spawn_item( point( SEEX - 1, 8 ), "id_science" ); - tmpcomp = add_computer( tripoint( SEEX, 8, abs_sub.z ), + tmpcomp = add_computer( tripoint( SEEX, 8, abs_sub.z() ), _( "Sub-prime contact console" ), 7 ); if( monsters_end ) { //only add these options when there are monsters. tmpcomp->add_option( _( "Terminate Specimens" ), COMPACT_TERMINATE, 2 ); @@ -5589,7 +5600,7 @@ void map::draw_lab( mapgendata &dat ) line( this, t_reinforced_glass, point( SEEX + 1, SEEY - 1 ), point( SEEX + 1, SEEY ) ); spawn_item( point( SEEX - 4, SEEY - 3 ), "id_science" ); furn_set( point( SEEX - 3, SEEY - 3 ), furn_f_console ); - tmpcomp = add_computer( tripoint( SEEX - 3, SEEY - 3, abs_sub.z ), + tmpcomp = add_computer( tripoint( SEEX - 3, SEEY - 3, abs_sub.z() ), _( "Bionic access" ), 3 ); tmpcomp->add_option( _( "Manifest" ), COMPACT_LIST_BIONICS, 0 ); tmpcomp->add_option( _( "Open Chambers" ), COMPACT_RELEASE, 5 ); @@ -5627,8 +5638,8 @@ void map::draw_lab( mapgendata &dat ) return ter( p ) == t_thconc_floor && furn( p ) == f_null && tr_at( p ).is_null(); }; - const auto range = points_in_rectangle( { 0, 0, abs_sub.z }, - { SEEX * 2 - 2, SEEY * 2 - 2, abs_sub.z } ); + const auto range = points_in_rectangle( { 0, 0, abs_sub.z() }, + { SEEX * 2 - 2, SEEY * 2 - 2, abs_sub.z() } ); if( const auto p = random_point( range, predicate ) ) { ter_set( *p, t_stair_type ); } @@ -5674,15 +5685,15 @@ void map::draw_temple( const mapgendata &dat ) square( this, t_rock_floor, point_zero, point( EAST_EDGE, SOUTH_EDGE ) ); // We always start at the south and go north. // We use (y / 2 + z) % 4 to guarantee that rooms don't repeat. - switch( 1 + std::abs( abs_sub.y / 2 + dat.zlevel() + 4 ) % 4 ) { // TODO: More varieties! + switch( 1 + std::abs( abs_sub.y() / 2 + dat.zlevel() + 4 ) % 4 ) { // TODO: More varieties! case 1: // Flame bursts square( this, t_rock, point_zero, point( SEEX - 1, SOUTH_EDGE ) ); square( this, t_rock, point( SEEX + 2, 0 ), point( EAST_EDGE, SOUTH_EDGE ) ); for( int i = 2; i < SEEY * 2 - 4; i++ ) { - add_field( {SEEX, i, abs_sub.z}, fd_fire_vent, rng( 1, 3 ) ); - add_field( {SEEX + 1, i, abs_sub.z}, fd_fire_vent, rng( 1, 3 ) ); + add_field( {SEEX, i, abs_sub.z()}, fd_fire_vent, rng( 1, 3 ) ); + add_field( {SEEX + 1, i, abs_sub.z()}, fd_fire_vent, rng( 1, 3 ) ); } break; @@ -5898,9 +5909,9 @@ void map::draw_temple( const mapgendata &dat ) square( this, t_rock_floor, point( SEEX - 1, 1 ), point( SEEX + 2, 4 ) ); square( this, t_rock_floor, point( SEEX, 5 ), point( SEEX + 1, SOUTH_EDGE ) ); line( this, t_stairs_up, point( SEEX, SOUTH_EDGE ), point( SEEX + 1, SOUTH_EDGE ) ); - spawn_artifact( tripoint( rng( SEEX, SEEX + 1 ), rng( 2, 3 ), abs_sub.z ), + spawn_artifact( tripoint( rng( SEEX, SEEX + 1 ), rng( 2, 3 ), abs_sub.z() ), relic_procgen_data_cult ); - spawn_artifact( tripoint( rng( SEEX, SEEX + 1 ), rng( 2, 3 ), abs_sub.z ), + spawn_artifact( tripoint( rng( SEEX, SEEX + 1 ), rng( 2, 3 ), abs_sub.z() ), relic_procgen_data_cult ); return; @@ -5952,7 +5963,7 @@ void map::draw_mine( mapgendata &dat ) case 1: { // Toxic gas point gas_vent_location( rng( 9, 14 ), rng( 9, 14 ) ); ter_set( point( gas_vent_location ), t_rock ); - add_field( { gas_vent_location, abs_sub.z}, fd_gas_vent, 2 ); + add_field( { gas_vent_location, abs_sub.z() }, fd_gas_vent, 2 ); } break; @@ -5975,7 +5986,7 @@ void map::draw_mine( mapgendata &dat ) for( int i = wreck_location.x - 3; i < wreck_location.x + 3; i++ ) { for( int j = wreck_location.y - 3; j < wreck_location.y + 3; j++ ) { if( !one_in( 4 ) ) { - make_rubble( tripoint( i, j, abs_sub.z ), f_wreckage, true ); + make_rubble( tripoint( i, j, abs_sub.z() ), f_wreckage, true ); } } } @@ -6161,7 +6172,7 @@ void map::draw_mine( mapgendata &dat ) p3, false, calendar::start_of_cataclysm ); } place_spawns( GROUP_DOG_THING, 1, point( SEEX, SEEX ), point( SEEX + 1, SEEX + 1 ), 1, true, true ); - spawn_artifact( tripoint( rng( SEEX, SEEX + 1 ), rng( SEEY, SEEY + 1 ), abs_sub.z ), + spawn_artifact( tripoint( rng( SEEX, SEEX + 1 ), rng( SEEY, SEEY + 1 ), abs_sub.z() ), relic_procgen_data_netherum_tunnels ); } } @@ -6364,8 +6375,7 @@ void map::place_spawns( const mongroup_id &group, const int chance, const bool individual, const bool friendly, const std::string &name, const int mission_id ) { if( !group.is_valid() ) { - // TODO: fix point types - const tripoint_abs_omt omt( sm_to_omt_copy( get_abs_sub() ) ); + const tripoint_abs_omt omt = project_to( get_abs_sub() ); const oter_id &oid = overmap_buffer.ter( omt ); debugmsg( "place_spawns: invalid mongroup '%s', om_terrain = '%s' (%s)", group.c_str(), oid.id().c_str(), oid->get_mapgen_id().c_str() ); @@ -6403,7 +6413,7 @@ void map::place_spawns( const mongroup_id &group, const int chance, // Pick a monster type MonsterGroupResult spawn_details = MonsterGroupManager::GetResultFromGroup( group, &num ); - add_spawn( spawn_details.name, spawn_details.pack_size, { p, abs_sub.z }, + add_spawn( spawn_details.name, spawn_details.pack_size, { p, abs_sub.z() }, friendly, -1, mission_id, name, spawn_details.data ); } } @@ -6440,7 +6450,7 @@ void map::place_vending( const point &p, const item_group_id &type, bool reinfor if( lootable && !one_in( std::max( to_days( calendar::turn - calendar::start_of_cataclysm ), 0 ) + 4 ) ) { furn_set( p, f_vending_o ); - for( const auto &loc : points_in_radius( { p, abs_sub.z }, 1 ) ) { + for( const auto &loc : points_in_radius( { p, abs_sub.z() }, 1 ) ) { if( one_in( 4 ) ) { spawn_item( loc, "glass_shard", rng( 1, 25 ) ); } @@ -6457,7 +6467,7 @@ character_id map::place_npc( const point &p, const string_id &type shared_ptr_fast temp = make_shared_fast(); temp->normalize(); temp->load_npc_template( type ); - temp->spawn_at_precise( tripoint_abs_ms( getabs( tripoint( p, abs_sub.z ) ) ) ); + temp->spawn_at_precise( tripoint_abs_ms( getabs( tripoint( p, abs_sub.z() ) ) ) ); temp->toggle_trait( trait_NPC_STATIC_NPC ); overmap_buffer.insert_npc( temp ); return temp->getID(); @@ -6465,8 +6475,8 @@ character_id map::place_npc( const point &p, const string_id &type void map::apply_faction_ownership( const point &p1, const point &p2, const faction_id &id ) { - for( const tripoint &p : points_in_rectangle( tripoint( p1, abs_sub.z ), tripoint( p2, - abs_sub.z ) ) ) { + for( const tripoint &p : points_in_rectangle( tripoint( p1, abs_sub.z() ), tripoint( p2, + abs_sub.z() ) ) ) { map_stack items = i_at( p.xy() ); for( item &elem : items ) { elem.set_owner( id ); @@ -6493,8 +6503,7 @@ std::vector map::place_items( return res; } if( !item_group::group_is_defined( group_id ) ) { - // TODO: fix point types - const tripoint_abs_omt omt( sm_to_omt_copy( get_abs_sub() ) ); + const tripoint_abs_omt omt = project_to( get_abs_sub() ); const oter_id &oid = overmap_buffer.ter( omt ); debugmsg( "place_items: invalid item group '%s', om_terrain = '%s' (%s)", group_id.c_str(), oid.id().c_str(), oid->get_mapgen_id().c_str() ); @@ -6601,7 +6610,7 @@ vehicle *map::add_vehicle( const vgroup_id &type, const point &p, const units::a vehicle *map::add_vehicle( const vproto_id &type, const point &p, const units::angle &dir, int veh_fuel, int veh_status, bool merge_wrecks ) { - return add_vehicle( type, tripoint( p, abs_sub.z ), dir, veh_fuel, veh_status, merge_wrecks ); + return add_vehicle( type, tripoint( p, abs_sub.z() ), dir, veh_fuel, veh_status, merge_wrecks ); } vehicle *map::add_vehicle( const vproto_id &type, const tripoint &p, const units::angle &dir, @@ -6807,22 +6816,21 @@ void map::rotate( int turns, const bool setpos_safe ) } real_coords rc; - const tripoint &abs_sub = get_abs_sub(); - rc.fromabs( point( abs_sub.x * SEEX, abs_sub.y * SEEY ) ); + const tripoint_abs_sm &abs_sub = get_abs_sub(); + // TODO: fix point types + rc.fromabs( project_to( abs_sub.xy() ).raw() ); // TODO: This radius can be smaller - how small? const int radius = HALF_MAPSIZE + 3; // uses submap coordinates - // TODO: fix point types - const std::vector> npcs = - overmap_buffer.get_npcs_near( tripoint_abs_sm( abs_sub ), radius ); + const std::vector> npcs = overmap_buffer.get_npcs_near( abs_sub, radius ); for( const shared_ptr_fast &i : npcs ) { npc &np = *i; const tripoint sq = np.get_location().raw(); real_coords np_rc; np_rc.fromabs( sq.xy() ); // Note: We are rotating the entire overmap square (2x2 of submaps) - if( np_rc.om_pos != rc.om_pos || sq.z != abs_sub.z ) { + if( np_rc.om_pos != rc.om_pos || sq.z != abs_sub.z() ) { continue; } @@ -6851,13 +6859,13 @@ void map::rotate( int turns, const bool setpos_safe ) // Then we place it back from scratch // It could be rewritten to utilize the fact that rotation shouldn't cross overmaps shared_ptr_fast npc_ptr = overmap_buffer.remove_npc( np.getID() ); - np.spawn_at_precise( tripoint_abs_ms( getabs( tripoint( new_pos, abs_sub.z ) ) ) ); + np.spawn_at_precise( tripoint_abs_ms( getabs( tripoint( new_pos, abs_sub.z() ) ) ) ); overmap_buffer.insert_npc( npc_ptr ); } } clear_vehicle_level_caches(); - clear_vehicle_list( abs_sub.z ); + clear_vehicle_list( abs_sub.z() ); submap *pz = get_submap_at_grid( point_zero ); submap *pse = get_submap_at_grid( point_south_east ); @@ -6904,10 +6912,10 @@ void map::rotate( int turns, const bool setpos_safe ) sm->rotate( turns ); for( auto &veh : sm->vehicles ) { - veh->sm_pos = tripoint( p, abs_sub.z ); + veh->sm_pos = tripoint( p, abs_sub.z() ); } - update_vehicle_list( sm, abs_sub.z ); + update_vehicle_list( sm, abs_sub.z() ); } } rebuild_vehicle_level_caches(); @@ -6930,8 +6938,9 @@ void map::mirror( bool mirror_horizontal, bool mirror_vertical ) real_coords rc; - const tripoint &abs_sub = get_abs_sub(); - rc.fromabs( point( abs_sub.x * SEEX, abs_sub.y * SEEY ) ); + const tripoint_abs_sm &abs_sub = get_abs_sub(); + // TODO: fix point types + rc.fromabs( project_to( abs_sub.xy() ).raw() ); submap *pz = get_submap_at_grid( point_zero ); submap *pse = get_submap_at_grid( point_south_east ); @@ -7409,7 +7418,7 @@ void map::create_anomaly( const tripoint &cp, artifact_natural_property prop, bo for( int i = c.x - 5; i <= c.x + 5; i++ ) { for( int j = c.y - 5; j <= c.y + 5; j++ ) { if( furn( point( i, j ) ) == f_rubble ) { - add_field( {i, j, abs_sub.z}, fd_push_items, 1 ); + add_field( {i, j, abs_sub.z()}, fd_push_items, 1 ); if( one_in( 3 ) ) { spawn_item( point( i, j ), "rock" ); } @@ -7486,18 +7495,19 @@ void map::create_anomaly( const tripoint &cp, artifact_natural_property prop, bo case ARTPROP_ELECTRIC: case ARTPROP_CRACKLING: - add_field( {c, abs_sub.z}, fd_shock_vent, 3 ); + add_field( {c, abs_sub.z()}, fd_shock_vent, 3 ); break; case ARTPROP_SLIMY: - add_field( {c, abs_sub.z}, fd_acid_vent, 3 ); + add_field( {c, abs_sub.z()}, fd_acid_vent, 3 ); break; case ARTPROP_WARM: for( int i = c.x - 5; i <= c.x + 5; i++ ) { for( int j = c.y - 5; j <= c.y + 5; j++ ) { if( furn( point( i, j ) ) == f_rubble ) { - add_field( {i, j, abs_sub.z}, fd_fire_vent, 1 + ( rl_dist( c, point( i, j ) ) % 3 ) ); + add_field( {i, j, abs_sub.z()}, fd_fire_vent, + 1 + ( rl_dist( c, point( i, j ) ) % 3 ) ); } } } @@ -7583,7 +7593,7 @@ void circle_furn( map *m, const furn_id &type, const point &p, int rad ) } void add_corpse( map *m, const point &p ) { - m->add_corpse( tripoint( p, m->get_abs_sub().z ) ); + m->add_corpse( tripoint( p, m->get_abs_sub().z() ) ); } //////////////////// mapgen update @@ -7679,8 +7689,9 @@ bool update_mapgen_function_json::update_map( const mapgendata &md, const point const mapgendata &md; const int rotation; }; - rotation_guard rot( md_with_params ); - + if( !md.has_flag( jmapgen_flags::no_underlying_rotate ) ) { + rotation_guard rot( md_with_params ); + } return apply_mapgen_in_phases( md_with_params, setmap_points, objects, offset, context_, verify ); } diff --git a/src/mapgen_functions.cpp b/src/mapgen_functions.cpp index 73d7e4ebcd633..5c10b5cfc162e 100644 --- a/src/mapgen_functions.cpp +++ b/src/mapgen_functions.cpp @@ -237,7 +237,7 @@ void mapgen_crater( mapgendata &dat ) if( rng( 0, dat.w_fac ) <= i && rng( 0, dat.e_fac ) <= SEEX * 2 - 1 - i && rng( 0, dat.n_fac ) <= j && rng( 0, dat.s_fac ) <= SEEX * 2 - 1 - j ) { m->ter_set( point( i, j ), t_dirt ); - m->make_rubble( tripoint( i, j, m->get_abs_sub().z ), f_rubble_rock, true ); + m->make_rubble( tripoint( i, j, m->get_abs_sub().z() ), f_rubble_rock, true ); } else { m->ter_set( point( i, j ), dat.groundcover() ); } @@ -328,8 +328,8 @@ void mapgen_hive( mapgendata &dat ) m->ter_set( point( i + k, j + l ), t_floor_wax ); } } - m->add_spawn( mon_bee, 2, { i, j, m->get_abs_sub().z } ); - m->add_spawn( mon_beekeeper, 1, { i, j, m->get_abs_sub().z } ); + m->add_spawn( mon_bee, 2, { i, j, m->get_abs_sub().z() } ); + m->add_spawn( mon_beekeeper, 1, { i, j, m->get_abs_sub().z() } ); m->ter_set( point( i, j - 3 ), t_floor_wax ); m->ter_set( point( i, j + 3 ), t_floor_wax ); m->ter_set( point( i - 1, j - 2 ), t_floor_wax ); @@ -964,7 +964,7 @@ void mapgen_road( mapgendata &dat ) dat.monster_density() ); // 1 per 10 overmaps if( one_in( 10000 ) ) { - m->add_spawn( mon_zombie_jackson, 1, { SEEX, SEEY, m->get_abs_sub().z } ); + m->add_spawn( mon_zombie_jackson, 1, { SEEX, SEEY, m->get_abs_sub().z() } ); } } @@ -3227,7 +3227,7 @@ void mapgen_ravine_edge( mapgendata &dat ) void mremove_trap( map *m, const point &p, trap_id type ) { - tripoint actual_location( p, m->get_abs_sub().z ); + tripoint actual_location( p, m->get_abs_sub().z() ); const trap_id trap_at_loc = m->maptile_at( actual_location ).get_trap().id(); if( type == tr_null || trap_at_loc == type ) { m->remove_trap( actual_location ); @@ -3236,13 +3236,13 @@ void mremove_trap( map *m, const point &p, trap_id type ) void mtrap_set( map *m, const point &p, trap_id type ) { - tripoint actual_location( p, m->get_abs_sub().z ); + tripoint actual_location( p, m->get_abs_sub().z() ); m->trap_set( actual_location, type ); } void madd_field( map *m, const point &p, field_type_id type, int intensity ) { - tripoint actual_location( p, m->get_abs_sub().z ); + tripoint actual_location( p, m->get_abs_sub().z() ); m->add_field( actual_location, type, intensity, 0_turns ); } diff --git a/src/martialarts.cpp b/src/martialarts.cpp index 0c41a6a0c09f4..122d72615c724 100644 --- a/src/martialarts.cpp +++ b/src/martialarts.cpp @@ -371,7 +371,7 @@ void martialart::load( const JsonObject &jo, const std::string & ) optional( jo, was_loaded, "strictly_melee", strictly_melee, false ); optional( jo, was_loaded, "strictly_unarmed", strictly_unarmed, false ); - optional( jo, was_loaded, "allow_melee", allow_melee, false ); + optional( jo, was_loaded, "allow_all_weapons", allow_all_weapons, false ); optional( jo, was_loaded, "force_unarmed", force_unarmed, false ); optional( jo, was_loaded, "leg_block", leg_block, 99 ); @@ -579,7 +579,7 @@ bool ma_requirements::is_valid_character( const Character &u ) const bool forced_unarmed = u.martial_arts_data->selected_force_unarmed(); bool weapon_ok = is_valid_weapon( weapon ); bool style_weapon = u.martial_arts_data->selected_has_weapon( weapon.typeId() ); - bool all_weapons = u.martial_arts_data->selected_allow_melee(); + bool all_weapons = u.martial_arts_data->selected_allow_all_weapons(); bool unarmed_ok = !is_armed || ( unarmed_weapon && unarmed_weapons_allowed ); bool melee_ok = melee_allowed && weapon_ok && ( style_weapon || all_weapons ); @@ -1159,7 +1159,7 @@ bool martialart::has_weapon( const itype_id &itt ) const bool martialart::weapon_valid( const item &it ) const { - if( allow_melee ) { + if( allow_all_weapons ) { return true; } @@ -1788,7 +1788,7 @@ bool ma_style_callback::key( const input_context &ctxt, const input_event &event if( ma.force_unarmed ) { buffer += _( "This style forces you to use unarmed strikes, even if wielding a weapon." ); buffer += "\n"; - } else if( ma.allow_melee ) { + } else if( ma.allow_all_weapons ) { buffer += _( "This style can be used with all weapons." ); buffer += "\n"; } else if( ma.strictly_melee ) { diff --git a/src/martialarts.h b/src/martialarts.h index 9b13f315e6950..964472906f6ab 100644 --- a/src/martialarts.h +++ b/src/martialarts.h @@ -46,8 +46,10 @@ class weapon_category private: friend class generic_factory; + friend struct mod_tracker; weapon_category_id id; + std::vector> src; bool was_loaded = false; translation name_; @@ -126,6 +128,7 @@ class ma_technique void load( const JsonObject &jo, const std::string &src ); matec_id id; + std::vector> src; bool was_loaded = false; translation name; @@ -239,6 +242,7 @@ class ma_buff static const ma_buff *from_effect( const effect &eff ); mabuff_id id; + std::vector> src; bool was_loaded = false; translation name; translation description; @@ -312,6 +316,7 @@ class martialart std::string get_initiate_npc_message() const; matype_id id; + std::vector> src; bool was_loaded = false; translation name; translation description; @@ -329,7 +334,7 @@ class martialart std::set weapon_category; // all style weapon categories bool strictly_unarmed = false; // Punch daggers etc. bool strictly_melee = false; // Must have a weapon. - bool allow_melee = false; // Can use unarmed or with ANY weapon + bool allow_all_weapons = false; // Can use unarmed or with ANY weapon bool force_unarmed = false; // Don't use ANY weapon - punch or kick if needed std::vector static_buffs; // all buffs triggered by each condition std::vector onmove_buffs; diff --git a/src/material.cpp b/src/material.cpp index 4a063c49d1a1a..51109b2507f7a 100644 --- a/src/material.cpp +++ b/src/material.cpp @@ -147,17 +147,17 @@ itype_id material_type::repaired_with() const return _repaired_with; } -int material_type::bash_resist() const +float material_type::bash_resist() const { return _bash_resist; } -int material_type::cut_resist() const +float material_type::cut_resist() const { return _cut_resist; } -int material_type::bullet_resist() const +float material_type::bullet_resist() const { return _bullet_resist; } @@ -183,17 +183,17 @@ std::string material_type::dmg_adj( int damage ) const return _dmg_adj[std::min( static_cast( damage ), _dmg_adj.size() ) - 1].translated(); } -int material_type::acid_resist() const +float material_type::acid_resist() const { return _acid_resist; } -int material_type::elec_resist() const +float material_type::elec_resist() const { return _elec_resist; } -int material_type::fire_resist() const +float material_type::fire_resist() const { return _fire_resist; } diff --git a/src/material.h b/src/material.h index 67e4542d1f6b5..d8123ebe500d0 100644 --- a/src/material.h +++ b/src/material.h @@ -56,18 +56,19 @@ class material_type { public: material_id id; + std::vector> src; bool was_loaded = false; private: translation _name; cata::optional _salvaged_into; // this material turns into this item when salvaged itype_id _repaired_with = itype_id( "null" ); // this material can be repaired with this item - int _bash_resist = 0; // negative integers means susceptibility - int _cut_resist = 0; - int _acid_resist = 0; - int _elec_resist = 0; - int _fire_resist = 0; - int _bullet_resist = 0; + float _bash_resist = 0.0f; // negative integers means susceptibility + float _cut_resist = 0.0f; + float _acid_resist = 0.0f; + float _elec_resist = 0.0f; + float _fire_resist = 0.0f; + float _bullet_resist = 0.0f; int _chip_resist = 0; // Resistance to physical damage of the item itself int _density = 1; // relative to "powder", which is 1 // How resistant this material is to wind as a percentage - 0 to 100 @@ -111,15 +112,15 @@ class material_type */ cata::optional salvaged_into() const; itype_id repaired_with() const; - int bash_resist() const; - int cut_resist() const; - int bullet_resist() const; + float bash_resist() const; + float cut_resist() const; + float bullet_resist() const; std::string bash_dmg_verb() const; std::string cut_dmg_verb() const; std::string dmg_adj( int damage ) const; - int acid_resist() const; - int elec_resist() const; - int fire_resist() const; + float acid_resist() const; + float elec_resist() const; + float fire_resist() const; int chip_resist() const; float specific_heat_liquid() const; float specific_heat_solid() const; diff --git a/src/melee.cpp b/src/melee.cpp index 0463f8aff7ca2..ecc8eecfb1dbc 100644 --- a/src/melee.cpp +++ b/src/melee.cpp @@ -132,6 +132,7 @@ static const move_mode_id move_mode_prone( "prone" ); static const skill_id skill_bashing( "bashing" ); static const skill_id skill_cutting( "cutting" ); static const skill_id skill_melee( "melee" ); +static const skill_id skill_spellcraft( "spellcraft" ); static const skill_id skill_stabbing( "stabbing" ); static const skill_id skill_unarmed( "unarmed" ); @@ -1079,6 +1080,11 @@ double Character::crit_chance( float roll_hit, float target_dodge, const item &w return chance_triple + ma_buff_crit_chance; } +int Character::get_spell_resist() const +{ + return get_skill_level( skill_spellcraft ); +} + float Character::get_dodge() const { //If we're asleep or busy we can't dodge diff --git a/src/mission.h b/src/mission.h index f954eabe7fe68..d55b4d86f0200 100644 --- a/src/mission.h +++ b/src/mission.h @@ -206,6 +206,7 @@ struct mission_type { public: // Matches it to a mission_type_id above mission_type_id id = mission_type_id( "MISSION_NULL" ); + std::vector> src; bool was_loaded = false; private: // The untranslated name of the mission diff --git a/src/mission_start.cpp b/src/mission_start.cpp index 6eab95c2ca6a7..2ecefeb980713 100644 --- a/src/mission_start.cpp +++ b/src/mission_start.cpp @@ -210,7 +210,7 @@ static tripoint find_potential_computer_point( const tinymap &compmap ) } // if there's no possible location, then we have to overwrite an existing console... const tripoint fallback( rng( rng_x_min, rng_x_max ), rng( rng_y_min, rng_y_max ), - compmap.get_abs_sub().z ); + compmap.get_abs_sub().z() ); return random_entry( *used, fallback ); } diff --git a/src/mod_tracker.h b/src/mod_tracker.h index ef7671730641d..f45fe33401534 100644 --- a/src/mod_tracker.h +++ b/src/mod_tracker.h @@ -5,8 +5,11 @@ #include #include "cata_void.h" +#include "debug.h" +#include "demangle.h" #include "type_id.h" + /** * Mod Tracking: * @@ -16,36 +19,64 @@ * To subscribe, a JSON-loaded entity simply needs to have a * 'std::vector, mod_id> src;' member. * (As well as storing their id in an 'id' member of either string or int id type) + * If 'src' or 'id' is private, the subscriber must add 'mod_tracker' as a friend to access those members * - * If the entity is loaded with generic_factory, no further changes are needed. + * If the entity is loaded normally with generic_factory, no further changes are needed. * If the entity is not loaded with generic_factory, 'assign_src()' must be called sometime - * after the 'id' member has been assigned. + * after the 'id' member has been assigned. */ -/** Template magic to determine if the conditions above are satisfied */ -template> -struct has_src_member : std::false_type {}; +struct mod_tracker { + /** Template magic to determine if the conditions above are satisfied */ + template> + struct has_src_member : std::false_type {}; -template + template struct has_src_member().src.emplace_back( std::declval().id, mod_id() ) )>> : -std::true_type {}; - -/** Dummy function, for if those conditions are not satisfied */ -template < typename T, typename std::enable_if_t < !has_src_member::value > * = nullptr > -void assign_src( T &, const std::string & ) -{ -} - -/** If those conditions are satisfied, keep track of where this item has been modified */ -template::value > * = nullptr> -void assign_src( T &def, const std::string &src ) -{ - // We need to make sure we're keeping where this entity has been loaded - // If the id this was last loaded with is not this one, discard the history and start again - if( !def.src.empty() && def.src.back().first != def.id ) { - def.src.clear(); + std::true_type {}; + + + /** Dummy function, for if those conditions are not satisfied */ + template < typename T, typename std::enable_if_t < !has_src_member::value > * = nullptr > + static void assign_src( T &, const std::string & ) { + } + + /** If those conditions are satisfied, keep track of where this item has been modified */ + template::value > * = nullptr> + static void assign_src( T &def, const std::string &src ) { + // We need to make sure we're keeping where this entity has been loaded + // If the id this was last loaded with is not this one, discard the history and start again + if( !def.src.empty() && def.src.back().first != def.id ) { + def.src.clear(); + } + def.src.emplace_back( def.id, mod_id( src ) ); } - def.src.emplace_back( def.id, mod_id( src ) ); -} + + /** Dummy function, for if those conditions are not satisfied */ + template < typename T, typename std::enable_if_t < !has_src_member::value > * = nullptr > + static void check_duplicate_entries( const T &n, const T & ) { + static bool reported = false; + // We don't need to complain more than once, it's spammy. + if( reported ) { + return; + } + reported = true; + DebugLog( D_INFO, D_MAIN ) << __FILE__ << ":" << __LINE__ << ": " << "Tried check if '" << + n.id.str() << "' had a duplicate, but type '" << demangle( typeid( T ).name() ) << + "' does not track object sources"; + } + + /** If those conditions are satisfied, keep track of where this item has been modified */ + template::value > * = nullptr> + static void check_duplicate_entries( const T &n, const T &o ) { + // We need to make sure we're keeping where this entity has been loaded + // If the id this was last loaded with is not this one, discard the history and start again + if( n.src.back() == o.src.back() ) { + debugmsg( "%s (%s) has two definitions from the same source (%s)!", n.id.str(), + demangle( typeid( T ).name() ), n.src.back().second.str() ); + } + } + +}; #endif // CATA_SRC_MOD_TRACKER_H diff --git a/src/monfaction.h b/src/monfaction.h index fdba126cb756d..e40a6d98c5729 100644 --- a/src/monfaction.h +++ b/src/monfaction.h @@ -57,6 +57,7 @@ class monfaction bool is_root() const; mfaction_str_id id = mfaction_str_id::NULL_ID(); + std::vector> src; mfaction_str_id base_faction = mfaction_str_id::NULL_ID(); private: diff --git a/src/monmove.cpp b/src/monmove.cpp index a2b70dbc9bc87..fb42953e488c1 100644 --- a/src/monmove.cpp +++ b/src/monmove.cpp @@ -1217,7 +1217,7 @@ void monster::footsteps( const tripoint &p ) tripoint monster::scent_move() { // TODO: Remove when scentmap is 3D - if( std::abs( posz() - get_map().get_abs_sub().z ) > SCENT_MAP_Z_REACH ) { + if( std::abs( posz() - get_map().get_abs_sub().z() ) > SCENT_MAP_Z_REACH ) { return { -1, -1, INT_MIN }; } scent_map &scents = get_scent(); diff --git a/src/monstergenerator.h b/src/monstergenerator.h index bd84da9b8b780..b5485dcc0bf13 100644 --- a/src/monstergenerator.h +++ b/src/monstergenerator.h @@ -29,6 +29,7 @@ using mon_action_defend = void ( * )( monster &, Creature *, dealt_projectile_at struct species_type { species_id id; + std::vector> src; bool was_loaded = false; translation description; translation footsteps; diff --git a/src/mood_face.h b/src/mood_face.h index fc76509e61616..7a9a5334ffa4c 100644 --- a/src/mood_face.h +++ b/src/mood_face.h @@ -33,8 +33,10 @@ class mood_face private: friend class generic_factory; + friend struct mod_tracker; mood_face_id id; + std::vector> src; bool was_loaded = false; // Always sorted with highest value first diff --git a/src/morale_types.h b/src/morale_types.h index e6a64e1110550..3fd07f9169ae4 100644 --- a/src/morale_types.h +++ b/src/morale_types.h @@ -18,6 +18,7 @@ class morale_type_data translation text; public: morale_type id; + std::vector> src; bool was_loaded = false; /** Describes this morale type, with item type to replace wildcard with. */ diff --git a/src/move_mode.h b/src/move_mode.h index 22754dccc62c3..c2b78250ff0fa 100644 --- a/src/move_mode.h +++ b/src/move_mode.h @@ -33,9 +33,11 @@ class move_mode { friend class generic_factory; + friend struct mod_tracker; bool was_loaded = false; move_mode_id id; + std::vector> src; std::map change_messages_success; std::map change_messages_fail; diff --git a/src/mutation.h b/src/mutation.h index 987a9ba91a634..2dfdcb2d150a3 100644 --- a/src/mutation.h +++ b/src/mutation.h @@ -109,6 +109,7 @@ struct reflex_activation_data { struct mutation_branch { trait_id id; + std::vector> src; bool was_loaded = false; // True if this is a valid mutation (False for "unavailable from generic mutagen"). bool valid = false; diff --git a/src/npc_class.h b/src/npc_class.h index 4e6e6587543aa..cd35d44a839a4 100644 --- a/src/npc_class.h +++ b/src/npc_class.h @@ -77,6 +77,7 @@ class npc_class public: npc_class_id id; + std::vector> src; bool was_loaded = false; item_group_id worn_override; diff --git a/src/npctalk.cpp b/src/npctalk.cpp index 532d5acf56f06..cfc0754be3f96 100644 --- a/src/npctalk.cpp +++ b/src/npctalk.cpp @@ -349,44 +349,6 @@ static int npc_select_menu( const std::vector &npc_list, const std::strin } -static std::vector npcs_select_menu( const std::vector &npc_list, - const std::string &prompt, - std::function exclude_func = nullptr ) -{ - std::vector picked; - if( npc_list.empty() ) { - return picked; - } - const int npc_count = npc_list.size(); - do { - uilist nmenu; - nmenu.text = prompt; - for( int i = 0; i < npc_count; i++ ) { - std::string entry; - if( std::find( picked.begin(), picked.end(), i ) != picked.end() ) { - entry = "* "; - } - bool enable = exclude_func == nullptr || !exclude_func( npc_list[i] ); - entry += npc_list[i]->name_and_activity(); - nmenu.addentry( i, enable, MENU_AUTOASSIGN, entry ); - } - nmenu.addentry( npc_count, true, MENU_AUTOASSIGN, _( "Finish selection" ) ); - nmenu.query(); - if( nmenu.ret < 0 ) { - return std::vector(); - } else if( nmenu.ret >= npc_count ) { - break; - } - std::vector::iterator exists = std::find( picked.begin(), picked.end(), nmenu.ret ); - if( exists != picked.end() ) { - picked.erase( exists ); - } else { - picked.push_back( nmenu.ret ); - } - } while( true ); - return picked; -} - static skill_id skill_select_menu( const Character &c, const std::string &prompt ) { int i = 0; @@ -713,7 +675,7 @@ void game::chat() if( !sk.is_valid() ) { return; } - std::vector selected = npcs_select_menu( followers, + std::vector selected = npcs_select_menu( followers, _( "Who should participate in the training seminar?" ), [&]( const npc * n ) { return !n || n->get_knowledge_level( sk ) >= player_character.get_skill_level( sk ); } ); @@ -1616,6 +1578,47 @@ void parse_tags( std::string &phrase, const Character &u, const Character &me, } while( fa != std::string::npos && fb != std::string::npos ); } +static void parse_var_tags( std::string &phrase, const dialogue &d ) +{ + size_t fa; + size_t fb; + std::string tag; + do { + fa = phrase.find( '<' ); + fb = phrase.find( '>' ); + int l = fb - fa + 1; + if( fa != std::string::npos && fb != std::string::npos ) { + tag = phrase.substr( fa, fb - fa + 1 ); + } else { + return; + } + + if( tag.find( " + var.pop_back(); + phrase.replace( fa, l, d.actor( false )->get_value( "npctalk_var_" + var ) ); + } else if( tag.find( " + var.pop_back(); + phrase.replace( fa, l, d.actor( true )->get_value( "npctalk_var_" + var ) ); + } else if( tag.find( " + var.pop_back(); + global_variables &globvars = get_globals(); + phrase.replace( fa, l, globvars.get_global_value( "npctalk_var_" + var ) ); + } else if( !tag.empty() ) { + debugmsg( "Bad tag. '%s' (%d - %d)", tag.c_str(), fa, fb ); + phrase.replace( fa, fb - fa + 1, "????" ); + } + } while( fa != std::string::npos && fb != std::string::npos ); +} + void dialogue::add_topic( const std::string &topic_id ) { topic_stack.emplace_back( topic_id ); @@ -2335,6 +2338,7 @@ void talk_effect_fun_t::set_location_variable( const JsonObject &jo, const std:: { int_or_var iov_min_radius = get_int_or_var( jo, "min_radius", false, 0 ); int_or_var iov_max_radius = get_int_or_var( jo, "max_radius", false, 0 ); + int_or_var iov_z = get_int_or_var( jo, "z_offset", false, 0 ); const bool outdoor_only = jo.get_bool( "outdoor_only", false ); cata::optional target_params; if( jo.has_object( "target_params" ) ) { @@ -2346,15 +2350,15 @@ void talk_effect_fun_t::set_location_variable( const JsonObject &jo, const std:: var_type type = var.type; std::string var_name = var.name; function = [iov_min_radius, iov_max_radius, var_name, outdoor_only, target_params, - is_npc, type]( const dialogue & d ) { + is_npc, type, iov_z]( const dialogue & d ) { talker *target = d.actor( is_npc ); tripoint talker_pos = get_map().getabs( target->pos() ); - tripoint target_pos = talker_pos; + tripoint target_pos = talker_pos + tripoint( 0, 0, iov_z.evaluate( d.actor( iov_z.is_npc() ) ) ); int max_radius = iov_max_radius.evaluate( d.actor( iov_max_radius.is_npc() ) ); if( target_params.has_value() ) { const tripoint_abs_omt omt_pos = mission_util::get_om_terrain_pos( target_params.value() ); target_pos = tripoint( project_to( omt_pos ).x(), project_to( omt_pos ).y(), - project_to( omt_pos ).z() ); + project_to( omt_pos ).z() + iov_z.evaluate( d.actor( iov_z.is_npc() ) ) ); } else if( max_radius > 0 ) { bool found = false; int min_radius = iov_min_radius.evaluate( d.actor( iov_min_radius.is_npc() ) ); @@ -2399,7 +2403,8 @@ void talk_effect_fun_t::set_transform_radius( const JsonObject &jo, const std::s time_duration future = dov_time_in_future.evaluate( d.actor( dov_time_in_future.is_npc() ) ); if( future > 0_seconds ) { get_timed_events().add( timed_event_type::TRANSFORM_RADIUS, - calendar::turn + future, + calendar::turn + future + 1_seconds, + //Timed events happen before the player turn and eocs are during so we add a second here to sync them up using the same variable -1, tripoint_abs_sm( target_pos ), radius, transform.str() ); } else { get_map().transform_radius( transform, radius, target_pos ); @@ -2445,7 +2450,8 @@ void talk_effect_fun_t::set_mapgen_update( const JsonObject &jo, const std::stri } time_duration future = dov_time_in_future.evaluate( d.actor( dov_time_in_future.is_npc() ) ); if( future > 0_seconds ) { - time_point tif = calendar::turn + future; + time_point tif = calendar::turn + future + 1_seconds; + //Timed events happen before the player turn and eocs are during so we add a second here to sync them up using the same variable if( !revert ) { for( const update_mapgen_id &mapgen_update_id : update_ids ) { get_timed_events().add( timed_event_type::UPDATE_MAPGEN, tif, -1, project_to( omt_pos ), @@ -2456,9 +2462,8 @@ void talk_effect_fun_t::set_mapgen_update( const JsonObject &jo, const std::stri for( int x = 0; x < 2; x++ ) { for( int y = 0; y < 2; y++ ) { tripoint_abs_sm revert_sm = project_to( omt_pos ); - revert_sm += tripoint( x, y, 0 ); - const submap *sm = MAPBUFFER.lookup_submap( tripoint( revert_sm.x(), revert_sm.y(), - revert_sm.z() ) ); + revert_sm += point( x, y ); + const submap *sm = MAPBUFFER.lookup_submap( revert_sm ); get_timed_events().add( timed_event_type::REVERT_SUBMAP, tif, -1, revert_sm, 0, "", sm->get_revert_submap() ); } @@ -2668,12 +2673,13 @@ void talk_effect_fun_t::set_message( const JsonObject &jo, const std::string &me } else { translated_message = _( message ); } + parse_var_tags( translated_message, d ); if( sound ) { bool display = false; map &here = get_map(); if( !target->has_effect( effect_sleep ) && !target->is_deaf() ) { - if( !outdoor_only || here.get_abs_sub().z >= 0 || - one_in( std::max( roll_remainder( 2.0f * here.get_abs_sub().z / + if( !outdoor_only || here.get_abs_sub().z() >= 0 || + one_in( std::max( roll_remainder( 2.0f * here.get_abs_sub().z() / target->mutation_value( "hearing_modifier" ) ), 1 ) ) ) { display = true; } @@ -2784,12 +2790,12 @@ void talk_effect_fun_t::set_sound_effect( const JsonObject &jo, const std::strin int local_volume = volume; Character *target = &get_player_character(); //Only the player can hear sound effects. if( target && !target->has_effect( effect_sleep ) && !target->is_deaf() ) { - if( !outdoor_event || here.get_abs_sub().z >= 0 ) { + if( !outdoor_event || here.get_abs_sub().z() >= 0 ) { if( local_volume == -1 ) { local_volume = 80; } sfx::play_variant_sound( id, variant, local_volume, random_direction() ); - } else if( one_in( std::max( roll_remainder( 2.0f * here.get_abs_sub().z / + } else if( one_in( std::max( roll_remainder( 2.0f * here.get_abs_sub().z() / target->mutation_value( "hearing_modifier" ) ), 1 ) ) ) { if( local_volume == -1 ) { local_volume = 80 * target->mutation_value( "hearing_modifier" ); @@ -3308,6 +3314,16 @@ void talk_effect_fun_t::set_arithmetic( const JsonObject &jo, const std::string } } +void talk_effect_fun_t::set_set_string_var( const JsonObject &jo, const std::string &member ) +{ + str_or_var value = get_str_or_var( jo.get_member( member ), member ); + var_info var = read_var_info( jo.get_member( "target_var" ), false ); + function = [value, var]( const dialogue & d ) { + write_var_value( var.type, var.name, d.actor( var.type == var_type::npc ), + value.evaluate( d.actor( value.is_npc() ) ) ); + }; +} + void talk_effect_fun_t::set_assign_mission( const JsonObject &jo, const std::string &member ) { std::string mission_name = jo.get_string( member ); @@ -4133,6 +4149,8 @@ void talk_effect_t::parse_sub_effect( const JsonObject &jo ) subeffect_fun.set_custom_light_level( jo, "custom_light_level" ); } else if( jo.has_object( "give_equipment" ) ) { subeffect_fun.set_give_equipment( jo, "give_equipment" ); + } else if( jo.has_member( "set_string_var" ) ) { + subeffect_fun.set_set_string_var( jo, "set_string_var" ); } else { jo.throw_error( "invalid sub effect syntax: " + jo.str() ); } diff --git a/src/npctalk.h b/src/npctalk.h index 1819fe96a4638..d2b8b921f1b91 100644 --- a/src/npctalk.h +++ b/src/npctalk.h @@ -2,8 +2,8 @@ #ifndef CATA_SRC_NPCTALK_H #define CATA_SRC_NPCTALK_H +#include "npc.h" #include "type_id.h" -#include "character.h" class item; class json_talk_topic; @@ -137,4 +137,50 @@ int calc_spell_training_cost( const Character &teacher, const Character &student const json_talk_topic *get_talk_topic( const std::string &id ); +template +std::vector npcs_select_menu( const std::vector &npc_list, + const std::string &prompt, + std::function exclude_func ) +{ + std::vector picked; + if( npc_list.empty() ) { + return picked; + } + const int npc_count = npc_list.size(); + int last_index = 0; + do { + uilist nmenu; + nmenu.text = prompt; + for( int i = 0; i < npc_count; i++ ) { + std::string entry; + if( std::find( picked.begin(), picked.end(), i ) != picked.end() ) { + entry = "* "; + } + bool enable = exclude_func == nullptr || !exclude_func( npc_list[i] ); + if( const npc *np = dynamic_cast( npc_list[i] ) ) { + entry += np->name_and_activity(); + } else { + entry += npc_list[i]->disp_name( false, true ); + } + nmenu.addentry( i, enable, MENU_AUTOASSIGN, entry ); + } + nmenu.addentry( npc_count, true, MENU_AUTOASSIGN, _( "Finish selection" ) ); + nmenu.selected = nmenu.fselected = last_index; + nmenu.query(); + if( nmenu.ret < 0 ) { + return std::vector(); + } else if( nmenu.ret >= npc_count ) { + break; + } + std::vector::iterator exists = std::find( picked.begin(), picked.end(), nmenu.ret ); + if( exists != picked.end() ) { + picked.erase( exists ); + } else { + picked.push_back( nmenu.ret ); + } + last_index = nmenu.fselected; + } while( true ); + return picked; +} + #endif // CATA_SRC_NPCTALK_H diff --git a/src/npctalk_funcs.cpp b/src/npctalk_funcs.cpp index 71a21c1472cc8..20a5508db6d63 100644 --- a/src/npctalk_funcs.cpp +++ b/src/npctalk_funcs.cpp @@ -1046,7 +1046,6 @@ void talk_function::start_training_seminar( npc &p ) } students.push_back( &get_player_character() ); - const int s_count = students.size(); std::vector picked; std::function include_func = [&]( const Character * c ) { if( d.skill != skill_id() ) { @@ -1062,37 +1061,18 @@ void talk_function::start_training_seminar( npc &p ) } return false; }; - do { - uilist nmenu; - nmenu.text = _( "Who should participate?" ); - for( int i = 0; i < s_count; i++ ) { - std::string entry; - if( std::find( picked.begin(), picked.end(), students[i] ) != picked.end() ) { - entry = "* "; - } - bool enable = include_func( students[i] ); - entry += students[i]->disp_name( false, true ); - nmenu.addentry( i, enable, MENU_AUTOASSIGN, entry ); - } - nmenu.addentry( s_count, true, MENU_AUTOASSIGN, _( "Finish selection" ) ); - nmenu.query(); - if( nmenu.ret < 0 ) { - return; - } else if( nmenu.ret >= s_count ) { - break; - } - std::vector::iterator exists = std::find( picked.begin(), picked.end(), - students[nmenu.ret] ); - if( exists != picked.end() ) { - picked.erase( exists ); - } else { - picked.emplace_back( students[nmenu.ret] ); - } - } while( true ); + std::vector selected = npcs_select_menu( students, _( "Who should participate?" ), + [&include_func]( const Character * ch ) { + return !include_func( ch ); + } ); - if( picked.empty() ) { + if( selected.empty() ) { return; } + picked.reserve( selected.size() ); + for( int sel : selected ) { + picked.emplace_back( students[sel] ); + } start_training_gen( p, picked, d ); } diff --git a/src/omdata.h b/src/omdata.h index 6c0ba45a95606..77f1cace26830 100644 --- a/src/omdata.h +++ b/src/omdata.h @@ -117,6 +117,7 @@ class overmap_land_use_code { public: overmap_land_use_code_id id = overmap_land_use_code_id::NULL_ID(); + std::vector> src; int land_use_code = 0; translation name; @@ -221,6 +222,7 @@ struct oter_type_t { public: string_id id; + std::vector, mod_id>> src; translation name; uint32_t symbol = 0; nc_color color = c_black; @@ -284,6 +286,7 @@ struct oter_t { public: oter_str_id id; // definitive identifier. + std::vector < std::pair < oter_str_id, mod_id>> src; oter_t(); explicit oter_t( const oter_type_t &type ); @@ -540,6 +543,11 @@ class overmap_special mapgen_arguments get_args( const mapgendata & ) const; overmap_special_id id; + // TODO: fix how this works with fake specials + // Due to fake specials being created after data loading, if any mod has a region settings + // which has a fake special defined in DDA, it will count as from the same src, and thus + // a duplicate. + //std::vector> src; // Used by generic_factory bool was_loaded = false; @@ -576,8 +584,10 @@ struct overmap_special_migration { private: bool was_loaded = false; overmap_special_migration_id id; + std::vector> src; overmap_special_id new_id; friend generic_factory; + friend struct mod_tracker; }; namespace overmap_terrains diff --git a/src/overmap.cpp b/src/overmap.cpp index 5b6b8fba71de4..ce4b698bd64ff 100644 --- a/src/overmap.cpp +++ b/src/overmap.cpp @@ -6368,8 +6368,7 @@ bool overmap::is_omt_generated( const tripoint_om_omt &loc ) const tripoint_abs_sm global_sm_loc = project_to( project_combine( pos(), loc ) ); - // TODO: fix point types - const bool is_generated = MAPBUFFER.lookup_submap( global_sm_loc.raw() ) != nullptr; + const bool is_generated = MAPBUFFER.lookup_submap( global_sm_loc ) != nullptr; return is_generated; } @@ -6384,6 +6383,7 @@ overmap_special_id overmap_specials::create_building_from( const string_idsrc.back().second.str() ); return specials.insert( new_special ).id; } diff --git a/src/overmap_connection.h b/src/overmap_connection.h index 89d71a749246e..387f41a23b785 100644 --- a/src/overmap_connection.h +++ b/src/overmap_connection.h @@ -56,6 +56,7 @@ class overmap_connection public: string_id id; + std::vector, mod_id>> src; bool was_loaded = false; private: diff --git a/src/overmap_location.h b/src/overmap_location.h index 2afdb786c16f8..a0c6288751b49 100644 --- a/src/overmap_location.h +++ b/src/overmap_location.h @@ -26,6 +26,7 @@ struct overmap_location { // Used by generic_factory string_id id; + std::vector, mod_id>> src; bool was_loaded = false; private: diff --git a/src/overmap_ui.cpp b/src/overmap_ui.cpp index 94c21b2b9d184..929d5c67f4f81 100644 --- a/src/overmap_ui.cpp +++ b/src/overmap_ui.cpp @@ -847,8 +847,7 @@ static void draw_ascii( } } // Highlight areas that already have been generated - // TODO: fix point types - if( MAPBUFFER.lookup_submap( project_to( omp ).raw() ) ) { + if( MAPBUFFER.lookup_submap( project_to( omp ) ) ) { ter_color = red_background( ter_color ); } } diff --git a/src/panels.cpp b/src/panels.cpp index faefa04c490c6..2cd9e30542664 100644 --- a/src/panels.cpp +++ b/src/panels.cpp @@ -231,7 +231,7 @@ void overmap_ui::draw_overmap_chunk( const catacurses::window &w_minimap, const // (same algorithm) for( int j = -( height / 2 ); j <= height - ( height / 2 ) - 1; j++ ) { // omp is the current overmap point, at the current z-level - const tripoint_abs_omt omp( curs + point( i, j ), here.get_abs_sub().z ); + const tripoint_abs_omt omp( curs + point( i, j ), here.get_abs_sub().z() ); // Terrain color and symbol to use for this point nc_color ter_color; std::string ter_sym; @@ -569,7 +569,7 @@ static void draw_time( const draw_args &args ) // display time if( u.has_watch() ) { mvwprintz( w, point( 11, 0 ), c_light_gray, to_string_time_of_day( calendar::turn ) ); - } else if( get_map().get_abs_sub().z >= 0 ) { + } else if( get_map().get_abs_sub().z() >= 0 ) { wmove( w, point( 11, 0 ) ); draw_time_graphic( w ); } else { @@ -874,7 +874,7 @@ static void draw_loc_labels( const draw_args &args, bool minimap ) wprintz( w, c_white, utf8_truncate( cur_ter->get_name(), getmaxx( w ) - 13 ) ); map &here = get_map(); // display weather - if( here.get_abs_sub().z < 0 ) { + if( here.get_abs_sub().z() < 0 ) { // NOLINTNEXTLINE(cata-use-named-point-constants) mvwprintz( w, point( 1, 1 ), c_light_gray, _( "Sky : Underground" ) ); } else { @@ -1095,7 +1095,7 @@ static void draw_env_compact( const draw_args &args ) mvwprintz( w, point( text_left, 2 ), c_white, utf8_truncate( overmap_buffer.ter( u.global_omt_location() )->get_name(), getmaxx( w ) - 8 ) ); // weather - if( get_map().get_abs_sub().z < 0 ) { + if( get_map().get_abs_sub().z() < 0 ) { mvwprintz( w, point( text_left, 3 ), c_light_gray, _( "Underground" ) ); } else { mvwprintz( w, point( text_left, 3 ), get_weather().weather_id->color, @@ -1466,7 +1466,7 @@ static void draw_weather_classic( const draw_args &args ) werase( w ); - if( get_map().get_abs_sub().z < 0 ) { + if( get_map().get_abs_sub().z() < 0 ) { mvwprintz( w, point_zero, c_light_gray, _( "Underground" ) ); } else { mvwprintz( w, point_zero, c_light_gray, _( "Weather :" ) ); @@ -1535,7 +1535,7 @@ static void draw_time_classic( const draw_args &args ) // display time if( u.has_watch() ) { mvwprintz( w, point( 15, 0 ), c_light_gray, to_string_time_of_day( calendar::turn ) ); - } else if( get_map().get_abs_sub().z >= 0 ) { + } else if( get_map().get_abs_sub().z() >= 0 ) { wmove( w, point( 15, 0 ) ); draw_time_graphic( w ); } else { diff --git a/src/pixel_minimap.cpp b/src/pixel_minimap.cpp index 97aa34bd9819f..f4ecf057832b0 100644 --- a/src/pixel_minimap.cpp +++ b/src/pixel_minimap.cpp @@ -225,7 +225,8 @@ void pixel_minimap::set_settings( const pixel_minimap_settings &settings ) void pixel_minimap::prepare_cache_for_updates( const tripoint ¢er ) { - const tripoint new_center_sm = get_map().get_abs_sub() + ms_to_sm_copy( center ); + // TODO: fix point types + const tripoint new_center_sm = get_map().get_abs_sub().raw() + ms_to_sm_copy( center ); const tripoint center_sm_diff = cached_center_sm - new_center_sm; //invalidate the cache if the game shifted more than one submap in the last update, or if z-level changed. @@ -302,7 +303,8 @@ void pixel_minimap::update_cache_at( const tripoint &sm_pos ) const level_cache &access_cache = here.access_cache( sm_pos.z ); const bool nv_goggle = get_player_character().get_vision_modes()[NV_GOGGLES]; - submap_cache &cache_item = get_cache_at( here.get_abs_sub() + sm_pos ); + // TODO: fix point types + submap_cache &cache_item = get_cache_at( here.get_abs_sub().raw() + sm_pos ); const tripoint ms_pos = sm_to_ms_copy( sm_pos ); cache_item.touched = true; @@ -449,7 +451,8 @@ void pixel_minimap::render( const tripoint ¢er ) void pixel_minimap::render_cache( const tripoint ¢er ) { - const tripoint sm_center = get_map().get_abs_sub() + ms_to_sm_copy( center ); + // TODO: fix point types + const tripoint sm_center = get_map().get_abs_sub().raw() + ms_to_sm_copy( center ); const tripoint sm_offset = tripoint{ total_tiles_count.x / SEEX / 2, total_tiles_count.y / SEEY / 2, 0 diff --git a/src/profession.h b/src/profession.h index a7d2df21b2b47..b0e643942d384 100644 --- a/src/profession.h +++ b/src/profession.h @@ -40,9 +40,11 @@ class profession using itypedecvec = std::vector; friend class string_id; friend class generic_factory; + friend struct mod_tracker; private: string_id id; + std::vector, mod_id>> src; bool was_loaded = false; translation _name_male; diff --git a/src/proficiency.h b/src/proficiency.h index 88a811cfeb337..7484937b5e236 100644 --- a/src/proficiency.h +++ b/src/proficiency.h @@ -15,6 +15,8 @@ #include "translations.h" #include "type_id.h" +#include "mod_tracker.h" + class JsonArray; class JsonObject; class JsonOut; @@ -47,8 +49,10 @@ struct proficiency_bonus { class proficiency { friend class generic_factory; + friend struct mod_tracker; proficiency_id id; + std::vector> src; bool was_loaded = false; bool _can_learn = false; diff --git a/src/recipe_groups.cpp b/src/recipe_groups.cpp index 39652f22439bd..a249788fef669 100644 --- a/src/recipe_groups.cpp +++ b/src/recipe_groups.cpp @@ -23,6 +23,7 @@ using group_id = string_id; struct recipe_group_data { group_id id; + std::vector> src; std::string building_type = "NONE"; std::map recipes; std::map> om_terrains; diff --git a/src/relic.h b/src/relic.h index c58508853a987..18838254a57a9 100644 --- a/src/relic.h +++ b/src/relic.h @@ -120,6 +120,7 @@ class relic_procgen_data public: relic_procgen_id id; + std::vector> src; int power_level( const enchantment &ench ) const; // power level of the active spell diff --git a/src/requirements.h b/src/requirements.h index 5c807efc6e395..e8d3a8a8b151c 100644 --- a/src/requirements.h +++ b/src/requirements.h @@ -43,6 +43,7 @@ enum class component_type : int { struct quality { bool was_loaded = false; quality_id id; + std::vector> src; translation name; std::vector> usages; diff --git a/src/savegame.cpp b/src/savegame.cpp index 792d4dc908973..0ddd3a51959a1 100644 --- a/src/savegame.cpp +++ b/src/savegame.cpp @@ -88,13 +88,15 @@ void game::serialize( std::ostream &fout ) json.member( "run_mode", static_cast( safe_mode ) ); json.member( "mostseen", mostseen ); // current map coordinates - tripoint pos_sm = m.get_abs_sub(); - const point pos_om = sm_to_om_remain( pos_sm.x, pos_sm.y ); - json.member( "levx", pos_sm.x ); - json.member( "levy", pos_sm.y ); - json.member( "levz", pos_sm.z ); - json.member( "om_x", pos_om.x ); - json.member( "om_y", pos_om.y ); + tripoint_abs_sm pos_abs_sm = m.get_abs_sub(); + point_abs_om pos_om; + tripoint_om_sm pos_sm; + std::tie( pos_om, pos_sm ) = project_remain( pos_abs_sm ); + json.member( "levx", pos_sm.x() ); + json.member( "levy", pos_sm.y() ); + json.member( "levz", pos_sm.z() ); + json.member( "om_x", pos_om.x() ); + json.member( "om_y", pos_om.y() ); // view offset json.member( "view_offset_x", u.view_offset.x ); json.member( "view_offset_y", u.view_offset.y ); diff --git a/src/savegame_json.cpp b/src/savegame_json.cpp index c0f584b69347c..18cb14b297c30 100644 --- a/src/savegame_json.cpp +++ b/src/savegame_json.cpp @@ -132,11 +132,7 @@ static const activity_id ACT_MIGRATION_CANCEL( "ACT_MIGRATION_CANCEL" ); static const anatomy_id anatomy_human_anatomy( "human_anatomy" ); -static const efftype_id effect_hypocalcemia( "hypocalcemia" ); -static const efftype_id effect_hypovitA( "hypovitA" ); -static const efftype_id effect_hypovitB( "hypovitB" ); static const efftype_id effect_riding( "riding" ); -static const efftype_id effect_scurvy( "scurvy" ); static const itype_id itype_rad_badge( "rad_badge" ); static const itype_id itype_radio( "radio" ); @@ -3754,18 +3750,6 @@ void Creature::load( const JsonObject &jsin ) jsin.read( "effects", *effects ); } - // Remove legacy vitamin effects - they don't do anything, and can't be removed - // Remove this code whenever they actually do anything (0.F or later) - std::set blacklisted = { - effect_hypocalcemia, - effect_hypovitA, - effect_hypovitB, - effect_scurvy - }; - for( const efftype_id &remove : blacklisted ) { - remove_effect( remove ); - } - jsin.read( "values", values ); jsin.read( "damage_over_time_map", damage_over_time_map ); diff --git a/src/scenario.h b/src/scenario.h index 50e495d8ec6f6..363edaad5eba6 100644 --- a/src/scenario.h +++ b/src/scenario.h @@ -22,7 +22,9 @@ class scenario private: friend class string_id; friend class generic_factory; + friend struct mod_tracker; string_id id; + std::vector, mod_id>> src; bool was_loaded = false; translation _name_male; translation _name_female; diff --git a/src/scent_map.cpp b/src/scent_map.cpp index b9ce6a3960d3b..e2a3fe538c2bd 100644 --- a/src/scent_map.cpp +++ b/src/scent_map.cpp @@ -116,7 +116,7 @@ void scent_map::set_unsafe( const tripoint &p, int value, const scenttype_id &ty } int scent_map::get_unsafe( const tripoint &p ) const { - return grscent[p.x][p.y] - std::abs( get_map().get_abs_sub().z - p.z ); + return grscent[p.x][p.y] - std::abs( get_map().get_abs_sub().z() - p.z ); } scenttype_id scent_map::get_type() const @@ -138,7 +138,7 @@ bool scent_map::inbounds( const tripoint &p ) const // HACK: This weird long check here is a hack around the fact that scentmap is 2D // A z-level can access scentmap if it is within SCENT_MAP_Z_REACH flying z-level move from player's z-level // That is, if a flying critter could move directly up or down (or stand still) and be on same z-level as player - const int levz = get_map().get_abs_sub().z; + const int levz = get_map().get_abs_sub().z(); const bool scent_map_z_level_inbounds = ( p.z == levz ) || ( std::abs( p.z - levz ) == SCENT_MAP_Z_REACH && get_map().valid_move( p, tripoint( p.xy(), levz ), false, true ) ); diff --git a/src/scent_map.h b/src/scent_map.h index 3d619ccb96f3f..0d2fda51a995a 100644 --- a/src/scent_map.h +++ b/src/scent_map.h @@ -36,6 +36,7 @@ class scent_type bool was_loaded = false; scenttype_id id; + std::vector> src; std::set receptive_species; static void reset(); }; diff --git a/src/sdltiles.cpp b/src/sdltiles.cpp index d6cac1c0cb1dd..804ec893e2bf4 100644 --- a/src/sdltiles.cpp +++ b/src/sdltiles.cpp @@ -955,8 +955,7 @@ void cata_tiles::draw_om( const point &dest, const tripoint_abs_omt ¢er_abs_ if( uistate.place_terrain || uistate.place_special ) { // Highlight areas that already have been generated - // TODO: fix point types - if( MAPBUFFER.lookup_submap( project_to( omp ).raw() ) ) { + if( MAPBUFFER.lookup_submap( project_to( omp ) ) ) { draw_from_id_string( "highlight", omp.raw(), 0, 0, lit_level::LIT, false ); } } @@ -1077,20 +1076,20 @@ void cata_tiles::draw_om( const point &dest, const tripoint_abs_omt ¢er_abs_ // the tiles on the overmap are overmap tiles, so we need to use // coordinate conversions to make sure we're in the right place. - const int radius = coords::project_to( tripoint_abs_omt( std::min( max_col, max_row ), + const int radius = project_to( tripoint_abs_omt( std::min( max_col, max_row ), 0, 0 ) ).x() / 2; for( const city_reference &city : overmap_buffer.get_cities_near( - coords::project_to( center_abs_omt ), radius ) ) { - const tripoint_abs_omt city_center = coords::project_to( city.abs_sm_pos ); + project_to( center_abs_omt ), radius ) ) { + const tripoint_abs_omt city_center = project_to( city.abs_sm_pos ); if( overmap_buffer.seen( city_center ) && overmap_area.contains( city_center.raw() ) ) { label_bg( city.abs_sm_pos, city.city->name ); } } for( const camp_reference &camp : overmap_buffer.get_camps_near( - coords::project_to( center_abs_omt ), radius ) ) { - const tripoint_abs_omt camp_center = coords::project_to( camp.abs_sm_pos ); + project_to( center_abs_omt ), radius ) ) { + const tripoint_abs_omt camp_center = project_to( camp.abs_sm_pos ); if( overmap_buffer.seen( camp_center ) && overmap_area.contains( camp_center.raw() ) ) { label_bg( camp.abs_sm_pos, camp.camp->name ); } @@ -1137,7 +1136,7 @@ void cata_tiles::draw_om( const point &dest, const tripoint_abs_omt ¢er_abs_ }; // Find screen coordinates to the right of the center tile - auto center_sm = coords::project_to( tripoint_abs_omt( center_abs_omt.x() + 1, + auto center_sm = project_to( tripoint_abs_omt( center_abs_omt.x() + 1, center_abs_omt.y(), center_abs_omt.z() ) ); const tripoint tile_draw_pos = global_omt_to_draw_position( project_to ( center_sm ) ) - o; @@ -3884,7 +3883,7 @@ cata::optional input_context::get_coordinates( const catacurses::windo p = view_offset + selected - dim.window_size_cell / 2; } - return tripoint( p, get_map().get_abs_sub().z ); + return tripoint( p, get_map().get_abs_sub().z() ); } int get_terminal_width() diff --git a/src/skill_boost.h b/src/skill_boost.h index 7ad6fc32dee43..9421e69468db5 100644 --- a/src/skill_boost.h +++ b/src/skill_boost.h @@ -7,6 +7,7 @@ #include "optional.h" #include "string_id.h" +#include "type_id.h" class JsonObject; template @@ -29,7 +30,9 @@ class skill_boost private: friend class generic_factory; + friend struct mod_tracker; string_id id; + std::vector, mod_id>> src; bool was_loaded = false; std::vector _skills; int _offset = 0; diff --git a/src/speed_description.h b/src/speed_description.h index 0135027221dc3..5a4bee1d8b0a6 100644 --- a/src/speed_description.h +++ b/src/speed_description.h @@ -31,8 +31,10 @@ class speed_description private: friend class generic_factory; + friend struct mod_tracker; speed_description_id id; + std::vector> src; bool was_loaded = false; // Always sorted with highest value first diff --git a/src/start_location.cpp b/src/start_location.cpp index 9a3985e2f8103..36dcdd79bfd64 100644 --- a/src/start_location.cpp +++ b/src/start_location.cpp @@ -191,7 +191,7 @@ static void board_up( map &m, const tripoint_range &range ) void start_location::prepare_map( tinymap &m ) const { - const int z = m.get_abs_sub().z; + const int z = m.get_abs_sub().z(); if( flags().count( "BOARDED" ) > 0 ) { m.build_outside_cache( z ); board_up( m, m.points_on_zlevel( z ) ); @@ -300,8 +300,8 @@ void start_location::place_player( avatar &you, const tripoint_abs_omt &omtstart map &here = get_map(); // Start us off somewhere in the center of the map you.move_to( midpoint( project_bounds( omtstart ) ) ); - here.invalidate_map_cache( here.get_abs_sub().z ); - here.build_map_cache( here.get_abs_sub().z ); + here.invalidate_map_cache( here.get_abs_sub().z() ); + here.build_map_cache( here.get_abs_sub().z() ); const bool must_be_inside = flags().count( "ALLOW_OUTSIDE" ) == 0; ///\EFFECT_STR allows player to start behind less-bashable furniture and terrain // TODO: Allow using items here @@ -365,7 +365,7 @@ void start_location::burn( const tripoint_abs_omt &omtstart, const size_t count, const tripoint_abs_sm player_location = project_to( omtstart ); tinymap m; m.load( player_location, false ); - m.build_outside_cache( m.get_abs_sub().z ); + m.build_outside_cache( m.get_abs_sub().z() ); point player_pos = get_player_character().pos().xy(); const point u( player_pos.x % HALF_MAPSIZE_X, player_pos.y % HALF_MAPSIZE_Y ); std::vector valid; diff --git a/src/start_location.h b/src/start_location.h index e9025cebf4ca1..5c828d0360a4a 100644 --- a/src/start_location.h +++ b/src/start_location.h @@ -22,6 +22,7 @@ class start_location { public: start_location_id id; + std::vector> src; bool was_loaded = false; void load( const JsonObject &jo, const std::string &src ); void finalize(); diff --git a/src/subbodypart.h b/src/subbodypart.h index 7ec052ded2ee9..59614ba3ff3e6 100644 --- a/src/subbodypart.h +++ b/src/subbodypart.h @@ -15,6 +15,7 @@ #include "int_id.h" #include "string_id.h" #include "translations.h" +#include "type_id.h" class JsonObject; class JsonOut; @@ -42,6 +43,7 @@ struct enum_traits { struct sub_body_part_type { sub_bodypart_str_id id; + std::vector> src; sub_bodypart_str_id opposite; diff --git a/src/suffer.cpp b/src/suffer.cpp index 4e5c16d5c50ba..bc5eb709eb2a7 100644 --- a/src/suffer.cpp +++ b/src/suffer.cpp @@ -168,7 +168,6 @@ static const trait_id trait_WEB_SPINNER( "WEB_SPINNER" ); static const trait_id trait_WEB_WEAVER( "WEB_WEAVER" ); static const trait_id trait_WINGS_INSECT( "WINGS_INSECT" ); -static const vitamin_id vitamin_vitA( "vitA" ); static const vitamin_id vitamin_vitC( "vitC" ); namespace suffer @@ -807,7 +806,6 @@ void suffer::in_sunlight( Character &you ) } if( x_in_y( sunlight_nutrition, 18000 ) ) { - you.vitamin_mod( vitamin_vitA, 1 ); you.vitamin_mod( vitamin_vitC, 1 ); } diff --git a/src/timed_event.cpp b/src/timed_event.cpp index d28115fe316f8..9e43f35aef62d 100644 --- a/src/timed_event.cpp +++ b/src/timed_event.cpp @@ -109,7 +109,7 @@ void timed_event::actualize() break; case timed_event_type::SPAWN_WYRMS: { - if( here.get_abs_sub().z >= 0 ) { + if( here.get_abs_sub().z() >= 0 ) { return; } get_memorial().add( @@ -306,7 +306,7 @@ void timed_event::actualize() break; case timed_event_type::REVERT_SUBMAP: { - submap *sm = MAPBUFFER.lookup_submap( tripoint( map_point.x(), map_point.y(), map_point.z() ) ); + submap *sm = MAPBUFFER.lookup_submap( map_point ); sm->revert_submap( revert ); get_map().invalidate_map_cache( map_point.z() ); break; @@ -325,7 +325,7 @@ void timed_event::per_turn() switch( type ) { case timed_event_type::WANTED: { // About once every 5 minutes. Suppress in classic zombie mode. - if( here.get_abs_sub().z >= 0 && one_in( 50 ) && !get_option( "DISABLE_ROBOT_RESPONSE" ) ) { + if( here.get_abs_sub().z() >= 0 && one_in( 50 ) && !get_option( "DISABLE_ROBOT_RESPONSE" ) ) { point place = here.random_outdoor_tile(); if( place.x == -1 && place.y == -1 ) { // We're safely indoors! @@ -342,7 +342,7 @@ void timed_event::per_turn() break; case timed_event_type::SPAWN_WYRMS: - if( here.get_abs_sub().z >= 0 ) { + if( here.get_abs_sub().z() >= 0 ) { when -= 1_turns; return; } diff --git a/src/trap.h b/src/trap.h index 8b6356bc1607b..8c80679ed3117 100644 --- a/src/trap.h +++ b/src/trap.h @@ -106,6 +106,7 @@ using trap_function = std::function> src; trap_id loadid; bool was_loaded = false; diff --git a/src/veh_interact.cpp b/src/veh_interact.cpp index cf370ffb62274..9b43a8fca03e8 100644 --- a/src/veh_interact.cpp +++ b/src/veh_interact.cpp @@ -1021,40 +1021,34 @@ void veh_interact::do_install() " Continue?" ) ) ) { return; } - const auto &shapes = - vpart_shapes[ sel_vpart_info->name() + sel_vpart_info->base_item.str() ]; + auto &shapes = vpart_shapes[ sel_vpart_info->name() + sel_vpart_info->base_item.str() ]; + // Don't include appliances in variant list + for( auto iter = shapes.begin(); iter != shapes.end(); ) { + if( ( *iter )->has_flag( VPFLAG_APPLIANCE ) ) { + shapes.erase( iter ); + } else { + iter++; + } + } int selected_shape = -1; - // more than one shape available, display selection + // more than one base variant available with the same name size_t num_vpart_shapes = shapes.size(); - size_t num_shapes_total = num_vpart_shapes + sel_vpart_info->symbols.size(); - if( num_shapes_total > 1 ) { + if( num_vpart_shapes > 1 ) { std::vector shape_ui_entries; for( size_t i = 0; i < shapes.size(); i++ ) { - uilist_entry entry( i, true, 0, shapes[i]->name() ); + // use the id to distinguish between them + std::string vpname = + string_format( "%s (%s)", shapes[i]->name(), shapes[i]->get_id().str() ); + uilist_entry entry( i, true, 0, vpname ); entry.extratxt.left = 1; entry.extratxt.sym = special_symbol( shapes[i]->sym ); entry.extratxt.color = shapes[i]->color; shape_ui_entries.push_back( entry ); } - size_t j = num_vpart_shapes; - for( const auto &vp_variant : sel_vpart_info->symbols ) { - std::string disp_name = sel_vpart_info->name(); - for( const auto &vp_variant_pair : vpart_variants ) { - if( vp_variant_pair.first == vp_variant.first ) { - disp_name += " " + vp_variant_pair.second; - break; - } - } - uilist_entry entry( j, true, 0, disp_name ); - entry.extratxt.left = 1; - entry.extratxt.sym = special_symbol( vp_variant.second ); - entry.extratxt.color = sel_vpart_info->color; - shape_ui_entries.push_back( entry ); - j += 1; - } sort_uilist_entries_by_line_drawing( shape_ui_entries ); uilist smenu; - smenu.settext( _( "Choose shape:" ) ); + //~ Choose a base variant for a vehicle part + smenu.settext( _( "Choose base:" ) ); smenu.entries = shape_ui_entries; smenu.w_width_setup = [this]() { return getmaxx( w_list ); @@ -1070,25 +1064,70 @@ void veh_interact::do_install() } else { // only one shape available, default to first one selected_shape = 0; } - if( selected_shape >= 0 && - static_cast( selected_shape ) < num_shapes_total ) { - if( static_cast( selected_shape ) < num_vpart_shapes ) { - sel_vpart_info = shapes[selected_shape]; - sel_vpart_variant.clear(); - } else { - size_t offset = static_cast( selected_shape ) - num_vpart_shapes; - size_t j = 0; + if( selected_shape >= 0 && static_cast( selected_shape ) < num_vpart_shapes ) { + sel_vpart_info = shapes[selected_shape]; + sel_vpart_variant.clear(); + selected_shape = 0; + // more than one shape available, display selection + size_t num_shapes_total = sel_vpart_info->symbols.size(); + if( num_shapes_total > 0 ) { + std::vector shape_ui_entries; + size_t j = 1; for( const auto &vp_variant : sel_vpart_info->symbols ) { - if( j == offset ) { - sel_vpart_variant = vp_variant.first; - break; - } else { - j += 1; + std::string disp_name = sel_vpart_info->name(); + for( const auto &vp_variant_pair : vpart_variants ) { + if( vp_variant_pair.first == vp_variant.first ) { + disp_name += " " + vp_variant_pair.second; + break; + } } + uilist_entry entry( j, true, 0, disp_name ); + entry.extratxt.left = 1; + entry.extratxt.sym = special_symbol( vp_variant.second ); + entry.extratxt.color = sel_vpart_info->color; + shape_ui_entries.push_back( entry ); + j += 1; } + sort_uilist_entries_by_line_drawing( shape_ui_entries ); + //~ Option to select the default vehicle part, no variant + uilist_entry def_entry( 0, true, 0, _( "No variant (use default)" ) ); + def_entry.extratxt.left = 1; + def_entry.extratxt.sym = ' '; + def_entry.extratxt.color = c_white; + shape_ui_entries.push_back( def_entry ); + uilist smenu; + //~ Choose a variant shape for a vehicle part + smenu.settext( _( "Choose shape:" ) ); + smenu.entries = shape_ui_entries; + smenu.w_width_setup = [this]() { + return getmaxx( w_list ); + }; + smenu.w_x_setup = [this]( const int ) { + return getbegx( w_list ); + }; + smenu.w_y_setup = [this]( const int ) { + return getbegy( w_list ); + }; + smenu.query(); + selected_shape = smenu.ret; + } + if( selected_shape >= 0 && ( num_shapes_total == 0 || + static_cast( selected_shape ) < num_shapes_total ) ) { + int offset = selected_shape - 1; + if( offset >= 0 ) { + int j = 0; + for( const auto &vp_variant : sel_vpart_info->symbols ) { + if( j == offset ) { + sel_vpart_variant = vp_variant.first; + break; + } else { + j += 1; + } + } + } + sel_cmd = 'i'; + return; } - sel_cmd = 'i'; - return; } } } else if( action == "QUIT" ) { @@ -2014,7 +2053,15 @@ void veh_interact::do_change_shape() break; } else if( action == "CONFIRM" || action == "CHANGE_SHAPE" ) { using v_shapes = std::vector>; - const v_shapes &shapes = vpart_shapes[ sel_vpart_info->name() + sel_vpart_info->base_item.str() ]; + v_shapes &shapes = vpart_shapes[ sel_vpart_info->name() + sel_vpart_info->base_item.str() ]; + // Don't include appliances in variant list + for( auto iter = shapes.begin(); iter != shapes.end(); ) { + if( ( *iter )->has_flag( VPFLAG_APPLIANCE ) ) { + shapes.erase( iter ); + } else { + iter++; + } + } if( shapes.empty() ) { break; } @@ -2035,7 +2082,9 @@ void veh_interact::do_change_shape() int default_selection = 0; std::vector variants; for( const vpart_info *const shape : shapes ) { - uilist_entry entry( shape->name() ); + // more than one base variant available with the same name, use id to distinguish between them + std::string vpname = string_format( "%s (%s)", shape->name(), shape->get_id().str() ); + uilist_entry entry( vpname ); entry.retval = ret_code++; entry.extratxt.left = 1; entry.extratxt.sym = special_symbol( shape->sym ); diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 779eb5e9e1c4e..a8d6ce7f37f28 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -4993,8 +4993,10 @@ vehicle *vehicle::find_vehicle( const tripoint &where ) } // Nope. Load up its submap... - tripoint veh_in_sm = where; - tripoint veh_sm = ms_to_sm_remain( veh_in_sm ); + point_sm_ms veh_in_sm; + tripoint_abs_sm veh_sm; + // TODO: fix point types + std::tie( veh_sm, veh_in_sm ) = project_remain( tripoint_abs_ms( where ) ); const submap *sm = MAPBUFFER.lookup_submap( veh_sm ); if( sm == nullptr ) { @@ -5003,7 +5005,8 @@ vehicle *vehicle::find_vehicle( const tripoint &where ) for( const auto &elem : sm->vehicles ) { vehicle *found_veh = elem.get(); - if( veh_in_sm.xy() == found_veh->pos ) { + // TODO: fix point types + if( veh_in_sm.raw() == found_veh->pos ) { return found_veh; } } @@ -6906,42 +6909,46 @@ bool vpart_reference::has_feature( const vpart_bitflags f ) const static bool is_sm_tile_over_water( const tripoint &real_global_pos ) { - - const tripoint smp = ms_to_sm_copy( real_global_pos ); - const point p( modulo( real_global_pos.x, SEEX ), modulo( real_global_pos.y, SEEY ) ); + tripoint_abs_sm smp; + point_sm_ms p; + // TODO: fix point types + std::tie( smp, p ) = project_remain( tripoint_abs_ms( real_global_pos ) ); const submap *sm = MAPBUFFER.lookup_submap( smp ); if( sm == nullptr ) { - debugmsg( "is_sm_tile_outside(): couldn't find submap %d,%d,%d", smp.x, smp.y, smp.z ); + debugmsg( "is_sm_tile_over_water(): couldn't find submap %s", smp.to_string() ); return false; } - if( p.x < 0 || p.x >= SEEX || p.y < 0 || p.y >= SEEY ) { - debugmsg( "err %d,%d", p.x, p.y ); + if( p.x() < 0 || p.x() >= SEEX || p.y() < 0 || p.y() >= SEEY ) { + debugmsg( "err %s", p.to_string() ); return false; } - return ( sm->get_ter( p ).obj().has_flag( ter_furn_flag::TFLAG_CURRENT ) || - sm->get_furn( p ).obj().has_flag( ter_furn_flag::TFLAG_CURRENT ) ); + // TODO: fix point types + return ( sm->get_ter( p.raw() ).obj().has_flag( ter_furn_flag::TFLAG_CURRENT ) || + sm->get_furn( p.raw() ).obj().has_flag( ter_furn_flag::TFLAG_CURRENT ) ); } static bool is_sm_tile_outside( const tripoint &real_global_pos ) { - - const tripoint smp = ms_to_sm_copy( real_global_pos ); - const point p( modulo( real_global_pos.x, SEEX ), modulo( real_global_pos.y, SEEY ) ); + tripoint_abs_sm smp; + point_sm_ms p; + // TODO: fix point types + std::tie( smp, p ) = project_remain( tripoint_abs_ms( real_global_pos ) ); const submap *sm = MAPBUFFER.lookup_submap( smp ); if( sm == nullptr ) { - debugmsg( "is_sm_tile_outside(): couldn't find submap %d,%d,%d", smp.x, smp.y, smp.z ); + debugmsg( "is_sm_tile_outside(): couldn't find submap %s", smp.to_string() ); return false; } - if( p.x < 0 || p.x >= SEEX || p.y < 0 || p.y >= SEEY ) { - debugmsg( "err %d,%d", p.x, p.y ); + if( p.x() < 0 || p.x() >= SEEX || p.y() < 0 || p.y() >= SEEY ) { + debugmsg( "err %s", p.to_string() ); return false; } - return !( sm->get_ter( p ).obj().has_flag( ter_furn_flag::TFLAG_INDOORS ) || - sm->get_furn( p ).obj().has_flag( ter_furn_flag::TFLAG_INDOORS ) ); + // TODO: fix point types + return !( sm->get_ter( p.raw() ).obj().has_flag( ter_furn_flag::TFLAG_INDOORS ) || + sm->get_furn( p.raw() ).obj().has_flag( ter_furn_flag::TFLAG_INDOORS ) ); } void vehicle::update_time( const time_point &update_to ) diff --git a/src/vehicle_group.cpp b/src/vehicle_group.cpp index 6c1a05f1ad497..b8277e8e758e9 100644 --- a/src/vehicle_group.cpp +++ b/src/vehicle_group.cpp @@ -292,7 +292,7 @@ static void builtin_parkinglot( map &m, const std::string & ) tripoint pos_p; pos_p.x = rng( 0, 1 ) * 15 + rng( 4, 5 ); pos_p.y = rng( 0, 4 ) * 4 + rng( 2, 4 ); - pos_p.z = m.get_abs_sub().z; + pos_p.z = m.get_abs_sub().z(); if( !m.veh_at( pos_p ) ) { units::angle facing; diff --git a/src/vehicle_use.cpp b/src/vehicle_use.cpp index 1bc29a4d0de0b..a97ec58833e41 100644 --- a/src/vehicle_use.cpp +++ b/src/vehicle_use.cpp @@ -355,7 +355,7 @@ void vehicle::set_electronics_menu_options( std::vector &options, add_msg( _( "Camera system won't turn on" ) ); } map &m = get_map(); - m.invalidate_map_cache( m.get_abs_sub().z ); + m.invalidate_map_cache( m.get_abs_sub().z() ); refresh(); } ); } diff --git a/src/weakpoint.h b/src/weakpoint.h index 0ce91a4747813..96aa09d853725 100644 --- a/src/weakpoint.h +++ b/src/weakpoint.h @@ -151,6 +151,7 @@ struct weakpoint { struct weakpoints { // id of this set of weakpoints (inline weakpoints have a null id) weakpoints_id id; + std::vector> src; // List of weakpoints. Each weakpoint should have a unique id. std::vector weakpoint_list; // Default weakpoint to return. diff --git a/src/weather.cpp b/src/weather.cpp index 1edd8836a0291..c883fd39e2304 100644 --- a/src/weather.cpp +++ b/src/weather.cpp @@ -73,7 +73,7 @@ static const trait_id trait_FEATHERS( "FEATHERS" ); bool is_creature_outside( const Creature &target ) { map &here = get_map(); - return here.is_outside( point( target.posx(), target.posy() ) ) && here.get_abs_sub().z >= 0; + return here.is_outside( point( target.posx(), target.posy() ) ) && here.get_abs_sub().z() >= 0; } weather_type_id get_bad_weather() @@ -450,12 +450,12 @@ void weather_sound( const translation &sound_message, const std::string &sound_e Character &player_character = get_player_character(); map &here = get_map(); if( !player_character.has_effect( effect_sleep ) && !player_character.is_deaf() ) { - if( here.get_abs_sub().z >= 0 ) { + if( here.get_abs_sub().z() >= 0 ) { add_msg( sound_message ); if( !sound_effect.empty() ) { sfx::play_variant_sound( "environment", sound_effect, 80, random_direction() ); } - } else if( one_in( std::max( roll_remainder( 2.0f * here.get_abs_sub().z / + } else if( one_in( std::max( roll_remainder( 2.0f * here.get_abs_sub().z() / player_character.mutation_value( "hearing_modifier" ) ), 1 ) ) ) { add_msg( sound_message ); if( !sound_effect.empty() ) { @@ -956,7 +956,7 @@ void weather_manager::update_weather() nextweather = calendar::turn + rng( weather_id->duration_min, weather_id->duration_max ); map &here = get_map(); if( weather_id != old_weather && weather_id->dangerous && - here.get_abs_sub().z >= 0 && here.is_outside( player_character.pos() ) + here.get_abs_sub().z() >= 0 && here.is_outside( player_character.pos() ) && !player_character.has_activity( ACT_WAIT_WEATHER ) ) { g->cancel_activity_or_ignore_query( distraction_type::weather_change, string_format( _( "The weather changed to %s!" ), weather_id->name ) ); diff --git a/src/weather_type.h b/src/weather_type.h index 71f12d0f7df0d..ca6561ffd46ed 100644 --- a/src/weather_type.h +++ b/src/weather_type.h @@ -87,6 +87,7 @@ struct weather_type { friend class generic_factory; bool was_loaded = false; weather_type_id id; + std::vector> src; // UI name of weather type. translation name; // UI color of weather type. diff --git a/src/widget.h b/src/widget.h index 1de136ebb9b3f..f0dec2013e8c2 100644 --- a/src/widget.h +++ b/src/widget.h @@ -191,8 +191,10 @@ class widget { private: friend class generic_factory; + friend struct mod_tracker; widget_id id; + std::vector> src; bool was_loaded = false; const widget_clause *get_clause( const std::string &clause_id = "" ) const; diff --git a/tests/active_item_cache_test.cpp b/tests/active_item_cache_test.cpp index a92816bc935dd..dcd568929d086 100644 --- a/tests/active_item_cache_test.cpp +++ b/tests/active_item_cache_test.cpp @@ -30,8 +30,8 @@ TEST_CASE( "place_active_item_at_various_coordinates", "[item]" ) for( int y = 0; y < MAPSIZE_Y; ++y ) { REQUIRE( here.i_at( { x, y, z } ).empty() ); CAPTURE( x, y, z ); - tripoint abs_loc = here.get_abs_sub() + tripoint( x / SEEX, y / SEEY, z ); - CAPTURE( abs_loc.x, abs_loc.y, abs_loc.z ); + tripoint_abs_sm abs_loc = here.get_abs_sub() + tripoint( x / SEEX, y / SEEY, z ); + CAPTURE( abs_loc ); REQUIRE( here.get_submaps_with_active_items().empty() ); REQUIRE( here.get_submaps_with_active_items().find( abs_loc ) == here.get_submaps_with_active_items().end() ); diff --git a/tests/coordinate_test.cpp b/tests/coordinate_test.cpp index 774fb7db8076f..bcd9e5f69d8ed 100644 --- a/tests/coordinate_test.cpp +++ b/tests/coordinate_test.cpp @@ -62,7 +62,8 @@ TEST_CASE( "coordinate_operations", "[point][coords]" ) SECTION( "addition" ) { tripoint t0 = GENERATE( take( num_trials, random_tripoints() ) ); point p0 = t0.xy(); - point p1 = GENERATE( take( num_trials, random_points() ) ); + tripoint t1 = GENERATE( take( num_trials, random_tripoints() ) ); + point p1 = t1.xy(); CAPTURE( p0, p1 ); tripoint_abs_ms abst0( t0 ); point_abs_ms abs0( p0 ); @@ -86,6 +87,12 @@ TEST_CASE( "coordinate_operations", "[point][coords]" ) point_abs_ms sum = rel1 + abs0; CHECK( sum.raw() == p0 + p1 ); } + SECTION( "raw + abs -> abs" ) { + point_abs_ms sum = p1 + abs0; + CHECK( sum.raw() == p0 + p1 ); + tripoint_abs_ms sum_t = t1 + abs0; + CHECK( sum_t.raw() == p0 + t1 ); + } SECTION( "rel += rel" ) { rel0 += rel1; CHECK( rel0.raw() == p0 + p1 ); diff --git a/tests/coverage_test.cpp b/tests/coverage_test.cpp index ef1995ed90d8f..8dedb57a73582 100644 --- a/tests/coverage_test.cpp +++ b/tests/coverage_test.cpp @@ -28,7 +28,7 @@ static constexpr tripoint badguy_pos( HALF_MAPSIZE_X + 1, HALF_MAPSIZE_Y, 0 ); static void check_near( std::string subject, float actual, const float expected, const float tolerance ) { - THEN( string_format( "%s is about %.1f (+/- %.1f) with val %.1f", subject, expected, tolerance, + THEN( string_format( "%s is about %.1f (+/- %.2f) with val %.1f", subject, expected, tolerance, actual ) ) { CHECK( actual == Approx( expected ).margin( tolerance ) ); } @@ -58,7 +58,7 @@ static float get_avg_melee_dmg( std::string clothing_id, bool infect_risk = fals dude.setpos( dude_pos ); dude.wear_item( cloth, false ); dude.add_effect( effect_sleep, 1_hours ); - if( zed.melee_attack( dude ) ) { + if( zed.melee_attack( dude, 10000.0f ) ) { num_hits++; } cloth.set_damage( cloth.min_damage() ); @@ -124,7 +124,7 @@ TEST_CASE( "Infections from filthy clothing", "[coverage]" ) { SECTION( "Full melee and ranged coverage vs. melee attack" ) { const float chance = get_avg_melee_dmg( "test_zentai", true ); - check_near( "Infection chance", chance, 0.35f, 0.05f ); + check_near( "Infection chance", chance, 0.42f, 0.05f ); } SECTION( "No melee coverage vs. melee attack" ) { @@ -137,12 +137,12 @@ TEST_CASE( "Melee coverage vs. melee damage", "[coverage] [melee] [damage]" ) { SECTION( "Full melee and ranged coverage vs. melee attack" ) { const float dmg = get_avg_melee_dmg( "test_hazmat_suit" ); - check_near( "Average damage", dmg, 7.8f, 0.2f ); + check_near( "Average damage", dmg, 9.2f, 0.2f ); } SECTION( "No melee coverage vs. melee attack" ) { const float dmg = get_avg_melee_dmg( "test_hazmat_suit_nomelee" ); - check_near( "Average damage", dmg, 14.5f, 0.2f ); + check_near( "Average damage", dmg, 17.0f, 0.2f ); } } @@ -163,22 +163,21 @@ TEST_CASE( "Proportional armor material resistances", "[material]" ) { SECTION( "Mostly steel armor vs. melee" ) { const float dmg = get_avg_melee_dmg( "test_swat_mostly_steel" ); - check_near( "Average damage", dmg, 3.3f, 0.2f ); + check_near( "Average damage", dmg, 4.0f, 0.2f ); } SECTION( "Mostly cotton armor vs. melee" ) { const float dmg = get_avg_melee_dmg( "test_swat_mostly_cotton" ); // more variance on this test since it has a 5% chance of blocking with // high protection steel - check_near( "Average damage", dmg, 12.2f, 0.4f ); + check_near( "Average damage", dmg, 14.4f, 0.4f ); } SECTION( "Multi material segmented armor vs. melee" ) { const float dmg = get_avg_melee_dmg( "test_multi_portion_segmented_armor" ); + const float base_line = get_avg_melee_dmg( "test_portion_segmented_armor" ); // our armor should NOT be near 1 mm cloth + 80% of 1mm of steel // and should be higher (so lower damage) since they can overlap - // this is cut damage of 12 so shouldn't be near 6 with small variance - // if it is someone broke material rolls - check_not_near( "Average damage", dmg, 6.0f, 0.1f ); + check_not_near( "Average damage", dmg, base_line, 0.05f ); } } diff --git a/tests/encumbrance_test.cpp b/tests/encumbrance_test.cpp index 50e79c9c63bec..284199aabdc94 100644 --- a/tests/encumbrance_test.cpp +++ b/tests/encumbrance_test.cpp @@ -87,42 +87,44 @@ static constexpr int jacket_jean_e = 9; TEST_CASE( "regular_clothing_encumbrance", "[encumbrance]" ) { - test_encumbrance( { "postman_shirt" }, "torso", postman_shirt_e ); - test_encumbrance( { "longshirt" }, "torso", longshirt_e ); - test_encumbrance( { "jacket_jean" }, "torso", jacket_jean_e ); + test_encumbrance( { "test_postman_shirt" }, "torso", postman_shirt_e ); + test_encumbrance( { "test_longshirt" }, "torso", longshirt_e ); + test_encumbrance( { "test_jacket_jean" }, "torso", jacket_jean_e ); } TEST_CASE( "separate_layer_encumbrance", "[encumbrance]" ) { - test_encumbrance( { "longshirt", "jacket_jean" }, "torso", longshirt_e + jacket_jean_e ); + test_encumbrance( { "test_longshirt", "test_jacket_jean" }, "torso", longshirt_e + jacket_jean_e ); } TEST_CASE( "out_of_order_encumbrance", "[encumbrance]" ) { - test_encumbrance( { "jacket_jean", "longshirt" }, "torso", longshirt_e * 2 + jacket_jean_e ); + test_encumbrance( { "test_jacket_jean", "test_longshirt" }, "torso", + longshirt_e * 2 + jacket_jean_e ); } TEST_CASE( "same_layer_encumbrance", "[encumbrance]" ) { // When stacking within a layer, encumbrance for additional items is // counted twice - test_encumbrance( { "longshirt", "longshirt" }, "torso", longshirt_e * 2 + longshirt_e ); + test_encumbrance( { "test_longshirt", "test_longshirt" }, "torso", longshirt_e * 2 + longshirt_e ); // ... with a minimum of 2 - test_encumbrance( { "postman_shirt", "postman_shirt" }, "torso", postman_shirt_e * 2 + 2 ); + test_encumbrance( { "test_postman_shirt", "test_postman_shirt" }, "torso", + postman_shirt_e * 2 + 2 ); // ... and a maximum of 10 - test_encumbrance( { "jacket_jean", "jacket_jean" }, "torso", jacket_jean_e * 2 + 10 ); + test_encumbrance( { "test_jacket_jean", "test_jacket_jean" }, "torso", jacket_jean_e * 2 + 10 ); } TEST_CASE( "tiny_clothing", "[encumbrance]" ) { - item i( "longshirt" ); + item i( "test_longshirt" ); i.set_flag( json_flag_UNDERSIZE ); test_encumbrance_items( { i }, "torso", longshirt_e * 3 ); } TEST_CASE( "tiny_character", "[encumbrance]" ) { - item i( "longshirt" ); + item i( "test_longshirt" ); SECTION( "regular shirt" ) { test_encumbrance_items( { i }, "torso", longshirt_e * 2, add_trait( "SMALL2" ) ); } diff --git a/tests/iteminfo_test.cpp b/tests/iteminfo_test.cpp index 333ef00fef76a..3525c595b903e 100644 --- a/tests/iteminfo_test.cpp +++ b/tests/iteminfo_test.cpp @@ -1847,7 +1847,7 @@ TEST_CASE( "nutrients in food", "[iteminfo][food]" ) CHECK( item_info_str( ice_cream, { iteminfo_parts::FOOD_VITAMINS } ) == "--\n" - "Vitamins (RDA): Calcium (9%), Vitamin A (9%), and Vitamin B12 (11%)\n" ); + "Vitamins (RDA): Calcium (9%)\n" ); } SECTION( "nutrient ranges for recipe exemplars", "[iteminfo]" ) { @@ -1864,8 +1864,7 @@ TEST_CASE( "nutrients in food", "[iteminfo][food]" ) CHECK( item_info_str( ice_cream, { iteminfo_parts::FOOD_VITAMINS } ) == "--\n" "Nutrition will vary with chosen ingredients.\n" - "Vitamins (RDA): Calcium (7-37%), Iron (0-131%), " - "Vitamin A (3-11%), Vitamin B12 (2-6%), and Vitamin C (1-79%)\n" ); + "Vitamins (RDA): Calcium (7-37%), Iron (0-131%), and Vitamin C (1-79%)\n" ); } } @@ -2685,6 +2684,7 @@ TEST_CASE( "pocket info for a multi-pocket item", "[iteminfo][pocket][multiple]" "Item length: 0 cm to 70 cm\n" "Minimum item volume: 0.050 L\n" "Base moves to remove item: 50\n" + "This pocket only holds one item at a time.\n" "Restrictions:\n" "* Item must clip onto a belt loop\n" "* or Item must fit in a sheath\n" ); diff --git a/tests/map_extra_test.cpp b/tests/map_extra_test.cpp index 114f7749407f4..ceb46803893a3 100644 --- a/tests/map_extra_test.cpp +++ b/tests/map_extra_test.cpp @@ -77,7 +77,8 @@ TEST_CASE( "mx_minefield theoretical spawn", "[map_extra][overmap]" ) const map_extra_pointer mx_func = MapExtras::get_function( map_extra_mx_minefield ); - return mx_func( tm, tm.get_abs_sub() ); + // TODO: fix point types + return mx_func( tm, tm.get_abs_sub().raw() ); }; // Pick a point in the middle of the overmap so we don't go out of bounds when setting up diff --git a/tests/npc_talk_test.cpp b/tests/npc_talk_test.cpp index 56e181525cd84..7cddb4d38ef58 100644 --- a/tests/npc_talk_test.cpp +++ b/tests/npc_talk_test.cpp @@ -1193,7 +1193,7 @@ TEST_CASE( "npc_compare_int", "[npc_talk]" ) CHECK( d.responses[ 14 ].text == "time_since_cataclysm in days > 3" ); CHECK( d.responses[ 15 ].text == "Allies equals 1" ); CHECK( d.responses[ 16 ].text == "Cash equals 13" ); - CHECK( d.responses[ 17 ].text == "Owed ammount equals 14" ); + CHECK( d.responses[ 17 ].text == "Owed amount equals 14" ); CHECK( d.responses[ 18 ].text == "Driving skill more than or equal to 5" ); // TODO: Relaibly test the random number generator. CHECK( d.responses[ 19 ].text == "Temperature is 21." ); diff --git a/tests/ranged_balance_test.cpp b/tests/ranged_balance_test.cpp index 19ed23e8e824d..6e12acc015fb7 100644 --- a/tests/ranged_balance_test.cpp +++ b/tests/ranged_balance_test.cpp @@ -242,7 +242,7 @@ TEST_CASE( "unskilled_shooter_accuracy", "[ranged] [balance] [slow]" ) standard_npc shooter( "Shooter", shooter_pos, {}, 0, 8, 8, 8, 7 ); shooter.set_body(); shooter.worn.emplace_back( "backpack" ); - equip_shooter( shooter, { "bastsandals", "armguard_hard", "armguard_soft", "armor_chitin", "beekeeping_gloves", "mask_guy_fawkes", "cowboy_hat" } ); + equip_shooter( shooter, { "bastsandals", "vambrace_larmor", "armguard_soft", "armor_chitin", "beekeeping_gloves", "mask_guy_fawkes", "cowboy_hat" } ); assert_encumbrance( shooter, 10 ); SECTION( "an unskilled shooter with a common pistol" ) { diff --git a/tests/stomach_contents_test.cpp b/tests/stomach_contents_test.cpp index 13ba6b877be7d..b71cedea4a618 100644 --- a/tests/stomach_contents_test.cpp +++ b/tests/stomach_contents_test.cpp @@ -19,8 +19,6 @@ static const trait_id trait_HUNGER3( "HUNGER3" ); static const vitamin_id vitamin_calcium( "calcium" ); static const vitamin_id vitamin_iron( "iron" ); -static const vitamin_id vitamin_vitA( "vitA" ); -static const vitamin_id vitamin_vitB( "vitB" ); static const vitamin_id vitamin_vitC( "vitC" ); static void reset_time() @@ -48,8 +46,6 @@ static void clear_stomach( Character &p ) static void set_all_vitamins( int target, Character &p ) { - p.vitamin_set( vitamin_vitA, target ); - p.vitamin_set( vitamin_vitB, target ); p.vitamin_set( vitamin_vitC, target ); p.vitamin_set( vitamin_iron, target ); p.vitamin_set( vitamin_calcium, target ); @@ -198,8 +194,7 @@ TEST_CASE( "all_nutrition_starve_test", "[starve][slow]" ) print_stomach_contents( dummy, print_tests ); } if( print_tests ) { - printf( "vitamins: vitA %d vitB %d vitC %d calcium %d iron %d\n", - dummy.vitamin_get( vitamin_vitA ), dummy.vitamin_get( vitamin_vitB ), + printf( "vitamins: vitC %d calcium %d iron %d\n", dummy.vitamin_get( vitamin_vitC ), dummy.vitamin_get( vitamin_calcium ), dummy.vitamin_get( vitamin_iron ) ); printf( "\n" ); @@ -209,8 +204,6 @@ TEST_CASE( "all_nutrition_starve_test", "[starve][slow]" ) CHECK( dummy.get_stored_kcal() >= dummy.get_healthy_kcal() ); // We need to account for a day's worth of error since we're passing a day at a time and we are // close to 0 which is the max value for some vitamins - CHECK( dummy.vitamin_get( vitamin_vitA ) >= -100 ); - CHECK( dummy.vitamin_get( vitamin_vitB ) >= -100 ); CHECK( dummy.vitamin_get( vitamin_vitC ) >= -100 ); CHECK( dummy.vitamin_get( vitamin_iron ) >= -100 ); CHECK( dummy.vitamin_get( vitamin_calcium ) >= -100 ); diff --git a/tools/spell_checker/dictionary.txt b/tools/spell_checker/dictionary.txt index 93582a82db103..ec9c04bc05b31 100644 --- a/tools/spell_checker/dictionary.txt +++ b/tools/spell_checker/dictionary.txt @@ -688,6 +688,7 @@ glyceride goooood gooorge goops +gorget gorgosaurus gowod gozu @@ -1758,6 +1759,7 @@ uncleaned uncoils underbarrel undercovering +undergrown underprepared underslung undersuit