From a09d373add054e50265737f7238644cc6f9bd5fd Mon Sep 17 00:00:00 2001 From: Victoria Eastep <114838742+BarndoBoi@users.noreply.github.com> Date: Sat, 27 Apr 2024 02:07:43 -0400 Subject: [PATCH 001/104] Placeholder for adding surgical cart --- data/json/vehicleparts/cargo.json | 21 +++++++++++++++++++++ data/json/vehicles/carts.json | 7 +++++++ 2 files changed, 28 insertions(+) diff --git a/data/json/vehicleparts/cargo.json b/data/json/vehicleparts/cargo.json index f3467b490576d..f1c50a4e8df87 100644 --- a/data/json/vehicleparts/cargo.json +++ b/data/json/vehicleparts/cargo.json @@ -20,6 +20,27 @@ "breaks_into": "ig_vp_cloth", "variants": [ { "symbols": "o", "symbols_broken": "#" } ] }, + { + "type": "vehicle_part", + "id": "metal_tray", + "name": { "str": "metal tray" }, + "categories": [ "cargo" ], + "broken_color": "dark_gray", + "damage_modifier": 60, + "durability": 15, + "folded_volume": "1 L", + "size": "15 L", + "item": "bag_canvas", + "location": "center", + "requirements": { + "install": { "skills": [ [ "fabrication", 1 ] ], "time": "5 m", "using": [ [ "vehicle_nail_install", 1 ] ] }, + "removal": { "skills": [ [ "fabrication", 2 ] ], "time": "5 m", "using": [ [ "vehicle_nail_removal", 1 ] ] }, + "repair": { "skills": [ [ "fabrication", 2 ] ], "time": "5 m", "using": [ [ "adhesive", 2 ] ] } + }, + "flags": [ "CARGO", "BOARDABLE", "COVERED", "CARGO_PASSABLE" ], + "breaks_into": "ig_vp_cloth", + "variants": [ { "symbols": "o", "symbols_broken": "#" } ] + }, { "type": "vehicle_part", "abstract": "basketlg_abstract", diff --git a/data/json/vehicles/carts.json b/data/json/vehicles/carts.json index 9da164a2ff292..c405141973392 100644 --- a/data/json/vehicles/carts.json +++ b/data/json/vehicles/carts.json @@ -357,5 +357,12 @@ "name": "small hospital bed", "blueprint": [ [ "x" ] ], "parts": [ { "x": 0, "y": 0, "parts": [ "xlframe#vertical_2", "wheel_10", "bed" ] } ] + }, + { + "id": "surgical_cart", + "type": "vehicle", + "name": "Surgical Cart", + "blueprint": [ "#" ], + "parts": [ { "x": 0, "y": 0, "parts": [ "xlframe#vertical_2", "wheel_caster", "Add New Tray Vehicle Part Here" ] } ] } ] From 163b7b332fa7fed6e3a05c06b36c031d8cd540ce Mon Sep 17 00:00:00 2001 From: Victoria Eastep <114838742+BarndoBoi@users.noreply.github.com> Date: Mon, 29 Apr 2024 20:13:39 -0400 Subject: [PATCH 002/104] Fill out metal_tray and tested it --- data/json/vehicleparts/cargo.json | 17 ++++++++--------- data/json/vehicles/carts.json | 2 +- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/data/json/vehicleparts/cargo.json b/data/json/vehicleparts/cargo.json index f1c50a4e8df87..526f2c7b4a4e3 100644 --- a/data/json/vehicleparts/cargo.json +++ b/data/json/vehicleparts/cargo.json @@ -27,19 +27,18 @@ "categories": [ "cargo" ], "broken_color": "dark_gray", "damage_modifier": 60, - "durability": 15, - "folded_volume": "1 L", + "durability": 75, "size": "15 L", - "item": "bag_canvas", + "item": "sheet_metal", "location": "center", "requirements": { - "install": { "skills": [ [ "fabrication", 1 ] ], "time": "5 m", "using": [ [ "vehicle_nail_install", 1 ] ] }, - "removal": { "skills": [ [ "fabrication", 2 ] ], "time": "5 m", "using": [ [ "vehicle_nail_removal", 1 ] ] }, - "repair": { "skills": [ [ "fabrication", 2 ] ], "time": "5 m", "using": [ [ "adhesive", 2 ] ] } + "install": { "skills": [ [ "fabrication", 1 ] ], "time": "5 m", "using": [ [ "vehicle_bolt_install", 1 ] ] }, + "removal": { "skills": [ [ "fabrication", 1 ] ], "time": "5 m", "using": [ [ "vehicle_wrench_1", 1 ] ] }, + "repair": { "skills": [ [ "fabrication", 2 ], [ "mechanics", 2 ] ], "time": "5 m", "using": [ [ "repair_welding_standard", 5 ] ] } }, - "flags": [ "CARGO", "BOARDABLE", "COVERED", "CARGO_PASSABLE" ], - "breaks_into": "ig_vp_cloth", - "variants": [ { "symbols": "o", "symbols_broken": "#" } ] + "flags": [ "CARGO", "BOARDABLE", "CARGO_PASSABLE", "FLAT_SURF" ], + "breaks_into": "ig_vp_sheet_metal", + "variants": [ { "symbols": "T", "symbols_broken": "#" } ] }, { "type": "vehicle_part", diff --git a/data/json/vehicles/carts.json b/data/json/vehicles/carts.json index c405141973392..fff4cb9f8daa4 100644 --- a/data/json/vehicles/carts.json +++ b/data/json/vehicles/carts.json @@ -363,6 +363,6 @@ "type": "vehicle", "name": "Surgical Cart", "blueprint": [ "#" ], - "parts": [ { "x": 0, "y": 0, "parts": [ "xlframe#vertical_2", "wheel_caster", "Add New Tray Vehicle Part Here" ] } ] + "parts": [ { "x": 0, "y": 0, "parts": [ "xlframe#vertical_2", "wheel_caster", "metal_tray" ] } ] } ] From a4454e954e761be86223be175fa6c3ee764ec30d Mon Sep 17 00:00:00 2001 From: Sab Pyrope Date: Sat, 2 Mar 2024 10:57:28 +0800 Subject: [PATCH 003/104] Move XL-XS to JSON tags --- data/json/flags.json | 10 + data/json/items/armor/ammo_pouch.json | 20 +- data/json/items/armor/arms_armor.json | 194 +++---- data/json/items/armor/ballistic_armor.json | 12 +- .../armor/bespoke_armor/custom_bodysuits.json | 72 +-- .../armor/bespoke_armor/custom_boots.json | 56 +- .../armor/bespoke_armor/custom_gloves.json | 72 +-- .../armor/bespoke_armor/custom_headgear.json | 72 +-- .../armor/bespoke_armor/custom_legs.json | 16 +- .../armor/bespoke_armor/custom_overcoats.json | 8 +- .../armor/bespoke_armor/cuttingroom.json | 80 +-- .../items/armor/bespoke_armor/utility.json | 8 +- data/json/items/armor/boots.json | 156 +++--- data/json/items/armor/brigandine.json | 520 +++++++++--------- data/json/items/armor/coats.json | 48 +- data/json/items/armor/gambesons.json | 342 ++++++------ data/json/items/armor/gloves.json | 163 +++--- data/json/items/armor/head_attachments.json | 120 ++-- data/json/items/armor/helmets.json | 317 ++++++----- data/json/items/armor/hoods.json | 40 +- data/json/items/armor/legs_armor.json | 188 +++---- data/json/items/armor/suits_clothes.json | 9 +- data/json/items/armor/suits_protection.json | 255 +++++---- data/json/items/armor/swimming.json | 164 +++--- data/json/items/armor/torso_armor.json | 222 ++++---- data/json/items/armor/torso_clothes.json | 52 +- data/json/items/armor/undergarment.json | 64 +-- data/json/items/melee/unarmed_weapons.json | 64 +-- data/json/items/tool_armor.json | 104 ++-- doc/JSON_FLAGS.md | 2 + 30 files changed, 1717 insertions(+), 1733 deletions(-) diff --git a/data/json/flags.json b/data/json/flags.json index fefd98e41c988..d8246d844f2b8 100644 --- a/data/json/flags.json +++ b/data/json/flags.json @@ -2455,5 +2455,15 @@ { "id": "DRACULIN_VENOM", "type": "json_flag" + }, + { + "id": "PREFIX_XL", + "type": "json_flag", + "item_prefix": "XL " + }, + { + "id": "PREFIX_XS", + "type": "json_flag", + "item_prefix": "XS " } ] diff --git a/data/json/items/armor/ammo_pouch.json b/data/json/items/armor/ammo_pouch.json index ba1a40f2b5f15..9d26fea713154 100644 --- a/data/json/items/armor/ammo_pouch.json +++ b/data/json/items/armor/ammo_pouch.json @@ -207,17 +207,17 @@ "id": "xl_chestrig", "type": "ARMOR", "copy-from": "chestrig", - "name": { "str": "XL chest rig" }, + "name": { "str": "chest rig" }, "proportional": { "weight": 1.25, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_chestrig", "type": "ARMOR", "copy-from": "chestrig", - "name": { "str": "XS chest rig" }, + "name": { "str": "chest rig" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "javelin_bag", @@ -666,17 +666,17 @@ "id": "xl_tacvest", "type": "ARMOR", "copy-from": "tacvest", - "name": { "str": "XL tac vest" }, + "name": { "str": "tac vest" }, "proportional": { "weight": 1.25, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_tacvest", "type": "ARMOR", "copy-from": "tacvest", - "name": { "str": "XS tac vest" }, + "name": { "str": "tac vest" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "light_load_bearing_vest", @@ -1245,7 +1245,7 @@ "id": "xlkevlar", "type": "ARMOR", "category": "armor", - "name": { "str": "XL Kevlar vest" }, + "name": { "str": "Kevlar vest" }, "description": "A massive handmade imitation of a proper ballistic vest for abnormally large folks. Large and heavy, but will still fit under an abnormally large coat.", "weight": "4210 g", "volume": "8 L", @@ -1257,7 +1257,7 @@ "color": "light_gray", "warmth": 20, "material_thickness": 5, - "flags": [ "STURDY", "OVERSIZE" ], + "flags": [ "STURDY", "OVERSIZE", "PREFIX_XL" ], "armor": [ { "material": [ diff --git a/data/json/items/armor/arms_armor.json b/data/json/items/armor/arms_armor.json index 2c4f7784dd26b..7c6990bb77d89 100644 --- a/data/json/items/armor/arms_armor.json +++ b/data/json/items/armor/arms_armor.json @@ -136,17 +136,17 @@ "id": "xl_armguard_chitin", "copy-from": "armguard_chitin", "type": "ARMOR", - "name": { "str": "pair of XL chitin arm guards", "str_pl": "pairs of XL chitin arm guards" }, + "name": { "str": "pair of chitin arm guards", "str_pl": "pairs of chitin arm guards" }, "proportional": { "weight": 1.25, "volume": 1.23 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_armguard_chitin", "type": "ARMOR", "copy-from": "armguard_chitin", - "name": { "str": "pair of XS chitin arm guards", "str_pl": "pairs of XS chitin arm guards" }, + "name": { "str": "pair of chitin arm guards", "str_pl": "pairs of chitin arm guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armguard_acidchitin", @@ -161,17 +161,17 @@ "id": "xl_armguard_acidchitin", "copy-from": "armguard_acidchitin", "type": "ARMOR", - "name": { "str": "pair of XL biosilicified chitin arm guards", "str_pl": "pairs of XL biosilicified chitin arm guards" }, + "name": { "str": "pair of biosilicified chitin arm guards", "str_pl": "pairs of biosilicified chitin arm guards" }, "proportional": { "weight": 1.25, "volume": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_armguard_acidchitin", "type": "ARMOR", "copy-from": "armguard_acidchitin", - "name": { "str": "pair of XS biosilicified chitin arm guards", "str_pl": "pairs of XS biosilicified chitin arm guards" }, + "name": { "str": "pair of biosilicified chitin arm guards", "str_pl": "pairs of biosilicified chitin arm guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "cloth_arms_padded", @@ -260,19 +260,19 @@ { "id": "xl_armguard_hard", "type": "ARMOR", - "name": { "str": "pair of XL hard arm guards", "str_pl": "pairs of XL hard arm guards" }, + "name": { "str": "pair of hard arm guards", "str_pl": "pairs of hard arm guards" }, "weight": "550 g", "volume": "4 L", "copy-from": "armguard_hard", - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_armguard_hard", "type": "ARMOR", "copy-from": "armguard_hard", - "name": { "str": "pair of XS hard arm guards", "str_pl": "pairs of XS hard arm guards" }, + "name": { "str": "pair of hard arm guards", "str_pl": "pairs of hard arm guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armguard_larmor", @@ -308,18 +308,18 @@ { "id": "xl_armguard_larmor", "type": "ARMOR", - "name": { "str": "pair of XL leather arm guards", "str_pl": "pairs of XL leather arm guards" }, + "name": { "str": "pair of leather arm guards", "str_pl": "pairs of leather arm guards" }, "copy-from": "armguard_larmor", "proportional": { "weight": 1.25, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_armguard_larmor", "type": "ARMOR", "copy-from": "armguard_larmor", - "name": { "str": "pair of XS leather arm guards", "str_pl": "pairs of XS leather arm guards" }, + "name": { "str": "pair of leather arm guards", "str_pl": "pairs of leather arm guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armguard_lightplate", @@ -354,19 +354,19 @@ { "id": "xl_armguard_lightplate", "type": "ARMOR", - "name": { "str": "pair of XL steel arm guards", "str_pl": "pairs of XL steel arm guards" }, + "name": { "str": "pair of steel arm guards", "str_pl": "pairs of steel arm guards" }, "weight": "3243 g", "volume": "7 L", "copy-from": "armguard_lightplate", - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_armguard_lightplate", "type": "ARMOR", "copy-from": "armguard_lightplate", - "name": { "str": "pair of XS steel arm guards", "str_pl": "pairs of XS steel arm guards" }, + "name": { "str": "pair of steel arm guards", "str_pl": "pairs of steel arm guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armguard_metal", @@ -534,18 +534,18 @@ { "id": "xl_armguard_metal", "type": "ARMOR", - "name": { "str": "pair of XL sheet metal arm guards", "str_pl": "pairs of XL sheet metal arm guards" }, + "name": { "str": "pair of sheet metal arm guards", "str_pl": "pairs of sheet metal arm guards" }, "proportional": { "weight": 1.25, "volume": 1.13, "price": 1.25 }, "copy-from": "armguard_metal", - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_armguard_metal", "type": "ARMOR", "copy-from": "armguard_metal", - "name": { "str": "pair of XS sheet metal arm guards", "str_pl": "pairs of XS sheet metal arm guards" }, + "name": { "str": "pair of sheet metal arm guards", "str_pl": "pairs of sheet metal arm guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armguard_paper", @@ -641,19 +641,19 @@ { "id": "xl_armguard_scrap", "type": "ARMOR", - "name": { "str": "pair of XL scrap arm guards", "str_pl": "pairs of XL scrap arm guards" }, + "name": { "str": "pair of scrap arm guards", "str_pl": "pairs of scrap arm guards" }, "weight": "3412 g", "volume": "6 L", "copy-from": "armguard_scrap", - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_armguard_scrap", "type": "ARMOR", "copy-from": "armguard_scrap", - "name": { "str": "pair of XS scrap arm guards", "str_pl": "pairs of XS scrap arm guards" }, + "name": { "str": "pair of scrap arm guards", "str_pl": "pairs of scrap arm guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armguard_tire", @@ -688,18 +688,18 @@ { "id": "xl_armguard_tire", "type": "ARMOR", - "name": { "str": "pair of XL tire arm guards", "str_pl": "pairs of XL tire arm guards" }, + "name": { "str": "pair of tire arm guards", "str_pl": "pairs of tire arm guards" }, "copy-from": "armguard_tire", "proportional": { "weight": 1.25, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_armguard_tire", "type": "ARMOR", "copy-from": "armguard_tire", - "name": { "str": "pair of XS tire arm guards", "str_pl": "pairs of XS tire arm guards" }, + "name": { "str": "pair of tire arm guards", "str_pl": "pairs of tire arm guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armguard_soft", @@ -733,19 +733,19 @@ { "id": "xl_armguard_soft", "type": "ARMOR", - "name": { "str": "pair of XL neoprene arm sleeves", "str_pl": "pairs of XL neoprene arm sleeves" }, + "name": { "str": "pair of neoprene arm sleeves", "str_pl": "pairs of neoprene arm sleeves" }, "weight": "330 g", "volume": "1750 ml", "copy-from": "armguard_soft", - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_armguard_soft", "type": "ARMOR", "copy-from": "armguard_soft", - "name": { "str": "pair of XS neoprene arm sleeves", "str_pl": "pairs of XS neoprene arm sleeves" }, + "name": { "str": "pair of neoprene arm sleeves", "str_pl": "pairs of neoprene arm sleeves" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "gambeson_sleeve", @@ -771,18 +771,18 @@ { "id": "xl_gambeson_sleeve", "type": "ARMOR", - "name": { "str": "pair of XL gambeson sleeves", "str_pl": "pairs of XL gambeson sleeves" }, + "name": { "str": "pair of gambeson sleeves", "str_pl": "pairs of gambeson sleeves" }, "copy-from": "gambeson_sleeve", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_gambeson_sleeve", "type": "ARMOR", - "name": { "str": "pair of XS gambeson sleeves", "str_pl": "pairs of XS gambeson sleeves" }, + "name": { "str": "pair of gambeson sleeves", "str_pl": "pairs of gambeson sleeves" }, "copy-from": "gambeson_sleeve", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "k_gambeson_sleeve", @@ -830,18 +830,18 @@ { "id": "xl_k_gambeson_sleeve", "type": "ARMOR", - "name": { "str": "pair of XL Kevlar gambeson sleeves", "str_pl": "pairs of XL Kevlar gambeson sleeves" }, + "name": { "str": "pair of Kevlar gambeson sleeves", "str_pl": "pairs of Kevlar gambeson sleeves" }, "copy-from": "k_gambeson_sleeve", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_k_gambeson_sleeve", "type": "ARMOR", - "name": { "str": "pair of XS Kevlar gambeson sleeves", "str_pl": "pairs of XS Kevlar gambeson sleeves" }, + "name": { "str": "pair of Kevlar gambeson sleeves", "str_pl": "pairs of Kevlar gambeson sleeves" }, "copy-from": "k_gambeson_sleeve", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "abstract": "base_chainmail_arms", @@ -897,7 +897,7 @@ "abstract": "xl_chainmail_arms", "type": "ARMOR", "copy-from": "base_chainmail_arms", - "name": { "str": "pair of XL chainmail sleeves", "str_pl": "pairs of XL chainmail sleeves" }, + "name": { "str": "pair of chainmail sleeves", "str_pl": "pairs of chainmail sleeves" }, "proportional": { "weight": 1.25, "volume": 1.13, "price": 1.25 }, "pocket_data": [ { @@ -923,13 +923,13 @@ "flag_restriction": [ "ABLATIVE_CHAINMAIL_ELBOWS" ] } ], - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "abstract": "xs_chainmail_arms", "type": "ARMOR", "copy-from": "base_chainmail_arms", - "name": { "str": "pair of XS chainmail sleeves", "str_pl": "pairs of XS chainmail sleeves" }, + "name": { "str": "pair of chainmail sleeves", "str_pl": "pairs of chainmail sleeves" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, "pocket_data": [ { @@ -955,7 +955,7 @@ "flag_restriction": [ "ABLATIVE_CHAINMAIL_ELBOWS" ] } ], - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "chainmail_junk_arms", @@ -992,14 +992,14 @@ "copy-from": "xl_chainmail_arms", "replace_materials": { "steel": "lc_steel_chain" }, "type": "ARMOR", - "name": { "str": "pair of XL mild steel chainmail sleeves", "str_pl": "pairs of XL mild steel chainmail sleeves" } + "name": { "str": "pair of mild steel chainmail sleeves", "str_pl": "pairs of mild steel chainmail sleeves" } }, { "id": "xs_lc_chainmail_arms", "copy-from": "xs_chainmail_arms", "replace_materials": { "steel": "lc_steel_chain" }, "type": "ARMOR", - "name": { "str": "pair of XS mild steel chainmail sleeves", "str_pl": "pairs of XS mild steel chainmail sleeves" } + "name": { "str": "pair of mild steel chainmail sleeves", "str_pl": "pairs of mild steel chainmail sleeves" } }, { "id": "mc_chainmail_arms", @@ -1021,14 +1021,14 @@ "type": "ARMOR", "copy-from": "xl_chainmail_arms", "replace_materials": { "steel": "mc_steel_chain" }, - "name": { "str": "pair of XL medium steel chainmail sleeves", "str_pl": "pairs of XL medium steel chainmail sleeves" } + "name": { "str": "pair of medium steel chainmail sleeves", "str_pl": "pairs of medium steel chainmail sleeves" } }, { "id": "xs_mc_chainmail_arms", "type": "ARMOR", "copy-from": "xs_chainmail_arms", "replace_materials": { "steel": "mc_steel_chain" }, - "name": { "str": "pair of XS medium steel chainmail sleeves", "str_pl": "pairs of XS medium steel chainmail sleeves" } + "name": { "str": "pair of medium steel chainmail sleeves", "str_pl": "pairs of medium steel chainmail sleeves" } }, { "id": "hc_chainmail_arms", @@ -1042,14 +1042,14 @@ "type": "ARMOR", "copy-from": "xl_chainmail_arms", "replace_materials": { "steel": "hc_steel_chain" }, - "name": { "str": "pair of XL high steel chainmail sleeves", "str_pl": "pairs of XL high steel chainmail sleeves" } + "name": { "str": "pair of high steel chainmail sleeves", "str_pl": "pairs of high steel chainmail sleeves" } }, { "id": "xs_hc_chainmail_arms", "type": "ARMOR", "copy-from": "xs_chainmail_arms", "replace_materials": { "steel": "hc_steel_chain" }, - "name": { "str": "pair of XS high steel chainmail sleeves", "str_pl": "pairs of XS high steel chainmail sleeves" } + "name": { "str": "pair of high steel chainmail sleeves", "str_pl": "pairs of high steel chainmail sleeves" } }, { "id": "ch_chainmail_arms", @@ -1063,14 +1063,14 @@ "type": "ARMOR", "copy-from": "xl_chainmail_arms", "replace_materials": { "steel": "ch_steel_chain" }, - "name": { "str": "pair of XL hardened steel chainmail sleeves", "str_pl": "pairs of XL hardened steel chainmail sleeves" } + "name": { "str": "pair of hardened steel chainmail sleeves", "str_pl": "pairs of hardened steel chainmail sleeves" } }, { "id": "xs_ch_chainmail_arms", "type": "ARMOR", "copy-from": "xs_chainmail_arms", "replace_materials": { "steel": "ch_steel_chain" }, - "name": { "str": "pair of XS hardened steel chainmail sleeves", "str_pl": "pairs of XS hardened steel chainmail sleeves" } + "name": { "str": "pair of hardened steel chainmail sleeves", "str_pl": "pairs of hardened steel chainmail sleeves" } }, { "id": "qt_chainmail_arms", @@ -1084,14 +1084,14 @@ "type": "ARMOR", "copy-from": "xl_chainmail_arms", "replace_materials": { "steel": "qt_steel_chain" }, - "name": { "str": "pair of XL tempered steel chainmail sleeves", "str_pl": "pairs of XL tempered steel chainmail sleeves" } + "name": { "str": "pair of tempered steel chainmail sleeves", "str_pl": "pairs of tempered steel chainmail sleeves" } }, { "id": "xs_qt_chainmail_arms", "type": "ARMOR", "copy-from": "xs_chainmail_arms", "replace_materials": { "steel": "qt_steel_chain" }, - "name": { "str": "pair of XS tempered steel chainmail sleeves", "str_pl": "pairs of XS tempered steel chainmail sleeves" } + "name": { "str": "pair of tempered steel chainmail sleeves", "str_pl": "pairs of tempered steel chainmail sleeves" } }, { "id": "elbow_pads", @@ -1156,17 +1156,17 @@ "id": "xl_armguard_bronze", "type": "ARMOR", "copy-from": "armguard_bronze", - "name": { "str": "pair of XL bronze vambraces", "str_pl": "pairs of XL bronze vambraces" }, + "name": { "str": "pair of bronze vambraces", "str_pl": "pairs of bronze vambraces" }, "proportional": { "weight": 1.25, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_armguard_bronze", "type": "ARMOR", "copy-from": "armguard_bronze", - "name": { "str": "pair of XS bronze vambraces", "str_pl": "pairs of XS bronze vambraces" }, + "name": { "str": "pair of bronze vambraces", "str_pl": "pairs of bronze vambraces" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "vambrace_larmor", @@ -1202,20 +1202,20 @@ { "id": "xl_vambrace_larmor", "type": "ARMOR", - "name": { "str": "pair of XL leather vambraces", "str_pl": "pairs of XL leather vambraces" }, + "name": { "str": "pair of leather vambraces", "str_pl": "pairs of leather vambraces" }, "weight": "531 g", "volume": "1250 ml", "copy-from": "vambrace_larmor", - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_vambrace_larmor", "type": "ARMOR", "copy-from": "vambrace_larmor", "looks_like": "vambrace_larmor", - "name": { "str": "pair of XS leather vambraces", "str_pl": "pairs of XS leather vambraces" }, + "name": { "str": "pair of leather vambraces", "str_pl": "pairs of leather vambraces" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armguard_cut_resistant", @@ -1265,10 +1265,10 @@ { "id": "xl_armor_lc_lightarmguard", "type": "ARMOR", - "name": { "str": "XL mild steel light arm guard" }, + "name": { "str": "mild steel light arm guard" }, "copy-from": "armor_lc_lightarmguard", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_mc_lightarmguard", @@ -1294,10 +1294,10 @@ { "id": "xl_armor_mc_lightarmguard", "type": "ARMOR", - "name": { "str": "XL medium steel light arm guard" }, + "name": { "str": "medium steel light arm guard" }, "copy-from": "armor_mc_lightarmguard", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_hc_lightarmguard", @@ -1323,10 +1323,10 @@ { "id": "xl_armor_hc_lightarmguard", "type": "ARMOR", - "name": { "str": "XL high steel light arm guard" }, + "name": { "str": "high steel light arm guard" }, "copy-from": "armor_hc_lightarmguard", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_ch_lightarmguard", @@ -1352,10 +1352,10 @@ { "id": "xl_armor_ch_lightarmguard", "type": "ARMOR", - "name": { "str": "XL hardened light arm guard" }, + "name": { "str": "hardened steel light arm guard" }, "copy-from": "armor_ch_lightarmguard", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_qt_lightarmguard", @@ -1381,10 +1381,10 @@ { "id": "xl_armor_qt_lightarmguard", "type": "ARMOR", - "name": { "str": "XL tempered light arm guard" }, + "name": { "str": "tempered steel light arm guard" }, "copy-from": "armor_qt_lightarmguard", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_lc_armguard", @@ -1424,10 +1424,10 @@ { "id": "xl_armor_lc_armguard", "type": "ARMOR", - "name": { "str": "XL mild steel arm guard" }, + "name": { "str": "mild steel arm guard" }, "copy-from": "armor_lc_armguard", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_mc_armguard", @@ -1453,10 +1453,10 @@ { "id": "xl_armor_mc_armguard", "type": "ARMOR", - "name": { "str": "XL medium steel arm guard" }, + "name": { "str": "medium steel arm guard" }, "copy-from": "armor_mc_armguard", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_hc_armguard", @@ -1482,10 +1482,10 @@ { "id": "xl_armor_hc_armguard", "type": "ARMOR", - "name": { "str": "XL high steel arm guard" }, + "name": { "str": "high steel arm guard" }, "copy-from": "armor_hc_armguard", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_ch_armguard", @@ -1511,16 +1511,16 @@ { "id": "xl_armor_ch_armguard", "type": "ARMOR", - "name": { "str": "XL hardened arm guard" }, + "name": { "str": "hardened steel arm guard" }, "copy-from": "armor_ch_armguard", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_qt_armguard", "type": "ARMOR", "copy-from": "armor_lc_armguard", - "name": { "str": "tempered arm guard" }, + "name": { "str": "tempered steel arm guard" }, "material": [ "qt_steel", "qt_steel_chain" ], "description": "An armguard, 1.75 mm at the thickest. The medium steel has been quenched and tempered, offering top of the line protection.", "armor": [ @@ -1540,10 +1540,10 @@ { "id": "xl_armor_qt_armguard", "type": "ARMOR", - "name": { "str": "XL tempered arm guard" }, + "name": { "str": "tempered steel arm guard" }, "copy-from": "armor_qt_armguard", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_lc_heavyarmguard", @@ -1582,10 +1582,10 @@ { "id": "xl_armor_lc_heavyarmguard", "type": "ARMOR", - "name": { "str": "XL mild steel heavy arm guard" }, + "name": { "str": "mild steel heavy arm guard" }, "copy-from": "armor_lc_heavyarmguard", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_mc_heavyarmguard", @@ -1610,10 +1610,10 @@ { "id": "xl_armor_mc_heavyarmguard", "type": "ARMOR", - "name": { "str": "XL medium steel heavy arm guard" }, + "name": { "str": "medium steel heavy arm guard" }, "copy-from": "armor_mc_heavyarmguard", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_hc_heavyarmguard", @@ -1638,10 +1638,10 @@ { "id": "xl_armor_hc_heavyarmguard", "type": "ARMOR", - "name": { "str": "XL high steel heavy arm guard" }, + "name": { "str": "high steel heavy arm guard" }, "copy-from": "armor_hc_heavyarmguard", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_ch_heavyarmguard", @@ -1666,10 +1666,10 @@ { "id": "xl_armor_ch_heavyarmguard", "type": "ARMOR", - "name": { "str": "XL hardened steel heavy arm guard" }, + "name": { "str": "hardened steel heavy arm guard" }, "copy-from": "armor_ch_heavyarmguard", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_qt_heavyarmguard", @@ -1694,10 +1694,10 @@ { "id": "xl_armor_qt_heavyarmguard", "type": "ARMOR", - "name": { "str": "XL tempered heavy arm guard" }, + "name": { "str": "tempered steel heavy arm guard" }, "copy-from": "armor_qt_heavyarmguard", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "survivor_adhoc_leather_sleeves", diff --git a/data/json/items/armor/ballistic_armor.json b/data/json/items/armor/ballistic_armor.json index 3e07498fda8af..8d1cfda4b5567 100644 --- a/data/json/items/armor/ballistic_armor.json +++ b/data/json/items/armor/ballistic_armor.json @@ -1349,7 +1349,7 @@ "id": "xl_ballistic_vest", "type": "ARMOR", "category": "armor", - "name": { "str": "XL ballistic vest" }, + "name": { "str": "ballistic vest" }, "description": "An enormous handmade ballistic vest built with of lots of salvaged ballistic Kevlar panels. It's bulkier than a factory made US Army vest, but it is customized for the benefit of an abnormally large mutant who couldn't wear such armors otherwise. Coated in MOLLE webbing to support modular loadouts for the tacticool mutant. It could be outfitted with steel plates for further protection.", "weight": "4500 g", "volume": "9 L", @@ -1359,7 +1359,7 @@ "material": [ "nylon", "kevlar_layered" ], "color": "light_gray", "warmth": 15, - "flags": [ "STURDY", "OUTER", "WATER_FRIENDLY", "OVERSIZE" ], + "flags": [ "STURDY", "OUTER", "WATER_FRIENDLY", "OVERSIZE", "PREFIX_XL" ], "use_action": [ { "type": "attach_molle", "size": 12 }, { "type": "detach_molle" } ], "armor": [ { @@ -1380,7 +1380,7 @@ "id": "xl_ballistic_vest_lc", "type": "ARMOR", "category": "armor", - "name": { "str": "XL ballistic vest (mild steel plates)", "str_pl": "XL ballistic vests (mild steel plates)" }, + "name": { "str": "ballistic vest (mild steel plates)", "str_pl": "ballistic vests (mild steel plates)" }, "description": "An enormous handmade ballistic vest built with lots of salvaged ballistic Kevlar panels and homemade \"ballistic inserts\" made of mild steel. The thin metal isn't the most protective, but it's probably better than just plain Kevlar.", "weight": "12500 g", "volume": "9 L", @@ -1389,7 +1389,7 @@ "material": [ "nylon", "kevlar_layered", "lc_steel" ], "color": "light_gray", "warmth": 20, - "flags": [ "STURDY", "OUTER", "WATER_FRIENDLY", "OVERSIZE" ], + "flags": [ "STURDY", "OUTER", "WATER_FRIENDLY", "OVERSIZE", "PREFIX_XL" ], "use_action": [ { "type": "attach_molle", "size": 12 }, { "type": "detach_molle" } ], "armor": [ { @@ -1411,7 +1411,7 @@ "id": "xl_ballistic_vest_qt", "type": "ARMOR", "category": "armor", - "name": { "str": "XL ballistic vest (tempered steel plates)", "str_pl": "XL ballistic vests (tempered steel plates)" }, + "name": { "str": "ballistic vest (tempered steel plates)", "str_pl": "ballistic vests (tempered steel plates)" }, "description": "An enormous handmade ballistic vest made of lots of salvaged ballistic Kevlar panels and ten NIJ IIIA plates inserted into custom-made pockets - four each for your front and back and one each for your sides. Monstrously heavy but extremely protective.", "weight": "18000 g", "volume": "9 L", @@ -1421,7 +1421,7 @@ "material": [ "nylon", "kevlar_layered", "qt_steel" ], "color": "light_gray", "warmth": 20, - "flags": [ "STURDY", "OUTER", "WATER_FRIENDLY", "OVERSIZE" ], + "flags": [ "STURDY", "OUTER", "WATER_FRIENDLY", "OVERSIZE", "PREFIX_XL" ], "use_action": [ { "type": "attach_molle", "size": 12 }, { "type": "detach_molle" } ], "armor": [ { diff --git a/data/json/items/armor/bespoke_armor/custom_bodysuits.json b/data/json/items/armor/bespoke_armor/custom_bodysuits.json index 323cf1886bf8a..ce7060395a629 100644 --- a/data/json/items/armor/bespoke_armor/custom_bodysuits.json +++ b/data/json/items/armor/bespoke_armor/custom_bodysuits.json @@ -191,18 +191,18 @@ { "id": "xl_lsurvivor_jumpsuit", "type": "ARMOR", - "name": { "str": "XL light Kevlar jumpsuit" }, + "name": { "str": "light Kevlar jumpsuit" }, "copy-from": "lsurvivor_jumpsuit", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_lsurvivor_jumpsuit", "type": "ARMOR", - "name": { "str": "XS light Kevlar jumpsuit" }, + "name": { "str": "light Kevlar jumpsuit" }, "copy-from": "lsurvivor_jumpsuit", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "survivor_jumpsuit", @@ -260,18 +260,18 @@ { "id": "xlsurvivor_jumpsuit", "type": "ARMOR", - "name": { "str": "XL Kevlar jumpsuit" }, + "name": { "str": "Kevlar jumpsuit" }, "copy-from": "survivor_jumpsuit", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xssurvivor_jumpsuit", "type": "ARMOR", - "name": { "str": "XS Kevlar jumpsuit" }, + "name": { "str": "Kevlar jumpsuit" }, "copy-from": "survivor_jumpsuit", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.75 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "hsurvivor_jumpsuit", @@ -314,18 +314,18 @@ { "id": "xl_hsurvivor_jumpsuit", "type": "ARMOR", - "name": { "str": "XL steel-plated Kevlar jumpsuit" }, + "name": { "str": "steel-plated Kevlar jumpsuit" }, "copy-from": "hsurvivor_jumpsuit", "proportional": { "weight": 1.13, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_hsurvivor_jumpsuit", "type": "ARMOR", - "name": { "str": "XS steel-plated Kevlar jumpsuit" }, + "name": { "str": "steel-plated Kevlar jumpsuit" }, "copy-from": "hsurvivor_jumpsuit", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.75 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "wsurvivor_jumpsuit", @@ -367,18 +367,18 @@ { "id": "xl_wsurvivor_jumpsuit", "type": "ARMOR", - "name": { "str": "XL fur Kevlar jumpsuit" }, + "name": { "str": "fur Kevlar jumpsuit" }, "copy-from": "wsurvivor_jumpsuit", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_wsurvivor_jumpsuit", "type": "ARMOR", - "name": { "str": "XS fur Kevlar jumpsuit" }, + "name": { "str": "fur Kevlar jumpsuit" }, "copy-from": "wsurvivor_jumpsuit", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "wsurvivor_jumpsuit_nofur", @@ -405,18 +405,18 @@ { "id": "xs_wsurvivor_jumpsuit_nofur", "type": "ARMOR", - "name": { "str": "XS faux fur Kevlar jumpsuit" }, + "name": { "str": "faux fur Kevlar jumpsuit" }, "copy-from": "wsurvivor_jumpsuit_nofur", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "xl_wsurvivor_jumpsuit_nofur", "type": "ARMOR", - "name": { "str": "XL faux fur Kevlar jumpsuit" }, + "name": { "str": "faux fur Kevlar jumpsuit" }, "copy-from": "wsurvivor_jumpsuit_nofur", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "h20survivor_jumpsuit", @@ -491,18 +491,18 @@ { "id": "xs_h20survivor_jumpsuit", "type": "ARMOR", - "name": { "str": "XS Kevlar wetsuit" }, + "name": { "str": "Kevlar wetsuit" }, "copy-from": "h20survivor_jumpsuit", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "xl_h20survivor_jumpsuit", "type": "ARMOR", - "name": { "str": "XL Kevlar wetsuit" }, + "name": { "str": "Kevlar wetsuit" }, "copy-from": "h20survivor_jumpsuit", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "h20survivor_jumpsuit_light", @@ -577,18 +577,18 @@ { "id": "xs_h20survivor_jumpsuit_light", "type": "ARMOR", - "name": { "str": "XS light Kevlar wetsuit oversuit" }, + "name": { "str": "light Kevlar wetsuit oversuit" }, "copy-from": "h20survivor_jumpsuit_light", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "xl_h20survivor_jumpsuit_light", "type": "ARMOR", - "name": { "str": "XL light Kevlar wetsuit oversuit" }, + "name": { "str": "light Kevlar wetsuit oversuit" }, "copy-from": "h20survivor_jumpsuit_light", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "thick_h20survivor_jumpsuit", @@ -663,18 +663,18 @@ { "id": "xs_thick_h20survivor_jumpsuit", "type": "ARMOR", - "name": { "str": "XS thick Kevlar wetsuit" }, + "name": { "str": "thick Kevlar wetsuit" }, "copy-from": "thick_h20survivor_jumpsuit", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "xl_thick_h20survivor_jumpsuit", "type": "ARMOR", - "name": { "str": "XL thick Kevlar wetsuit" }, + "name": { "str": "thick Kevlar wetsuit" }, "copy-from": "thick_h20survivor_jumpsuit", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "fsurvivor_jumpsuit", @@ -715,17 +715,17 @@ { "id": "xs_fsurvivor_jumpsuit", "type": "ARMOR", - "name": { "str": "XS Kevlar firesuit" }, + "name": { "str": "Kevlar firesuit" }, "copy-from": "fsurvivor_jumpsuit", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "xl_fsurvivor_jumpsuit", "type": "ARMOR", - "name": { "str": "XL Kevlar firesuit" }, + "name": { "str": "Kevlar firesuit" }, "copy-from": "fsurvivor_jumpsuit", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } } ] diff --git a/data/json/items/armor/bespoke_armor/custom_boots.json b/data/json/items/armor/bespoke_armor/custom_boots.json index 6db35a20f137f..9b6d2fdad02c0 100644 --- a/data/json/items/armor/bespoke_armor/custom_boots.json +++ b/data/json/items/armor/bespoke_armor/custom_boots.json @@ -57,18 +57,18 @@ { "id": "xl_boots_lsurvivor", "type": "ARMOR", - "name": { "str": "pair of XL light survivor boots", "str_pl": "pairs of XL light survivor boots" }, + "name": { "str": "pair of light survivor boots", "str_pl": "pairs of light survivor boots" }, "copy-from": "boots_lsurvivor", "proportional": { "weight": 1.4, "volume": 1.4 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_boots_lsurvivor", "type": "ARMOR", "copy-from": "boots_lsurvivor", - "name": { "str": "pair of XS light survivor boots", "str_pl": "pairs of XS light survivor boots" }, + "name": { "str": "pair of light survivor boots", "str_pl": "pairs of light survivor boots" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "boots_survivor", @@ -130,16 +130,16 @@ "type": "ARMOR", "copy-from": "boots_survivor", "proportional": { "weight": 1.4, "volume": 1.4 }, - "name": { "str": "pair of XL survivor boots", "str_pl": "pairs of XL survivor boots" }, - "extend": { "flags": [ "OVERSIZE" ] } + "name": { "str": "pair of survivor boots", "str_pl": "pairs of survivor boots" }, + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "boots_xssurvivor", "type": "ARMOR", "copy-from": "boots_survivor", - "name": { "str": "pair of XS survivor boots", "str_pl": "pairs of XS survivor boots" }, + "name": { "str": "pair of survivor boots", "str_pl": "pairs of survivor boots" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "boots_wsurvivor_nofur", @@ -194,17 +194,17 @@ "id": "xl_boots_wsurvivor_nofur", "type": "ARMOR", "copy-from": "boots_wsurvivor_nofur", - "name": { "str": "pair of XL faux fur winter survivor boots", "str_pl": "pairs of XL faux fur winter survivor boots" }, + "name": { "str": "pair of faux fur winter survivor boots", "str_pl": "pairs of faux fur winter survivor boots" }, "proportional": { "weight": 1.3, "volume": 1.3 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_boots_wsurvivor_nofur", "type": "ARMOR", "copy-from": "boots_wsurvivor_nofur", - "name": { "str": "pair of XS faux fur winter survivor boots", "str_pl": "pairs of XS faux fur winter survivor boots" }, + "name": { "str": "pair of faux fur winter survivor boots", "str_pl": "pairs of faux fur winter survivor boots" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "boots_wsurvivor", @@ -267,18 +267,18 @@ { "id": "xl_boots_wsurvivor", "type": "ARMOR", - "name": { "str": "pair of XL winter survivor boots", "str_pl": "pairs of XL winter survivor boots" }, + "name": { "str": "pair of winter survivor boots", "str_pl": "pairs of winter survivor boots" }, "copy-from": "boots_wsurvivor", "proportional": { "weight": 1.3, "volume": 1.3 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_boots_wsurvivor", "type": "ARMOR", "copy-from": "boots_wsurvivor", - "name": { "str": "pair of XS winter survivor boots", "str_pl": "pairs of XS winter survivor boots" }, + "name": { "str": "pair of winter survivor boots", "str_pl": "pairs of winter survivor boots" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "boots_h20survivor", @@ -348,17 +348,17 @@ "id": "xl_boots_h20survivor", "type": "ARMOR", "copy-from": "boots_h20survivor", - "name": { "str": "pair of XL Kevlar diving boots", "str_pl": "pairs of XL Kevlar diving boots" }, + "name": { "str": "pair of Kevlar diving boots", "str_pl": "pairs of Kevlar diving boots" }, "proportional": { "weight": 1.3, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_boots_h20survivor", "type": "ARMOR", "copy-from": "boots_h20survivor", - "name": { "str": "pair of XS Kevlar diving boots", "str_pl": "pairs of XS Kevlar diving boots" }, + "name": { "str": "pair of Kevlar diving boots", "str_pl": "pairs of Kevlar diving boots" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "boots_h20survivor_light", @@ -429,17 +429,17 @@ "id": "xl_boots_h20survivor_light", "type": "ARMOR", "copy-from": "boots_h20survivor_light", - "name": { "str": "pair of XL Kevlar diving overboots", "str_pl": "pairs of XL light Kevlar diving overboots" }, + "name": { "str": "pair of light Kevlar diving overboots", "str_pl": "pairs of light Kevlar diving overboots" }, "proportional": { "weight": 1.3, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_boots_h20survivor_light", "type": "ARMOR", "copy-from": "boots_h20survivor_light", - "name": { "str": "pair of XS light Kevlar diving overboots", "str_pl": "pairs of XS light Kevlar diving overboots" }, + "name": { "str": "pair of light Kevlar diving overboots", "str_pl": "pairs of light Kevlar diving overboots" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "boots_h20survivor_thick", @@ -509,17 +509,17 @@ "id": "xl_boots_h20survivor_thick", "type": "ARMOR", "copy-from": "boots_h20survivor_thick", - "name": { "str": "pair of XL thick Kevlar diving boots", "str_pl": "pairs of XL thick Kevlar diving boots" }, + "name": { "str": "pair of thick Kevlar diving boots", "str_pl": "pairs of thick Kevlar diving boots" }, "proportional": { "weight": 1.3, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_boots_h20survivor_thick", "type": "ARMOR", "copy-from": "boots_h20survivor_thick", - "name": { "str": "pair of XS thick Kevlar diving boots", "str_pl": "pairs of XS thick Kevlar diving boots" }, + "name": { "str": "pair of thick Kevlar diving boots", "str_pl": "pairs of thick Kevlar diving boots" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "swim_fins_custom", diff --git a/data/json/items/armor/bespoke_armor/custom_gloves.json b/data/json/items/armor/bespoke_armor/custom_gloves.json index 38e5df48118fd..24c2b63b9e580 100644 --- a/data/json/items/armor/bespoke_armor/custom_gloves.json +++ b/data/json/items/armor/bespoke_armor/custom_gloves.json @@ -23,18 +23,18 @@ { "id": "xl_gloves_lsurvivor", "type": "ARMOR", - "name": { "str": "pair of XL light survivor gloves", "str_pl": "pairs of XL light survivor gloves" }, + "name": { "str": "pair of light survivor gloves", "str_pl": "pairs of light survivor gloves" }, "copy-from": "gloves_lsurvivor", "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_gloves_lsurvivor", "type": "ARMOR", "copy-from": "gloves_lsurvivor", - "name": { "str": "pair of XS light survivor gloves", "str_pl": "pairs of XS light survivor gloves" }, + "name": { "str": "pair of light survivor gloves", "str_pl": "pairs of light survivor gloves" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "gloves_lsurvivor_fingerless", @@ -73,18 +73,18 @@ { "id": "xl_gloves_lsurvivor_fingerless", "type": "ARMOR", - "name": { "str": "pair of XL fingerless light survivor gloves", "str_pl": "pairs of XL fingerless light survivor gloves" }, + "name": { "str": "pair of fingerless light survivor gloves", "str_pl": "pairs of fingerless light survivor gloves" }, "copy-from": "gloves_lsurvivor_fingerless", "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_gloves_lsurvivor_fingerless", "type": "ARMOR", "copy-from": "gloves_lsurvivor_fingerless", - "name": { "str": "pair of XS fingerless light survivor gloves", "str_pl": "pairs of XS fingerless light survivor gloves" }, + "name": { "str": "pair of fingerless light survivor gloves", "str_pl": "pairs of fingerless light survivor gloves" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "gloves_survivor_fingerless", @@ -123,18 +123,18 @@ { "id": "xl_gloves_survivor_fingerless", "type": "ARMOR", - "name": { "str": "pair of XL fingerless survivor gloves", "str_pl": "pairs of XL fingerless survivor gloves" }, + "name": { "str": "pair of fingerless survivor gloves", "str_pl": "pairs of fingerless survivor gloves" }, "copy-from": "gloves_survivor_fingerless", "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_gloves_survivor_fingerless", "type": "ARMOR", "copy-from": "gloves_survivor_fingerless", - "name": { "str": "pair of XS fingerless survivor gloves", "str_pl": "pairs of XS fingerless survivor gloves" }, + "name": { "str": "pair of fingerless survivor gloves", "str_pl": "pairs of fingerless survivor gloves" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "gloves_survivor", @@ -161,17 +161,17 @@ "id": "xl_gloves_survivor", "type": "ARMOR", "copy-from": "gloves_survivor", - "name": { "str": "pair of XL survivor gloves", "str_pl": "pairs of XL survivor gloves" }, + "name": { "str": "pair of survivor gloves", "str_pl": "pairs of survivor gloves" }, "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_gloves_survivor", "type": "ARMOR", "copy-from": "gloves_survivor", - "name": { "str": "pair of XS survivor gloves", "str_pl": "pairs of XS survivor gloves" }, + "name": { "str": "pair of survivor gloves", "str_pl": "pairs of survivor gloves" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "gloves_wsurvivor", @@ -197,18 +197,18 @@ { "id": "xl_gloves_wsurvivor", "type": "ARMOR", - "name": { "str": "pair of XL winter survivor gloves", "str_pl": "pairs of XL winter survivor gloves" }, + "name": { "str": "pair of winter survivor gloves", "str_pl": "pairs of winter survivor gloves" }, "copy-from": "gloves_wsurvivor", "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_gloves_wsurvivor", "type": "ARMOR", "copy-from": "gloves_wsurvivor", - "name": { "str": "pair of XS winter survivor gloves", "str_pl": "pairs of XS winter survivor gloves" }, + "name": { "str": "pair of winter survivor gloves", "str_pl": "pairs of winter survivor gloves" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "gloves_wsurvivor_nofur", @@ -225,18 +225,18 @@ { "id": "xl_gloves_wsurvivor_nofur", "type": "ARMOR", - "name": { "str": "pair of XL faux fur winter survivor gloves", "str_pl": "pairs of XL faux fur winter survivor gloves" }, + "name": { "str": "pair of faux fur winter survivor gloves", "str_pl": "pairs of faux fur winter survivor gloves" }, "copy-from": "gloves_wsurvivor_nofur", "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_gloves_wsurvivor_nofur", "type": "ARMOR", "copy-from": "gloves_wsurvivor_nofur", - "name": { "str": "pair of XS faux fur winter survivor gloves", "str_pl": "pairs of XS faux fur winter survivor gloves" }, + "name": { "str": "pair of faux fur winter survivor gloves", "str_pl": "pairs of faux fur winter survivor gloves" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "gloves_h20survivor", @@ -273,17 +273,17 @@ "id": "xl_gloves_h20survivor", "type": "ARMOR", "copy-from": "gloves_h20survivor", - "name": { "str": "pair of XL Kevlar wetsuit gloves", "str_pl": "pairs of XL Kevlar wetsuit gloves" }, + "name": { "str": "pair of Kevlar wetsuit gloves", "str_pl": "pairs of Kevlar wetsuit gloves" }, "proportional": { "weight": 1.3, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_gloves_h20survivor", "type": "ARMOR", "copy-from": "gloves_h20survivor", - "name": { "str": "pair of XS Kevlar wetsuit gloves", "str_pl": "pairs of XS Kevlar wetsuit gloves" }, + "name": { "str": "pair of Kevlar wetsuit gloves", "str_pl": "pairs of Kevlar wetsuit gloves" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "gloves_h20survivor_light", @@ -321,17 +321,17 @@ "id": "xl_gloves_h20survivor_light", "type": "ARMOR", "copy-from": "gloves_h20survivor_light", - "name": { "str": "pair of XL light Kevlar wetsuit overgloves", "str_pl": "pairs of XL light Kevlar wetsuit overgloves" }, + "name": { "str": "pair of light Kevlar wetsuit overgloves", "str_pl": "pairs of light Kevlar wetsuit overgloves" }, "proportional": { "weight": 1.3, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_gloves_h20survivor_light", "type": "ARMOR", "copy-from": "gloves_h20survivor_light", - "name": { "str": "pair of XS light Kevlar wetsuit overgloves", "str_pl": "pairs of XS light Kevlar wetsuit overgloves" }, + "name": { "str": "pair of light Kevlar wetsuit overgloves", "str_pl": "pairs of light Kevlar wetsuit overgloves" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "gloves_h20survivor_thick", @@ -368,16 +368,16 @@ "id": "xl_gloves_h20survivor_thick", "type": "ARMOR", "copy-from": "gloves_h20survivor_thick", - "name": { "str": "pair of XL Kevlar wetsuit gloves", "str_pl": "pairs of XL Kevlar wetsuit gloves" }, + "name": { "str": "pair of Kevlar wetsuit gloves", "str_pl": "pairs of Kevlar wetsuit gloves" }, "proportional": { "weight": 1.3, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_gloves_h20survivor_thick", "type": "ARMOR", "copy-from": "gloves_h20survivor_thick", - "name": { "str": "pair of XS Kevlar wetsuit gloves", "str_pl": "pairs of XS Kevlar wetsuit gloves" }, + "name": { "str": "pair of Kevlar wetsuit gloves", "str_pl": "pairs of Kevlar wetsuit gloves" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } } ] diff --git a/data/json/items/armor/bespoke_armor/custom_headgear.json b/data/json/items/armor/bespoke_armor/custom_headgear.json index a164d5427532a..53af28755df03 100644 --- a/data/json/items/armor/bespoke_armor/custom_headgear.json +++ b/data/json/items/armor/bespoke_armor/custom_headgear.json @@ -52,17 +52,17 @@ "id": "xl_helmet_nomad", "type": "ARMOR", "copy-from": "helmet_nomad", - "name": { "str": "XL nomad cowl" }, + "name": { "str": "nomad cowl" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_helmet_nomad", "type": "ARMOR", "copy-from": "helmet_nomad", - "name": { "str": "XS nomad cowl" }, + "name": { "str": "nomad cowl" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "hood_survivor", @@ -113,33 +113,33 @@ "id": "xl_hood_wsurvivor", "type": "ARMOR", "copy-from": "hood_wsurvivor", - "name": { "str": "XL winter survivor hood" }, + "name": { "str": "winter survivor hood" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_hood_wsurvivor", "type": "ARMOR", "copy-from": "hood_wsurvivor", - "name": { "str": "XS winter survivor hood" }, + "name": { "str": "winter survivor hood" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "hood_xlsurvivor", "type": "ARMOR", "copy-from": "hood_survivor", - "name": { "str": "XL survivor hood" }, + "name": { "str": "survivor hood" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "hood_xssurvivor", "type": "ARMOR", "copy-from": "hood_survivor", - "name": { "str": "XS survivor hood" }, + "name": { "str": "survivor hood" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "hood_lsurvivor", @@ -167,17 +167,17 @@ "id": "xl_hood_lsurvivor", "type": "ARMOR", "copy-from": "hood_lsurvivor", - "name": { "str": "XL light survivor hood" }, + "name": { "str": "light survivor hood" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_hood_lsurvivor", "type": "ARMOR", "copy-from": "hood_lsurvivor", - "name": { "str": "XS light survivor hood" }, + "name": { "str": "light survivor hood" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "hood_wsurvivor_nofur", @@ -198,17 +198,17 @@ "material": [ "kevlar_layered", "faux_fur" ], "color": "pink", "warmth": 65, - "name": { "str": "XL faux fur winter survivor hood" }, + "name": { "str": "winter faux fur survivor hood" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_hood_wsurvivor_nofur", "type": "ARMOR", "copy-from": "hood_wsurvivor_nofur", - "name": { "str": "XS faux fur winter survivor hood" }, + "name": { "str": "winter faux fur survivor hood" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "flags": [ "UNDERSIZE" ] + "flags": [ "UNDERSIZE", "PREFIX_XS" ] }, { "id": "hood_h20survivor", @@ -276,17 +276,17 @@ "id": "xl_hood_h20survivor", "type": "ARMOR", "copy-from": "hood_h20survivor", - "name": { "str": "XL Kevlar wetsuit hood" }, + "name": { "str": "Kevlar wetsuit hood" }, "proportional": { "weight": 1.3, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_hood_h20survivor", "type": "ARMOR", "copy-from": "hood_h20survivor", - "name": { "str": "XS Kevlar wetsuit hood" }, + "name": { "str": "Kevlar wetsuit hood" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "hood_h20survivor_light", @@ -355,17 +355,17 @@ "id": "xl_hood_h20survivor_light", "type": "ARMOR", "copy-from": "hood_h20survivor_light", - "name": { "str": "XL light Kevlar wetsuit overhood" }, + "name": { "str": "light Kevlar wetsuit overhood" }, "proportional": { "weight": 1.3, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_hood_h20survivor_light", "type": "ARMOR", "copy-from": "hood_h20survivor_light", - "name": { "str": "XS light Kevlar wetsuit overhood" }, + "name": { "str": "light Kevlar wetsuit overhood" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "hood_h20survivor_thick", @@ -433,17 +433,17 @@ "id": "xl_hood_h20survivor_thick", "type": "ARMOR", "copy-from": "hood_h20survivor_thick", - "name": { "str": "XL thick Kevlar wetsuit hood" }, + "name": { "str": "thick Kevlar wetsuit hood" }, "proportional": { "weight": 1.3, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_hood_h20survivor_thick", "type": "ARMOR", "copy-from": "hood_h20survivor_thick", - "name": { "str": "XS thick Kevlar wetsuit hood" }, + "name": { "str": "thick Kevlar wetsuit hood" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "helmet_scavenger", @@ -472,16 +472,16 @@ "id": "xl_helmet_scavenger", "type": "ARMOR", "copy-from": "helmet_scavenger", - "name": { "str": "XL scavenger cowl" }, + "name": { "str": "scavenger cowl" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "helmet_scavenger_xs", "type": "ARMOR", "copy-from": "helmet_scavenger", - "name": { "str": "XS scavenger cowl" }, + "name": { "str": "scavenger cowl" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } } ] diff --git a/data/json/items/armor/bespoke_armor/custom_legs.json b/data/json/items/armor/bespoke_armor/custom_legs.json index b06e82dda9a7d..698ea36bce8f8 100644 --- a/data/json/items/armor/bespoke_armor/custom_legs.json +++ b/data/json/items/armor/bespoke_armor/custom_legs.json @@ -67,17 +67,17 @@ "id": "xl_lsurvivor_pants", "type": "ARMOR", "copy-from": "lsurvivor_pants", - "name": { "str_sp": "XL light survivor cargo pants" }, + "name": { "str_sp": "light survivor cargo pants" }, "proportional": { "weight": 1.25, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_lsurvivor_pants", "type": "ARMOR", "copy-from": "lsurvivor_pants", - "name": { "str_sp": "XS light survivor cargo pants" }, + "name": { "str_sp": "light survivor cargo pants" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "pants_survivor", @@ -162,17 +162,17 @@ "id": "xl_pants_survivor", "type": "ARMOR", "copy-from": "pants_survivor", - "name": { "str_sp": "XL survivor cargo pants" }, + "name": { "str_sp": "survivor cargo pants" }, "proportional": { "weight": 1.25, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_pants_survivor", "type": "ARMOR", "copy-from": "pants_survivor", - "name": { "str_sp": "XS survivor cargo pants" }, + "name": { "str_sp": "survivor cargo pants" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armor_mercenary_bottom", diff --git a/data/json/items/armor/bespoke_armor/custom_overcoats.json b/data/json/items/armor/bespoke_armor/custom_overcoats.json index 6b943381df2d0..e9963790d1fad 100644 --- a/data/json/items/armor/bespoke_armor/custom_overcoats.json +++ b/data/json/items/armor/bespoke_armor/custom_overcoats.json @@ -78,18 +78,18 @@ { "id": "xl_duster_survivor", "type": "ARMOR", - "name": { "str": "XL survivor duster" }, + "name": { "str": "survivor duster" }, "copy-from": "duster_survivor", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_duster_survivor", "type": "ARMOR", "copy-from": "duster_survivor", - "name": { "str": "XS survivor duster" }, + "name": { "str": "survivor duster" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "sleeveless_duster_survivor", diff --git a/data/json/items/armor/bespoke_armor/cuttingroom.json b/data/json/items/armor/bespoke_armor/cuttingroom.json index 6dc4a132bc682..cbb3ffc1417da 100644 --- a/data/json/items/armor/bespoke_armor/cuttingroom.json +++ b/data/json/items/armor/bespoke_armor/cuttingroom.json @@ -24,18 +24,18 @@ { "id": "xl_boots_fsurvivor", "type": "ARMOR", - "name": { "str": "pair of XL survivor fireboots", "str_pl": "pairs of XL survivor fireboots" }, + "name": { "str": "pair of survivor fireboots", "str_pl": "pairs of survivor fireboots" }, "copy-from": "boots_fsurvivor", "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_boots_fsurvivor", "type": "ARMOR", "copy-from": "boots_fsurvivor", - "name": { "str": "pair of XS survivor fireboots", "str_pl": "pairs of XS survivor fireboots" }, + "name": { "str": "pair of survivor fireboots", "str_pl": "pairs of survivor fireboots" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "boots_hsurvivor", @@ -62,18 +62,18 @@ { "id": "xl_boots_hsurvivor", "type": "ARMOR", - "name": { "str": "pair of XL heavy survivor boots", "str_pl": "pairs of XL heavy survivor boots" }, + "name": { "str": "pair of heavy survivor boots", "str_pl": "pairs of heavy survivor boots" }, "copy-from": "boots_hsurvivor", "proportional": { "weight": 1.2, "volume": 1.2 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_boots_hsurvivor", "type": "ARMOR", "copy-from": "boots_hsurvivor", - "name": { "str": "pair of XS heavy survivor boots", "str_pl": "pairs of XS heavy survivor boots" }, + "name": { "str": "pair of heavy survivor boots", "str_pl": "pairs of heavy survivor boots" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "gloves_hsurvivor", @@ -99,18 +99,18 @@ { "id": "xl_gloves_hsurvivor", "type": "ARMOR", - "name": { "str": "pair of XL heavy survivor gloves", "str_pl": "pairs of XL heavy survivor gloves" }, + "name": { "str": "pair of heavy survivor gloves", "str_pl": "pairs of heavy survivor gloves" }, "copy-from": "gloves_hsurvivor", "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_gloves_hsurvivor", "type": "ARMOR", "copy-from": "gloves_hsurvivor", - "name": { "str": "pair of XS heavy survivor gloves", "str_pl": "pairs of XS heavy survivor gloves" }, + "name": { "str": "pair of heavy survivor gloves", "str_pl": "pairs of heavy survivor gloves" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "gloves_fsurvivor", @@ -136,18 +136,18 @@ { "id": "xl_gloves_fsurvivor", "type": "ARMOR", - "name": { "str": "pair of XL survivor firegloves", "str_pl": "pairs of XL survivor firegloves" }, + "name": { "str": "pair of survivor firegloves", "str_pl": "pairs of survivor firegloves" }, "copy-from": "gloves_fsurvivor", "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_gloves_fsurvivor", "type": "ARMOR", "copy-from": "gloves_fsurvivor", - "name": { "str": "pair of XS survivor firegloves", "str_pl": "pairs of XS survivor firegloves" }, + "name": { "str": "pair of survivor firegloves", "str_pl": "pairs of survivor firegloves" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "hood_fsurvivor", @@ -175,17 +175,17 @@ "id": "xl_hood_fsurvivor", "type": "ARMOR", "copy-from": "hood_fsurvivor", - "name": { "str": "XL survivor firehood" }, + "name": { "str": "survivor firehood" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_hood_fsurvivor", "type": "ARMOR", "copy-from": "hood_fsurvivor", - "name": { "str": "XS survivor firehood" }, + "name": { "str": "survivor firehood" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "fsurvivor_suit", @@ -225,18 +225,18 @@ { "id": "xl_fsurvivor_suit", "type": "ARMOR", - "name": { "str": "XL survivor firesuit" }, + "name": { "str": "survivor firesuit" }, "copy-from": "fsurvivor_suit", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_fsurvivor_suit", "type": "ARMOR", "copy-from": "fsurvivor_suit", - "name": { "str": "XS survivor firesuit" }, + "name": { "str": "survivor firesuit" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "hsurvivor_suit", @@ -274,17 +274,17 @@ "id": "xlhsurvivor_suit", "type": "ARMOR", "copy-from": "hsurvivor_suit", - "name": { "str": "XL heavy survivor suit" }, + "name": { "str": "heavy survivor suit" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xshsurvivor_suit", "type": "ARMOR", "copy-from": "hsurvivor_suit", - "name": { "str": "XS heavy survivor suit" }, + "name": { "str": "heavy survivor suit" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "lsurvivor_armor", @@ -380,18 +380,18 @@ { "id": "xl_lsurvivor_armor", "type": "ARMOR", - "name": { "str": "XL mercenary body armor" }, + "name": { "str": "mercenary body armor" }, "copy-from": "lsurvivor_armor", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_lsurvivor_armor", "type": "ARMOR", "copy-from": "lsurvivor_armor", - "name": { "str": "XS mercenary body armor" }, + "name": { "str": "mercenary body armor" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "lsurvivor_suit", @@ -426,10 +426,10 @@ { "id": "xl_lsurvivor_suit", "type": "ARMOR", - "name": { "str": "XL light survivor suit" }, + "name": { "str": "light survivor suit" }, "copy-from": "lsurvivor_suit", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "survivor_suit", @@ -466,7 +466,7 @@ "id": "xlsurvivor_suit", "type": "ARMOR", "category": "armor", - "name": { "str": "XL survivor suit" }, + "name": { "str": "survivor suit" }, "description": "A massive hand-built combination armor made from a bulletproof vest and a reinforced leather jumpsuit. Protects from the elements as well as from harm.", "weight": "12400 g", "volume": "18 L", @@ -494,7 +494,7 @@ "material_thickness": 4, "valid_mods": [ "steel_padded" ], "environmental_protection": 3, - "flags": [ "OVERSIZE", "VARSIZE", "WATERPROOF", "POCKETS", "HOOD", "RAINPROOF", "STURDY", "OBSOLETE" ], + "flags": [ "OVERSIZE", "PREFIX_XL", "VARSIZE", "WATERPROOF", "POCKETS", "HOOD", "RAINPROOF", "STURDY", "OBSOLETE" ], "melee_damage": { "bash": 6 } }, { @@ -533,10 +533,10 @@ { "id": "xl_wsurvivor_suit", "type": "ARMOR", - "name": { "str": "XL winter survivor suit" }, + "name": { "str": "winter survivor suit" }, "copy-from": "wsurvivor_suit", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "wsurvivor_suit_nofur", @@ -553,13 +553,13 @@ { "id": "xl_wsurvivor_suit_nofur", "type": "ARMOR", - "name": { "str": "XL winter survivor suit" }, + "name": { "str": "winter survivor suit" }, "copy-from": "wsurvivor_suit", "material": [ "kevlar_layered", "faux_fur" ], "color": "pink", "warmth": 65, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "h20survivor_suit", diff --git a/data/json/items/armor/bespoke_armor/utility.json b/data/json/items/armor/bespoke_armor/utility.json index 22137a88ac39f..06e8a2b2973f6 100644 --- a/data/json/items/armor/bespoke_armor/utility.json +++ b/data/json/items/armor/bespoke_armor/utility.json @@ -183,16 +183,16 @@ "id": "xl_survivor_vest", "type": "ARMOR", "copy-from": "survivor_vest", - "name": { "str": "XL survivor harness", "str_pl": "XL survivor harnesses" }, + "name": { "str": "survivor harness", "str_pl": "survivor harnesses" }, "proportional": { "weight": 1.25, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_survivor_vest", "type": "ARMOR", "copy-from": "survivor_vest", - "name": { "str": "XS survivor harness", "str_pl": "XS survivor harnesses" }, + "name": { "str": "survivor harness", "str_pl": "survivor harnesses" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } } ] diff --git a/data/json/items/armor/boots.json b/data/json/items/armor/boots.json index e8a3460f11f52..9a6f0e53618ac 100644 --- a/data/json/items/armor/boots.json +++ b/data/json/items/armor/boots.json @@ -88,19 +88,19 @@ { "id": "xl_boots", "type": "ARMOR", - "name": { "str": "pair of XL boots", "str_pl": "pairs of XL boots" }, + "name": { "str": "pair of boots", "str_pl": "pairs of boots" }, "copy-from": "boots", "proportional": { "weight": 1.25, "volume": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_boots", "type": "ARMOR", "copy-from": "boots", "looks_like": "boots", - "name": { "str": "pair of XS boots", "str_pl": "pairs of XS boots" }, + "name": { "str": "pair of boots", "str_pl": "pairs of boots" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "boots_bone", @@ -240,19 +240,19 @@ { "id": "xl_boots_chitin", "type": "ARMOR", - "name": { "str": "pair of XL chitinous boots", "str_pl": "pairs of XL chitinous boots" }, + "name": { "str": "pair of chitinous boots", "str_pl": "pairs of chitinous boots" }, "copy-from": "boots_chitin", "proportional": { "weight": 1.25, "volume": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_boots_chitin", "type": "ARMOR", "copy-from": "boots_chitin", "looks_like": "boots_chitin", - "name": { "str": "pair of XS chitinous boots", "str_pl": "pairs of XS chitinous boots" }, + "name": { "str": "pair of chitinous boots", "str_pl": "pairs of chitinous boots" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "boots_acidchitin", @@ -267,18 +267,18 @@ { "id": "xl_boots_acidchitin", "type": "ARMOR", - "name": { "str": "pair of XL biosilicified chitin boots", "str_pl": "pairs of XL biosilicified chitin boots" }, + "name": { "str": "pair of biosilicified chitin boots", "str_pl": "pairs of biosilicified chitin boots" }, "copy-from": "boots_acidchitin", "proportional": { "weight": 1.25, "volume": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_boots_acidchitin", "type": "ARMOR", "copy-from": "boots_acidchitin", - "name": { "str": "pair of XS biosilicified chitin boots", "str_pl": "pairs of XS biosilicified chitin boots" }, + "name": { "str": "pair of biosilicified chitin boots", "str_pl": "pairs of biosilicified chitin boots" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "boots_combat", @@ -495,18 +495,18 @@ { "id": "xl_boots_fur", "type": "ARMOR", - "name": { "str": "pair of XL fur boots", "str_pl": "pairs of XL fur boots" }, + "name": { "str": "pair of fur boots", "str_pl": "pairs of fur boots" }, "copy-from": "boots_fur", "proportional": { "weight": 1.15, "volume": 1.15 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_boots_fur", "type": "ARMOR", "copy-from": "boots_fur", - "name": { "str": "pair of XS fur boots", "str_pl": "pairs of XS fur boots" }, + "name": { "str": "pair of fur boots", "str_pl": "pairs of fur boots" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "boots_faux_fur", @@ -561,18 +561,18 @@ { "id": "xl_boots_faux_fur", "type": "ARMOR", - "name": { "str": "pair of XL faux fur boots", "str_pl": "pairs of XL faux fur boots" }, + "name": { "str": "pair of faux fur boots", "str_pl": "pairs of faux fur boots" }, "copy-from": "boots_faux_fur", "proportional": { "weight": 1.15, "volume": 1.15 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_boots_faux_fur", "type": "ARMOR", "copy-from": "boots_faux_fur", - "name": { "str": "pair of XS faux fur boots", "str_pl": "pairs of XS faux fur boots" }, + "name": { "str": "pair of faux fur boots", "str_pl": "pairs of faux fur boots" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "boots_hiking", @@ -645,18 +645,18 @@ { "id": "xl_boots_larmor", "type": "ARMOR", - "name": { "str": "pair of XL leather armor boots", "str_pl": "pairs of XL leather armor boots" }, + "name": { "str": "pair of leather armor boots", "str_pl": "pairs of leather armor boots" }, "copy-from": "boots_larmor", "proportional": { "weight": 1.3, "volume": 1.3 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_boots_larmor", "type": "ARMOR", "copy-from": "boots_larmor", - "name": { "str": "pair of XS leather armor boots", "str_pl": "pairs of XS leather armor boots" }, + "name": { "str": "pair of leather armor boots", "str_pl": "pairs of leather armor boots" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "boots_plate", @@ -711,18 +711,18 @@ { "id": "xl_boots_plate", "type": "ARMOR", - "name": { "str": "pair of XL armored boots", "str_pl": "pairs of XL armored boots" }, + "name": { "str": "pair of armored boots", "str_pl": "pairs of armored boots" }, "copy-from": "boots_plate", "proportional": { "weight": 1.25, "volume": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_boots_plate", "type": "ARMOR", "copy-from": "boots_plate", - "name": { "str": "pair of XS armored boots", "str_pl": "pairs of XS armored boots" }, + "name": { "str": "pair of armored boots", "str_pl": "pairs of armored boots" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "boots_rubber", @@ -818,18 +818,18 @@ { "id": "xl_boots_scrap", "type": "ARMOR", - "name": { "str": "pair of XL scrap boots", "str_pl": "pairs of XL scrap boots" }, + "name": { "str": "pair of scrap boots", "str_pl": "pairs of scrap boots" }, "copy-from": "boots_scrap", "proportional": { "weight": 1.3, "volume": 1.3 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_boots_scrap", "type": "ARMOR", "copy-from": "boots_scrap", - "name": { "str": "pair of XS scrap boots", "str_pl": "pairs of XS scrap boots" }, + "name": { "str": "pair of scrap boots", "str_pl": "pairs of scrap boots" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "sabaton_metal_sheets", @@ -1078,18 +1078,18 @@ { "id": "xl_boots_winter", "type": "ARMOR", - "name": { "str": "pair of XL winter boots", "str_pl": "pairs of XL winter boots" }, + "name": { "str": "pair of winter boots", "str_pl": "pairs of winter boots" }, "copy-from": "boots_winter", "proportional": { "weight": 1.3, "volume": 1.3 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_boots_winter", "type": "ARMOR", "copy-from": "boots_winter", - "name": { "str": "pair of XS winter boots", "str_pl": "pairs of XS winter boots" }, + "name": { "str": "pair of winter boots", "str_pl": "pairs of winter boots" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "cleats", @@ -2539,17 +2539,17 @@ "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" }, + "name": { "str": "pair of mild steel chainmail chausses", "str_pl": "pairs of mild steel chainmail chausses" }, "proportional": { "weight": 2, "volume": 2 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_lc_chainmail_feet", "type": "ARMOR", "copy-from": "lc_chainmail_feet", - "name": { "str": "pair of XS mild steel chainmail chausses", "str_pl": "pairs of XS mild steel chainmail chausses" }, + "name": { "str": "pair of mild steel chainmail chausses", "str_pl": "pairs of mild steel chainmail chausses" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "mc_chainmail_feet", @@ -2563,18 +2563,18 @@ "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" }, + "name": { "str": "pair of medium steel chainmail chausses", "str_pl": "pairs of medium steel chainmail chausses" }, "proportional": { "weight": 2, "volume": 2 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "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" }, + "name": { "str": "pair of medium steel chainmail chausses", "str_pl": "pairs of medium steel chainmail chausses" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "hc_chainmail_feet", @@ -2588,17 +2588,17 @@ "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" }, + "name": { "str": "pair of high steel chainmail chausses", "str_pl": "pairs of high steel chainmail chausses" }, "proportional": { "weight": 2, "volume": 2 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "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" }, + "name": { "str": "pair of high steel chainmail chausses", "str_pl": "pairs of high steel chainmail chausses" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "ch_chainmail_feet", @@ -2612,17 +2612,17 @@ "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" }, + "name": { "str": "pair of hardened steel chainmail chausses", "str_pl": "pairs of hardened steel chainmail chausses" }, "proportional": { "weight": 2, "volume": 2 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "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" }, + "name": { "str": "pair of hardened steel chainmail chausses", "str_pl": "pairs of hardened steel chainmail chausses" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "qt_chainmail_feet", @@ -2636,17 +2636,17 @@ "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" }, + "name": { "str": "pair of tempered steel chainmail chausses", "str_pl": "pairs of tempered steel chainmail chausses" }, "proportional": { "weight": 2, "volume": 2 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "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" }, + "name": { "str": "pair of tempered steel chainmail chausses", "str_pl": "pairs of tempered steel chainmail chausses" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "nomex_socks", @@ -2671,19 +2671,19 @@ { "id": "xlnomex_socks", "type": "ARMOR", - "name": { "str": "pair of XL flame-resistant socks", "str_pl": "pairs of XL flame-resistant socks" }, + "name": { "str": "pair of flame-resistant socks", "str_pl": "pairs of flame-resistant socks" }, "weight": "300 g", "volume": "1000 ml", "copy-from": "nomex_socks", - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xsnomex_socks", "type": "ARMOR", "copy-from": "nomex_socks", - "name": { "str": "pair of XS flame-resistant socks", "str_pl": "pairs of XS flame-resistant socks" }, + "name": { "str": "pair of flame-resistant socks", "str_pl": "pairs of flame-resistant socks" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "socks", @@ -2706,19 +2706,19 @@ { "id": "xlsocks", "type": "ARMOR", - "name": { "str": "pair of XL socks", "str_pl": "pairs of XL socks" }, + "name": { "str": "pair of socks", "str_pl": "pairs of socks" }, "weight": "58 g", "volume": "250 ml", "copy-from": "socks", - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xssocks", "type": "ARMOR", "copy-from": "socks", - "name": { "str": "pair of XS socks", "str_pl": "pairs of XS socks" }, + "name": { "str": "pair of socks", "str_pl": "pairs of socks" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "socks_ankle", @@ -2837,19 +2837,19 @@ { "id": "xlsocks_wool", "type": "ARMOR", - "name": { "str": "pair of XL wool socks", "str_pl": "pairs of XL wool socks" }, + "name": { "str": "pair of wool socks", "str_pl": "pairs of wool socks" }, "weight": "77 g", "volume": "500 ml", "copy-from": "socks_wool", - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xssocks_wool", "type": "ARMOR", "copy-from": "socks_wool", - "name": { "str": "pair of XS wool socks", "str_pl": "pairs of XS wool socks" }, + "name": { "str": "pair of wool socks", "str_pl": "pairs of wool socks" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "stockings", @@ -3321,9 +3321,9 @@ "id": "xl_lc_sabaton", "type": "ARMOR", "copy-from": "lc_sabaton", - "name": { "str": "XL mild steel sabaton" }, + "name": { "str": "mild steel sabaton" }, "proportional": { "weight": 1.25, "volume": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "mc_sabaton", @@ -3336,9 +3336,9 @@ "id": "xl_mc_sabaton", "type": "ARMOR", "copy-from": "mc_sabaton", - "name": { "str": "XL medium steel sabaton" }, + "name": { "str": "medium steel sabaton" }, "proportional": { "weight": 1.25, "volume": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "hc_sabaton", @@ -3351,9 +3351,9 @@ "id": "xl_hc_sabaton", "type": "ARMOR", "copy-from": "hc_sabaton", - "name": { "str": "XL high steel sabaton" }, + "name": { "str": "high steel sabaton" }, "proportional": { "weight": 1.25, "volume": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "ch_sabaton", @@ -3366,9 +3366,9 @@ "id": "xl_ch_sabaton", "type": "ARMOR", "copy-from": "ch_sabaton", - "name": { "str": "XL hardened steel sabaton" }, + "name": { "str": "hardened steel sabaton" }, "proportional": { "weight": 1.25, "volume": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "qt_sabaton", @@ -3381,8 +3381,8 @@ "id": "xl_qt_sabaton", "type": "ARMOR", "copy-from": "qt_sabaton", - "name": { "str": "XL tempered steel sabaton" }, + "name": { "str": "tempered steel sabaton" }, "proportional": { "weight": 1.25, "volume": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } } ] diff --git a/data/json/items/armor/brigandine.json b/data/json/items/armor/brigandine.json index db6c123cccda5..74ee8fd6ca8a3 100644 --- a/data/json/items/armor/brigandine.json +++ b/data/json/items/armor/brigandine.json @@ -46,17 +46,17 @@ "id": "xl_armor_lc_brigandine", "type": "ARMOR", "copy-from": "armor_lc_brigandine", - "name": { "str": "XL mild steel brigandine" }, + "name": { "str": "mild steel brigandine" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_lc_brigandine_xs", "type": "ARMOR", "copy-from": "armor_lc_brigandine", - "name": { "str": "XS mild steel brigandine" }, + "name": { "str": "mild steel brigandine" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armor_lc_brigandine_shoulders", @@ -113,17 +113,17 @@ "id": "xl_armor_lc_brigandine_shoulders", "type": "ARMOR", "copy-from": "armor_lc_brigandine_shoulders", - "name": { "str": "XL mild steel brigandine with shoulder guards", "str_pl": "XL mild steel brigandines with shoulder guards" }, + "name": { "str": "mild steel brigandine with shoulder guards", "str_pl": "mild steel brigandines with shoulder guards" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_lc_brigandine_shoulders_xs", "type": "ARMOR", "copy-from": "armor_lc_brigandine_shoulders", - "name": { "str": "XS mild steel brigandine with shoulder guards", "str_pl": "XS mild steel brigandines with shoulder guards" }, + "name": { "str": "mild steel brigandine with shoulder guards", "str_pl": "mild steel brigandines with shoulder guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armor_lc_coat_brigandine", @@ -183,17 +183,17 @@ "id": "xl_armor_lc_coat_brigandine", "type": "ARMOR", "copy-from": "armor_lc_coat_brigandine", - "name": { "str": "XL mild steel brigandine coat" }, + "name": { "str": "mild steel brigandine coat" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_lc_coat_brigandine_xs", "type": "ARMOR", "copy-from": "armor_lc_coat_brigandine", - "name": { "str": "XS mild steel brigandine coat" }, + "name": { "str": "mild steel brigandine coat" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armor_lc_coat_brigandine_shoulders", @@ -265,22 +265,22 @@ "type": "ARMOR", "copy-from": "armor_lc_coat_brigandine_shoulders", "name": { - "str": "XL mild steel brigandine coat with shoulder guards", - "str_pl": "XL mild steel brigandine coats with shoulder guards" + "str": "mild steel brigandine coat with shoulder guards", + "str_pl": "mild steel brigandine coats with shoulder guards" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_lc_coat_brigandine_shoulders_xs", "type": "ARMOR", "copy-from": "armor_lc_coat_brigandine_shoulders", "name": { - "str": "XS mild steel brigandine coat with shoulder guards", - "str_pl": "XS mild steel brigandine coats with shoulder guards" + "str": "mild steel brigandine coat with shoulder guards", + "str_pl": "mild steel brigandine coats with shoulder guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armor_mc_brigandine", @@ -293,17 +293,17 @@ "id": "xl_armor_mc_brigandine", "type": "ARMOR", "copy-from": "armor_mc_brigandine", - "name": { "str": "XL medium steel brigandine" }, + "name": { "str": "medium steel brigandine" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_mc_brigandine_xs", "type": "ARMOR", "copy-from": "armor_mc_brigandine", - "name": { "str": "XS medium steel brigandine" }, + "name": { "str": "medium steel brigandine" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armor_mc_brigandine_shoulders", @@ -316,23 +316,17 @@ "id": "xl_armor_mc_brigandine_shoulders", "type": "ARMOR", "copy-from": "armor_mc_brigandine_shoulders", - "name": { - "str": "XL medium steel brigandine with shoulder guards", - "str_pl": "XL medium steel brigandines with shoulder guards" - }, + "name": { "str": "medium steel brigandine with shoulder guards", "str_pl": "medium steel brigandines with shoulder guards" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_mc_brigandine_shoulders_xs", "type": "ARMOR", "copy-from": "armor_mc_brigandine_shoulders", - "name": { - "str": "XS medium steel brigandine with shoulder guards", - "str_pl": "XS medium steel brigandines with shoulder guards" - }, + "name": { "str": "medium steel brigandine with shoulder guards", "str_pl": "medium steel brigandines with shoulder guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armor_mc_coat_brigandine", @@ -345,17 +339,17 @@ "id": "xl_armor_mc_coat_brigandine", "type": "ARMOR", "copy-from": "armor_mc_coat_brigandine", - "name": { "str": "XL medium steel brigandine coat" }, + "name": { "str": "medium steel brigandine coat" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_mc_coat_brigandine_xs", "type": "ARMOR", "copy-from": "armor_mc_coat_brigandine", - "name": { "str": "XS medium steel brigandine coat" }, + "name": { "str": "medium steel brigandine coat" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armor_mc_coat_brigandine_shoulders", @@ -372,22 +366,22 @@ "type": "ARMOR", "copy-from": "armor_mc_coat_brigandine_shoulders", "name": { - "str": "XL medium steel brigandine coat with shoulder guards", - "str_pl": "XL medium steel brigandine coats with shoulder guards" + "str": "medium steel brigandine coat with shoulder guards", + "str_pl": "medium steel brigandine coats with shoulder guards" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_mc_coat_brigandine_shoulders_xs", "type": "ARMOR", "copy-from": "armor_mc_coat_brigandine_shoulders", "name": { - "str": "XS medium steel brigandine coat with shoulder guards", - "str_pl": "XS medium steel brigandine coats with shoulder guards" + "str": "medium steel brigandine coat with shoulder guards", + "str_pl": "medium steel brigandine coats with shoulder guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armor_hc_brigandine", @@ -400,17 +394,17 @@ "id": "xl_armor_hc_brigandine", "type": "ARMOR", "copy-from": "armor_hc_brigandine", - "name": { "str": "XL high steel brigandine" }, + "name": { "str": "high steel brigandine" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_hc_brigandine_xs", "type": "ARMOR", "copy-from": "armor_hc_brigandine", - "name": { "str": "XS high steel brigandine" }, + "name": { "str": "high steel brigandine" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armor_hc_brigandine_shoulders", @@ -423,17 +417,17 @@ "id": "xl_armor_hc_brigandine_shoulders", "type": "ARMOR", "copy-from": "armor_hc_brigandine_shoulders", - "name": { "str": "XL high steel brigandine with shoulder guards", "str_pl": "XL high steel brigandines with shoulder guards" }, + "name": { "str": "high steel brigandine with shoulder guards", "str_pl": "high steel brigandines with shoulder guards" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_hc_brigandine_shoulders_xs", "type": "ARMOR", "copy-from": "armor_hc_brigandine_shoulders", - "name": { "str": "XS high steel brigandine with shoulder guards", "str_pl": "XS high steel brigandines with shoulder guards" }, + "name": { "str": "high steel brigandine with shoulder guards", "str_pl": "high steel brigandines with shoulder guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armor_hc_coat_brigandine", @@ -446,17 +440,17 @@ "id": "xl_armor_hc_coat_brigandine", "type": "ARMOR", "copy-from": "armor_hc_coat_brigandine", - "name": { "str": "XL high steel brigandine coat" }, + "name": { "str": "high steel brigandine coat" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_hc_coat_brigandine_xs", "type": "ARMOR", "copy-from": "armor_hc_coat_brigandine", - "name": { "str": "XS high steel brigandine coat" }, + "name": { "str": "high steel brigandine coat" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armor_hc_coat_brigandine_shoulders", @@ -473,22 +467,22 @@ "type": "ARMOR", "copy-from": "armor_hc_coat_brigandine_shoulders", "name": { - "str": "XL high steel brigandine coat with shoulder guards", - "str_pl": "XL high steel brigandine coats with shoulder guards" + "str": "high steel brigandine coat with shoulder guards", + "str_pl": "high steel brigandine coats with shoulder guards" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_hc_coat_brigandine_shoulders_xs", "type": "ARMOR", "copy-from": "armor_hc_coat_brigandine_shoulders", "name": { - "str": "XS high steel brigandine coat with shoulder guards", - "str_pl": "XS high steel brigandine coats with shoulder guards" + "str": "high steel brigandine coat with shoulder guards", + "str_pl": "high steel brigandine coats with shoulder guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armor_ch_brigandine", @@ -501,17 +495,17 @@ "id": "xl_armor_ch_brigandine", "type": "ARMOR", "copy-from": "armor_ch_brigandine", - "name": { "str": "XL hardened brigandine" }, + "name": { "str": "hardened brigandine" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_ch_brigandine_xs", "type": "ARMOR", "copy-from": "armor_ch_brigandine", - "name": { "str": "XS hardened brigandine" }, + "name": { "str": "hardened brigandine" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armor_ch_brigandine_shoulders", @@ -524,17 +518,17 @@ "id": "xl_armor_ch_brigandine_shoulders", "type": "ARMOR", "copy-from": "armor_ch_brigandine_shoulders", - "name": { "str": "XL hardened brigandine with shoulder guards", "str_pl": "XL hardened brigandines with shoulder guards" }, + "name": { "str": "hardened brigandine with shoulder guards", "str_pl": "hardened brigandines with shoulder guards" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_ch_brigandine_shoulders_xs", "type": "ARMOR", "copy-from": "armor_ch_brigandine_shoulders", - "name": { "str": "XS hardened brigandine with shoulder guards", "str_pl": "XS hardened brigandines with shoulder guards" }, + "name": { "str": "hardened brigandine with shoulder guards", "str_pl": "hardened brigandines with shoulder guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armor_ch_coat_brigandine", @@ -547,17 +541,17 @@ "id": "xl_armor_ch_coat_brigandine", "type": "ARMOR", "copy-from": "armor_ch_coat_brigandine", - "name": { "str": "XL hardened brigandine coat" }, + "name": { "str": "hardened brigandine coat" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_ch_coat_brigandine_xs", "type": "ARMOR", "copy-from": "armor_ch_coat_brigandine", - "name": { "str": "XS hardened brigandine coat" }, + "name": { "str": "hardened brigandine coat" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armor_ch_coat_brigandine_shoulders", @@ -570,23 +564,17 @@ "id": "xl_armor_ch_coat_brigandine_shoulders", "type": "ARMOR", "copy-from": "armor_ch_coat_brigandine_shoulders", - "name": { - "str": "XL hardened brigandine coat with shoulder guards", - "str_pl": "XL hardened brigandine coats with shoulder guards" - }, + "name": { "str": "hardened brigandine coat with shoulder guards", "str_pl": "hardened brigandine coats with shoulder guards" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_ch_coat_brigandine_shoulders_xs", "type": "ARMOR", "copy-from": "armor_ch_coat_brigandine_shoulders", - "name": { - "str": "XS hardened brigandine coat with shoulder guards", - "str_pl": "XS hardened brigandine coats with shoulder guards" - }, + "name": { "str": "hardened brigandine coat with shoulder guards", "str_pl": "hardened brigandine coats with shoulder guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armor_qt_brigandine", @@ -599,17 +587,17 @@ "id": "xl_armor_qt_brigandine", "type": "ARMOR", "copy-from": "armor_qt_brigandine", - "name": { "str": "XL tempered brigandine" }, + "name": { "str": "tempered brigandine" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_qt_brigandine_xs", "type": "ARMOR", "copy-from": "armor_qt_brigandine", - "name": { "str": "XS tempered brigandine" }, + "name": { "str": "tempered brigandine" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armor_qt_brigandine_shoulders", @@ -622,17 +610,17 @@ "id": "xl_armor_qt_brigandine_shoulders", "type": "ARMOR", "copy-from": "armor_qt_brigandine_shoulders", - "name": { "str": "XL tempered brigandine with shoulder guards", "str_pl": "XL tempered brigandines with shoulder guards" }, + "name": { "str": "tempered brigandine with shoulder guards", "str_pl": "tempered brigandines with shoulder guards" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_qt_brigandine_shoulders_xs", "type": "ARMOR", "copy-from": "armor_qt_brigandine_shoulders", - "name": { "str": "XS tempered brigandine with shoulder guards", "str_pl": "XS tempered brigandines with shoulder guards" }, + "name": { "str": "tempered brigandine with shoulder guards", "str_pl": "tempered brigandines with shoulder guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armor_qt_coat_brigandine", @@ -645,17 +633,17 @@ "id": "xl_armor_qt_coat_brigandine", "type": "ARMOR", "copy-from": "armor_qt_coat_brigandine", - "name": { "str": "XL tempered brigandine coat" }, + "name": { "str": "tempered brigandine coat" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_qt_coat_brigandine_xs", "type": "ARMOR", "copy-from": "armor_qt_coat_brigandine", - "name": { "str": "XS tempered brigandine coat" }, + "name": { "str": "tempered brigandine coat" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armor_qt_coat_brigandine_shoulders", @@ -668,23 +656,17 @@ "id": "xl_armor_qt_coat_brigandine_shoulders", "type": "ARMOR", "copy-from": "armor_qt_coat_brigandine_shoulders", - "name": { - "str": "XL tempered brigandine coat with shoulder guards", - "str_pl": "XL tempered brigandine coats with shoulder guards" - }, + "name": { "str": "tempered brigandine coat with shoulder guards", "str_pl": "tempered brigandine coats with shoulder guards" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_qt_coat_brigandine_shoulders_xs", "type": "ARMOR", "copy-from": "armor_qt_coat_brigandine_shoulders", - "name": { - "str": "XS tempered brigandine coat with shoulder guards", - "str_pl": "XS tempered brigandine coats with shoulder guards" - }, + "name": { "str": "tempered brigandine coat with shoulder guards", "str_pl": "tempered brigandine coats with shoulder guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armguard_lc_brigandine", @@ -724,17 +706,17 @@ "id": "xl_armguard_lc_brigandine", "type": "ARMOR", "copy-from": "armguard_lc_brigandine", - "name": { "str": "XL pair of mild steel splint arm guards", "str_pl": "XL pairs of mild steel splint arm guards" }, + "name": { "str": "pair of mild steel splint arm guards", "str_pl": "pairs of mild steel splint arm guards" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armguard_lc_brigandine_xs", "type": "ARMOR", "copy-from": "armguard_lc_brigandine", - "name": { "str": "XS pair of mild steel splint arm guards", "str_pl": "XS pairs of mild steel splint arm guards" }, + "name": { "str": "pair of mild steel splint arm guards", "str_pl": "pairs of mild steel splint arm guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armguard_mc_brigandine", @@ -747,17 +729,17 @@ "id": "xl_armguard_mc_brigandine", "type": "ARMOR", "copy-from": "armguard_mc_brigandine", - "name": { "str": "XL pair of medium steel splint arm guards", "str_pl": "XL pairs of medium steel splint arm guards" }, + "name": { "str": "pair of medium steel splint arm guards", "str_pl": "pairs of medium steel splint arm guards" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armguard_mc_brigandine_xs", "type": "ARMOR", "copy-from": "armguard_mc_brigandine", - "name": { "str": "XS pair of medium steel splint arm guards", "str_pl": "XS pairs of medium steel splint arm guards" }, + "name": { "str": "pair of medium steel splint arm guards", "str_pl": "pairs of medium steel splint arm guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armguard_hc_brigandine", @@ -770,17 +752,17 @@ "id": "xl_armguard_hc_brigandine", "type": "ARMOR", "copy-from": "armguard_hc_brigandine", - "name": { "str": "XL pair of high steel splint arm guards", "str_pl": "XL pairs of high steel splint arm guards" }, + "name": { "str": "pair of high steel splint arm guards", "str_pl": "pairs of high steel splint arm guards" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armguard_hc_brigandine_xs", "type": "ARMOR", "copy-from": "armguard_hc_brigandine", - "name": { "str": "XS pair of high steel splint arm guards", "str_pl": "XS pairs of high steel splint arm guards" }, + "name": { "str": "pair of high steel splint arm guards", "str_pl": "pairs of high steel splint arm guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armguard_ch_brigandine", @@ -793,17 +775,17 @@ "id": "xl_armguard_ch_brigandine", "type": "ARMOR", "copy-from": "armguard_ch_brigandine", - "name": { "str": "XL pair of hardened splint arm guards", "str_pl": "XL pairs of hardened splint arm guards" }, + "name": { "str": "pair of hardened splint arm guards", "str_pl": "pairs of hardened splint arm guards" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armguard_ch_brigandine_xs", "type": "ARMOR", "copy-from": "armguard_ch_brigandine", - "name": { "str": "XS pair of hardened splint arm guards", "str_pl": "XS pairs of hardened splint arm guards" }, + "name": { "str": "pair of hardened splint arm guards", "str_pl": "pairs of hardened splint arm guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armguard_qt_brigandine", @@ -816,17 +798,17 @@ "id": "xl_armguard_qt_brigandine", "type": "ARMOR", "copy-from": "armguard_qt_brigandine", - "name": { "str": "XL pair of tempered splint arm guards", "str_pl": "XL pairs of tempered splint arm guards" }, + "name": { "str": "pair of tempered splint arm guards", "str_pl": "pairs of tempered splint arm guards" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armguard_qt_brigandine_xs", "type": "ARMOR", "copy-from": "armguard_qt_brigandine", - "name": { "str": "XS pair of tempered splint arm guards", "str_pl": "XS pairs of tempered splint arm guards" }, + "name": { "str": "pair of tempered splint arm guards", "str_pl": "pairs of tempered splint arm guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "legguard_lc_brigandine", @@ -865,17 +847,17 @@ "id": "xl_legguard_lc_brigandine", "type": "ARMOR", "copy-from": "legguard_lc_brigandine", - "name": { "str": "XL pair of mild steel splint leg guards", "str_pl": "XL pairs of mild steel splint leg guards" }, + "name": { "str": "pair of mild steel splint leg guards", "str_pl": "pairs of mild steel splint leg guards" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "legguard_lc_brigandine_xs", "type": "ARMOR", "copy-from": "legguard_lc_brigandine", - "name": { "str": "XS pair of mild steel splint leg guards", "str_pl": "XS pairs of mild steel splint leg guards" }, + "name": { "str": "pair of mild steel splint leg guards", "str_pl": "pairs of mild steel splint leg guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "legguard_mc_brigandine", @@ -888,17 +870,17 @@ "id": "xl_legguard_mc_brigandine", "type": "ARMOR", "copy-from": "legguard_mc_brigandine", - "name": { "str": "XL pair of medium steel splint leg guards", "str_pl": "XL pairs of medium steel splint leg guards" }, + "name": { "str": "pair of medium steel splint leg guards", "str_pl": "pairs of medium steel splint leg guards" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "legguard_mc_brigandine_xs", "type": "ARMOR", "copy-from": "legguard_mc_brigandine", - "name": { "str": "XS pair of medium steel splint leg guards", "str_pl": "XS pairs of medium steel splint leg guards" }, + "name": { "str": "pair of medium steel splint leg guards", "str_pl": "pairs of medium steel splint leg guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "legguard_hc_brigandine", @@ -911,17 +893,17 @@ "id": "xl_legguard_hc_brigandine", "type": "ARMOR", "copy-from": "legguard_hc_brigandine", - "name": { "str": "XL pair of high steel splint leg guards", "str_pl": "XL pairs of high steel splint leg guards" }, + "name": { "str": "pair of high steel splint leg guards", "str_pl": "pairs of high steel splint leg guards" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "legguard_hc_brigandine_xs", "type": "ARMOR", "copy-from": "legguard_hc_brigandine", - "name": { "str": "XS pair of high steel splint leg guards", "str_pl": "XS pairs of high steel splint leg guards" }, + "name": { "str": "pair of high steel splint leg guards", "str_pl": "pairs of high steel splint leg guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "legguard_ch_brigandine", @@ -934,17 +916,17 @@ "id": "xl_legguard_ch_brigandine", "type": "ARMOR", "copy-from": "legguard_ch_brigandine", - "name": { "str": "XL pair of hardened splint leg guards", "str_pl": "XL pairs of hardened splint leg guards" }, + "name": { "str": "pair of hardened splint leg guards", "str_pl": "pairs of hardened splint leg guards" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "legguard_ch_brigandine_xs", "type": "ARMOR", "copy-from": "legguard_ch_brigandine", - "name": { "str": "XS pair of hardened splint leg guards", "str_pl": "XS pairs of hardened splint leg guards" }, + "name": { "str": "pair of hardened splint leg guards", "str_pl": "pairs of hardened splint leg guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "legguard_qt_brigandine", @@ -957,17 +939,17 @@ "id": "xl_legguard_qt_brigandine", "type": "ARMOR", "copy-from": "legguard_qt_brigandine", - "name": { "str": "XL pair of tempered splint leg guards", "str_pl": "XL pairs of tempered splint leg guards" }, + "name": { "str": "pair of tempered splint leg guards", "str_pl": "pairs of tempered splint leg guards" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "legguard_qt_brigandine_xs", "type": "ARMOR", "copy-from": "legguard_qt_brigandine", - "name": { "str": "XS pair of tempered splint leg guards", "str_pl": "XS pairs of tempered splint leg guards" }, + "name": { "str": "pair of tempered splint leg guards", "str_pl": "pairs of tempered splint leg guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "lc_vambrace_brigandine", @@ -1007,17 +989,17 @@ "id": "xl_lc_vambrace_brigandine", "type": "ARMOR", "copy-from": "lc_vambrace_brigandine", - "name": { "str": "XL pair of mild steel splint vambraces", "str_pl": "XL pairs of mild steel splint vambraces" }, + "name": { "str": "pair of mild steel splint vambraces", "str_pl": "pairs of mild steel splint vambraces" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_lc_vambrace_brigandine", "type": "ARMOR", "copy-from": "lc_vambrace_brigandine", - "name": { "str": "XS pair of mild steel splint vambraces", "str_pl": "XS pairs of mild steel splint vambraces" }, + "name": { "str": "pair of mild steel splint vambraces", "str_pl": "pairs of mild steel splint vambraces" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "mc_vambrace_brigandine", @@ -1030,17 +1012,17 @@ "id": "xl_mc_vambrace_brigandine", "type": "ARMOR", "copy-from": "mc_vambrace_brigandine", - "name": { "str": "XL pair of medium steel splint vambraces", "str_pl": "XL pairs of medium steel splint vambraces" }, + "name": { "str": "pair of medium steel splint vambraces", "str_pl": "pairs of medium steel splint vambraces" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_mc_vambrace_brigandine", "type": "ARMOR", "copy-from": "mc_vambrace_brigandine", - "name": { "str": "XS pair of medium steel splint vambraces", "str_pl": "XS pairs of medium steel splint vambraces" }, + "name": { "str": "pair of medium steel splint vambraces", "str_pl": "pairs of medium steel splint vambraces" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "hc_vambrace_brigandine", @@ -1053,17 +1035,17 @@ "id": "xl_hc_vambrace_brigandine", "type": "ARMOR", "copy-from": "hc_vambrace_brigandine", - "name": { "str": "XL pair of high steel splint vambraces", "str_pl": "XL pairs of high steel splint vambraces" }, + "name": { "str": "pair of high steel splint vambraces", "str_pl": "pairs of high steel splint vambraces" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_hc_vambrace_brigandine", "type": "ARMOR", "copy-from": "hc_vambrace_brigandine", - "name": { "str": "XS pair of high steel splint vambraces", "str_pl": "XS pairs of high steel splint vambraces" }, + "name": { "str": "pair of high steel splint vambraces", "str_pl": "pairs of high steel splint vambraces" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "ch_vambrace_brigandine", @@ -1076,17 +1058,17 @@ "id": "xl_ch_vambrace_brigandine", "type": "ARMOR", "copy-from": "ch_vambrace_brigandine", - "name": { "str": "XL pair of hardened splint vambraces", "str_pl": "XL pairs of hardened splint vambraces" }, + "name": { "str": "pair of hardened splint vambraces", "str_pl": "pairs of hardened splint vambraces" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_ch_vambrace_brigandine", "type": "ARMOR", "copy-from": "ch_vambrace_brigandine", - "name": { "str": "XS pair of hardened splint vambraces", "str_pl": "XS pairs of hardened splint vambraces" }, + "name": { "str": "pair of hardened splint vambraces", "str_pl": "pairs of hardened splint vambraces" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "qt_vambrace_brigandine", @@ -1099,17 +1081,17 @@ "id": "xl_qt_vambrace_brigandine", "type": "ARMOR", "copy-from": "qt_vambrace_brigandine", - "name": { "str": "XL pair of tempered splint vambraces", "str_pl": "XL pairs of tempered splint vambraces" }, + "name": { "str": "pair of tempered splint vambraces", "str_pl": "pairs of tempered splint vambraces" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_qt_vambrace_brigandine", "type": "ARMOR", "copy-from": "qt_vambrace_brigandine", - "name": { "str": "XS pair of tempered splint vambraces", "str_pl": "XS pairs of tempered splint vambraces" }, + "name": { "str": "pair of tempered splint vambraces", "str_pl": "pairs of tempered splint vambraces" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "lc_greaves_brigandine", @@ -1148,17 +1130,17 @@ "id": "xl_lc_greaves_brigandine", "type": "ARMOR", "copy-from": "lc_greaves_brigandine", - "name": { "str": "XL pair of mild steel splint greaves", "str_pl": "XL pairs of mild steel splint greaves" }, + "name": { "str": "pair of mild steel splint greaves", "str_pl": "pairs of mild steel splint greaves" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_lc_greaves_brigandine", "type": "ARMOR", "copy-from": "lc_greaves_brigandine", - "name": { "str": "XS pair of mild steel splint greaves", "str_pl": "XS pairs of mild steel splint greaves" }, + "name": { "str": "pair of mild steel splint greaves", "str_pl": "pairs of mild steel splint greaves" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "mc_greaves_brigandine", @@ -1171,17 +1153,17 @@ "id": "xl_mc_greaves_brigandine", "type": "ARMOR", "copy-from": "mc_greaves_brigandine", - "name": { "str": "XL pair of medium steel splint greaves", "str_pl": "XL pairs of medium steel splint greaves" }, + "name": { "str": "pair of medium steel splint greaves", "str_pl": "pairs of medium steel splint greaves" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_mc_greaves_brigandine", "type": "ARMOR", "copy-from": "mc_greaves_brigandine", - "name": { "str": "XS pair of medium steel splint greaves", "str_pl": "XS pairs of medium steel splint greaves" }, + "name": { "str": "pair of medium steel splint greaves", "str_pl": "pairs of medium steel splint greaves" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "hc_greaves_brigandine", @@ -1194,17 +1176,17 @@ "id": "xl_hc_greaves_brigandine", "type": "ARMOR", "copy-from": "hc_greaves_brigandine", - "name": { "str": "XL pair of high steel splint greaves", "str_pl": "XL pairs of high steel splint greaves" }, + "name": { "str": "pair of high steel splint greaves", "str_pl": "pairs of high steel splint greaves" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_hc_greaves_brigandine", "type": "ARMOR", "copy-from": "hc_greaves_brigandine", - "name": { "str": "XS pair of high steel splint greaves", "str_pl": "XS pairs of high steel splint greaves" }, + "name": { "str": "pair of high steel splint greaves", "str_pl": "pairs of high steel splint greaves" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "ch_greaves_brigandine", @@ -1217,17 +1199,17 @@ "id": "xl_ch_greaves_brigandine", "type": "ARMOR", "copy-from": "ch_greaves_brigandine", - "name": { "str": "XL pair of hardened splint greaves", "str_pl": "XL pairs of hardened splint greaves" }, + "name": { "str": "pair of hardened splint greaves", "str_pl": "pairs of hardened splint greaves" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_ch_greaves_brigandine", "type": "ARMOR", "copy-from": "ch_greaves_brigandine", - "name": { "str": "XS pair of hardened splint greaves", "str_pl": "XS pairs of hardened splint greaves" }, + "name": { "str": "pair of hardened splint greaves", "str_pl": "pairs of hardened splint greaves" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "qt_greaves_brigandine", @@ -1240,17 +1222,17 @@ "id": "xl_qt_greaves_brigandine", "type": "ARMOR", "copy-from": "qt_greaves_brigandine", - "name": { "str": "XL pair of tempered splint greaves", "str_pl": "XL pairs of tempered splint greaves" }, + "name": { "str": "pair of tempered splint greaves", "str_pl": "pairs of tempered splint greaves" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_qt_greaves_brigandine", "type": "ARMOR", "copy-from": "qt_greaves_brigandine", - "name": { "str": "XS pair of tempered splint greaves", "str_pl": "XS pairs of tempered splint greaves" }, + "name": { "str": "pair of tempered splint greaves", "str_pl": "pairs of tempered splint greaves" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "lc_brigandine_hands", @@ -1302,17 +1284,17 @@ "id": "xl_lc_brigandine_hands", "type": "ARMOR", "copy-from": "lc_brigandine_hands", - "name": { "str": "XL pair of mild steel brigandine gloves", "str_pl": "XL pairs of mild steel brigandine gloves" }, + "name": { "str": "pair of mild steel brigandine gloves", "str_pl": "pairs of mild steel brigandine gloves" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "lc_brigandine_hands_xs", "type": "ARMOR", "copy-from": "lc_brigandine_hands", - "name": { "str": "XS pair of mild steel brigandine gloves", "str_pl": "XS pairs of mild steel brigandine gloves" }, + "name": { "str": "pair of mild steel brigandine gloves", "str_pl": "pairs of mild steel brigandine gloves" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "mc_brigandine_hands", @@ -1325,17 +1307,17 @@ "id": "xl_mc_brigandine_hands", "type": "ARMOR", "copy-from": "mc_brigandine_hands", - "name": { "str": "XL pair of medium steel brigandine gloves", "str_pl": "XL pairs of medium steel brigandine gloves" }, + "name": { "str": "pair of medium steel brigandine gloves", "str_pl": "pairs of medium steel brigandine gloves" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "mc_brigandine_hands_xs", "type": "ARMOR", "copy-from": "mc_brigandine_hands", - "name": { "str": "XS pair of medium steel brigandine gloves", "str_pl": "XS pairs of medium steel brigandine gloves" }, + "name": { "str": "pair of medium steel brigandine gloves", "str_pl": "pairs of medium steel brigandine gloves" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "hc_brigandine_hands", @@ -1348,17 +1330,17 @@ "id": "xl_hc_brigandine_hands", "type": "ARMOR", "copy-from": "hc_brigandine_hands", - "name": { "str": "XL pair of high steel brigandine gloves", "str_pl": "XL pairs of high steel brigandine gloves" }, + "name": { "str": "pair of high steel brigandine gloves", "str_pl": "pairs of high steel brigandine gloves" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "hc_brigandine_hands_xs", "type": "ARMOR", "copy-from": "hc_brigandine_hands", - "name": { "str": "XS pair of high steel brigandine gloves", "str_pl": "XS pairs of high steel brigandine gloves" }, + "name": { "str": "pair of high steel brigandine gloves", "str_pl": "pairs of high steel brigandine gloves" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "ch_brigandine_hands", @@ -1371,17 +1353,17 @@ "id": "xl_ch_brigandine_hands", "type": "ARMOR", "copy-from": "ch_brigandine_hands", - "name": { "str": "XL pair of hardened brigandine gloves", "str_pl": "XL pairs of hardened brigandine gloves" }, + "name": { "str": "pair of hardened brigandine gloves", "str_pl": "pairs of hardened brigandine gloves" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "ch_brigandine_hands_xs", "type": "ARMOR", "copy-from": "ch_brigandine_hands", - "name": { "str": "XS pair of hardened brigandine gloves", "str_pl": "XS pairs of hardened brigandine gloves" }, + "name": { "str": "pair of hardened brigandine gloves", "str_pl": "pairs of hardened brigandine gloves" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "qt_brigandine_hands", @@ -1394,17 +1376,17 @@ "id": "xl_qt_brigandine_hands", "type": "ARMOR", "copy-from": "qt_brigandine_hands", - "name": { "str": "XL pair of tempered brigandine gloves", "str_pl": "XL pairs of tempered brigandine gloves" }, + "name": { "str": "pair of tempered brigandine gloves", "str_pl": "pairs of tempered brigandine gloves" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "qt_brigandine_hands_xs", "type": "ARMOR", "copy-from": "qt_brigandine_hands", - "name": { "str": "XS pair of tempered brigandine gloves", "str_pl": "XS pairs of tempered brigandine gloves" }, + "name": { "str": "pair of tempered brigandine gloves", "str_pl": "pairs of tempered brigandine gloves" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "lc_knee_guards", @@ -1439,17 +1421,17 @@ "id": "xl_lc_knee_guards", "type": "ARMOR", "copy-from": "lc_knee_guards", - "name": { "str": "XL pair of mild steel knee guards", "str_pl": "XL pairs of mild steel knee guards" }, + "name": { "str": "pair of mild steel knee guards", "str_pl": "pairs of mild steel knee guards" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "lc_knee_guards_xs", "type": "ARMOR", "copy-from": "lc_knee_guards", - "name": { "str": "XS pair of mild steel knee guards", "str_pl": "XS pairs of mild steel knee guards" }, + "name": { "str": "pair of mild steel knee guards", "str_pl": "pairs of mild steel knee guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "mc_knee_guards", @@ -1462,17 +1444,17 @@ "id": "xl_mc_knee_guards", "type": "ARMOR", "copy-from": "mc_knee_guards", - "name": { "str": "XL pair of medium steel knee guards", "str_pl": "XL pairs of medium steel knee guards" }, + "name": { "str": "pair of medium steel knee guards", "str_pl": "pairs of medium steel knee guards" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "mc_knee_guards_xs", "type": "ARMOR", "copy-from": "mc_knee_guards", - "name": { "str": "XS pair of medium steel knee guards", "str_pl": "XS pairs of medium steel knee guards" }, + "name": { "str": "pair of medium steel knee guards", "str_pl": "pairs of medium steel knee guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "hc_knee_guards", @@ -1485,17 +1467,17 @@ "id": "xl_hc_knee_guards", "type": "ARMOR", "copy-from": "hc_knee_guards", - "name": { "str": "XL pair of high steel knee guards", "str_pl": "XL pairs of high steel knee guards" }, + "name": { "str": "pair of high steel knee guards", "str_pl": "pairs of high steel knee guards" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "hc_knee_guards_xs", "type": "ARMOR", "copy-from": "hc_knee_guards", - "name": { "str": "XS pair of high steel knee guards", "str_pl": "XS pairs of high steel knee guards" }, + "name": { "str": "pair of high steel knee guards", "str_pl": "pairs of high steel knee guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "ch_knee_guards", @@ -1508,17 +1490,17 @@ "id": "xl_ch_knee_guards", "type": "ARMOR", "copy-from": "ch_knee_guards", - "name": { "str": "XL pair of hardened knee guards", "str_pl": "XL pairs of hardened knee guards" }, + "name": { "str": "pair of hardened knee guards", "str_pl": "pairs of hardened knee guards" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "ch_knee_guards_xs", "type": "ARMOR", "copy-from": "ch_knee_guards", - "name": { "str": "XS pair of hardened knee guards", "str_pl": "XS pairs of hardened knee guards" }, + "name": { "str": "pair of hardened knee guards", "str_pl": "pairs of hardened knee guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "qt_knee_guards", @@ -1531,17 +1513,17 @@ "id": "xl_qt_knee_guards", "type": "ARMOR", "copy-from": "qt_knee_guards", - "name": { "str": "XL pair of tempered knee guards", "str_pl": "XL pairs of tempered knee guards" }, + "name": { "str": "pair of tempered knee guards", "str_pl": "pairs of tempered knee guards" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "qt_knee_guards_xs", "type": "ARMOR", "copy-from": "qt_knee_guards", - "name": { "str": "XS pair of tempered knee guards", "str_pl": "XS pairs of tempered knee guards" }, + "name": { "str": "pair of tempered knee guards", "str_pl": "pairs of tempered knee guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "lc_elbow_guards", @@ -1576,17 +1558,17 @@ "id": "xl_lc_elbow_guards", "type": "ARMOR", "copy-from": "lc_elbow_guards", - "name": { "str": "XL pair of mild steel elbow guards", "str_pl": "XL pairs of mild steel elbow guards" }, + "name": { "str": "pair of mild steel elbow guards", "str_pl": "pairs of mild steel elbow guards" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "lc_elbow_guards_xs", "type": "ARMOR", "copy-from": "lc_elbow_guards", - "name": { "str": "XS pair of mild steel elbow guards", "str_pl": "XS pairs of mild steel elbow guards" }, + "name": { "str": "pair of mild steel elbow guards", "str_pl": "pairs of mild steel elbow guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "mc_elbow_guards", @@ -1599,17 +1581,17 @@ "id": "xl_mc_elbow_guards", "type": "ARMOR", "copy-from": "mc_elbow_guards", - "name": { "str": "XL pair of medium steel elbow guards", "str_pl": "XL pairs of medium steel elbow guards" }, + "name": { "str": "pair of medium steel elbow guards", "str_pl": "pairs of medium steel elbow guards" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "mc_elbow_guards_xs", "type": "ARMOR", "copy-from": "mc_elbow_guards", - "name": { "str": "XS pair of medium steel elbow guards", "str_pl": "XS pairs of medium steel elbow guards" }, + "name": { "str": "pair of medium steel elbow guards", "str_pl": "pairs of medium steel elbow guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "hc_elbow_guards", @@ -1622,17 +1604,17 @@ "id": "xl_hc_elbow_guards", "type": "ARMOR", "copy-from": "hc_elbow_guards", - "name": { "str": "XL pair of high steel elbow guards", "str_pl": "XL pairs of high steel elbow guards" }, + "name": { "str": "pair of high steel elbow guards", "str_pl": "pairs of high steel elbow guards" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "hc_elbow_guards_xs", "type": "ARMOR", "copy-from": "hc_elbow_guards", - "name": { "str": "XS pair of high steel elbow guards", "str_pl": "XS pairs of high steel elbow guards" }, + "name": { "str": "pair of high steel elbow guards", "str_pl": "pairs of high steel elbow guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "ch_elbow_guards", @@ -1645,17 +1627,17 @@ "id": "xl_ch_elbow_guards", "type": "ARMOR", "copy-from": "ch_elbow_guards", - "name": { "str": "XL pair of hardened elbow guards", "str_pl": "XL pairs of hardened elbow guards" }, + "name": { "str": "pair of hardened elbow guards", "str_pl": "pairs of hardened elbow guards" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "ch_elbow_guards_xs", "type": "ARMOR", "copy-from": "ch_elbow_guards", - "name": { "str": "XS pair of hardened elbow guards", "str_pl": "XS pairs of hardened elbow guards" }, + "name": { "str": "pair of hardened elbow guards", "str_pl": "pairs of hardened elbow guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "qt_elbow_guards", @@ -1668,17 +1650,17 @@ "id": "xl_qt_elbow_guards", "type": "ARMOR", "copy-from": "qt_elbow_guards", - "name": { "str": "XL pair of tempered elbow guards", "str_pl": "XL pairs of tempered elbow guards" }, + "name": { "str": "pair of tempered elbow guards", "str_pl": "pairs of tempered elbow guards" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "qt_elbow_guards_xs", "type": "ARMOR", "copy-from": "qt_elbow_guards", - "name": { "str": "XS pair of tempered elbow guards", "str_pl": "XS pairs of tempered elbow guards" }, + "name": { "str": "pair of tempered elbow guards", "str_pl": "pairs of tempered elbow guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "lc_shoulder_guards", @@ -1698,15 +1680,17 @@ "id": "xl_lc_shoulder_guards", "type": "GENERIC", "copy-from": "lc_shoulder_guards", - "name": { "str": "XL pair of mild steel shoulder guards", "str_pl": "XL pairs of mild steel shoulder guards" }, - "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 } + "name": { "str": "pair of mild steel shoulder guards", "str_pl": "pairs of mild steel shoulder guards" }, + "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, + "extend": { "flags": [ "PREFIX_XL" ] } }, { "id": "lc_shoulder_guards_xs", "type": "GENERIC", "copy-from": "lc_shoulder_guards", - "name": { "str": "XS pair of mild steel shoulder guards", "str_pl": "XS pairs of mild steel shoulder guards" }, - "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 } + "name": { "str": "pair of mild steel shoulder guards", "str_pl": "pairs of mild steel shoulder guards" }, + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "PREFIX_XS" ] } }, { "id": "mc_shoulder_guards", @@ -1719,15 +1703,17 @@ "id": "xl_mc_shoulder_guards", "type": "GENERIC", "copy-from": "mc_shoulder_guards", - "name": { "str": "XL pair of medium steel shoulder guards", "str_pl": "XL pairs of medium steel shoulder guards" }, - "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 } + "name": { "str": "pair of medium steel shoulder guards", "str_pl": "pairs of medium steel shoulder guards" }, + "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, + "extend": { "flags": [ "PREFIX_XL" ] } }, { "id": "mc_shoulder_guards_xs", "type": "GENERIC", "copy-from": "mc_shoulder_guards", - "name": { "str": "XS pair of medium steel shoulder guards", "str_pl": "XS pairs of medium steel shoulder guards" }, - "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 } + "name": { "str": "pair of medium steel shoulder guards", "str_pl": "pairs of medium steel shoulder guards" }, + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "PREFIX_XS" ] } }, { "id": "hc_shoulder_guards", @@ -1740,15 +1726,17 @@ "id": "xl_hc_shoulder_guards", "type": "GENERIC", "copy-from": "hc_shoulder_guards", - "name": { "str": "XL pair of high steel shoulder guards", "str_pl": "XL pairs of high steel shoulder guards" }, - "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 } + "name": { "str": "pair of high steel shoulder guards", "str_pl": "pairs of high steel shoulder guards" }, + "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, + "extend": { "flags": [ "PREFIX_XL" ] } }, { "id": "hc_shoulder_guards_xs", "type": "GENERIC", "copy-from": "hc_shoulder_guards", - "name": { "str": "XS pair of high steel shoulder guards", "str_pl": "XS pairs of high steel shoulder guards" }, - "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 } + "name": { "str": "pair of high steel shoulder guards", "str_pl": "pairs of high steel shoulder guards" }, + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "PREFIX_XS" ] } }, { "id": "ch_shoulder_guards", @@ -1761,15 +1749,17 @@ "id": "xl_ch_shoulder_guards", "type": "GENERIC", "copy-from": "ch_shoulder_guards", - "name": { "str": "XL pair of hardened shoulder guards", "str_pl": "XL pairs of hardened shoulder guards" }, - "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 } + "name": { "str": "pair of hardened shoulder guards", "str_pl": "pairs of hardened shoulder guards" }, + "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, + "extend": { "flags": [ "PREFIX_XL" ] } }, { "id": "ch_shoulder_guards_xs", "type": "GENERIC", "copy-from": "ch_shoulder_guards", - "name": { "str": "XS pair of hardened shoulder guards", "str_pl": "XS pairs of hardened shoulder guards" }, - "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 } + "name": { "str": "pair of hardened shoulder guards", "str_pl": "pairs of hardened shoulder guards" }, + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "PREFIX_XS" ] } }, { "id": "qt_shoulder_guards", @@ -1782,14 +1772,16 @@ "id": "xl_qt_shoulder_guards", "type": "GENERIC", "copy-from": "qt_shoulder_guards", - "name": { "str": "XL pair of tempered shoulder guards", "str_pl": "XL pairs of tempered shoulder guards" }, - "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 } + "name": { "str": "pair of tempered shoulder guards", "str_pl": "pairs of tempered shoulder guards" }, + "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, + "extend": { "flags": [ "PREFIX_XL" ] } }, { "id": "qt_shoulder_guards_xs", "type": "GENERIC", "copy-from": "qt_shoulder_guards", - "name": { "str": "XS pair of tempered shoulder guards", "str_pl": "XS pairs of tempered shoulder guards" }, - "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 } + "name": { "str": "pair of tempered shoulder guards", "str_pl": "pairs of tempered shoulder guards" }, + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "extend": { "flags": [ "PREFIX_XS" ] } } ] diff --git a/data/json/items/armor/coats.json b/data/json/items/armor/coats.json index 3d5a4184fb23f..dd5aece7701d3 100644 --- a/data/json/items/armor/coats.json +++ b/data/json/items/armor/coats.json @@ -211,18 +211,18 @@ { "id": "xl_coat_fur", "type": "ARMOR", - "name": { "str": "XL fur coat" }, + "name": { "str": "fur coat" }, "copy-from": "coat_fur", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_coat_fur", "type": "ARMOR", "copy-from": "coat_fur", - "name": { "str": "XS fur coat" }, + "name": { "str": "fur coat" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "coat_faux_fur", @@ -239,18 +239,18 @@ { "id": "xl_coat_faux_fur", "type": "ARMOR", - "name": { "str": "XL faux fur coat" }, + "name": { "str": "faux fur coat" }, "copy-from": "coat_faux_fur", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_coat_faux_fur", "type": "ARMOR", "copy-from": "coat_faux_fur", - "name": { "str": "XS faux fur coat" }, + "name": { "str": "faux fur coat" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "coat_lab", @@ -582,34 +582,34 @@ { "id": "xl_duster_fur", "type": "ARMOR", - "name": { "str": "XL fur duster" }, + "name": { "str": "fur duster" }, "copy-from": "duster_fur", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_duster_fur", "type": "ARMOR", "copy-from": "duster_fur", - "name": { "str": "XS fur duster" }, + "name": { "str": "fur duster" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "xl_duster", "type": "ARMOR", - "name": { "str": "XL duster" }, + "name": { "str": "duster" }, "copy-from": "duster", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_duster", "type": "ARMOR", "copy-from": "duster", - "name": { "str": "XS duster" }, + "name": { "str": "duster" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "duster_faux_fur", @@ -625,18 +625,18 @@ { "id": "xl_duster_faux_fur", "type": "ARMOR", - "name": { "str": "XL faux fur duster" }, + "name": { "str": "faux fur duster" }, "copy-from": "duster_faux_fur", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_duster_faux_fur", "type": "ARMOR", "copy-from": "duster_faux_fur", - "name": { "str": "XS faux fur duster" }, + "name": { "str": "faux fur duster" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "duster_leather", @@ -715,18 +715,18 @@ { "id": "xl_duster_leather", "type": "ARMOR", - "name": { "str": "XL leather duster" }, + "name": { "str": "leather duster" }, "copy-from": "duster_leather", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_duster_leather", "type": "ARMOR", "copy-from": "duster_leather", - "name": { "str": "XS leather duster" }, + "name": { "str": "leather duster" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "greatcoat", diff --git a/data/json/items/armor/gambesons.json b/data/json/items/armor/gambesons.json index e77cd08f543ca..1e7820ad4c1ac 100644 --- a/data/json/items/armor/gambesons.json +++ b/data/json/items/armor/gambesons.json @@ -50,19 +50,18 @@ { "id": "xl_gambeson", "type": "ARMOR", - "name": { "str": "XL gambeson" }, "copy-from": "gambeson", + "name": { "str": "padded gambeson" }, "proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "gambeson_xs", "type": "ARMOR", "copy-from": "gambeson", - "looks_like": "gambeson", - "name": { "str": "XS gambeson" }, + "name": { "str": "padded gambeson" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "gambeson_vest", @@ -105,24 +104,23 @@ { "id": "xl_gambeson_vest", "type": "ARMOR", - "name": { "str": "XL gambeson vest" }, + "name": { "str": "padded gambeson vest" }, "copy-from": "gambeson_vest", "proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "gambeson_vest_xs", "type": "ARMOR", "copy-from": "gambeson_vest", - "looks_like": "gambeson", - "name": { "str": "XS gambeson vest" }, + "name": { "str": "padded gambeson vest" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "gambeson_pants", "type": "ARMOR", - "name": { "str_sp": "padded arming pants" }, + "name": { "str": "padded arming pants", "str_pl": "pairs of padded arming pants" }, "description": "Thick pants made of quilted fabric, meant to be worn alongside a gambeson under or without armor.", "weight": "2736 g", "volume": "1750 ml", @@ -150,18 +148,18 @@ { "id": "xl_gambeson_pants", "type": "ARMOR", - "name": { "str": "XL arming pants", "str_pl": "pairs of XL arming pants" }, + "name": { "str": "padded arming pants", "str_pl": "pairs of padded arming pants" }, "copy-from": "gambeson_pants", "proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "gambeson_pants_xs", "type": "ARMOR", - "name": { "str": "XL arming pants", "str_pl": "pairs of XL arming pants" }, + "name": { "str": "padded arming pants", "str_pl": "pairs of padded arming pants" }, "copy-from": "gambeson_pants", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "gambeson_hood", @@ -198,19 +196,19 @@ "id": "xl_gambeson_hood", "//": "surface area of XL body assumed to be 50% greater and materials used are also 50% greater.", "type": "ARMOR", - "name": { "str": "XL padded coif" }, + "name": { "str": "padded coif" }, "copy-from": "gambeson_hood", "proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_gambeson_hood", - "//": "surface area of XL body assumed to be 75% size and materials used are also 75% as much.", + "//": "surface area of XS body assumed to be 75% size and materials used are also 75% as much.", "type": "ARMOR", - "name": { "str": "XS padded coif" }, + "name": { "str": "padded coif" }, "copy-from": "gambeson_hood", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "aketon_canvas", @@ -259,19 +257,19 @@ "id": "xl_aketon_canvas", "//": "surface area of XL body assumed to be 50% greater and materials used are also 50% greater.", "type": "ARMOR", - "name": { "str": "XL canvas aketon" }, + "name": { "str": "canvas aketon" }, "copy-from": "aketon_canvas", "proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_aketon_canvas", - "//": "surface area of XL body assumed to be 75% size and materials used are also 75% as much.", + "//": "surface area of XS body assumed to be 75% size and materials used are also 75% as much.", "type": "ARMOR", - "name": { "str": "XS canvas aketon" }, + "name": { "str": "canvas aketon" }, "copy-from": "aketon_canvas", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "aketon_canvas_vest", @@ -308,19 +306,19 @@ "id": "xl_aketon_canvas_vest", "//": "surface area of XL body assumed to be 50% greater and materials used are also 50% greater.", "type": "ARMOR", - "name": { "str": "XL canvas aketon vest" }, + "name": { "str": "canvas aketon vest" }, "copy-from": "aketon_canvas_vest", "proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_aketon_canvas_vest", - "//": "surface area of XL body assumed to be 75% size and materials used are also 75% as much.", + "//": "surface area of XS body assumed to be 75% size and materials used are also 75% as much.", "type": "ARMOR", - "name": { "str": "XS canvas aketon vest" }, + "name": { "str": "canvas aketon vest" }, "copy-from": "aketon_canvas_vest", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "aketon_pants_canvas", @@ -357,19 +355,19 @@ "id": "xl_aketon_pants_canvas", "//": "surface area of XL body assumed to be 50% greater and materials used are also 50% greater.", "type": "ARMOR", - "name": { "str": "XL canvas arming pants", "str_pl": "pairs of XL canvas arming pants" }, + "name": { "str": "canvas arming pants", "str_pl": "pairs of canvas arming pants" }, "copy-from": "aketon_pants_canvas", "proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_aketon_pants_canvas", - "//": "surface area of XL body assumed to be 75% size and materials used are also 75% as much.", + "//": "surface area of XS body assumed to be 75% size and materials used are also 75% as much.", "type": "ARMOR", - "name": { "str": "XS canvas arming pants", "str_pl": "pairs of XS canvas arming pants" }, + "name": { "str": "canvas arming pants", "str_pl": "pairs of canvas arming pants" }, "copy-from": "aketon_pants_canvas", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "aketon_hood_canvas", @@ -407,19 +405,19 @@ "id": "xl_aketon_hood_canvas", "//": "surface area of XL body assumed to be 50% greater and materials used are also 50% greater.", "type": "ARMOR", - "name": { "str": "XL canvas coif" }, + "name": { "str": "canvas coif" }, "copy-from": "aketon_hood_canvas", "proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_aketon_hood_canvas", - "//": "surface area of XL body assumed to be 75% size and materials used are also 75% as much.", + "//": "surface area of XS body assumed to be 75% size and materials used are also 75% as much.", "type": "ARMOR", - "name": { "str": "XS canvas coif" }, + "name": { "str": "canvas coif" }, "copy-from": "aketon_hood_canvas", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "aketon_gloves_canvas", @@ -456,19 +454,19 @@ "id": "xl_aketon_gloves_canvas", "//": "surface area of XL body assumed to be 50% greater and materials used are also 50% greater.", "type": "ARMOR", - "name": { "str": "XL canvas arming gloves", "str_pl": "pairs of XL canvas arming gloves" }, + "name": { "str": "canvas arming gloves", "str_pl": "pairs of canvas arming gloves" }, "copy-from": "aketon_gloves_canvas", "proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_aketon_gloves_canvas", - "//": "surface area of XL body assumed to be 75% size and materials used are also 75% as much.", + "//": "surface area of XS body assumed to be 75% size and materials used are also 75% as much.", "type": "ARMOR", - "name": { "str": "XS canvas arming gloves", "str_pl": "pairs of XS canvas arming gloves" }, + "name": { "str": "canvas arming gloves", "str_pl": "pairs of canvas arming gloves" }, "copy-from": "aketon_gloves_canvas", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "gambeson_canvas", @@ -528,19 +526,19 @@ "id": "xl_gambeson_canvas", "//": "surface area of XL body assumed to be 50% greater and materials used are also 50% greater.", "type": "ARMOR", - "name": { "str": "XL canvas gambeson" }, + "name": { "str": "canvas gambeson" }, "copy-from": "gambeson_canvas", "proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_gambeson_canvas", - "//": "surface area of XL body assumed to be 75% size and materials used are also 75% as much.", + "//": "surface area of XS body assumed to be 75% size and materials used are also 75% as much.", "type": "ARMOR", - "name": { "str": "XS canvas gambeson" }, + "name": { "str": "canvas gambeson" }, "copy-from": "gambeson_canvas", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "gambeson_canvas_thinsleeved", @@ -601,19 +599,19 @@ "id": "xl_gambeson_canvas_thinsleeved", "//": "surface area of XL body assumed to be 50% greater and materials used are also 50% greater.", "type": "ARMOR", - "name": { "str": "XL thin-sleeved canvas gambeson" }, + "name": { "str": "thin-sleeved canvas gambeson" }, "copy-from": "gambeson_canvas_thinsleeved", "proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_gambeson_canvas_thinsleeved", - "//": "surface area of XL body assumed to be 75% size and materials used are also 75% as much.", + "//": "surface area of XS body assumed to be 75% size and materials used are also 75% as much.", "type": "ARMOR", - "name": { "str": "XS thin-sleeved canvas gambeson" }, + "name": { "str": "thin-sleeved canvas gambeson" }, "copy-from": "gambeson_canvas_thinsleeved", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "gambeson_canvas_vest", @@ -662,19 +660,19 @@ "id": "xl_gambeson_canvas_vest", "//": "surface area of XL body assumed to be 50% greater and materials used are also 50% greater.", "type": "ARMOR", - "name": { "str": "XL sleeveless canvas gambeson" }, + "name": { "str": "sleeveless canvas gambeson" }, "copy-from": "gambeson_canvas_vest", "proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_gambeson_canvas_vest", - "//": "surface area of XL body assumed to be 75% size and materials used are also 75% as much.", + "//": "surface area of XS body assumed to be 75% size and materials used are also 75% as much.", "type": "ARMOR", - "name": { "str": "XS sleeveless canvas gambeson" }, + "name": { "str": "sleeveless canvas gambeson" }, "copy-from": "gambeson_canvas_vest", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "gambeson_pants_canvas", @@ -711,19 +709,19 @@ "id": "xl_gambeson_pants_canvas", "//": "surface area of XL body assumed to be 50% greater and materials used are also 50% greater.", "type": "ARMOR", - "name": { "str": "XL canvas heavy arming pants", "str_pl": "pairs of XL canvas heavy arming pants" }, + "name": { "str": "canvas heavy arming pants", "str_pl": "pairs of canvas heavy arming pants" }, "copy-from": "gambeson_pants_canvas", "proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_gambeson_pants_canvas", - "//": "surface area of XL body assumed to be 75% size and materials used are also 75% as much.", + "//": "surface area of XS body assumed to be 75% size and materials used are also 75% as much.", "type": "ARMOR", - "name": { "str": "XS canvas heavy arming pants", "str_pl": "pairs of XS canvas heavy arming pants" }, + "name": { "str": "canvas heavy arming pants", "str_pl": "pairs of canvas heavy arming pants" }, "copy-from": "gambeson_pants_canvas", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "gambeson_gloves_canvas", @@ -778,19 +776,19 @@ "id": "xl_gambeson_gloves_canvas", "//": "surface area of XL body assumed to be 50% greater and materials used are also 50% greater.", "type": "ARMOR", - "name": { "str": "XL canvas arming mittens", "str_pl": "pairs of XL canvas arming mittens" }, + "name": { "str": "canvas arming mittens", "str_pl": "pairs of canvas arming mittens" }, "copy-from": "gambeson_gloves_canvas", "proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_gambeson_gloves_canvas", - "//": "surface area of XL body assumed to be 75% size and materials used are also 75% as much.", + "//": "surface area of XS body assumed to be 75% size and materials used are also 75% as much.", "type": "ARMOR", - "name": { "str": "XS canvas arming mittens", "str_pl": "pairs of XS canvas arming mittens" }, + "name": { "str": "canvas arming mittens", "str_pl": "pairs of canvas arming mittens" }, "copy-from": "gambeson_gloves_canvas", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "aketon_nylon", @@ -839,19 +837,19 @@ "id": "xl_aketon_nylon", "//": "surface area of XL body assumed to be 50% greater and materials used are also 50% greater.", "type": "ARMOR", - "name": { "str": "XL nylon aketon" }, + "name": { "str": "nylon aketon" }, "copy-from": "aketon_nylon", "proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_aketon_nylon", - "//": "surface area of XL body assumed to be 75% size and materials used are also 75% as much.", + "//": "surface area of XS body assumed to be 75% size and materials used are also 75% as much.", "type": "ARMOR", - "name": { "str": "XS nylon aketon" }, + "name": { "str": "nylon aketon" }, "copy-from": "aketon_nylon", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "aketon_nylon_vest", @@ -888,19 +886,19 @@ "id": "xl_aketon_nylon_vest", "//": "surface area of XL body assumed to be 50% greater and materials used are also 50% greater.", "type": "ARMOR", - "name": { "str": "XL nylon aketon vest" }, + "name": { "str": "nylon aketon vest" }, "copy-from": "aketon_nylon_vest", "proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_aketon_nylon_vest", - "//": "surface area of XL body assumed to be 75% size and materials used are also 75% as much.", + "//": "surface area of XS body assumed to be 75% size and materials used are also 75% as much.", "type": "ARMOR", - "name": { "str": "XS nylon aketon vest" }, + "name": { "str": "nylon aketon vest" }, "copy-from": "aketon_canvas_vest", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "aketon_pants_nylon", @@ -937,19 +935,19 @@ "id": "xl_aketon_pants_nylon", "//": "surface area of XL body assumed to be 50% greater and materials used are also 50% greater.", "type": "ARMOR", - "name": { "str": "XL nylon arming pants", "str_pl": "pairs of XL nylon arming pants" }, + "name": { "str": "nylon arming pants", "str_pl": "pairs of nylon arming pants" }, "copy-from": "aketon_pants_nylon", "proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_aketon_pants_nylon", - "//": "surface area of XL body assumed to be 75% size and materials used are also 75% as much.", + "//": "surface area of XS body assumed to be 75% size and materials used are also 75% as much.", "type": "ARMOR", - "name": { "str": "XS nylon arming pants", "str_pl": "pairs of XS nylon arming pants" }, + "name": { "str": "nylon arming pants", "str_pl": "pairs of nylon arming pants" }, "copy-from": "aketon_pants_nylon", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "aketon_hood_nylon", @@ -987,19 +985,19 @@ "id": "xl_aketon_hood_nylon", "//": "surface area of XL body assumed to be 50% greater and materials used are also 50% greater.", "type": "ARMOR", - "name": { "str": "XL nylon coif" }, + "name": { "str": "nylon coif" }, "copy-from": "aketon_hood_canvas", "proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_aketon_hood_nylon", - "//": "surface area of XL body assumed to be 75% size and materials used are also 75% as much.", + "//": "surface area of XS body assumed to be 75% size and materials used are also 75% as much.", "type": "ARMOR", - "name": { "str": "XS nylon coif" }, + "name": { "str": "nylon coif" }, "copy-from": "aketon_hood_canvas", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "aketon_gloves_nylon", @@ -1036,19 +1034,19 @@ "id": "xl_aketon_gloves_nylon", "//": "surface area of XL body assumed to be 50% greater and materials used are also 50% greater.", "type": "ARMOR", - "name": { "str": "XL nylon arming gloves", "str_pl": "pairs of XL nylon arming gloves" }, + "name": { "str": "nylon arming gloves", "str_pl": "pairs of nylon arming gloves" }, "copy-from": "aketon_gloves_nylon", "proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_aketon_gloves_nylon", - "//": "surface area of XL body assumed to be 75% size and materials used are also 75% as much.", + "//": "surface area of XS body assumed to be 75% size and materials used are also 75% as much.", "type": "ARMOR", - "name": { "str": "XS nylon arming gloves", "str_pl": "pairs of XS nylon arming gloves" }, + "name": { "str": "nylon arming gloves", "str_pl": "pairs of nylon arming gloves" }, "copy-from": "aketon_gloves_nylon", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "gambeson_nylon", @@ -1108,19 +1106,19 @@ "id": "xl_gambeson_nylon", "//": "surface area of XL body assumed to be 50% greater and materials used are also 50% greater.", "type": "ARMOR", - "name": { "str": "XL nylon gambeson" }, + "name": { "str": "nylon gambeson" }, "copy-from": "gambeson_nylon", "proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_gambeson_nylon", - "//": "surface area of XL body assumed to be 75% size and materials used are also 75% as much.", + "//": "surface area of XS body assumed to be 75% size and materials used are also 75% as much.", "type": "ARMOR", - "name": { "str": "XS nylon gambeson" }, + "name": { "str": "nylon gambeson" }, "copy-from": "gambeson_nylon", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "gambeson_nylon_thinsleeved", @@ -1131,7 +1129,7 @@ "//3": "8 layers thick waist. human waist is about 3ft circumference with the extra padding, and reaches to about below knees. doesn't usually cover the whole circumference so guessing about 1.5x2.5x8 total surface area divided by 1x2 ft for about 15-18 extra sheets, about 810g if 15 sheets.", "//4": "5670g + 972g + 810g = 7452g combined", "type": "ARMOR", - "name": { "str": "nylon thin-sleeved gambeson" }, + "name": { "str": "thin-sleeved nylon gambeson" }, "description": "A thick cloth greatcoat intended to be worn as standalone armor, as it's a little too thick to comfortably add chainmail or a cuirass on top. Made of thirty layers of tough nylon, this will protect you from almost everything, but it's very heavy and warm. The sleeves are a lot thinner for flexibility and it drapes below your legs, providing additional protection there.", "weight": "7452 g", "volume": "7000 ml", @@ -1181,19 +1179,19 @@ "id": "xl_gambeson_nylon_thinsleeved", "//": "surface area of XL body assumed to be 50% greater and materials used are also 50% greater.", "type": "ARMOR", - "name": { "str": "XL thin-sleeved nylon gambeson" }, + "name": { "str": "thin-sleeved nylon gambeson" }, "copy-from": "gambeson_nylon_thinsleeved", "proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_gambeson_nylon_thinsleeved", - "//": "surface area of XL body assumed to be 75% size and materials used are also 75% as much.", + "//": "surface area of XS body assumed to be 75% size and materials used are also 75% as much.", "type": "ARMOR", - "name": { "str": "XS thin-sleeved nylon gambeson" }, + "name": { "str": "thin-sleeved nylon gambeson" }, "copy-from": "gambeson_nylon_thinsleeved", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "gambeson_nylon_vest", @@ -1203,7 +1201,7 @@ "//2": "8 layers thick waist. human waist is about 3ft circumference with the extra padding, and reaches to about below knees. doesn't usually cover the whole circumference so guessing about 1.5x2.5x8 total surface area divided by 1x2 ft for about 15-18 extra sheets, about 810g if 15 sheets.", "//3": "5670g + 810g = 6480g combined", "type": "ARMOR", - "name": { "str": "nylon sleeveless gambeson" }, + "name": { "str": "sleeveless nylon gambeson" }, "description": "A thick cloth surcoat intended to be worn as standalone armor, as it's a little too thick to comfortably add chainmail or a cuirass on top. Made of thirty layers of tough nylon, this will protect you from almost everything, but it's very heavy and warm. It drapes below your legs, providing additional protection there, and it lacks sleeves entirely.", "weight": "6480 g", "volume": "6000 ml", @@ -1242,19 +1240,19 @@ "id": "xl_gambeson_nylon_vest", "//": "surface area of XL body assumed to be 50% greater and materials used are also 50% greater.", "type": "ARMOR", - "name": { "str": "XL sleeveless nylon gambeson" }, + "name": { "str": "sleeveless nylon gambeson" }, "copy-from": "gambeson_nylon_vest", "proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_gambeson_nylon_vest", - "//": "surface area of XL body assumed to be 75% size and materials used are also 75% as much.", + "//": "surface area of XS body assumed to be 75% size and materials used are also 75% as much.", "type": "ARMOR", - "name": { "str": "XS sleeveless nylon gambeson" }, + "name": { "str": "sleeveless nylon gambeson" }, "copy-from": "gambeson_nylon_vest", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "gambeson_pants_nylon", @@ -1291,19 +1289,19 @@ "id": "xl_gambeson_pants_nylon", "//": "surface area of XL body assumed to be 50% greater and materials used are also 50% greater.", "type": "ARMOR", - "name": { "str": "XL nylon heavy arming pants", "str_pl": "pairs of XL nylon heavy arming pants" }, + "name": { "str": "nylon heavy arming pants", "str_pl": "pairs of nylon heavy arming pants" }, "copy-from": "gambeson_pants_nylon", "proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_gambeson_pants_nylon", - "//": "surface area of XL body assumed to be 75% size and materials used are also 75% as much.", + "//": "surface area of XS body assumed to be 75% size and materials used are also 75% as much.", "type": "ARMOR", - "name": { "str": "XS nylon heavy arming pants", "str_pl": "pairs of XS nylon heavy arming pants" }, + "name": { "str": "nylon heavy arming pants", "str_pl": "pairs of nylon heavy arming pants" }, "copy-from": "gambeson_pants_nylon", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "gambeson_gloves_nylon", @@ -1358,19 +1356,19 @@ "id": "xl_gambeson_gloves_nylon", "//": "surface area of XL body assumed to be 50% greater and materials used are also 50% greater.", "type": "ARMOR", - "name": { "str": "XL nylon arming mittens", "str_pl": "pairs of XL canvas arming mittens" }, + "name": { "str": "nylon arming mittens", "str_pl": "pairs of nylon arming mittens" }, "copy-from": "gambeson_gloves_nylon", "proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_gambeson_gloves_nylon", - "//": "surface area of XL body assumed to be 75% size and materials used are also 75% as much.", + "//": "surface area of XS body assumed to be 75% size and materials used are also 75% as much.", "type": "ARMOR", - "name": { "str": "XS nylon arming mittens", "str_pl": "pairs of XS nylon arming mittens" }, + "name": { "str": "nylon arming mittens", "str_pl": "pairs of nylon arming mittens" }, "copy-from": "gambeson_gloves_nylon", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "aketon_wool", @@ -1420,19 +1418,19 @@ "id": "xl_aketon_wool", "//": "surface area of XL body assumed to be 50% greater and materials used are also 50% greater.", "type": "ARMOR", - "name": { "str": "XL wool aketon" }, + "name": { "str": "wool aketon" }, "copy-from": "aketon_wool", "proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_aketon_wool", - "//": "surface area of XL body assumed to be 75% size and materials used are also 75% as much.", + "//": "surface area of XS body assumed to be 75% size and materials used are also 75% as much.", "type": "ARMOR", - "name": { "str": "XS wool aketon" }, + "name": { "str": "wool aketon" }, "copy-from": "aketon_wool", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "aketon_wool_vest", @@ -1470,19 +1468,19 @@ "id": "xl_aketon_wool_vest", "//": "surface area of XL body assumed to be 50% greater and materials used are also 50% greater.", "type": "ARMOR", - "name": { "str": "XL wool aketon vest" }, + "name": { "str": "wool aketon vest" }, "copy-from": "aketon_wool_vest", "proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_aketon_wool_vest", - "//": "surface area of XL body assumed to be 75% size and materials used are also 75% as much.", + "//": "surface area of XS body assumed to be 75% size and materials used are also 75% as much.", "type": "ARMOR", - "name": { "str": "XS wool aketon vest" }, + "name": { "str": "wool aketon vest" }, "copy-from": "aketon_wool_vest", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "aketon_pants_wool", @@ -1519,19 +1517,19 @@ "id": "xl_aketon_pants_wool", "//": "surface area of XL body assumed to be 50% greater and materials used are also 50% greater.", "type": "ARMOR", - "name": { "str": "XL wool arming pants", "str_pl": "pairs of XL wool arming pants" }, + "name": { "str": "wool arming pants", "str_pl": "pairs of wool arming pants" }, "copy-from": "aketon_pants_wool", "proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_aketon_pants_wool", - "//": "surface area of XL body assumed to be 75% size and materials used are also 75% as much.", + "//": "surface area of XS body assumed to be 75% size and materials used are also 75% as much.", "type": "ARMOR", - "name": { "str": "XS wool arming pants", "str_pl": "pairs of XS wool arming pants" }, + "name": { "str": "wool arming pants", "str_pl": "pairs of wool arming pants" }, "copy-from": "aketon_pants_canvas", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "aketon_hood_wool", @@ -1570,19 +1568,19 @@ "id": "xl_aketon_hood_wool", "//": "surface area of XL body assumed to be 50% greater and materials used are also 50% greater.", "type": "ARMOR", - "name": { "str": "XL wool coif" }, + "name": { "str": "wool coif" }, "copy-from": "aketon_hood_wool", "proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_aketon_hood_wool", - "//": "surface area of XL body assumed to be 75% size and materials used are also 75% as much.", + "//": "surface area of XS body assumed to be 75% size and materials used are also 75% as much.", "type": "ARMOR", - "name": { "str": "XS wool coif" }, + "name": { "str": "wool coif" }, "copy-from": "aketon_hood_wool", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "aketon_gloves_wool", @@ -1620,19 +1618,19 @@ "id": "xl_aketon_gloves_wool", "//": "surface area of XL body assumed to be 50% greater and materials used are also 50% greater.", "type": "ARMOR", - "name": { "str": "XL wool arming gloves", "str_pl": "pairs of XL wool arming gloves" }, + "name": { "str": "wool arming gloves", "str_pl": "pairs of wool arming gloves" }, "copy-from": "aketon_gloves_wool", "proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_aketon_gloves_wool", - "//": "surface area of XL body assumed to be 75% size and materials used are also 75% as much.", + "//": "surface area of XS body assumed to be 75% size and materials used are also 75% as much.", "type": "ARMOR", - "name": { "str": "XS wool arming gloves", "str_pl": "pairs of XS wool arming gloves" }, + "name": { "str": "wool arming gloves", "str_pl": "pairs of wool arming gloves" }, "copy-from": "aketon_gloves_wool", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "gambeson_wool", @@ -1693,19 +1691,19 @@ "id": "xl_gambeson_wool", "//": "surface area of XL body assumed to be 50% greater and materials used are also 50% greater.", "type": "ARMOR", - "name": { "str": "XL wool gambeson" }, + "name": { "str": "wool gambeson" }, "copy-from": "gambeson_wool", "proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_gambeson_wool", - "//": "surface area of XL body assumed to be 75% size and materials used are also 75% as much.", + "//": "surface area of XS body assumed to be 75% size and materials used are also 75% as much.", "type": "ARMOR", - "name": { "str": "XS wool gambeson" }, + "name": { "str": "wool gambeson" }, "copy-from": "gambeson_wool", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "gambeson_wool_thinsleeved", @@ -1767,19 +1765,19 @@ "id": "xl_gambeson_wool_thinsleeved", "//": "surface area of XL body assumed to be 50% greater and materials used are also 50% greater.", "type": "ARMOR", - "name": { "str": "XL thin-sleeved wool gambeson" }, + "name": { "str": "thin-sleeved wool gambeson" }, "copy-from": "gambeson_wool_thinsleeved", "proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_gambeson_wool_thinsleeved", - "//": "surface area of XL body assumed to be 75% size and materials used are also 75% as much.", + "//": "surface area of XS body assumed to be 75% size and materials used are also 75% as much.", "type": "ARMOR", - "name": { "str": "XS thin-sleeved wool gambeson" }, + "name": { "str": "thin-sleeved wool gambeson" }, "copy-from": "gambeson_wool_thinsleeved", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "gambeson_wool_vest", @@ -1829,19 +1827,19 @@ "id": "xl_gambeson_wool_vest", "//": "surface area of XL body assumed to be 50% greater and materials used are also 50% greater.", "type": "ARMOR", - "name": { "str": "XL sleeveless wool gambeson" }, + "name": { "str": "sleeveless wool gambeson" }, "copy-from": "gambeson_wool_vest", "proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_gambeson_wool_vest", - "//": "surface area of XL body assumed to be 75% size and materials used are also 75% as much.", + "//": "surface area of XS body assumed to be 75% size and materials used are also 75% as much.", "type": "ARMOR", - "name": { "str": "XS sleeveless wool gambeson" }, + "name": { "str": "sleeveless wool gambeson" }, "copy-from": "gambeson_wool_vest", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "gambeson_pants_wool", @@ -1879,19 +1877,19 @@ "id": "xl_gambeson_pants_wool", "//": "surface area of XL body assumed to be 50% greater and materials used are also 50% greater.", "type": "ARMOR", - "name": { "str": "XL wool heavy arming pants", "str_pl": "pairs of XL wool heavy arming pants" }, + "name": { "str": "wool heavy arming pants", "str_pl": "pairs of wool heavy arming pants" }, "copy-from": "gambeson_pants_wool", "proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_gambeson_pants_wool", - "//": "surface area of XL body assumed to be 75% size and materials used are also 75% as much.", + "//": "surface area of XS body assumed to be 75% size and materials used are also 75% as much.", "type": "ARMOR", - "name": { "str": "XS wool heavy arming pants", "str_pl": "pairs of XS wool heavy arming pants" }, + "name": { "str": "wool heavy arming pants", "str_pl": "pairs of wool heavy arming pants" }, "copy-from": "gambeson_pants_wool", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "gambeson_gloves_wool", @@ -1947,18 +1945,18 @@ "id": "xl_gambeson_gloves_wool", "//": "surface area of XL body assumed to be 50% greater and materials used are also 50% greater.", "type": "ARMOR", - "name": { "str": "XL wool arming mittens", "str_pl": "pairs of XL wool arming mittens" }, + "name": { "str": "wool arming mittens", "str_pl": "pairs of wool arming mittens" }, "copy-from": "gambeson_gloves_wool", "proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_gambeson_gloves_wool", - "//": "surface area of XL body assumed to be 75% size and materials used are also 75% as much.", + "//": "surface area of XS body assumed to be 75% size and materials used are also 75% as much.", "type": "ARMOR", - "name": { "str": "XS wool arming mittens", "str_pl": "pairs of XS wool arming mittens" }, + "name": { "str": "wool arming mittens", "str_pl": "pairs of wool arming mittens" }, "copy-from": "gambeson_gloves_wool", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } } ] diff --git a/data/json/items/armor/gloves.json b/data/json/items/armor/gloves.json index 5563dd578f26a..35815ee955522 100644 --- a/data/json/items/armor/gloves.json +++ b/data/json/items/armor/gloves.json @@ -93,17 +93,17 @@ "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" }, + "name": { "str": "pair of mild steel chainmail gloves", "str_pl": "pairs of mild steel chainmail gloves" }, "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "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" }, + "name": { "str": "pair of mild steel chainmail gloves", "str_pl": "pairs of mild steel chainmail gloves" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "mc_chainmail_hands", @@ -116,17 +116,17 @@ "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" }, + "name": { "str": "pair of medium steel chainmail gloves", "str_pl": "pairs of medium steel chainmail gloves" }, "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "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" }, + "name": { "str": "pair of medium steel chainmail gloves", "str_pl": "pairs of medium steel chainmail gloves" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "hc_chainmail_hands", @@ -139,17 +139,17 @@ "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" }, + "name": { "str": "pair of high steel chainmail gloves", "str_pl": "pairs of high steel chainmail gloves" }, "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "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" }, + "name": { "str": "pair of high steel chainmail gloves", "str_pl": "pairs of high steel chainmail gloves" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "ch_chainmail_hands", @@ -162,17 +162,17 @@ "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" }, + "name": { "str": "pair of hardened steel chainmail gloves", "str_pl": "pairs of hardened steel chainmail gloves" }, "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "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" }, + "name": { "str": "pair of hardened steel chainmail gloves", "str_pl": "pairs of hardened steel chainmail gloves" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "qt_chainmail_hands", @@ -186,17 +186,17 @@ "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" }, + "name": { "str": "pair of tempered steel chainmail gloves", "str_pl": "pairs of tempered steel chainmail gloves" }, "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "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" }, + "name": { "str": "pair of tempered steel chainmail gloves", "str_pl": "pairs of tempered steel chainmail gloves" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "fire_gauntlets", @@ -256,18 +256,18 @@ { "id": "xl_gauntlets_chitin", "type": "ARMOR", - "name": { "str": "pair of XL chitinous gauntlets", "str_pl": "pairs of XL chitinous gauntlets" }, + "name": { "str": "pair of chitinous gauntlets", "str_pl": "pairs of chitinous gauntlets" }, "copy-from": "gauntlets_chitin", "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_gauntlets_chitin", "type": "ARMOR", "copy-from": "gauntlets_chitin", - "name": { "str": "pair of XS chitinous gauntlets", "str_pl": "pairs of XS chitinous gauntlets" }, + "name": { "str": "pair of chitinous gauntlets", "str_pl": "pairs of chitinous gauntlets" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "gauntlets_acidchitin", @@ -282,18 +282,18 @@ { "id": "xl_gauntlets_acidchitin", "type": "ARMOR", - "name": { "str": "pair of XL biosilicified chitin gauntlets", "str_pl": "pairs of XL biosilicified chitin gauntlets" }, + "name": { "str": "pair of biosilicified chitin gauntlets", "str_pl": "pairs of biosilicified chitin gauntlets" }, "copy-from": "gauntlets_acidchitin", "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_gauntlets_acidchitin", "type": "ARMOR", "copy-from": "gauntlets_acidchitin", - "name": { "str": "pair of XS biosilicified chitin gauntlets", "str_pl": "pairs of XS biosilicified chitin gauntlets" }, + "name": { "str": "pair of biosilicified chitin gauntlets", "str_pl": "pairs of biosilicified chitin gauntlets" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "gloves_claws", @@ -396,19 +396,19 @@ { "id": "xl_gauntlets_larmor", "type": "ARMOR", - "name": { "str": "pair of XL leather armor gauntlets", "str_pl": "pairs of XL leather armor gauntlets" }, + "name": { "str": "pair of leather armor gauntlets", "str_pl": "pairs of leather armor gauntlets" }, "copy-from": "gauntlets_larmor", "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_gauntlets_larmor", "type": "ARMOR", "copy-from": "gauntlets_larmor", "looks_like": "gauntlets_larmor", - "name": { "str": "pair of XS leather armor gauntlets", "str_pl": "pairs of XS leather armor gauntlets" }, + "name": { "str": "pair of leather armor gauntlets", "str_pl": "pairs of leather armor gauntlets" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "gloves_bag", @@ -581,19 +581,19 @@ { "id": "xl_gloves_fur", "type": "ARMOR", - "name": { "str": "pair of XL fur gloves", "str_pl": "pairs of XL fur gloves" }, + "name": { "str": "pair of fur gloves", "str_pl": "pairs of fur gloves" }, "copy-from": "gloves_fur", "proportional": { "weight": 1.6, "volume": 1.6 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_gloves_fur", "type": "ARMOR", "copy-from": "gloves_fur", "looks_like": "gloves_fur", - "name": { "str": "pair of XS fur gloves", "str_pl": "pairs of XS fur gloves" }, + "name": { "str": "pair of fur gloves", "str_pl": "pairs of fur gloves" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "gloves_faux_fur", @@ -607,7 +607,7 @@ "to_hit": 1, "material": [ "faux_fur" ], "symbol": "[", - "looks_like": "fire_gauntlets", + "looks_like": "gloves_fur", "color": "brown", "warmth": 55, "material_thickness": 3, @@ -616,19 +616,18 @@ { "id": "xl_gloves_faux_fur", "type": "ARMOR", - "name": { "str": "pair of XL faux fur gloves", "str_pl": "pairs of XL faux fur gloves" }, + "name": { "str": "pair of faux fur gloves", "str_pl": "pairs of faux fur gloves" }, "copy-from": "gloves_faux_fur", "proportional": { "weight": 1.6, "volume": 1.6 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_gloves_faux_fur", "type": "ARMOR", "copy-from": "gloves_faux_fur", - "looks_like": "gloves_fur", - "name": { "str": "pair of XS faux fur gloves", "str_pl": "pairs of XS fur gloves" }, + "name": { "str": "pair of faux fur gloves", "str_pl": "pairs of faux fur gloves" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "glove_jackson", @@ -679,19 +678,19 @@ { "id": "xl_gloves_leather", "type": "ARMOR", - "name": { "str": "pair of XL leather gloves", "str_pl": "pairs of XL leather gloves" }, + "name": { "str": "pair of leather gloves", "str_pl": "pairs of leather gloves" }, "copy-from": "gloves_leather", "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_gloves_leather", "type": "ARMOR", "copy-from": "gloves_leather", "looks_like": "gloves_leather", - "name": { "str": "pair of XS leather gloves", "str_pl": "pairs of XS leather gloves" }, + "name": { "str": "pair of leather gloves", "str_pl": "pairs of leather gloves" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "gloves_denim", @@ -765,19 +764,19 @@ { "id": "xl_gloves_light", "type": "ARMOR", - "name": { "str": "pair of XL light gloves", "str_pl": "pairs of XL light gloves" }, + "name": { "str": "pair of light gloves", "str_pl": "pairs of light gloves" }, "copy-from": "gloves_light", "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_gloves_light", "type": "ARMOR", "copy-from": "gloves_light", "looks_like": "gloves_light", - "name": { "str": "pair of XS light gloves", "str_pl": "pairs of XS light gloves" }, + "name": { "str": "pair of light gloves", "str_pl": "pairs of light gloves" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "gloves_liner", @@ -801,19 +800,19 @@ { "id": "xl_gloves_liner", "type": "ARMOR", - "name": { "str": "pair of XL glove liners", "str_pl": "pairs of XL glove liners" }, + "name": { "str": "pair of glove liners", "str_pl": "pairs of glove liners" }, "copy-from": "gloves_liner", "proportional": { "weight": 2, "volume": 2 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_gloves_liner", "type": "ARMOR", "copy-from": "gloves_liner", "looks_like": "gloves_liner", - "name": { "str": "pair of XS glove liners", "str_pl": "pairs of XS glove liners" }, + "name": { "str": "pair of glove liners", "str_pl": "pairs of glove liners" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "gloves_medical", @@ -912,19 +911,19 @@ { "id": "xl_gloves_plate", "type": "ARMOR", - "name": { "str": "pair of XL armored gauntlets", "str_pl": "pairs of XL armored gauntlets" }, + "name": { "str": "pair of armored gauntlets", "str_pl": "pairs of armored gauntlets" }, "copy-from": "gloves_plate", "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_gloves_plate", "type": "ARMOR", "copy-from": "gloves_plate", "looks_like": "gloves_plate", - "name": { "str": "pair of XS armored gauntlets", "str_pl": "pairs of XS armored gauntlets" }, + "name": { "str": "pair of armored gauntlets", "str_pl": "pairs of armored gauntlets" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "gloves_rubber", @@ -1006,19 +1005,19 @@ { "id": "xl_gloves_wool", "type": "ARMOR", - "name": { "str": "pair of XL wool gloves", "str_pl": "pairs of XL wool gloves" }, + "name": { "str": "pair of wool gloves", "str_pl": "pairs of wool gloves" }, "copy-from": "gloves_wool", "proportional": { "weight": 1.4, "volume": 1.4 }, - "flags": [ "OVERSIZE" ] + "flags": [ "OVERSIZE", "PREFIX_XL" ] }, { "id": "xs_gloves_wool", "type": "ARMOR", "copy-from": "gloves_wool", "looks_like": "gloves_wool", - "name": { "str": "pair of XS wool gloves", "str_pl": "pairs of XS wool gloves" }, + "name": { "str": "pair of wool gloves", "str_pl": "pairs of wool gloves" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "flags": [ "UNDERSIZE" ] + "flags": [ "UNDERSIZE", "PREFIX_XS" ] }, { "id": "gloves_work", @@ -1454,9 +1453,9 @@ "id": "xl_lc_demi_gaunt", "type": "ARMOR", "copy-from": "lc_demi_gaunt", - "name": { "str": "pair of XL mild steel demi-gauntlets", "str_pl": "pairs of XL mild steel demi-gauntlets" }, + "name": { "str": "pair of mild steel demi-gauntlets", "str_pl": "pairs of mild steel demi-gauntlets" }, "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "mc_demi_gaunt", @@ -1469,9 +1468,9 @@ "id": "xl_mc_demi_gaunt", "type": "ARMOR", "copy-from": "mc_demi_gaunt", - "name": { "str": "pair of XL medium steel demi-gauntlets", "str_pl": "pairs of XL medium steel demi-gauntlets" }, + "name": { "str": "pair of medium steel demi-gauntlets", "str_pl": "pairs of medium steel demi-gauntlets" }, "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "hc_demi_gaunt", @@ -1483,10 +1482,10 @@ { "id": "xl_hc_demi_gaunt", "type": "ARMOR", - "name": { "str": "pair of XL high steel demi-gauntlets", "str_pl": "pairs of XL high steel demi-gauntlets" }, + "name": { "str": "pair of high steel demi-gauntlets", "str_pl": "pairs of high steel demi-gauntlets" }, "copy-from": "hc_demi_gaunt", "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "ch_demi_gaunt", @@ -1498,11 +1497,11 @@ { "id": "xl_ch_demi_gaunt", "type": "ARMOR", - "name": { "str": "pair of XL hardened steel demi-gauntlets", "str_pl": "pairs of XL hardened steel demi-gauntlets" }, + "name": { "str": "pair of hardened steel demi-gauntlets", "str_pl": "pairs of hardened steel demi-gauntlets" }, "copy-from": "ch_demi_gaunt", "material": [ "qt_steel", "qt_steel_chain" ], "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "qt_demi_gaunt", @@ -1514,10 +1513,10 @@ { "id": "xl_qt_demi_gaunt", "type": "ARMOR", - "name": { "str": "pair of XL tempered steel demi-gauntlets", "str_pl": "pairs of XL tempered steel demi-gauntlets" }, + "name": { "str": "pair of tempered steel demi-gauntlets", "str_pl": "pairs of tempered steel demi-gauntlets" }, "copy-from": "qt_demi_gaunt", "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "lc_mitten_gaunt", @@ -1575,9 +1574,9 @@ "id": "xl_lc_mitten_gaunt", "type": "ARMOR", "copy-from": "lc_mitten_gaunt", - "name": { "str": "pair of XL mild steel mitten gauntlets", "str_pl": "pairs of XL mild steel mitten gauntlets" }, + "name": { "str": "pair of mild steel mitten gauntlets", "str_pl": "pairs of mild steel mitten gauntlets" }, "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "mc_mitten_gaunt", @@ -1590,9 +1589,9 @@ "id": "xl_mc_mitten_gaunt", "type": "ARMOR", "copy-from": "mc_mitten_gaunt", - "name": { "str": "pair of XL medium steel mitten gauntlets", "str_pl": "pairs of XL medium steel mitten gauntlets" }, + "name": { "str": "pair of medium steel mitten gauntlets", "str_pl": "pairs of medium steel mitten gauntlets" }, "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "hc_mitten_gaunt", @@ -1605,9 +1604,9 @@ "id": "xl_hc_mitten_gaunt", "type": "ARMOR", "copy-from": "hc_mitten_gaunt", - "name": { "str": "pair of XL high steel mitten gauntlets", "str_pl": "pairs of XL high steel mitten gauntlets" }, + "name": { "str": "pair of high steel mitten gauntlets", "str_pl": "pairs of high steel mitten gauntlets" }, "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "ch_mitten_gaunt", @@ -1620,9 +1619,9 @@ "id": "xl_ch_mitten_gaunt", "type": "ARMOR", "copy-from": "ch_mitten_gaunt", - "name": { "str": "pair of XL hardened steel mitten gauntlets", "str_pl": "pairs of XL hardened steel mitten gauntlets" }, + "name": { "str": "pair of hardened steel mitten gauntlets", "str_pl": "pairs of hardened steel mitten gauntlets" }, "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "qt_mitten_gaunt", @@ -1635,9 +1634,9 @@ "id": "xl_qt_mitten_gaunt", "type": "ARMOR", "copy-from": "qt_mitten_gaunt", - "name": { "str": "pair of XL tempered steel mitten gauntlets", "str_pl": "pairs of XL tempered steel mitten gauntlets" }, + "name": { "str": "pair of tempered steel mitten gauntlets", "str_pl": "pairs of tempered steel mitten gauntlets" }, "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "gloves_airsoft", diff --git a/data/json/items/armor/head_attachments.json b/data/json/items/armor/head_attachments.json index ee0ff4f118b51..5c57bcd06374f 100644 --- a/data/json/items/armor/head_attachments.json +++ b/data/json/items/armor/head_attachments.json @@ -319,17 +319,17 @@ "id": "xl_lc_chainmail_face", "type": "ARMOR", "copy-from": "lc_chainmail_face", - "name": { "str": "XL mild steel chainmail partial aventail" }, + "name": { "str": "mild steel chainmail partial aventail" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_lc_chainmail_face", "type": "ARMOR", "copy-from": "lc_chainmail_face", - "name": { "str": "XS mild steel chainmail partial aventail" }, + "name": { "str": "mild steel chainmail partial aventail" }, "proportional": { "weight": 0.75, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "mc_chainmail_face", @@ -342,17 +342,17 @@ "id": "xl_mc_chainmail_face", "type": "ARMOR", "copy-from": "mc_chainmail_face", - "name": { "str": "XL medium steel chainmail partial aventail" }, + "name": { "str": "medium steel chainmail partial aventail" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_mc_chainmail_face", "type": "ARMOR", "copy-from": "mc_chainmail_face", - "name": { "str": "XS medium steel chainmail partial aventail" }, + "name": { "str": "medium steel chainmail partial aventail" }, "proportional": { "weight": 0.75, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "hc_chainmail_face", @@ -365,17 +365,17 @@ "id": "xl_hc_chainmail_face", "type": "ARMOR", "copy-from": "hc_chainmail_face", - "name": { "str": "XL high steel chainmail partial aventail" }, + "name": { "str": "high steel chainmail partial aventail" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_hc_chainmail_face", "type": "ARMOR", "copy-from": "hc_chainmail_face", - "name": { "str": "XS high steel chainmail partial aventail" }, + "name": { "str": "high steel chainmail partial aventail" }, "proportional": { "weight": 0.75, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "qt_chainmail_face", @@ -388,17 +388,17 @@ "id": "xl_qt_chainmail_face", "type": "ARMOR", "copy-from": "qt_chainmail_face", - "name": { "str": "XL tempered steel chainmail partial aventail" }, + "name": { "str": "tempered steel chainmail partial aventail" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_qt_chainmail_face", "type": "ARMOR", "copy-from": "qt_chainmail_face", - "name": { "str": "XS tempered steel chainmail partial aventail" }, + "name": { "str": "tempered steel chainmail partial aventail" }, "proportional": { "weight": 0.75, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "ch_chainmail_face", @@ -412,17 +412,17 @@ "id": "xl_ch_chainmail_face", "type": "ARMOR", "copy-from": "ch_chainmail_face", - "name": { "str": "XL hardened steel chainmail partial aventail" }, + "name": { "str": "hardened steel chainmail partial aventail" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_ch_chainmail_face", "type": "ARMOR", "copy-from": "ch_chainmail_face", - "name": { "str": "XS hardened steel chainmail partial aventail" }, + "name": { "str": "hardened steel chainmail partial aventail" }, "proportional": { "weight": 0.75, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "lc_chainmail_aventail", @@ -460,17 +460,17 @@ "id": "xl_lc_chainmail_aventail", "type": "ARMOR", "copy-from": "lc_chainmail_aventail", - "name": { "str": "XL mild steel chainmail aventail" }, + "name": { "str": "mild steel chainmail aventail" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_lc_chainmail_aventail", "type": "ARMOR", "copy-from": "lc_chainmail_aventail", - "name": { "str": "XS mild steel chainmail aventail" }, + "name": { "str": "mild steel chainmail aventail" }, "proportional": { "weight": 0.75, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "mc_chainmail_aventail", @@ -483,17 +483,17 @@ "id": "xl_mc_chainmail_aventail", "type": "ARMOR", "copy-from": "mc_chainmail_aventail", - "name": { "str": "XL medium steel chainmail aventail" }, + "name": { "str": "medium steel chainmail aventail" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_mc_chainmail_aventail", "type": "ARMOR", "copy-from": "mc_chainmail_aventail", - "name": { "str": "XS medium steel chainmail aventail" }, + "name": { "str": "medium steel chainmail aventail" }, "proportional": { "weight": 0.75, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "hc_chainmail_aventail", @@ -506,17 +506,17 @@ "id": "xl_hc_chainmail_aventail", "type": "ARMOR", "copy-from": "hc_chainmail_aventail", - "name": { "str": "XL high steel chainmail aventail" }, + "name": { "str": "high steel chainmail aventail" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_hc_chainmail_aventail", "type": "ARMOR", "copy-from": "hc_chainmail_aventail", - "name": { "str": "XS high steel chainmail aventail" }, + "name": { "str": "high steel chainmail aventail" }, "proportional": { "weight": 0.75, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "qt_chainmail_aventail", @@ -529,17 +529,17 @@ "id": "xl_qt_chainmail_aventail", "type": "ARMOR", "copy-from": "qt_chainmail_aventail", - "name": { "str": "XL tempered steel chainmail aventail" }, + "name": { "str": "tempered steel chainmail aventail" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_qt_chainmail_aventail", "type": "ARMOR", "copy-from": "qt_chainmail_aventail", - "name": { "str": "XS tempered steel chainmail aventail" }, + "name": { "str": "tempered steel chainmail aventail" }, "proportional": { "weight": 0.75, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "ch_chainmail_aventail", @@ -552,17 +552,17 @@ "id": "xl_ch_chainmail_aventail", "type": "ARMOR", "copy-from": "ch_chainmail_aventail", - "name": { "str": "XL hardened steel chainmail aventail" }, + "name": { "str": "hardened steel chainmail aventail" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_ch_chainmail_aventail", "type": "ARMOR", "copy-from": "ch_chainmail_aventail", - "name": { "str": "XS hardened steel chainmail aventail" }, + "name": { "str": "hardened steel chainmail aventail" }, "proportional": { "weight": 0.75, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "lc_steel_facemask", @@ -600,17 +600,17 @@ "id": "xl_lc_steel_facemask", "type": "ARMOR", "copy-from": "lc_steel_facemask", - "name": { "str": "XL mild steel armored face mask" }, + "name": { "str": "mild steel armored face mask" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_lc_steel_facemask", "type": "ARMOR", "copy-from": "lc_steel_facemask", - "name": { "str": "XS mild steel armored face mask" }, + "name": { "str": "mild steel armored face mask" }, "proportional": { "weight": 0.75, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "mc_steel_facemask", @@ -624,17 +624,17 @@ "id": "xl_mc_steel_facemask", "type": "ARMOR", "copy-from": "mc_steel_facemask", - "name": { "str": "XL medium steel armored face mask" }, + "name": { "str": "medium steel armored face mask" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_mc_steel_facemask", "type": "ARMOR", "copy-from": "mc_steel_facemask", - "name": { "str": "XS medium steel armored face mask" }, + "name": { "str": "medium steel armored face mask" }, "proportional": { "weight": 0.75, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "hc_steel_facemask", @@ -648,17 +648,17 @@ "id": "xl_hc_steel_facemask", "type": "ARMOR", "copy-from": "hc_steel_facemask", - "name": { "str": "XL high steel armored face mask" }, + "name": { "str": "high steel armored face mask" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_hc_steel_facemask", "type": "ARMOR", "copy-from": "hc_steel_facemask", - "name": { "str": "XS high steel armored face mask" }, + "name": { "str": "high steel armored face mask" }, "proportional": { "weight": 0.75, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "qt_steel_facemask", @@ -684,17 +684,17 @@ "id": "xl_qt_steel_facemask", "type": "ARMOR", "copy-from": "qt_steel_facemask", - "name": { "str": "XL tempered steel armored face mask" }, + "name": { "str": "tempered steel armored face mask" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_qt_steel_facemask", "type": "ARMOR", "copy-from": "qt_steel_facemask", - "name": { "str": "XS tempered steel armored face mask" }, + "name": { "str": "tempered steel armored face mask" }, "proportional": { "weight": 0.75, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "ch_steel_facemask", @@ -729,16 +729,16 @@ "id": "xl_ch_steel_facemask", "type": "ARMOR", "copy-from": "ch_steel_facemask", - "name": { "str": "XL hardened steel armored face mask" }, + "name": { "str": "hardened steel armored face mask" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_ch_steel_facemask", "type": "ARMOR", "copy-from": "ch_steel_facemask", - "name": { "str": "XS hardened steel armored face mask" }, + "name": { "str": "hardened steel armored face mask" }, "proportional": { "weight": 0.75, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } } ] diff --git a/data/json/items/armor/helmets.json b/data/json/items/armor/helmets.json index f965b0ca29d96..9471ffb25b6da 100644 --- a/data/json/items/armor/helmets.json +++ b/data/json/items/armor/helmets.json @@ -599,17 +599,17 @@ "id": "xl_helmet_barbute", "type": "ARMOR", "copy-from": "helmet_barbute", - "name": { "str": "XL barbute helm" }, + "name": { "str": "barbute helm" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "helmet_barbute_xs", "type": "ARMOR", "copy-from": "helmet_barbute", - "name": { "str": "XS barbute helm" }, + "name": { "str": "barbute helm" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "flags": [ "VARSIZE", "STURDY", "UNDERSIZE" ] + "flags": [ "VARSIZE", "STURDY", "UNDERSIZE", "PREFIX_XS" ] }, { "id": "helmet_bike", @@ -722,18 +722,18 @@ "id": "xl_helmet_chitin", "type": "ARMOR", "copy-from": "helmet_chitin", - "name": { "str": "XL chitinous helmet" }, + "name": { "str": "chitinous helmet" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "helmet_chitin_xs", "type": "ARMOR", "copy-from": "helmet_chitin", "looks_like": "helmet_chitin", - "name": { "str": "XS chitinous helmet" }, + "name": { "str": "chitinous helmet" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "flags": [ "WATERPROOF", "STURDY", "UNDERSIZE" ] + "flags": [ "WATERPROOF", "STURDY", "UNDERSIZE", "PREFIX_XS" ] }, { "id": "helmet_conical", @@ -768,18 +768,18 @@ "id": "xl_helmet_conical", "type": "ARMOR", "copy-from": "helmet_conical", - "name": { "str": "XL conical helm" }, + "name": { "str": "conical helm" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "helmet_conical_xs", "type": "ARMOR", "copy-from": "helmet_conical", "looks_like": "helmet_conical", - "name": { "str": "XS conical helm" }, + "name": { "str": "conical helm" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "flags": [ "VARSIZE", "STURDY", "UNDERSIZE" ] + "flags": [ "VARSIZE", "STURDY", "UNDERSIZE", "PREFIX_XS" ] }, { "id": "helmet_acidchitin", @@ -796,18 +796,18 @@ "id": "xl_helmet_acidchitin", "type": "ARMOR", "copy-from": "helmet_acidchitin", - "name": { "str": "XL biosilicified chitin helmet" }, + "name": { "str": "biosilicified chitin helmet" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "helmet_acidchitin_xs", "type": "ARMOR", "copy-from": "helmet_acidchitin", "looks_like": "helmet_acidchitin", - "name": { "str": "XS biosilicified chitin helmet" }, + "name": { "str": "biosilicified chitin helmet" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "helmet_football", @@ -904,17 +904,17 @@ "id": "xl_helmet_galea", "type": "ARMOR", "copy-from": "helmet_galea", - "name": { "str": "XL galea", "str_pl": "XL galeae" }, + "name": { "str": "galea", "str_pl": "galeae" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "helmet_galea_xs", "type": "ARMOR", "copy-from": "helmet_galea", - "name": { "str": "XS galea", "str_pl": "XS galeae" }, + "name": { "str": "galea", "str_pl": "galeae" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "flags": [ "VARSIZE", "STURDY", "UNDERSIZE" ] + "flags": [ "VARSIZE", "STURDY", "UNDERSIZE", "PREFIX_XS" ] }, { "id": "helmet_kabuto", @@ -970,18 +970,17 @@ "id": "xl_helmet_kabuto", "type": "ARMOR", "copy-from": "helmet_kabuto", - "name": { "str_sp": "XL kabuto" }, + "name": { "str_sp": "kabuto" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "helmet_kabuto_xs", "type": "ARMOR", "copy-from": "helmet_kabuto", - "looks_like": "helmet_kabuto", - "name": { "str_sp": "XS kabuto" }, + "name": { "str_sp": "kabuto" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "flags": [ "STURDY", "UNDERSIZE" ] + "flags": [ "STURDY", "UNDERSIZE", "PREFIX_XS" ] }, { "id": "helmet_larmor", @@ -1015,17 +1014,17 @@ "id": "xl_helmet_larmor", "type": "ARMOR", "copy-from": "helmet_larmor", - "name": { "str": "XL leather armor helmet" }, + "name": { "str": "leather armor helmet" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "helmet_larmor_xs", "type": "ARMOR", "copy-from": "helmet_larmor", - "name": { "str": "XS leather armor helmet" }, + "name": { "str": "leather armor helmet" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "flags": [ "VARSIZE", "WATER_FRIENDLY", "STURDY", "UNDERSIZE" ] + "flags": [ "VARSIZE", "WATER_FRIENDLY", "STURDY", "UNDERSIZE", "PREFIX_XS" ] }, { "id": "helmet_skull", @@ -1349,17 +1348,17 @@ "id": "xl_helmet_nasal", "type": "ARMOR", "copy-from": "helmet_nasal", - "name": { "str": "XL nasal helm" }, + "name": { "str": "nasal helm" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "helmet_nasal_xs", "type": "ARMOR", "copy-from": "helmet_nasal", - "name": { "str": "XS nasal helm" }, + "name": { "str": "nasal helm" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "flags": [ "VARSIZE", "STURDY", "UNDERSIZE" ] + "flags": [ "VARSIZE", "STURDY", "UNDERSIZE", "PREFIX_XS" ] }, { "id": "lc_helmet_nasal", @@ -1427,109 +1426,109 @@ "id": "xl_lc_helmet_nasal", "type": "ARMOR", "copy-from": "lc_helmet_nasal", - "name": { "str": "mild steel XL nasal helm" }, + "name": { "str": "mild steel nasal helm" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_lc_helmet_nasal", "type": "ARMOR", "copy-from": "lc_helmet_nasal", - "name": { "str": "mild steel XS nasal helm" }, + "name": { "str": "mild steel nasal helm" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "flags": [ "VARSIZE", "STURDY", "UNDERSIZE" ] + "flags": [ "VARSIZE", "STURDY", "UNDERSIZE", "PREFIX_XS" ] }, { "id": "mc_helmet_nasal", "type": "ARMOR", "copy-from": "lc_helmet_nasal", - "name": { "str": "medium steel nasal helmet" }, + "name": { "str": "medium steel nasal helm" }, "replace_materials": { "lc_steel": "mc_steel" } }, { "id": "xl_mc_helmet_nasal", "type": "ARMOR", "copy-from": "mc_helmet_nasal", - "name": { "str": "medium steel XL nasal helm" }, + "name": { "str": "medium steel nasal helm" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_mc_helmet_nasal", "type": "ARMOR", "copy-from": "mc_helmet_nasal", - "name": { "str": "medium steel XS nasal helm" }, + "name": { "str": "medium steel nasal helm" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "flags": [ "VARSIZE", "STURDY", "UNDERSIZE" ] + "flags": [ "VARSIZE", "STURDY", "UNDERSIZE", "PREFIX_XS" ] }, { "id": "hc_helmet_nasal", "type": "ARMOR", "copy-from": "lc_helmet_nasal", - "name": { "str": "high steel nasal helmet" }, + "name": { "str": "high steel nasal helm" }, "replace_materials": { "lc_steel": "hc_steel" } }, { "id": "xl_hc_helmet_nasal", "type": "ARMOR", "copy-from": "hc_helmet_nasal", - "name": { "str": "high steel XL nasal helm" }, + "name": { "str": "high steel nasal helm" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_hc_helmet_nasal", "type": "ARMOR", "copy-from": "hc_helmet_nasal", - "name": { "str": "high steel XS nasal helm" }, + "name": { "str": "high steel nasal helm" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "flags": [ "VARSIZE", "STURDY", "UNDERSIZE" ] + "flags": [ "VARSIZE", "STURDY", "UNDERSIZE", "PREFIX_XS" ] }, { "id": "qt_helmet_nasal", "type": "ARMOR", "copy-from": "lc_helmet_nasal", - "name": { "str": "tempered steel nasal helmet" }, + "name": { "str": "tempered steel nasal helm" }, "replace_materials": { "lc_steel": "qt_steel" } }, { "id": "xl_qt_helmet_nasal", "type": "ARMOR", "copy-from": "qt_helmet_nasal", - "name": { "str": "tempered steel XL nasal helm" }, + "name": { "str": "tempered steel nasal helm" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_qt_helmet_nasal", "type": "ARMOR", "copy-from": "qt_helmet_nasal", - "name": { "str": "tempered steel XS nasal helm" }, + "name": { "str": "tempered steel nasal helm" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "flags": [ "VARSIZE", "STURDY", "UNDERSIZE" ] + "flags": [ "VARSIZE", "STURDY", "UNDERSIZE", "PREFIX_XS" ] }, { "id": "ch_helmet_nasal", "type": "ARMOR", "copy-from": "lc_helmet_nasal", - "name": { "str": "hardened steel nasal helmet" }, + "name": { "str": "hardened steel nasal helm" }, "replace_materials": { "lc_steel": "ch_steel" } }, { "id": "xl_ch_helmet_nasal", "type": "ARMOR", "copy-from": "ch_helmet_nasal", - "name": { "str": "hardened steel XL nasal helm" }, + "name": { "str": "hardened steel nasal helm" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_ch_helmet_nasal", "type": "ARMOR", "copy-from": "ch_helmet_nasal", - "name": { "str": "hardened steel XS nasal helm" }, + "name": { "str": "hardened steel nasal helm" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "flags": [ "VARSIZE", "STURDY", "UNDERSIZE" ] + "flags": [ "VARSIZE", "STURDY", "UNDERSIZE", "PREFIX_XS" ] }, { "id": "helmet_plate", @@ -1561,17 +1560,17 @@ "id": "xl_helmet_plate", "type": "ARMOR", "copy-from": "helmet_plate", - "name": { "str": "XL great helm" }, + "name": { "str": "great helm" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "helmet_plate_xs", "type": "ARMOR", "copy-from": "helmet_plate", - "name": { "str": "XS great helm" }, + "name": { "str": "great helm" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "flags": [ "VARSIZE", "STURDY", "UNDERSIZE" ] + "flags": [ "VARSIZE", "STURDY", "UNDERSIZE", "PREFIX_XS" ] }, { "id": "helmet_kettle", @@ -1616,9 +1615,9 @@ "id": "xl_helmet_kettle", "type": "ARMOR", "copy-from": "helmet_kettle", - "name": { "str": "XL kettle helmet" }, + "name": { "str": "kettle helmet" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "helmet_scrap", @@ -1655,17 +1654,17 @@ "id": "xl_helmet_scrap", "type": "ARMOR", "copy-from": "helmet_scrap", - "name": { "str": "XL scrap helmet" }, + "name": { "str": "scrap helmet" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "helmet_scrap_xs", "type": "ARMOR", "copy-from": "helmet_scrap", - "name": { "str": "XS scrap helmet" }, + "name": { "str": "scrap helmet" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "helmet_metal_sheets_full", @@ -1885,17 +1884,17 @@ "id": "xl_helmet_corinthian", "type": "ARMOR", "copy-from": "helmet_corinthian", - "name": { "str": "XL Corinthian helm" }, + "name": { "str": "Corinthian helm" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "helmet_corinthian_xs", "type": "ARMOR", "copy-from": "helmet_corinthian", - "name": { "str": "XS Corinthian helm" }, + "name": { "str": "Corinthian helm" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "helmet_bronze", @@ -1931,22 +1930,22 @@ "id": "xl_helmet_bronze", "type": "ARMOR", "copy-from": "helmet_bronze", - "name": { "str": "XL bronze helmet" }, + "name": { "str": "bronze helmet" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_helmet_bronze", "type": "ARMOR", "copy-from": "helmet_bronze", - "name": { "str": "XS bronze helmet" }, + "name": { "str": "bronze helmet" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "pot_xlhelmet", "type": "ARMOR", - "name": { "str": "XL pot helmet" }, + "name": { "str": "pot helmet" }, "description": "A huge makeshift helmet made from a canning pot. For the truly desperate man-bear-pig.", "weight": "6425 g", "volume": "25 L", @@ -1957,7 +1956,7 @@ "looks_like": "pot_helmet", "copy-from": "pot_helmet", "material_thickness": 2, - "extend": { "flags": [ "OVERSIZE" ] }, + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] }, "armor": [ { "encumbrance_modifiers": [ "IMBALANCED" ], @@ -1973,10 +1972,10 @@ "id": "pot_helmet_xs", "type": "ARMOR", "copy-from": "pot_helmet", - "name": { "str": "XS pot helmet" }, + "name": { "str": "pot helmet" }, "description": "A helmet made from a soup pot. It's not very good protection, but it's better than nothing.", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "lc_lighthelm_close", @@ -2057,7 +2056,7 @@ { "id": "xl_lc_lighthelm_close", "type": "ARMOR", - "name": { "str": "XL mild steel light close helm" }, + "name": { "str": "mild steel light close helm" }, "copy-from": "lc_lighthelm_close", "use_action": { "type": "transform", @@ -2066,16 +2065,16 @@ "menu_text": "Raise" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xl_lc_lighthelm_close_raised", "type": "ARMOR", - "name": { "str": "XL mild steel light close helm (raised)", "str_pl": "XL mild steel light close helms (raised)" }, + "name": { "str": "mild steel light close helm (raised)", "str_pl": "mild steel light close helms (raised)" }, "copy-from": "lc_lighthelm_close_raised", "use_action": { "type": "transform", "msg": "You lower the helm's visor.", "target": "xl_lc_lighthelm_close", "menu_text": "Lower" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "mc_lighthelm_close", @@ -2101,7 +2100,7 @@ { "id": "xl_mc_lighthelm_close", "type": "ARMOR", - "name": { "str": "XL medium steel light close helm" }, + "name": { "str": "medium steel light close helm" }, "copy-from": "mc_lighthelm_close", "use_action": { "type": "transform", @@ -2110,16 +2109,16 @@ "menu_text": "Raise" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xl_mc_lighthelm_close_raised", "type": "ARMOR", - "name": { "str": "XL medium steel light close helm (raised)", "str_pl": "XL medium steel light close helms (raised)" }, + "name": { "str": "medium steel light close helm (raised)", "str_pl": "medium steel light close helms (raised)" }, "copy-from": "mc_lighthelm_close_raised", "use_action": { "type": "transform", "msg": "You lower the helm's visor.", "target": "xl_mc_lighthelm_close", "menu_text": "Lower" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "hc_lighthelm_close", @@ -2145,7 +2144,7 @@ { "id": "xl_hc_lighthelm_close", "type": "ARMOR", - "name": { "str": "XL high steel light close helm" }, + "name": { "str": "high steel light close helm" }, "copy-from": "hc_lighthelm_close", "use_action": { "type": "transform", @@ -2154,16 +2153,16 @@ "menu_text": "Raise" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xl_hc_lighthelm_close_raised", "type": "ARMOR", - "name": { "str": "XL high steel light close helm (raised)", "str_pl": "XL high steel light close helms (raised)" }, + "name": { "str": "high steel light close helm (raised)", "str_pl": "high steel light close helms (raised)" }, "copy-from": "hc_lighthelm_close_raised", "use_action": { "type": "transform", "msg": "You lower the helm's visor.", "target": "xl_hc_lighthelm_close", "menu_text": "Lower" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "ch_lighthelm_close", @@ -2189,7 +2188,7 @@ { "id": "xl_ch_lighthelm_close", "type": "ARMOR", - "name": { "str": "XL hardened steel light close helm" }, + "name": { "str": "hardened steel light close helm" }, "copy-from": "ch_lighthelm_close", "use_action": { "type": "transform", @@ -2198,16 +2197,16 @@ "menu_text": "Raise" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xl_ch_lighthelm_close_raised", "type": "ARMOR", - "name": { "str": "XL hardened steel light close helm (raised)", "str_pl": "XL hardened steel light close helms (raised)" }, + "name": { "str": "hardened steel light close helm (raised)", "str_pl": "hardened steel light close helms (raised)" }, "copy-from": "ch_lighthelm_close_raised", "use_action": { "type": "transform", "msg": "You lower the helm's visor.", "target": "xl_ch_lighthelm_close", "menu_text": "Lower" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "qt_lighthelm_close", @@ -2233,7 +2232,7 @@ { "id": "xl_qt_lighthelm_close", "type": "ARMOR", - "name": { "str": "XL tempered steel light close helm" }, + "name": { "str": "tempered steel light close helm" }, "copy-from": "qt_lighthelm_close", "use_action": { "type": "transform", @@ -2242,16 +2241,16 @@ "menu_text": "Raise" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xl_qt_lighthelm_close_raised", "type": "ARMOR", - "name": { "str": "XL tempered steel light close helm (raised)", "str_pl": "XL tempered steel light close helms (raised)" }, + "name": { "str": "tempered steel light close helm (raised)", "str_pl": "tempered steel light close helms (raised)" }, "copy-from": "qt_lighthelm_close_raised", "use_action": { "type": "transform", "msg": "You lower the helm's visor.", "target": "xl_qt_lighthelm_close", "menu_text": "Lower" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "lc_helm_close", @@ -2327,20 +2326,20 @@ { "id": "xl_lc_helm_close", "type": "ARMOR", - "name": { "str": "XL mild steel close helm" }, + "name": { "str": "mild steel close helm" }, "copy-from": "lc_helm_close", "use_action": { "type": "transform", "msg": "You raise the helm's visor.", "target": "xl_lc_helm_close_raised", "menu_text": "Raise" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xl_lc_helm_close_raised", "type": "ARMOR", - "name": { "str": "XL mild steel close helm (raised)", "str_pl": "XL mild steel close helms (raised)" }, + "name": { "str": "mild steel close helm (raised)", "str_pl": "mild steel close helms (raised)" }, "copy-from": "lc_helm_close_raised", "use_action": { "type": "transform", "msg": "You lower the helm's visor.", "target": "xl_lc_helm_close", "menu_text": "Lower" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "mc_helm_close", @@ -2361,20 +2360,20 @@ { "id": "xl_mc_helm_close", "type": "ARMOR", - "name": { "str": "XL medium steel close helm" }, + "name": { "str": "medium steel close helm" }, "copy-from": "mc_helm_close", "use_action": { "type": "transform", "msg": "You raise the helm's visor.", "target": "xl_mc_helm_close_raised", "menu_text": "Raise" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xl_mc_helm_close_raised", "type": "ARMOR", - "name": { "str": "XL medium steel close helm (raised)", "str_pl": "XL medium steel close helms (raised)" }, + "name": { "str": "medium steel close helm (raised)", "str_pl": "medium steel close helms (raised)" }, "copy-from": "mc_helm_close_raised", "use_action": { "type": "transform", "msg": "You lower the helm's visor.", "target": "xl_mc_helm_close", "menu_text": "Lower" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "hc_helm_close", @@ -2395,20 +2394,20 @@ { "id": "xl_hc_helm_close", "type": "ARMOR", - "name": { "str": "XL high steel close helm" }, + "name": { "str": "high steel close helm" }, "copy-from": "hc_helm_close", "use_action": { "type": "transform", "msg": "You raise the helm's visor.", "target": "xl_hc_helm_close_raised", "menu_text": "Raise" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xl_hc_helm_close_raised", "type": "ARMOR", - "name": { "str": "XL high steel close helm (raised)", "str_pl": "XL high steel close helms (raised)" }, + "name": { "str": "high steel close helm (raised)", "str_pl": "high steel close helms (raised)" }, "copy-from": "hc_helm_close_raised", "use_action": { "type": "transform", "msg": "You lower the helm's visor.", "target": "xl_hc_helm_close", "menu_text": "Lower" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "ch_helm_close", @@ -2429,20 +2428,20 @@ { "id": "xl_ch_helm_close", "type": "ARMOR", - "name": { "str": "XL hardened steel close helm" }, + "name": { "str": "hardened steel close helm" }, "copy-from": "ch_helm_close", "use_action": { "type": "transform", "msg": "You raise the helm's visor.", "target": "xl_ch_helm_close_raised", "menu_text": "Raise" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xl_ch_helm_close_raised", "type": "ARMOR", - "name": { "str": "XL hardened steel close helm (raised)", "str_pl": "XL hardened steel close helms (raised)" }, + "name": { "str": "hardened steel close helm (raised)", "str_pl": "hardened steel close helms (raised)" }, "copy-from": "ch_helm_close_raised", "use_action": { "type": "transform", "msg": "You lower the helm's visor.", "target": "xl_ch_helm_close", "menu_text": "Lower" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "qt_helm_close", @@ -2463,20 +2462,20 @@ { "id": "xl_qt_helm_close", "type": "ARMOR", - "name": { "str": "XL tempered steel close helm" }, + "name": { "str": "tempered steel close helm" }, "copy-from": "qt_helm_close", "use_action": { "type": "transform", "msg": "You raise the helm's visor.", "target": "xl_qt_helm_close_raised", "menu_text": "Raise" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xl_qt_helm_close_raised", "type": "ARMOR", - "name": { "str": "XL tempered steel close helm (raised)", "str_pl": "XL tempered steel close helms (raised)" }, + "name": { "str": "tempered steel close helm (raised)", "str_pl": "tempered steel close helms (raised)" }, "copy-from": "qt_helm_close_raised", "use_action": { "type": "transform", "msg": "You lower the helm's visor.", "target": "xl_qt_helm_close", "menu_text": "Lower" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "lc_heavyhelm_close", @@ -2556,7 +2555,7 @@ { "id": "xl_lc_heavyhelm_close", "type": "ARMOR", - "name": { "str": "XL mild steel heavy close helm" }, + "name": { "str": "mild steel heavy close helm" }, "copy-from": "lc_heavyhelm_close", "use_action": { "type": "transform", @@ -2565,16 +2564,16 @@ "menu_text": "Raise" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xl_lc_heavyhelm_close_raised", "type": "ARMOR", - "name": { "str": "XL mild steel heavy close helm (raised)", "str_pl": "XL mild steel heavy close helms (raised)" }, + "name": { "str": "mild steel heavy close helm (raised)", "str_pl": "mild steel heavy close helms (raised)" }, "copy-from": "lc_heavyhelm_close_raised", "use_action": { "type": "transform", "msg": "You lower the helm's visor.", "target": "xl_lc_heavyhelm_close", "menu_text": "Lower" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "mc_heavyhelm_close", @@ -2600,7 +2599,7 @@ { "id": "xl_mc_heavyhelm_close", "type": "ARMOR", - "name": { "str": "XL medium steel heavy close helm" }, + "name": { "str": "medium steel heavy close helm" }, "copy-from": "mc_heavyhelm_close", "use_action": { "type": "transform", @@ -2609,16 +2608,16 @@ "menu_text": "Raise" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xl_mc_heavyhelm_close_raised", "type": "ARMOR", - "name": { "str": "XL medium steel heavy close helm (raised)", "str_pl": "XL medium steel heavy close helms (raised)" }, + "name": { "str": "medium steel heavy close helm (raised)", "str_pl": "medium steel heavy close helms (raised)" }, "copy-from": "mc_heavyhelm_close_raised", "use_action": { "type": "transform", "msg": "You lower the helm's visor.", "target": "xl_mc_heavyhelm_close", "menu_text": "Lower" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "hc_heavyhelm_close", @@ -2644,7 +2643,7 @@ { "id": "xl_hc_heavyhelm_close", "type": "ARMOR", - "name": { "str": "XL high steel heavy close helm" }, + "name": { "str": "high steel heavy close helm" }, "copy-from": "hc_heavyhelm_close", "use_action": { "type": "transform", @@ -2653,16 +2652,16 @@ "menu_text": "Raise" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xl_hc_heavyhelm_close_raised", "type": "ARMOR", - "name": { "str": "XL high steel heavy close helm (raised)", "str_pl": "XL high steel heavy close helms (raised)" }, + "name": { "str": "high steel heavy close helm (raised)", "str_pl": "high steel heavy close helms (raised)" }, "copy-from": "hc_heavyhelm_close_raised", "use_action": { "type": "transform", "msg": "You lower the helm's visor.", "target": "xl_hc_heavyhelm_close", "menu_text": "Lower" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "ch_heavyhelm_close", @@ -2688,7 +2687,7 @@ { "id": "xl_ch_heavyhelm_close", "type": "ARMOR", - "name": { "str": "XL hardened steel heavy close helm" }, + "name": { "str": "hardened steel heavy close helm" }, "copy-from": "ch_heavyhelm_close", "use_action": { "type": "transform", @@ -2697,16 +2696,16 @@ "menu_text": "Raise" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xl_ch_heavyhelm_close_raised", "type": "ARMOR", - "name": { "str": "XL hardened steel heavy close helm (raised)", "str_pl": "XL hardened steel heavy close helms (raised)" }, + "name": { "str": "hardened steel heavy close helm (raised)", "str_pl": "hardened steel heavy close helms (raised)" }, "copy-from": "ch_heavyhelm_close_raised", "use_action": { "type": "transform", "msg": "You lower the helm's visor.", "target": "xl_ch_heavyhelm_close", "menu_text": "Lower" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "qt_heavyhelm_close", @@ -2732,7 +2731,7 @@ { "id": "xl_qt_heavyhelm_close", "type": "ARMOR", - "name": { "str": "XL tempered steel heavy close helm" }, + "name": { "str": "tempered steel heavy close helm" }, "copy-from": "qt_heavyhelm_close", "use_action": { "type": "transform", @@ -2741,16 +2740,16 @@ "menu_text": "Raise" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xl_qt_heavyhelm_close_raised", "type": "ARMOR", - "name": { "str": "XL tempered steel heavy close helm (raised)", "str_pl": "XL tempered steel heavy close helms (raised)" }, + "name": { "str": "tempered steel heavy close helm (raised)", "str_pl": "tempered steel heavy close helms (raised)" }, "copy-from": "qt_heavyhelm_close_raised", "use_action": { "type": "transform", "msg": "You lower the helm's visor.", "target": "xl_qt_heavyhelm_close", "menu_text": "Lower" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "airsoft_helmet", @@ -2914,17 +2913,17 @@ "id": "xl_lc_helmet_turban", "type": "ARMOR", "copy-from": "lc_helmet_turban", - "name": { "str": "mild steel XL turban helmet" }, + "name": { "str": "mild steel turban helmet" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_lc_helmet_turban", "type": "ARMOR", "copy-from": "lc_helmet_turban", - "name": { "str": "mild steel XS turban helmet" }, + "name": { "str": "mild steel turban helmet" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "mc_helmet_turban", @@ -2937,17 +2936,17 @@ "id": "xl_mc_helmet_turban", "type": "ARMOR", "copy-from": "mc_helmet_turban", - "name": { "str": "medium steel XL turban helmet" }, + "name": { "str": "medium steel turban helmet" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_mc_helmet_turban", "type": "ARMOR", "copy-from": "mc_helmet_turban", - "name": { "str": "medium steel XS turban helmet" }, + "name": { "str": "medium steel turban helmet" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "hc_helmet_turban", @@ -2960,17 +2959,17 @@ "id": "xl_hc_helmet_turban", "type": "ARMOR", "copy-from": "hc_helmet_turban", - "name": { "str": "high steel XL turban helmet" }, + "name": { "str": "high steel turban helmet" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_hc_helmet_turban", "type": "ARMOR", "copy-from": "hc_helmet_turban", - "name": { "str": "high steel XS turban helmet" }, + "name": { "str": "high steel turban helmet" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "flags": [ "VARSIZE", "STURDY", "UNDERSIZE" ] + "flags": [ "VARSIZE", "STURDY", "UNDERSIZE", "PREFIX_XS" ] }, { "id": "qt_helmet_turban", @@ -2983,17 +2982,17 @@ "id": "xl_qt_helmet_turban", "type": "ARMOR", "copy-from": "qt_helmet_turban", - "name": { "str": "tempered steel XL turban helmet" }, + "name": { "str": "tempered steel turban helmet" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_qt_helmet_turban", "type": "ARMOR", "copy-from": "qt_helmet_turban", - "name": { "str": "tempered steel XS turban helmet" }, + "name": { "str": "tempered steel turban helmet" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "flags": [ "VARSIZE", "STURDY", "UNDERSIZE" ] + "flags": [ "VARSIZE", "STURDY", "UNDERSIZE", "PREFIX_XS" ] }, { "id": "ch_helmet_turban", @@ -3006,16 +3005,16 @@ "id": "xl_ch_helmet_turban", "type": "ARMOR", "copy-from": "ch_helmet_turban", - "name": { "str": "hardened steel XL turban helmet" }, + "name": { "str": "hardened steel turban helmet" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_ch_helmet_turban", "type": "ARMOR", "copy-from": "ch_helmet_turban", - "name": { "str": "hardened steel XS turban helmet" }, + "name": { "str": "hardened steel turban helmet" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "flags": [ "VARSIZE", "STURDY", "UNDERSIZE" ] + "flags": [ "VARSIZE", "STURDY", "UNDERSIZE", "PREFIX_XS" ] } ] diff --git a/data/json/items/armor/hoods.json b/data/json/items/armor/hoods.json index 6e7bec5659b05..7b05f9c92ca62 100644 --- a/data/json/items/armor/hoods.json +++ b/data/json/items/armor/hoods.json @@ -80,17 +80,17 @@ "id": "xl_lc_chainmail_hood", "type": "ARMOR", "copy-from": "lc_chainmail_hood", - "name": { "str": "XL mild steel chainmail coif" }, + "name": { "str": "mild steel chainmail coif" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_lc_chainmail_hood", "type": "ARMOR", "copy-from": "lc_chainmail_hood", - "name": { "str": "XS mild steel chainmail coif" }, + "name": { "str": "mild steel chainmail coif" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "mc_chainmail_hood", @@ -103,17 +103,17 @@ "id": "xl_mc_chainmail_hood", "type": "ARMOR", "copy-from": "mc_chainmail_hood", - "name": { "str": "XL medium steel chainmail coif" }, + "name": { "str": "medium steel chainmail coif" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_mc_chainmail_hood", "type": "ARMOR", "copy-from": "mc_chainmail_hood", - "name": { "str": "XS medium steel chainmail coif" }, + "name": { "str": "medium steel chainmail coif" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "hc_chainmail_hood", @@ -126,17 +126,17 @@ "id": "xl_hc_chainmail_hood", "type": "ARMOR", "copy-from": "hc_chainmail_hood", - "name": { "str": "XL high steel chainmail coif" }, + "name": { "str": "high steel chainmail coif" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_hc_chainmail_hood", "type": "ARMOR", "copy-from": "hc_chainmail_hood", - "name": { "str": "XS high steel chainmail coif" }, + "name": { "str": "high steel chainmail coif" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "ch_chainmail_hood", @@ -149,17 +149,17 @@ "id": "xl_ch_chainmail_hood", "type": "ARMOR", "copy-from": "ch_chainmail_hood", - "name": { "str": "XL hardened steel chainmail coif" }, + "name": { "str": "hardened steel chainmail coif" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_ch_chainmail_hood", "type": "ARMOR", "copy-from": "ch_chainmail_hood", - "name": { "str": "XS hardened steel chainmail coif" }, + "name": { "str": "hardened steel chainmail coif" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "qt_chainmail_hood", @@ -172,17 +172,17 @@ "id": "xl_qt_chainmail_hood", "type": "ARMOR", "copy-from": "qt_chainmail_hood", - "name": { "str": "XL tempered steel chainmail coif" }, + "name": { "str": "tempered steel chainmail coif" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_qt_chainmail_hood", "type": "ARMOR", "copy-from": "qt_chainmail_hood", - "name": { "str": "XS tempered steel chainmail coif" }, + "name": { "str": "tempered steel chainmail coif" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "hood_rain", diff --git a/data/json/items/armor/legs_armor.json b/data/json/items/armor/legs_armor.json index c6608e3f0fb4e..b2a542a6e6e41 100644 --- a/data/json/items/armor/legs_armor.json +++ b/data/json/items/armor/legs_armor.json @@ -135,18 +135,18 @@ "id": "xl_legguard_chitin", "copy-from": "legguard_chitin", "type": "ARMOR", - "name": { "str": "pair of XL chitin leg guards", "str_pl": "pairs of XL chitin leg guards" }, + "name": { "str": "pair of chitin leg guards", "str_pl": "pairs of chitin leg guards" }, "material": [ "chitin" ], "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_legguard_chitin", "type": "ARMOR", "copy-from": "legguard_chitin", - "name": { "str": "pair of XS chitin leg guards", "str_pl": "pairs of XS chitin leg guards" }, + "name": { "str": "pair of chitin leg guards", "str_pl": "pairs of chitin leg guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "legguard_acidchitin", @@ -162,19 +162,19 @@ "id": "xl_legguard_acidchitin", "copy-from": "legguard_acidchitin", "type": "ARMOR", - "name": { "str": "pair of XL biosilicified chitin leg guards", "str_pl": "pairs of XL biosilicified chitin guards" }, + "name": { "str": "pair of biosilicified chitin leg guards", "str_pl": "pairs of biosilicified chitin leg guards" }, "material": [ "acidchitin" ], "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_legguard_acidchitin", "copy-from": "legguard_acidchitin", "type": "ARMOR", - "name": { "str": "pair of XS biosilicified chitin leg guards", "str_pl": "pairs of XS biosilicified chitin guards" }, + "name": { "str": "pair of biosilicified chitin leg guards", "str_pl": "pairs of biosilicified chitin leg guards" }, "material": [ "acidchitin" ], "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "bunker_pants", @@ -283,7 +283,7 @@ "abstract": "xl_chainmail_legs", "type": "ARMOR", "copy-from": "base_chainmail_legs", - "name": { "str": "XL chainmail leggings", "str_pl": "pairs of XL chainmail leggings" }, + "name": { "str": "chainmail leggings", "str_pl": "pairs of chainmail leggings" }, "proportional": { "weight": 1.25, "volume": 1.13, "price": 1.25 }, "pocket_data": [ { @@ -309,13 +309,13 @@ "flag_restriction": [ "ABLATIVE_CHAINMAIL_KNEES" ] } ], - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "abstract": "xs_chainmail_legs", "type": "ARMOR", "copy-from": "base_chainmail_legs", - "name": { "str": "XS chainmail leggings", "str_pl": "pairs of XS chainmail leggings" }, + "name": { "str": "chainmail leggings", "str_pl": "pairs of chainmail leggings" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, "pocket_data": [ { @@ -341,7 +341,7 @@ "flag_restriction": [ "ABLATIVE_CHAINMAIL_KNEES" ] } ], - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "abstract": "base_chainmail_half_legs", @@ -367,7 +367,7 @@ "abstract": "xl_chainmail_half_legs", "type": "ARMOR", "copy-from": "base_chainmail_half_legs", - "name": { "str": "XL chainmail half-leggings", "str_pl": "pairs of XL chainmail half-leggings" }, + "name": { "str": "chainmail half-leggings", "str_pl": "pairs of chainmail half-leggings" }, "proportional": { "weight": 1.25, "volume": 1.13, "price": 1.25 }, "pocket_data": [ { @@ -393,13 +393,13 @@ "flag_restriction": [ "ABLATIVE_CHAINMAIL_KNEES" ] } ], - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "abstract": "xs_chainmail_half_legs", "type": "ARMOR", "copy-from": "base_chainmail_half_legs", - "name": { "str": "XS chainmail half-leggings", "str_pl": "pairs of XS chainmail half-leggings" }, + "name": { "str": "chainmail half-leggings", "str_pl": "pairs of chainmail half-leggings" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, "pocket_data": [ { @@ -425,7 +425,7 @@ "flag_restriction": [ "ABLATIVE_CHAINMAIL_KNEES" ] } ], - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "chainmail_junk_legs", @@ -447,14 +447,14 @@ "type": "ARMOR", "copy-from": "xl_chainmail_legs", "replace_materials": { "steel": "lc_steel_chain" }, - "name": { "str": "XL mild steel chainmail leggings", "str_pl": "pairs of XL mild steel chainmail leggings" } + "name": { "str": "mild steel chainmail leggings", "str_pl": "pairs of mild steel chainmail leggings" } }, { "id": "xs_lc_chainmail_legs", "type": "ARMOR", "copy-from": "xs_chainmail_legs", "replace_materials": { "steel": "lc_steel_chain" }, - "name": { "str": "XS mild steel chainmail leggings", "str_pl": "pairs of XS mild steel chainmail leggings" } + "name": { "str": "mild steel chainmail leggings", "str_pl": "pairs of mild steel chainmail leggings" } }, { "id": "mc_chainmail_legs", @@ -468,14 +468,14 @@ "type": "ARMOR", "copy-from": "xl_chainmail_legs", "replace_materials": { "steel": "mc_steel_chain" }, - "name": { "str": "XL medium steel chainmail leggings", "str_pl": "pairs of XL medium steel chainmail leggings" } + "name": { "str": "medium steel chainmail leggings", "str_pl": "pairs of medium steel chainmail leggings" } }, { "id": "xs_mc_chainmail_legs", "type": "ARMOR", "copy-from": "xs_chainmail_legs", "replace_materials": { "steel": "mc_steel_chain" }, - "name": { "str": "XS medium steel chainmail leggings", "str_pl": "pairs of XS medium steel chainmail leggings" } + "name": { "str": "medium steel chainmail leggings", "str_pl": "pairs of medium steel chainmail leggings" } }, { "id": "hc_chainmail_legs", @@ -489,14 +489,14 @@ "type": "ARMOR", "copy-from": "xl_chainmail_legs", "replace_materials": { "steel": "hc_steel_chain" }, - "name": { "str": "XL high steel chainmail leggings", "str_pl": "pairs of XL high steel chainmail leggings" } + "name": { "str": "high steel chainmail leggings", "str_pl": "pairs of high steel chainmail leggings" } }, { "id": "xs_hc_chainmail_legs", "type": "ARMOR", "copy-from": "xs_chainmail_legs", "replace_materials": { "steel": "hc_steel_chain" }, - "name": { "str": "XS high steel chainmail leggings", "str_pl": "pairs of XS high steel chainmail leggings" } + "name": { "str": "high steel chainmail leggings", "str_pl": "pairs of high steel chainmail leggings" } }, { "id": "ch_chainmail_legs", @@ -510,14 +510,14 @@ "type": "ARMOR", "copy-from": "xl_chainmail_legs", "replace_materials": { "steel": "ch_steel_chain" }, - "name": { "str": "XL hardened steel chainmail leggings", "str_pl": "pairs of XL hardened steel chainmail leggings" } + "name": { "str": "hardened steel chainmail leggings", "str_pl": "pairs of hardened steel chainmail leggings" } }, { "id": "xs_ch_chainmail_legs", "type": "ARMOR", "copy-from": "xs_chainmail_legs", "replace_materials": { "steel": "ch_steel_chain" }, - "name": { "str": "XS hardened steel chainmail leggings", "str_pl": "pairs of XS hardened steel chainmail leggings" } + "name": { "str": "hardened steel chainmail leggings", "str_pl": "pairs of hardened steel chainmail leggings" } }, { "id": "qt_chainmail_legs", @@ -531,14 +531,14 @@ "type": "ARMOR", "copy-from": "xl_chainmail_legs", "replace_materials": { "steel": "qt_steel_chain" }, - "name": { "str": "XL tempered steel chainmail leggings", "str_pl": "pairs of XL tempered steel chainmail leggings" } + "name": { "str": "tempered steel chainmail leggings", "str_pl": "pairs of tempered steel chainmail leggings" } }, { "id": "xs_qt_chainmail_legs", "type": "ARMOR", "copy-from": "xs_chainmail_legs", "replace_materials": { "steel": "qt_steel_chain" }, - "name": { "str": "XS tempered steel chainmail leggings", "str_pl": "pairs of XS tempered steel chainmail leggings" } + "name": { "str": "tempered steel chainmail leggings", "str_pl": "pairs of tempered steel chainmail leggings" } }, { "id": "lc_chainmail_half_legs", @@ -552,14 +552,14 @@ "type": "ARMOR", "copy-from": "xl_chainmail_half_legs", "replace_materials": { "steel": "lc_steel_chain" }, - "name": { "str": "XL mild steel chainmail half-leggings", "str_pl": "pairs of XL mild steel chainmail half-leggings" } + "name": { "str": "mild steel chainmail half-leggings", "str_pl": "pairs of mild steel chainmail half-leggings" } }, { "id": "xs_lc_chainmail_half_legs", "type": "ARMOR", "copy-from": "xs_chainmail_half_legs", "replace_materials": { "steel": "lc_steel_chain" }, - "name": { "str": "XS mild steel chainmail half-leggings", "str_pl": "pairs of XS mild steel chainmail half-leggings" } + "name": { "str": "mild steel chainmail half-leggings", "str_pl": "pairs of mild steel chainmail half-leggings" } }, { "id": "mc_chainmail_half_legs", @@ -573,14 +573,14 @@ "type": "ARMOR", "copy-from": "xl_chainmail_half_legs", "replace_materials": { "steel": "mc_steel_chain" }, - "name": { "str": "XL medium steel chainmail half-leggings", "str_pl": "pairs of XL medium steel chainmail half-leggings" } + "name": { "str": "medium steel chainmail half-leggings", "str_pl": "pairs of medium steel chainmail half-leggings" } }, { "id": "xs_mc_chainmail_half_legs", "type": "ARMOR", "copy-from": "xs_chainmail_half_legs", "replace_materials": { "steel": "mc_steel_chain" }, - "name": { "str": "XS medium steel chainmail half-leggings", "str_pl": "pairs of XS medium steel chainmail half-leggings" } + "name": { "str": "medium steel chainmail half-leggings", "str_pl": "pairs of medium steel chainmail half-leggings" } }, { "id": "hc_chainmail_half_legs", @@ -594,14 +594,14 @@ "type": "ARMOR", "copy-from": "xl_chainmail_half_legs", "replace_materials": { "steel": "hc_steel_chain" }, - "name": { "str": "XL high steel chainmail half-leggings", "str_pl": "pairs of XL high steel chainmail half-leggings" } + "name": { "str": "high steel chainmail half-leggings", "str_pl": "pairs of high steel chainmail half-leggings" } }, { "id": "xs_hc_chainmail_half_legs", "type": "ARMOR", "copy-from": "xs_chainmail_half_legs", "replace_materials": { "steel": "hc_steel_chain" }, - "name": { "str": "XS high steel chainmail half-leggings", "str_pl": "pairs of XS high steel chainmail half-leggings" } + "name": { "str": "high steel chainmail half-leggings", "str_pl": "pairs of high steel chainmail half-leggings" } }, { "id": "ch_chainmail_half_legs", @@ -615,14 +615,14 @@ "type": "ARMOR", "copy-from": "xl_chainmail_half_legs", "replace_materials": { "steel": "ch_steel_chain" }, - "name": { "str": "XL hardened steel chainmail half-leggings", "str_pl": "pairs of XL hardened steel chainmail half-leggings" } + "name": { "str": "hardened steel chainmail half-leggings", "str_pl": "pairs of hardened steel chainmail half-leggings" } }, { "id": "xs_ch_chainmail_half_legs", "type": "ARMOR", "copy-from": "xs_chainmail_half_legs", "replace_materials": { "steel": "ch_steel_chain" }, - "name": { "str": "XS hardened steel chainmail half-leggings", "str_pl": "pairs of XS hardened steel chainmail half-leggings" } + "name": { "str": "hardened steel chainmail half-leggings", "str_pl": "pairs of hardened steel chainmail half-leggings" } }, { "id": "qt_chainmail_half_legs", @@ -636,14 +636,14 @@ "type": "ARMOR", "copy-from": "xl_chainmail_half_legs", "replace_materials": { "steel": "qt_steel_chain" }, - "name": { "str": "XL tempered steel chainmail half-leggings", "str_pl": "pairs of XL tempered steel chainmail half-leggings" } + "name": { "str": "tempered steel chainmail half-leggings", "str_pl": "pairs of tempered steel chainmail half-leggings" } }, { "id": "xs_qt_chainmail_half_legs", "type": "ARMOR", "copy-from": "xs_chainmail_half_legs", "replace_materials": { "steel": "qt_steel_chain" }, - "name": { "str": "XS tempered steel chainmail half-leggings", "str_pl": "pairs of XS tempered steel chainmail half-leggings" } + "name": { "str": "tempered steel chainmail half-leggings", "str_pl": "pairs of tempered steel chainmail half-leggings" } }, { "id": "leggings_thessalonian", @@ -811,17 +811,17 @@ "id": "xl_legguard_bronze", "type": "ARMOR", "copy-from": "legguard_bronze", - "name": { "str": "pair of XL bronze greaves", "str_pl": "pairs of XL bronze greaves" }, + "name": { "str": "pair of bronze greaves", "str_pl": "pairs of bronze greaves" }, "proportional": { "weight": 1.25, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_legguard_bronze", "type": "ARMOR", "copy-from": "legguard_bronze", - "name": { "str": "pair of XS bronze greaves", "str_pl": "pairs of XS bronze greaves" }, + "name": { "str": "pair of bronze greaves", "str_pl": "pairs of bronze greaves" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "legguard_hard", @@ -888,17 +888,17 @@ "id": "xl_legguard_lightplate", "type": "ARMOR", "copy-from": "legguard_lightplate", - "name": { "str": "pair of XL steel leg guards", "str_pl": "pairs of XL steel leg guards" }, + "name": { "str": "pair of steel leg guards", "str_pl": "pairs of steel leg guards" }, "proportional": { "weight": 1.25, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_legguard_lightplate", "type": "ARMOR", "copy-from": "legguard_lightplate", - "name": { "str": "pair of XS steel leg guards", "str_pl": "pairs of XS steel leg guards" }, + "name": { "str": "pair of steel leg guards", "str_pl": "pairs of steel leg guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "legguard_metal", @@ -934,17 +934,17 @@ "id": "xl_legguard_metal", "type": "ARMOR", "copy-from": "legguard_metal", - "name": { "str": "pair of XL iron greaves", "str_pl": "pairs of XL iron greaves" }, + "name": { "str": "pair of iron greaves", "str_pl": "pairs of iron greaves" }, "proportional": { "weight": 1.25, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_legguard_metal", "type": "ARMOR", "copy-from": "legguard_metal", - "name": { "str": "pair of XS iron greaves", "str_pl": "pairs of XS iron greaves" }, + "name": { "str": "pair of iron greaves", "str_pl": "pairs of iron greaves" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "legguard_metal_sheets", @@ -1110,17 +1110,17 @@ "id": "xl_legguard_metal_sheets", "type": "ARMOR", "copy-from": "legguard_metal_sheets", - "name": { "str": "pair of XL sheet metal leg guards", "str_pl": "pairs of XL sheet metal leg guards" }, + "name": { "str": "pair of sheet metal leg guards", "str_pl": "pairs of sheet metal leg guards" }, "proportional": { "weight": 1.25, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_legguard_metal_sheets", "type": "ARMOR", "copy-from": "legguard_metal_sheets", - "name": { "str": "pair of XS sheet metal leg guards", "str_pl": "pairs of XS sheet metal leg guards" }, + "name": { "str": "pair of sheet metal leg guards", "str_pl": "pairs of sheet metal leg guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "legguard_paper", @@ -1216,17 +1216,17 @@ "id": "xl_legguard_scrap", "type": "ARMOR", "copy-from": "legguard_scrap", - "name": { "str": "pair of XL scrap leg guards", "str_pl": "pairs of XL scrap leg guards" }, + "name": { "str": "pair of scrap leg guards", "str_pl": "pairs of scrap leg guards" }, "proportional": { "weight": 1.25, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_legguard_scrap", "type": "ARMOR", "copy-from": "legguard_scrap", - "name": { "str": "pair of XS scrap leg guards", "str_pl": "pairs of XS scrap leg guards" }, + "name": { "str": "pair of scrap leg guards", "str_pl": "pairs of scrap leg guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "legguard_tire", @@ -1262,17 +1262,17 @@ "id": "xl_legguard_tire", "type": "ARMOR", "copy-from": "legguard_tire", - "name": { "str": "pair of XL tire leg guards", "str_pl": "pairs of XL tire leg guards" }, + "name": { "str": "pair of tire leg guards", "str_pl": "pairs of tire leg guards" }, "proportional": { "weight": 1.25, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_legguard_tire", "type": "ARMOR", "copy-from": "legguard_tire", - "name": { "str": "pair of XS tire leg guards", "str_pl": "pairs of XS tire leg guards" }, + "name": { "str": "pair of tire leg guards", "str_pl": "pairs of tire leg guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "motorbike_pants", @@ -1553,10 +1553,10 @@ { "id": "xl_armor_lc_light_leg_guard", "type": "ARMOR", - "name": { "str": "XL mild steel light leg guard" }, + "name": { "str": "mild steel light leg guard" }, "copy-from": "armor_lc_light_leg_guard", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_mc_light_leg_guard", @@ -1569,10 +1569,10 @@ { "id": "xl_armor_mc_light_leg_guard", "type": "ARMOR", - "name": { "str": "XL medium steel light leg guard" }, + "name": { "str": "medium steel light leg guard" }, "copy-from": "armor_mc_light_leg_guard", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_hc_light_leg_guard", @@ -1585,10 +1585,10 @@ { "id": "xl_armor_hc_light_leg_guard", "type": "ARMOR", - "name": { "str": "XL high steel light leg guard" }, + "name": { "str": "high steel light leg guard" }, "copy-from": "armor_hc_light_leg_guard", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_ch_light_leg_guard", @@ -1602,10 +1602,10 @@ { "id": "xl_armor_ch_light_leg_guard", "type": "ARMOR", - "name": { "str": "XL hardened light leg guard" }, + "name": { "str": "hardened light leg guard" }, "copy-from": "armor_ch_light_leg_guard", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_qt_light_leg_guard", @@ -1618,10 +1618,10 @@ { "id": "xl_armor_qt_light_leg_guard", "type": "ARMOR", - "name": { "str": "XL tempered light leg guard" }, + "name": { "str": "tempered light leg guard" }, "copy-from": "armor_qt_light_leg_guard", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_lc_leg_guard", @@ -1661,10 +1661,10 @@ { "id": "xl_armor_lc_leg_guard", "type": "ARMOR", - "name": { "str": "XL mild steel leg guard" }, + "name": { "str": "mild steel leg guard" }, "copy-from": "armor_lc_leg_guard", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_mc_leg_guard", @@ -1677,10 +1677,10 @@ { "id": "xl_armor_mc_leg_guard", "type": "ARMOR", - "name": { "str": "XL medium steel leg guard" }, + "name": { "str": "medium steel leg guard" }, "copy-from": "armor_mc_leg_guard", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_hc_leg_guard", @@ -1693,10 +1693,10 @@ { "id": "xl_armor_hc_leg_guard", "type": "ARMOR", - "name": { "str": "XL high steel leg guard" }, + "name": { "str": "high steel leg guard" }, "copy-from": "armor_hc_leg_guard", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_ch_leg_guard", @@ -1709,10 +1709,10 @@ { "id": "xl_armor_ch_leg_guard", "type": "ARMOR", - "name": { "str": "XL hardened leg guard" }, + "name": { "str": "hardened leg guard" }, "copy-from": "armor_ch_leg_guard", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_qt_leg_guard", @@ -1725,10 +1725,10 @@ { "id": "xl_armor_qt_leg_guard", "type": "ARMOR", - "name": { "str": "XL tempered leg guard" }, + "name": { "str": "tempered leg guard" }, "copy-from": "armor_qt_leg_guard", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_lc_heavy_leg_guard", @@ -1768,10 +1768,10 @@ { "id": "xl_armor_lc_heavy_leg_guard", "type": "ARMOR", - "name": { "str": "XL mild steel heavy leg guard" }, + "name": { "str": "mild steel heavy leg guard" }, "copy-from": "armor_lc_heavy_leg_guard", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_mc_heavy_leg_guard", @@ -1784,10 +1784,10 @@ { "id": "xl_armor_mc_heavy_leg_guard", "type": "ARMOR", - "name": { "str": "XL medium steel heavy leg guard" }, + "name": { "str": "medium steel heavy leg guard" }, "copy-from": "armor_mc_heavy_leg_guard", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_hc_heavy_leg_guard", @@ -1800,10 +1800,10 @@ { "id": "xl_armor_hc_heavy_leg_guard", "type": "ARMOR", - "name": { "str": "XL high steel heavy leg guard" }, + "name": { "str": "high steel heavy leg guard" }, "copy-from": "armor_hc_heavy_leg_guard", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_ch_heavy_leg_guard", @@ -1816,10 +1816,10 @@ { "id": "xl_armor_ch_heavy_leg_guard", "type": "ARMOR", - "name": { "str": "XL hardened heavy leg guard" }, + "name": { "str": "hardened heavy leg guard" }, "copy-from": "armor_ch_heavy_leg_guard", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_qt_heavy_leg_guard", @@ -1832,10 +1832,10 @@ { "id": "xl_armor_qt_heavy_leg_guard", "type": "ARMOR", - "name": { "str": "XL tempered heavy leg guard" }, + "name": { "str": "tempered heavy leg guard" }, "copy-from": "armor_qt_heavy_leg_guard", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "survivor_adhoc_leather_pants", @@ -2008,17 +2008,17 @@ { "id": "xl_legguard_larmor", "type": "ARMOR", - "name": { "str": "pair of XL leather leg guards", "str_pl": "pairs of XL leather leg guards" }, + "name": { "str": "pair of leather leg guards", "str_pl": "pairs of leather leg guards" }, "copy-from": "legguard_larmor", "proportional": { "weight": 1.25, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_legguard_larmor", "type": "ARMOR", "copy-from": "legguard_larmor", - "name": { "str": "pair of XS leather leg guards", "str_pl": "pairs of XS leather leg guards" }, + "name": { "str": "pair of leather leg guards", "str_pl": "pairs of leather leg guards" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } } ] diff --git a/data/json/items/armor/suits_clothes.json b/data/json/items/armor/suits_clothes.json index 5c40713695785..fd282642113ed 100644 --- a/data/json/items/armor/suits_clothes.json +++ b/data/json/items/armor/suits_clothes.json @@ -457,7 +457,7 @@ { "id": "jumpsuit_xl", "type": "ARMOR", - "name": { "str": "XL jumpsuit" }, + "name": { "str": "jumpsuit" }, "description": "A thin, short-sleeved jumpsuit updated for the trans-human who needs full-body clothing. Provides some storage and is adjustable to minimize encumbrance.", "weight": "810 g", "volume": "5 L", @@ -505,17 +505,16 @@ ], "warmth": 15, "material_thickness": 1, - "flags": [ "POCKETS", "OVERSIZE" ] + "flags": [ "POCKETS", "OVERSIZE", "PREFIX_XL" ] }, { "id": "jumpsuit_xs", "type": "ARMOR", "copy-from": "jumpsuit", - "looks_like": "jumpsuit", - "name": { "str": "XS jumpsuit" }, + "name": { "str": "jumpsuit" }, "description": "A thin, short-sleeved jumpsuit; similar to those worn by prisoners. Provides decent storage and is not very encumbering.", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "jumpsuit_skeleton", diff --git a/data/json/items/armor/suits_protection.json b/data/json/items/armor/suits_protection.json index 807271fa91891..d1f4511545a81 100644 --- a/data/json/items/armor/suits_protection.json +++ b/data/json/items/armor/suits_protection.json @@ -64,19 +64,19 @@ { "id": "xl_armor_chitin", "type": "ARMOR", - "name": { "str": "XL chitinous armor" }, + "name": { "str": "chitinous armor" }, "copy-from": "armor_chitin", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_chitin_xs", "type": "ARMOR", "copy-from": "armor_chitin", "looks_like": "armor_chitin", - "name": { "str": "XS chitinous armor" }, + "name": { "str": "chitinous armor" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "flags": [ "STURDY", "OUTER", "UNDERSIZE" ] + "flags": [ "STURDY", "OUTER", "UNDERSIZE", "PREFIX_XS" ] }, { "id": "armor_acidchitin", @@ -93,19 +93,19 @@ { "id": "xl_armor_acidchitin", "type": "ARMOR", - "name": { "str": "XL biosilicified chitin armor" }, + "name": { "str": "biosilicified chitin armor" }, "copy-from": "armor_acidchitin", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_acidchitin_xs", "type": "ARMOR", "copy-from": "armor_acidchitin", "looks_like": "armor_acidchitin", - "name": { "str": "XS biosilicified chitin armor" }, + "name": { "str": "biosilicified chitin armor" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armor_farmor", @@ -153,19 +153,19 @@ { "id": "xl_armor_farmor", "type": "ARMOR", - "name": { "str": "XL fur body armor" }, + "name": { "str": "fur body armor" }, "copy-from": "armor_farmor", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_farmor_xs", "type": "ARMOR", "copy-from": "armor_farmor", "looks_like": "armor_farmor", - "name": { "str": "XS fur body armor" }, + "name": { "str": "fur body armor" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "flags": [ "VARSIZE", "POCKETS", "WATERPROOF", "STURDY", "OUTER", "UNDERSIZE" ] + "flags": [ "VARSIZE", "POCKETS", "WATERPROOF", "STURDY", "OUTER", "UNDERSIZE", "PREFIX_XS" ] }, { "id": "armor_faux_farmor", @@ -212,19 +212,18 @@ { "id": "xl_armor_faux_farmor", "type": "ARMOR", - "name": { "str": "XL faux fur body armor" }, + "name": { "str": "faux fur body armor" }, "copy-from": "armor_faux_farmor", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_faux_farmor_xs", "type": "ARMOR", "copy-from": "armor_faux_farmor", - "looks_like": "armor_farmor", - "name": { "str": "XS faux fur body armor" }, + "name": { "str": "faux fur body armor" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "flags": [ "VARSIZE", "POCKETS", "WATERPROOF", "STURDY", "OUTER", "UNDERSIZE" ] + "flags": [ "VARSIZE", "POCKETS", "WATERPROOF", "STURDY", "OUTER", "UNDERSIZE", "PREFIX_XS" ] }, { "id": "armor_larmor", @@ -261,19 +260,19 @@ { "id": "xl_armor_larmor", "type": "ARMOR", - "name": { "str": "XL leather body armor" }, + "name": { "str": "leather body armor" }, "copy-from": "armor_larmor", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_larmor_xs", "type": "ARMOR", "copy-from": "armor_larmor", "looks_like": "armor_larmor", - "name": { "str": "XS leather body armor" }, + "name": { "str": "leather body armor" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "flags": [ "VARSIZE", "STURDY", "OUTER", "UNDERSIZE" ] + "flags": [ "VARSIZE", "STURDY", "OUTER", "UNDERSIZE", "PREFIX_XS" ] }, { "id": "armor_junk_lightplate", @@ -632,10 +631,10 @@ { "id": "xl_armor_lc_lightplate", "type": "ARMOR", - "name": { "str": "XL mild steel light plate armor" }, + "name": { "str": "mild steel light plate armor" }, "copy-from": "armor_lc_lightplate", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_mc_lightplate", @@ -648,10 +647,10 @@ { "id": "xl_armor_mc_lightplate", "type": "ARMOR", - "name": { "str": "XL mild steel light plate armor" }, + "name": { "str": "medium steel light plate armor" }, "copy-from": "armor_mc_lightplate", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_hc_lightplate", @@ -664,10 +663,10 @@ { "id": "xl_armor_hc_lightplate", "type": "ARMOR", - "name": { "str": "XL high steel light plate armor" }, + "name": { "str": "high steel light plate armor" }, "copy-from": "armor_hc_lightplate", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_ch_lightplate", @@ -680,10 +679,10 @@ { "id": "xl_armor_ch_lightplate", "type": "ARMOR", - "name": { "str": "XL hardened light plate armor" }, + "name": { "str": "hardened steel light plate armor" }, "copy-from": "armor_ch_lightplate", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_qt_lightplate", @@ -696,10 +695,10 @@ { "id": "xl_armor_qt_lightplate", "type": "ARMOR", - "name": { "str": "XL tempered steel light plate armor" }, + "name": { "str": "tempered steel light plate armor" }, "copy-from": "armor_qt_lightplate", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_lc_plate", @@ -757,10 +756,10 @@ { "id": "xl_armor_lc_plate", "type": "ARMOR", - "name": { "str": "XL mild steel plate armor" }, + "name": { "str": "mild steel plate armor" }, "copy-from": "armor_lc_plate", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_mc_plate", @@ -773,10 +772,10 @@ { "id": "xl_armor_mc_plate", "type": "ARMOR", - "name": { "str": "XL medium steel plate armor" }, + "name": { "str": "medium steel plate armor" }, "copy-from": "armor_mc_plate", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_hc_plate", @@ -790,27 +789,27 @@ { "id": "xl_armor_hc_plate", "type": "ARMOR", - "name": { "str": "XL high steel plate armor" }, + "name": { "str": "high steel plate armor" }, "copy-from": "armor_hc_plate", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_ch_plate", "type": "ARMOR", "copy-from": "armor_lc_plate", "material": [ "ch_steel", "ch_steel_chain" ], - "name": { "str": "hardened plate armor" }, + "name": { "str": "hardened steel plate armor" }, "description": "A suit of plate armor with a 4 mm thick chestpiece. The mild steel has been hardened, offering superior protection.", "replace_materials": { "lc_steel": "ch_steel", "lc_steel_chain": "ch_steel_chain" } }, { "id": "xl_armor_ch_plate", "type": "ARMOR", - "name": { "str": "XL hardened plate armor" }, + "name": { "str": "hardened steel plate armor" }, "copy-from": "armor_ch_plate", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_qt_plate", @@ -824,10 +823,10 @@ { "id": "xl_armor_qt_plate", "type": "ARMOR", - "name": { "str": "XL tempered steel plate armor" }, + "name": { "str": "tempered steel plate armor" }, "copy-from": "armor_qt_plate", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_lc_heavyplate", @@ -885,10 +884,10 @@ { "id": "xl_armor_lc_heavyplate", "type": "ARMOR", - "name": { "str": "XL mild steel heavy plate armor" }, + "name": { "str": "mild steel heavy plate armor" }, "copy-from": "armor_lc_heavyplate", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_mc_heavyplate", @@ -901,10 +900,10 @@ { "id": "xl_armor_mc_heavyplate", "type": "ARMOR", - "name": { "str": "XL medium steel heavy plate armor" }, + "name": { "str": "medium steel heavy plate armor" }, "copy-from": "armor_mc_heavyplate", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_hc_heavyplate", @@ -917,10 +916,10 @@ { "id": "xl_armor_hc_heavyplate", "type": "ARMOR", - "name": { "str": "XL high steel heavy plate armor" }, + "name": { "str": "high steel heavy plate armor" }, "copy-from": "armor_hc_heavyplate", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_ch_heavyplate", @@ -933,10 +932,10 @@ { "id": "xl_armor_ch_heavyplate", "type": "ARMOR", - "name": { "str": "XL hardened heavy plate armor" }, + "name": { "str": "hardened steel heavy plate armor" }, "copy-from": "armor_ch_heavyplate", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_qt_heavyplate", @@ -949,10 +948,10 @@ { "id": "xl_armor_qt_heavyplate", "type": "ARMOR", - "name": { "str": "XL tempered heavy plate armor" }, + "name": { "str": "tempered steel heavy plate armor" }, "copy-from": "armor_qt_heavyplate", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_plarmor", @@ -1023,19 +1022,19 @@ { "id": "xl_armor_plarmor", "type": "ARMOR", - "name": { "str": "XL plated leather armor" }, + "name": { "str": "plated leather armor" }, "copy-from": "armor_plarmor", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_plarmor_xs", "type": "ARMOR", "copy-from": "armor_plarmor", "looks_like": "armor_plarmor", - "name": { "str": "XS plated leather armor" }, + "name": { "str": "plated leather armor" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armor_junk_plate", @@ -1201,17 +1200,17 @@ "id": "armor_xl_scrapsuit", "type": "ARMOR", "copy-from": "armor_scrapsuit", - "name": { "str": "XL scrap suit" }, + "name": { "str": "scrap suit" }, "proportional": { "weight": 1.25, "volume": 1.3, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_xs_scrapsuit", "type": "ARMOR", "copy-from": "armor_scrapsuit", - "name": { "str": "XS scrap suit" }, + "name": { "str": "scrap suit" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armor_tiresuit", @@ -1335,7 +1334,7 @@ { "abstract": "xl_chainmail_hauberk", "type": "ARMOR", - "name": { "str": "XL chainmail hauberk" }, + "name": { "str": "chainmail hauberk" }, "copy-from": "base_chainmail_hauberk", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, "pocket_data": [ @@ -1373,13 +1372,13 @@ "flag_restriction": [ "ABLATIVE_CHAINMAIL_ELBOWS" ] } ], - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "abstract": "xs_chainmail_hauberk", "type": "ARMOR", "copy-from": "base_chainmail_hauberk", - "name": { "str": "XS chainmail hauberk" }, + "name": { "str": "chainmail hauberk" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, "pocket_data": [ { @@ -1416,7 +1415,7 @@ "flag_restriction": [ "ABLATIVE_CHAINMAIL_ELBOWS" ] } ], - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "chainmail_junk_hauberk", @@ -1452,14 +1451,14 @@ "type": "ARMOR", "copy-from": "xl_chainmail_hauberk", "replace_materials": { "steel": "lc_steel_chain" }, - "name": { "str": "XL mild steel chainmail hauberk" } + "name": { "str": "mild steel chainmail hauberk" } }, { "id": "lc_chainmail_hauberk_xs", "type": "ARMOR", "copy-from": "xs_chainmail_hauberk", "replace_materials": { "steel": "lc_steel_chain" }, - "name": { "str": "XS mild steel chainmail hauberk" } + "name": { "str": "mild steel chainmail hauberk" } }, { "id": "mc_chainmail_hauberk", @@ -1473,14 +1472,14 @@ "type": "ARMOR", "copy-from": "xl_chainmail_hauberk", "replace_materials": { "steel": "mc_steel_chain" }, - "name": { "str": "XL medium steel chainmail hauberk" } + "name": { "str": "medium steel chainmail hauberk" } }, { "id": "mc_chainmail_hauberk_xs", "type": "ARMOR", "copy-from": "xs_chainmail_hauberk", "replace_materials": { "steel": "mc_steel_chain" }, - "name": { "str": "XS medium steel chainmail hauberk" } + "name": { "str": "medium steel chainmail hauberk" } }, { "id": "hc_chainmail_hauberk", @@ -1494,14 +1493,14 @@ "type": "ARMOR", "copy-from": "xl_chainmail_hauberk", "replace_materials": { "steel": "hc_steel_chain" }, - "name": { "str": "XL high steel chainmail hauberk" } + "name": { "str": "high steel chainmail hauberk" } }, { "id": "hc_chainmail_hauberk_xs", "type": "ARMOR", "copy-from": "xs_chainmail_hauberk", "replace_materials": { "steel": "hc_steel_chain" }, - "name": { "str": "XS high steel chainmail hauberk" } + "name": { "str": "high steel chainmail hauberk" } }, { "id": "ch_chainmail_hauberk", @@ -1515,14 +1514,14 @@ "type": "ARMOR", "copy-from": "xl_chainmail_hauberk", "replace_materials": { "steel": "ch_steel_chain" }, - "name": { "str": "XL hardened steel chainmail hauberk" } + "name": { "str": "hardened steel chainmail hauberk" } }, { "id": "ch_chainmail_hauberk_xs", "type": "ARMOR", "copy-from": "xs_chainmail_hauberk", "replace_materials": { "steel": "ch_steel_chain" }, - "name": { "str": "XS hardened steel chainmail hauberk" } + "name": { "str": "hardened steel chainmail hauberk" } }, { "id": "qt_chainmail_hauberk", @@ -1536,14 +1535,14 @@ "type": "ARMOR", "copy-from": "xl_chainmail_hauberk", "replace_materials": { "steel": "qt_steel_chain" }, - "name": { "str": "XL tempered steel chainmail hauberk" } + "name": { "str": "tempered steel chainmail hauberk" } }, { "id": "qt_chainmail_hauberk_xs", "type": "ARMOR", "copy-from": "xs_chainmail_hauberk", "replace_materials": { "steel": "qt_steel_chain" }, - "name": { "str": "XS tempered steel chainmail hauberk" } + "name": { "str": "tempered steel chainmail hauberk" } }, { "abstract": "base_chainmail_sjumpsuit", @@ -1606,7 +1605,7 @@ { "abstract": "xl_chainmail_sjumpsuit", "type": "ARMOR", - "name": { "str": "XL chainmail sleeveless jumpsuit" }, + "name": { "str": "chainmail sleeveless jumpsuit" }, "copy-from": "base_chainmail_sjumpsuit", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, "pocket_data": [ @@ -1644,13 +1643,13 @@ "flag_restriction": [ "ABLATIVE_CHAINMAIL_KNEES" ] } ], - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "abstract": "xs_chainmail_sjumpsuit", "type": "ARMOR", "copy-from": "base_chainmail_sjumpsuit", - "name": { "str": "XS chainmail sleeveless jumpsuit" }, + "name": { "str": "chainmail sleeveless jumpsuit" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, "pocket_data": [ { @@ -1687,7 +1686,7 @@ "flag_restriction": [ "ABLATIVE_CHAINMAIL_KNEES" ] } ], - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "lc_chainmail_sjumpsuit", @@ -1701,14 +1700,14 @@ "type": "ARMOR", "copy-from": "xl_chainmail_sjumpsuit", "replace_materials": { "steel": "lc_steel_chain" }, - "name": { "str": "XL mild steel chainmail sleeveless jumpsuit" } + "name": { "str": "mild steel chainmail sleeveless jumpsuit" } }, { "id": "lc_chainmail_sjumpsuit_xs", "type": "ARMOR", "copy-from": "xs_chainmail_sjumpsuit", "replace_materials": { "steel": "lc_steel_chain" }, - "name": { "str": "XS mild steel chainmail sleeveless jumpsuit" } + "name": { "str": "mild steel chainmail sleeveless jumpsuit" } }, { "id": "mc_chainmail_sjumpsuit", @@ -1722,14 +1721,14 @@ "type": "ARMOR", "copy-from": "xl_chainmail_sjumpsuit", "replace_materials": { "steel": "mc_steel_chain" }, - "name": { "str": "XL medium steel chainmail sleeveless jumpsuit" } + "name": { "str": "medium steel chainmail sleeveless jumpsuit" } }, { "id": "mc_chainmail_sjumpsuit_xs", "type": "ARMOR", "copy-from": "xs_chainmail_sjumpsuit", "replace_materials": { "steel": "mc_steel_chain" }, - "name": { "str": "XS medium steel chainmail sleeveless jumpsuit" } + "name": { "str": "medium steel chainmail sleeveless jumpsuit" } }, { "id": "hc_chainmail_sjumpsuit", @@ -1743,14 +1742,14 @@ "type": "ARMOR", "copy-from": "xl_chainmail_sjumpsuit", "replace_materials": { "steel": "hc_steel_chain" }, - "name": { "str": "XL high steel chainmail sleeveless jumpsuit" } + "name": { "str": "high steel chainmail sleeveless jumpsuit" } }, { "id": "hc_chainmail_sjumpsuit_xs", "type": "ARMOR", "copy-from": "xs_chainmail_sjumpsuit", "replace_materials": { "steel": "hc_steel_chain" }, - "name": { "str": "XS high steel chainmail sleeveless jumpsuit" } + "name": { "str": "high steel chainmail sleeveless jumpsuit" } }, { "id": "ch_chainmail_sjumpsuit", @@ -1764,14 +1763,14 @@ "type": "ARMOR", "copy-from": "xl_chainmail_sjumpsuit", "replace_materials": { "steel": "ch_steel_chain" }, - "name": { "str": "XL hardened steel chainmail sleeveless jumpsuit" } + "name": { "str": "hardened steel chainmail sleeveless jumpsuit" } }, { "id": "ch_chainmail_sjumpsuit_xs", "type": "ARMOR", "copy-from": "xs_chainmail_sjumpsuit", "replace_materials": { "steel": "ch_steel_chain" }, - "name": { "str": "XS hardened steel chainmail sleeveless jumpsuit" } + "name": { "str": "hardened steel chainmail sleeveless jumpsuit" } }, { "id": "qt_chainmail_sjumpsuit", @@ -1785,14 +1784,14 @@ "type": "ARMOR", "copy-from": "xl_chainmail_sjumpsuit", "replace_materials": { "steel": "qt_steel_chain" }, - "name": { "str": "XL tempered steel chainmail sleeveless jumpsuit" } + "name": { "str": "tempered steel chainmail sleeveless jumpsuit" } }, { "id": "qt_chainmail_sjumpsuit_xs", "type": "ARMOR", "copy-from": "xs_chainmail_sjumpsuit", "replace_materials": { "steel": "qt_steel_chain" }, - "name": { "str": "XS tempered steel chainmail sleeveless jumpsuit" } + "name": { "str": "tempered steel chainmail sleeveless jumpsuit" } }, { "abstract": "base_chainmail_jumpsuit", @@ -1875,7 +1874,7 @@ { "abstract": "xl_chainmail_jumpsuit", "type": "ARMOR", - "name": { "str": "XL chainmail jumpsuit" }, + "name": { "str": "chainmail jumpsuit" }, "copy-from": "base_chainmail_jumpsuit", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, "pocket_data": [ @@ -1935,13 +1934,13 @@ "flag_restriction": [ "ABLATIVE_CHAINMAIL_KNEES" ] } ], - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "abstract": "xs_chainmail_jumpsuit", "type": "ARMOR", "copy-from": "base_chainmail_jumpsuit", - "name": { "str": "XS chainmail jumpsuit" }, + "name": { "str": "chainmail jumpsuit" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, "pocket_data": [ { @@ -2000,7 +1999,7 @@ "flag_restriction": [ "ABLATIVE_CHAINMAIL_KNEES" ] } ], - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "lc_chainmail_jumpsuit", @@ -2014,14 +2013,14 @@ "type": "ARMOR", "copy-from": "xl_chainmail_jumpsuit", "replace_materials": { "steel": "lc_steel_chain" }, - "name": { "str": "XL mild steel chainmail jumpsuit" } + "name": { "str": "mild steel chainmail jumpsuit" } }, { "id": "lc_chainmail_jumpsuit_xs", "type": "ARMOR", "copy-from": "xs_chainmail_jumpsuit", "replace_materials": { "steel": "lc_steel_chain" }, - "name": { "str": "XS mild steel chainmail jumpsuit" } + "name": { "str": "mild steel chainmail jumpsuit" } }, { "id": "mc_chainmail_jumpsuit", @@ -2035,14 +2034,14 @@ "type": "ARMOR", "copy-from": "xl_chainmail_jumpsuit", "replace_materials": { "steel": "mc_steel_chain" }, - "name": { "str": "XL medium steel chainmail jumpsuit" } + "name": { "str": "medium steel chainmail jumpsuit" } }, { "id": "mc_chainmail_jumpsuit_xs", "type": "ARMOR", "copy-from": "xs_chainmail_jumpsuit", "replace_materials": { "steel": "mc_steel_chain" }, - "name": { "str": "XS medium steel chainmail jumpsuit" } + "name": { "str": "medium steel chainmail jumpsuit" } }, { "id": "hc_chainmail_jumpsuit", @@ -2056,14 +2055,14 @@ "type": "ARMOR", "copy-from": "xl_chainmail_jumpsuit", "replace_materials": { "steel": "hc_steel_chain" }, - "name": { "str": "XL high steel chainmail jumpsuit" } + "name": { "str": "high steel chainmail jumpsuit" } }, { "id": "hc_chainmail_jumpsuit_xs", "type": "ARMOR", "copy-from": "xs_chainmail_jumpsuit", "replace_materials": { "steel": "hc_steel_chain" }, - "name": { "str": "XS high steel chainmail jumpsuit" } + "name": { "str": "high steel chainmail jumpsuit" } }, { "id": "ch_chainmail_jumpsuit", @@ -2077,14 +2076,14 @@ "type": "ARMOR", "copy-from": "xl_chainmail_jumpsuit", "replace_materials": { "steel": "ch_steel_chain" }, - "name": { "str": "XL hardened steel chainmail jumpsuit" } + "name": { "str": "hardened steel chainmail jumpsuit" } }, { "id": "ch_chainmail_jumpsuit_xs", "type": "ARMOR", "copy-from": "xs_chainmail_jumpsuit", "replace_materials": { "steel": "ch_steel_chain" }, - "name": { "str": "XS hardened steel chainmail jumpsuit" } + "name": { "str": "hardened steel chainmail jumpsuit" } }, { "id": "qt_chainmail_jumpsuit", @@ -2098,14 +2097,14 @@ "type": "ARMOR", "copy-from": "xl_chainmail_jumpsuit", "replace_materials": { "steel": "qt_steel_chain" }, - "name": { "str": "XL tempered steel chainmail jumpsuit" } + "name": { "str": "tempered steel chainmail jumpsuit" } }, { "id": "qt_chainmail_jumpsuit_xs", "type": "ARMOR", "copy-from": "xs_chainmail_jumpsuit", "replace_materials": { "steel": "qt_steel_chain" }, - "name": { "str": "XS tempered steel chainmail jumpsuit" } + "name": { "str": "tempered steel chainmail jumpsuit" } }, { "abstract": "base_chainmail_suit", @@ -2183,7 +2182,7 @@ { "abstract": "xl_chainmail_suit", "type": "ARMOR", - "name": { "str": "XL chainmail armor" }, + "name": { "str": "chainmail armor" }, "copy-from": "base_chainmail_suit", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, "pocket_data": [ @@ -2243,13 +2242,13 @@ "flag_restriction": [ "ABLATIVE_CHAINMAIL_KNEES" ] } ], - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "abstract": "xs_chainmail_suit", "type": "ARMOR", "copy-from": "base_chainmail_suit", - "name": { "str": "XS chainmail armor" }, + "name": { "str": "chainmail armor" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, "pocket_data": [ { @@ -2308,7 +2307,7 @@ "flag_restriction": [ "ABLATIVE_CHAINMAIL_KNEES" ] } ], - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "chainmail_junk_suit", @@ -2338,14 +2337,14 @@ "type": "ARMOR", "copy-from": "xl_chainmail_suit", "replace_materials": { "steel": "lc_steel_chain" }, - "name": { "str": "XL mild steel chainmail armor" } + "name": { "str": "mild steel chainmail armor" } }, { "id": "lc_chainmail_suit_xs", "type": "ARMOR", "copy-from": "xs_chainmail_suit", "replace_materials": { "steel": "lc_steel_chain" }, - "name": { "str": "XS mild steel chainmail armor" } + "name": { "str": "mild steel chainmail armor" } }, { "id": "mc_chainmail_suit", @@ -2359,14 +2358,14 @@ "type": "ARMOR", "copy-from": "xl_chainmail_suit", "replace_materials": { "steel": "mc_steel_chain" }, - "name": { "str": "XL medium steel chainmail armor" } + "name": { "str": "medium steel chainmail armor" } }, { "id": "mc_chainmail_suit_xs", "type": "ARMOR", "copy-from": "xs_chainmail_suit", "replace_materials": { "steel": "mc_steel_chain" }, - "name": { "str": "XS medium steel chainmail armor" } + "name": { "str": "medium steel chainmail armor" } }, { "id": "hc_chainmail_suit", @@ -2380,14 +2379,14 @@ "type": "ARMOR", "copy-from": "xl_chainmail_suit", "replace_materials": { "steel": "hc_steel_chain" }, - "name": { "str": "XL high steel chainmail armor" } + "name": { "str": "high steel chainmail armor" } }, { "id": "hc_chainmail_suit_xs", "type": "ARMOR", "copy-from": "xs_chainmail_suit", "replace_materials": { "steel": "hc_steel_chain" }, - "name": { "str": "XS high steel chainmail armor" } + "name": { "str": "high steel chainmail armor" } }, { "id": "ch_chainmail_suit", @@ -2401,14 +2400,14 @@ "type": "ARMOR", "copy-from": "xl_chainmail_suit", "replace_materials": { "steel": "ch_steel_chain" }, - "name": { "str": "XL hardened steel chainmail armor" } + "name": { "str": "hardened steel chainmail armor" } }, { "id": "ch_chainmail_suit_xs", "type": "ARMOR", "copy-from": "xs_chainmail_suit", "replace_materials": { "steel": "ch_steel_chain" }, - "name": { "str": "XS hardened steel chainmail armor" } + "name": { "str": "hardened steel chainmail armor" } }, { "id": "qt_chainmail_suit", @@ -2422,14 +2421,14 @@ "type": "ARMOR", "copy-from": "xl_chainmail_suit", "replace_materials": { "steel": "qt_steel_chain" }, - "name": { "str": "XL tempered steel chainmail armor" } + "name": { "str": "tempered steel chainmail armor" } }, { "id": "qt_chainmail_suit_xs", "type": "ARMOR", "copy-from": "xs_chainmail_suit", "replace_materials": { "steel": "qt_steel_chain" }, - "name": { "str": "XS tempered steel chainmail armor" } + "name": { "str": "tempered steel chainmail armor" } }, { "id": "chainmail_suit_faraday", @@ -2495,7 +2494,7 @@ "id": "xl_chainmail_suit_faraday", "type": "ARMOR", "copy-from": "chainmail_suit_faraday", - "name": { "str": "XL faraday chainmail suit" }, + "name": { "str": "faraday chainmail suit" }, "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, "pocket_data": [ { @@ -2544,14 +2543,14 @@ "flag_restriction": [ "ABLATIVE_CHAINMAIL_KNEES" ] } ], - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "chainmail_suit_faraday_xs", "type": "ARMOR", "copy-from": "chainmail_suit_faraday", "looks_like": "chainmail_suit_faraday", - "name": { "str": "XS faraday chainmail suit" }, + "name": { "str": "faraday chainmail suit" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, "pocket_data": [ { @@ -2600,7 +2599,7 @@ "flag_restriction": [ "ABLATIVE_CHAINMAIL_KNEES" ] } ], - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "cleansuit", @@ -2659,19 +2658,19 @@ { "id": "xl_entry_suit", "type": "ARMOR", - "name": { "str": "XL entry suit" }, + "name": { "str": "entry suit" }, "copy-from": "entry_suit", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "entry_suit_xs", "type": "ARMOR", "copy-from": "entry_suit", "looks_like": "entry_suit", - "name": { "str": "XS entry suit" }, + "name": { "str": "entry suit" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "bite_suit", @@ -2784,19 +2783,19 @@ { "id": "xl_nomex_suit", "type": "ARMOR", - "name": { "str": "XL flame-resistant suit" }, + "name": { "str": "flame-resistant suit" }, "copy-from": "nomex_suit", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "nomex_suit_xs", "type": "ARMOR", "copy-from": "nomex_suit", "looks_like": "nomex_suit", - "name": { "str": "XS flame-resistant suit" }, + "name": { "str": "flame-resistant suit" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "robofac_enviro_suit", diff --git a/data/json/items/armor/swimming.json b/data/json/items/armor/swimming.json index ef1396b604199..95db2deceab36 100644 --- a/data/json/items/armor/swimming.json +++ b/data/json/items/armor/swimming.json @@ -630,17 +630,17 @@ "id": "xl_wetsuit_booties", "type": "ARMOR", "copy-from": "wetsuit_booties", - "name": { "str": "pair of XL diving socks", "str_pl": "pairs of XL diving socks" }, + "name": { "str": "pair of diving socks", "str_pl": "pairs of diving socks" }, "proportional": { "weight": 1.25, "volume": 1.25, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_wetsuit_booties", "type": "ARMOR", "copy-from": "wetsuit_booties", - "name": { "str": "pair of XS diving socks", "str_pl": "pairs of XS diving socks" }, + "name": { "str": "pair of diving socks", "str_pl": "pairs of diving socks" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.75 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "wetsuit_booties_thick", @@ -702,17 +702,17 @@ "id": "xl_wetsuit_booties_thick", "type": "ARMOR", "copy-from": "wetsuit_booties_thick", - "name": { "str": "pair of XL diving socks", "str_pl": "pairs of XL diving socks" }, + "name": { "str": "pair of thick diving boots", "str_pl": "pairs of thick diving boots" }, "proportional": { "weight": 1.25, "volume": 1.25, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_wetsuit_booties_thick", "type": "ARMOR", "copy-from": "wetsuit_booties_thick", - "name": { "str": "pair of XS diving socks", "str_pl": "pairs of XS diving socks" }, + "name": { "str": "pair of thick diving boots", "str_pl": "pairs of thick diving boots" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.75 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "swim_fins", @@ -812,17 +812,17 @@ "id": "xl_wetsuit", "type": "ARMOR", "copy-from": "wetsuit", - "name": { "str": "XL wetsuit" }, + "name": { "str": "wetsuit" }, "proportional": { "weight": 1.25, "volume": 1.25, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_wetsuit", "type": "ARMOR", "copy-from": "wetsuit", - "name": { "str": "XS wetsuit" }, + "name": { "str": "wetsuit" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.75 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "wetsuit_thick", @@ -878,17 +878,17 @@ "id": "xl_wetsuit_thick", "type": "ARMOR", "copy-from": "wetsuit_thick", - "name": { "str": "XL thick wetsuit" }, + "name": { "str": "thick wetsuit" }, "proportional": { "weight": 1.25, "volume": 1.25, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_wetsuit_thick", "type": "ARMOR", "copy-from": "wetsuit_thick", - "name": { "str": "XS thick wetsuit" }, + "name": { "str": "thick wetsuit" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.75 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "wetsuit_hood", @@ -922,17 +922,17 @@ "id": "xl_wetsuit_hood", "type": "ARMOR", "copy-from": "wetsuit_hood", - "name": { "str": "XL wetsuit hood" }, + "name": { "str": "wetsuit hood" }, "proportional": { "weight": 1.25, "volume": 1.25, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_wetsuit_hood", "type": "ARMOR", "copy-from": "wetsuit_hood", - "name": { "str": "XS wetsuit hood" }, + "name": { "str": "wetsuit hood" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.75 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "wetsuit_hood_thick", @@ -960,17 +960,17 @@ "id": "xl_wetsuit_hood_thick", "type": "ARMOR", "copy-from": "wetsuit_hood_thick", - "name": { "str": "XL thick wetsuit hood" }, + "name": { "str": "thick wetsuit hood" }, "proportional": { "weight": 1.25, "volume": 1.25, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_wetsuit_hood_thick", "type": "ARMOR", "copy-from": "wetsuit_hood_thick", - "name": { "str": "XS thick wetsuit hood" }, + "name": { "str": "thick wetsuit hood" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.75 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "wetsuit_jacket", @@ -1014,17 +1014,17 @@ "id": "xl_wetsuit_jacket", "type": "ARMOR", "copy-from": "wetsuit_jacket", - "name": { "str": "XL wetsuit jacket" }, + "name": { "str": "wetsuit jacket" }, "proportional": { "weight": 1.25, "volume": 1.25, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_wetsuit_jacket", "type": "ARMOR", "copy-from": "wetsuit_jacket", - "name": { "str": "XS wetsuit jacket" }, + "name": { "str": "wetsuit jacket" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.75 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "wetsuit_top", @@ -1077,17 +1077,17 @@ "id": "xl_wetsuit_top", "type": "ARMOR", "copy-from": "wetsuit_top", - "name": { "str": "XL wetsuit shirt" }, + "name": { "str": "wetsuit shirt" }, "proportional": { "weight": 1.25, "volume": 1.25, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_wetsuit_top", "type": "ARMOR", "copy-from": "wetsuit_top", - "name": { "str": "XS wetsuit shirt" }, + "name": { "str": "wetsuit shirt" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.75 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "wetsuit_top_sleeved_thin", @@ -1125,17 +1125,17 @@ "id": "xl_wetsuit_top_sleeved_thin", "type": "ARMOR", "copy-from": "wetsuit_top_sleeved_thin", - "name": { "str": "XL thin wetsuit long-sleeved shirt" }, + "name": { "str": "thin wetsuit long-sleeved shirt" }, "proportional": { "weight": 1.25, "volume": 1.25, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_wetsuit_top_sleeved_thin", "type": "ARMOR", "copy-from": "wetsuit_top_sleeved_thin", - "name": { "str": "XS thin wetsuit long-sleeved shirt" }, + "name": { "str": "thin wetsuit long-sleeved shirt" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.75 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "wetsuit_top_sleeved", @@ -1179,17 +1179,17 @@ "id": "xl_wetsuit_top_sleeved", "type": "ARMOR", "copy-from": "wetsuit_top_sleeved", - "name": { "str": "XL wetsuit long-sleeved shirt" }, + "name": { "str": "wetsuit long-sleeved shirt" }, "proportional": { "weight": 1.25, "volume": 1.25, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_wetsuit_top_sleeved", "type": "ARMOR", "copy-from": "wetsuit_top_sleeved", - "name": { "str": "XS wetsuit long-sleeved shirt" }, + "name": { "str": "wetsuit long-sleeved shirt" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.75 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "wetsuit_pants_thin", @@ -1218,17 +1218,17 @@ "id": "xl_wetsuit_pants_thin", "type": "ARMOR", "copy-from": "wetsuit_pants_thin", - "name": { "str_sp": "XL thin wetsuit pants" }, + "name": { "str_sp": "thin wetsuit pants" }, "proportional": { "weight": 1.25, "volume": 1.25, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_wetsuit_pants_thin", "type": "ARMOR", "copy-from": "wetsuit_pants_thin", - "name": { "str_sp": "XS thin wetsuit pants" }, + "name": { "str_sp": "thin wetsuit pants" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.75 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "wetsuit_pants", @@ -1263,17 +1263,17 @@ "id": "xl_wetsuit_pants", "type": "ARMOR", "copy-from": "wetsuit_pants", - "name": { "str_sp": "XL wetsuit pants" }, + "name": { "str_sp": "wetsuit pants" }, "proportional": { "weight": 1.25, "volume": 1.25, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_wetsuit_pants", "type": "ARMOR", "copy-from": "wetsuit_pants", - "name": { "str_sp": "XS wetsuit pants" }, + "name": { "str_sp": "wetsuit pants" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.75 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "wetsuit_shorts", @@ -1317,17 +1317,17 @@ "id": "xl_wetsuit_shorts", "type": "ARMOR", "copy-from": "wetsuit_shorts", - "name": { "str_sp": "XL wetsuit shorts" }, + "name": { "str_sp": "wetsuit shorts" }, "proportional": { "weight": 1.25, "volume": 1.25, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_wetsuit_shorts", "type": "ARMOR", "copy-from": "wetsuit_shorts", - "name": { "str_sp": "XS wetsuit shorts" }, + "name": { "str_sp": "wetsuit shorts" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.75 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "wetsuit_shorts_technical", @@ -1461,7 +1461,7 @@ "id": "xl_wetsuit_shorts_technical", "type": "ARMOR", "copy-from": "wetsuit_shorts_technical", - "name": { "str_sp": "XL wetsuit technical shorts" }, + "name": { "str_sp": "wetsuit technical shorts" }, "proportional": { "weight": 1.25, "volume": 1.25, "price": 1.25 }, "use_action": { "type": "transform", @@ -1469,13 +1469,13 @@ "target": "xl_wetsuit_shorts_technical_loose", "menu_text": "Loosen" }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_wetsuit_shorts_technical", "type": "ARMOR", "copy-from": "wetsuit_shorts_technical", - "name": { "str_sp": "XS wetsuit technical shorts" }, + "name": { "str_sp": "wetsuit technical shorts" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.75 }, "use_action": { "type": "transform", @@ -1483,7 +1483,7 @@ "target": "xs_wetsuit_shorts_technical_loose", "menu_text": "Loosen" }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "wetsuit_shorts_technical_loose", @@ -1498,7 +1498,7 @@ "id": "xl_wetsuit_shorts_technical_loose", "type": "ARMOR", "copy-from": "xl_wetsuit_shorts_technical", - "name": { "str_sp": "XL wetsuit technical shorts (loose)" }, + "name": { "str_sp": "wetsuit technical shorts (loose)" }, "use_action": { "type": "transform", "msg": "You tighten your %s.", "target": "xl_wetsuit_shorts_technical", "menu_text": "Tighten" }, "delete": { "flags": [ "SKINTIGHT" ] } }, @@ -1506,7 +1506,7 @@ "id": "xs_wetsuit_shorts_technical_loose", "type": "ARMOR", "copy-from": "xs_wetsuit_shorts_technical", - "name": { "str_sp": "XS wetsuit technical shorts (loose)" }, + "name": { "str_sp": "wetsuit technical shorts (loose)" }, "use_action": { "type": "transform", "msg": "You tighten your %s.", "target": "xs_wetsuit_shorts_technical", "menu_text": "Tighten" }, "delete": { "flags": [ "SKINTIGHT" ] } }, @@ -1583,17 +1583,17 @@ "id": "xl_wetsuit_spring", "type": "ARMOR", "copy-from": "wetsuit_spring", - "name": { "str": "XL spring suit" }, + "name": { "str": "spring suit" }, "proportional": { "weight": 1.25, "volume": 1.25, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_wetsuit_spring", "type": "ARMOR", "copy-from": "wetsuit_spring", - "name": { "str": "XS spring suit" }, + "name": { "str": "spring suit" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.75 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "wetsuit_spring_sleeveless", @@ -1638,17 +1638,17 @@ "id": "xl_wetsuit_spring_sleeveless", "type": "ARMOR", "copy-from": "wetsuit_spring_sleeveless", - "name": { "str": "XL sleeveless spring suit" }, + "name": { "str": "sleeveless spring suit" }, "proportional": { "weight": 1.25, "volume": 1.25, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_wetsuit_spring_sleeveless", "type": "ARMOR", "copy-from": "wetsuit_spring_sleeveless", - "name": { "str": "XS sleeveless spring suit" }, + "name": { "str": "sleeveless spring suit" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.75 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "shark_suit_faraday", @@ -1687,17 +1687,17 @@ "id": "xl_shark_suit_faraday", "type": "ARMOR", "copy-from": "shark_suit_faraday", - "name": { "str": "XL faraday sharksuit" }, + "name": { "str": "faraday sharksuit" }, "proportional": { "weight": 1.25, "volume": 1.25, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_shark_suit_faraday", "type": "ARMOR", "copy-from": "shark_suit_faraday", - "name": { "str": "XS faraday sharksuit" }, + "name": { "str": "faraday sharksuit" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.75 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "shark_suit", @@ -1736,17 +1736,17 @@ "id": "xl_shark_suit", "type": "ARMOR", "copy-from": "shark_suit_faraday", - "name": { "str": "XL sharksuit" }, + "name": { "str": "sharksuit" }, "proportional": { "weight": 1.25, "volume": 1.25, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_shark_suit", "type": "ARMOR", "copy-from": "shark_suit", - "name": { "str": "XS sharksuit" }, + "name": { "str": "sharksuit" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.75 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "goggles_swim", @@ -1811,17 +1811,17 @@ "id": "xl_wetsuit_gloves", "type": "ARMOR", "copy-from": "wetsuit_gloves", - "name": { "str": "pair of XL diving gloves", "str_pl": "pairs of XL diving gloves" }, + "name": { "str": "pair of diving gloves", "str_pl": "pairs of diving gloves" }, "proportional": { "weight": 1.25, "volume": 1.25, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_wetsuit_gloves", "type": "ARMOR", "copy-from": "wetsuit_gloves", - "name": { "str": "pair of XS diving gloves", "str_pl": "pairs of XS diving gloves" }, + "name": { "str": "pair of diving gloves", "str_pl": "pairs of diving gloves" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.75 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "wetsuit_gloves_thick", @@ -1849,17 +1849,17 @@ "id": "xl_wetsuit_gloves_thick", "type": "ARMOR", "copy-from": "wetsuit_gloves_thick", - "name": { "str": "pair of thick XL diving gloves", "str_pl": "pairs of thick XL diving gloves" }, + "name": { "str": "pair of thick diving gloves", "str_pl": "pairs of thick diving gloves" }, "proportional": { "weight": 1.25, "volume": 1.25, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_wetsuit_gloves_thick", "type": "ARMOR", "copy-from": "wetsuit_gloves_thick", - "name": { "str": "pair of thick XS diving gloves", "str_pl": "pairs of thick XS diving gloves" }, + "name": { "str": "pair of thick diving gloves", "str_pl": "pairs of thick diving gloves" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.75 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "divemask_full_scuba_notready", diff --git a/data/json/items/armor/torso_armor.json b/data/json/items/armor/torso_armor.json index 8d7b9b4d0da05..1e3de5daf7c54 100644 --- a/data/json/items/armor/torso_armor.json +++ b/data/json/items/armor/torso_armor.json @@ -24,19 +24,18 @@ { "id": "xl_armor_cuirass", "type": "ARMOR", - "name": { "str": "XL bell cuirass", "str_pl": "XL bell cuirasses" }, + "name": { "str": "bell cuirass", "str_pl": "bell cuirasses" }, "copy-from": "armor_cuirass", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_armor_cuirass", "type": "ARMOR", "copy-from": "armor_cuirass", - "looks_like": "armor_cuirass", - "name": { "str": "XS bell cuirass", "str_pl": "XS bell cuirasses" }, + "name": { "str": "bell cuirass", "str_pl": "bell cuirasses" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "cuirass_bronze", @@ -63,18 +62,18 @@ { "id": "xl_cuirass_bronze", "type": "ARMOR", - "name": { "str": "XL bronze cuirass", "str_pl": "XL bronze cuirasses" }, + "name": { "str": "bronze cuirass", "str_pl": "bronze cuirasses" }, "copy-from": "cuirass_bronze", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_cuirass_bronze", "type": "ARMOR", - "name": { "str": "XS bronze cuirass", "str_pl": "XS bronze cuirasses" }, + "name": { "str": "bronze cuirass", "str_pl": "bronze cuirasses" }, "copy-from": "cuirass_bronze", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armor_lamellar", @@ -117,19 +116,18 @@ { "id": "xl_armor_lamellar", "type": "ARMOR", - "name": { "str": "XL leather lamellar cuirass", "str_pl": "XL leather lamellar cuirasses" }, + "name": { "str": "leather lamellar cuirass", "str_pl": "leather lamellar cuirasses" }, "copy-from": "armor_lamellar", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_armor_lamellar", "type": "ARMOR", "copy-from": "armor_lamellar", - "looks_like": "armor_lamellar", - "name": { "str": "XS leather lamellar cuirass", "str_pl": "XS leather lamellar cuirasses" }, + "name": { "str": "leather lamellar cuirass", "str_pl": "leather lamellar cuirasses" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armor_lamellar_lc", @@ -180,20 +178,20 @@ { "id": "xl_armor_lamellar_lc", "type": "ARMOR", - "name": { "str": "XL mild steel lamellar cuirass", "str_pl": "XL mild steel lamellar cuirasses" }, + "name": { "str": "mild steel lamellar cuirass", "str_pl": "mild steel lamellar cuirasses" }, "description": "A cuirass made of small strips of sheet metal laced together, something of an intermediary between chain mail and plate armor. The perfect size for an orc or bipedal grizzly bear.", "copy-from": "armor_lamellar_lc", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_armor_lamellar_lc", "type": "ARMOR", "copy-from": "armor_lamellar_lc", - "name": { "str": "XS mild steel lamellar cuirass", "str_pl": "XS mild steel lamellar cuirasses" }, + "name": { "str": "mild steel lamellar cuirass", "str_pl": "mild steel lamellar cuirasses" }, "description": "A cuirass made of small strips of sheet metal laced together, something of an intermediary between chain mail and plate armor. Perfectly sized for a particularly angry rat-person, yes-yes.", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armor_lamellar_ch", @@ -201,26 +199,25 @@ "copy-from": "armor_lamellar_lc", "name": { "str": "hardened steel lamellar cuirass", "str_pl": "hardened steel lamellar cuirasses" }, "description": "A cuirass made of small strips of sheet metal laced together, something of an intermediary between chain mail and plate armor. This one has been hardened for extra protection.", - "looks_like": "armor_lamellar_lc", "replace_materials": { "lc_steel": "ch_steel" } }, { "id": "xl_armor_lamellar_ch", "type": "ARMOR", - "name": { "str": "XL hardened steel lamellar cuirass", "str_pl": "XL hardened steel lamellar cuirasses" }, + "name": { "str": "hardened steel lamellar cuirass", "str_pl": "hardened steel lamellar cuirasses" }, "description": "A hardened cuirass made of small strips of sheet metal laced together, something of an intermediary between chain mail and plate armor. Built larger for a minotaur guarding their labyrinth.", "copy-from": "armor_lamellar_ch", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_armor_lamellar_ch", "type": "ARMOR", "copy-from": "armor_lamellar_ch", - "name": { "str": "XS hardened steel lamellar cuirass", "str_pl": "XS hardened steel lamellar cuirasses" }, + "name": { "str": "hardened steel lamellar cuirass", "str_pl": "hardened steel lamellar cuirasses" }, "description": "A hardened cuirass made of small strips of sheet metal laced together, something of an intermediary between chain mail and plate armor. Just the right size for a fantasy dwarf.", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "carpet_cuirass", @@ -311,19 +308,18 @@ { "id": "xl_armor_lorica", "type": "ARMOR", - "name": { "str_sp": "XL lorica segmentata" }, + "name": { "str_sp": "lorica segmentata" }, "copy-from": "armor_lorica", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "flags": [ "VARSIZE", "STURDY", "OVERSIZE", "OUTER" ] + "flags": [ "VARSIZE", "STURDY", "OVERSIZE", "PREFIX_XL", "OUTER" ] }, { "id": "xs_armor_lorica", "type": "ARMOR", "copy-from": "armor_lorica", - "looks_like": "armor_lorica", - "name": { "str_sp": "XS lorica segmentata" }, + "name": { "str_sp": "lorica segmentata" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "armor_thessalonian", @@ -572,7 +568,7 @@ { "abstract": "xl_chainmail_vest", "type": "ARMOR", - "name": { "str": "XL chainmail vest" }, + "name": { "str": "chainmail vest" }, "copy-from": "base_chainmail_vest", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, "pocket_data": [ @@ -588,13 +584,13 @@ "flag_restriction": [ "ABLATIVE_CHAINMAIL_TORSO" ] } ], - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "abstract": "xs_chainmail_vest", "type": "ARMOR", "copy-from": "base_chainmail_vest", - "name": { "str": "XS chainmail vest" }, + "name": { "str": "chainmail vest" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, "pocket_data": [ { @@ -609,7 +605,7 @@ "flag_restriction": [ "ABLATIVE_CHAINMAIL_TORSO" ] } ], - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "chainmail_junk_vest", @@ -631,14 +627,14 @@ "copy-from": "xl_chainmail_vest", "replace_materials": { "steel": "lc_steel_chain" }, "type": "ARMOR", - "name": { "str": "XL mild steel chainmail vest" } + "name": { "str": "mild steel chainmail vest" } }, { "id": "xs_lc_chainmail_vest", "copy-from": "xs_chainmail_vest", "replace_materials": { "steel": "lc_steel_chain" }, "type": "ARMOR", - "name": { "str": "XS mild steel chainmail vest" } + "name": { "str": "mild steel chainmail vest" } }, { "id": "mc_chainmail_vest", @@ -652,14 +648,14 @@ "copy-from": "xl_chainmail_vest", "replace_materials": { "steel": "mc_steel_chain" }, "type": "ARMOR", - "name": { "str": "XL medium steel chainmail vest" } + "name": { "str": "medium steel chainmail vest" } }, { "id": "xs_mc_chainmail_vest", "copy-from": "xs_chainmail_vest", "replace_materials": { "steel": "mc_steel_chain" }, "type": "ARMOR", - "name": { "str": "XS medium steel chainmail vest" } + "name": { "str": "medium steel chainmail vest" } }, { "id": "hc_chainmail_vest", @@ -673,14 +669,14 @@ "copy-from": "xl_chainmail_vest", "replace_materials": { "steel": "hc_steel_chain" }, "type": "ARMOR", - "name": { "str": "XL high steel chainmail vest" } + "name": { "str": "high steel chainmail vest" } }, { "id": "xs_hc_chainmail_vest", "copy-from": "xs_chainmail_vest", "replace_materials": { "steel": "hc_steel_chain" }, "type": "ARMOR", - "name": { "str": "XS high steel chainmail vest" } + "name": { "str": "high steel chainmail vest" } }, { "id": "ch_chainmail_vest", @@ -694,14 +690,14 @@ "copy-from": "xl_chainmail_vest", "replace_materials": { "steel": "ch_steel_chain" }, "type": "ARMOR", - "name": { "str": "XL hardened steel chainmail vest" } + "name": { "str": "hardened steel chainmail vest" } }, { "id": "xs_ch_chainmail_vest", "copy-from": "xs_chainmail_vest", "replace_materials": { "steel": "ch_steel_chain" }, "type": "ARMOR", - "name": { "str": "XS hardened steel chainmail vest" } + "name": { "str": "hardened steel chainmail vest" } }, { "id": "qt_chainmail_vest", @@ -715,14 +711,14 @@ "copy-from": "xl_chainmail_vest", "replace_materials": { "steel": "qt_steel_chain" }, "type": "ARMOR", - "name": { "str": "XL tempered steel chainmail vest" } + "name": { "str": "tempered steel chainmail vest" } }, { "id": "xs_qt_chainmail_vest", "copy-from": "xs_chainmail_vest", "replace_materials": { "steel": "qt_steel_chain" }, "type": "ARMOR", - "name": { "str": "XS tempered steel chainmail vest" } + "name": { "str": "tempered steel chainmail vest" } }, { "id": "cloth_shirt_padded", @@ -856,18 +852,18 @@ { "id": "xl_cuirass_lightplate", "type": "ARMOR", - "name": { "str": "XL cuirass", "str_pl": "XL cuirasses" }, + "name": { "str": "cuirass", "str_pl": "cuirasses" }, "copy-from": "cuirass_lightplate", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "flags": [ "VARSIZE", "STURDY", "OVERSIZE", "OUTER" ] + "flags": [ "VARSIZE", "STURDY", "OVERSIZE", "PREFIX_XL", "OUTER" ] }, { "id": "xs_cuirass_lightplate", "type": "ARMOR", "copy-from": "cuirass_lightplate", - "name": { "str": "XS cuirass", "str_pl": "XS cuirasses" }, + "name": { "str": "cuirass", "str_pl": "cuirasses" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "cuirass_scrap", @@ -904,19 +900,18 @@ { "id": "xl_cuirass_scrap", "type": "ARMOR", - "name": { "str": "XL scrap cuirass", "str_pl": "XL scrap cuirasses" }, + "name": { "str": "scrap cuirass", "str_pl": "scrap cuirasses" }, "copy-from": "cuirass_scrap", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_cuirass_scrap", "type": "ARMOR", "copy-from": "cuirass_scrap", - "looks_like": "cuirass_scrap", - "name": { "str": "XS scrap cuirass", "str_pl": "XS scrap cuirasses" }, + "name": { "str": "scrap cuirass", "str_pl": "scrap cuirasses" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "cuirass_tire", @@ -942,19 +937,18 @@ { "id": "xl_cuirass_tire", "type": "ARMOR", - "name": { "str": "XL tire cuirass", "str_pl": "XL tire cuirasses" }, + "name": { "str": "tire cuirass", "str_pl": "tire cuirasses" }, "copy-from": "cuirass_scrap", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "flags": [ "OVERSIZE", "OUTER", "NONCONDUCTIVE" ] + "flags": [ "OVERSIZE", "PREFIX_XL", "OUTER", "NONCONDUCTIVE" ] }, { "id": "xs_cuirass_tire", "type": "ARMOR", "copy-from": "cuirass_tire", - "looks_like": "cuirass_tire", - "name": { "str": "XS tire cuirass", "str_pl": "XS tire cuirasses" }, + "name": { "str": "tire cuirass", "str_pl": "tire cuirasses" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "fencing_jacket", @@ -1249,7 +1243,6 @@ "price_postapoc": "25 USD", "material": [ "rubber", "leather" ], "copy-from": "jacket_leather_mod", - "looks_like": "jacket_leather_mod", "color": "light_gray", "armor": [ { @@ -1519,7 +1512,6 @@ "description": "An armored vest made from thick leather and metal plates which have been hardened for superb protection.", "price_postapoc": "20 USD", "copy-from": "vest_leather_mod", - "looks_like": "vest_leather_mod", "replace_materials": { "lc_steel": "ch_steel" } }, { @@ -1569,10 +1561,10 @@ { "id": "xl_armor_lc_light_chestplate", "type": "ARMOR", - "name": { "str": "XL mild steel light chestplate" }, + "name": { "str": "mild steel light chestplate" }, "copy-from": "armor_lc_light_chestplate", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_mc_light_chestplate", @@ -1585,10 +1577,10 @@ { "id": "xl_armor_mc_light_chestplate", "type": "ARMOR", - "name": { "str": "XL medium steel light chestplate" }, + "name": { "str": "medium steel light chestplate" }, "copy-from": "armor_mc_light_chestplate", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_hc_light_chestplate", @@ -1601,10 +1593,10 @@ { "id": "xl_armor_hc_light_chestplate", "type": "ARMOR", - "name": { "str": "XL high steel light chestplate" }, + "name": { "str": "high steel light chestplate" }, "copy-from": "armor_hc_light_chestplate", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_ch_light_chestplate", @@ -1617,10 +1609,10 @@ { "id": "xl_armor_ch_light_chestplate", "type": "ARMOR", - "name": { "str": "XL hardened light chestplate" }, + "name": { "str": "hardened light chestplate" }, "copy-from": "armor_ch_light_chestplate", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_qt_light_chestplate", @@ -1633,10 +1625,10 @@ { "id": "xl_armor_qt_light_chestplate", "type": "ARMOR", - "name": { "str": "XL tempered light chestplate" }, + "name": { "str": "tempered light chestplate" }, "copy-from": "armor_qt_light_chestplate", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_lc_chestplate", @@ -1685,10 +1677,10 @@ { "id": "xl_armor_lc_chestplate", "type": "ARMOR", - "name": { "str": "XL mild steel chestplate" }, + "name": { "str": "mild steel chestplate" }, "copy-from": "armor_lc_chestplate", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_mc_chestplate", @@ -1701,10 +1693,10 @@ { "id": "xl_armor_mc_chestplate", "type": "ARMOR", - "name": { "str": "XL medium steel chestplate" }, + "name": { "str": "medium steel chestplate" }, "copy-from": "armor_mc_chestplate", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_hc_chestplate", @@ -1717,10 +1709,10 @@ { "id": "xl_armor_hc_chestplate", "type": "ARMOR", - "name": { "str": "XL high steel chestplate" }, + "name": { "str": "high steel chestplate" }, "copy-from": "armor_hc_chestplate", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_ch_chestplate", @@ -1733,10 +1725,10 @@ { "id": "xl_armor_ch_chestplate", "type": "ARMOR", - "name": { "str": "XL hardened chestplate" }, + "name": { "str": "hardened chestplate" }, "copy-from": "armor_ch_chestplate", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_qt_chestplate", @@ -1749,10 +1741,10 @@ { "id": "xl_armor_qt_chestplate", "type": "ARMOR", - "name": { "str": "XL tempered chestplate" }, + "name": { "str": "tempered chestplate" }, "copy-from": "armor_qt_chestplate", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_lc_heavy_chestplate", @@ -1801,10 +1793,10 @@ { "id": "xl_armor_lc_heavy_chestplate", "type": "ARMOR", - "name": { "str": "XL mild steel heavy chestplate" }, + "name": { "str": "mild steel heavy chestplate" }, "copy-from": "armor_lc_heavy_chestplate", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_mc_heavy_chestplate", @@ -1817,10 +1809,10 @@ { "id": "xl_armor_mc_heavy_chestplate", "type": "ARMOR", - "name": { "str": "XL medium steel heavy chestplate" }, + "name": { "str": "medium steel heavy chestplate" }, "copy-from": "armor_mc_heavy_chestplate", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_hc_heavy_chestplate", @@ -1833,10 +1825,10 @@ { "id": "xl_armor_hc_heavy_chestplate", "type": "ARMOR", - "name": { "str": "XL high steel heavy chestplate" }, + "name": { "str": "high steel heavy chestplate" }, "copy-from": "armor_hc_heavy_chestplate", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_ch_heavy_chestplate", @@ -1849,10 +1841,10 @@ { "id": "xl_armor_ch_heavy_chestplate", "type": "ARMOR", - "name": { "str": "XL hardened heavy chestplate" }, + "name": { "str": "hardened heavy chestplate" }, "copy-from": "armor_ch_heavy_chestplate", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_qt_heavy_chestplate", @@ -1865,10 +1857,10 @@ { "id": "xl_armor_qt_heavy_chestplate", "type": "ARMOR", - "name": { "str": "XL tempered heavy chestplate" }, + "name": { "str": "tempered heavy chestplate" }, "copy-from": "armor_qt_heavy_chestplate", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "survivor_adhoc_leather_shirt", @@ -2036,19 +2028,18 @@ { "id": "xl_armor_larmor_chest", "type": "ARMOR", - "name": { "str": "XL leather armor cuirass", "str_pl": "XL leather armor cuirasses" }, + "name": { "str": "leather armor cuirass", "str_pl": "leather armor cuirasses" }, "copy-from": "armor_larmor_chest", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "armor_larmor_chest_xs", "type": "ARMOR", "copy-from": "armor_larmor_chest", - "looks_like": "cuirass_bronze", - "name": { "str": "XS leather armor cuirass", "str_pl": "XS leather armor cuirasses" }, + "name": { "str": "leather armor cuirass", "str_pl": "leather armor cuirasses" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "lc_mirror_armor", @@ -2084,19 +2075,18 @@ { "id": "xl_lc_mirror_armor", "type": "ARMOR", - "name": { "str": "XL mild steel mirror armor", "str_pl": "sets of XL mild steel mirror armor" }, + "name": { "str": "mild steel mirror armor", "str_pl": "sets of mild steel mirror armor" }, "copy-from": "cuirass_lightplate", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_lc_mirror_armor", "type": "ARMOR", "copy-from": "lc_mirror_armor", - "looks_like": "lc_mirror_armor", - "name": { "str": "XS mild steel mirror armor", "str_pl": "sets of XS mild steel mirror armor" }, + "name": { "str": "mild steel mirror armor", "str_pl": "sets of mild steel mirror armor" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "mc_mirror_armor", @@ -2109,19 +2099,18 @@ { "id": "xl_mc_mirror_armor", "type": "ARMOR", - "name": { "str": "XL medium steel mirror armor", "str_pl": "sets of XL medium steel mirror armor" }, + "name": { "str": "medium steel mirror armor", "str_pl": "sets of medium steel mirror armor" }, "copy-from": "mc_mirror_armor", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_mc_mirror_armor", "type": "ARMOR", "copy-from": "mc_mirror_armor", - "looks_like": "mc_mirror_armor", - "name": { "str": "XS medium steel mirror armor", "str_pl": "sets of XS medium steel mirror armor" }, + "name": { "str": "medium steel mirror armor", "str_pl": "sets of medium steel mirror armor" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "hc_mirror_armor", @@ -2134,19 +2123,18 @@ { "id": "xl_hc_mirror_armor", "type": "ARMOR", - "name": { "str": "XL high steel mirror armor", "str_pl": "sets of XL high steel mirror armor" }, + "name": { "str": "high steel mirror armor", "str_pl": "sets of high steel mirror armor" }, "copy-from": "hc_mirror_armor", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_hc_mirror_armor", "type": "ARMOR", "copy-from": "hc_mirror_armor", - "looks_like": "hc_mirror_armor", - "name": { "str": "XS high steel mirror armor", "str_pl": "sets of XS high steel mirror armor" }, + "name": { "str": "high steel mirror armor", "str_pl": "sets of high steel mirror armor" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "ch_mirror_armor", @@ -2159,19 +2147,18 @@ { "id": "xl_ch_mirror_armor", "type": "ARMOR", - "name": { "str": "XL hardened steel mirror armor", "str_pl": "sets of XL hardened steel mirror armor" }, + "name": { "str": "hardened steel mirror armor", "str_pl": "sets of hardened steel mirror armor" }, "copy-from": "ch_mirror_armor", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_ch_mirror_armor", "type": "ARMOR", "copy-from": "ch_mirror_armor", - "looks_like": "ch_mirror_armor", - "name": { "str": "XS hardened steel mirror armor", "str_pl": "sets of XS hardened steel mirror armor" }, + "name": { "str": "hardened steel mirror armor", "str_pl": "sets of hardened steel mirror armor" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "qt_mirror_armor", @@ -2184,18 +2171,17 @@ { "id": "xl_qt_mirror_armor", "type": "ARMOR", - "name": { "str": "XL tempered steel mirror armor", "str_pl": "sets of XL tempered steel mirror armor" }, + "name": { "str": "tempered steel mirror armor", "str_pl": "sets of tempered steel mirror armor" }, "copy-from": "qt_mirror_armor", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_qt_mirror_armor", "type": "ARMOR", "copy-from": "qt_mirror_armor", - "looks_like": "qt_mirror_armor", - "name": { "str": "XS tempered steel mirror armor", "str_pl": "sets of XS tempered steel mirror armor" }, + "name": { "str": "tempered steel mirror armor", "str_pl": "sets of tempered steel mirror armor" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } } ] diff --git a/data/json/items/armor/torso_clothes.json b/data/json/items/armor/torso_clothes.json index 1c40afea1216b..6686334ec4946 100644 --- a/data/json/items/armor/torso_clothes.json +++ b/data/json/items/armor/torso_clothes.json @@ -104,13 +104,13 @@ "id": "waist_apron_long_xl", "copy-from": "waist_apron_long", "type": "ARMOR", - "name": { "str": "XL long waist apron" }, - "extend": { "flags": [ "OVERSIZE" ] }, + "name": { "str": "long waist apron" }, + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] }, "proportional": { "weight": 1.5, "volume": 1.5 }, "variants": [ { "id": "maid_apron_xl", - "name": { "str": "XL maid long waist apron" }, + "name": { "str": "maid long waist apron" }, "description": "It's colored white with black frilly decorations, commonly used with a maid dress or alone for nighttime activities.", "append": true } @@ -120,13 +120,13 @@ "id": "waist_apron_long_xs", "copy-from": "waist_apron_long", "type": "ARMOR", - "name": { "str": "XS long waist apron" }, - "extend": { "flags": [ "UNDERSIZE" ] }, + "name": { "str": "long waist apron" }, + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] }, "proportional": { "weight": 0.5, "volume": 0.5 }, "variants": [ { "id": "maid_apron_xs", - "name": { "str": "XS maid long waist apron" }, + "name": { "str": "maid long waist apron" }, "description": "It's colored white with black frilly decorations, commonly used with a maid dress or alone for nighttime activities.", "append": true } @@ -237,13 +237,13 @@ "id": "waist_apron_short_xl", "copy-from": "waist_apron_short", "type": "ARMOR", - "name": { "str": "XL short waist apron" }, - "extend": { "flags": [ "OVERSIZE" ] }, + "name": { "str": "short waist apron" }, + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] }, "proportional": { "weight": 1.5, "volume": 1.5 }, "variants": [ { "id": "maid_apron_xl", - "name": { "str": "XL maid short waist apron" }, + "name": { "str": "maid short waist apron" }, "description": "It's colored white with black frilly decorations, commonly used with a maid dress or alone for nighttime activities.", "append": true } @@ -253,13 +253,13 @@ "id": "waist_apron_short_xs", "copy-from": "waist_apron_short", "type": "ARMOR", - "name": { "str": "XS short waist apron" }, - "extend": { "flags": [ "UNDERSIZE" ] }, + "name": { "str": "short waist apron" }, + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] }, "proportional": { "weight": 0.5, "volume": 0.5 }, "variants": [ { "id": "maid_apron_xs", - "name": { "str": "XS maid short waist apron" }, + "name": { "str": "maid short waist apron" }, "description": "It's colored white with black frilly decorations, commonly used with a maid dress or alone for nighttime activities.", "append": true } @@ -361,13 +361,13 @@ "id": "apron_cotton_xl", "copy-from": "apron_cotton", "type": "ARMOR", - "name": { "str": "XL cotton apron" }, - "extend": { "flags": [ "OVERSIZE" ] }, + "name": { "str": "cotton apron" }, + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] }, "proportional": { "weight": 1.5, "volume": 1.5 }, "variants": [ { "id": "maid_apron_xl", - "name": { "str": "XL maid apron" }, + "name": { "str": "maid apron" }, "description": "It's colored white with black frilly decorations, commonly used with a maid dress or alone for nighttime activities.", "append": true } @@ -377,13 +377,13 @@ "id": "apron_cotton_xs", "copy-from": "apron_cotton", "type": "ARMOR", - "name": { "str": "XS cotton apron" }, - "extend": { "flags": [ "UNDERSIZE" ] }, + "name": { "str": "cotton apron" }, + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] }, "proportional": { "weight": 0.5, "volume": 0.5 }, "variants": [ { "id": "maid_apron_xs", - "name": { "str": "XS maid apron" }, + "name": { "str": "maid apron" }, "description": "It's colored white with black frilly decorations, commonly used with a maid dress or alone for nighttime activities.", "append": true } @@ -1149,16 +1149,16 @@ "id": "maid_dress_xl", "copy-from": "maid_dress", "type": "ARMOR", - "name": { "str_sp": "XL French maid clothes" }, - "extend": { "flags": [ "OVERSIZE" ] }, + "name": { "str_sp": "French maid clothes" }, + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] }, "proportional": { "weight": 1.5, "volume": 1.5 } }, { "id": "maid_dress_xs", "copy-from": "maid_dress", "type": "ARMOR", - "name": { "str_sp": "XS French maid clothes" }, - "extend": { "flags": [ "UNDERSIZE" ] }, + "name": { "str_sp": "French maid clothes" }, + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] }, "proportional": { "weight": 0.5, "volume": 0.5 } }, { @@ -1209,16 +1209,16 @@ "id": "maid_dress_short_xl", "copy-from": "maid_dress_short", "type": "ARMOR", - "name": { "str_sp": "XL short French maid clothes" }, - "extend": { "flags": [ "OVERSIZE" ] }, + "name": { "str_sp": "short French maid clothes" }, + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] }, "proportional": { "weight": 1.5, "volume": 1.5 } }, { "id": "maid_dress_short_xs", "copy-from": "maid_dress_short", "type": "ARMOR", - "name": { "str_sp": "XS short French maid clothes" }, - "extend": { "flags": [ "UNDERSIZE" ] }, + "name": { "str_sp": "short French maid clothes" }, + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] }, "proportional": { "weight": 0.5, "volume": 0.5 } }, { diff --git a/data/json/items/armor/undergarment.json b/data/json/items/armor/undergarment.json index 9f8935fb9fd89..ec04ca48a95e8 100644 --- a/data/json/items/armor/undergarment.json +++ b/data/json/items/armor/undergarment.json @@ -27,19 +27,19 @@ { "id": "xl_arm_warmers", "type": "ARMOR", - "name": { "str": "pair of XL arm warmers", "str_pl": "pairs of XL arm warmers" }, + "name": { "str": "pair of arm warmers", "str_pl": "pairs of arm warmers" }, "weight": "49 g", "volume": "350 ml", "copy-from": "arm_warmers", - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_arm_warmers", "type": "ARMOR", "copy-from": "arm_warmers", - "name": { "str": "pair of XS arm warmers", "str_pl": "pairs of XS arm warmers" }, + "name": { "str": "pair of arm warmers", "str_pl": "pairs of arm warmers" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "bellyband", @@ -292,17 +292,17 @@ "id": "xl_binder_top", "type": "ARMOR", "copy-from": "binder_top", - "name": { "str": "XL binder" }, + "name": { "str": "binder" }, "proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_binder_top", "type": "ARMOR", "copy-from": "binder_top", - "name": { "str": "XS binder" }, + "name": { "str": "binder" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "boxer_briefs", @@ -325,19 +325,19 @@ { "id": "xlboxer_briefs", "type": "ARMOR", - "name": { "str": "XL boxer briefs", "str_pl": "pairs of XL boxer briefs" }, + "name": { "str": "boxer briefs", "str_pl": "pairs of boxer briefs" }, "weight": "50 g", "volume": "350 ml", "copy-from": "boxer_briefs", - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xsboxer_briefs", "type": "ARMOR", "copy-from": "boxer_briefs", - "name": { "str": "XS boxer briefs", "str_pl": "pairs of XS boxer briefs" }, + "name": { "str": "boxer briefs", "str_pl": "pairs of boxer briefs" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "boxer_shorts", @@ -378,19 +378,19 @@ { "id": "xlboxer_shorts", "type": "ARMOR", - "name": { "str": "XL boxer shorts", "str_pl": "pairs of XL boxer shorts" }, + "name": { "str": "boxer shorts", "str_pl": "pairs of boxer shorts" }, "weight": "72 g", "volume": "500 ml", "copy-from": "boxer_shorts", - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xsboxer_shorts", "type": "ARMOR", "copy-from": "boxer_shorts", - "name": { "str": "XS boxer shorts", "str_pl": "pairs of XS boxer shorts" }, + "name": { "str": "boxer shorts", "str_pl": "pairs of boxer shorts" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "boy_shorts", @@ -431,19 +431,19 @@ { "id": "xlboy_shorts", "type": "ARMOR", - "name": { "str": "XL boy shorts", "str_pl": "pairs of XL boy shorts" }, + "name": { "str": "boy shorts", "str_pl": "pairs of boy shorts" }, "weight": "72 g", "volume": "500 ml", "copy-from": "boy_shorts", - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xsboy_shorts", "type": "ARMOR", "copy-from": "boy_shorts", - "name": { "str": "XS boy shorts", "str_pl": "pairs of XS boy shorts" }, + "name": { "str": "boy shorts", "str_pl": "pairs of boy shorts" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "bra", @@ -467,17 +467,17 @@ "id": "xl_bra", "type": "ARMOR", "copy-from": "bra", - "name": { "str": "XL bra" }, + "name": { "str": "bra" }, "proportional": { "weight": 1.5, "volume": 1.5, "price": 1.25 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_bra", "type": "ARMOR", "copy-from": "bra", - "name": { "str": "XS bra" }, + "name": { "str": "bra" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "briefs", @@ -758,7 +758,7 @@ { "id": "leg_warmers_xl", "type": "ARMOR", - "name": { "str": "pair of XL leg warmers", "str_pl": "pairs of XL leg warmers" }, + "name": { "str": "pair of leg warmers", "str_pl": "pairs of leg warmers" }, "description": "Large, soft, snug cloth sleeves to keep your exotic anatomy warm.", "weight": "90 g", "volume": "750 ml", @@ -770,7 +770,7 @@ "color": "light_gray", "warmth": 20, "material_thickness": 2, - "flags": [ "VARSIZE", "SKINTIGHT", "OVERSIZE" ], + "flags": [ "VARSIZE", "SKINTIGHT", "OVERSIZE", "PREFIX_XL" ], "armor": [ { "encumbrance": 7, @@ -785,9 +785,9 @@ "id": "leg_warmers_xs", "type": "ARMOR", "copy-from": "leg_warmers", - "name": { "str": "pair of XS leg warmers", "str_pl": "pairs of XS leg warmers" }, + "name": { "str": "pair of leg warmers", "str_pl": "pairs of leg warmers" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "long_underpants", @@ -912,19 +912,19 @@ { "id": "xlsports_bra", "type": "ARMOR", - "name": { "str": "XL sports bra" }, + "name": { "str": "sports bra" }, "weight": "160 g", "volume": "750 ml", "copy-from": "sports_bra", - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xssports_bra", "type": "ARMOR", "copy-from": "sports_bra", - "name": { "str": "XS sports bra" }, + "name": { "str": "sports bra" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "tank_top", diff --git a/data/json/items/melee/unarmed_weapons.json b/data/json/items/melee/unarmed_weapons.json index 28d2b7abea3bb..c3fcfdd7b9d67 100644 --- a/data/json/items/melee/unarmed_weapons.json +++ b/data/json/items/melee/unarmed_weapons.json @@ -47,18 +47,18 @@ { "id": "xl_cestus", "type": "ARMOR", - "name": { "str": "XL cestus", "str_pl": "XL cesti" }, + "name": { "str": "cestus", "str_pl": "cesti" }, "copy-from": "cestus", "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_cestus", "type": "ARMOR", - "name": { "str": "XS cestus", "str_pl": "XS cesti" }, + "name": { "str": "cestus", "str_pl": "cesti" }, "copy-from": "cestus", "proportional": { "weight": 0.75, "volume": 0.75 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "type": "ARMOR", @@ -87,18 +87,18 @@ { "id": "xl_knuckle_brass", "type": "ARMOR", - "name": { "str": "pair of XL brass knuckles", "str_pl": "pairs of XL brass knuckles" }, + "name": { "str": "pair of brass knuckles", "str_pl": "pairs of brass knuckles" }, "copy-from": "knuckle_brass", "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_knuckle_brass", "type": "ARMOR", - "name": { "str": "pair of XS brass knuckles", "str_pl": "pairs of XS brass knuckles" }, + "name": { "str": "pair of brass knuckles", "str_pl": "pairs of brass knuckles" }, "copy-from": "knuckle_brass", "proportional": { "weight": 0.75, "volume": 0.75 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "type": "ARMOR", @@ -127,18 +127,18 @@ { "id": "xl_knuckle_nail", "type": "ARMOR", - "name": { "str": "pair of XL nail knuckles", "str_pl": "pairs of XL nail knuckles" }, + "name": { "str": "pair of nail knuckles", "str_pl": "pairs of nail knuckles" }, "copy-from": "knuckle_nail", "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_knuckle_nail", "type": "ARMOR", - "name": { "str": "pair of XS nail knuckles", "str_pl": "pairs of XS nail knuckles" }, + "name": { "str": "pair of nail knuckles", "str_pl": "pairs of nail knuckles" }, "copy-from": "knuckle_nail", "proportional": { "weight": 0.75, "volume": 0.75 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "type": "ARMOR", @@ -167,18 +167,18 @@ { "id": "xl_knuckle_steel", "type": "ARMOR", - "name": { "str": "pair of XL scrap knuckles", "str_pl": "pairs of XL scrap knuckles" }, + "name": { "str": "pair of scrap knuckles", "str_pl": "pairs of scrap knuckles" }, "copy-from": "knuckle_steel", "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_knuckle_steel", "type": "ARMOR", - "name": { "str": "pair of XS scrap knuckles", "str_pl": "pairs of XS scrap knuckles" }, + "name": { "str": "pair of scrap knuckles", "str_pl": "pairs of scrap knuckles" }, "copy-from": "knuckle_steel", "proportional": { "weight": 0.75, "volume": 0.75 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "type": "ARMOR", @@ -209,18 +209,18 @@ { "id": "xl_knuckle_steel_forged", "type": "ARMOR", - "name": { "str": "pair of XL steel knuckles", "str_pl": "pairs of XL steel knuckles" }, + "name": { "str": "pair of steel knuckles", "str_pl": "pairs of steel knuckles" }, "copy-from": "knuckle_steel_forged", "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_knuckle_steel_forged", "type": "ARMOR", - "name": { "str": "pair of XS steel knuckles", "str_pl": "pairs of XS steel knuckles" }, + "name": { "str": "pair of steel knuckles", "str_pl": "pairs of steel knuckles" }, "copy-from": "knuckle_steel_forged", "proportional": { "weight": 0.75, "volume": 0.75 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "gloves_studded", @@ -278,18 +278,18 @@ { "id": "xl_gloves_studded", "type": "ARMOR", - "name": { "str": "pair of XL studded gloves", "str_pl": "pairs of XL studded gloves" }, + "name": { "str": "pair of studded gloves", "str_pl": "pairs of studded gloves" }, "copy-from": "gloves_studded", "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_gloves_studded", "type": "ARMOR", - "name": { "str": "pair of XS studded gloves", "str_pl": "pairs of XS studded gloves" }, + "name": { "str": "pair of studded gloves", "str_pl": "pairs of studded gloves" }, "copy-from": "gloves_studded", "proportional": { "weight": 0.75, "volume": 0.75 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "knuckle_impact", @@ -320,18 +320,18 @@ { "id": "xl_knuckle_impact", "type": "ARMOR", - "name": { "str_sp": "XL impact knuckles" }, + "name": { "str_sp": "impact knuckles" }, "copy-from": "knuckle_impact", "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_knuckle_impact", "type": "ARMOR", - "name": { "str_sp": "XS impact knuckles" }, + "name": { "str_sp": "impact knuckles" }, "copy-from": "knuckle_impact", "proportional": { "weight": 0.75, "volume": 0.75 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } }, { "id": "knuckle_skewer", @@ -355,17 +355,17 @@ { "id": "xl_knuckle_skewer", "type": "ARMOR", - "name": { "str_sp": "XL skewer knuckles" }, + "name": { "str_sp": "skewer knuckles" }, "copy-from": "knuckle_skewer", "proportional": { "weight": 1.5, "volume": 1.5 }, - "extend": { "flags": [ "OVERSIZE" ] } + "extend": { "flags": [ "OVERSIZE", "PREFIX_XL" ] } }, { "id": "xs_knuckle_skewer", "type": "ARMOR", - "name": { "str_sp": "XS skewer knuckles" }, + "name": { "str_sp": "skewer knuckles" }, "copy-from": "knuckle_skewer", "proportional": { "weight": 0.75, "volume": 0.75 }, - "extend": { "flags": [ "UNDERSIZE" ] } + "extend": { "flags": [ "UNDERSIZE", "PREFIX_XS" ] } } ] diff --git a/data/json/items/tool_armor.json b/data/json/items/tool_armor.json index e0f7370247979..ff9d8fa476bf0 100644 --- a/data/json/items/tool_armor.json +++ b/data/json/items/tool_armor.json @@ -21,7 +21,7 @@ { "id": "arm_xlsplint", "type": "ARMOR", - "name": { "str": "arm splint XL", "str_pl": "arm splints XL" }, + "name": { "str": "arm splint" }, "description": "A tool to help set arm bones and hold them in place. It is specifically designed to fit Huge survivors.", "copy-from": "arm_splint", "looks_like": "arm_splint", @@ -30,12 +30,12 @@ "price": "250 USD", "price_postapoc": "50 cent", "material": [ "wood", "cotton" ], - "flags": [ "OVERSIZE", "WATER_FRIENDLY", "OUTER", "SPLINT" ] + "flags": [ "OVERSIZE", "PREFIX_XL", "WATER_FRIENDLY", "OUTER", "SPLINT" ] }, { "id": "arm_xs_splint", "type": "ARMOR", - "name": { "str": "arm splint XS", "str_pl": "arm splints XS" }, + "name": { "str": "arm splint" }, "description": "A tool to help set arm bones and hold them in place. It is specifically designed to fit Tiny survivors.", "copy-from": "arm_splint", "looks_like": "arm_splint", @@ -43,7 +43,7 @@ "volume": "500 ml", "price": "150 USD", "price_postapoc": "50 cent", - "flags": [ "UNDERSIZE", "WATER_FRIENDLY", "OUTER", "SPLINT" ] + "flags": [ "UNDERSIZE", "PREFIX_XS", "WATER_FRIENDLY", "OUTER", "SPLINT" ] }, { "id": "tourniquet_upper", @@ -68,25 +68,25 @@ { "id": "tourniquet_upper_XL", "type": "ARMOR", - "name": { "str": "tourniquet (arm XL)", "str_pl": "tourniquets (arm XL)" }, + "name": { "str": "tourniquet (arm)", "str_pl": "tourniquets (arm)" }, "description": "A first aid device used to apply pressure to a limb or extremity in order to limit blood flow. Should be employed only to manage heavy bleeding, because prolonged use will harm the limb. It can be adjusted in size to fit different limbs.", "copy-from": "tourniquet_upper", "looks_like": "tourniquet_upper", "sided": true, "use_action": { "target": "tourniquet_upper_XS", "msg": "You adjust the tourniquet.", "menu_text": "Adjust", "type": "transform" }, - "flags": [ "WATER_FRIENDLY", "OUTER", "TOURNIQUET", "OVERSIZE" ] + "flags": [ "WATER_FRIENDLY", "OUTER", "TOURNIQUET", "OVERSIZE", "PREFIX_XL" ] }, { "id": "tourniquet_upper_XS", "type": "ARMOR", - "name": { "str": "tourniquet (arm XS)", "str_pl": "tourniquets (arm XS)" }, + "name": { "str": "tourniquet (arm)", "str_pl": "tourniquets (arm)" }, "description": "A first aid device used to apply pressure to a limb or extremity in order to limit blood flow. Should be employed only to manage heavy bleeding, because prolonged use will harm the limb. It can be adjusted in size to fit different limbs.", "copy-from": "tourniquet_upper", "looks_like": "tourniquet_upper", "covers": [ "arm_l", "arm_r" ], "sided": true, "use_action": { "target": "tourniquet_lower", "msg": "You adjust the tourniquet.", "menu_text": "Adjust", "type": "transform" }, - "flags": [ "WATER_FRIENDLY", "OUTER", "TOURNIQUET", "UNDERSIZE" ] + "flags": [ "WATER_FRIENDLY", "OUTER", "TOURNIQUET", "UNDERSIZE", "PREFIX_XS" ] }, { "id": "tourniquet_lower", @@ -104,24 +104,24 @@ { "id": "tourniquet_lower_XL", "type": "ARMOR", - "name": { "str": "tourniquet (leg XL)", "str_pl": "tourniquets (leg XL)" }, + "name": { "str": "tourniquet (leg)", "str_pl": "tourniquets (leg)" }, "description": "A first aid device used to apply pressure to a limb or extremity in order to limit blood flow. Should be employed only to manage heavy bleeding, because prolonged use will harm the limb. It can be adjusted in size to fit different limbs.", "copy-from": "tourniquet_lower", "looks_like": "tourniquet_lower", "sided": true, "use_action": { "target": "tourniquet_lower_XS", "msg": "You adjust the tourniquet.", "menu_text": "Adjust", "type": "transform" }, - "flags": [ "WATER_FRIENDLY", "OUTER", "TOURNIQUET", "OVERSIZE", "ALLOWS_TAIL" ] + "flags": [ "WATER_FRIENDLY", "OUTER", "TOURNIQUET", "OVERSIZE", "PREFIX_XL", "ALLOWS_TAIL" ] }, { "id": "tourniquet_lower_XS", "type": "ARMOR", - "name": { "str": "tourniquet (leg XS)", "str_pl": "tourniquets (leg XS)" }, + "name": { "str": "tourniquet (leg)", "str_pl": "tourniquets (leg)" }, "description": "A first aid device used to apply pressure to a limb or extremity in order to limit blood flow. Should be employed only to manage heavy bleeding, because prolonged use will harm the limb. It can be adjusted in size to fit different limbs.", "copy-from": "tourniquet_lower", "looks_like": "tourniquet_lower", "sided": true, "use_action": { "target": "tourniquet_upper", "msg": "You adjust the tourniquet.", "menu_text": "Adjust", "type": "transform" }, - "flags": [ "WATER_FRIENDLY", "OUTER", "TOURNIQUET", "UNDERSIZE", "ALLOWS_TAIL" ] + "flags": [ "WATER_FRIENDLY", "OUTER", "TOURNIQUET", "UNDERSIZE", "PREFIX_XS", "ALLOWS_TAIL" ] }, { "id": "makeshift_blindfold", @@ -316,7 +316,7 @@ { "id": "leg_xlsplint", "type": "ARMOR", - "name": { "str": "leg splint XL", "str_pl": "leg splints XL" }, + "name": { "str": "leg splint" }, "description": "A tool to help set leg bones and hold them in place. It is specifically designed to fit Huge people.", "copy-from": "leg_splint", "weight": "1000 g", @@ -324,19 +324,19 @@ "price": "250 USD", "price_postapoc": "50 cent", "material": [ "wood", "cotton" ], - "flags": [ "OVERSIZE", "WATER_FRIENDLY", "OUTER", "SPLINT", "ALLOWS_TAIL" ] + "flags": [ "OVERSIZE", "PREFIX_XL", "WATER_FRIENDLY", "OUTER", "SPLINT", "ALLOWS_TAIL" ] }, { "id": "leg_xs_splint", "type": "ARMOR", - "name": { "str": "leg splint XS", "str_pl": "leg splints XS" }, + "name": { "str": "leg splint" }, "description": "A tool to help set leg bones and hold them in place. It is specifically designed to fit Tiny people.", "copy-from": "leg_splint", "weight": "250 g", "volume": "500 ml", "price": "250 USD", "price_postapoc": "50 cent", - "flags": [ "UNDERSIZE", "WATER_FRIENDLY", "OUTER", "SPLINT", "ALLOWS_TAIL" ] + "flags": [ "UNDERSIZE", "PREFIX_XS", "WATER_FRIENDLY", "OUTER", "SPLINT", "ALLOWS_TAIL" ] }, { "id": "miner_hat", @@ -1820,9 +1820,9 @@ "category": "clothing", "symbol": "[", "color": "dark_gray", - "name": { "str": "XL rebreather mask" }, + "name": { "str": "rebreather mask" }, "description": "A mask worn over your mouth which, when loaded with the proper filters, recycles your exhaled breath for rebreathing while underwater. This model has been expanded substantially and can accommodate exotic anatomy. Use it to turn it on.", - "flags": [ "WATER_FRIENDLY", "OVERSIZE" ], + "flags": [ "WATER_FRIENDLY", "OVERSIZE", "PREFIX_XL" ], "price": "250 USD", "price_postapoc": "5 USD", "material": [ "plastic", "aluminum" ], @@ -1856,10 +1856,10 @@ "id": "rebreather_xl_on", "copy-from": "rebreather_xl", "type": "TOOL_ARMOR", - "name": { "str": "XL rebreather mask (on)", "str_pl": "XL rebreather masks (on)" }, + "name": { "str": "rebreather mask (on)", "str_pl": "rebreather masks (on)" }, "material": [ "plastic", "aluminum" ], "description": "A mask worn over your mouth which, when loaded with the proper filters, recycles your exhaled breath for rebreathing while underwater. This model has been expanded substantially and can accommodate exotic anatomy. It is turned on, and continually consuming its filter. Use it to turn it off.", - "flags": [ "WATER_FRIENDLY", "REBREATHER", "OVERSIZE", "TRADER_AVOID" ], + "flags": [ "WATER_FRIENDLY", "REBREATHER", "OVERSIZE", "PREFIX_XL", "TRADER_AVOID" ], "turns_per_charge": 60, "revert_to": "rebreather_xl", "use_action": { @@ -1878,9 +1878,9 @@ "category": "clothing", "symbol": "[", "color": "dark_gray", - "name": { "str": "XS rebreather mask" }, + "name": { "str": "rebreather mask" }, "description": "A mask worn over your mouth which, when loaded with the proper filters, recycles your exhaled breath for rebreathing while underwater. This model has been shrunk dramatically to fit a smaller face. Use it to turn it on.", - "flags": [ "WATER_FRIENDLY", "UNDERSIZE" ], + "flags": [ "WATER_FRIENDLY", "UNDERSIZE", "PREFIX_XS" ], "price": "250 USD", "price_postapoc": "5 USD", "material": [ "plastic", "aluminum" ], @@ -1915,9 +1915,9 @@ "id": "rebreather_xs_on", "copy-from": "rebreather_xs", "type": "TOOL_ARMOR", - "name": { "str": "XS rebreather mask (on)", "str_pl": "XS rebreather masks (on)" }, + "name": { "str": "rebreather mask (on)", "str_pl": "rebreather masks (on)" }, "description": "A mask worn over your mouth which, when loaded with the proper filters, recycles your exhaled breath for rebreathing while underwater. This model has been shrunk dramatically to fit a smaller face. It is turned on, and continually consuming its filter. Use it to turn it off.", - "flags": [ "WATER_FRIENDLY", "REBREATHER", "UNDERSIZE", "TRADER_AVOID" ], + "flags": [ "WATER_FRIENDLY", "REBREATHER", "UNDERSIZE", "PREFIX_XS", "TRADER_AVOID" ], "turns_per_charge": 60, "revert_to": "rebreather_xs", "use_action": { "type": "transform", "menu_text": "Turn off", "msg": "Your %s deactivates.", "target": "rebreather_xs" }, @@ -1996,7 +1996,7 @@ { "id": "mask_gas_xl", "type": "TOOL_ARMOR", - "name": { "str": "XL gas mask" }, + "name": { "str": "gas mask" }, "category": "clothing", "description": "A rather roomy mask with filters attached, designed to accommodate exotic anatomy. Provides excellent protection from smoke, tear gas, and other contaminants. It must be prepared before use.", "weight": "1397 g", @@ -2026,12 +2026,12 @@ "ammo": "gasfilter_m", "use_action": [ "GASMASK_ACTIVATE" ], "tick_action": [ "GASMASK" ], - "flags": [ "OVERSIZE", "SLEEP_IGNORE" ] + "flags": [ "OVERSIZE", "PREFIX_XL", "SLEEP_IGNORE" ] }, { "id": "mask_gas_xs", "type": "TOOL_ARMOR", - "name": { "str": "XS gas mask" }, + "name": { "str": "gas mask" }, "category": "clothing", "description": "A rather small gas mask that covers the face and eyes. Provides excellent protection from smoke, tear gas, and other contaminants. It must be prepared before use.", "weight": "470 g", @@ -2061,7 +2061,7 @@ "ammo": "gasfilter_m", "use_action": [ "GASMASK_ACTIVATE" ], "tick_action": [ "GASMASK" ], - "flags": [ "VARSIZE", "UNDERSIZE", "SLEEP_IGNORE" ] + "flags": [ "VARSIZE", "UNDERSIZE", "PREFIX_XS", "SLEEP_IGNORE" ] }, { "id": "mask_gas_half", @@ -2147,18 +2147,18 @@ "type": "TOOL_ARMOR", "copy-from": "mask_fsurvivor", "looks_like": "mask_fsurvivor", - "name": { "str": "XL survivor firemask" }, + "name": { "str": "survivor firemask" }, "proportional": { "weight": 1.25, "volume": 1.25, "price": 0.5 }, - "flags": [ "VARSIZE", "STURDY", "OVERSIZE", "SUN_GLASSES", "SLEEP_IGNORE", "PADDED", "UNRESTRICTED" ] + "flags": [ "VARSIZE", "STURDY", "OVERSIZE", "PREFIX_XL", "SUN_GLASSES", "SLEEP_IGNORE", "PADDED", "UNRESTRICTED" ] }, { "id": "mask_fsurvivorxs", "type": "TOOL_ARMOR", "copy-from": "mask_fsurvivor", "looks_like": "mask_fsurvivor", - "name": { "str": "XS survivor firemask" }, + "name": { "str": "survivor firemask" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "flags": [ "VARSIZE", "STURDY", "SUN_GLASSES", "SLEEP_IGNORE", "UNDERSIZE", "PADDED", "UNRESTRICTED" ] + "flags": [ "VARSIZE", "STURDY", "SUN_GLASSES", "SLEEP_IGNORE", "UNDERSIZE", "PREFIX_XS", "PADDED", "UNRESTRICTED" ] }, { "id": "mask_bunker", @@ -2262,18 +2262,18 @@ "type": "TOOL_ARMOR", "copy-from": "mask_hsurvivor", "looks_like": "mask_hsurvivor", - "name": { "str": "XL heavy survivor mask" }, + "name": { "str": "heavy survivor mask" }, "proportional": { "weight": 1.25, "volume": 1.25, "price": 0.5 }, - "flags": [ "VARSIZE", "STURDY", "OVERSIZE", "SUN_GLASSES", "SLEEP_IGNORE", "PADDED", "UNRESTRICTED" ] + "flags": [ "VARSIZE", "STURDY", "OVERSIZE", "PREFIX_XL", "SUN_GLASSES", "SLEEP_IGNORE", "PADDED", "UNRESTRICTED" ] }, { "id": "mask_hsurvivorxs", "type": "TOOL_ARMOR", "copy-from": "mask_hsurvivor", "looks_like": "mask_hsurvivor", - "name": { "str": "XS heavy survivor mask" }, + "name": { "str": "heavy survivor mask" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "flags": [ "VARSIZE", "STURDY", "SUN_GLASSES", "SLEEP_IGNORE", "UNDERSIZE", "PADDED", "UNRESTRICTED" ] + "flags": [ "VARSIZE", "STURDY", "SUN_GLASSES", "SLEEP_IGNORE", "UNDERSIZE", "PREFIX_XS", "PADDED", "UNRESTRICTED" ] }, { "id": "mask_lsurvivor", @@ -2318,18 +2318,18 @@ "type": "TOOL_ARMOR", "copy-from": "mask_lsurvivor", "looks_like": "mask_lsurvivor", - "name": { "str": "XL survivor half mask" }, + "name": { "str": "survivor half mask" }, "proportional": { "weight": 1.25, "volume": 1.25, "price": 0.5 }, - "flags": [ "VARSIZE", "STURDY", "OVERSIZE", "SUN_GLASSES", "SLEEP_IGNORE", "UNRESTRICTED" ] + "flags": [ "VARSIZE", "STURDY", "OVERSIZE", "PREFIX_XL", "SUN_GLASSES", "SLEEP_IGNORE", "UNRESTRICTED" ] }, { "id": "mask_lsurvivorxs", "type": "TOOL_ARMOR", "copy-from": "mask_lsurvivor", "looks_like": "mask_lsurvivor", - "name": { "str": "XS survivor half mask" }, + "name": { "str": "survivor half mask" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "flags": [ "VARSIZE", "STURDY", "SUN_GLASSES", "SLEEP_IGNORE", "UNDERSIZE", "UNRESTRICTED" ] + "flags": [ "VARSIZE", "STURDY", "SUN_GLASSES", "SLEEP_IGNORE", "UNDERSIZE", "PREFIX_XS", "UNRESTRICTED" ] }, { "id": "mask_survivor", @@ -2380,18 +2380,18 @@ "type": "TOOL_ARMOR", "copy-from": "mask_survivor", "looks_like": "mask_survivor", - "name": { "str": "XL survivor mask" }, + "name": { "str": "survivor mask" }, "proportional": { "weight": 1.25, "volume": 1.25, "price": 0.5 }, - "flags": [ "VARSIZE", "STURDY", "OVERSIZE", "SUN_GLASSES", "SLEEP_IGNORE", "PADDED", "UNRESTRICTED" ] + "flags": [ "VARSIZE", "STURDY", "OVERSIZE", "PREFIX_XL", "SUN_GLASSES", "SLEEP_IGNORE", "PADDED", "UNRESTRICTED" ] }, { "id": "mask_survivorxs", "type": "TOOL_ARMOR", "copy-from": "mask_survivor", "looks_like": "mask_survivor", - "name": { "str": "XS survivor mask" }, + "name": { "str": "survivor mask" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "flags": [ "VARSIZE", "STURDY", "SUN_GLASSES", "SLEEP_IGNORE", "UNDERSIZE", "PADDED", "UNRESTRICTED" ] + "flags": [ "VARSIZE", "STURDY", "SUN_GLASSES", "SLEEP_IGNORE", "UNDERSIZE", "PREFIX_XS", "PADDED", "UNRESTRICTED" ] }, { "id": "goggles_nv", @@ -2620,10 +2620,10 @@ "type": "TOOL_ARMOR", "copy-from": "mask_h20survivor", "looks_like": "mask_h20survivor", - "name": { "str": "XL survivor divemask" }, + "name": { "str": "survivor divemask" }, "description": "A custom-built, armored rebreather mask that covers the face and eyes. Provides excellent protection from harm as well providing breathing gas while underwater. Use it to turn it on.", "proportional": { "weight": 1.25, "volume": 1.25, "price": 1.5 }, - "flags": [ "VARSIZE", "STURDY", "WATER_FRIENDLY", "SWIM_GOGGLES", "OVERSIZE" ], + "flags": [ "VARSIZE", "STURDY", "WATER_FRIENDLY", "SWIM_GOGGLES", "OVERSIZE", "PREFIX_XL" ], "use_action": { "type": "transform", "msg": "You activate your %s.", @@ -2638,7 +2638,7 @@ "type": "TOOL_ARMOR", "copy-from": "mask_h20survivor", "looks_like": "mask_h20survivor", - "name": { "str": "XS survivor divemask" }, + "name": { "str": "survivor divemask" }, "description": "A custom-built, armored rebreather mask that covers the face and eyes. Provides excellent protection from harm as well providing breathing gas while underwater. Use it to turn it on.", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, "use_action": { @@ -2649,15 +2649,15 @@ "need_charges": 1, "need_charges_msg": "The %s's filter is used up." }, - "flags": [ "VARSIZE", "STURDY", "WATER_FRIENDLY", "SWIM_GOGGLES", "UNDERSIZE" ] + "flags": [ "VARSIZE", "STURDY", "WATER_FRIENDLY", "SWIM_GOGGLES", "UNDERSIZE", "PREFIX_XS" ] }, { "id": "mask_h20survivorxl_on", "copy-from": "mask_h20survivorxl", "type": "TOOL_ARMOR", - "name": { "str": "XL survivor divemask (on)", "str_pl": "XL survivor divemasks (on)" }, + "name": { "str": "survivor divemask (on)", "str_pl": "survivor divemasks (on)" }, "description": "A custom-built, armored rebreather mask that covers the face and eyes regardless of your state of mutation. Provides excellent protection from harm as well providing breathing gas while underwater. It is turned on, and continually consuming its filter. Use it to turn it off.", - "flags": [ "VARSIZE", "STURDY", "WATER_FRIENDLY", "REBREATHER", "SWIM_GOGGLES", "OVERSIZE", "TRADER_AVOID" ], + "flags": [ "VARSIZE", "STURDY", "WATER_FRIENDLY", "REBREATHER", "SWIM_GOGGLES", "OVERSIZE", "PREFIX_XL", "TRADER_AVOID" ], "turns_per_charge": 60, "revert_to": "mask_h20survivorxl", "use_action": { @@ -2674,10 +2674,10 @@ "type": "TOOL_ARMOR", "copy-from": "mask_h20survivor", "looks_like": "mask_h20survivor", - "name": { "str": "XS survivor divemask (on)", "str_pl": "XS survivor divemasks (on)" }, + "name": { "str": "survivor divemask (on)", "str_pl": "survivor divemasks (on)" }, "description": "A custom-built, armored rebreather mask that covers the face and eyes. Provides excellent protection from harm as well providing breathing gas while underwater. Use it to turn it on.", "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "flags": [ "VARSIZE", "STURDY", "WATER_FRIENDLY", "REBREATHER", "SWIM_GOGGLES", "UNDERSIZE", "TRADER_AVOID" ], + "flags": [ "VARSIZE", "STURDY", "WATER_FRIENDLY", "REBREATHER", "SWIM_GOGGLES", "UNDERSIZE", "PREFIX_XS", "TRADER_AVOID" ], "turns_per_charge": 60, "revert_to": "mask_h20survivorxs", "use_action": { diff --git a/doc/JSON_FLAGS.md b/doc/JSON_FLAGS.md index a125e6647e735..f7f0456e9df1f 100644 --- a/doc/JSON_FLAGS.md +++ b/doc/JSON_FLAGS.md @@ -219,6 +219,8 @@ Some armor flags, such as `WATCH` and `ALARMCLOCK` are compatible with other ite - ```PERSONAL``` This item goes in the personal aura layer, intended for metaphysical effects. - ```POCKETS``` Increases warmth for hands if the player's hands are cold and the player is wielding nothing. - ```POWERARMOR_COMPATIBLE``` Makes item compatible with power armor despite other parameters causing failure. +- ```PREFIX_XL``` Adds the XL prefix to the item name. +- ```PREFIX_XS``` Adds the XS prefix to the item name. - ```PSYSHIELD_PARTIAL``` 25% chance to protect against `fear_paralyze` monster attack when worn. - ```RAD_PROOF``` This piece of clothing completely protects you from radiation. - ```RAD_RESIST``` This piece of clothing partially (75%) protects you from radiation. From 460bd4d31c2b50cefd2904c13d1863329a88d819 Mon Sep 17 00:00:00 2001 From: Victoria Eastep <114838742+BarndoBoi@users.noreply.github.com> Date: Wed, 1 May 2024 16:07:39 -0400 Subject: [PATCH 004/104] Add simpler installation requirement for metal tray --- data/json/requirements/vehicle.json | 7 +++++++ data/json/vehicleparts/cargo.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/data/json/requirements/vehicle.json b/data/json/requirements/vehicle.json index 651cf8146cfd1..73c3dfe052c75 100644 --- a/data/json/requirements/vehicle.json +++ b/data/json/requirements/vehicle.json @@ -31,6 +31,13 @@ "qualities": [ { "id": "WRENCH", "level": 2 }, { "id": "DRILL", "level": 2 } ], "components": [ [ [ "nuts_bolts", 20 ] ] ] }, + { + "id": "vehicle_bolt_install_simple", + "type": "requirement", + "//": "for simple installs that only require tightening bolts", + "qualities": [ { "id": "WRENCH", "level": 1 } ], + "components": [ [ [ "nuts_bolts", 4 ] ] ] + }, { "id": "vehicle_nail_removal", "type": "requirement", diff --git a/data/json/vehicleparts/cargo.json b/data/json/vehicleparts/cargo.json index 526f2c7b4a4e3..e086f9fe262eb 100644 --- a/data/json/vehicleparts/cargo.json +++ b/data/json/vehicleparts/cargo.json @@ -32,7 +32,7 @@ "item": "sheet_metal", "location": "center", "requirements": { - "install": { "skills": [ [ "fabrication", 1 ] ], "time": "5 m", "using": [ [ "vehicle_bolt_install", 1 ] ] }, + "install": { "skills": [ [ "fabrication", 1 ] ], "time": "5 m", "using": [ [ "vehicle_bolt_install_simple", 1 ] ] }, "removal": { "skills": [ [ "fabrication", 1 ] ], "time": "5 m", "using": [ [ "vehicle_wrench_1", 1 ] ] }, "repair": { "skills": [ [ "fabrication", 2 ], [ "mechanics", 2 ] ], "time": "5 m", "using": [ [ "repair_welding_standard", 5 ] ] } }, From 6a362148c31818abc573393954cdb998c1718ea1 Mon Sep 17 00:00:00 2001 From: Victoria Eastep <114838742+BarndoBoi@users.noreply.github.com> Date: Wed, 1 May 2024 21:34:19 -0400 Subject: [PATCH 005/104] Add loot spawns to cart The cart will sometimes spawn with medical supplies on it, as you would expect. --- data/json/vehicles/carts.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/data/json/vehicles/carts.json b/data/json/vehicles/carts.json index fff4cb9f8daa4..b921888ee4c30 100644 --- a/data/json/vehicles/carts.json +++ b/data/json/vehicles/carts.json @@ -363,6 +363,7 @@ "type": "vehicle", "name": "Surgical Cart", "blueprint": [ "#" ], - "parts": [ { "x": 0, "y": 0, "parts": [ "xlframe#vertical_2", "wheel_caster", "metal_tray" ] } ] + "parts": [ { "x": 0, "y": 0, "parts": [ "xlframe#vertical_2", "wheel_caster", "metal_tray" ] } ], + "items": [ { "x": 0, "y": 0, "chance": 40, "item_groups": [ "gear_medical" ] } ] } ] From 50f9737c14d427df6a552d85e1de3446185e25db Mon Sep 17 00:00:00 2001 From: Ronald Coppieters Date: Fri, 19 Apr 2024 18:29:23 +0200 Subject: [PATCH 006/104] Misc repair kit draws ammo from nearby player --- data/json/flags.json | 4 ++ .../itemgroups/Clothing_Gear/clothing.json | 2 +- .../Locations_MapExtras/locations.json | 2 +- .../locations_commercial.json | 4 +- data/json/itemgroups/activities_hobbies.json | 4 +- data/json/itemgroups/collections_trades.json | 2 +- data/json/itemgroups/tools.json | 4 +- data/json/items/tool/workshop.json | 3 +- data/json/npcs/NC_JUNK_SHOPKEEP.json | 2 +- data/json/npcs/godco/classes.json | 2 +- data/json/npcs/items_generic.json | 2 +- data/json/vehicles/helicopters.json | 6 +-- src/activity_handlers.cpp | 13 +++-- src/flag.cpp | 1 + src/flag.h | 1 + src/item.cpp | 52 +++++++++++++++++-- 16 files changed, 79 insertions(+), 25 deletions(-) diff --git a/data/json/flags.json b/data/json/flags.json index 065bad919e303..6118fe672319d 100644 --- a/data/json/flags.json +++ b/data/json/flags.json @@ -1888,6 +1888,10 @@ "id": "USES_BIONIC_POWER", "type": "json_flag" }, + { + "id": "USES_NEARBY_AMMO", + "type": "json_flag" + }, { "id": "USE_EAT_VERB", "type": "json_flag" diff --git a/data/json/itemgroups/Clothing_Gear/clothing.json b/data/json/itemgroups/Clothing_Gear/clothing.json index b2a3629411e79..50e1b4dcf2ce3 100644 --- a/data/json/itemgroups/Clothing_Gear/clothing.json +++ b/data/json/itemgroups/Clothing_Gear/clothing.json @@ -3386,7 +3386,7 @@ [ "throw_extinguisher", 2 ], { "item": "small_repairkit", "prob": 14, "charges": [ 0, 500 ] }, [ "grapnel", 6 ], - { "item": "misc_repairkit", "prob": 8, "charges": [ 0, -1 ] }, + { "item": "misc_repairkit", "prob": 8 }, { "distribution": [ { "group": "full_survival_kit" }, { "group": "used_survival_kit" } ], "prob": 3 }, { "group": "tools_toolbox", "prob": 1 }, [ "survivor_belt_notools", 2 ], diff --git a/data/json/itemgroups/Locations_MapExtras/locations.json b/data/json/itemgroups/Locations_MapExtras/locations.json index 1695395c3eb03..40fa80f78a8f8 100644 --- a/data/json/itemgroups/Locations_MapExtras/locations.json +++ b/data/json/itemgroups/Locations_MapExtras/locations.json @@ -1849,7 +1849,7 @@ { "item": "wearable_light", "prob": 10, "charges": [ 0, 100 ] }, [ "antiparasitic", 5 ], { "prob": 5, "group": "diazepam_bottle_plastic_pill_prescription_1_10" }, - { "item": "misc_repairkit", "prob": 5, "charges": [ 0, -1 ] }, + { "item": "misc_repairkit", "prob": 5 }, { "group": "tools_toolbox", "prob": 2 }, [ "apron_cotton", 5 ], [ "apron_leather", 5 ], diff --git a/data/json/itemgroups/Locations_MapExtras/locations_commercial.json b/data/json/itemgroups/Locations_MapExtras/locations_commercial.json index cc0ba6af4cae7..91e2a33956b0f 100644 --- a/data/json/itemgroups/Locations_MapExtras/locations_commercial.json +++ b/data/json/itemgroups/Locations_MapExtras/locations_commercial.json @@ -1196,7 +1196,7 @@ { "item": "manual_fabrication", "prob": 20 }, { "item": "duct_tape", "prob": 70, "charges": [ 50, 200 ] }, { "item": "superglue", "prob": 25 }, - { "item": "misc_repairkit", "prob": 15, "charges": [ 0, -1 ] }, + { "item": "misc_repairkit", "prob": 15 }, { "group": "tools_toolbox", "prob": 2 } ] }, @@ -1257,7 +1257,7 @@ { "item": "socket_screwdriver_set", "prob": 20 }, { "item": "duct_tape", "prob": 50 }, { "item": "superglue", "prob": 10 }, - { "item": "misc_repairkit", "prob": 25, "charges": 200 }, + { "item": "misc_repairkit", "prob": 25 }, { "group": "tools_toolbox", "prob": 2 } ] } diff --git a/data/json/itemgroups/activities_hobbies.json b/data/json/itemgroups/activities_hobbies.json index 6e19f2749a658..bb0de81cc0d21 100644 --- a/data/json/itemgroups/activities_hobbies.json +++ b/data/json/itemgroups/activities_hobbies.json @@ -242,7 +242,7 @@ [ "rope_30", 35 ], [ "hatchet", 10 ], [ "storage_line", 20 ], - { "item": "misc_repairkit", "prob": 5, "charges": [ 0, -1 ] }, + { "item": "misc_repairkit", "prob": 5 }, { "item": "mess_kit", "prob": 10 }, { "item": "portable_stove", "prob": 10, "container-item": "nylon_bag" }, [ "pot", 20 ], @@ -462,7 +462,7 @@ [ "rope_30", 35 ], [ "hatchet", 10 ], [ "storage_line", 20 ], - { "item": "misc_repairkit", "prob": 5, "charges": [ 0, -1 ] }, + { "item": "misc_repairkit", "prob": 5 }, { "item": "mess_kit", "prob": 10 }, [ "pot", 20 ], [ "folded_inflatable_boat", 25 ], diff --git a/data/json/itemgroups/collections_trades.json b/data/json/itemgroups/collections_trades.json index 39fa16c2adab1..d2a1c0f307c4c 100644 --- a/data/json/itemgroups/collections_trades.json +++ b/data/json/itemgroups/collections_trades.json @@ -41,7 +41,7 @@ { "item": "cable", "prob": 60 }, { "item": "sm_extinguisher", "prob": 10, "charges": 10 }, { "item": "grapnel", "prob": 1 }, - { "item": "misc_repairkit", "prob": 5, "charges": [ 0, -1 ] }, + { "item": "misc_repairkit", "prob": 5 }, { "item": "knitting_needles", "prob": 1 }, { "item": "medium_propane_tank", "prob": 20, "count": [ 1, 2 ], "charges": 15000 } ] diff --git a/data/json/itemgroups/tools.json b/data/json/itemgroups/tools.json index e9a07f6efa24a..116326b8631ab 100644 --- a/data/json/itemgroups/tools.json +++ b/data/json/itemgroups/tools.json @@ -118,7 +118,7 @@ [ "rake", 15 ], [ "rake_plastic", 25 ], [ "aluminum_stepladder", 5 ], - { "item": "misc_repairkit", "prob": 25, "charges": [ 0, -1 ] }, + { "item": "misc_repairkit", "prob": 25 }, [ "saw", 60 ], { "item": "bow_saw", "prob": 50 }, { "group": "tools_common_small", "prob": 500 } @@ -861,7 +861,7 @@ [ "vac_mold", 10 ], [ "polycarbonate_sheet", 50 ], [ "duct_tape", 8 ], - { "item": "misc_repairkit", "prob": 15, "charges": [ 0, -1 ] }, + { "item": "misc_repairkit", "prob": 15 }, { "item": "welder", "prob": 10 }, { "item": "welding_blanket", "prob": 10, "count": [ 0, 1 ] }, { diff --git a/data/json/items/tool/workshop.json b/data/json/items/tool/workshop.json index aa992c0a53fb4..72a693790ad00 100644 --- a/data/json/items/tool/workshop.json +++ b/data/json/items/tool/workshop.json @@ -758,7 +758,6 @@ "symbol": ";", "color": "light_gray", "ammo": [ "tape" ], - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "tape": 200 } } ], "charges_per_use": 5, "qualities": [ [ "CUT", 2 ], [ "CUT_FINE", 2 ], [ "AXE", 1 ], [ "SAW_W", 2 ], [ "BUTCHER", 7 ], [ "FABRIC_CUT", 1 ] ], "use_action": [ @@ -772,7 +771,7 @@ "move_cost": 1000 } ], - "flags": [ "ALLOWS_REMOTE_USE" ], + "flags": [ "ALLOWS_REMOTE_USE", "USES_NEARBY_AMMO" ], "melee_damage": { "bash": 2 } }, { diff --git a/data/json/npcs/NC_JUNK_SHOPKEEP.json b/data/json/npcs/NC_JUNK_SHOPKEEP.json index e6e3bd0f00f7a..23d4eb466e8d8 100644 --- a/data/json/npcs/NC_JUNK_SHOPKEEP.json +++ b/data/json/npcs/NC_JUNK_SHOPKEEP.json @@ -101,7 +101,7 @@ { "prob": 15, "group": "diazepam_bottle_plastic_pill_prescription_10" }, { "item": "small_repairkit", "prob": 20 }, { "item": "grapnel", "prob": 5 }, - { "item": "misc_repairkit", "prob": 15, "charges": [ 0, -1 ] }, + { "item": "misc_repairkit", "prob": 15 }, { "group": "tools_toolbox", "prob": 20 }, { "item": "crowbar", "prob": 25 }, { "item": "machete", "prob": 25 }, diff --git a/data/json/npcs/godco/classes.json b/data/json/npcs/godco/classes.json index bc005a54cc10e..cd359a97f8af7 100644 --- a/data/json/npcs/godco/classes.json +++ b/data/json/npcs/godco/classes.json @@ -1025,10 +1025,10 @@ "items": [ { "item": "rebreather", "prob": 3, "ammo-item": "rebreather_cartridge_o2" }, { "item": "UPS_off", "prob": 5, "charges": [ 0, 1000 ] }, - { "item": "misc_repairkit", "prob": 20, "charges": [ 25, -1 ] }, { "item": "bbgun", "prob": 15, "charges": [ 100, -1 ] }, { "item": "bb", "prob": 10, "charges": [ 100, -1 ] }, { "item": "tailors_kit", "prob": 15, "charges": [ 0, -1 ] }, + { "item": "misc_repairkit", "prob": 20 }, { "item": "heavy_flashlight", "prob": 20, "charges": [ 100, 300 ] }, { "item": "glowstick", "prob": 50, "charges": 1400 }, { "item": "handflare", "prob": 50, "charges": 300 }, diff --git a/data/json/npcs/items_generic.json b/data/json/npcs/items_generic.json index f886ee0082ee3..f4564ca2a8b3c 100644 --- a/data/json/npcs/items_generic.json +++ b/data/json/npcs/items_generic.json @@ -817,7 +817,7 @@ [ "meth", 5 ], [ "milk_powder", 3 ], [ "mintpatties", 3 ], - { "item": "misc_repairkit", "prob": 5, "charges": [ 0, -1 ] }, + { "item": "misc_repairkit", "prob": 5 }, [ "ballistic_vest_esapi", 1 ], [ "molasses", 3 ], [ "money_strap_one", 10 ], diff --git a/data/json/vehicles/helicopters.json b/data/json/vehicles/helicopters.json index 12684fa7a1666..ab4e0245ac87b 100644 --- a/data/json/vehicles/helicopters.json +++ b/data/json/vehicles/helicopters.json @@ -1590,7 +1590,7 @@ { "x": -1, "y": 2, "chance": 7, "items": [ "wrench" ] }, { "x": -1, "y": 2, "chance": 5, "items": [ "duct_tape" ] }, { "x": -1, "y": 2, "chance": 7, "items": [ "mag_fieldrepair" ] }, - { "x": -1, "y": 2, "chance": 7, "items": [ "misc_repairkit" ], "ammo": 100 }, + { "x": -1, "y": 2, "chance": 7, "items": [ "misc_repairkit" ] }, { "x": -1, "y": 2, "chance": 5, "items": [ "two_way_radio" ] }, { "x": 0, "y": 2, "chance": 7, "items": [ "roadmap" ] }, { "x": 0, "y": 2, "chance": 7, "items": [ "pockknife" ] }, @@ -1711,7 +1711,7 @@ { "x": -1, "y": 2, "chance": 7, "items": [ "wrench" ] }, { "x": -1, "y": 2, "chance": 5, "items": [ "duct_tape" ] }, { "x": -1, "y": 2, "chance": 7, "items": [ "mag_fieldrepair" ] }, - { "x": -1, "y": 2, "chance": 7, "items": [ "misc_repairkit" ], "ammo": 100 }, + { "x": -1, "y": 2, "chance": 7, "items": [ "misc_repairkit" ] }, { "x": -1, "y": 2, "chance": 5, "items": [ "two_way_radio" ] }, { "x": 0, "y": 2, "chance": 7, "items": [ "roadmap" ] }, { "x": 0, "y": 2, "chance": 7, "items": [ "pockknife" ] }, @@ -1818,7 +1818,7 @@ { "x": -1, "y": 2, "chance": 7, "items": [ "wrench" ] }, { "x": -1, "y": 2, "chance": 5, "items": [ "duct_tape" ] }, { "x": -1, "y": 2, "chance": 7, "items": [ "mag_fieldrepair" ] }, - { "x": -1, "y": 2, "chance": 7, "items": [ "misc_repairkit" ], "ammo": 100 }, + { "x": -1, "y": 2, "chance": 7, "items": [ "misc_repairkit" ] }, { "x": -1, "y": 2, "chance": 5, "items": [ "two_way_radio" ] }, { "x": 0, "y": 2, "chance": 7, "items": [ "roadmap" ] }, { "x": 0, "y": 2, "chance": 7, "items": [ "pockknife" ] }, diff --git a/src/activity_handlers.cpp b/src/activity_handlers.cpp index 924bfcef8946e..9fe12c8d4e261 100644 --- a/src/activity_handlers.cpp +++ b/src/activity_handlers.cpp @@ -2564,10 +2564,15 @@ void repair_item_finish( player_activity *act, Character *you, bool no_menu ) } } - title += string_format( _( "Charges: %s/%s %s (%s per use)\n" ), - ammo_remaining, used_tool->ammo_capacity( current_ammo, true ), - ammo_name, - used_tool->ammo_required() ); + title += used_tool->is_tool() && used_tool->has_flag( flag_USES_NEARBY_AMMO ) + ? string_format( _( "Charges: %s %s (%s per use)\n" ), + ammo_remaining, + ammo_name, + used_tool->ammo_required() ) + : string_format( _( "Charges: %s/%s %s (%s per use)\n" ), + ammo_remaining, used_tool->ammo_capacity( current_ammo, true ), + ammo_name, + used_tool->ammo_required() ); title += string_format( _( "Materials available: %s\n" ), string_join( material_list, ", " ) ); title += string_format( _( "Skill used: %s (%s)\n" ), actor->used_skill.obj().name(), level ); diff --git a/src/flag.cpp b/src/flag.cpp index 613fe80f34616..4f318499d00fb 100644 --- a/src/flag.cpp +++ b/src/flag.cpp @@ -349,6 +349,7 @@ const flag_id flag_UNRECOVERABLE( "UNRECOVERABLE" ); const flag_id flag_UNRESTRICTED( "UNRESTRICTED" ); const flag_id flag_URSINE_HONEY( "URSINE_HONEY" ); const flag_id flag_USES_BIONIC_POWER( "USES_BIONIC_POWER" ); +const flag_id flag_USES_NEARBY_AMMO( "USES_NEARBY_AMMO" ); const flag_id flag_USE_EAT_VERB( "USE_EAT_VERB" ); const flag_id flag_USE_PLAYER_ENERGY( "USE_PLAYER_ENERGY" ); const flag_id flag_USE_POWER_WHEN_HIT( "USE_POWER_WHEN_HIT" ); diff --git a/src/flag.h b/src/flag.h index b3cb0bbe6c1d4..1310783db6514 100644 --- a/src/flag.h +++ b/src/flag.h @@ -353,6 +353,7 @@ extern const flag_id flag_UNRECOVERABLE; extern const flag_id flag_UNRESTRICTED; extern const flag_id flag_URSINE_HONEY; extern const flag_id flag_USES_BIONIC_POWER; +extern const flag_id flag_USES_NEARBY_AMMO; extern const flag_id flag_USE_EAT_VERB; extern const flag_id flag_USE_PLAYER_ENERGY; extern const flag_id flag_USE_POWER_WHEN_HIT; diff --git a/src/item.cpp b/src/item.cpp index 2b217c4492bef..f64c1be94004b 100644 --- a/src/item.cpp +++ b/src/item.cpp @@ -6889,7 +6889,9 @@ std::string item::display_name( unsigned int quantity ) const max_amount = mag->ammo_capacity( item_controller->find_template( mag->ammo_default() )->ammo->type ); } - + } else if( is_tool() && has_flag( flag_USES_NEARBY_AMMO ) ) { + show_amt = true; + amount = ammo_remaining( player_character.as_character() ); } else if( !ammo_types().empty() ) { // anything that can be reloaded including tools, magazines, guns and auxiliary gunmods // but excluding bows etc., which have ammo, but can't be reloaded @@ -10680,6 +10682,14 @@ int item::shots_remaining( const Character *carrier ) const int item::ammo_remaining( const std::set &ammo, const Character *carrier, const bool include_linked ) const { + const bool is_tool_with_carrier = carrier != nullptr && is_tool(); + + if( is_tool_with_carrier && has_flag( flag_USES_NEARBY_AMMO ) && !ammo.empty() ) { + const inventory &crafting_inventory = carrier->crafting_inventory(); + const ammotype &a = *ammo.begin(); + return crafting_inventory.charges_of( a->default_ammotype(), INT_MAX ); + } + int ret = 0; // Magazine in the item @@ -10725,7 +10735,7 @@ int item::ammo_remaining( const std::set &ammo, const Character *carri // UPS/bionic power can replace ammo requirement. // Only for tools. Guns should always use energy_drain for electricity use. - if( carrier != nullptr && type->tool ) { + if( is_tool_with_carrier ) { if( has_flag( flag_USES_BIONIC_POWER ) ) { ret += units::to_kilojoule( carrier->get_power_level() ); } @@ -10882,6 +10892,23 @@ int item::ammo_consume( int qty, const tripoint &pos, Character *carrier ) return 0; } const int wanted_qty = qty; + const bool is_tool_with_carrier = carrier != nullptr && is_tool(); + + if( is_tool_with_carrier && has_flag( flag_USES_NEARBY_AMMO ) ) { + const ammotype ammo = ammo_type(); + if( !ammo.is_null() ) { + const inventory &carrier_inventory = carrier->crafting_inventory(); + itype_id ammo_type = ammo->default_ammotype(); + const int charges_avalable = carrier_inventory.charges_of( ammo_type, INT_MAX ); + + qty = std::min( wanted_qty, charges_avalable ); + + std::vector components; + components.emplace_back( ammo_type, qty ); + carrier->consume_items( components, 1 ); + return wanted_qty - qty; + } + } // Consume power from appliances/vehicles connected with cables if( has_link_data() ) { @@ -10917,10 +10944,11 @@ int item::ammo_consume( int qty, const tripoint &pos, Character *carrier ) qty -= charg_used; } + bool is_off_grid_powered = has_flag( flag_USE_UPS ) || has_flag( flag_USES_BIONIC_POWER ); + // Modded tools can consume UPS/bionic energy instead of ammo. // Guns handle energy in energy_consume() - if( carrier != nullptr && type->tool && - ( has_flag( flag_USE_UPS ) || has_flag( flag_USES_BIONIC_POWER ) ) ) { + if( is_tool_with_carrier && is_off_grid_powered ) { units::energy wanted_energy = units::from_kilojoule( static_cast( qty ) ); if( has_flag( flag_USE_UPS ) ) { @@ -11024,6 +11052,9 @@ itype_id item::ammo_current() const if( ammo ) { return ammo->get_id(); } + if( is_tool() && has_flag( flag_USES_NEARBY_AMMO ) ) { + return ammo_default(); + } return itype_id::NULL_ID(); } @@ -11067,6 +11098,11 @@ std::set item::ammo_types( bool conversion ) const if( is_gun() ) { return type->gun->ammo; } + + if( is_tool() && has_flag( flag_USES_NEARBY_AMMO ) ) { + return type->tool->ammo_id; + } + return contents.ammo_types(); } @@ -11075,6 +11111,14 @@ ammotype item::ammo_type() const if( is_ammo() ) { return type->ammo->type; } + + if( is_tool() && has_flag( flag_USES_NEARBY_AMMO ) ) { + const std::set ammo_type_choices = ammo_types(); + if( !ammo_type_choices.empty() ) { + return *ammo_type_choices.begin(); + } + } + return ammotype::NULL_ID(); } From c2993c05e455a24e23958f126552afbd2bfb9daa Mon Sep 17 00:00:00 2001 From: KamikazieBoater Date: Fri, 3 May 2024 05:48:33 -0700 Subject: [PATCH 007/104] add combat exoskeleton template to aftershock nanofab --- .../maps/furniture_and_terrain/terrain_manufactured.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/mods/Aftershock/maps/furniture_and_terrain/terrain_manufactured.json b/data/mods/Aftershock/maps/furniture_and_terrain/terrain_manufactured.json index ca24586defcb8..0de2b3e56ed9e 100644 --- a/data/mods/Aftershock/maps/furniture_and_terrain/terrain_manufactured.json +++ b/data/mods/Aftershock/maps/furniture_and_terrain/terrain_manufactured.json @@ -5,7 +5,7 @@ "name": "nanofabricator control panel", "symbol": "&", "description": "A small computer panel attached to a nanofabricator. It has a single slot for reading templates.", - "allowed_template_ids": [ "standard_template_construct", "debug_template", "afs_10mm_smart_template" ], + "allowed_template_ids": [ "standard_template_construct", "standard_template_construct_combat_exoskeleton", "debug_template", "afs_10mm_smart_template" ], "color": "red", "looks_like": "f_console", "move_cost": 0, From 305fb252492499b2fd9fb062ee4ebea8aadfb19f Mon Sep 17 00:00:00 2001 From: Victoria Eastep <114838742+BarndoBoi@users.noreply.github.com> Date: Fri, 3 May 2024 20:57:02 -0400 Subject: [PATCH 008/104] Remove items from cart to prep to place them in maps instead. Renames surgical_cart to medical_cart --- data/json/vehicles/carts.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/data/json/vehicles/carts.json b/data/json/vehicles/carts.json index b921888ee4c30..7587eeb9df734 100644 --- a/data/json/vehicles/carts.json +++ b/data/json/vehicles/carts.json @@ -359,11 +359,10 @@ "parts": [ { "x": 0, "y": 0, "parts": [ "xlframe#vertical_2", "wheel_10", "bed" ] } ] }, { - "id": "surgical_cart", + "id": "medical_cart", "type": "vehicle", "name": "Surgical Cart", "blueprint": [ "#" ], - "parts": [ { "x": 0, "y": 0, "parts": [ "xlframe#vertical_2", "wheel_caster", "metal_tray" ] } ], - "items": [ { "x": 0, "y": 0, "chance": 40, "item_groups": [ "gear_medical" ] } ] + "parts": [ { "x": 0, "y": 0, "parts": [ "xlframe#vertical_2", "wheel_caster", "metal_tray" ] } ] } ] From 0aa60c94882664dd54c138501674f55fdfe69c2e Mon Sep 17 00:00:00 2001 From: RenechCDDA <84619419+RenechCDDA@users.noreply.github.com> Date: Fri, 3 May 2024 22:10:02 -0400 Subject: [PATCH 009/104] Rename a function for clarity --- src/cata_tiles.cpp | 2 +- src/npc.cpp | 3 --- src/npc.h | 2 +- src/npcmove.cpp | 4 ++-- src/ranged.cpp | 1 + tests/npc_attack_test.cpp | 20 ++++++++++---------- 6 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/cata_tiles.cpp b/src/cata_tiles.cpp index 0eaa347af9638..ff707696e1ca7 100644 --- a/src/cata_tiles.cpp +++ b/src/cata_tiles.cpp @@ -1239,7 +1239,7 @@ static std::map display_npc_attack_potential() JsonValue jsin = json_loader::from_string( os.str() ); jsin.read( avatar_as_npc ); avatar_as_npc.regen_ai_cache(); - avatar_as_npc.evaluate_best_weapon( nullptr ); + avatar_as_npc.evaluate_best_attack( nullptr ); std::map effectiveness_map; std::vector effectiveness = avatar_as_npc.get_current_attack()->all_evaluations( avatar_as_npc, nullptr ); diff --git a/src/npc.cpp b/src/npc.cpp index 693c3001b198b..07fd27e7370fb 100644 --- a/src/npc.cpp +++ b/src/npc.cpp @@ -3804,11 +3804,8 @@ void npc::update_missions_target( character_id old_character, character_id new_c const dialogue_chatbin_snippets &npc::chat_snippets() const { - if( idz.is_null() ) { static dialogue_chatbin_snippets dummy; return dummy; - } - return idz->snippets; } std::unique_ptr get_talker_for( npc &guy ) diff --git a/src/npc.h b/src/npc.h index a06abb6af5125..4625c512f1046 100644 --- a/src/npc.h +++ b/src/npc.h @@ -1130,7 +1130,7 @@ class npc : public Character // among the different attack methods the npc has available, what's the best one in the current situation? // picks among melee, guns, spells, etc. // updates the ai_cache - void evaluate_best_weapon( const Creature *target ); + void evaluate_best_attack( const Creature *target ); float estimate_armour( const Character &candidate ) const; static std::array, npc_need::num_needs> need_data; diff --git a/src/npcmove.cpp b/src/npcmove.cpp index 1de7c8cb454d9..5e876579b448d 100644 --- a/src/npcmove.cpp +++ b/src/npcmove.cpp @@ -1971,7 +1971,7 @@ npc_action npc::method_of_attack() // if there's enough of a threat to be here, power up the combat CBMs and any combat items. prepare_for_combat(); - evaluate_best_weapon( critter ); + evaluate_best_attack( critter ); std::optional potential = ai_cache.current_attack_evaluation.value(); if( potential && *potential > 0 ) { @@ -1982,7 +1982,7 @@ npc_action npc::method_of_attack() } } -void npc::evaluate_best_weapon( const Creature *target ) +void npc::evaluate_best_attack( const Creature *target ) { std::shared_ptr best_attack; npc_attack_rating best_evaluated_attack; diff --git a/src/ranged.cpp b/src/ranged.cpp index f07a5999078fc..cd6331c9826ff 100644 --- a/src/ranged.cpp +++ b/src/ranged.cpp @@ -1323,6 +1323,7 @@ dealt_projectile_attack Character::throw_item( const tripoint &target, const ite const std::optional &blind_throw_from_pos ) { // Copy the item, we may alter it before throwing + debugmsg("%s throwing item %s", disp_name(), to_throw.tname() ); item thrown = to_throw; const int move_cost = throw_cost( *this, to_throw ); diff --git a/tests/npc_attack_test.cpp b/tests/npc_attack_test.cpp index 009068ca15015..6c1f5ad359650 100644 --- a/tests/npc_attack_test.cpp +++ b/tests/npc_attack_test.cpp @@ -82,7 +82,7 @@ TEST_CASE( "NPC_faces_zombies", "[npc_attack]" ) REQUIRE( main_npc.get_wielded_item()->typeId() == itype_knife_chef ); THEN( "NPC attempts to melee the enemy target" ) { - main_npc.evaluate_best_weapon( zombie ); + main_npc.evaluate_best_attack( zombie ); const std::shared_ptr &attack = main_npc.get_current_attack(); npc_attack_melee *melee_attack = dynamic_cast( attack.get() ); CHECK( melee_attack ); @@ -102,7 +102,7 @@ TEST_CASE( "NPC_faces_zombies", "[npc_attack]" ) REQUIRE( !main_npc.rules.has_flag( ally_rule::use_silent ) ); THEN( "NPC tries to shoot the enemy target" ) { - main_npc.evaluate_best_weapon( zombie ); + main_npc.evaluate_best_attack( zombie ); const std::shared_ptr &attack = main_npc.get_current_attack(); npc_attack_gun *ranged_attack = dynamic_cast( attack.get() ); CHECK( ranged_attack ); @@ -117,7 +117,7 @@ TEST_CASE( "NPC_faces_zombies", "[npc_attack]" ) REQUIRE( main_npc.rules.has_flag( ally_rule::use_silent ) ); THEN( "NPC can't fire his weapon" ) { - main_npc.evaluate_best_weapon( zombie ); + main_npc.evaluate_best_attack( zombie ); const std::shared_ptr &attack = main_npc.get_current_attack(); npc_attack_gun *ranged_attack = dynamic_cast( attack.get() ); CHECK( !ranged_attack ); @@ -128,7 +128,7 @@ TEST_CASE( "NPC_faces_zombies", "[npc_attack]" ) REQUIRE( !main_npc.rules.has_flag( ally_rule::use_guns ) ); THEN( "NPC can't fire his weapon" ) { - main_npc.evaluate_best_weapon( zombie ); + main_npc.evaluate_best_attack( zombie ); const std::shared_ptr &attack = main_npc.get_current_attack(); npc_attack_gun *ranged_attack = dynamic_cast( attack.get() ); CHECK( !ranged_attack ); @@ -141,7 +141,7 @@ TEST_CASE( "NPC_faces_zombies", "[npc_attack]" ) REQUIRE( main_npc.get_wielded_item()->typeId() == itype_rock ); THEN( "NPC doesn't bother throwing the rocks so close" ) { - main_npc.evaluate_best_weapon( zombie ); + main_npc.evaluate_best_attack( zombie ); const std::shared_ptr &attack = main_npc.get_current_attack(); npc_attack_throw *throw_attack = dynamic_cast( attack.get() ); CHECK( !throw_attack ); @@ -213,7 +213,7 @@ TEST_CASE( "NPC_faces_zombies", "[npc_attack]" ) REQUIRE( main_npc.get_wielded_item()->typeId() == itype_knife_chef ); THEN( "NPC attempts to melee the enemy target" ) { - main_npc.evaluate_best_weapon( zombie ); + main_npc.evaluate_best_attack( zombie ); const std::shared_ptr &attack = main_npc.get_current_attack(); npc_attack_melee *melee_attack = dynamic_cast( attack.get() ); CHECK( melee_attack ); @@ -230,7 +230,7 @@ TEST_CASE( "NPC_faces_zombies", "[npc_attack]" ) REQUIRE( main_npc.get_wielded_item()->typeId() == itype_rock ); THEN( "NPC throws rocks at the zombie" ) { - main_npc.evaluate_best_weapon( zombie ); + main_npc.evaluate_best_attack( zombie ); const std::shared_ptr &attack = main_npc.get_current_attack(); npc_attack_throw *throw_attack = dynamic_cast( attack.get() ); CHECK( throw_attack ); @@ -247,7 +247,7 @@ TEST_CASE( "NPC_faces_zombies", "[npc_attack]" ) REQUIRE( main_npc.get_wielded_item()->typeId() == itype_knife_chef ); WHEN( "NPC is targetting closest zombie" ) { - main_npc.evaluate_best_weapon( zombie ); + main_npc.evaluate_best_attack( zombie ); THEN( "NPC tries to attack closest zombie" ) { const std::shared_ptr &attack = main_npc.get_current_attack(); @@ -261,7 +261,7 @@ TEST_CASE( "NPC_faces_zombies", "[npc_attack]" ) } WHEN( "NPC is targetting farthest zombie" ) { WHEN( "Furthest zombie is at full HP" ) { - main_npc.evaluate_best_weapon( zombie_far ); + main_npc.evaluate_best_attack( zombie_far ); THEN( "NPC tries to attack closest zombie" ) { const std::shared_ptr &attack = main_npc.get_current_attack(); @@ -275,7 +275,7 @@ TEST_CASE( "NPC_faces_zombies", "[npc_attack]" ) } WHEN( "Furthest zombie is at low HP" ) { zombie_far->set_hp( 1 ); - main_npc.evaluate_best_weapon( zombie_far ); + main_npc.evaluate_best_attack( zombie_far ); THEN( "NPC tries to attack furthest zombie" ) { const std::shared_ptr &attack = main_npc.get_current_attack(); From 3ded5c28f090643fa40e6c7c7c3ac3f21e79f1b7 Mon Sep 17 00:00:00 2001 From: Victoria Eastep <114838742+BarndoBoi@users.noreply.github.com> Date: Fri, 3 May 2024 22:27:23 -0400 Subject: [PATCH 010/104] Attempt to place cart (and fail), plus fix medical cart's name. I'll try again later UwU --- data/json/mapgen/office_doctor.json | 7 ++++--- data/json/mapgen_palettes/office_doctor.json | 4 +++- data/json/vehicles/carts.json | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/data/json/mapgen/office_doctor.json b/data/json/mapgen/office_doctor.json index e2a206cba12ea..34823e491fbdd 100644 --- a/data/json/mapgen/office_doctor.json +++ b/data/json/mapgen/office_doctor.json @@ -16,10 +16,10 @@ " w....bbbb....bbbb.w ", " #................y# ", " ##+##cc%##++####### ", - " #s.#d.h.y#..#Scc.y# ", + " #s.#d.h.y#..#Scc^y# ", " #&.#d.......!....I# ", " ##########..#.tt.I# ", - " #f.f#I.th#..#....I# ", + " #f.f#I^th#..#....I# ", " #f.f#I...+..####### ", " #f.f#IccS#..#HHllO# ", " ##+#######..#H...O# ", @@ -42,7 +42,8 @@ "c": { "item": "gear_medical", "chance": 60, "repeat": [ 2, 4 ] }, "e": { "item": "SUS_fridge_breakroom", "chance": 80 }, "t": { "item": "gear_medical", "chance": 60, "repeat": [ 2, 4 ] }, - "f": { "item": "office_paper", "chance": 70, "repeat": [ 1, 3 ] } + "f": { "item": "office_paper", "chance": 70, "repeat": [ 1, 3 ] }, + "^": { "item": "geat_medical", "chance": 60, "repeat": [ 1, 2 ] } }, "place_items": [ { "item": "record_patient", "x": 7, "y": 6, "chance": 50 } ], "place_loot": [ { "item": "anesthetic_kit", "x": 16, "y": [ 14, 17 ], "chance": 75, "ammo": 100 } ], diff --git a/data/json/mapgen_palettes/office_doctor.json b/data/json/mapgen_palettes/office_doctor.json index 591848cdd532e..846f1ccab7691 100644 --- a/data/json/mapgen_palettes/office_doctor.json +++ b/data/json/mapgen_palettes/office_doctor.json @@ -23,6 +23,7 @@ "O": "t_floor", "S": "t_floor", "T": "t_floor", + "^": "t_floor", "X": "t_door_metal_locked", "b": "t_floor", "c": "t_floor", @@ -70,6 +71,7 @@ "f": "f_filing_cabinet", "y": [ "f_indoor_plant_y", "f_indoor_plant" ] }, - "toilets": { "&": { } } + "toilets": { "&": { } }, + "vehicles": { "^": { "vehicle": "medical_cart", "chance": 100, "rotation": 0 } } } ] diff --git a/data/json/vehicles/carts.json b/data/json/vehicles/carts.json index 7587eeb9df734..e744891626dc6 100644 --- a/data/json/vehicles/carts.json +++ b/data/json/vehicles/carts.json @@ -361,7 +361,7 @@ { "id": "medical_cart", "type": "vehicle", - "name": "Surgical Cart", + "name": "Medical Cart", "blueprint": [ "#" ], "parts": [ { "x": 0, "y": 0, "parts": [ "xlframe#vertical_2", "wheel_caster", "metal_tray" ] } ] } From a8813c042d33414e710c77b11d104615cf17eabc Mon Sep 17 00:00:00 2001 From: Maleclypse <54345792+Maleclypse@users.noreply.github.com> Date: Fri, 3 May 2024 22:37:14 -0500 Subject: [PATCH 011/104] Update data/json/flags.json --- data/json/flags.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/json/flags.json b/data/json/flags.json index 6118fe672319d..0fd23547ee622 100644 --- a/data/json/flags.json +++ b/data/json/flags.json @@ -1889,7 +1889,7 @@ "type": "json_flag" }, { - "id": "USES_NEARBY_AMMO", + "id": "USES_NEARBY_AMMO" "type": "json_flag" }, { From 24263bb48d32223c49a455aa8fe487f4e390f984 Mon Sep 17 00:00:00 2001 From: Maleclypse <54345792+Maleclypse@users.noreply.github.com> Date: Fri, 3 May 2024 22:37:27 -0500 Subject: [PATCH 012/104] Update data/json/flags.json --- data/json/flags.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/json/flags.json b/data/json/flags.json index 0fd23547ee622..6118fe672319d 100644 --- a/data/json/flags.json +++ b/data/json/flags.json @@ -1889,7 +1889,7 @@ "type": "json_flag" }, { - "id": "USES_NEARBY_AMMO" + "id": "USES_NEARBY_AMMO", "type": "json_flag" }, { From aecd58f8c7dab1fcfd2959797b6943743fcc42ec Mon Sep 17 00:00:00 2001 From: RenechCDDA <84619419+RenechCDDA@users.noreply.github.com> Date: Sat, 4 May 2024 00:07:00 -0400 Subject: [PATCH 013/104] Split up npc::wield_better_weapon() --- src/npc.h | 4 ++ src/npcmove.cpp | 100 ++++++++++++++++++++++++++++-------------------- src/ranged.cpp | 1 - 3 files changed, 62 insertions(+), 43 deletions(-) diff --git a/src/npc.h b/src/npc.h index 4625c512f1046..4d86e4d45d708 100644 --- a/src/npc.h +++ b/src/npc.h @@ -1146,6 +1146,10 @@ class npc : public Character int evaluate_sleep_spot( tripoint_bub_ms p ); // Returns true if did something and we should end turn bool scan_new_items(); + // Returns score for how well this weapon might kill things + double evaluate_weapon( item &maybe_weapon, bool can_use_gun, bool use_silent ) const; + // Returns best weapon. Can return null (fists) + item *evaluate_best_weapon() const; // Returns true if did wield it bool wield_better_weapon(); diff --git a/src/npcmove.cpp b/src/npcmove.cpp index 5e876579b448d..941e4cdabcd52 100644 --- a/src/npcmove.cpp +++ b/src/npcmove.cpp @@ -4042,9 +4042,27 @@ bool npc::do_player_activity() return moves != old_moves; } -bool npc::wield_better_weapon() +double npc::evaluate_weapon( item &it, bool can_use_gun, bool use_silent ) const +{ + bool allowed = can_use_gun && it.is_gun() && ( !use_silent || it.is_silent() ); + // According to unmodified evaluation score, NPCs almost always prioritize wielding guns if they have one. + // This is relatively reasonable, as players can issue commands to NPCs when we do not want them to use ranged weapons. + // Conversely, we cannot directly issue commands when we want NPCs to prioritize ranged weapons. + // Note that the scoring method here is different from the 'weapon_value' used elsewhere. + double val_gun = allowed ? gun_value( it, it.shots_remaining( this ) ) : 0; + add_msg_debug( debugmode::DF_NPC_ITEMAI, + "%s %s valued at %1.2f as a ranged weapon to wield.", + disp_name( true ), it.type->get_id().str(), val_gun ); + double val_melee = melee_value( it ); + add_msg_debug( debugmode::DF_NPC_ITEMAI, + "%s %s valued at %1.2f as a melee weapon to wield.", disp_name( true ), + it.type->get_id().str(), val_melee ); + double val = std::max( val_gun, val_melee ); + return val; +} + +item *npc::evaluate_best_weapon() const { - // TODO: Allow wielding weaker weapons against weaker targets bool can_use_gun = !is_player_ally() || rules.has_flag( ally_rule::use_guns ); bool use_silent = is_player_ally() && rules.has_flag( ally_rule::use_silent ); @@ -4053,45 +4071,27 @@ bool npc::wield_better_weapon() // Check if there's something better to wield item *best = &weap; - double best_value = -100.0; - - const auto compare_weapon = - [this, &weap, &best, &best_value, can_use_gun, use_silent]( const item & it ) { - bool allowed = can_use_gun && it.is_gun() && ( !use_silent || it.is_silent() ); - // According to unmodified evaluation score, NPCs almost always prioritize wielding guns if they have one. - // This is relatively reasonable, as players can issue commands to NPCs when we do not want them to use ranged weapons. - // Conversely, we cannot directly issue commands when we want NPCs to prioritize ranged weapons. - // Note that the scoring method here is different from the 'weapon_value' used elsewhere. - double val_gun = allowed ? gun_value( it, it.shots_remaining( this ) ) : 0; - add_msg_debug( debugmode::DF_NPC_ITEMAI, - "%s %s valued at %1.2f as a ranged weapon to wield.", - disp_name( true ), it.type->get_id().str(), val_gun ); - double val_melee = melee_value( it ); - add_msg_debug( debugmode::DF_NPC_ITEMAI, - "%s %s valued at %1.2f as a melee weapon to wield.", disp_name( true ), - it.type->get_id().str(), val_melee ); - double val = std::max( val_gun, val_melee ); - bool using_same_type_bionic_weapon = is_using_bionic_weapon() - && &it != &weap - && it.type->get_id() == weap.type->get_id(); + double best_value = evaluate_weapon( weap, can_use_gun, use_silent ); - if( val > best_value && !using_same_type_bionic_weapon ) { - best = const_cast( &it ); - best_value = val; - } - }; - - compare_weapon( weap ); // To prevent changing to barely better stuff best_value *= std::max( 1.0f, ai_cache.danger_assessment / 10.0f ); // Fists aren't checked below - compare_weapon( null_item_reference() ); + double fist_value = evaluate_weapon( null_item_reference(), can_use_gun, use_silent ); + + //Now check through the NPC's inventory for melee weapons, guns, or holstered items + visit_items( [this, can_use_gun, use_silent, &weap, &best_value, &best]( item * node, item * ) { + double weapon_value = 0.0; + bool using_same_type_bionic_weapon = is_using_bionic_weapon() + && node != &weap + && node->type->get_id() == weap.type->get_id(); - visit_items( [&compare_weapon]( item * node, item * ) { - // Only compare melee weapons, guns, or holstered items if( node->is_melee() || node->is_gun() ) { - compare_weapon( *node ); + weapon_value = evaluate_weapon( *node, can_use_gun, use_silent ); + if( weapon_value > best_value && !using_same_type_bionic_weapon ) { + best = const_cast( node ); + best_value = weapon_value; + } return VisitResponse::SKIP; } else if( node->get_use( "holster" ) && !node->empty() ) { // we just recur to the next farther down @@ -4100,21 +4100,37 @@ bool npc::wield_better_weapon() return VisitResponse::NEXT; } ); - // TODO: Reimplement switching to empty guns - // Needs to check reload speed, RELOAD_ONE etc. - // Until then, the NPCs should reload the guns as a last resort + return best; +} + +bool npc::wield_better_weapon() +{ + // These are also assigned here so npc::evaluate_best_weapon() can be called by itself + bool can_use_gun = !is_player_ally() || rules.has_flag( ally_rule::use_guns ); + bool use_silent = is_player_ally() && rules.has_flag( ally_rule::use_silent ); + + item_location weapon = get_wielded_item(); + item &weap = weapon ? *weapon : null_item_reference(); + item *best = &weap; - if( best == &weap ) { + item *better_weapon = evaluate_best_weapon(); + + if( best == better_weapon ) { add_msg_debug( debugmode::DF_NPC, "Wielded %s is best at %.1f, not switching", best->type->get_id().str(), - best_value ); + evaluate_weapon( *better_weapon, can_use_gun, use_silent ) ); return false; } - add_msg_debug( debugmode::DF_NPC, "Wielding %s at value %.1f", best->type->get_id().str(), - best_value ); + add_msg_debug( debugmode::DF_NPC, "Wielding %s at value %.1f", better_weapon->type->get_id().str(), + evaluate_weapon( *better_weapon, can_use_gun, use_silent ) ); - wield( *best ); + // Always returns true, but future proof + bool wield_success = wield( *better_weapon ); + if( !wield_success ) { + debugmsg( "NPC failed to wield better weapon %s", better_weapon->tname() ); + return false; + } return true; } diff --git a/src/ranged.cpp b/src/ranged.cpp index cd6331c9826ff..f07a5999078fc 100644 --- a/src/ranged.cpp +++ b/src/ranged.cpp @@ -1323,7 +1323,6 @@ dealt_projectile_attack Character::throw_item( const tripoint &target, const ite const std::optional &blind_throw_from_pos ) { // Copy the item, we may alter it before throwing - debugmsg("%s throwing item %s", disp_name(), to_throw.tname() ); item thrown = to_throw; const int move_cost = throw_cost( *this, to_throw ); From a5a8709f264e0ceb11b10b2bafc25abd6b21b2e7 Mon Sep 17 00:00:00 2001 From: RenechCDDA <84619419+RenechCDDA@users.noreply.github.com> Date: Sat, 4 May 2024 00:26:49 -0400 Subject: [PATCH 014/104] Don't throw the good weapons! --- src/npc_attack.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/npc_attack.cpp b/src/npc_attack.cpp index 8d7a3433ba3d9..634973375e915 100644 --- a/src/npc_attack.cpp +++ b/src/npc_attack.cpp @@ -727,6 +727,10 @@ npc_attack_rating npc_attack_throw::evaluate( // please don't throw your pants... return effectiveness; } + if( &thrown_item == source.evaluate_best_weapon() ) { + // Don't throw if it's the best individual killy-thing we've got + return effectiveness; + } const int penalty = base_penalty( source ); const bool throw_now = thrown_item.has_flag( flag_NPC_THROW_NOW ); // TODO: Should this be a field to cache the result? From bf6f54c0c2ac2f01183b6178d858d334b92b78e7 Mon Sep 17 00:00:00 2001 From: RenechCDDA <84619419+RenechCDDA@users.noreply.github.com> Date: Sat, 4 May 2024 00:54:24 -0400 Subject: [PATCH 015/104] ...didn't mean to remove that --- src/npc.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/npc.cpp b/src/npc.cpp index 07fd27e7370fb..693c3001b198b 100644 --- a/src/npc.cpp +++ b/src/npc.cpp @@ -3804,8 +3804,11 @@ void npc::update_missions_target( character_id old_character, character_id new_c const dialogue_chatbin_snippets &npc::chat_snippets() const { + if( idz.is_null() ) { static dialogue_chatbin_snippets dummy; return dummy; + } + return idz->snippets; } std::unique_ptr get_talker_for( npc &guy ) From 4dfe1c4d39d77ac513bfbc60ee48d45f53d499f4 Mon Sep 17 00:00:00 2001 From: PatrikLundell Date: Sat, 4 May 2024 12:01:05 +0200 Subject: [PATCH 016/104] Made inline use map parameters --- src/editmap.cpp | 14 ++++--------- src/map.cpp | 50 +++++++++++++-------------------------------- src/map.h | 16 +++++++++------ src/vehicle_use.cpp | 4 ++-- 4 files changed, 30 insertions(+), 54 deletions(-) diff --git a/src/editmap.cpp b/src/editmap.cpp index 156b0c9604cee..9c5445cde88cd 100644 --- a/src/editmap.cpp +++ b/src/editmap.cpp @@ -63,12 +63,6 @@ #include "vehicle.h" #include "vpart_position.h" -static constexpr tripoint editmap_boundary_min( 0, 0, -OVERMAP_DEPTH ); -static constexpr tripoint editmap_boundary_max( MAPSIZE_X, MAPSIZE_Y, OVERMAP_HEIGHT + 1 ); - -static constexpr half_open_cuboid editmap_boundaries( - editmap_boundary_min, editmap_boundary_max ); - // NOLINTNEXTLINE(cata-static-int_id-constants) static const ter_id undefined_ter_id( -1 ); @@ -1595,7 +1589,7 @@ void editmap::recalc_target( shapetype shape ) map &here = get_map(); for( const tripoint &p : here.points_in_radius( origin, radius ) ) { if( rl_dist( p, origin ) <= radius ) { - if( editmap_boundaries.contains( p ) ) { + if( here.inbounds( p ) ) { target_list.push_back( p ); } } @@ -1624,7 +1618,7 @@ void editmap::recalc_target( shapetype shape ) for( int y = s.y; y <= e.y; y++ ) { if( shape == editmap_rect_filled || x == s.x || x == e.x || y == s.y || y == e.y ) { const tripoint p( x, y, z ); - if( editmap_boundaries.contains( p ) ) { + if( get_map().inbounds( p ) ) { target_list.push_back( p ); } } @@ -2104,8 +2098,8 @@ void editmap::mapgen_retarget() if( const std::optional vec = ctxt.get_direction( action ) ) { point vec_ms = omt_to_ms_copy( vec->xy() ); tripoint ptarget = target + vec_ms; - if( editmap_boundaries.contains( ptarget ) && - editmap_boundaries.contains( ptarget + point( SEEX, SEEY ) ) ) { + if( get_map().inbounds( ptarget ) && + get_map().inbounds( ptarget + point( SEEX, SEEY ) ) ) { target = ptarget; target_list.clear(); diff --git a/src/map.cpp b/src/map.cpp index c3ad811ab8521..4e08f5537858e 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -9040,55 +9040,33 @@ const std::vector &map::trap_locations( const trap_id &type ) const return traplocs[type.to_i()]; } -bool map::inbounds( const tripoint_abs_ms &p ) const +bool map::inbounds( const tripoint &p ) const { - return inbounds( getlocal( p ) ); + return p.x >= 0 && p.x < my_MAPSIZE * SEEX && + p.y >= 0 && p.y < my_MAPSIZE * SEEY && + p.z >= -OVERMAP_DEPTH && p.z <= OVERMAP_HEIGHT && + ( zlevels || p.z == get_abs_sub().z() ); } -bool map::inbounds( const tripoint &p ) const +bool map::inbounds( const tripoint_abs_ms &p ) const { - static constexpr tripoint map_boundary_min( 0, 0, -OVERMAP_DEPTH ); - static constexpr tripoint map_boundary_max( MAPSIZE_Y, MAPSIZE_X, OVERMAP_HEIGHT + 1 ); - - static constexpr half_open_cuboid map_boundaries( - map_boundary_min, map_boundary_max ); - - return map_boundaries.contains( p ); + return inbounds( getlocal( p ) ); } bool map::inbounds( const tripoint_bub_ms &p ) const { - return inbounds( p.raw() ); + return map::inbounds( p.raw() ); } bool map::inbounds( const tripoint_abs_omt &p ) const { const tripoint_abs_omt map_origin = project_to( abs_sub ); - return inbounds_z( p.z() ) && - p.x() >= map_origin.x() && - p.y() >= map_origin.y() && - p.x() <= map_origin.x() + my_HALF_MAPSIZE && - p.y() <= map_origin.y() + my_HALF_MAPSIZE; -} - -bool tinymap::inbounds( const tripoint &p ) const -{ - constexpr tripoint map_boundary_min( 0, 0, -OVERMAP_DEPTH ); - constexpr tripoint map_boundary_max( SEEY * 2, SEEX * 2, OVERMAP_HEIGHT + 1 ); - - constexpr half_open_cuboid map_boundaries( map_boundary_min, map_boundary_max ); - - return map_boundaries.contains( p ); -} - -bool tinymap::inbounds( const tripoint_omt_ms &p ) const -{ - constexpr tripoint_omt_ms map_boundary_min( 0, 0, -OVERMAP_DEPTH ); - constexpr tripoint_omt_ms map_boundary_max( SEEY * 2, SEEX * 2, OVERMAP_HEIGHT + 1 ); - - constexpr half_open_cuboid map_boundaries( map_boundary_min, map_boundary_max ); - - return map_boundaries.contains( p ); + return p.z() >= -OVERMAP_DEPTH && p.z() <= OVERMAP_HEIGHT && + ( zlevels || p.z() == get_abs_sub().z() ) && + p.x() >= map_origin.x() && + p.y() >= map_origin.y() && + p.x() <= map_origin.x() + my_HALF_MAPSIZE && + p.y() <= map_origin.y() + my_HALF_MAPSIZE; } tripoint_range tinymap::points_on_zlevel() const diff --git a/src/map.h b/src/map.h index 01caba272f5f9..ca484ee3dad9e 100644 --- a/src/map.h +++ b/src/map.h @@ -1888,8 +1888,7 @@ class map // TODO: fix point types (remove the first overload) tripoint_bub_ms bub_from_abs( const tripoint &p ) const; tripoint_bub_ms bub_from_abs( const tripoint_abs_ms &p ) const; - // TODO: fix point types (remove the first overload) - virtual bool inbounds( const tripoint &p ) const; + bool inbounds( const tripoint &p ) const; bool inbounds( const tripoint_bub_ms &p ) const; bool inbounds( const tripoint_abs_ms &p ) const; bool inbounds( const tripoint_abs_sm &p ) const { @@ -1897,11 +1896,12 @@ class map } bool inbounds( const tripoint_abs_omt &p ) const; bool inbounds( const point &p ) const { - return inbounds( tripoint( p, 0 ) ); + return inbounds( tripoint_bub_ms( p.x, p.y, 0 ) ); } bool inbounds_z( const int z ) const { - return z >= -OVERMAP_DEPTH && z <= OVERMAP_HEIGHT; + return z >= -OVERMAP_DEPTH && z <= OVERMAP_HEIGHT && + ( zlevels || z == get_abs_sub().z() ); } /** Clips the coordinates of p to fit the map bounds */ @@ -2431,8 +2431,12 @@ class tinymap : private map public: tinymap() : map( 2, false ) {} - bool inbounds( const tripoint &p ) const override; - bool inbounds( const tripoint_omt_ms &p ) const; + bool inbounds( const tripoint &p ) const { + return map::inbounds( p ); + } + bool inbounds( const tripoint_omt_ms &p ) const { + return map::inbounds( p.raw() ); + } map *cast_to_map() { return this; diff --git a/src/vehicle_use.cpp b/src/vehicle_use.cpp index ecbf880a621be..6c436f700fc7b 100644 --- a/src/vehicle_use.cpp +++ b/src/vehicle_use.cpp @@ -965,7 +965,7 @@ void vehicle::crash_terrain_around() const tripoint start_pos = vp.pos(); const vpslot_terrain_transform &ttd = *vp.info().transform_terrain_info; for( size_t i = 0; i < eight_horizontal_neighbors.size() && - !here.inbounds_z( crush_target.z ); i++ ) { + crush_target.z == -OVERMAP_LAYERS; i++ ) { tripoint cur_pos = start_pos + eight_horizontal_neighbors[i]; bool busy_pos = false; for( const vpart_reference &vp_tmp : get_all_parts() ) { @@ -979,7 +979,7 @@ void vehicle::crash_terrain_around() } } //target chosen - if( here.inbounds_z( crush_target.z ) ) { + if( crush_target.z != -OVERMAP_LAYERS ) { velocity = 0; cruise_velocity = 0; here.destroy( crush_target ); From faeed804f6d58bfe5b2412ea88cb7c9e0af74396 Mon Sep 17 00:00:00 2001 From: PatrikLundell Date: Sat, 4 May 2024 12:08:11 +0200 Subject: [PATCH 017/104] Undo unintended inbounds_z change --- src/map.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/map.h b/src/map.h index ca484ee3dad9e..cdb503768c313 100644 --- a/src/map.h +++ b/src/map.h @@ -1900,8 +1900,7 @@ class map } bool inbounds_z( const int z ) const { - return z >= -OVERMAP_DEPTH && z <= OVERMAP_HEIGHT && - ( zlevels || z == get_abs_sub().z() ); + return z >= -OVERMAP_DEPTH && z <= OVERMAP_HEIGHT; } /** Clips the coordinates of p to fit the map bounds */ From 152c8bd42b63f8145e0df9cec43edb8068ca1f32 Mon Sep 17 00:00:00 2001 From: RenechCDDA <84619419+RenechCDDA@users.noreply.github.com> Date: Sat, 4 May 2024 15:09:34 -0400 Subject: [PATCH 018/104] Can throw if we have extra copies of the item --- src/npc_attack.cpp | 5 ++++- tests/npc_attack_test.cpp | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/npc_attack.cpp b/src/npc_attack.cpp index 634973375e915..16f5963fc5c51 100644 --- a/src/npc_attack.cpp +++ b/src/npc_attack.cpp @@ -727,7 +727,10 @@ npc_attack_rating npc_attack_throw::evaluate( // please don't throw your pants... return effectiveness; } - if( &thrown_item == source.evaluate_best_weapon() ) { + const inventory &available_weapons = source.crafting_inventory( -1 ); + if( &thrown_item == source.evaluate_best_weapon() && + available_weapons.amount_of( thrown_item.typeId() ) <= 1 && + available_weapons.charges_of( thrown_item.typeId() ) <= 1 ) { // Don't throw if it's the best individual killy-thing we've got return effectiveness; } diff --git a/tests/npc_attack_test.cpp b/tests/npc_attack_test.cpp index 6c1f5ad359650..63033e92c6dd6 100644 --- a/tests/npc_attack_test.cpp +++ b/tests/npc_attack_test.cpp @@ -225,7 +225,7 @@ TEST_CASE( "NPC_faces_zombies", "[npc_attack]" ) } WHEN( "NPC only has a bunch of rocks" ) { - item weapon( "rock" ); + item weapon( "rock", calendar::turn, 5 ); main_npc.set_wielded_item( weapon ); REQUIRE( main_npc.get_wielded_item()->typeId() == itype_rock ); From f3ea1ad382524b310169282ef5353b90193373e6 Mon Sep 17 00:00:00 2001 From: Victoria Eastep <114838742+BarndoBoi@users.noreply.github.com> Date: Sat, 4 May 2024 16:05:38 -0400 Subject: [PATCH 019/104] Fix typo in item placement --- data/json/mapgen/office_doctor.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/json/mapgen/office_doctor.json b/data/json/mapgen/office_doctor.json index 34823e491fbdd..237a260b39672 100644 --- a/data/json/mapgen/office_doctor.json +++ b/data/json/mapgen/office_doctor.json @@ -43,7 +43,7 @@ "e": { "item": "SUS_fridge_breakroom", "chance": 80 }, "t": { "item": "gear_medical", "chance": 60, "repeat": [ 2, 4 ] }, "f": { "item": "office_paper", "chance": 70, "repeat": [ 1, 3 ] }, - "^": { "item": "geat_medical", "chance": 60, "repeat": [ 1, 2 ] } + "^": { "item": "gear_medical", "chance": 60, "repeat": [ 1, 2 ] } }, "place_items": [ { "item": "record_patient", "x": 7, "y": 6, "chance": 50 } ], "place_loot": [ { "item": "anesthetic_kit", "x": 16, "y": [ 14, 17 ], "chance": 75, "ammo": 100 } ], From 7fab8c35dfb532016dcc4751f06c0a0f8ea65933 Mon Sep 17 00:00:00 2001 From: Victoria Eastep <114838742+BarndoBoi@users.noreply.github.com> Date: Sat, 4 May 2024 16:21:01 -0400 Subject: [PATCH 020/104] Add medical carts to all office_doctor types --- data/json/mapgen/office_doctor.json | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/data/json/mapgen/office_doctor.json b/data/json/mapgen/office_doctor.json index 237a260b39672..8c21bfcdc593d 100644 --- a/data/json/mapgen/office_doctor.json +++ b/data/json/mapgen/office_doctor.json @@ -137,10 +137,10 @@ " #.y#..+........ht# ", " #B.#..#9999#..#### ", " #s.#..#%c%c#..#By# ", - " #..+..#....#..#.c# ", + " #^.+..#....#..#.c# ", " #cc#..#h...#..+.c# ", " ####..###+##..#### ", - " #$$#..co..h%..#By# ", + " #$$#..co^.h%..#By# ", " #..!......hc..#.c# ", " #$$#..%h...c..+.c# ", " ####..ccc.cc..#### ", @@ -154,6 +154,7 @@ " " ], "palettes": [ "office_doctor" ], + "items": { "^": { "item": "gear_medical", "chance": 60, "repeat": [ 1, 2 ] } }, "place_loot": [ { "group": "waitingroom", "x": 14, "y": 3, "chance": 70, "repeat": [ 1, 3 ] }, { "group": "waitingroom", "x": 19, "y": 3, "chance": 70, "repeat": [ 1, 3 ] }, @@ -249,14 +250,14 @@ " #&...+............+.I# ", " #r..S#............#.I# ", " #######!########!##### ", - " #S.ol#...#lo.S#.....f# ", + " #S^ol#...#lo^S#.....f# ", " #....!...!....#.hh..f# ", " 0...t#...#t...#.ddd..0 ", " #.W.B#...#B.W.#yrA..o# ", " #######!############## ", " #u!...........X....H# ", " ####+###+####5#....H# ", - " #c..#....c###OOO.H# ", + " #c..#...^c###OOO.H# ", " #S..'.?/..c######## ", " #S..#.....c#4 ", " ############ ", @@ -297,7 +298,8 @@ { "item": "drugs_rare", "chance": 60 }, { "item": "surgery", "chance": 60 } ], - "?": { "item": "autodoc_supplies", "chance": 100 } + "?": { "item": "autodoc_supplies", "chance": 100 }, + "^": { "item": "gear_medical", "chance": 60, "repeat": [ 1, 2 ] } }, "place_loot": [ { "group": "waitingroom", "x": 12, "y": 3, "chance": 70, "repeat": [ 1, 3 ] }, From 51390808df32df92bf4ca38e8aa86727b6ab2ad6 Mon Sep 17 00:00:00 2001 From: RenechCDDA <84619419+RenechCDDA@users.noreply.github.com> Date: Sat, 4 May 2024 16:29:42 -0400 Subject: [PATCH 021/104] Check fists too --- src/npcmove.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/npcmove.cpp b/src/npcmove.cpp index 941e4cdabcd52..b4e86f324dc6a 100644 --- a/src/npcmove.cpp +++ b/src/npcmove.cpp @@ -4079,6 +4079,11 @@ item *npc::evaluate_best_weapon() const // Fists aren't checked below double fist_value = evaluate_weapon( null_item_reference(), can_use_gun, use_silent ); + if( fist_value > best_value ) { + best = &null_item_reference(); + best_value = fist_value; + } + //Now check through the NPC's inventory for melee weapons, guns, or holstered items visit_items( [this, can_use_gun, use_silent, &weap, &best_value, &best]( item * node, item * ) { double weapon_value = 0.0; From a714f060f80b239a03bf2c0c2f6be899db812078 Mon Sep 17 00:00:00 2001 From: Victoria Eastep <114838742+BarndoBoi@users.noreply.github.com> Date: Sat, 4 May 2024 16:48:25 -0400 Subject: [PATCH 022/104] Add medical cart to veterinarian clinic --- data/json/mapgen/veterinarian.json | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/data/json/mapgen/veterinarian.json b/data/json/mapgen/veterinarian.json index 1d2eb98ec4398..72eeefe2b5ee5 100644 --- a/data/json/mapgen/veterinarian.json +++ b/data/json/mapgen/veterinarian.json @@ -17,7 +17,7 @@ "--|TccccccTy..#%.c|?R|--", "--|...........#c.d|s.|--", "--|.ccccccT...||+|||+|--", - "--|..........N|E.#...|--", + "--|..........N|E.#C..|--", "--||+|||+|||..|E...T.|--", "--|..|y....|..+....T.|--", "--|s.|.ddd.|++|||i||||--", @@ -40,6 +40,7 @@ ",": "t_pavement_y", "|": "t_wall_p", ".": "t_linoleum_gray", + "C": "t_linoleum_gray", "l": "t_thconc_floor", ":": "t_door_glass_c", ";": "t_door_locked", @@ -68,8 +69,12 @@ "s": "f_sink", "y": "f_indoor_plant" }, + "vehicles": { "C": { "vehicle": "medical_cart", "chance": 100 } }, "toilets": { "t": { } }, - "items": { "N": { "item": "missing_poster_animal", "chance": 50, "repeat": [ 1, 3 ] } }, + "items": { + "N": { "item": "missing_poster_animal", "chance": 50, "repeat": [ 1, 3 ] }, + "C": { "item": "gear_medical", "chance": 60, "repeat": [ 1, 2 ] } + }, "place_items": [ { "item": "trash", "x": 10, "y": 19, "chance": 50, "repeat": [ 1, 3 ] }, { "item": "vet_softdrug", "x": 17, "y": 10, "chance": 70, "repeat": [ 2, 5 ] }, From af8e71058e168b0ea84edd2e19de83fcd500e9be Mon Sep 17 00:00:00 2001 From: Ramza13 <52087122+Ramza13@users.noreply.github.com> Date: Sat, 4 May 2024 17:30:53 -0400 Subject: [PATCH 023/104] Update zed_lieutenant.json --- data/json/monsters/zed_lieutenant.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/json/monsters/zed_lieutenant.json b/data/json/monsters/zed_lieutenant.json index 35f1d31870b8f..2c746406f373f 100644 --- a/data/json/monsters/zed_lieutenant.json +++ b/data/json/monsters/zed_lieutenant.json @@ -105,7 +105,7 @@ "name": { "str": "Life Drain" }, "description": "When even the grass rises against you, what hope do you have?", "flags": [ "NO_EXPLOSION_SFX" ], - "valid_targets": [ "ground", "hostile" ], + "valid_targets": [ "hostile" ], "shape": "blast", "min_accuracy": 20, "max_accuracy": 20, From 3271d7dd2f5e19ffd0ba290d1f56133766e17f7b Mon Sep 17 00:00:00 2001 From: John Candlebury Date: Sat, 4 May 2024 17:12:39 -0600 Subject: [PATCH 024/104] Update data/mods/Aftershock/maps/furniture_and_terrain/terrain_manufactured.json Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .../maps/furniture_and_terrain/terrain_manufactured.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/data/mods/Aftershock/maps/furniture_and_terrain/terrain_manufactured.json b/data/mods/Aftershock/maps/furniture_and_terrain/terrain_manufactured.json index 0de2b3e56ed9e..6d1d31b2e59ca 100644 --- a/data/mods/Aftershock/maps/furniture_and_terrain/terrain_manufactured.json +++ b/data/mods/Aftershock/maps/furniture_and_terrain/terrain_manufactured.json @@ -5,7 +5,12 @@ "name": "nanofabricator control panel", "symbol": "&", "description": "A small computer panel attached to a nanofabricator. It has a single slot for reading templates.", - "allowed_template_ids": [ "standard_template_construct", "standard_template_construct_combat_exoskeleton", "debug_template", "afs_10mm_smart_template" ], + "allowed_template_ids": [ + "standard_template_construct", + "standard_template_construct_combat_exoskeleton", + "debug_template", + "afs_10mm_smart_template" + ], "color": "red", "looks_like": "f_console", "move_cost": 0, From 44bb5a7e3a3389eecae43221152c562f9f22a60e Mon Sep 17 00:00:00 2001 From: PatrikLundell Date: Sun, 5 May 2024 11:29:01 +0200 Subject: [PATCH 025/104] Don't check tinymap Z level! --- src/map.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/map.cpp b/src/map.cpp index 4e08f5537858e..07a4bbfcf67d2 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -9044,8 +9044,11 @@ bool map::inbounds( const tripoint &p ) const { return p.x >= 0 && p.x < my_MAPSIZE * SEEX && p.y >= 0 && p.y < my_MAPSIZE * SEEY && - p.z >= -OVERMAP_DEPTH && p.z <= OVERMAP_HEIGHT && - ( zlevels || p.z == get_abs_sub().z() ); + p.z >= -OVERMAP_DEPTH && p.z <= OVERMAP_HEIGHT; + // && ( zlevels || p.z == get_abs_sub().z() ); + // Cannot actually let inbounds check the bounds for maps not supporting Z levels, as + // tests explicitly expect other Z level coordinates to return t_null when read + // and write terrain to the Z level of the map rather than fail or do nothing. } bool map::inbounds( const tripoint_abs_ms &p ) const @@ -9055,7 +9058,7 @@ bool map::inbounds( const tripoint_abs_ms &p ) const bool map::inbounds( const tripoint_bub_ms &p ) const { - return map::inbounds( p.raw() ); + return inbounds( p.raw() ); } bool map::inbounds( const tripoint_abs_omt &p ) const From ad2556852fdb77123ba9a00c2b7b04a58f7eb757 Mon Sep 17 00:00:00 2001 From: SomeGuyIGues <154325171+SomeGuyIGues@users.noreply.github.com> Date: Sun, 5 May 2024 21:45:56 +1000 Subject: [PATCH 026/104] Update gloves.json --- data/json/items/armor/gloves.json | 52 +++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/data/json/items/armor/gloves.json b/data/json/items/armor/gloves.json index 5563dd578f26a..c406df5298b2d 100644 --- a/data/json/items/armor/gloves.json +++ b/data/json/items/armor/gloves.json @@ -431,7 +431,7 @@ { "id": "gloves_fingerless", "type": "ARMOR", - "name": { "str": "pair of fingerless gloves", "str_pl": "pairs of fingerless gloves" }, + "name": { "str": "pair of fingerless leather gloves", "str_pl": "pairs of fingerless leather gloves" }, "description": "A pair of leather gloves without fingers.", "weight": "100 g", "volume": "250 ml", @@ -463,7 +463,7 @@ "id": "gloves_fingerless_mod", "type": "ARMOR", "category": "armor", - "name": { "str": "pair of armored fingerless gloves", "str_pl": "pairs of armored fingerless gloves" }, + "name": { "str": "pair of armored fingerless leather gloves", "str_pl": "pairs of armored fingerless leather gloves" }, "description": "A pair of leather gloves without fingers. These have been crudely reinforced with steel guards across the back.", "weight": "380 g", "volume": "500 ml", @@ -1020,6 +1020,54 @@ "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, "flags": [ "UNDERSIZE" ] }, + { + "id": "gloves_wool_fingerless", + "type": "ARMOR", + "name": { "str": "pair of fingerless wool gloves", "str_pl": "pairs of fingerless wool gloves" }, + "description": "A warm pair of wool gloves without fingers. Less encumbering, but provides significantly less warmth.", + "weight": "75 g", + "volume": "250 ml", + "price": "35 USD", + "price_postapoc": "50 cent", + "to_hit": 1, + "material": [ "wool" ], + "symbol": "[", + "looks_like": "gloves_wool", + "color": "blue", + "warmth": 40, + "material_thickness": 3, + "flags": [ "ALLOWS_NATURAL_ATTACKS", "ALLOWS_TALONS" ], + "armor": [ + { "encumbrance": 7, + "coverage": 75, + "covers": [ "hand_l", "hand_r" ], + "specifically_covers": [ "hand_wrist_l", "hand_wrist_r", "hand_back_l", "hand_back_r" ] + }, + { "encumbrance": 7, "coverage": 100, "covers": [ "hand_l", "hand_r" ], "specifically_covers": [ "hand_palm_l", "hand_palm_r" ] }, + { + "coverage": 50, + "covers": [ "hand_l", "hand_r" ], + "specifically_covers": [ "hand_fingers_l", "hand_fingers_r" ] + } + ] + }, + { + "id": "xl_gloves_wool_fingerless", + "type": "ARMOR", + "name": { "str": "pair of XL fingerless wool gloves", "str_pl": "pairs of XL fingerless wool gloves" }, + "copy-from": "gloves_wool_fingerless", + "proportional": { "weight": 1.4, "volume": 1.4 }, + "flags": [ "OVERSIZE" ] + }, + { + "id": "xs_gloves_wool_fingerless", + "type": "ARMOR", + "copy-from": "gloves_wool_fingerless", + "looks_like": "gloves_wool", + "name": { "str": "pair of XS fingerless wool gloves", "str_pl": "pairs of XS fingerless wool gloves" }, + "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "flags": [ "UNDERSIZE" ] + }, { "id": "gloves_work", "type": "ARMOR", From 3a581542fad25e8f4c598f2af70574b148ef163d Mon Sep 17 00:00:00 2001 From: SomeGuyIGues <154325171+SomeGuyIGues@users.noreply.github.com> Date: Mon, 6 May 2024 00:01:14 +1000 Subject: [PATCH 027/104] Update hands.json Added Fingerless Wool Gloves Recipes, they are borked for some reason. --- data/json/recipes/armor/hands.json | 40 ++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/data/json/recipes/armor/hands.json b/data/json/recipes/armor/hands.json index dc3ba212c0c2b..1fe45e9572edc 100644 --- a/data/json/recipes/armor/hands.json +++ b/data/json/recipes/armor/hands.json @@ -827,6 +827,46 @@ "time": "6 h 45 m", "using": [ [ "tailoring_wool_knitting", 140 ] ] }, + { + "result": "gloves_wool_fingerless", + "type": "recipe", + "activity_level": "NO_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_HANDS", + "skill_used": "tailor", + "difficulty": 1, + "time": "4 h", + "autolearn": true, + "using": [ [ "tailoring_wool_knitting", 67 ] ], + "proficiencies": [ { "proficiency": "prof_knitting" }, { "proficiency": "prof_knitting_speed" } ], + }, + { + "result": "gloves_wool_fingerless", + "id_suffix": "from_gloves", + "type": "recipe", + "activity_level": "NO_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_HANDS", + "skill_used": "tailor", + "time": "16 s", + "autolearn": true, + "qualities": [ { "id": "CUT", "level": 1 } ], + "components": [ [ [ "gloves_wool", 1 ] ] ], + }, + { + "result": "xs_gloves_wool_fingerless", + "type": "recipe", + "copy-from": "gloves_wool_fingerless", + "time": "4 h", + "using": [ [ "tailoring_wool_knitting", 50 ] ] + }, + { + "result": "xl_gloves_wool_fingerless", + "type": "recipe", + "copy-from": "gloves_wool_fingerless", + "time": "4 h 36 m", + "using": [ [ "tailoring_wool_knitting", 94 ] ] + }, { "result": "gloves_work", "type": "recipe", From ce720aee347d62ef2182d6db3b2fe9c7fbee94b5 Mon Sep 17 00:00:00 2001 From: Karol1223 <68503002+Karol1223@users.noreply.github.com> Date: Sun, 5 May 2024 20:01:11 +0200 Subject: [PATCH 028/104] Update furniture-storage.json --- data/json/furniture_and_terrain/furniture-storage.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/json/furniture_and_terrain/furniture-storage.json b/data/json/furniture_and_terrain/furniture-storage.json index 199228556b6c1..0fc7ee2d38312 100644 --- a/data/json/furniture_and_terrain/furniture-storage.json +++ b/data/json/furniture_and_terrain/furniture-storage.json @@ -1620,7 +1620,7 @@ "sound": "metal screeching!", "sound_fail": "clang!", "items": [ - { "item": "sheet_metal_small", "count": [ 3, 8 ] }, + { "item": "material_aluminium_ingot", "count": [ 3, 8 ] }, { "item": "lock", "count": [ 0, 1 ] }, { "item": "scrap_aluminum", "count": [ 3, 15 ] }, { "item": "hinge", "count": [ 0, 2 ] }, From eefe407af0da9cc8fddb8599188ca745b25d8b9c Mon Sep 17 00:00:00 2001 From: Standing-Storm <120433252+Standing-Storm@users.noreply.github.com> Date: Sun, 5 May 2024 13:40:24 -0500 Subject: [PATCH 029/104] [MoM] Fix Discern Weakness (#72790) * Switch Discern Weakness to EoC * Edit Discern Weakness effect math * Add Discern Weakness EoC * Add missing } * Remove missing spaces * Update data/mods/MindOverMatter/powers/clairsentience_eoc.json Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Add missing ( --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .../MindOverMatter/effects/effects_psionic.json | 14 +++++++------- .../MindOverMatter/powers/clairsentience.json | 4 ++-- .../powers/clairsentience_eoc.json | 17 +++++++++++++++++ 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/data/mods/MindOverMatter/effects/effects_psionic.json b/data/mods/MindOverMatter/effects/effects_psionic.json index cd0f8724c31fc..b437c57faad50 100644 --- a/data/mods/MindOverMatter/effects/effects_psionic.json +++ b/data/mods/MindOverMatter/effects/effects_psionic.json @@ -670,31 +670,31 @@ "values": [ { "value": "ARMOR_CUT", - "add": { "math": [ "( ( ( u_spell_level('clair_spot_weakness') * 1) + 4) * (scaling_factor(u_val('intelligence') ) ) )" ] } + "add": { "math": [ "( ( u_discern_weakness_clear_power_level * 1.5) + 2) * u_discern_weakness_clear_intelligence" ] } }, { "value": "ARMOR_BASH", - "add": { "math": [ "( ( ( u_spell_level('clair_spot_weakness') * 1) + 4) * (scaling_factor(u_val('intelligence') ) ) )" ] } + "add": { "math": [ "( ( u_discern_weakness_clear_power_level * 1.5) + 2) * u_discern_weakness_clear_intelligence" ] } }, { "value": "ARMOR_STAB", - "add": { "math": [ "( ( ( u_spell_level('clair_spot_weakness') * 1) + 4) * (scaling_factor(u_val('intelligence') ) ) )" ] } + "add": { "math": [ "( ( u_discern_weakness_clear_power_level * 1.5) + 2) * u_discern_weakness_clear_intelligence" ] } }, { "value": "ARMOR_BULLET", - "add": { "math": [ "( ( ( u_spell_level('clair_spot_weakness') * 1) + 4) * (scaling_factor(u_val('intelligence') ) ) )" ] } + "add": { "math": [ "( ( u_discern_weakness_clear_power_level * 1.5) + 2) * u_discern_weakness_clear_intelligence" ] } }, { "value": "ARMOR_ELEC", - "add": { "math": [ "( ( ( u_spell_level('clair_spot_weakness') * 1) + 4) * (scaling_factor(u_val('intelligence') ) ) )" ] } + "add": { "math": [ "( ( u_discern_weakness_clear_power_level * 1.5) + 2) * u_discern_weakness_clear_intelligence" ] } }, { "value": "ARMOR_HEAT", - "add": { "math": [ "( ( ( u_spell_level('clair_spot_weakness') * 1) + 4) * (scaling_factor(u_val('intelligence') ) ) )" ] } + "add": { "math": [ "( ( u_discern_weakness_clear_power_level * 1.5) + 2) * u_discern_weakness_clear_intelligence" ] } }, { "value": "ARMOR_COLD", - "add": { "math": [ "( ( ( u_spell_level('clair_spot_weakness') * 1) + 4) * (scaling_factor(u_val('intelligence') ) ) )" ] } + "add": { "math": [ "( ( u_discern_weakness_clear_power_level * 1.5) + 2) * u_discern_weakness_clear_intelligence" ] } } ] } diff --git a/data/mods/MindOverMatter/powers/clairsentience.json b/data/mods/MindOverMatter/powers/clairsentience.json index 012b3c11fec13..1ec04b0840f49 100644 --- a/data/mods/MindOverMatter/powers/clairsentience.json +++ b/data/mods/MindOverMatter/powers/clairsentience.json @@ -124,8 +124,8 @@ "flags": [ "PSIONIC", "CONCENTRATE", "SILENT", "NO_HANDS", "NO_LEGS", "IGNORE_WALLS", "RANDOM_DURATION", "NO_EXPLOSION_SFX" ], "difficulty": 3, "max_level": { "math": [ "int_to_level(1)" ] }, - "effect": "attack", - "effect_str": "effect_clair_weak_point", + "effect": "effect_on_condition", + "effect_str": "EOC_CLAIR_DISCERN_WEAKNESS", "shape": "blast", "min_range": { "math": [ diff --git a/data/mods/MindOverMatter/powers/clairsentience_eoc.json b/data/mods/MindOverMatter/powers/clairsentience_eoc.json index 25352ad4ca950..a7e48d0ecc534 100644 --- a/data/mods/MindOverMatter/powers/clairsentience_eoc.json +++ b/data/mods/MindOverMatter/powers/clairsentience_eoc.json @@ -1,4 +1,21 @@ [ + { + "type": "effect_on_condition", + "id": "EOC_CLAIR_DISCERN_WEAKNESS", + "effect": [ + { "math": [ "u_discern_weakness_clear_intelligence", "=", "( ( n_val('intelligence') + 10) / 20 )" ] }, + { "math": [ "u_discern_weakness_clear_power_level", "=", "n_spell_level('clair_spot_weakness')" ] }, + { "math": [ "u_nether_attunement_discern_weakness_scaling", "=", "n_nether_attunement_power_scaling" ] }, + { + "u_add_effect": "effect_clair_weak_point", + "duration": { + "math": [ + "rng( ( ( (u_discern_weakness_clear_power_level * 1.5) + 13.5) * u_discern_weakness_clear_intelligence * u_nether_attunement_discern_weakness_scaling),( ( (u_discern_weakness_clear_power_level * 2.5) + 30) * u_discern_weakness_clear_intelligence * u_nether_attunement_discern_weakness_scaling) )" + ] + } + } + ] + }, { "type": "effect_on_condition", "id": "EOC_CLAIR_RAD_SENSE", From e31d20d73e4c8175748dc93fc7ebae66cceda539 Mon Sep 17 00:00:00 2001 From: Anton Simakov <67688115+GuardianDll@users.noreply.github.com> Date: Sun, 5 May 2024 22:48:01 +0200 Subject: [PATCH 030/104] fix fridges dropping drinking glasses instead of glass shards --- data/json/itemgroups/appliances.json | 30 ++++++++++++++-------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/data/json/itemgroups/appliances.json b/data/json/itemgroups/appliances.json index 40875e64371b2..75c7da46737e3 100644 --- a/data/json/itemgroups/appliances.json +++ b/data/json/itemgroups/appliances.json @@ -37,7 +37,7 @@ { "item": "plastic_chunk", "count": [ 0, 294 ] }, { "item": "chunk_rubber", "count": [ 0, 3 ] }, { "item": "material_aluminium_ingot", "count": [ 0, 12 ] }, - { "item": "glass", "count": [ 0, 5 ] }, + { "item": "glass_shard", "count": [ 0, 5 ] }, { "item": "cable", "charges": [ 0, 42 ] }, { "item": "hose", "count": [ 0, 1 ] }, { "item": "cu_pipe", "count": [ 0, 1 ] }, @@ -58,7 +58,7 @@ { "item": "plastic_chunk", "count": [ 0, 128 ] }, { "item": "chunk_rubber", "count": [ 0, 1 ] }, { "item": "material_aluminium_ingot", "count": [ 0, 5 ] }, - { "item": "glass", "count": [ 0, 2 ] }, + { "item": "glass_shard", "count": [ 0, 2 ] }, { "item": "cable", "charges": [ 0, 18 ] }, { "item": "hose", "count": [ 0, 1 ] }, { "item": "cu_pipe", "count": [ 0, 1 ] }, @@ -80,7 +80,7 @@ { "item": "plastic_chunk", "count": [ 0, 349 ] }, { "item": "chunk_rubber", "count": [ 0, 3 ] }, { "item": "material_aluminium_ingot", "count": [ 0, 14 ] }, - { "item": "glass", "count": [ 0, 6 ] }, + { "item": "glass_shard", "count": [ 0, 6 ] }, { "item": "cable", "charges": [ 0, 50 ] }, { "item": "hose", "count": [ 0, 1 ] }, { "item": "cu_pipe", "count": [ 0, 1 ] }, @@ -102,7 +102,7 @@ { "item": "plastic_chunk", "count": [ 0, 406 ] }, { "item": "chunk_rubber", "count": [ 0, 4 ] }, { "item": "material_aluminium_ingot", "count": [ 0, 16 ] }, - { "item": "glass", "count": [ 0, 234 ] }, + { "item": "glass_shard", "count": [ 0, 234 ] }, { "item": "cable", "charges": [ 0, 58 ] }, { "item": "hose", "count": [ 0, 1 ] }, { "item": "cu_pipe", "count": [ 0, 1 ] }, @@ -124,7 +124,7 @@ { "item": "plastic_chunk", "count": [ 0, 874 ] }, { "item": "chunk_rubber", "count": [ 0, 7 ] }, { "item": "material_aluminium_ingot", "count": [ 0, 34 ] }, - { "item": "glass", "count": [ 0, 468 ] }, + { "item": "glass_shard", "count": [ 0, 468 ] }, { "item": "cable", "charges": [ 0, 124 ] }, { "item": "hose", "count": [ 0, 1 ] }, { "item": "cu_pipe", "count": [ 0, 1 ] }, @@ -146,7 +146,7 @@ { "item": "plastic_chunk", "count": [ 0, 858 ] }, { "item": "chunk_rubber", "count": [ 0, 7 ] }, { "item": "material_aluminium_ingot", "count": [ 0, 33 ] }, - { "item": "glass", "count": [ 0, 14 ] }, + { "item": "glass_shard", "count": [ 0, 14 ] }, { "item": "cable", "charges": [ 0, 122 ] }, { "item": "hose", "count": [ 0, 1 ] }, { "item": "cu_pipe", "count": [ 0, 1 ] }, @@ -168,7 +168,7 @@ { "item": "plastic_chunk", "count": [ 0, 531 ] }, { "item": "chunk_rubber", "count": [ 0, 5 ] }, { "item": "material_aluminium_ingot", "count": [ 0, 21 ] }, - { "item": "glass", "count": [ 0, 236 ] }, + { "item": "glass_shard", "count": [ 0, 236 ] }, { "item": "cable", "charges": [ 0, 75 ] }, { "item": "hose", "count": [ 0, 1 ] }, { "item": "cu_pipe", "count": [ 0, 1 ] }, @@ -190,7 +190,7 @@ { "item": "plastic_chunk", "count": [ 0, 294 ] }, { "item": "chunk_rubber", "count": [ 0, 3 ] }, { "item": "material_aluminium_ingot", "count": [ 0, 12 ] }, - { "item": "glass", "count": [ 0, 5 ] }, + { "item": "glass_shard", "count": [ 0, 5 ] }, { "item": "cable", "charges": [ 0, 42 ] }, { "item": "hose", "count": [ 0, 1 ] }, { "item": "cu_pipe", "count": [ 0, 1 ] }, @@ -211,7 +211,7 @@ { "item": "plastic_chunk", "count": [ 0, 140 ] }, { "item": "chunk_rubber", "count": [ 0, 2 ] }, { "item": "material_aluminium_ingot", "count": [ 0, 6 ] }, - { "item": "glass", "count": [ 0, 3 ] }, + { "item": "glass_shard", "count": [ 0, 3 ] }, { "item": "cable", "charges": [ 0, 20 ] }, { "item": "hose", "count": [ 0, 1 ] }, { "item": "cu_pipe", "count": [ 0, 1 ] }, @@ -232,7 +232,7 @@ { "item": "plastic_chunk", "count": [ 0, 120 ] }, { "item": "chunk_rubber", "count": [ 0, 1 ] }, { "item": "material_aluminium_ingot", "count": [ 0, 5 ] }, - { "item": "glass", "count": [ 0, 2 ] }, + { "item": "glass_shard", "count": [ 0, 2 ] }, { "item": "cable", "charges": [ 0, 17 ] }, { "item": "hose", "count": [ 0, 1 ] }, { "item": "cu_pipe", "count": [ 0, 1 ] }, @@ -254,7 +254,7 @@ { "item": "plastic_chunk", "count": [ 0, 375 ] }, { "item": "chunk_rubber", "count": [ 0, 3 ] }, { "item": "material_aluminium_ingot", "count": [ 0, 15 ] }, - { "item": "glass", "count": [ 0, 6 ] }, + { "item": "glass_shard", "count": [ 0, 6 ] }, { "item": "cable", "charges": [ 0, 53 ] }, { "item": "hose", "count": [ 0, 1 ] }, { "item": "cu_pipe", "count": [ 0, 1 ] }, @@ -276,7 +276,7 @@ { "item": "plastic_chunk", "count": [ 0, 260 ] }, { "item": "chunk_rubber", "count": [ 0, 2 ] }, { "item": "material_aluminium_ingot", "count": [ 0, 10 ] }, - { "item": "glass", "count": [ 0, 4 ] }, + { "item": "glass_shard", "count": [ 0, 4 ] }, { "item": "cable", "charges": [ 0, 37 ] }, { "item": "hose", "count": [ 0, 1 ] }, { "item": "cu_pipe", "count": [ 0, 1 ] }, @@ -298,7 +298,7 @@ { "item": "plastic_chunk", "count": [ 0, 895 ] }, { "item": "chunk_rubber", "count": [ 0, 7 ] }, { "item": "material_aluminium_ingot", "count": [ 0, 35 ] }, - { "item": "glass", "count": [ 0, 14 ] }, + { "item": "glass_shard", "count": [ 0, 14 ] }, { "item": "cable", "charges": [ 0, 127 ] }, { "item": "hose", "count": [ 0, 1 ] }, { "item": "cu_pipe", "count": [ 0, 1 ] }, @@ -320,7 +320,7 @@ { "item": "plastic_chunk", "count": [ 0, 416 ] }, { "item": "chunk_rubber", "count": [ 0, 4 ] }, { "item": "material_aluminium_ingot", "count": [ 0, 16 ] }, - { "item": "glass", "count": [ 0, 234 ] }, + { "item": "glass_shard", "count": [ 0, 234 ] }, { "item": "cable", "charges": [ 0, 59 ] }, { "item": "hose", "count": [ 0, 1 ] }, { "item": "cu_pipe", "count": [ 0, 1 ] }, @@ -342,7 +342,7 @@ { "item": "plastic_chunk", "count": [ 0, 315 ] }, { "item": "chunk_rubber", "count": [ 0, 3 ] }, { "item": "material_aluminium_ingot", "count": [ 0, 13 ] }, - { "item": "glass", "count": [ 0, 232 ] }, + { "item": "glass_shard", "count": [ 0, 232 ] }, { "item": "cable", "charges": [ 0, 45 ] }, { "item": "hose", "count": [ 0, 1 ] }, { "item": "cu_pipe", "count": [ 0, 1 ] }, From 53dd5bc92b49cda60473bb28c7dee8f684ae4cd7 Mon Sep 17 00:00:00 2001 From: Brambor Date: Sun, 5 May 2024 22:59:24 +0200 Subject: [PATCH 031/104] Make pillbox_large's pockets transparent --- data/json/items/containers/containers.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/data/json/items/containers/containers.json b/data/json/items/containers/containers.json index 84053ec1d6668..536f9ee00d964 100644 --- a/data/json/items/containers/containers.json +++ b/data/json/items/containers/containers.json @@ -5058,6 +5058,7 @@ { "pocket_type": "CONTAINER", "rigid": true, + "transparent": true, "max_contains_volume": "30 ml", "max_contains_weight": "60 g", "moves": 150 @@ -5065,6 +5066,7 @@ { "pocket_type": "CONTAINER", "rigid": true, + "transparent": true, "max_contains_volume": "30 ml", "max_contains_weight": "60 g", "moves": 150 @@ -5072,6 +5074,7 @@ { "pocket_type": "CONTAINER", "rigid": true, + "transparent": true, "max_contains_volume": "30 ml", "max_contains_weight": "60 g", "moves": 150 @@ -5079,6 +5082,7 @@ { "pocket_type": "CONTAINER", "rigid": true, + "transparent": true, "max_contains_volume": "30 ml", "max_contains_weight": "60 g", "moves": 150 @@ -5086,6 +5090,7 @@ { "pocket_type": "CONTAINER", "rigid": true, + "transparent": true, "max_contains_volume": "30 ml", "max_contains_weight": "60 g", "moves": 150 @@ -5093,6 +5098,7 @@ { "pocket_type": "CONTAINER", "rigid": true, + "transparent": true, "max_contains_volume": "30 ml", "max_contains_weight": "60 g", "moves": 150 @@ -5100,6 +5106,7 @@ { "pocket_type": "CONTAINER", "rigid": true, + "transparent": true, "max_contains_volume": "30 ml", "max_contains_weight": "60 g", "moves": 150 @@ -5107,6 +5114,7 @@ { "pocket_type": "CONTAINER", "rigid": true, + "transparent": true, "max_contains_volume": "30 ml", "max_contains_weight": "60 g", "moves": 150 @@ -5114,6 +5122,7 @@ { "pocket_type": "CONTAINER", "rigid": true, + "transparent": true, "max_contains_volume": "30 ml", "max_contains_weight": "60 g", "moves": 150 @@ -5121,6 +5130,7 @@ { "pocket_type": "CONTAINER", "rigid": true, + "transparent": true, "max_contains_volume": "30 ml", "max_contains_weight": "60 g", "moves": 150 @@ -5128,6 +5138,7 @@ { "pocket_type": "CONTAINER", "rigid": true, + "transparent": true, "max_contains_volume": "30 ml", "max_contains_weight": "60 g", "moves": 150 @@ -5135,6 +5146,7 @@ { "pocket_type": "CONTAINER", "rigid": true, + "transparent": true, "max_contains_volume": "30 ml", "max_contains_weight": "60 g", "moves": 150 @@ -5142,6 +5154,7 @@ { "pocket_type": "CONTAINER", "rigid": true, + "transparent": true, "max_contains_volume": "30 ml", "max_contains_weight": "60 g", "moves": 150 @@ -5149,6 +5162,7 @@ { "pocket_type": "CONTAINER", "rigid": true, + "transparent": true, "max_contains_volume": "30 ml", "max_contains_weight": "60 g", "moves": 150 From 98dafc47fc53a5dcae28f59ab903bbc894eefea3 Mon Sep 17 00:00:00 2001 From: SomeGuyIGues <154325171+SomeGuyIGues@users.noreply.github.com> Date: Mon, 6 May 2024 12:26:58 +1000 Subject: [PATCH 032/104] Update hands.json The game is happy now, but I had to include whole written recipes for the XS and XL fingerless wool gloves. Not efficient. --- data/json/recipes/armor/hands.json | 31 +++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/data/json/recipes/armor/hands.json b/data/json/recipes/armor/hands.json index 1fe45e9572edc..2be009e98ded2 100644 --- a/data/json/recipes/armor/hands.json +++ b/data/json/recipes/armor/hands.json @@ -829,6 +829,7 @@ }, { "result": "gloves_wool_fingerless", + "id_suffix": "from_patchwork", "type": "recipe", "activity_level": "NO_EXERCISE", "category": "CC_ARMOR", @@ -837,8 +838,8 @@ "difficulty": 1, "time": "4 h", "autolearn": true, - "using": [ [ "tailoring_wool_knitting", 67 ] ], "proficiencies": [ { "proficiency": "prof_knitting" }, { "proficiency": "prof_knitting_speed" } ], + "using": [ [ "tailoring_wool_knitting", 67 ] ] }, { "result": "gloves_wool_fingerless", @@ -848,24 +849,36 @@ "category": "CC_ARMOR", "subcategory": "CSC_ARMOR_HANDS", "skill_used": "tailor", - "time": "16 s", + "time": "2 m", "autolearn": true, "qualities": [ { "id": "CUT", "level": 1 } ], - "components": [ [ [ "gloves_wool", 1 ] ] ], + "components": [ [ [ "gloves_wool", 1 ] ] ] }, { "result": "xs_gloves_wool_fingerless", + "id_suffix": "from_gloves", "type": "recipe", - "copy-from": "gloves_wool_fingerless", - "time": "4 h", - "using": [ [ "tailoring_wool_knitting", 50 ] ] + "activity_level": "NO_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_HANDS", + "skill_used": "tailor", + "time": "2 m", + "autolearn": true, + "qualities": [ { "id": "CUT", "level": 1 } ], + "components": [ [ [ "xs_gloves_wool", 1 ] ] ] }, { "result": "xl_gloves_wool_fingerless", + "id_suffix": "from_gloves", "type": "recipe", - "copy-from": "gloves_wool_fingerless", - "time": "4 h 36 m", - "using": [ [ "tailoring_wool_knitting", 94 ] ] + "activity_level": "NO_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_HANDS", + "skill_used": "tailor", + "time": "2 m", + "autolearn": true, + "qualities": [ { "id": "CUT", "level": 1 } ], + "components": [ [ [ "xl_gloves_wool", 1 ] ] ] }, { "result": "gloves_work", From 62087c33774fe43ac789921db41f5d600a716ebc Mon Sep 17 00:00:00 2001 From: SomeGuyIGues <154325171+SomeGuyIGues@users.noreply.github.com> Date: Mon, 6 May 2024 12:34:56 +1000 Subject: [PATCH 033/104] Update hands.json Spacing --- data/json/recipes/armor/hands.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/json/recipes/armor/hands.json b/data/json/recipes/armor/hands.json index 2be009e98ded2..ec459184980b7 100644 --- a/data/json/recipes/armor/hands.json +++ b/data/json/recipes/armor/hands.json @@ -829,7 +829,7 @@ }, { "result": "gloves_wool_fingerless", - "id_suffix": "from_patchwork", + "id_suffix": "from_patchwork", "type": "recipe", "activity_level": "NO_EXERCISE", "category": "CC_ARMOR", From 81072541c47838bc334119d4ad4f4d106d4b2823 Mon Sep 17 00:00:00 2001 From: SomeGuyIGues <154325171+SomeGuyIGues@users.noreply.github.com> Date: Mon, 6 May 2024 18:00:23 +1000 Subject: [PATCH 034/104] Update clothing.json Added gloves_wool_fingerless to all the item_groups that has gloves_wool as well. --- data/json/itemgroups/Clothing_Gear/clothing.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/data/json/itemgroups/Clothing_Gear/clothing.json b/data/json/itemgroups/Clothing_Gear/clothing.json index b2a3629411e79..20b58132f143e 100644 --- a/data/json/itemgroups/Clothing_Gear/clothing.json +++ b/data/json/itemgroups/Clothing_Gear/clothing.json @@ -96,6 +96,7 @@ { "item": "long_undertop", "prob": 50 }, { "item": "gloves_liner", "prob": 50 }, { "item": "gloves_wool", "prob": 50 }, + { "item": "gloves_wool_fingerless", "prob": 25 }, { "item": "knit_scarf", "prob": 50 }, { "item": "pants_cargo", "prob": 75 }, { "item": "tacjacket", "prob": 75 }, @@ -147,6 +148,7 @@ { "item": "coat_winter", "prob": 25 }, { "item": "peacoat", "prob": 25 }, { "item": "gloves_wool", "prob": 25 }, + { "item": "gloves_wool_fingerless", "prob": 12 }, { "item": "gloves_leather", "prob": 25 }, { "item": "leather_belt", "prob": 25 }, { "item": "breeches", "prob": 50 }, @@ -1906,6 +1908,7 @@ [ "gloves_light", 35 ], [ "mittens", 30 ], [ "gloves_wool", 33 ], + [ "gloves_wool_fingerless", 15 ], [ "thermal_socks", 10 ], [ "thermal_gloves", 10 ], [ "thermal_suit", 10 ], @@ -2306,7 +2309,8 @@ { "item": "greatcoat", "prob": 15 }, { "item": "gloves_light", "prob": 35 }, { "item": "mittens", "prob": 30 }, - { "item": "gloves_wool", "prob": 33 }, + { "item": "gloves_wool", "prob": 33 }, + { "item": "gloves_wool_fingerless", "prob": 10 }, { "item": "thermal_socks", "prob": 2 }, { "item": "thermal_gloves", "prob": 2 }, { "item": "thermal_suit", "prob": 2 }, @@ -3673,6 +3677,7 @@ { "item": "gloves_leather", "prob": 15 }, { "item": "gloves_golf", "prob": 15 }, { "item": "gloves_wool", "prob": 15 }, + { "item": "gloves_wool_fingerless", "prob": 5 }, { "item": "gloves_winter", "prob": 10 }, { "item": "gloves_fingerless", "prob": 15 }, { "item": "gloves_liner", "prob": 15 }, @@ -4014,6 +4019,7 @@ { "item": "gloves_light", "prob": 60 }, { "item": "gloves_fingerless", "prob": 40 }, { "item": "gloves_wool", "prob": 25 }, + { "item": "gloves_wool", "prob": 10 }, { "item": "gloves_winter", "prob": 15 }, { "item": "mittens", "prob": 30 }, { "item": "gloves_work", "prob": 20 }, From f6e2498631545deb622815654387b26377122796 Mon Sep 17 00:00:00 2001 From: SomeGuyIGues <154325171+SomeGuyIGues@users.noreply.github.com> Date: Mon, 6 May 2024 18:18:02 +1000 Subject: [PATCH 035/104] Update locations.json Added gloves_wool_fingerless to item_groups I found were appropriate (I think it was only the "shelter," I was extremely bored and zoned out). --- data/json/itemgroups/Locations_MapExtras/locations.json | 1 + 1 file changed, 1 insertion(+) diff --git a/data/json/itemgroups/Locations_MapExtras/locations.json b/data/json/itemgroups/Locations_MapExtras/locations.json index 1695395c3eb03..e1d05248a9a2b 100644 --- a/data/json/itemgroups/Locations_MapExtras/locations.json +++ b/data/json/itemgroups/Locations_MapExtras/locations.json @@ -2484,6 +2484,7 @@ [ "sweater", 75 ], [ "coat_winter", 50 ], [ "gloves_wool", 33 ], + [ "gloves_wool_fingerless", 10 ], [ "thermal_socks", 2 ], [ "thermal_gloves", 2 ], [ "thermal_suit", 2 ], From 32bfffc076c9dba0f2ed732bf2f8214225dbff5a Mon Sep 17 00:00:00 2001 From: SomeGuyIGues <154325171+SomeGuyIGues@users.noreply.github.com> Date: Mon, 6 May 2024 18:44:09 +1000 Subject: [PATCH 036/104] Update collections_domestic.json Added gloves_wool_fingerless to relevant item_groups. --- data/json/itemgroups/collections_domestic.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/data/json/itemgroups/collections_domestic.json b/data/json/itemgroups/collections_domestic.json index f72146b4d2464..783cfe52f6fe2 100644 --- a/data/json/itemgroups/collections_domestic.json +++ b/data/json/itemgroups/collections_domestic.json @@ -547,12 +547,13 @@ { "item": "armguard_hard", "prob": 20 }, { "item": "legguard_hard", "prob": 15 }, { "item": "gloves_wool", "prob": 33 }, + { "item": "gloves_wool", "prob": 15 }, { "item": "thermal_socks", "prob": 2 }, { "item": "thermal_gloves", "prob": 2 }, { "item": "thermal_suit", "prob": 2 }, { "item": "thermal_mask", "prob": 2 }, { "item": "thermal_outfit", "prob": 1 }, - { "item": "gloves_winter", "prob": 40 }, + { "item": "gloves_winter", "prob": 40 } { "item": "gloves_liner", "prob": 25 }, { "item": "gloves_leather", "prob": 45 }, { "item": "gloves_fingerless", "prob": 20 }, From 199ec179436a9524c0ee89c7fe02dfb9572241ea Mon Sep 17 00:00:00 2001 From: SomeGuyIGues <154325171+SomeGuyIGues@users.noreply.github.com> Date: Mon, 6 May 2024 18:53:50 +1000 Subject: [PATCH 037/104] Update clothing.json From e4b25628d48d48bed177371e3d91920d7e1cc2e6 Mon Sep 17 00:00:00 2001 From: SomeGuyIGues <154325171+SomeGuyIGues@users.noreply.github.com> Date: Mon, 6 May 2024 18:56:07 +1000 Subject: [PATCH 038/104] Update gloves.json --- data/json/items/armor/gloves.json | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/data/json/items/armor/gloves.json b/data/json/items/armor/gloves.json index c406df5298b2d..1dcd3920cc772 100644 --- a/data/json/items/armor/gloves.json +++ b/data/json/items/armor/gloves.json @@ -1038,12 +1038,17 @@ "material_thickness": 3, "flags": [ "ALLOWS_NATURAL_ATTACKS", "ALLOWS_TALONS" ], "armor": [ - { "encumbrance": 7, + { + "encumbrance": 7, "coverage": 75, "covers": [ "hand_l", "hand_r" ], "specifically_covers": [ "hand_wrist_l", "hand_wrist_r", "hand_back_l", "hand_back_r" ] }, - { "encumbrance": 7, "coverage": 100, "covers": [ "hand_l", "hand_r" ], "specifically_covers": [ "hand_palm_l", "hand_palm_r" ] }, + { + "encumbrance": 7, + "coverage": 100, + "covers": [ "hand_l", "hand_r" ], + "specifically_covers": [ "hand_palm_l", "hand_palm_r" ] }, { "coverage": 50, "covers": [ "hand_l", "hand_r" ], From 256522634167a6f91a65641f3d0841650462fc43 Mon Sep 17 00:00:00 2001 From: SomeGuyIGues <154325171+SomeGuyIGues@users.noreply.github.com> Date: Mon, 6 May 2024 19:05:24 +1000 Subject: [PATCH 039/104] Update gloves.json Typo(?) --- data/json/items/armor/gloves.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/json/items/armor/gloves.json b/data/json/items/armor/gloves.json index 1dcd3920cc772..61caa77cd1bd0 100644 --- a/data/json/items/armor/gloves.json +++ b/data/json/items/armor/gloves.json @@ -1053,7 +1053,7 @@ "coverage": 50, "covers": [ "hand_l", "hand_r" ], "specifically_covers": [ "hand_fingers_l", "hand_fingers_r" ] - } + }, ] }, { From b6f5c7b324d05779544721f0d6ff045c674fdb26 Mon Sep 17 00:00:00 2001 From: SomeGuyIGues <154325171+SomeGuyIGues@users.noreply.github.com> Date: Mon, 6 May 2024 19:08:07 +1000 Subject: [PATCH 040/104] Update collections_domestic.json Typo --- data/json/itemgroups/collections_domestic.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/json/itemgroups/collections_domestic.json b/data/json/itemgroups/collections_domestic.json index 783cfe52f6fe2..63c8534188d82 100644 --- a/data/json/itemgroups/collections_domestic.json +++ b/data/json/itemgroups/collections_domestic.json @@ -553,7 +553,7 @@ { "item": "thermal_suit", "prob": 2 }, { "item": "thermal_mask", "prob": 2 }, { "item": "thermal_outfit", "prob": 1 }, - { "item": "gloves_winter", "prob": 40 } + { "item": "gloves_winter", "prob": 40 }, { "item": "gloves_liner", "prob": 25 }, { "item": "gloves_leather", "prob": 45 }, { "item": "gloves_fingerless", "prob": 20 }, From e096b1d336bd380f5acfded4e42720042c169595 Mon Sep 17 00:00:00 2001 From: SomeGuyIGues <154325171+SomeGuyIGues@users.noreply.github.com> Date: Mon, 6 May 2024 19:10:34 +1000 Subject: [PATCH 041/104] Update gloves.json Typo --- data/json/items/armor/gloves.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/json/items/armor/gloves.json b/data/json/items/armor/gloves.json index 61caa77cd1bd0..1dcd3920cc772 100644 --- a/data/json/items/armor/gloves.json +++ b/data/json/items/armor/gloves.json @@ -1053,7 +1053,7 @@ "coverage": 50, "covers": [ "hand_l", "hand_r" ], "specifically_covers": [ "hand_fingers_l", "hand_fingers_r" ] - }, + } ] }, { From 2f0d4329006d59d7eea584b3acb471ca54cb4fc0 Mon Sep 17 00:00:00 2001 From: SomeGuyIGues <154325171+SomeGuyIGues@users.noreply.github.com> Date: Mon, 6 May 2024 19:18:08 +1000 Subject: [PATCH 042/104] Update hands.json --- data/json/recipes/armor/hands.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/json/recipes/armor/hands.json b/data/json/recipes/armor/hands.json index ec459184980b7..b22b351555e2f 100644 --- a/data/json/recipes/armor/hands.json +++ b/data/json/recipes/armor/hands.json @@ -829,7 +829,7 @@ }, { "result": "gloves_wool_fingerless", - "id_suffix": "from_patchwork", + "id_suffix": "from_patchwork", "type": "recipe", "activity_level": "NO_EXERCISE", "category": "CC_ARMOR", From 672a4814b3d133aa8bb5113ab42a68fb1064ecd8 Mon Sep 17 00:00:00 2001 From: SomeGuyIGues <154325171+SomeGuyIGues@users.noreply.github.com> Date: Mon, 6 May 2024 19:21:43 +1000 Subject: [PATCH 043/104] Update gloves.json --- data/json/items/armor/gloves.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/json/items/armor/gloves.json b/data/json/items/armor/gloves.json index 1dcd3920cc772..816ebb415fbed 100644 --- a/data/json/items/armor/gloves.json +++ b/data/json/items/armor/gloves.json @@ -1038,13 +1038,13 @@ "material_thickness": 3, "flags": [ "ALLOWS_NATURAL_ATTACKS", "ALLOWS_TALONS" ], "armor": [ - { + { "encumbrance": 7, "coverage": 75, "covers": [ "hand_l", "hand_r" ], "specifically_covers": [ "hand_wrist_l", "hand_wrist_r", "hand_back_l", "hand_back_r" ] }, - { + { "encumbrance": 7, "coverage": 100, "covers": [ "hand_l", "hand_r" ], From 641ca8d0f56d9eea9ff82f416137cbbae6a0ad9c Mon Sep 17 00:00:00 2001 From: SomeGuyIGues <154325171+SomeGuyIGues@users.noreply.github.com> Date: Mon, 6 May 2024 19:24:18 +1000 Subject: [PATCH 044/104] Update gloves.json --- data/json/items/armor/gloves.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/data/json/items/armor/gloves.json b/data/json/items/armor/gloves.json index 816ebb415fbed..c3c9953cf9cba 100644 --- a/data/json/items/armor/gloves.json +++ b/data/json/items/armor/gloves.json @@ -1048,7 +1048,8 @@ "encumbrance": 7, "coverage": 100, "covers": [ "hand_l", "hand_r" ], - "specifically_covers": [ "hand_palm_l", "hand_palm_r" ] }, + "specifically_covers": [ "hand_palm_l", "hand_palm_r" ] + }, { "coverage": 50, "covers": [ "hand_l", "hand_r" ], From a2e52ceec46cb01aa3de42baa35d7552de8fe983 Mon Sep 17 00:00:00 2001 From: SomeGuyIGues <154325171+SomeGuyIGues@users.noreply.github.com> Date: Mon, 6 May 2024 19:29:04 +1000 Subject: [PATCH 045/104] Update gloves.json I swear on Christ, I'm getting tired of the JSON formatting screwing me over. --- data/json/items/armor/gloves.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/data/json/items/armor/gloves.json b/data/json/items/armor/gloves.json index c3c9953cf9cba..6c5e1fda75c0e 100644 --- a/data/json/items/armor/gloves.json +++ b/data/json/items/armor/gloves.json @@ -1045,10 +1045,10 @@ "specifically_covers": [ "hand_wrist_l", "hand_wrist_r", "hand_back_l", "hand_back_r" ] }, { - "encumbrance": 7, - "coverage": 100, - "covers": [ "hand_l", "hand_r" ], - "specifically_covers": [ "hand_palm_l", "hand_palm_r" ] + "encumbrance": 7, + "coverage": 100, + "covers": [ hand_1", "hand_r" ], + "specifically_covers": [ "hand_plam_l", "hand_palm_r" ] }, { "coverage": 50, From 2a5c27446a89c8bc66cb3697d4b79da185ff8ef4 Mon Sep 17 00:00:00 2001 From: SomeGuyIGues <154325171+SomeGuyIGues@users.noreply.github.com> Date: Mon, 6 May 2024 19:31:56 +1000 Subject: [PATCH 046/104] Update gloves.json I don't even know how I managed to confuse l for 1. --- data/json/items/armor/gloves.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/json/items/armor/gloves.json b/data/json/items/armor/gloves.json index 6c5e1fda75c0e..9c31b6b82cafa 100644 --- a/data/json/items/armor/gloves.json +++ b/data/json/items/armor/gloves.json @@ -1047,7 +1047,7 @@ { "encumbrance": 7, "coverage": 100, - "covers": [ hand_1", "hand_r" ], + "covers": [ hand_l", "hand_r" ], "specifically_covers": [ "hand_plam_l", "hand_palm_r" ] }, { From 4102ac5c5721da29cf45538558b2b20dcb6e824e Mon Sep 17 00:00:00 2001 From: SomeGuyIGues <154325171+SomeGuyIGues@users.noreply.github.com> Date: Mon, 6 May 2024 19:33:55 +1000 Subject: [PATCH 047/104] Update clothing.json Typo From a952c74f39e1074bc8629afce8a0690eb2435a34 Mon Sep 17 00:00:00 2001 From: SomeGuyIGues <154325171+SomeGuyIGues@users.noreply.github.com> Date: Mon, 6 May 2024 19:37:32 +1000 Subject: [PATCH 048/104] Update gloves.json Typo again. --- data/json/items/armor/gloves.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/json/items/armor/gloves.json b/data/json/items/armor/gloves.json index 9c31b6b82cafa..5c976ff497e1c 100644 --- a/data/json/items/armor/gloves.json +++ b/data/json/items/armor/gloves.json @@ -1047,8 +1047,8 @@ { "encumbrance": 7, "coverage": 100, - "covers": [ hand_l", "hand_r" ], - "specifically_covers": [ "hand_plam_l", "hand_palm_r" ] + "covers": [ "hand_l", "hand_r" ], + "specifically_covers": [ "hand_palm_l", "hand_palm_r" ] }, { "coverage": 50, From 1e6c8bc0d4f01d8a9fc6eee6081c449f5bcd1b94 Mon Sep 17 00:00:00 2001 From: SomeGuyIGues <154325171+SomeGuyIGues@users.noreply.github.com> Date: Mon, 6 May 2024 19:39:44 +1000 Subject: [PATCH 049/104] Update clothing.json --- data/json/itemgroups/Clothing_Gear/clothing.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/json/itemgroups/Clothing_Gear/clothing.json b/data/json/itemgroups/Clothing_Gear/clothing.json index 20b58132f143e..3635e14b25a34 100644 --- a/data/json/itemgroups/Clothing_Gear/clothing.json +++ b/data/json/itemgroups/Clothing_Gear/clothing.json @@ -2309,7 +2309,7 @@ { "item": "greatcoat", "prob": 15 }, { "item": "gloves_light", "prob": 35 }, { "item": "mittens", "prob": 30 }, - { "item": "gloves_wool", "prob": 33 }, + { "item": "gloves_wool", "prob": 33 }, { "item": "gloves_wool_fingerless", "prob": 10 }, { "item": "thermal_socks", "prob": 2 }, { "item": "thermal_gloves", "prob": 2 }, From b9f79c2cc028e70af8c9d165fcec7098f8bfdb79 Mon Sep 17 00:00:00 2001 From: SomeGuyIGues <154325171+SomeGuyIGues@users.noreply.github.com> Date: Mon, 6 May 2024 19:45:51 +1000 Subject: [PATCH 050/104] Update collections_domestic.json --- data/json/itemgroups/collections_domestic.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/json/itemgroups/collections_domestic.json b/data/json/itemgroups/collections_domestic.json index 63c8534188d82..1e601cfe423cd 100644 --- a/data/json/itemgroups/collections_domestic.json +++ b/data/json/itemgroups/collections_domestic.json @@ -547,7 +547,7 @@ { "item": "armguard_hard", "prob": 20 }, { "item": "legguard_hard", "prob": 15 }, { "item": "gloves_wool", "prob": 33 }, - { "item": "gloves_wool", "prob": 15 }, + { "item": "gloves_wool_fingerless", "prob": 15 }, { "item": "thermal_socks", "prob": 2 }, { "item": "thermal_gloves", "prob": 2 }, { "item": "thermal_suit", "prob": 2 }, From c2d185ecc64fd6ddfd4f8084b0af05f73273e73a Mon Sep 17 00:00:00 2001 From: SomeGuyIGues <154325171+SomeGuyIGues@users.noreply.github.com> Date: Mon, 6 May 2024 21:09:49 +1000 Subject: [PATCH 051/104] Update gloves.json I surely hope this corrects an error about two spaces or something. From a91855bf88f71e425d72e907f5a39a604aa971de Mon Sep 17 00:00:00 2001 From: SomeGuyIGues <154325171+SomeGuyIGues@users.noreply.github.com> Date: Mon, 6 May 2024 21:16:37 +1000 Subject: [PATCH 052/104] Update gloves.json --- data/json/items/armor/gloves.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/json/items/armor/gloves.json b/data/json/items/armor/gloves.json index 5c976ff497e1c..32c0a22c3e7a1 100644 --- a/data/json/items/armor/gloves.json +++ b/data/json/items/armor/gloves.json @@ -1024,7 +1024,7 @@ "id": "gloves_wool_fingerless", "type": "ARMOR", "name": { "str": "pair of fingerless wool gloves", "str_pl": "pairs of fingerless wool gloves" }, - "description": "A warm pair of wool gloves without fingers. Less encumbering, but provides significantly less warmth.", + "description": "A warm pair of wool gloves without fingers. Less encumbering, but provides significantly less warmth.", "weight": "75 g", "volume": "250 ml", "price": "35 USD", From 3428b61f78af908b0a141e8cb66e0c1ef01780ca Mon Sep 17 00:00:00 2001 From: Anton Simakov <67688115+GuardianDll@users.noreply.github.com> Date: Mon, 6 May 2024 14:36:12 +0200 Subject: [PATCH 053/104] [MoM] recipe flags for contemplation (#73505) * add AFFECTED_BY_PAIN and NO_MANIP crafting flags * document new flags * add new flags to MoM recipes * clang tidy fix * add NO_BENCH flag * add NO_ENCHANTMENT flag * add flags to biokin recipes (how did i miss it?) --- .../recipes/nether_attunement.json | 2 +- .../recipes/practice/biokinetic_practice.json | 32 ++++++++--------- .../practice/clairsentient_practice.json | 32 ++++++++--------- .../practice/electrokinesis_practice.json | 34 +++++++++--------- .../practice/photokinesis_practice.json | 30 ++++++++-------- .../practice/pyrokinesis_practice.json | 28 +++++++-------- .../practice/telekinesis_practice.json | 32 ++++++++--------- .../recipes/practice/telepathy_practice.json | 26 +++++++------- .../practice/teleportation_practice.json | 22 ++++++------ .../practice/vitakinesis_practice.json | 36 +++++++++---------- .../recipes/psionics_practice.json | 10 +++--- doc/JSON_FLAGS.md | 4 +++ src/crafting.cpp | 32 +++++++++++++---- src/crafting_gui.cpp | 13 ++++++- src/melee.cpp | 5 +++ 15 files changed, 189 insertions(+), 149 deletions(-) diff --git a/data/mods/MindOverMatter/recipes/nether_attunement.json b/data/mods/MindOverMatter/recipes/nether_attunement.json index 0e57917f76cf1..487db002710a3 100644 --- a/data/mods/MindOverMatter/recipes/nether_attunement.json +++ b/data/mods/MindOverMatter/recipes/nether_attunement.json @@ -11,7 +11,7 @@ "time": "15 m", "autolearn": true, "skill_used": "metaphysics", - "flags": [ "BLIND_EASY" ], + "flags": [ "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_CENTERING_MEDITATION", diff --git a/data/mods/MindOverMatter/recipes/practice/biokinetic_practice.json b/data/mods/MindOverMatter/recipes/practice/biokinetic_practice.json index d3f98bd363fa0..ef935f8f36a35 100644 --- a/data/mods/MindOverMatter/recipes/practice/biokinetic_practice.json +++ b/data/mods/MindOverMatter/recipes/practice/biokinetic_practice.json @@ -45,7 +45,7 @@ "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_biokinesis", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_BIOKIN_OVERCOME_PAIN", @@ -79,7 +79,7 @@ "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_biokinesis", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_BIOKIN_PHYSICAL_ENHANCE", @@ -113,7 +113,7 @@ "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_biokinesis", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_BIOKIN_BREATHE_SKIN", @@ -198,7 +198,7 @@ "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_biokinesis", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_BIOKIN_FLEXIBILITY", @@ -279,7 +279,7 @@ "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_biokinesis", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_BIOKIN_DASH", @@ -361,7 +361,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_biokinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_biokin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_BIOKIN_ARMOR_SKIN", @@ -443,7 +443,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_biokinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_biokin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_BIOKIN_CLIMATE_CONTROL", @@ -525,7 +525,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_biokinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_biokin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_BIOKIN_ADRENALINE", @@ -607,7 +607,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_biokinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_biokin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_BIOKIN_ENHANCE_MOBILITY", @@ -689,7 +689,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_biokinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_biokin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_BIOKIN_HAMMERHAND", @@ -771,7 +771,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_biokinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_biokin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_BIOKIN_REFLEX_ENHANCE", @@ -853,7 +853,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_biokinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_biokin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_BIOKIN_SEALED_SYSTEM", @@ -935,7 +935,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_biokinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_biokin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_BIOKIN_METABOLISM_ENHANCE", @@ -1017,7 +1017,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_biokinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_biokin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_BIOKIN_COMBAT_DANCE", @@ -1099,7 +1099,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_biokinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_biokin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_BIOKIN_PERFECTED_MOTION", @@ -1178,7 +1178,7 @@ "autolearn": false, "tools": [ [ [ "matrix_crystal_drained", -1 ] ] ], "components": [ [ [ "matrix_crystal_biokin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_BIOKIN_HURRICANE_BLOWS", diff --git a/data/mods/MindOverMatter/recipes/practice/clairsentient_practice.json b/data/mods/MindOverMatter/recipes/practice/clairsentient_practice.json index 485eb24423b6f..5986ecbcbf0ae 100644 --- a/data/mods/MindOverMatter/recipes/practice/clairsentient_practice.json +++ b/data/mods/MindOverMatter/recipes/practice/clairsentient_practice.json @@ -49,7 +49,7 @@ [ "matrix_crystal_clairsentience", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_CLAIR_NIGHT_VISION", @@ -87,7 +87,7 @@ [ "matrix_crystal_clairsentience", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_CLAIR_DANGER_SENSE", @@ -176,7 +176,7 @@ [ "matrix_crystal_clairsentience", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_CLAIR_SPEED_READING", @@ -214,7 +214,7 @@ [ "matrix_crystal_clairsentience", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_CLAIR_SPOT_WEAKNESS", @@ -303,7 +303,7 @@ [ "matrix_crystal_clairsentience", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_CLAIR_SENSE_RADS", @@ -341,7 +341,7 @@ [ "matrix_crystal_clairsentience", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_CLAIR_SEE_AURAS", @@ -431,7 +431,7 @@ ] ], "components": [ [ [ "matrix_crystal_clair_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_CLAIR_RANGED_ENHANCE", @@ -521,7 +521,7 @@ ] ], "components": [ [ [ "matrix_crystal_clair_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_CLAIR_VOYANCE", @@ -611,7 +611,7 @@ ] ], "components": [ [ [ "matrix_crystal_clair_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_CLAIR_COMBAT_SENSE", @@ -701,7 +701,7 @@ ] ], "components": [ [ [ "matrix_crystal_clair_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_CLAIR_CRAFT_BONUS", @@ -791,7 +791,7 @@ ] ], "components": [ [ [ "matrix_crystal_clair_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_CLAIR_SEE_MAP", @@ -881,7 +881,7 @@ ] ], "components": [ [ [ "matrix_crystal_clair_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_CLAIR_PERFECT_SHOT", @@ -971,7 +971,7 @@ ] ], "components": [ [ [ "matrix_crystal_clair_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_CLAIR_CLEAR_SIGHT", @@ -1061,7 +1061,7 @@ ] ], "components": [ [ [ "matrix_crystal_clair_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_CLAIR_ASTRAL_PROJECTION", @@ -1148,7 +1148,7 @@ ] ], "components": [ [ [ "matrix_crystal_clair_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_CLAIR_GROUP_TACTICS", @@ -1238,7 +1238,7 @@ ] ], "components": [ [ [ "matrix_crystal_clair_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_CLAIR_OMNISCENCE", diff --git a/data/mods/MindOverMatter/recipes/practice/electrokinesis_practice.json b/data/mods/MindOverMatter/recipes/practice/electrokinesis_practice.json index d249ee5945f6e..0525a64db2dd8 100644 --- a/data/mods/MindOverMatter/recipes/practice/electrokinesis_practice.json +++ b/data/mods/MindOverMatter/recipes/practice/electrokinesis_practice.json @@ -50,7 +50,7 @@ [ "matrix_crystal_electrokinesis", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_ELECTROKIN_SPARK_SIGHT", @@ -88,7 +88,7 @@ [ "matrix_crystal_electrokinesis", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_ELECTROKIN_SHOCK_TOUCH", @@ -126,7 +126,7 @@ [ "matrix_crystal_electrokinesis", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_ELECTROKIN_ZAP_ENEMIES", @@ -215,7 +215,7 @@ [ "matrix_crystal_electrokinesis", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_ELECTROKIN_MELEE_ATTACKS", @@ -304,7 +304,7 @@ [ "matrix_crystal_electrokinesis", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_ELECTRO_HACKING_INTERFACE", @@ -393,7 +393,7 @@ [ "matrix_crystal_electrokinesis", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_ELECTRO_ROBOT_INTERFACE", @@ -482,7 +482,7 @@ [ "matrix_crystal_electrokinesis", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_ELECTRO_PERSONAL_BATTERY", @@ -572,7 +572,7 @@ ] ], "components": [ [ [ "matrix_crystal_electrokin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_ELECTROKIN_PARALYSIS", @@ -662,7 +662,7 @@ ] ], "components": [ [ [ "matrix_crystal_electrokin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_ELECTROKIN_REDUCE_PAIN", @@ -752,7 +752,7 @@ ] ], "components": [ [ [ "matrix_crystal_electrokin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_ELECTROKIN_LIGHTNING_BOLT", @@ -842,7 +842,7 @@ ] ], "components": [ [ [ "matrix_crystal_electrokin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_ELECTROKIN_RECHARGE_VEHICLE", @@ -932,7 +932,7 @@ ] ], "components": [ [ [ "matrix_crystal_electrokin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_ELECTROKIN_SPEED_BOOST", @@ -1022,7 +1022,7 @@ ] ], "components": [ [ [ "matrix_crystal_electrokin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_ELECTROKIN_PAIN_IMMUNE", @@ -1112,7 +1112,7 @@ ] ], "components": [ [ [ "matrix_crystal_electrokin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_ELECTROKIN_KILL_ROBOT", @@ -1202,7 +1202,7 @@ ] ], "components": [ [ [ "matrix_crystal_electrokin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_ELECTROKIN_LIGHTNING_AURA", @@ -1292,7 +1292,7 @@ ] ], "components": [ [ [ "matrix_crystal_electrokin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_ELECTROKIN_LIGHTNING_BLAST", @@ -1382,7 +1382,7 @@ ] ], "components": [ [ [ "matrix_crystal_electrokin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_ELECTROKIN_REVIVE", diff --git a/data/mods/MindOverMatter/recipes/practice/photokinesis_practice.json b/data/mods/MindOverMatter/recipes/practice/photokinesis_practice.json index 9563aa3d1e525..0d284a60cb929 100644 --- a/data/mods/MindOverMatter/recipes/practice/photokinesis_practice.json +++ b/data/mods/MindOverMatter/recipes/practice/photokinesis_practice.json @@ -44,7 +44,7 @@ "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_photokinesis", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_PHOTOKIN_LIGHT_LOCAL", @@ -78,7 +78,7 @@ "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_photokinesis", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_PHOTOKIN_CREATE_LIGHT", @@ -112,7 +112,7 @@ "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_photokinesis", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_PHOTOKIN_SNUFF_LIGHT", @@ -197,7 +197,7 @@ "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_photokinesis", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_PHOTOKIN_LIGHT_DODGE", @@ -282,7 +282,7 @@ "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_photokinesis", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_PHOTOKIN_LIGHT_BEAM", @@ -367,7 +367,7 @@ "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_photokinesis", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_PHOTOKIN_CAMOUFLAGE", @@ -452,7 +452,7 @@ "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_photokinesis", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_PHOTOKIN_RAD_IMMUNITY", @@ -538,7 +538,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_photokinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_photokin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_PHOTOKIN_LIGHT_ARMS", @@ -624,7 +624,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_photokinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_photokin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_PHOTOKIN_HIDE_UGLY", @@ -710,7 +710,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_photokinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_photokin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_PHOTOKIN_LIGHT_IMAGE", @@ -795,7 +795,7 @@ "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_photokinesis", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_PHOTOKIN_RADIO", @@ -881,7 +881,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_photokinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_photokin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_PHOTOKIN_INVISIBILITY", @@ -967,7 +967,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_photokinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_photokin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_PHOTOKIN_LIGHT_FLASH", @@ -1053,7 +1053,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_photokinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_photokin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_PHOTOKIN_BLINDING_GLARE", @@ -1139,7 +1139,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_photokinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_photokin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_PHOTOKIN_LIGHT_DISINTEGRATE", diff --git a/data/mods/MindOverMatter/recipes/practice/pyrokinesis_practice.json b/data/mods/MindOverMatter/recipes/practice/pyrokinesis_practice.json index 5304cc84400d5..3eb02052a5293 100644 --- a/data/mods/MindOverMatter/recipes/practice/pyrokinesis_practice.json +++ b/data/mods/MindOverMatter/recipes/practice/pyrokinesis_practice.json @@ -43,7 +43,7 @@ "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_pyrokinesis", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_PYROKIN_FLASH", @@ -77,7 +77,7 @@ "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_pyrokinesis", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_PYROKIN_FLAMES", @@ -111,7 +111,7 @@ "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_pyrokinesis", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_PYROKIN_CAUTERIZE", @@ -196,7 +196,7 @@ "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_pyrokinesis", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_PYROKIN_QUELL_FIRE", @@ -281,7 +281,7 @@ "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_pyrokinesis", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_PYROKIN_CALL_FLAMES", @@ -367,7 +367,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_pyrokinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_pyrokin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_PYROKIN_CLOAK", @@ -453,7 +453,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_pyrokinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_pyrokin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_PYROKIN_FLAMETHROWER", @@ -539,7 +539,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_pyrokinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_pyrokin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_PYROKIN_LANCE", @@ -625,7 +625,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_pyrokinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_pyrokin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_PYROKIN_THERMOGENESIS", @@ -711,7 +711,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_pyrokinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_pyrokin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_PYROKIN_AURA", @@ -797,7 +797,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_pyrokinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_pyrokin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_PYROKIN_FLAME_IMMUNITY", @@ -883,7 +883,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_pyrokinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_pyrokin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_PYROKIN_BLAST", @@ -969,7 +969,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_pyrokinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_pyrokin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_PYROKIN_AOE_BLAST", @@ -1055,7 +1055,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_pyrokinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_pyrokin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_PYROKIN_INCINERATION", diff --git a/data/mods/MindOverMatter/recipes/practice/telekinesis_practice.json b/data/mods/MindOverMatter/recipes/practice/telekinesis_practice.json index afd797ddf5dd6..6e33ff86d1378 100644 --- a/data/mods/MindOverMatter/recipes/practice/telekinesis_practice.json +++ b/data/mods/MindOverMatter/recipes/practice/telekinesis_practice.json @@ -45,7 +45,7 @@ "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_telekinesis", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_TELEKIN_PULL", @@ -79,7 +79,7 @@ "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_telekinesis", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_TELEKIN_PUSH", @@ -111,7 +111,7 @@ "autolearn": false, "proficiencies": [ { "proficiency": "prof_contemplation_telekinesis", "required": false } ], "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "matrix_crystal_telekinesis", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_TELEKIN_NOISEMAKER", @@ -192,7 +192,7 @@ "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_telekinesis", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_TELEKIN_SLAM_DOWN", @@ -273,7 +273,7 @@ "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_telekinesis", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_TELEKIN_MOMENTUM", @@ -355,7 +355,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_telekinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_telekin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_TELEKIN_SLOWFALL", @@ -437,7 +437,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_telekinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_telekin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_TELEKIN_FORCE_WAVE", @@ -519,7 +519,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_telekinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_telekin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_TELEKIN_ENHANCE_STRENGTH", @@ -601,7 +601,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_telekinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_telekin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_TELEKIN_MINDHAMMER", @@ -683,7 +683,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_telekinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_telekin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_TELEKIN_VEHICLE_LIFT", @@ -765,7 +765,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_telekinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_telekin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_TELEKIN_BARRIER", @@ -847,7 +847,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_telekinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_telekin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_TELEKIN_BLAST", @@ -929,7 +929,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_telekinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_telekin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_LEVITATION", @@ -1009,7 +1009,7 @@ "proficiencies": [ { "proficiency": "prof_contemplation_telekinesis", "required": false } ], "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "matrix_crystal_telekinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_telekin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_MOVE_LARGE_WEIGHT", @@ -1091,7 +1091,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_telekinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_telekin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_TELEKIN_AEGIS", @@ -1173,7 +1173,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_telekinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_telekin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_TELEKIN_EARTHSHAKER", diff --git a/data/mods/MindOverMatter/recipes/practice/telepathy_practice.json b/data/mods/MindOverMatter/recipes/practice/telepathy_practice.json index 8164e6753c515..29880cdab2e5d 100644 --- a/data/mods/MindOverMatter/recipes/practice/telepathy_practice.json +++ b/data/mods/MindOverMatter/recipes/practice/telepathy_practice.json @@ -40,7 +40,7 @@ "autolearn": false, "proficiencies": [ { "proficiency": "prof_contemplation_telepathy", "required": false } ], "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_telepathy", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_TELEPATH_CONCENTRATION", @@ -72,7 +72,7 @@ "autolearn": false, "proficiencies": [ { "proficiency": "prof_contemplation_telepathy", "required": false } ], "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_telepathy", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_TELEPATH_MIND_SENSE", @@ -104,7 +104,7 @@ "autolearn": false, "proficiencies": [ { "proficiency": "prof_contemplation_telepathy", "required": false } ], "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_telepathy", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_TELEPATH_SHIELD", @@ -183,7 +183,7 @@ "autolearn": false, "proficiencies": [ { "proficiency": "prof_contemplation_telepathy", "required": false } ], "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_telepathy", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_TELEPATH_MORALE", @@ -263,7 +263,7 @@ "proficiencies": [ { "proficiency": "prof_contemplation_telepathy", "required": false } ], "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_telepathy", -1 ] ] ], "components": [ [ [ "matrix_crystal_telepath_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_TELEPATHIC_BLAST", @@ -343,7 +343,7 @@ "proficiencies": [ { "proficiency": "prof_contemplation_telepathy", "required": false } ], "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_telepathy", -1 ] ] ], "components": [ [ [ "matrix_crystal_telepath_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_TELEPATHIC_ANIMAL_MIND_CONTROL", @@ -423,7 +423,7 @@ "proficiencies": [ { "proficiency": "prof_contemplation_telepathy", "required": false } ], "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_telepathy", -1 ] ] ], "components": [ [ [ "matrix_crystal_telepath_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_TELEPATH_CONFUSION", @@ -503,7 +503,7 @@ "proficiencies": [ { "proficiency": "prof_contemplation_telepathy", "required": false } ], "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_telepathy", -1 ] ] ], "components": [ [ [ "matrix_crystal_telepath_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_TELEPATH_OBSCURITY", @@ -583,7 +583,7 @@ "proficiencies": [ { "proficiency": "prof_contemplation_telepathy", "required": false } ], "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_telepathy", -1 ] ] ], "components": [ [ [ "matrix_crystal_telepath_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_TELEPATH_PRIMAL_FEAR", @@ -663,7 +663,7 @@ "proficiencies": [ { "proficiency": "prof_contemplation_telepathy", "required": false } ], "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_telepathy", -1 ] ] ], "components": [ [ [ "matrix_crystal_telepath_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_TELEPATH_SCREAM_RADIUS", @@ -743,7 +743,7 @@ "proficiencies": [ { "proficiency": "prof_contemplation_telepathy", "required": false } ], "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_telepathy", -1 ] ] ], "components": [ [ [ "matrix_crystal_telepath_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_TELEPATH_BEAST_TAMING", @@ -823,7 +823,7 @@ "proficiencies": [ { "proficiency": "prof_contemplation_telepathy", "required": false } ], "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_telepathy", -1 ] ] ], "components": [ [ [ "matrix_crystal_telepath_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_TELEPATH_MIND_CONTROL", @@ -903,7 +903,7 @@ "proficiencies": [ { "proficiency": "prof_contemplation_telepathy", "required": false } ], "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_telepathy", -1 ] ] ], "components": [ [ [ "matrix_crystal_telepath_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_TELEPATH_NETWORK_EFFECT", diff --git a/data/mods/MindOverMatter/recipes/practice/teleportation_practice.json b/data/mods/MindOverMatter/recipes/practice/teleportation_practice.json index 25623e81d250f..22c40f54aadc1 100644 --- a/data/mods/MindOverMatter/recipes/practice/teleportation_practice.json +++ b/data/mods/MindOverMatter/recipes/practice/teleportation_practice.json @@ -40,7 +40,7 @@ "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_teleportation", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_TELEPORT_BLINK", @@ -74,7 +74,7 @@ "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_teleportation", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_TELEPORT_SLOW", @@ -108,7 +108,7 @@ "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_teleportation", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_TELEPORT_PHASE", @@ -193,7 +193,7 @@ "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_teleportation", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_TELEPORT_STRIDE", @@ -278,7 +278,7 @@ "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_teleportation", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_TELEPORT_SWAP", @@ -364,7 +364,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_teleportation", -1 ] ] ], "components": [ [ [ "matrix_crystal_teleport_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_TELEPORT_DISPLACEMENT", @@ -450,7 +450,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_teleportation", -1 ] ] ], "components": [ [ [ "matrix_crystal_teleport_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_TELEPORT_COLLAPSE", @@ -536,7 +536,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_teleportation", -1 ] ] ], "components": [ [ [ "matrix_crystal_teleport_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_TELEPORT_FARSTEP", @@ -622,7 +622,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_teleportation", -1 ] ] ], "components": [ [ [ "matrix_crystal_teleport_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_TELEPORT_BANISH", @@ -708,7 +708,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_teleportation", -1 ] ] ], "components": [ [ [ "matrix_crystal_teleport_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_TELEPORT_GATEWAY", @@ -795,7 +795,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_teleportation", -1 ] ] ], "components": [ [ [ "matrix_crystal_teleport_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_TELEPORT_BREACH", diff --git a/data/mods/MindOverMatter/recipes/practice/vitakinesis_practice.json b/data/mods/MindOverMatter/recipes/practice/vitakinesis_practice.json index 0f6e77010c403..b1f583be9512c 100644 --- a/data/mods/MindOverMatter/recipes/practice/vitakinesis_practice.json +++ b/data/mods/MindOverMatter/recipes/practice/vitakinesis_practice.json @@ -47,7 +47,7 @@ "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_vitakinesis", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_VITAKIN_HEALTH", @@ -81,7 +81,7 @@ "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_vitakinesis", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_VITAKIN_SLOW_BLEEDING", @@ -115,7 +115,7 @@ "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_vitakinesis", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_VITAKIN_STAUNCHING", @@ -200,7 +200,7 @@ "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_vitakinesis", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_VITAKIN_HURT", @@ -285,7 +285,7 @@ "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_vitakinesis", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_VITAKIN_HEAL_TOUCH_ALLY", @@ -370,7 +370,7 @@ "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_vitakinesis", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_VITAKIN_REMOVE_POISON", @@ -456,7 +456,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_vitakinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_vitakin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_VITAKIN_SLEEP", @@ -542,7 +542,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_vitakinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_vitakin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_VITAKIN_CURE_DISEASE", @@ -628,7 +628,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_vitakinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_vitakin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_VITAKIN_DAMAGE_BALANCE", @@ -714,7 +714,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_vitakinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_vitakin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_VITAKIN_STOP_INFECTION", @@ -800,7 +800,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_vitakinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_vitakin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_VITAKIN_HEALING_TRANCE", @@ -886,7 +886,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_vitakinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_vitakin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_VITAKIN_PURGE_RADS", @@ -920,7 +920,7 @@ "tools": [ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_vitakinesis", -1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_VITAKIN_ATTACK_TOUCH", @@ -1006,7 +1006,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_vitakinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_vitakin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_VITAKIN_PURGE", @@ -1092,7 +1092,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_vitakinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_vitakin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_VITAKIN_BANISH_ILLNESS", @@ -1178,7 +1178,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_vitakinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_vitakin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_VITAKIN_SUPER_HEAL", @@ -1264,7 +1264,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_vitakinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_vitakin_dust", 2 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_VITAKIN_LIMB_RESTORE", @@ -1296,7 +1296,7 @@ [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_vitakinesis", -1 ] ] ], "components": [ [ [ "matrix_crystal_vitakin_dust", 1 ] ] ], - "flags": [ "SECRET", "BLIND_EASY" ], + "flags": [ "SECRET", "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ], "result_eocs": [ { "id": "EOC_PRACTICE_VITAKIN_RETURN_FROM_DEATH", diff --git a/data/mods/MindOverMatter/recipes/psionics_practice.json b/data/mods/MindOverMatter/recipes/psionics_practice.json index 8b31f8aac4698..bce81eebdbef9 100644 --- a/data/mods/MindOverMatter/recipes/psionics_practice.json +++ b/data/mods/MindOverMatter/recipes/psionics_practice.json @@ -41,7 +41,7 @@ [ "book_newage_witchcraftbeg", 0 ] ], "tools": [ [ ] ], - "flags": [ "BLIND_EASY" ] + "flags": [ "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ] }, { "id": "prac_psionics_inter", @@ -56,7 +56,7 @@ "practice_data": { "min_difficulty": 3, "max_difficulty": 5, "skill_limit": 6 }, "book_learn": [ [ "manual_meditation_int", 3 ], [ "occult_glimpses", 3 ], [ "book_newage_witchcraftadv", 3 ] ], "tools": [ [ ] ], - "flags": [ "BLIND_EASY" ] + "flags": [ "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ] }, { "id": "prac_psionics_advan", @@ -71,7 +71,7 @@ "practice_data": { "min_difficulty": 6, "max_difficulty": 9, "skill_limit": 10 }, "book_learn": [ [ "manual_psionics_advan", 6 ] ], "tools": [ [ ] ], - "flags": [ "BLIND_EASY" ] + "flags": [ "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ] }, { "id": "prac_psionics_prof_basic", @@ -118,7 +118,7 @@ "time": "1 h", "components": [ ], "book_learn": [ [ "manual_meditation", 2 ], [ "book_newage_inpsychic", 2 ], [ "occult_glimpses", 2 ] ], - "flags": [ "BLIND_EASY" ] + "flags": [ "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ] }, { "id": "prac_concentration_intermediate", @@ -134,6 +134,6 @@ "time": "1 h", "components": [ ], "book_learn": [ [ "manual_meditation_int", 5 ] ], - "flags": [ "BLIND_EASY" ] + "flags": [ "BLIND_EASY", "NO_MANIP", "AFFECTED_BY_PAIN", "NO_BENCH", "NO_ENCHANTMENT" ] } ] diff --git a/doc/JSON_FLAGS.md b/doc/JSON_FLAGS.md index 48da64112c85e..95eaf8d1621fb 100644 --- a/doc/JSON_FLAGS.md +++ b/doc/JSON_FLAGS.md @@ -1326,6 +1326,10 @@ See [Character](#character) - ```NEED_FULL_MAGAZINE``` If this recipe requires magazines, it needs one that is full. - ```NO_RESIZE``` This clothes you crafted spawn unfitted - ```SECRET``` Not automatically learned at character creation time based on high skill levels. +- ```AFFECTED_BY_PAIN``` 1 unit of pain decreases the speed of craft for 1%. Recommended to not use in vanilla recipes +- ```NO_MANIP``` Manipulation score do not affect crafting this recipe +- ```NO_BENCH``` Workbench bonus or penalty do not apply to this recipe +- ```NO_ENCHANTMENT``` Enchantment (used in mutations, CBM, effects etc) bonus or penalty do not apply to this recipe ### Crafting recipes diff --git a/src/crafting.cpp b/src/crafting.cpp index f363e74dbe92c..8c810b4567d84 100644 --- a/src/crafting.cpp +++ b/src/crafting.cpp @@ -115,9 +115,13 @@ static const trait_id trait_DEBUG_CNF( "DEBUG_CNF" ); static const trait_id trait_DEBUG_HS( "DEBUG_HS" ); static const trait_id trait_INT_ALPHA( "INT_ALPHA" ); +static const std::string flag_AFFECTED_BY_PAIN( "AFFECTED_BY_PAIN" ); static const std::string flag_BLIND_EASY( "BLIND_EASY" ); static const std::string flag_BLIND_HARD( "BLIND_HARD" ); static const std::string flag_FULL_MAGAZINE( "FULL_MAGAZINE" ); +static const std::string flag_NO_BENCH( "NO_BENCH" ); +static const std::string flag_NO_ENCHANTMENT( "NO_ENCHANTMENT" ); +static const std::string flag_NO_MANIP( "NO_MANIP" ); static const std::string flag_NO_RESIZE( "NO_RESIZE" ); class basecamp; @@ -294,9 +298,15 @@ float Character::workbench_crafting_speed_multiplier( const item &craft, float Character::crafting_speed_multiplier( const recipe &rec ) const { + + const float limb_score = rec.has_flag( flag_NO_MANIP ) ? 1.0f : get_limb_score( + limb_score_manip ); + const float pain_multi = rec.has_flag( flag_AFFECTED_BY_PAIN ) ? std::max( 0.0f, + 1.0f - ( get_perceived_pain() / 100.0f ) ) : 1.0f; + float crafting_speed = morale_crafting_speed_multiplier( rec ) * lighting_craft_speed_multiplier( rec ) * - get_limb_score( limb_score_manip ); + limb_score * pain_multi; const float result = enchantment_cache->modify_value( enchant_vals::mod::CRAFTING_SPEED_MULTIPLIER, crafting_speed ); @@ -319,15 +329,21 @@ float Character::crafting_speed_multiplier( const item &craft, const recipe &rec = craft.get_making(); const float light_multi = lighting_craft_speed_multiplier( rec ); - const float bench_multi = ( use_cached_workbench_multiplier || + const float bench_value = ( use_cached_workbench_multiplier || cached_workbench_multiplier > 0.0f ) ? cached_workbench_multiplier : workbench_crafting_speed_multiplier( craft, loc ); + const float bench_multi = rec.has_flag( flag_NO_BENCH ) ? 1.0f : bench_value; const float morale_multi = morale_crafting_speed_multiplier( rec ); - const float mut_multi = 1.0 + enchantment_cache->get_value_multiply( + const float mut_multi = rec.has_flag( flag_NO_ENCHANTMENT ) ? 1.0f : 1.0 + + enchantment_cache->get_value_multiply( enchant_vals::mod::CRAFTING_SPEED_MULTIPLIER ); + const float limb_score = rec.has_flag( flag_NO_MANIP ) ? 1.0f : get_limb_score( + limb_score_manip ); + const float pain_multi = rec.has_flag( flag_AFFECTED_BY_PAIN ) ? std::max( 0.0f, + 1.0f - ( get_perceived_pain() / 100.0f ) ) : 1.0f ; - const float total_multi = light_multi * bench_multi * morale_multi * mut_multi * - get_limb_score( limb_score_manip ); + const float total_multi = light_multi * bench_multi * morale_multi * mut_multi * limb_score * + pain_multi; if( light_multi <= 0.0f ) { add_msg_if_player( m_bad, _( "You can no longer see well enough to keep crafting." ) ); @@ -343,7 +359,11 @@ float Character::crafting_speed_multiplier( const item &craft, return 0.0f; } - // If we're working below 20% speed, just give up + if( pain_multi <= 0.1f ) { + add_msg_if_player( m_bad, _( "You can't continue due the immense pain in your body." ) ); + return 0.0f; + } + if( total_multi <= 0.2f ) { add_msg_if_player( m_bad, _( "Your progress is so slow that you give up in frustration." ) ); return 0.0f; diff --git a/src/crafting_gui.cpp b/src/crafting_gui.cpp index ad880b424932b..e86a6b14e720e 100644 --- a/src/crafting_gui.cpp +++ b/src/crafting_gui.cpp @@ -64,8 +64,10 @@ static const limb_score_id limb_score_manip( "manip" ); +static const std::string flag_AFFECTED_BY_PAIN( "AFFECTED_BY_PAIN" ); static const std::string flag_BLIND_EASY( "BLIND_EASY" ); static const std::string flag_BLIND_HARD( "BLIND_HARD" ); +static const std::string flag_NO_MANIP( "NO_MANIP" ); enum TAB_MODE { NORMAL, @@ -2278,7 +2280,10 @@ static void draw_can_craft_indicator( const catacurses::window &w, const recipe } else if( crafter.crafting_speed_multiplier( rec ) < 1.0f ) { int morale_modifier = crafter.morale_crafting_speed_multiplier( rec ) * 100; int lighting_modifier = crafter.lighting_craft_speed_multiplier( rec ) * 100; - int limb_modifier = crafter.get_limb_score( limb_score_manip ) * 100; + int limb_modifier = rec.has_flag( flag_NO_MANIP ) ? 100 : crafter.get_limb_score( + limb_score_manip ) * 100; + int pain_multi = rec.has_flag( flag_AFFECTED_BY_PAIN ) ? 100 * std::max( 0.0f, + 1.0f - ( crafter.get_perceived_pain() / 100.0f ) ) : 100; std::stringstream modifiers_list; if( morale_modifier < 100 ) { @@ -2296,6 +2301,12 @@ static void draw_can_craft_indicator( const catacurses::window &w, const recipe } modifiers_list << _( "hands encumbrance/wounds" ) << " " << limb_modifier << "%"; } + if( pain_multi < 100 ) { + if( !modifiers_list.str().empty() ) { + modifiers_list << ", "; + } + modifiers_list << _( "pain" ) << " " << pain_multi << "%"; + } right_print( w, 0, 1, i_yellow, string_format( craft_speed_reason_strings.at( SLOW_BUT_CRAFTABLE ).translated(), diff --git a/src/melee.cpp b/src/melee.cpp index 9c092735ebd09..105db6c65c05f 100644 --- a/src/melee.cpp +++ b/src/melee.cpp @@ -2868,6 +2868,11 @@ void avatar::disarm( npc &target ) item_location it = target.get_wielded_item(); const item_location weapon = get_wielded_item(); + + if( it->has_flag( flag_INTEGRATED ) ) { + return; + }; + // roll your melee and target's dodge skills to check if grab/smash attack succeeds int hitspread = target.deal_melee_attack( this, hit_roll() ); if( hitspread < 0 ) { From 5f086e80a77f0cb68e96dfa47f97b2b8382cd6d7 Mon Sep 17 00:00:00 2001 From: osuphobia <78858975+osuphobia@users.noreply.github.com> Date: Tue, 7 May 2024 02:28:31 +0800 Subject: [PATCH 054/104] Fix anaerobic digester (#73523) * Fix anaerobic digester. * Further adjustment. * astyle --- .../furniture-tools.json | 6 ++--- data/json/items/chemicals_and_resources.json | 4 ++-- src/character_inventory.cpp | 11 ++++++++- src/iexamine.cpp | 24 ++++++++++++------- 4 files changed, 29 insertions(+), 16 deletions(-) diff --git a/data/json/furniture_and_terrain/furniture-tools.json b/data/json/furniture_and_terrain/furniture-tools.json index 572621d21c3b7..96bdc02b90f03 100644 --- a/data/json/furniture_and_terrain/furniture-tools.json +++ b/data/json/furniture_and_terrain/furniture-tools.json @@ -1345,11 +1345,10 @@ "crafting_pseudo_item": "fake_digester_tank", "deconstruct": { "items": [ - { "item": "brick", "count": 60 }, + { "item": "brick", "count": [ 200, 400 ] }, { "item": "pipe", "count": [ 6, 8 ] }, { "item": "pipe_fittings", "count": [ 6, 8 ] }, { "item": "sheet_metal_small", "count": [ 10, 20 ] }, - { "item": "metal_tank", "count": 1 }, { "item": "hose", "count": 1 } ] }, @@ -1376,11 +1375,10 @@ "crafting_pseudo_item": "fake_digester_tank", "deconstruct": { "items": [ - { "item": "brick", "count": 60 }, + { "item": "brick", "count": [ 200, 400 ] }, { "item": "pipe", "count": [ 6, 8 ] }, { "item": "pipe_fittings", "count": [ 6, 8 ] }, { "item": "sheet_metal_small", "count": [ 10, 20 ] }, - { "item": "metal_tank", "count": 1 }, { "item": "hose", "count": 1 } ] }, diff --git a/data/json/items/chemicals_and_resources.json b/data/json/items/chemicals_and_resources.json index b5407b72e0b6d..540fcd5534b6c 100644 --- a/data/json/items/chemicals_and_resources.json +++ b/data/json/items/chemicals_and_resources.json @@ -355,12 +355,12 @@ "name": { "str_sp": "fermentable liquid mixture" }, "volume": "500 ml", "weight": "500 g", - "description": "A mixture of various organic wastes and water. Wait about two months for them to be fermented in a tank.", + "description": "A mixture of various organic wastes and water. Wait about two months for them to be fermented in a tank. Also, biogas production will start after one month.", "copy-from": "fertilizer_liquid", "price": "0 cent", "price_postapoc": "0 cent", "flags": [ "NUTRIENT_OVERRIDE", "TRADER_AVOID" ], - "compostable": { "time": "60 days", "results": [ "fermented_fertilizer_liquid", "biogas" ] }, + "compostable": { "time": "60 days", "results": { "fermented_fertilizer_liquid": 1, "biogas": 250 } }, "charges": 1 }, { diff --git a/src/character_inventory.cpp b/src/character_inventory.cpp index 818915f1a73a5..1d79b8cc1a7bc 100644 --- a/src/character_inventory.cpp +++ b/src/character_inventory.cpp @@ -454,18 +454,27 @@ bool Character::i_add_or_drop( item &it, int qty, const item *avoid, bool retval = true; bool drop = it.made_of( phase_id::LIQUID ); bool add = it.is_gun() || !it.is_irremovable(); + int added = 0; inv->assign_empty_invlet( it, *this ); map &here = get_map(); + drop |= !can_pickWeight( it, !get_option( "DANGEROUS_PICKUPS" ) ) || !can_pickVolume( it ); for( int i = 0; i < qty; ++i ) { - drop |= !can_pickWeight( it, !get_option( "DANGEROUS_PICKUPS" ) ) || !can_pickVolume( it ); if( drop ) { + // No need to loop now, we already knew that there isn't enough room for the item. retval &= !here.add_item_or_charges( pos(), it ).is_null(); + added++; + break; } else if( add ) { i_add( it, true, avoid, original_inventory_item, /*allow_drop=*/true, /*allow_wield=*/!has_wield_conflicts( it ) ); + added++; } } + for( int i = added; i < qty; ++i ) { + retval &= !here.add_item_or_charges( pos(), it ).is_null(); + } + return retval; } diff --git a/src/iexamine.cpp b/src/iexamine.cpp index 67df7f0c45400..02b7b2161ecb4 100644 --- a/src/iexamine.cpp +++ b/src/iexamine.cpp @@ -3943,12 +3943,17 @@ void iexamine::compost_full( Character &you, const tripoint &examp ) } else { for( const std::pair &result : results ) { item biogas( result.first, gas_birthday ); - // 40L biogas for 1 KG of biomass over the whole anaerobic digestion process. - // 1 unit of biomass(0.5 KG) for 80 units(0.25 mL for each unit) of biogas. - int gas_amount = result.second * count * max_gas_gatherable * 80 / 30; + // 40 L biogas for 1 KG of biomass over the whole anaerobic digestion process. + // 1 unit of biomass(0.5 KG) for 80 units(0.25 L for each unit) of biogas. + int gas_amount = count * max_gas_gatherable * 80 / 30; if( result.first->phase == phase_id::GAS ) { - you.i_add_or_drop( biogas, gas_amount ); - add_msg( _( "Gathered %s units of biogas" ), gas_amount ); + if( !you.can_pickVolume_partial( biogas ) ) { + add_msg( _( "You released some biogas from the tank." ) ); + } else { + biogas.charges = result.second; + you.i_add_or_drop( biogas, gas_amount ); + add_msg( _( "Gathered %s units of biogas." ), gas_amount ); + } } } } @@ -3976,12 +3981,13 @@ void iexamine::compost_full( Character &you, const tripoint &examp ) here.add_item( examp, compost ); add_msg( _( "The %s is now ready for use." ), result.first->nname( amount ) ); } else if( result.first->phase == phase_id::GAS ) { - if( !max_gas_gatherable ) { - add_msg( _( "You released gas in the tank." ) ); + int gas_amount = count * max_gas_gatherable * 80 / 30; + if( !gas_amount || !you.can_pickVolume_partial( compost ) ) { + add_msg( _( "You released some biogas from the tank." ) ); } else { - int gas_amount = result.second * count * max_gas_gatherable * 80 / 30; + compost.charges = result.second; you.i_add_or_drop( compost, gas_amount ); - add_msg( _( "Gathered %s units of biogas" ), gas_amount ); + add_msg( _( "Gathered %s units of biogas." ), gas_amount ); } } else { you.i_add_or_drop( compost, amount ); From 0a00a5c916d67c2aeaeded5efef543bbfa72c63c Mon Sep 17 00:00:00 2001 From: RenechCDDA <84619419+RenechCDDA@users.noreply.github.com> Date: Mon, 6 May 2024 14:29:05 -0400 Subject: [PATCH 055/104] Maps only highlight newly revealed OMTs (#73522) * Only highlight new reveals * Map tells you whether or not anything new was revealed --- src/iuse_actor.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/iuse_actor.cpp b/src/iuse_actor.cpp index f4eb4d22fe918..1ea1b75b39ac6 100644 --- a/src/iuse_actor.cpp +++ b/src/iuse_actor.cpp @@ -1217,9 +1217,11 @@ void reveal_map_actor::reveal_targets( const tripoint_abs_omt ¢er, const auto places = overmap_buffer.find_all( center, target.first, radius, false, target.second ); for( const tripoint_abs_omt &place : places ) { + if( !overmap_buffer.seen( place ) ) { + // Should be replaced with the character using the item passed as an argument if NPCs ever learn to use maps + get_avatar().map_revealed_omts.emplace( place ); + } overmap_buffer.reveal( place, reveal_distance ); - // Should be replaced with the character using the item passed as an argument if NPCs ever learn to use maps - get_avatar().map_revealed_omts.emplace( place ); } } @@ -1244,6 +1246,9 @@ std::optional reveal_map_actor::use( Character *p, item &it, const tripoint if( !message.empty() ) { p->add_msg_if_player( m_good, "%s", message ); } + if( p->map_revealed_omts.empty() ) { + p->add_msg_if_player( _( "You didn't learn anything new from the %s." ), it.tname() ); + } it.mark_as_used_by_player( *p ); return 0; } From 35b99fdbe3a562d56e6be57167ddbee0fd56d53b Mon Sep 17 00:00:00 2001 From: TheMurderUnicorn Date: Mon, 6 May 2024 20:10:17 -0400 Subject: [PATCH 056/104] Update ankle_wallet_pouch So It Can Actually Hold Wallets (#73486) --- data/json/items/armor/storage.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data/json/items/armor/storage.json b/data/json/items/armor/storage.json index 54bcc29d5153d..8bb5e13dea5eb 100644 --- a/data/json/items/armor/storage.json +++ b/data/json/items/armor/storage.json @@ -1743,9 +1743,9 @@ "pocket_data": [ { "pocket_type": "CONTAINER", - "max_contains_volume": "400 ml", - "max_contains_weight": "250 g", - "max_item_length": "8 cm", + "max_contains_volume": "500 ml", + "max_contains_weight": "600 g", + "max_item_length": "9 cm", "moves": 150 } ], From 7b5e1051c5ec9f8fd4001162c0a93a7db69ab0bc Mon Sep 17 00:00:00 2001 From: Amnestasia <110217002+Amnestasia@users.noreply.github.com> Date: Mon, 6 May 2024 17:10:40 -0700 Subject: [PATCH 057/104] Update tools.json --- data/mods/Aftershock/items/tools.json | 1 - 1 file changed, 1 deletion(-) diff --git a/data/mods/Aftershock/items/tools.json b/data/mods/Aftershock/items/tools.json index 0b3ee506c0382..6cfc8fe08813f 100644 --- a/data/mods/Aftershock/items/tools.json +++ b/data/mods/Aftershock/items/tools.json @@ -184,7 +184,6 @@ "type": "transform" } ], - "tick_action": [ "MP3_ON" ], "extend": { "flags": [ "TRADER_AVOID", "LIGHT_25" ] } }, { From bc28504bfef9283fbd99b269f8f8c57cc1e0471d Mon Sep 17 00:00:00 2001 From: TheMurderUnicorn Date: Mon, 6 May 2024 20:13:03 -0400 Subject: [PATCH 058/104] Make dummies less dumb (#73488) * Dummies Check for Diggable Terrain * Update Training Dummy Furniture Descriptions --- data/json/construction.json | 2 ++ data/json/furniture_and_terrain/furniture-recreation.json | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/data/json/construction.json b/data/json/construction.json index 0737a03649da2..b355961db6574 100644 --- a/data/json/construction.json +++ b/data/json/construction.json @@ -8060,6 +8060,7 @@ "difficulty": 1, "qualities": [ [ { "id": "DIG", "level": 2 } ] ], "components": [ [ [ "training_dummy_light", 1 ] ] ], + "pre_flags": { "flag": "DIGGABLE", "force_terrain": true }, "pre_special": "check_down_OK", "post_terrain": "f_training_dummy_light" }, @@ -8072,6 +8073,7 @@ "difficulty": 1, "qualities": [ [ { "id": "DIG", "level": 2 } ] ], "components": [ [ [ "training_dummy_heavy", 1 ] ] ], + "pre_flags": { "flag": "DIGGABLE", "force_terrain": true }, "pre_special": "check_down_OK", "post_terrain": "f_training_dummy_heavy" }, diff --git a/data/json/furniture_and_terrain/furniture-recreation.json b/data/json/furniture_and_terrain/furniture-recreation.json index 89779780fb6a0..147d96a6abd5a 100644 --- a/data/json/furniture_and_terrain/furniture-recreation.json +++ b/data/json/furniture_and_terrain/furniture-recreation.json @@ -587,7 +587,7 @@ "type": "furniture", "id": "f_training_dummy_light", "name": "training dummy", - "description": "A hand-made humanoid figure, useful for training in close quarters combat. This one is made from wood and has some duct tape to mark the striking points.", + "description": "A hand-made humanoid figure, useful for training in close quarters combat. This one is made from wood and has some duct tape to mark the striking points. It has been erected in the ground on its post.", "symbol": "@", "color": "brown", "move_cost_mod": 9, @@ -611,7 +611,7 @@ "type": "furniture", "id": "f_training_dummy_heavy", "name": "armored training dummy", - "description": "A hand-made humanoid figure, useful for training in close quarters combat. This one is covered in scrap armor and looks on guard.", + "description": "A hand-made humanoid figure, useful for training in close quarters combat. This one is covered in scrap armor and looks on guard. It has been erected in the ground on its post.", "symbol": "@", "color": "brown", "move_cost_mod": 11, From 81e129807c956e8adde55fcb1cb0282ebfadb755 Mon Sep 17 00:00:00 2001 From: Xygen Date: Tue, 7 May 2024 09:14:39 +0900 Subject: [PATCH 059/104] Update description of mirror armor suits (#73476) * commit * apply suggestion * silence dictionary --- data/json/items/armor/torso_armor.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/data/json/items/armor/torso_armor.json b/data/json/items/armor/torso_armor.json index 8d7b9b4d0da05..757a66ed32b12 100644 --- a/data/json/items/armor/torso_armor.json +++ b/data/json/items/armor/torso_armor.json @@ -2055,7 +2055,7 @@ "type": "ARMOR", "category": "armor", "name": { "str": "mild steel mirror armor", "str_pl": "sets of mild steel mirror armor" }, - "description": "Mirror armor is either round or square plates connected by fasteners to cover all four sides of the vital areas of the torso, mirror plate was usually worn on top of other armor like chainmail or brigandines. This set is crude square plates made of mild steel.", + "description": "Mirror armor earns its name from its distinct shape and polished sheen. Round and rectangular steel plates are fastened together to protect all four sides of the torso. It can be worn on top of other armor like chainmail and brigandines. This set is crudely put together with square plates of mild steel.", "weight": "1000 g", "volume": "2 L", "price": "200 USD", @@ -2103,7 +2103,7 @@ "type": "ARMOR", "copy-from": "lc_mirror_armor", "name": { "str": "medium steel mirror armor", "str_pl": "sets of medium steel mirror armor" }, - "description": "Mirror armor is either round or square plates connected by fasteners to cover all four sides of the vital areas of the torso, mirror plate was usually worn on top of other armor like chainmail or brigandines. This set is well-formed but plain rectangular plates made of medium steel.", + "description": "Mirror armor earns its name from its distinct shape and polished sheen. Round and rectangular steel plates are fastened together to protect all four sides of the torso. It can be worn on top of other armor like chainmail and brigandines. This set is made with rectangular plates of medium steel.", "replace_materials": { "lc_steel": "mc_steel" } }, { @@ -2128,7 +2128,7 @@ "type": "ARMOR", "copy-from": "lc_mirror_armor", "name": { "str": "high steel mirror armor", "str_pl": "sets of high steel mirror armor" }, - "description": "Mirror armor is either round or square plates connected by fasteners to cover all four sides of the vital areas of the torso, mirror plate was usually worn on top of other armor like chainmail or brigandines. This set is made of well formed and lightly decorated high steel rectangular plates.", + "description": "Mirror armor earns its name from its distinct shape and polished sheen. Round and rectangular steel plates are fastened together to protect all four sides of the torso. It can be worn on top of other armor like chainmail and brigandines. Made of high steel plates, this set is well-formed and lightly polished for a neat finish.", "replace_materials": { "lc_steel": "hc_steel" } }, { @@ -2153,7 +2153,7 @@ "type": "ARMOR", "copy-from": "lc_mirror_armor", "name": { "str": "hardened steel mirror armor", "str_pl": "sets of hardened steel mirror armor" }, - "description": "Mirror armor is either round or square plates connected by fasteners to cover all four sides of the vital areas of the torso, mirror plate was usually worn on top of other armor like chainmail or brigandines. This set is created with rectangular plates on the sides, and circular plates on the front, all made of fine hardened steel.", + "description": "Mirror armor earns its name from its distinct shape and polished sheen. Round and rectangular steel plates are fastened together to protect all four sides of the torso. It can be worn on top of other armor like chainmail and brigandines. Made of hardened steel, this set was created with an array of rectangular and circular plates, polished and lightly decorated. Tough, durable, and made to protect.", "replace_materials": { "lc_steel": "ch_steel" } }, { @@ -2178,7 +2178,7 @@ "type": "ARMOR", "copy-from": "lc_mirror_armor", "name": { "str": "tempered steel mirror armor", "str_pl": "sets of tempered steel mirror armor" }, - "description": "Mirror armor is either round or square plates connected by fasteners to cover all four sides of the vital areas of the torso, mirror plate was usually worn on top of other armor like chainmail or brigandines. This set is made of intricate alternating circular and rectangular tempered steel plated, detailed on the outsides and polished to a mirrored sheen in the center.", + "description": "Mirror armor earns its name from its distinct shape and polished sheen. Round and rectangular steel plates are fastened together to protect all four sides of the torso. It can be worn on top of other armor like chainmail and brigandines. Masterfully crafted with tempered steel, this set features a prominent circular plate on the front that has been polished to a mirror-like sheen, flanked with supporting plates intricately joined to fit the body, all meticulously decorated. Will protect you from serious harm, as well as the evil gazes of the undead.", "replace_materials": { "lc_steel": "qt_steel" } }, { From b838e1881951c40284ab23473d2e35be6b3fe5fe Mon Sep 17 00:00:00 2001 From: Standing-Storm <120433252+Standing-Storm@users.noreply.github.com> Date: Mon, 6 May 2024 20:35:09 -0500 Subject: [PATCH 060/104] Remove spaces --- .../npcs/Augustmoon_Salvors/augustmoon_outfitter.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/mods/Aftershock/npcs/Augustmoon_Salvors/augustmoon_outfitter.json b/data/mods/Aftershock/npcs/Augustmoon_Salvors/augustmoon_outfitter.json index c69b6b11d7c7b..e1081a1b827b6 100644 --- a/data/mods/Aftershock/npcs/Augustmoon_Salvors/augustmoon_outfitter.json +++ b/data/mods/Aftershock/npcs/Augustmoon_Salvors/augustmoon_outfitter.json @@ -87,7 +87,7 @@ "class": "NC_AUGUSTMOON_OUTFITTER", "attitude": 0, "mission": 3, - "chat": "TALK_AUGUSTMOON_OUTFITTER ", + "chat": "TALK_AUGUSTMOON_OUTFITTER", "faction": "UICA" }, { From 3c96a50592564938d99e1b84ddcb311791322636 Mon Sep 17 00:00:00 2001 From: KittyTac <52408044+KittyTac@users.noreply.github.com> Date: Tue, 7 May 2024 09:36:51 +0700 Subject: [PATCH 061/104] Re-add generic cards, make the MoM Magician start with only generic cards (#73545) * Update fluff.json * Update professions.json * Fix space --- data/json/items/fluff.json | 21 ++++++++++++++++++--- data/mods/MindOverMatter/professions.json | 2 +- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/data/json/items/fluff.json b/data/json/items/fluff.json index 732a682c0e358..616dddb9f170d 100644 --- a/data/json/items/fluff.json +++ b/data/json/items/fluff.json @@ -31,20 +31,35 @@ "flags": [ "NO_REPAIR" ], "use_action": [ "PLAY_GAME" ], "variants": [ + { + "id": "generic_deck_of_cards", + "name": { "str": "deck of cards", "str_pl": "decks of cards" }, + "description": "A fairly new, glossy deck of 52 playing cards.", + "weight": 30 + }, + { + "id": "deck_of_cards_worn", + "name": { "str": "worn deck of cards", "str_pl": "worn decks of cards" }, + "description": "A deck of 52 playing cards. Judging by the bent, frayed edges and faded prints, it saw its share of games.", + "weight": 6 + }, { "id": "uno", "name": { "str": "deck of Uno cards", "str_pl": "decks of Uno cards" }, - "description": "A set of Uno cards meant to play a game of Uno with your companions. Just don't yell Uno too loud to avoid attracting the undead." + "description": "A set of Uno cards meant to play a game of Uno with your companions. Just don't yell Uno too loud to avoid attracting the undead.", + "weight": 4 }, { "id": "onirim", "name": { "str": "deck of Shadowcaser cards", "str_pl": "decks of Shadowcaser cards" }, - "description": "A set of cards used in the solo or two-player cooperative card game called Shadowcaser. The deck consists of 76 unique cards. Shadowcaser is a immersive card game set in a dream world where players find themselves trapped in a mysterious labyrinthine dream. The objective of the game is for players to escape this dream world by unlocking eight doors before they run out of time or succumb to the nightmares haunting them." + "description": "A set of cards used in the solo or two-player cooperative card game called Shadowcaser. The deck consists of 76 unique cards. Shadowcaser is a immersive card game set in a dream world where players find themselves trapped in a mysterious labyrinthine dream. The objective of the game is for players to escape this dream world by unlocking eight doors before they run out of time or succumb to the nightmares haunting them.", + "weight": 1 }, { "id": "cards_magic", "name": { "str": "deck of Sorcery cards", "str_pl": "decks of Sorcery cards" }, - "description": "A set of cards meant to play the game \"Sorcery.\" Each card has a fun picture of a different monster." + "description": "A set of cards meant to play the game \"Sorcery.\" Each card has a fun picture of a different monster.", + "weight": 2 }, { "id": "deck_of_cards_makeshift", diff --git a/data/mods/MindOverMatter/professions.json b/data/mods/MindOverMatter/professions.json index f983139f4ad81..7eb0ab435bf35 100644 --- a/data/mods/MindOverMatter/professions.json +++ b/data/mods/MindOverMatter/professions.json @@ -195,7 +195,7 @@ { "item": "sneakers" }, { "item": "matrix_crystal_drained" }, { "item": "tshirt", "variant": "generic_tshirt" }, - { "item": "deck_of_cards" }, + { "item": "deck_of_cards", "variant": "generic_deck_of_cards" }, { "item": "tophat" }, { "item": "teddy_bear", "variant": "toy_plush_rabbit" } ] From 45677eb8abdf4cff4246c38984a209d445d36980 Mon Sep 17 00:00:00 2001 From: KeremBaba Date: Tue, 7 May 2024 05:49:10 +0300 Subject: [PATCH 062/104] Mesoamerican armor redux (#73540) * el gambeson * dict * helmet + usd * helmet recipe + some fixes + change some skill needs for weapons * final touch * Update data/json/recipes/armor/head.json Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * once more * fix the error * add the name --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- data/json/items/armor/helmets.json | 59 ++++++++++++++++++++++++++ data/json/items/armor/torso_armor.json | 33 ++++++++++++++ data/json/items/book/fabrication.json | 2 +- data/json/materials.json | 16 +++++++ data/json/recipes/armor/head.json | 22 ++++++++++ data/json/recipes/armor/torso.json | 37 ++++++++++++++++ data/json/recipes/weapon/bashing.json | 18 ++++---- tools/spell_checker/dictionary.txt | 3 ++ 8 files changed, 180 insertions(+), 10 deletions(-) diff --git a/data/json/items/armor/helmets.json b/data/json/items/armor/helmets.json index f965b0ca29d96..e9d0ffb5a76e5 100644 --- a/data/json/items/armor/helmets.json +++ b/data/json/items/armor/helmets.json @@ -546,6 +546,65 @@ ], "melee_damage": { "bash": 2 } }, + { + "id": "helmet_aztec", + "type": "ARMOR", + "category": "armor", + "name": { "str": "eagle cuacalalatli" }, + "description": "A hardwood Mesoamerican helmet that resembles the head of an eagle. It was worn by the renowned eagle warriors of the Aztec, both ceremonially and for protection. Its inside is lined with cotton, and it is ornamented with many feathers, carvings and colors.", + "weight": "2240 g", + "volume": "2500 ml", + "symbol": "[", + "color": "brown", + "looks_like": "helmet_plate", + "price": "150 USD", + "price_postapoc": "12 USD 50 cent", + "material": [ "wood", "cotton" ], + "to_hit": -1, + "melee_damage": { "bash": 6 }, + "techniques": [ "WBLOCK_1" ], + "warmth": 15, + "flags": [ "VARSIZE", "STURDY", "PADDED", "WATERPROOF", "NO_REPAIR" ], + "armor": [ + { + "material": [ + { "type": "wood", "covered_by_mat": 100, "thickness": 6 }, + { "type": "cotton", "covered_by_mat": 95, "thickness": 2 } + ], + "covers": [ "head" ], + "specifically_covers": [ "head_forehead", "head_crown", "head_ear_l", "head_ear_r" ], + "encumbrance": 5, + "coverage": 100 + }, + { + "material": [ + { "type": "wood", "covered_by_mat": 100, "thickness": 6 }, + { "type": "cotton", "covered_by_mat": 95, "thickness": 2 } + ], + "covers": [ "head" ], + "specifically_covers": [ "head_nape" ], + "coverage": 40 + }, + { + "material": [ + { "type": "wood", "covered_by_mat": 100, "thickness": 6 }, + { "type": "cotton", "covered_by_mat": 95, "thickness": 2 } + ], + "covers": [ "mouth" ], + "specifically_covers": [ "mouth_chin" ], + "coverage": 100 + }, + { + "material": [ + { "type": "wood", "covered_by_mat": 100, "thickness": 6 }, + { "type": "cotton", "covered_by_mat": 95, "thickness": 2 } + ], + "covers": [ "mouth" ], + "specifically_covers": [ "mouth_cheeks" ], + "coverage": 20 + } + ] + }, { "id": "helmet_barbute", "type": "ARMOR", diff --git a/data/json/items/armor/torso_armor.json b/data/json/items/armor/torso_armor.json index 757a66ed32b12..bd19e6a2fe2be 100644 --- a/data/json/items/armor/torso_armor.json +++ b/data/json/items/armor/torso_armor.json @@ -278,6 +278,39 @@ } ] }, + { + "id": "armor_aztec", + "type": "ARMOR", + "category": "armor", + "name": { "str": "ichcahuipilli" }, + "description": "A Mesoamerican armor of Nahuatl origin, somewhat similar to a European gambeson. It is made of unspun cotton between two layers of quilted cotton crystalized by brine, edged with leather around its holes. It is extremely thick and offers superb protection, but is also heavy. This bad boy once stopped Spanish bullets and Aztec missiles alike, now its time has come to stop zombie bites.", + "//": "Reasoning for weight and volume parts are within the recipe.", + "weight": "16800 g", + "volume": "16300 ml", + "symbol": "[", + "color": "light_gray", + "looks_like": "gambeson", + "price": "200 USD", + "price_postapoc": "25 USD", + "material": [ "cotton" ], + "to_hit": -1, + "warmth": 80, + "environmental_protection": 4, + "flags": [ "VARSIZE", "STURDY", "NORMAL", "RAINPROOF", "NO_REPAIR", "ONLY_ONE", "BLOCK_WHILE_WORN" ], + "armor": [ + { + "material": [ + { "type": "cotton_quilted_salted", "covered_by_mat": 100, "thickness": 2.5 }, + { "type": "cotton_salted", "covered_by_mat": 95, "thickness": 20 }, + { "type": "cotton_quilted_salted", "covered_by_mat": 100, "thickness": 2.5 } + ], + "covers": [ "torso" ], + "coverage": 100, + "encumbrance": 40 + } + ], + "melee_damage": { "bash": 4 } + }, { "id": "armor_lorica", "type": "ARMOR", diff --git a/data/json/items/book/fabrication.json b/data/json/items/book/fabrication.json index 39c776150a06c..649f1bbdafa0a 100644 --- a/data/json/items/book/fabrication.json +++ b/data/json/items/book/fabrication.json @@ -434,7 +434,7 @@ "str": "The Art of Warfare in Precolumbian Mesoamericas", "str_pl": "copies of The Art of Warfare in Precolumbian Mesoamericas" }, - "description": "This intricate history book details the history of Mesoamerican warfare from the sources of the native codices, Spanish records and contemporary historians. It contains descriptive diagrams and information on few of the weapons used, mainly of the Nahuatl speaking peoples. You reckon you could craft a few of them with steel instead of obsidian.", + "description": "This intricate history book details the history of Mesoamerican warfare from the sources of the native codices, Spanish records and contemporary historians. It contains descriptive diagrams and information on few of the weapons and armor used, mainly of the Nahuatl speaking peoples. You reckon you could craft a few of these weapons with steel instead of obsidian.", "weight": "654 g", "volume": "1250 ml", "price": "64 USD", diff --git a/data/json/materials.json b/data/json/materials.json index 0de3a92f94d45..5ef2c1e77fd54 100644 --- a/data/json/materials.json +++ b/data/json/materials.json @@ -626,6 +626,22 @@ "wind_resist": 75, "resist": { "bash": 2, "cut": 2, "acid": 3, "heat": 0, "bullet": 1.5 } }, + { + "type": "material", + "id": "cotton_salted", + "name": "Salt Hardened Cotton", + "copy-from": "cotton", + "repaired_with": "null", + "resist": { "bash": 2, "cut": 2, "acid": 5, "heat": 10, "bullet": 1.5 } + }, + { + "type": "material", + "id": "cotton_quilted_salted", + "name": "Salt Hardened Quilted Cotton", + "copy-from": "cotton", + "repaired_with": "null", + "resist": { "bash": 3.5, "cut": 3.5, "acid": 5, "heat": 10, "bullet": 2 } + }, { "type": "material", "id": "denim", diff --git a/data/json/recipes/armor/head.json b/data/json/recipes/armor/head.json index 3e9f5172aea99..23794b3038701 100644 --- a/data/json/recipes/armor/head.json +++ b/data/json/recipes/armor/head.json @@ -492,6 +492,28 @@ "autolearn": true, "using": [ [ "tailoring_cotton_small", 16 ], [ "cordage", 2 ] ] }, + { + "result": "helmet_aztec", + "//": "A log is required in this recipe, as I don't think you can bend 2x4s into the shape of an eagle.", + "type": "recipe", + "activity_level": "MODERATE_EXERCISE", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_HEAD", + "skill_used": "fabrication", + "difficulty": 5, + "time": "16 h", + "book_learn": [ [ "textbook_mesoam", 3 ] ], + "using": [ [ "tailoring_cotton_patchwork", 4 ] ], + "proficiencies": [ { "proficiency": "prof_carpentry_basic" }, { "proficiency": "prof_carving" } ], + "qualities": [ + { "id": "CUT", "level": 2 }, + { "id": "CHISEL_WOOD", "level": 2 }, + { "id": "SAW_W", "level": 2 }, + { "id": "FILE", "level": 1 } + ], + "components": [ [ [ "log", 1 ] ], [ [ "2x4", 1 ] ], [ [ "feather", 50 ] ] ], + "byproducts": [ [ "splinter", 200 ] ] + }, { "result": "helmet_barbute", "type": "recipe", diff --git a/data/json/recipes/armor/torso.json b/data/json/recipes/armor/torso.json index d4de610d7f542..0c6a2232fb592 100644 --- a/data/json/recipes/armor/torso.json +++ b/data/json/recipes/armor/torso.json @@ -284,6 +284,43 @@ ], "qualities": [ { "id": "CUT", "level": 2 } ] }, + { + "result": "armor_aztec", + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "//1": "Average ichcahuipilli was around 1 inch (~2.5 cm) thick. As cotton padding constituted the majority of its protective qualities, I'll consider the quilted part 0.5 cm thick.", + "//2": "This leaves us with 20 layers of cotton sheets, taking the thickness of a cotton sheet as 0.25 mm.", + "//3": "Average length of a human male is around 170 cm. Average weight of a human (in North America) is 80 kg. BSA calculation and rule of the nines gives us about 0,68 m^2 or 7,3 sq feet.", + "//3.5": "I'll round that down to 7 for ease, as well as compensating for average woman being shorter and thinner and americans being exceptionally fat.", + "//4": "Our cotton sheets are 1x2 feet. 20 layers x 7 sq ft / 2 sq ft of the sheets = 70 sheets. I know the outer layer of quilting would require more sheets because of the padding inbetween but I won't bother doing the maths for it", + "//5": "Cotton padding inbetween would make 0.065 ft (2 cm of cotton) x 7 sq ft of torso = 0,455 cube ft which is about 12,88 liters of cotton. Once again this calculation is off but again, I can't do the maths.", + "//5.5": "That's aboutā€¦ a lot of cotton, 1288 patches or 429 balls or 257 sheets to be precise. Byproducts I made up.", + "//6": "That's 70x0,04 + 1288x0,01 = 15,6 kgs and some more for leather and salt wtf", + "//7": "And 70x0,05 + 1288x0,01 = 16,3 L.", + "category": "CC_ARMOR", + "subcategory": "CSC_ARMOR_TORSO", + "skill_used": "tailor", + "difficulty": 5, + "skills_required": [ "chemistry", 2 ], + "time": "110 h", + "book_learn": [ [ "textbook_mesoam", 3 ] ], + "proficiencies": [ { "proficiency": "prof_closures" }, { "proficiency": "prof_articulation" }, { "proficiency": "prof_quilting" } ], + "qualities": [ { "id": "SEW", "level": 2 }, { "id": "LEATHER_AWL", "level": 1 } ], + "tools": [ [ [ "metal_tank", -1 ] ] ], + "using": [ [ "tailoring_cotton_patchwork", 70 ], [ "filament", 100 ] ], + "components": [ + [ + [ "cotton_patchwork", 1288 ], + [ "scrap_cotton", 6000 ], + [ "cotton_ball", 429 ], + [ "sheet_cotton", 257 ], + [ "sheet_cotton_patchwork", 257 ] + ], + [ [ "salt_water", 80 ] ], + [ [ "sheet_leather", 5 ], [ "sheet_leather_patchwork", 5 ] ] + ], + "byproducts": [ [ "scrap_cotton", 250 ], [ "cotton_patchwork", 40 ] ] + }, { "result": "chestguard_metal_sheets", "type": "recipe", diff --git a/data/json/recipes/weapon/bashing.json b/data/json/recipes/weapon/bashing.json index 52f6a66b5220a..67f221322390f 100644 --- a/data/json/recipes/weapon/bashing.json +++ b/data/json/recipes/weapon/bashing.json @@ -322,7 +322,7 @@ "skill_used": "fabrication", "difficulty": 5, "time": "10 h", - "book_learn": [ [ "textbook_mesoam", 5 ] ], + "book_learn": [ [ "textbook_mesoam", 3 ] ], "proficiencies": [ { "proficiency": "prof_metalworking" }, { "proficiency": "prof_blacksmithing" }, @@ -357,7 +357,7 @@ "skill_used": "fabrication", "difficulty": 6, "time": "12 h", - "book_learn": [ [ "textbook_mesoam", 6 ] ], + "book_learn": [ [ "textbook_mesoam", 4 ] ], "proficiencies": [ { "proficiency": "prof_metalworking" }, { "proficiency": "prof_blacksmithing" }, @@ -393,7 +393,7 @@ "skill_used": "fabrication", "difficulty": 7, "time": "14 h", - "book_learn": [ [ "textbook_mesoam", 7 ] ], + "book_learn": [ [ "textbook_mesoam", 5 ] ], "proficiencies": [ { "proficiency": "prof_metalworking" }, { "proficiency": "prof_blacksmithing" }, @@ -429,7 +429,7 @@ "skill_used": "fabrication", "difficulty": 8, "time": "18 h", - "book_learn": [ [ "textbook_mesoam", 7 ] ], + "book_learn": [ [ "textbook_mesoam", 6 ] ], "proficiencies": [ { "proficiency": "prof_metalworking" }, { "proficiency": "prof_blacksmithing" }, @@ -548,7 +548,7 @@ "skill_used": "fabrication", "difficulty": 5, "time": "6 h", - "book_learn": [ [ "textbook_mesoam", 5 ] ], + "book_learn": [ [ "textbook_mesoam", 3 ] ], "proficiencies": [ { "proficiency": "prof_metalworking" }, { "proficiency": "prof_blacksmithing" }, @@ -584,7 +584,7 @@ "skill_used": "fabrication", "difficulty": 6, "time": "8 h", - "book_learn": [ [ "textbook_mesoam", 6 ] ], + "book_learn": [ [ "textbook_mesoam", 4 ] ], "proficiencies": [ { "proficiency": "prof_metalworking" }, { "proficiency": "prof_blacksmithing" }, @@ -620,7 +620,7 @@ "skill_used": "fabrication", "difficulty": 7, "time": "10 h", - "book_learn": [ [ "textbook_mesoam", 7 ] ], + "book_learn": [ [ "textbook_mesoam", 5 ] ], "proficiencies": [ { "proficiency": "prof_metalworking" }, { "proficiency": "prof_blacksmithing" }, @@ -656,7 +656,7 @@ "skill_used": "fabrication", "difficulty": 8, "time": "14 h", - "book_learn": [ [ "textbook_mesoam", 8 ] ], + "book_learn": [ [ "textbook_mesoam", 6 ] ], "proficiencies": [ { "proficiency": "prof_metalworking" }, { "proficiency": "prof_blacksmithing" }, @@ -693,7 +693,7 @@ "skill_used": "fabrication", "difficulty": 8, "time": "14 h", - "book_learn": [ [ "textbook_mesoam", 8 ] ], + "book_learn": [ [ "textbook_mesoam", 6 ] ], "proficiencies": [ { "proficiency": "prof_metalworking" }, { "proficiency": "prof_blacksmithing" }, diff --git a/tools/spell_checker/dictionary.txt b/tools/spell_checker/dictionary.txt index 9a696928bcd17..fbb881ccf2975 100644 --- a/tools/spell_checker/dictionary.txt +++ b/tools/spell_checker/dictionary.txt @@ -2758,6 +2758,8 @@ icecream Icelandic Ichaival Ichaivals +ichcahuipilli +ichcahuipillis Ichi ichthyostega ichthys @@ -6465,6 +6467,7 @@ unselectable unsetting unsleeping unsmoked +unspun unstocked untamable untampered From 08a8580efb87863c4ea48c798cfbd0ed71540d6b Mon Sep 17 00:00:00 2001 From: Standing-Storm <120433252+Standing-Storm@users.noreply.github.com> Date: Mon, 6 May 2024 22:31:08 -0500 Subject: [PATCH 063/104] [MoM] Jmathify and variable-ize power learning times (#73529) * Initial commit * Reduce insight proficiency learning time * Implement variables for biokinesis * Clair + Electro + Photo * Pyro + telekin + telepathy * Didn't commit the Teleportation/Vitakinesis changes, oops --- .../eoc_game_initialization.json | 16 ++ .../effectoncondition/eoc_learn_recipes.json | 5 +- data/mods/MindOverMatter/jmath.json | 49 ++-- data/mods/MindOverMatter/obsolete/eocs.json | 20 ++ .../powers/learning_eocs/biokinesis.json | 70 ++++-- .../powers/learning_eocs/clairsentience.json | 65 ++++- .../powers/learning_eocs/electrokinesis.json | 231 +++++++++++------- .../powers/learning_eocs/photokinesis.json | 65 ++++- .../powers/learning_eocs/pyrokinesis.json | 60 ++++- .../powers/learning_eocs/telekinesis.json | 65 ++++- .../powers/learning_eocs/telepathy.json | 55 ++++- .../powers/learning_eocs/teleportation.json | 45 +++- .../powers/learning_eocs/vitakinesis.json | 70 ++++-- .../MindOverMatter/recipes/proficiencies.json | 27 +- 14 files changed, 611 insertions(+), 232 deletions(-) create mode 100644 data/mods/MindOverMatter/obsolete/eocs.json diff --git a/data/mods/MindOverMatter/effectoncondition/eoc_game_initialization.json b/data/mods/MindOverMatter/effectoncondition/eoc_game_initialization.json index 3ae9bb6500075..4bcbab19b99d0 100644 --- a/data/mods/MindOverMatter/effectoncondition/eoc_game_initialization.json +++ b/data/mods/MindOverMatter/effectoncondition/eoc_game_initialization.json @@ -70,5 +70,21 @@ "required_event": "game_start", "condition": { "u_has_trait": "VITAKINETIC" }, "effect": [ { "math": [ "u_awakening_countup", "+=", "1" ] } ] + }, + { + "type": "effect_on_condition", + "id": "EOC_MOM_GAMESTART_POWER_LEARNING_VARIABLES", + "eoc_type": "EVENT", + "required_event": "game_start", + "effect": [ + { "math": [ "global_insight_power_learning_time_low", "=", "43200" ] }, + { "math": [ "global_insight_power_learning_time_high", "=", "604800" ] }, + { "math": [ "global_tier_one_power_learning_time_low", "=", "43200" ] }, + { "math": [ "global_tier_one_power_learning_time_high", "=", "86400" ] }, + { "math": [ "global_tier_two_power_learning_time_low", "=", "129600" ] }, + { "math": [ "global_tier_two_power_learning_time_high", "=", "259200" ] }, + { "math": [ "global_tier_three_power_learning_time_low", "=", "345600" ] }, + { "math": [ "global_tier_three_power_learning_time_high", "=", "604800" ] } + ] } ] diff --git a/data/mods/MindOverMatter/effectoncondition/eoc_learn_recipes.json b/data/mods/MindOverMatter/effectoncondition/eoc_learn_recipes.json index a240e6770adae..d5ff7682b0263 100644 --- a/data/mods/MindOverMatter/effectoncondition/eoc_learn_recipes.json +++ b/data/mods/MindOverMatter/effectoncondition/eoc_learn_recipes.json @@ -1127,7 +1127,10 @@ { "type": "effect_on_condition", "id": "EOC_PSI_LEARNING_VITAMIN_COUNTER", - "recurrence": [ "12 hours", "168 hours" ], + "recurrence": [ + { "math": [ "jmath_psi_learning_counter_time_low(global_insight_power_learning_time_low)" ] }, + { "math": [ "jmath_psi_learning_counter_time_high(global_insight_power_learning_time_high)" ] } + ], "condition": { "and": [ { diff --git a/data/mods/MindOverMatter/jmath.json b/data/mods/MindOverMatter/jmath.json index 75fb523c24bb0..c9b6950859fba 100644 --- a/data/mods/MindOverMatter/jmath.json +++ b/data/mods/MindOverMatter/jmath.json @@ -57,7 +57,7 @@ "type": "jmath_function", "id": "contemplation_factor", "num_args": 1, - "return": "(u_val('focus') * 9) * (_0)" + "return": "(u_val('focus') * 18) * (_0)" }, { "type": "jmath_function", @@ -73,62 +73,69 @@ }, { "type": "jmath_function", - "id": "difficulty_one_contemplation", + "id": "jmath_psi_learning_counter_time_low", "num_args": 1, - "return": "_0 * 49417" + "//": "Reduces time between insight moments by 3% per point of Intelligence above 10 (increase by 3% per point below 10), to a max of 60% faster from intelligence, and by 5% per point of Metaphysics skill above 5.", + "return": "_0 * max(( 1 - ( ( ( u_val('intelligence') + 23.33) / 33.33 ) ) + 1 ),0.4) * clamp(( 1 - (((u_skill('metaphysics') - 4) + 20 ) / 21) + 1),0.75,1)" }, { "type": "jmath_function", - "id": "difficulty_two_contemplation", + "id": "jmath_psi_learning_counter_time_high", "num_args": 1, - "return": "_0 * 49417" + "return": "_0 * max(( 1 - ( ( ( u_val('intelligence') + 23.33) / 33.33 ) ) + 1 ),0.4) * clamp(( 1 - (((u_skill('metaphysics') - 4) + 20 ) / 21) + 1),0.75,1)" }, { "type": "jmath_function", - "id": "difficulty_three_contemplation", + "id": "jmath_biokinesis_learning_eocs_modifiers", "num_args": 1, - "return": "_0 * 49417" + "return": "_0 * max(( 1 - ( ( ( u_val('intelligence') + 23.33) / 33.33 ) ) + 1 ),0.4) * (1 - (0.2 * u_has_proficiency('prof_contemplation_biokinesis')))" }, { "type": "jmath_function", - "id": "difficulty_four_contemplation", + "id": "jmath_clairsentience_learning_eocs_modifiers", "num_args": 1, - "return": "_0 * 35278" + "return": "_0 * max(( 1 - ( ( ( u_val('intelligence') + 23.33) / 33.33 ) ) + 1 ),0.4) * (1 - (0.2 * u_has_proficiency('prof_contemplation_clairsentience')))" }, { "type": "jmath_function", - "id": "difficulty_five_contemplation", + "id": "jmath_electrokinesis_learning_eocs_modifiers", "num_args": 1, - "return": "_0 * 35278" + "return": "_0 * max(( 1 - ( ( ( u_val('intelligence') + 23.33) / 33.33 ) ) + 1 ),0.4) * (1 - (0.2 * u_has_proficiency('prof_contemplation_electrokinesis')))" }, { "type": "jmath_function", - "id": "difficulty_six_contemplation", + "id": "jmath_photokinesis_learning_eocs_modifiers", "num_args": 1, - "return": "_0 * 20513" + "return": "_0 * max(( 1 - ( ( ( u_val('intelligence') + 23.33) / 33.33 ) ) + 1 ),0.4) * (1 - (0.2 * u_has_proficiency('prof_contemplation_photokinesis')))" }, { "type": "jmath_function", - "id": "difficulty_seven_contemplation", + "id": "jmath_pyrokinesis_learning_eocs_modifiers", "num_args": 1, - "return": "_0 * 20513" + "return": "_0 * max(( 1 - ( ( ( u_val('intelligence') + 23.33) / 33.33 ) ) + 1 ),0.4) * (1 - (0.2 * u_has_proficiency('prof_contemplation_pyrokinesis')))" }, { "type": "jmath_function", - "id": "difficulty_eight_contemplation", + "id": "jmath_telekinesis_learning_eocs_modifiers", "num_args": 1, - "return": "_0 * 13722" + "return": "_0 * max(( 1 - ( ( ( u_val('intelligence') + 23.33) / 33.33 ) ) + 1 ),0.4) * (1 - (0.2 * u_has_proficiency('prof_contemplation_telekinesis')))" }, { "type": "jmath_function", - "id": "difficulty_nine_contemplation", + "id": "jmath_telepathy_learning_eocs_modifiers", "num_args": 1, - "return": "_0 * 13722" + "return": "_0 * max(( 1 - ( ( ( u_val('intelligence') + 23.33) / 33.33 ) ) + 1 ),0.4) * (1 - (0.2 * u_has_proficiency('prof_contemplation_telepathy')))" }, { "type": "jmath_function", - "id": "difficulty_ten_contemplation", + "id": "jmath_teleportation_learning_eocs_modifiers", "num_args": 1, - "return": "_0 * 13722" + "return": "_0 * max(( 1 - ( ( ( u_val('intelligence') + 23.33) / 33.33 ) ) + 1 ),0.4) * (1 - (0.2 * u_has_proficiency('prof_contemplation_teleportation')))" + }, + { + "type": "jmath_function", + "id": "jmath_vitakinesis_learning_eocs_modifiers", + "num_args": 1, + "return": "_0 * max(( 1 - ( ( ( u_val('intelligence') + 23.33) / 33.33 ) ) + 1 ),0.4) * (1 - (0.2 * u_has_proficiency('prof_contemplation_vitakinesis')))" } ] diff --git a/data/mods/MindOverMatter/obsolete/eocs.json b/data/mods/MindOverMatter/obsolete/eocs.json new file mode 100644 index 0000000000000..7bde0e3ba9c3c --- /dev/null +++ b/data/mods/MindOverMatter/obsolete/eocs.json @@ -0,0 +1,20 @@ +[ + { + "type": "effect_on_condition", + "id": "EOC_MOM_GAMELOAD_POWER_LEARNING_VARIABLES_UPDATER", + "eoc_type": "EVENT", + "required_event": "game_load", + "condition": { "math": [ "global_updated_power_learning_variables", "!=", "1" ] }, + "effect": [ + { "math": [ "global_insight_power_learning_time_low", "=", "43200" ] }, + { "math": [ "global_insight_power_learning_time_high", "=", "604800" ] }, + { "math": [ "global_tier_one_power_learning_time_low", "=", "43200" ] }, + { "math": [ "global_tier_one_power_learning_time_high", "=", "86400" ] }, + { "math": [ "global_tier_two_power_learning_time_low", "=", "129600" ] }, + { "math": [ "global_tier_two_power_learning_time_high", "=", "259200" ] }, + { "math": [ "global_tier_three_power_learning_time_low", "=", "345600" ] }, + { "math": [ "global_tier_three_power_learning_time_high", "=", "604800" ] }, + { "math": [ "global_updated_power_learning_variables", "=", "1" ] } + ] + } +] diff --git a/data/mods/MindOverMatter/powers/learning_eocs/biokinesis.json b/data/mods/MindOverMatter/powers/learning_eocs/biokinesis.json index f605644fa0d98..cdf1b909fcf87 100644 --- a/data/mods/MindOverMatter/powers/learning_eocs/biokinesis.json +++ b/data/mods/MindOverMatter/powers/learning_eocs/biokinesis.json @@ -2,7 +2,10 @@ { "type": "effect_on_condition", "id": "EOC_BIOKIN_LEARNING_OXYGEN_ABSORPTION", - "recurrence": [ "12 hours", "24 hours" ], + "recurrence": [ + { "math": [ "jmath_biokinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_low)" ] }, + { "math": [ "jmath_biokinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "BIOKINETIC" }, @@ -38,7 +41,10 @@ { "type": "effect_on_condition", "id": "EOC_BIOKIN_LEARNING_FLEXIBILITY", - "recurrence": [ "12 hours", "24 hours" ], + "recurrence": [ + { "math": [ "jmath_biokinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_low)" ] }, + { "math": [ "jmath_biokinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "BIOKINETIC" }, @@ -66,7 +72,10 @@ { "type": "effect_on_condition", "id": "EOC_BIOKIN_LEARNING_DASH", - "recurrence": [ "12 hours", "24 hours" ], + "recurrence": [ + { "math": [ "jmath_biokinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_low)" ] }, + { "math": [ "jmath_biokinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "BIOKINETIC" }, @@ -110,7 +119,10 @@ { "type": "effect_on_condition", "id": "EOC_BIOKIN_LEARNING_ARMOR_SKIN", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_biokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_biokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "BIOKINETIC" }, @@ -156,7 +168,10 @@ { "type": "effect_on_condition", "id": "EOC_BIOKIN_LEARNING_CLIMATE_CONTROL", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_biokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_biokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "BIOKINETIC" }, @@ -197,7 +212,10 @@ { "type": "effect_on_condition", "id": "EOC_BIOKIN_LEARNING_ADRENALINE", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_biokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_biokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "BIOKINETIC" }, @@ -238,7 +256,10 @@ { "type": "effect_on_condition", "id": "EOC_BIOKIN_LEARNING_ENHANCE_MOBILITY", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_biokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_biokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "BIOKINETIC" }, @@ -286,7 +307,10 @@ { "type": "effect_on_condition", "id": "EOC_BIOKIN_LEARNING_HAMMERHAND", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_biokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_biokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "BIOKINETIC" }, @@ -322,7 +346,10 @@ { "type": "effect_on_condition", "id": "EOC_BIOKIN_LEARNING_REFLEX_ENHANCE", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_biokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_biokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "BIOKINETIC" }, @@ -364,7 +391,10 @@ { "type": "effect_on_condition", "id": "EOC_BIOKIN_LEARNING_SEALED_SYSTEM", - "recurrence": [ "96 hours", "168 hours" ], + "recurrence": [ + { "math": [ "jmath_biokinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_low)" ] }, + { "math": [ "jmath_biokinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "BIOKINETIC" }, @@ -410,7 +440,10 @@ { "type": "effect_on_condition", "id": "EOC_BIOKIN_LEARNING_METABOLISM_ENHANCE", - "recurrence": [ "96 hours", "168 hours" ], + "recurrence": [ + { "math": [ "jmath_biokinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_low)" ] }, + { "math": [ "jmath_biokinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "BIOKINETIC" }, @@ -451,7 +484,10 @@ { "type": "effect_on_condition", "id": "EOC_BIOKIN_LEARNING_COMBAT_DANCE", - "recurrence": [ "96 hours", "168 hours" ], + "recurrence": [ + { "math": [ "jmath_biokinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_low)" ] }, + { "math": [ "jmath_biokinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "BIOKINETIC" }, @@ -493,7 +529,10 @@ { "type": "effect_on_condition", "id": "EOC_BIOKIN_LEARNING_PERFECTED_MOTION", - "recurrence": [ "96 hours", "168 hours" ], + "recurrence": [ + { "math": [ "jmath_biokinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_low)" ] }, + { "math": [ "jmath_biokinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "BIOKINETIC" }, @@ -529,7 +568,10 @@ { "type": "effect_on_condition", "id": "EOC_BIOKIN_LEARNING_HURRICANE_BLOWS", - "recurrence": [ "96 hours", "168 hours" ], + "recurrence": [ + { "math": [ "jmath_biokinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_low)" ] }, + { "math": [ "jmath_biokinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "BIOKINETIC" }, diff --git a/data/mods/MindOverMatter/powers/learning_eocs/clairsentience.json b/data/mods/MindOverMatter/powers/learning_eocs/clairsentience.json index bf1fcf60c074a..79cee43e2d349 100644 --- a/data/mods/MindOverMatter/powers/learning_eocs/clairsentience.json +++ b/data/mods/MindOverMatter/powers/learning_eocs/clairsentience.json @@ -2,7 +2,10 @@ { "type": "effect_on_condition", "id": "EOC_CLAIR_LEARNING_PREMONITION", - "recurrence": [ "12 hours", "24 hours" ], + "recurrence": [ + { "math": [ "jmath_clairsentience_learning_eocs_modifiers(global_tier_one_power_learning_time_low)" ] }, + { "math": [ "jmath_clairsentience_learning_eocs_modifiers(global_tier_one_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "CLAIRSENTIENT" }, @@ -27,7 +30,10 @@ { "type": "effect_on_condition", "id": "EOC_CLAIR_LEARNING_SPOT_WEAKNESS", - "recurrence": [ "12 hours", "24 hours" ], + "recurrence": [ + { "math": [ "jmath_clairsentience_learning_eocs_modifiers(global_tier_one_power_learning_time_low)" ] }, + { "math": [ "jmath_clairsentience_learning_eocs_modifiers(global_tier_one_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "CLAIRSENTIENT" }, @@ -63,7 +69,10 @@ { "type": "effect_on_condition", "id": "EOC_CLAIR_LEARNING_AURA_SIGHT", - "recurrence": [ "12 hours", "24 hours" ], + "recurrence": [ + { "math": [ "jmath_clairsentience_learning_eocs_modifiers(global_tier_one_power_learning_time_low)" ] }, + { "math": [ "jmath_clairsentience_learning_eocs_modifiers(global_tier_one_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "CLAIRSENTIENT" }, @@ -99,7 +108,10 @@ { "type": "effect_on_condition", "id": "EOC_CLAIR_LEARNING_RANGED_ENHANCE", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_clairsentience_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_clairsentience_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "CLAIRSENTIENT" }, @@ -127,7 +139,10 @@ { "type": "effect_on_condition", "id": "EOC_CLAIR_LEARNING_VOYANCE", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_clairsentience_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_clairsentience_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "CLAIRSENTIENT" }, @@ -166,7 +181,10 @@ { "type": "effect_on_condition", "id": "EOC_CLAIR_LEARNING_DODGE_POWER", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_clairsentience_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_clairsentience_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "CLAIRSENTIENT" }, @@ -208,7 +226,10 @@ { "type": "effect_on_condition", "id": "EOC_CLAIR_LEARNING_CRAFT_BONUS", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_clairsentience_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_clairsentience_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "CLAIRSENTIENT" }, @@ -245,7 +266,10 @@ { "type": "effect_on_condition", "id": "EOC_CLAIR_LEARNING_PERFECT_SHOT", - "recurrence": [ "96 hours", "168 hours" ], + "recurrence": [ + { "math": [ "jmath_clairsentience_learning_eocs_modifiers(global_tier_three_power_learning_time_low)" ] }, + { "math": [ "jmath_clairsentience_learning_eocs_modifiers(global_tier_three_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "CLAIRSENTIENT" }, @@ -273,7 +297,10 @@ { "type": "effect_on_condition", "id": "EOC_CLAIR_LEARNING_SEE_MAP", - "recurrence": [ "96 hours", "168 hours" ], + "recurrence": [ + { "math": [ "jmath_clairsentience_learning_eocs_modifiers(global_tier_three_power_learning_time_low)" ] }, + { "math": [ "jmath_clairsentience_learning_eocs_modifiers(global_tier_three_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "CLAIRSENTIENT" }, @@ -312,7 +339,10 @@ { "type": "effect_on_condition", "id": "EOC_CLAIR_LEARNING_CLEAR_SIGHT", - "recurrence": [ "96 hours", "168 hours" ], + "recurrence": [ + { "math": [ "jmath_clairsentience_learning_eocs_modifiers(global_tier_three_power_learning_time_low)" ] }, + { "math": [ "jmath_clairsentience_learning_eocs_modifiers(global_tier_three_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "CLAIRSENTIENT" }, @@ -354,7 +384,10 @@ { "type": "effect_on_condition", "id": "EOC_CLAIR_LEARNING_ASTRAL_PROJECTION", - "recurrence": [ "96 hours", "168 hours" ], + "recurrence": [ + { "math": [ "jmath_clairsentience_learning_eocs_modifiers(global_tier_three_power_learning_time_low)" ] }, + { "math": [ "jmath_clairsentience_learning_eocs_modifiers(global_tier_three_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "CLAIRSENTIENT" }, @@ -400,7 +433,10 @@ { "type": "effect_on_condition", "id": "EOC_CLAIR_LEARNING_GROUP_TACTICS", - "recurrence": [ "96 hours", "168 hours" ], + "recurrence": [ + { "math": [ "jmath_clairsentience_learning_eocs_modifiers(global_tier_three_power_learning_time_low)" ] }, + { "math": [ "jmath_clairsentience_learning_eocs_modifiers(global_tier_three_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "CLAIRSENTIENT" }, @@ -437,7 +473,10 @@ { "type": "effect_on_condition", "id": "EOC_CLAIR_LEARNING_OMNISCIENCE", - "recurrence": [ "96 hours", "168 hours" ], + "recurrence": [ + { "math": [ "jmath_clairsentience_learning_eocs_modifiers(global_tier_three_power_learning_time_low)" ] }, + { "math": [ "jmath_clairsentience_learning_eocs_modifiers(global_tier_three_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "CLAIRSENTIENT" }, diff --git a/data/mods/MindOverMatter/powers/learning_eocs/electrokinesis.json b/data/mods/MindOverMatter/powers/learning_eocs/electrokinesis.json index de70038041bdb..f34679413d6cc 100644 --- a/data/mods/MindOverMatter/powers/learning_eocs/electrokinesis.json +++ b/data/mods/MindOverMatter/powers/learning_eocs/electrokinesis.json @@ -2,7 +2,10 @@ { "type": "effect_on_condition", "id": "EOC_ELECTROKIN_LEARNING_ZAP_ENEMIES", - "recurrence": [ "12 hours", "24 hours" ], + "recurrence": [ + { "math": [ "jmath_electrokinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_low)" ] }, + { "math": [ "jmath_electrokinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "ELECTROKINETIC" }, @@ -36,7 +39,10 @@ { "type": "effect_on_condition", "id": "EOC_ELECTROKIN_LEARNING_MELEE_ATTACKS", - "recurrence": [ "12 hours", "24 hours" ], + "recurrence": [ + { "math": [ "jmath_electrokinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_low)" ] }, + { "math": [ "jmath_electrokinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "ELECTROKINETIC" }, @@ -72,90 +78,13 @@ } ] }, - { - "type": "effect_on_condition", - "id": "EOC_ELECTROKIN_LEARNING_HACKING_INTERFACE", - "recurrence": [ "36 hours", "72 hours" ], - "condition": { - "and": [ - { "u_has_trait": "ELECTROKINETIC" }, - { "math": [ "u_vitamin('vitamin_psi_learning_counter')", "==", "1" ] }, - { - "or": [ - { "x_in_y_chance": { "x": 1, "y": 40 } }, - { - "and": [ - { "math": [ "u_spell_level('electrokinetic_see_electric')", ">=", "4" ] }, - { "math": [ "u_spell_level('electrokinetic_shock_touch')", ">=", "4" ] }, - { "math": [ "u_spell_level('electrokinetic_personal_battery')", ">=", "4" ] } - ] - } - ] - }, - { "test_eoc": "EOC_PSI_LEARNING_BANNED_EFFECTS" }, - { "math": [ "u_spell_level('electrokinetic_hacking_interface')", "<=", "0" ] }, - { "not": { "u_know_recipe": "practice_electrokinetic_hacking_interface" } } - ] - }, - "deactivate_condition": { - "or": [ - { "not": { "u_has_trait": "ELECTROKINETIC" } }, - { "math": [ "u_spell_level('electrokinetic_hacking_interface')", ">=", "1" ] } - ] - }, - "effect": [ - { "math": [ "u_vitamin('vitamin_psi_learning_counter')", "=", "0" ] }, - { "u_learn_recipe": "practice_electrokinetic_hacking_interface" }, - { - "u_message": "Use of your powers has led to an insight. You could create an electrical interface to hack nearby devices, if you can figure out the technique.", - "popup": true - } - ] - }, - { - "type": "effect_on_condition", - "id": "EOC_ELECTROKIN_LEARNING_ROBOT_INTERFACE", - "recurrence": [ "96 hours", "168 hours" ], - "condition": { - "and": [ - { "u_has_trait": "ELECTROKINETIC" }, - { "math": [ "u_vitamin('vitamin_psi_learning_counter')", "==", "1" ] }, - { - "or": [ - { "x_in_y_chance": { "x": 1, "y": 80 } }, - { - "and": [ - { "math": [ "u_spell_level('electrokinetic_see_electric')", ">=", "12" ] }, - { "math": [ "u_spell_level('electrokinetic_hacking_interface')", ">=", "8" ] }, - { "math": [ "u_spell_level('electrokinetic_kill_robot')", ">=", "8" ] } - ] - } - ] - }, - { "test_eoc": "EOC_PSI_LEARNING_BANNED_EFFECTS" }, - { "math": [ "u_spell_level('electrokinetic_robot_interface')", "<=", "0" ] }, - { "not": { "u_know_recipe": "practice_electrokinetic_robot_interface" } } - ] - }, - "deactivate_condition": { - "or": [ - { "not": { "u_has_trait": "ELECTROKINETIC" } }, - { "math": [ "u_spell_level('electrokinetic_robot_interface')", ">=", "1" ] } - ] - }, - "effect": [ - { "math": [ "u_vitamin('vitamin_psi_learning_counter')", "=", "0" ] }, - { "u_learn_recipe": "practice_electrokinetic_robot_interface" }, - { - "u_message": "Use of your powers has led to an insight. You could directly manipulate a nearby robot's circuitry, if you can figure out the technique.", - "popup": true - } - ] - }, { "type": "effect_on_condition", "id": "EOC_ELECTROKIN_LEARNING_PERSONAL_BATTERY", - "recurrence": [ "12 hours", "24 hours" ], + "recurrence": [ + { "math": [ "jmath_electrokinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_low)" ] }, + { "math": [ "jmath_electrokinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "ELECTROKINETIC" }, @@ -194,7 +123,10 @@ { "type": "effect_on_condition", "id": "EOC_ELECTROKIN_LEARNING_PARALYSIS", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_electrokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_electrokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "ELECTROKINETIC" }, @@ -238,7 +170,10 @@ { "type": "effect_on_condition", "id": "EOC_ELECTROKIN_LEARNING_REDUCE_PAIN", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_electrokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_electrokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "ELECTROKINETIC" }, @@ -279,10 +214,56 @@ } ] }, + { + "type": "effect_on_condition", + "id": "EOC_ELECTROKIN_LEARNING_HACKING_INTERFACE", + "recurrence": [ + { "math": [ "jmath_electrokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_electrokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], + "condition": { + "and": [ + { "u_has_trait": "ELECTROKINETIC" }, + { "math": [ "u_vitamin('vitamin_psi_learning_counter')", "==", "1" ] }, + { + "or": [ + { "x_in_y_chance": { "x": 1, "y": 40 } }, + { + "and": [ + { "math": [ "u_spell_level('electrokinetic_see_electric')", ">=", "4" ] }, + { "math": [ "u_spell_level('electrokinetic_shock_touch')", ">=", "4" ] }, + { "math": [ "u_spell_level('electrokinetic_personal_battery')", ">=", "4" ] } + ] + } + ] + }, + { "test_eoc": "EOC_PSI_LEARNING_BANNED_EFFECTS" }, + { "math": [ "u_spell_level('electrokinetic_hacking_interface')", "<=", "0" ] }, + { "not": { "u_know_recipe": "practice_electrokinetic_hacking_interface" } } + ] + }, + "deactivate_condition": { + "or": [ + { "not": { "u_has_trait": "ELECTROKINETIC" } }, + { "math": [ "u_spell_level('electrokinetic_hacking_interface')", ">=", "1" ] } + ] + }, + "effect": [ + { "math": [ "u_vitamin('vitamin_psi_learning_counter')", "=", "0" ] }, + { "u_learn_recipe": "practice_electrokinetic_hacking_interface" }, + { + "u_message": "Use of your powers has led to an insight. You could create an electrical interface to hack nearby devices, if you can figure out the technique.", + "popup": true + } + ] + }, { "type": "effect_on_condition", "id": "EOC_ELECTROKIN_LEARNING_LIGHTNING_BOLT", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_electrokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_electrokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "ELECTROKINETIC" }, @@ -326,7 +307,10 @@ { "type": "effect_on_condition", "id": "EOC_ELECTROKIN_LEARNING_RECHARGE_VEHICLE", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_electrokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_electrokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "ELECTROKINETIC" }, @@ -370,7 +354,10 @@ { "type": "effect_on_condition", "id": "EOC_ELECTROKIN_LEARNING_PAIN_IMMUNE", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_electrokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_electrokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "ELECTROKINETIC" }, @@ -401,7 +388,10 @@ { "type": "effect_on_condition", "id": "EOC_ELECTROKIN_LEARNING_SPEED_BOOST", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_electrokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_electrokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "ELECTROKINETIC" }, @@ -447,10 +437,56 @@ } ] }, + { + "type": "effect_on_condition", + "id": "EOC_ELECTROKIN_LEARNING_ROBOT_INTERFACE", + "recurrence": [ + { "math": [ "jmath_electrokinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_low)" ] }, + { "math": [ "jmath_electrokinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_high)" ] } + ], + "condition": { + "and": [ + { "u_has_trait": "ELECTROKINETIC" }, + { "math": [ "u_vitamin('vitamin_psi_learning_counter')", "==", "1" ] }, + { + "or": [ + { "x_in_y_chance": { "x": 1, "y": 80 } }, + { + "and": [ + { "math": [ "u_spell_level('electrokinetic_see_electric')", ">=", "12" ] }, + { "math": [ "u_spell_level('electrokinetic_hacking_interface')", ">=", "8" ] }, + { "math": [ "u_spell_level('electrokinetic_kill_robot')", ">=", "8" ] } + ] + } + ] + }, + { "test_eoc": "EOC_PSI_LEARNING_BANNED_EFFECTS" }, + { "math": [ "u_spell_level('electrokinetic_robot_interface')", "<=", "0" ] }, + { "not": { "u_know_recipe": "practice_electrokinetic_robot_interface" } } + ] + }, + "deactivate_condition": { + "or": [ + { "not": { "u_has_trait": "ELECTROKINETIC" } }, + { "math": [ "u_spell_level('electrokinetic_robot_interface')", ">=", "1" ] } + ] + }, + "effect": [ + { "math": [ "u_vitamin('vitamin_psi_learning_counter')", "=", "0" ] }, + { "u_learn_recipe": "practice_electrokinetic_robot_interface" }, + { + "u_message": "Use of your powers has led to an insight. You could directly manipulate a nearby robot's circuitry, if you can figure out the technique.", + "popup": true + } + ] + }, { "type": "effect_on_condition", "id": "EOC_ELECTROKIN_LEARNING_KILL_ROBOT", - "recurrence": [ "96 hours", "168 hours" ], + "recurrence": [ + { "math": [ "jmath_electrokinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_low)" ] }, + { "math": [ "jmath_electrokinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "ELECTROKINETIC" }, @@ -495,7 +531,10 @@ { "type": "effect_on_condition", "id": "EOC_ELECTROKIN_LEARNING_LIGHTNING_AURA", - "recurrence": [ "96 hours", "168 hours" ], + "recurrence": [ + { "math": [ "jmath_electrokinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_low)" ] }, + { "math": [ "jmath_electrokinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "ELECTROKINETIC" }, @@ -539,7 +578,10 @@ { "type": "effect_on_condition", "id": "EOC_ELECTROKIN_LEARNING_LIGHTNING_BLAST", - "recurrence": [ "96 hours", "168 hours" ], + "recurrence": [ + { "math": [ "jmath_electrokinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_low)" ] }, + { "math": [ "jmath_electrokinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "ELECTROKINETIC" }, @@ -588,7 +630,10 @@ { "type": "effect_on_condition", "id": "EOC_ELECTROKIN_LEARNING_REVIVE", - "recurrence": [ "96 hours", "168 hours" ], + "recurrence": [ + { "math": [ "jmath_electrokinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_low)" ] }, + { "math": [ "jmath_electrokinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "ELECTROKINETIC" }, diff --git a/data/mods/MindOverMatter/powers/learning_eocs/photokinesis.json b/data/mods/MindOverMatter/powers/learning_eocs/photokinesis.json index e4dc26fdd26a1..70f7f695a3ee8 100644 --- a/data/mods/MindOverMatter/powers/learning_eocs/photokinesis.json +++ b/data/mods/MindOverMatter/powers/learning_eocs/photokinesis.json @@ -2,7 +2,10 @@ { "type": "effect_on_condition", "id": "EOC_PHOTOKIN_LEARNING_SNUFF_LIGHT", - "recurrence": [ "12 hours", "24 hours" ], + "recurrence": [ + { "math": [ "jmath_photokinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_low)" ] }, + { "math": [ "jmath_photokinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "PHOTOKINETIC" }, @@ -38,7 +41,10 @@ { "type": "effect_on_condition", "id": "EOC_PHOTO_LEARNING_LIGHT_DODGE", - "recurrence": [ "12 hours", "24 hours" ], + "recurrence": [ + { "math": [ "jmath_photokinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_low)" ] }, + { "math": [ "jmath_photokinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "PHOTOKINETIC" }, @@ -74,7 +80,10 @@ { "type": "effect_on_condition", "id": "EOC_PHOTO_LEARNING_LIGHT_BEAM", - "recurrence": [ "12 hours", "24 hours" ], + "recurrence": [ + { "math": [ "jmath_photokinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_low)" ] }, + { "math": [ "jmath_photokinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "PHOTOKINETIC" }, @@ -110,7 +119,10 @@ { "type": "effect_on_condition", "id": "EOC_PHOTO_LEARNING_CAMOUFLAGE", - "recurrence": [ "12 hours", "24 hours" ], + "recurrence": [ + { "math": [ "jmath_photokinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_low)" ] }, + { "math": [ "jmath_photokinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "PHOTOKINETIC" }, @@ -141,7 +153,10 @@ { "type": "effect_on_condition", "id": "EOC_PHOTO_LEARNING_RAD_IMMUNITY", - "recurrence": [ "12 hours", "24 hours" ], + "recurrence": [ + { "math": [ "jmath_photokinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_low)" ] }, + { "math": [ "jmath_photokinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "PHOTOKINETIC" }, @@ -185,7 +200,10 @@ { "type": "effect_on_condition", "id": "EOC_PHOTOKIN_LEARNING_LIGHT_ARMS", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_photokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_photokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "PHOTOKINETIC" }, @@ -222,7 +240,10 @@ { "type": "effect_on_condition", "id": "EOC_PHOTOKIN_LEARNING_HIDE_UGLY", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_photokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_photokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "PHOTOKINETIC" }, @@ -258,7 +279,10 @@ { "type": "effect_on_condition", "id": "EOC_PHOTOKIN_LEARNING_LIGHT_IMAGE", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_photokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_photokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "PHOTOKINETIC" }, @@ -299,7 +323,10 @@ { "type": "effect_on_condition", "id": "EOC_PHOTOKIN_LEARNING_RADIO", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_photokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_photokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "PHOTOKINETIC" }, @@ -340,7 +367,10 @@ { "type": "effect_on_condition", "id": "EOC_PHOTOKIN_LEARNING_INVISIBILITY", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_photokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_photokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "PHOTOKINETIC" }, @@ -389,7 +419,10 @@ { "type": "effect_on_condition", "id": "EOC_PHOTOKIN_LEARNING_LIGHT_FLASH", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_photokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_photokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "PHOTOKINETIC" }, @@ -430,7 +463,10 @@ { "type": "effect_on_condition", "id": "EOC_PHOTOKIN_LEARNING_LIGHT_BLINDING_GLARE", - "recurrence": [ "96 hours", "168 hours" ], + "recurrence": [ + { "math": [ "jmath_photokinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_low)" ] }, + { "math": [ "jmath_photokinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "PHOTOKINETIC" }, @@ -474,7 +510,10 @@ { "type": "effect_on_condition", "id": "EOC_PHOTOKIN_LEARNING_LIGHT_DISINTEGRATE", - "recurrence": [ "96 hours", "168 hours" ], + "recurrence": [ + { "math": [ "jmath_photokinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_low)" ] }, + { "math": [ "jmath_photokinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "PHOTOKINETIC" }, diff --git a/data/mods/MindOverMatter/powers/learning_eocs/pyrokinesis.json b/data/mods/MindOverMatter/powers/learning_eocs/pyrokinesis.json index 23c6a5f345894..a7d4ad05d0108 100644 --- a/data/mods/MindOverMatter/powers/learning_eocs/pyrokinesis.json +++ b/data/mods/MindOverMatter/powers/learning_eocs/pyrokinesis.json @@ -2,7 +2,10 @@ { "type": "effect_on_condition", "id": "EOC_PYROKIN_LEARNING_CAUTERIZE", - "recurrence": [ "12 hours", "24 hours" ], + "recurrence": [ + { "math": [ "jmath_pyrokinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_low)" ] }, + { "math": [ "jmath_pyrokinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "PYROKINETIC" }, @@ -43,7 +46,10 @@ { "type": "effect_on_condition", "id": "EOC_PYROKIN_LEARNING_CALL_FLAMES", - "recurrence": [ "12 hours", "24 hours" ], + "recurrence": [ + { "math": [ "jmath_pyrokinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_low)" ] }, + { "math": [ "jmath_pyrokinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "PYROKINETIC" }, @@ -74,7 +80,10 @@ { "type": "effect_on_condition", "id": "EOC_PYROKIN_LEARNING_QUELL_FLAMES", - "recurrence": [ "12 hours", "24 hours" ], + "recurrence": [ + { "math": [ "jmath_pyrokinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_low)" ] }, + { "math": [ "jmath_pyrokinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "PYROKINETIC" }, @@ -105,7 +114,10 @@ { "type": "effect_on_condition", "id": "EOC_PYROKIN_LEARNING_CLOAK", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_pyrokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_pyrokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "PYROKINETIC" }, @@ -141,7 +153,10 @@ { "type": "effect_on_condition", "id": "EOC_PYROKIN_LEARNING_FLAMETHROWER", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_pyrokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_pyrokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "PYROKINETIC" }, @@ -177,7 +192,10 @@ { "type": "effect_on_condition", "id": "EOC_PYROKIN_LEARNING_LANCE", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_pyrokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_pyrokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "PYROKINETIC" }, @@ -218,7 +236,10 @@ { "type": "effect_on_condition", "id": "EOC_PYROKIN_LEARNING_THERMOGENESIS", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_pyrokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_pyrokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "PYROKINETIC" }, @@ -259,7 +280,10 @@ { "type": "effect_on_condition", "id": "EOC_PYROKIN_LEARNING_AURA", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_pyrokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_pyrokinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "PYROKINETIC" }, @@ -301,7 +325,10 @@ { "type": "effect_on_condition", "id": "EOC_PYROKIN_LEARNING_FLAME_IMMUNITY", - "recurrence": [ "96 hours", "168 hours" ], + "recurrence": [ + { "math": [ "jmath_pyrokinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_low)" ] }, + { "math": [ "jmath_pyrokinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "PYROKINETIC" }, @@ -345,7 +372,10 @@ { "type": "effect_on_condition", "id": "EOC_PYROKIN_LEARNING_BLAST", - "recurrence": [ "96 hours", "168 hours" ], + "recurrence": [ + { "math": [ "jmath_pyrokinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_low)" ] }, + { "math": [ "jmath_pyrokinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "PYROKINETIC" }, @@ -391,7 +421,10 @@ { "type": "effect_on_condition", "id": "EOC_PYROKIN_LEARNING_AOE_BLAST", - "recurrence": [ "96 hours", "168 hours" ], + "recurrence": [ + { "math": [ "jmath_pyrokinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_low)" ] }, + { "math": [ "jmath_pyrokinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "PYROKINETIC" }, @@ -437,7 +470,10 @@ { "type": "effect_on_condition", "id": "EOC_PYROKIN_LEARNING_INCINERATION", - "recurrence": [ "96 hours", "168 hours" ], + "recurrence": [ + { "math": [ "jmath_pyrokinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_low)" ] }, + { "math": [ "jmath_pyrokinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "PYROKINETIC" }, diff --git a/data/mods/MindOverMatter/powers/learning_eocs/telekinesis.json b/data/mods/MindOverMatter/powers/learning_eocs/telekinesis.json index 215d3c7fdebfa..596e5341bc1f6 100644 --- a/data/mods/MindOverMatter/powers/learning_eocs/telekinesis.json +++ b/data/mods/MindOverMatter/powers/learning_eocs/telekinesis.json @@ -2,7 +2,10 @@ { "type": "effect_on_condition", "id": "EOC_TELEKIN_LEARNING_NOISEMAKER", - "recurrence": [ "12 hours", "24 hours" ], + "recurrence": [ + { "math": [ "jmath_telekinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_low)" ] }, + { "math": [ "jmath_telekinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "TELEKINETIC" }, @@ -63,7 +66,10 @@ { "type": "effect_on_condition", "id": "EOC_TELEKIN_LEARNING_MOMENTUM", - "recurrence": [ "12 hours", "24 hours" ], + "recurrence": [ + { "math": [ "jmath_telekinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_low)" ] }, + { "math": [ "jmath_telekinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "TELEKINETIC" }, @@ -99,7 +105,10 @@ { "type": "effect_on_condition", "id": "EOC_TELEKIN_LEARNING_SLOWFALL", - "recurrence": [ "12 hours", "24 hours" ], + "recurrence": [ + { "math": [ "jmath_telekinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_low)" ] }, + { "math": [ "jmath_telekinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "TELEKINETIC" }, @@ -130,7 +139,10 @@ { "type": "effect_on_condition", "id": "EOC_TELEKIN_LEARNING_WAVE", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_telekinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_telekinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "TELEKINETIC" }, @@ -166,7 +178,10 @@ { "type": "effect_on_condition", "id": "EOC_TELEKIN_LEARNING_STRENGTH", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_telekinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_telekinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "TELEKINETIC" }, @@ -207,7 +222,10 @@ { "type": "effect_on_condition", "id": "EOC_TELEKIN_LEARNING_HAMMER", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_telekinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_telekinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "TELEKINETIC" }, @@ -248,7 +266,10 @@ { "type": "effect_on_condition", "id": "EOC_TELEKIN_LEARNING_VEHICLE_LIFT", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_telekinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_telekinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "TELEKINETIC" }, @@ -289,7 +310,10 @@ { "type": "effect_on_condition", "id": "EOC_TELEKIN_LEARNING_SHIELD", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_telekinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_telekinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "TELEKINETIC" }, @@ -325,7 +349,10 @@ { "type": "effect_on_condition", "id": "EOC_TELEKIN_LEARNING_EXPLOSION", - "recurrence": [ "96 hours", "168 hours" ], + "recurrence": [ + { "math": [ "jmath_telekinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_low)" ] }, + { "math": [ "jmath_telekinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "TELEKINETIC" }, @@ -371,7 +398,10 @@ { "type": "effect_on_condition", "id": "EOC_TELEKIN_LEARNING_LEVITATION", - "recurrence": [ "96 hours", "168 hours" ], + "recurrence": [ + { "math": [ "jmath_telekinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_low)" ] }, + { "math": [ "jmath_telekinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "TELEKINETIC" }, @@ -412,7 +442,10 @@ { "type": "effect_on_condition", "id": "EOC_TELEKIN_LEARNING_MEGAKINESIS", - "recurrence": [ "96 hours", "168 hours" ], + "recurrence": [ + { "math": [ "jmath_telekinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_low)" ] }, + { "math": [ "jmath_telekinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "TELEKINETIC" }, @@ -461,7 +494,10 @@ { "type": "effect_on_condition", "id": "EOC_TELEKIN_LEARNING_AEGIS", - "recurrence": [ "96 hours", "168 hours" ], + "recurrence": [ + { "math": [ "jmath_telekinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_low)" ] }, + { "math": [ "jmath_telekinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "TELEKINETIC" }, @@ -508,7 +544,10 @@ { "type": "effect_on_condition", "id": "EOC_TELEKIN_LEARNING_EARTHSHAKER", - "recurrence": [ "96 hours", "168 hours" ], + "recurrence": [ + { "math": [ "jmath_telekinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_low)" ] }, + { "math": [ "jmath_telekinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "TELEKINETIC" }, diff --git a/data/mods/MindOverMatter/powers/learning_eocs/telepathy.json b/data/mods/MindOverMatter/powers/learning_eocs/telepathy.json index e936d0a254b4c..eb87f98b2c9a8 100644 --- a/data/mods/MindOverMatter/powers/learning_eocs/telepathy.json +++ b/data/mods/MindOverMatter/powers/learning_eocs/telepathy.json @@ -2,7 +2,10 @@ { "type": "effect_on_condition", "id": "EOC_TELEPATH_LEARNING_SHIELD", - "recurrence": [ "12 hours", "24 hours" ], + "recurrence": [ + { "math": [ "jmath_telepathy_learning_eocs_modifiers(global_tier_one_power_learning_time_low)" ] }, + { "math": [ "jmath_telepathy_learning_eocs_modifiers(global_tier_one_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "TELEPATH" }, @@ -31,7 +34,10 @@ { "type": "effect_on_condition", "id": "EOC_TELEPATH_LEARNING_MORALE", - "recurrence": [ "12 hours", "24 hours" ], + "recurrence": [ + { "math": [ "jmath_telepathy_learning_eocs_modifiers(global_tier_one_power_learning_time_low)" ] }, + { "math": [ "jmath_telepathy_learning_eocs_modifiers(global_tier_one_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "TELEPATH" }, @@ -65,7 +71,10 @@ { "type": "effect_on_condition", "id": "EOC_TELEPATH_LEARNING_BLAST", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_telepathy_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_telepathy_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "TELEPATH" }, @@ -99,7 +108,10 @@ { "type": "effect_on_condition", "id": "EOC_TELEPATH_LEARNING_BEASTMASTER", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_telepathy_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_telepathy_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "TELEPATH" }, @@ -130,7 +142,10 @@ { "type": "effect_on_condition", "id": "EOC_TELEPATH_LEARNING_CONFUSION", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_telepathy_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_telepathy_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "TELEPATH" }, @@ -171,7 +186,10 @@ { "type": "effect_on_condition", "id": "EOC_TELEPATH_LEARNING_FEAR", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_telepathy_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_telepathy_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "TELEPATH" }, @@ -205,7 +223,10 @@ { "type": "effect_on_condition", "id": "EOC_TELEPATH_LEARNING_INVISIBILITY", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_telepathy_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_telepathy_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "TELEPATH" }, @@ -247,7 +268,10 @@ { "type": "effect_on_condition", "id": "EOC_TELEPATH_LEARNING_AOE_BLAST", - "recurrence": [ "96 hours", "168 hours" ], + "recurrence": [ + { "math": [ "jmath_telepathy_learning_eocs_modifiers(global_tier_three_power_learning_time_low)" ] }, + { "math": [ "jmath_telepathy_learning_eocs_modifiers(global_tier_three_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "TELEPATH" }, @@ -288,7 +312,10 @@ { "type": "effect_on_condition", "id": "EOC_TELEPATH_LEARNING_BEAST_TAMING", - "recurrence": [ "96 hours", "168 hours" ], + "recurrence": [ + { "math": [ "jmath_telepathy_learning_eocs_modifiers(global_tier_three_power_learning_time_low)" ] }, + { "math": [ "jmath_telepathy_learning_eocs_modifiers(global_tier_three_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "TELEPATH" }, @@ -319,7 +346,10 @@ { "type": "effect_on_condition", "id": "EOC_TELEPATH_LEARNING_MIND_CONTROL", - "recurrence": [ "96 hours", "168 hours" ], + "recurrence": [ + { "math": [ "jmath_telepathy_learning_eocs_modifiers(global_tier_three_power_learning_time_low)" ] }, + { "math": [ "jmath_telepathy_learning_eocs_modifiers(global_tier_three_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "TELEPATH" }, @@ -366,7 +396,10 @@ { "type": "effect_on_condition", "id": "EOC_TELEPATH_LEARNING_NETWORK", - "recurrence": [ "96 hours", "168 hours" ], + "recurrence": [ + { "math": [ "jmath_telepathy_learning_eocs_modifiers(global_tier_three_power_learning_time_low)" ] }, + { "math": [ "jmath_telepathy_learning_eocs_modifiers(global_tier_three_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "TELEPATH" }, diff --git a/data/mods/MindOverMatter/powers/learning_eocs/teleportation.json b/data/mods/MindOverMatter/powers/learning_eocs/teleportation.json index 32c718ff3d7e5..509967540734b 100644 --- a/data/mods/MindOverMatter/powers/learning_eocs/teleportation.json +++ b/data/mods/MindOverMatter/powers/learning_eocs/teleportation.json @@ -2,7 +2,10 @@ { "type": "effect_on_condition", "id": "EOC_TELEPORT_LEARNING_PHASE", - "recurrence": [ "12 hours", "24 hours" ], + "recurrence": [ + { "math": [ "jmath_teleportation_learning_eocs_modifiers(global_tier_one_power_learning_time_low)" ] }, + { "math": [ "jmath_teleportation_learning_eocs_modifiers(global_tier_one_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "TELEPORTER" }, @@ -28,7 +31,10 @@ { "type": "effect_on_condition", "id": "EOC_TELEPORT_LEARNING_STRIDE", - "recurrence": [ "12 hours", "24 hours" ], + "recurrence": [ + { "math": [ "jmath_teleportation_learning_eocs_modifiers(global_tier_one_power_learning_time_low)" ] }, + { "math": [ "jmath_teleportation_learning_eocs_modifiers(global_tier_one_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "TELEPORTER" }, @@ -62,7 +68,10 @@ { "type": "effect_on_condition", "id": "EOC_TELEPORT_LEARNING_TRANSPOSE", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_teleportation_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_teleportation_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "TELEPORTER" }, @@ -98,7 +107,10 @@ { "type": "effect_on_condition", "id": "EOC_TELEPORT_LEARNING_DISPLACEMENT", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_teleportation_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_teleportation_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "TELEPORTER" }, @@ -134,7 +146,10 @@ { "type": "effect_on_condition", "id": "EOC_TELEPORT_LEARNING_COLLAPSE", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_teleportation_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_teleportation_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "TELEPORTER" }, @@ -175,7 +190,10 @@ { "type": "effect_on_condition", "id": "EOC_TELEPORT_LEARNING_FARSTEP", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_teleportation_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_teleportation_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "TELEPORTER" }, @@ -214,7 +232,10 @@ { "type": "effect_on_condition", "id": "EOC_TELEPORT_LEARNING_BANISH", - "recurrence": [ "96 hours", "168 hours" ], + "recurrence": [ + { "math": [ "jmath_teleportation_learning_eocs_modifiers(global_tier_three_power_learning_time_low)" ] }, + { "math": [ "jmath_teleportation_learning_eocs_modifiers(global_tier_three_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "TELEPORTER" }, @@ -254,7 +275,10 @@ { "type": "effect_on_condition", "id": "EOC_TELEPORT_LEARNING_GATEWAY", - "recurrence": [ "96 hours", "168 hours" ], + "recurrence": [ + { "math": [ "jmath_teleportation_learning_eocs_modifiers(global_tier_three_power_learning_time_low)" ] }, + { "math": [ "jmath_teleportation_learning_eocs_modifiers(global_tier_three_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "TELEPORTER" }, @@ -288,7 +312,10 @@ { "type": "effect_on_condition", "id": "EOC_TELEPORT_LEARNING_BREACH", - "recurrence": [ "96 hours", "168 hours" ], + "recurrence": [ + { "math": [ "jmath_teleportation_learning_eocs_modifiers(global_tier_three_power_learning_time_low)" ] }, + { "math": [ "jmath_teleportation_learning_eocs_modifiers(global_tier_three_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "TELEPORTER" }, diff --git a/data/mods/MindOverMatter/powers/learning_eocs/vitakinesis.json b/data/mods/MindOverMatter/powers/learning_eocs/vitakinesis.json index dd3a3954df90b..35883868f11a7 100644 --- a/data/mods/MindOverMatter/powers/learning_eocs/vitakinesis.json +++ b/data/mods/MindOverMatter/powers/learning_eocs/vitakinesis.json @@ -2,7 +2,10 @@ { "type": "effect_on_condition", "id": "EOC_VITAKIN_LEARNING_STOP_BLEEDING", - "recurrence": [ "12 hours", "24 hours" ], + "recurrence": [ + { "math": [ "jmath_vitakinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_low)" ] }, + { "math": [ "jmath_vitakinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "VITAKINETIC" }, @@ -30,7 +33,10 @@ { "type": "effect_on_condition", "id": "EOC_VITAKIN_LEARNING_HEALING_TOUCH", - "recurrence": [ "12 hours", "24 hours" ], + "recurrence": [ + { "math": [ "jmath_vitakinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_low)" ] }, + { "math": [ "jmath_vitakinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "VITAKINETIC" }, @@ -58,7 +64,10 @@ { "type": "effect_on_condition", "id": "EOC_VITAKIN_LEARNING_HURT_TOUCH", - "recurrence": [ "12 hours", "24 hours" ], + "recurrence": [ + { "math": [ "jmath_vitakinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_low)" ] }, + { "math": [ "jmath_vitakinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "VITAKINETIC" }, @@ -92,7 +101,10 @@ { "type": "effect_on_condition", "id": "EOC_VITAKIN_LEARNING_REMOVE_POISON", - "recurrence": [ "12 hours", "24 hours" ], + "recurrence": [ + { "math": [ "jmath_vitakinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_low)" ] }, + { "math": [ "jmath_vitakinesis_learning_eocs_modifiers(global_tier_one_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "VITAKINETIC" }, @@ -133,7 +145,10 @@ { "type": "effect_on_condition", "id": "EOC_VITAKIN_LEARNING_CURE_DISEASE", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_vitakinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_vitakinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "VITAKINETIC" }, @@ -161,7 +176,10 @@ { "type": "effect_on_condition", "id": "EOC_VITAKIN_LEARNING_SLEEPING_TRANCE", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_vitakinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_vitakinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "VITAKINETIC" }, @@ -197,7 +215,10 @@ { "type": "effect_on_condition", "id": "EOC_VITAKIN_LEARNING_PAIN_SPLIT", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_vitakinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_vitakinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "VITAKINETIC" }, @@ -241,7 +262,10 @@ { "type": "effect_on_condition", "id": "EOC_VITAKIN_LEARNING_STOP_INFECTION", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_vitakinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_vitakinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "VITAKINETIC" }, @@ -269,7 +293,10 @@ { "type": "effect_on_condition", "id": "EOC_VITAKIN_LEARNING_HEALING_TRANCE", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_vitakinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_vitakinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "VITAKINETIC" }, @@ -305,7 +332,10 @@ { "type": "effect_on_condition", "id": "EOC_VITAKIN_LEARNING_ATTACK_TOUCH", - "recurrence": [ "36 hours", "72 hours" ], + "recurrence": [ + { "math": [ "jmath_vitakinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_low)" ] }, + { "math": [ "jmath_vitakinesis_learning_eocs_modifiers(global_tier_two_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "VITAKINETIC" }, @@ -333,7 +363,10 @@ { "type": "effect_on_condition", "id": "EOC_VITAKIN_LEARNING_BLOOD_PURGE", - "recurrence": [ "96 hours", "168 hours" ], + "recurrence": [ + { "math": [ "jmath_vitakinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_low)" ] }, + { "math": [ "jmath_vitakinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "VITAKINETIC" }, @@ -374,7 +407,10 @@ { "type": "effect_on_condition", "id": "EOC_VITAKIN_LEARNING_BANISH_ILLNESS", - "recurrence": [ "96 hours", "168 hours" ], + "recurrence": [ + { "math": [ "jmath_vitakinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_low)" ] }, + { "math": [ "jmath_vitakinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "VITAKINETIC" }, @@ -415,7 +451,10 @@ { "type": "effect_on_condition", "id": "EOC_VITAKIN_LEARNING_SUPER_HEAL", - "recurrence": [ "96 hours", "168 hours" ], + "recurrence": [ + { "math": [ "jmath_vitakinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_low)" ] }, + { "math": [ "jmath_vitakinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "VITAKINETIC" }, @@ -460,7 +499,10 @@ { "type": "effect_on_condition", "id": "EOC_VITAKIN_LEARNING_RETURN_FROM_DEATH", - "recurrence": [ "96 hours", "168 hours" ], + "recurrence": [ + { "math": [ "jmath_vitakinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_low)" ] }, + { "math": [ "jmath_vitakinesis_learning_eocs_modifiers(global_tier_three_power_learning_time_high)" ] } + ], "condition": { "and": [ { "u_has_trait": "VITAKINETIC" }, diff --git a/data/mods/MindOverMatter/recipes/proficiencies.json b/data/mods/MindOverMatter/recipes/proficiencies.json index a66d1311760b7..9158bae231732 100644 --- a/data/mods/MindOverMatter/recipes/proficiencies.json +++ b/data/mods/MindOverMatter/recipes/proficiencies.json @@ -55,8 +55,7 @@ "can_learn": true, "default_time_multiplier": 1.0, "default_skill_penalty": 0.2, - "time_to_learn": "200 h", - "//": "Length is deliberate" + "time_to_learn": "32 h" }, { "type": "proficiency", @@ -67,8 +66,7 @@ "can_learn": true, "default_time_multiplier": 1.0, "default_skill_penalty": 0.2, - "time_to_learn": "200 h", - "//": "Length is deliberate" + "time_to_learn": "32 h" }, { "type": "proficiency", @@ -79,8 +77,7 @@ "can_learn": true, "default_time_multiplier": 1.0, "default_skill_penalty": 0.2, - "time_to_learn": "200 h", - "//": "Length is deliberate" + "time_to_learn": "32 h" }, { "type": "proficiency", @@ -91,8 +88,7 @@ "can_learn": true, "default_time_multiplier": 1.0, "default_skill_penalty": 0.2, - "time_to_learn": "200 h", - "//": "Length is deliberate" + "time_to_learn": "32 h" }, { "type": "proficiency", @@ -103,8 +99,7 @@ "can_learn": true, "default_time_multiplier": 1.0, "default_skill_penalty": 0.2, - "time_to_learn": "200 h", - "//": "Length is deliberate" + "time_to_learn": "32 h" }, { "type": "proficiency", @@ -115,8 +110,7 @@ "can_learn": true, "default_time_multiplier": 1.0, "default_skill_penalty": 0.2, - "time_to_learn": "200 h", - "//": "Length is deliberate" + "time_to_learn": "32 h" }, { "type": "proficiency", @@ -127,8 +121,7 @@ "can_learn": true, "default_time_multiplier": 1.0, "default_skill_penalty": 0.2, - "time_to_learn": "200 h", - "//": "Length is deliberate" + "time_to_learn": "32 h" }, { "type": "proficiency", @@ -139,8 +132,7 @@ "can_learn": true, "default_time_multiplier": 1.0, "default_skill_penalty": 0.2, - "time_to_learn": "200 h", - "//": "Length is deliberate" + "time_to_learn": "32 h" }, { "type": "proficiency", @@ -151,8 +143,7 @@ "can_learn": true, "default_time_multiplier": 1.0, "default_skill_penalty": 0.2, - "time_to_learn": "200 h", - "//": "Length is deliberate" + "time_to_learn": "32 h" }, { "type": "proficiency_category", From f8592223ed1f2f4a7a30da75d6e6226944ebdb12 Mon Sep 17 00:00:00 2001 From: Eric <52087122+Ramza13@users.noreply.github.com> Date: Mon, 6 May 2024 23:31:37 -0400 Subject: [PATCH 064/104] Allow Emitters to use vars (#73028) * Emitter uses vars * Fix is_valid * Update JSON_INFO.md * Update map_field.cpp --- doc/JSON_INFO.md | 8 ++++---- src/emit.cpp | 47 +++++++++++++++-------------------------------- src/emit.h | 28 +++++++++++++--------------- src/map_field.cpp | 10 ++++++---- 4 files changed, 38 insertions(+), 55 deletions(-) diff --git a/doc/JSON_INFO.md b/doc/JSON_INFO.md index b73373d020a68..1b8ac5f48ea10 100644 --- a/doc/JSON_INFO.md +++ b/doc/JSON_INFO.md @@ -1517,10 +1517,10 @@ Emitters randomly place [fields](#field-types) around their positions - every tu | Identifier | Description |--- |--- | `id` | Unique ID -| `field` | Field type emitted -| `intensity` | Initial intensity of the spawned fields (spawning multiple fields will still cause their intensity to increase). Default 1. -| `chance` | **Percent** chance of the emitter emitting, values above 100 will increase the quantity of fields placed via `roll_remainder` (ex: `chance: 150` will place one field 50% of the time and two fields the other 50% ). Failing the roll will disable the whole emission for the tick, not rolled for every `qty`! Default 100. -| `qty` | Number of fields placed. Fields are placed using the field propagation rules, allowing fields to spread. Default 1. +| `field` | Field type emitted. This can be a Variable Object, see the [doc](EFFECT_ON_CONDITION.md) for more info. +| `intensity` | Initial intensity of the spawned fields (spawning multiple fields will still cause their intensity to increase). Default 1. This can be a Variable Object, see the [doc](EFFECT_ON_CONDITION.md) for more info. +| `chance` | **Percent** chance of the emitter emitting, values above 100 will increase the quantity of fields placed via `roll_remainder` (ex: `chance: 150` will place one field 50% of the time and two fields the other 50% ). Failing the roll will disable the whole emission for the tick, not rolled for every `qty`! Default 100. This can be a Variable Object, see the [doc](EFFECT_ON_CONDITION.md) for more info. +| `qty` | Number of fields placed. Fields are placed using the field propagation rules, allowing fields to spread. Default 1. This can be a Variable Object, see the [doc](EFFECT_ON_CONDITION.md) for more info. ```JSON { diff --git a/src/emit.cpp b/src/emit.cpp index de611503beff6..3a3ad826183ea 100644 --- a/src/emit.cpp +++ b/src/emit.cpp @@ -5,33 +5,33 @@ #include #include "debug.h" + +#include "condition.h" #include "flexbuffer_json-inl.h" #include "flexbuffer_json.h" +#include "json.h" static std::map emits_all; /** @relates string_id */ template<> -bool string_id::is_valid() const +const emit &string_id::obj() const { const auto found = emits_all.find( *this ); if( found == emits_all.end() ) { - return false; + debugmsg( "Tried to get invalid emission data: %s", c_str() ); + static const emit null_emit{}; + return null_emit; } - return !found->second.field().id().is_null(); + return found->second; } /** @relates string_id */ template<> -const emit &string_id::obj() const +bool string_id::is_valid() const { const auto found = emits_all.find( *this ); - if( found == emits_all.end() ) { - debugmsg( "Tried to get invalid emission data: %s", c_str() ); - static const emit null_emit{}; - return null_emit; - } - return found->second; + return found != emits_all.end(); } emit::emit() : id_( emit_id::NULL_ID() ) {} @@ -46,11 +46,10 @@ void emit::load_emit( const JsonObject &jo ) emit et; et.id_ = emit_id( jo.get_string( "id" ) ); - et.field_name = jo.get_string( "field" ); - - jo.read( "intensity", et.intensity_ ); - jo.read( "qty", et.qty_ ); - jo.read( "chance", et.chance_ ); + et.field_ = get_str_or_var( jo.get_member( "field" ), "field" ); + et.intensity_ = get_dbl_or_var( jo, "intensity", false, 1.0 ); + et.qty_ = get_dbl_or_var( jo, "qty", false, 1.0 ); + et.chance_ = get_dbl_or_var( jo, "chance", false, 100.0 ); emits_all[ et.id_ ] = et; } @@ -62,24 +61,8 @@ const std::map &emit::all() void emit::finalize() { - for( auto &e : emits_all ) { - e.second.field_ = field_type_id( e.second.field_name ); - const int max_intensity = e.second.field_.obj().get_max_intensity(); - if( e.second.intensity_ > max_intensity || e.second.intensity_ < 1 ) { - debugmsg( "emission intensity of %s out of range (%d of max %d)", e.second.id_.c_str(), - e.second.intensity_, max_intensity ); - e.second.intensity_ = max_intensity; - } - if( e.second.qty_ <= 0 ) { - debugmsg( "emission qty of %s out of range", e.second.id_.c_str() ); - } - if( e.second.chance_ > 100 || e.second.chance_ <= 0 ) { - debugmsg( "emission chance of %s out of range (%d of min 1 max 100)", e.second.id_.c_str(), - e.second.chance_ ); - e.second.chance_ = std::max( std::min( e.second.chance_, 100 ), 1 ); - } - } } + void emit::check_consistency() { } diff --git a/src/emit.h b/src/emit.h index 2538ca39793b2..8d5510bca3222 100644 --- a/src/emit.h +++ b/src/emit.h @@ -7,6 +7,7 @@ #include "field_type.h" #include "type_id.h" +#include class JsonObject; @@ -26,23 +27,23 @@ class emit bool is_valid() const; /** Type of field to emit @see emit::is_valid */ - field_type_id field() const { - return field_; + field_type_id field( dialogue &d ) const { + return field_type_id( field_.evaluate( d ) ); } /** Intensity of output fields, range [1..maximum_intensity] */ - int intensity() const { - return intensity_; + int intensity( dialogue &d ) const { + return intensity_.evaluate( d ); } /** Units of field to generate per turn subject to @ref chance */ - int qty() const { - return qty_; + int qty( dialogue &d ) const { + return qty_.evaluate( d ); } /** Chance to emit each turn, range [1..100] */ - int chance() const { - return chance_; + int chance( dialogue &d ) const { + return chance_.evaluate( d ); } /** Load emission data from JSON definition */ @@ -62,13 +63,10 @@ class emit private: emit_id id_; - field_type_id field_ = fd_null.id_or( INVALID_FIELD_TYPE_ID ); - int intensity_ = 1; - int qty_ = 1; - int chance_ = 100; - - /** used during JSON loading only */ - std::string field_name; + str_or_var field_; + dbl_or_var intensity_; + dbl_or_var qty_; + dbl_or_var chance_; }; #endif // CATA_SRC_EMIT_H diff --git a/src/map_field.cpp b/src/map_field.cpp index 5502a55b2ca5a..05620c1cf8748 100644 --- a/src/map_field.cpp +++ b/src/map_field.cpp @@ -17,6 +17,7 @@ #include #include +#include "avatar.h" #include "bodypart.h" #include "calendar.h" #include "cata_utility.h" @@ -2104,10 +2105,11 @@ void map::emit_field( const tripoint &pos, const emit_id &src, float mul ) return; } - const float chance = src->chance() * mul; - if( src.is_valid() && x_in_y( chance, 100 ) ) { - const int qty = chance > 100.0f ? roll_remainder( src->qty() * chance / 100.0f ) : src->qty(); - propagate_field( pos, src->field(), qty, src->intensity() ); + dialogue d( get_talker_for( get_avatar() ), nullptr ); + const float chance = src->chance( d ) * mul; + if( x_in_y( chance, 100 ) ) { + const int qty = chance > 100.0f ? roll_remainder( src->qty( d ) * chance / 100.0f ) : src->qty( d ); + propagate_field( pos, src->field( d ), qty, src->intensity( d ) ); } } From 4b320a70463ee19213fb0d7e4a5dab5566810017 Mon Sep 17 00:00:00 2001 From: TheSaddestGoomba <44676850+TheSaddestGoomba@users.noreply.github.com> Date: Mon, 6 May 2024 23:37:21 -0400 Subject: [PATCH 065/104] Amphibian Additions Pt 5 - Dried Frogs (#72413) * Add new monsters Adds: -Leaping Husk -Batrachian Mummy -Batrachian Smoker * Edits to existing frogs -Add POISON flag to abstract and remove from individual instances of "extend" -Add "burn_into" entries to existing frogs -Lower 'croaked climber' damage dice count * Update monster groups -Add GROUP_BLOAT_TOAD_UPGRADE for bloated toads upgrading -Add the three new monsters to the appropriate upgrade groups * Add death effect and syntax fixes * Add REVIVES_HEALTHY flag Added flag for consistency with existing burned zombies * Add unique leap follow-up -created two spells, one for the smaller leaping husk, and one for the two larger monsters. These inflict damage on the creature and create a cloud of smoke around it. -The spell special attack that calls the above is conditional on an effect that is applied by the leap special attack. * Linting * Double space descriptions and assign plural to 'batrachian mummy' * Address inconsistent crumbling -Increases durations of 'fragile_frog' to ensure the effect is still active even when the monster is slowed. -Adds 'fragile_no_more' spell to manually remove the effect rather than rely on duration expiry -All-in-all greatly reduced the number of leaps without crumbling * Linting, remove a single stray space --- data/json/effects.json | 8 + .../monster_deaths.json | 12 ++ data/json/monster_special_attacks/spells.json | 58 +++++++ data/json/monstergroups/zombies.json | 19 ++- data/json/monsters/reptile_amphibian.json | 3 + data/json/monsters/zed-animal.json | 3 +- data/json/monsters/zed_misc.json | 154 ++++++++++++++++-- 7 files changed, 243 insertions(+), 14 deletions(-) diff --git a/data/json/effects.json b/data/json/effects.json index 67659e5cb8066..04713177cbb64 100644 --- a/data/json/effects.json +++ b/data/json/effects.json @@ -4924,5 +4924,13 @@ "//": "yes it's actually called that. It is also the strongest anti-clotting factor known to science. It inhibits the synthesis of thrombin, so most earth animals/mutants should be affected, except maybe bugs.", "immune_flags": [ "DRACULIN_IMMUNE" ], "effect_dur_scaling": [ { "effect_id": "bleed", "modifier": 2.0, "same_bp": false } ] + }, + { + "type": "effect_type", + "id": "fragile_frog", + "name": [ "Fragile Frog" ], + "desc": [ "Applied by leap special attack of burned frog zombies, conditional for related spell." ], + "max_duration": "5 m", + "show_in_info": true } ] diff --git a/data/json/monster_special_attacks/monster_deaths.json b/data/json/monster_special_attacks/monster_deaths.json index 84be0464a7635..4bc418c78c2a3 100644 --- a/data/json/monster_special_attacks/monster_deaths.json +++ b/data/json/monster_special_attacks/monster_deaths.json @@ -286,6 +286,18 @@ "effect_str": "emit_smoke_blast", "extra_effects": [ { "id": "death_explosion", "hit_self": true } ] }, + { + "id": "death_smokeburst_tiny", + "type": "SPELL", + "name": { "str": "Tiny Smoke Explosion" }, + "description": "Causes a tiny explosion of smoke.", + "flags": [ "NO_EXPLOSION_SFX" ], + "valid_targets": [ "self" ], + "shape": "blast", + "effect": "emit", + "effect_str": "emit_smoke_plume", + "extra_effects": [ { "id": "death_explosion", "hit_self": true } ] + }, { "id": "death_tearburst", "type": "SPELL", diff --git a/data/json/monster_special_attacks/spells.json b/data/json/monster_special_attacks/spells.json index cf1b35cb01caa..821a68ae07a4c 100644 --- a/data/json/monster_special_attacks/spells.json +++ b/data/json/monster_special_attacks/spells.json @@ -117,6 +117,64 @@ "shape": "blast", "effect": "attack" }, + { + "type": "SPELL", + "id": "fragile_frog_leap", + "name": { "str": "Fragile Frog Leap" }, + "description": "Cast after a burned frog monster leaps; causes self harm and creates a smoke cloud.", + "flags": [ "LOUD", "RANDOM_DAMAGE", "NO_PROJECTILE", "NO_EXPLOSION_SFX" ], + "base_casting_time": 0, + "message": "", + "min_damage": 10, + "max_damage": 15, + "damage_type": "cut", + "valid_targets": [ "self", "hostile", "ground" ], + "shape": "blast", + "field_id": "fd_smoke", + "field_chance": 2, + "min_field_intensity": 1, + "max_field_intensity": 3, + "min_aoe": 2, + "max_aoe": 3, + "effect": "attack", + "min_range": 1, + "max_range": 1, + "extra_effects": [ { "id": "fragile_no_more", "hit_self": true } ] + }, + { + "type": "SPELL", + "id": "dusty_frog_leap", + "name": { "str": "Dusty Frog Leap" }, + "description": "Cast after a burned frog monster leaps; causes self harm and creates a smoke plume.", + "flags": [ "LOUD", "RANDOM_DAMAGE", "NO_PROJECTILE", "NO_EXPLOSION_SFX" ], + "base_casting_time": 0, + "message": "", + "min_damage": 5, + "max_damage": 10, + "damage_type": "cut", + "valid_targets": [ "self", "hostile", "ground" ], + "shape": "blast", + "field_id": "fd_smoke", + "field_chance": 2, + "min_field_intensity": 1, + "max_field_intensity": 1, + "min_aoe": 1, + "max_aoe": 2, + "effect": "attack", + "min_range": 1, + "max_range": 1, + "extra_effects": [ { "id": "fragile_no_more", "hit_self": true } ] + }, + { + "id": "fragile_no_more", + "type": "SPELL", + "name": "Fragile No More", + "description": "removes conditional effect for burned frogs crumble after leaping.", + "valid_targets": [ "self" ], + "effect": "remove_effect", + "effect_str": "fragile_frog", + "shape": "blast" + }, { "type": "SPELL", "id": "small_raptor_spawn", diff --git a/data/json/monstergroups/zombies.json b/data/json/monstergroups/zombies.json index a4ecb2e08d8e7..327dec471202f 100644 --- a/data/json/monstergroups/zombies.json +++ b/data/json/monstergroups/zombies.json @@ -566,18 +566,30 @@ "name": "GROUP_ZOMBULL_FROG_UPGRADE", "monsters": [ { "monster": "mon_zombullfrog", "weight": 100, "cost_multiplier": 3 }, + { "monster": "mon_frog_mummy", "weight": 25, "cost_multiplier": 3 }, { "monster": "mon_frog_dad", "weight": 75, "cost_multiplier": 3 }, - { "monster": "mon_frog_mother", "weight": 25, "cost_multiplier": 1 } + { "monster": "mon_frog_mother", "weight": 25, "cost_multiplier": 1 }, + { "monster": "mon_frog_smoker_hulk", "weight": 15, "cost_multiplier": 3 } ] }, { "type": "monstergroup", "name": "GROUP_DEADTOAD_UPGRADE", + "monsters": [ + { "monster": "mon_toad_zombie", "weight": 25, "cost_multiplier": 1 }, + { "monster": "mon_toad_bloat", "weight": 50, "cost_multiplier": 1 }, + { "monster": "mon_frog_mummy", "weight": 25, "cost_multiplier": 3 } + ] + }, + { + "type": "monstergroup", + "name": "GROUP_BLOAT_TOAD_UPGRADE", "monsters": [ { "monster": "mon_toad_bloat", "weight": 25, "cost_multiplier": 1 }, { "monster": "mon_toad_wart", "weight": 25, "cost_multiplier": 1 }, { "monster": "mon_toad_bone", "weight": 25, "cost_multiplier": 1 }, - { "monster": "mon_gastro_bufo", "weight": 25, "cost_multiplier": 1 } + { "monster": "mon_gastro_bufo", "weight": 25, "cost_multiplier": 1 }, + { "monster": "mon_frog_smoker_hulk", "weight": 15, "cost_multiplier": 3 } ] }, { @@ -585,7 +597,8 @@ "name": "GROUP_ZOMBTREEFROG_UPGRADE", "monsters": [ { "monster": "mon_zombtreefrog", "weight": 75, "cost_multiplier": 3 }, - { "monster": "mon_frog_shadow", "weight": 25, "cost_multiplier": 3 } + { "monster": "mon_frog_shadow", "weight": 25, "cost_multiplier": 3 }, + { "monster": "mon_frog_husk", "weight": 25, "cost_multiplier": 3 } ] }, { diff --git a/data/json/monsters/reptile_amphibian.json b/data/json/monsters/reptile_amphibian.json index 7acf714652617..30db25edcff48 100644 --- a/data/json/monsters/reptile_amphibian.json +++ b/data/json/monsters/reptile_amphibian.json @@ -712,6 +712,7 @@ ], "fear_triggers": [ "FRIEND_DIED", "FIRE", "SOUND" ], "anger_triggers": [ "STALK", "PLAYER_WEAK", "PLAYER_CLOSE", "MATING_SEASON" ], + "burn_into": "mon_frog_husk", "baby_flags": [ "SPRING", "SUMMER" ], "flags": [ "FISHABLE", "SEES", "SMELLS", "HEARS", "SWARMS", "SWIMS", "WATER_CAMOUFLAGE", "CLIMBS" ] }, @@ -916,6 +917,7 @@ ], "fear_triggers": [ "FIRE" ], "anger_triggers": [ "STALK", "PLAYER_WEAK", "PLAYER_CLOSE", "MATING_SEASON" ], + "burn_into": "mon_frog_mummy", "baby_flags": [ "SPRING", "SUMMER" ], "flags": [ "FISHABLE", "SEES", "SMELLS", "HEARS", "GRABS", "SWIMS", "WATER_CAMOUFLAGE", "CLIMBS", "BASHES" ] }, @@ -1087,6 +1089,7 @@ ], "fear_triggers": [ "FIRE" ], "anger_triggers": [ "STALK", "PLAYER_WEAK", "PLAYER_CLOSE", "MATING_SEASON" ], + "burn_into": "mon_frog_smoker_hulk", "baby_flags": [ "SPRING", "SUMMER" ], "flags": [ "SEES", "SMELLS", "GRABS", "HEARS", "SWIMS", "DESTROYS" ] }, diff --git a/data/json/monsters/zed-animal.json b/data/json/monsters/zed-animal.json index a0101a6551d86..2a84d7ea51760 100644 --- a/data/json/monsters/zed-animal.json +++ b/data/json/monsters/zed-animal.json @@ -834,7 +834,8 @@ ], "special_when_hit": [ "ACIDSPLASH", 100 ], "death_function": { "message": "The %s's body leaks acid.", "effect": { "id": "death_acid", "hit_self": true } }, - "extend": { "flags": [ "POISON", "ACIDPROOF", "ACID_BLOOD" ] }, + "burn_into": "mon_frog_smoker_hulk", + "extend": { "flags": [ "ACIDPROOF", "ACID_BLOOD" ] }, "delete": { "flags": [ "RANGED_ATTACKER" ] } } ] diff --git a/data/json/monsters/zed_misc.json b/data/json/monsters/zed_misc.json index ded5171b93138..2c95d37c1ff32 100644 --- a/data/json/monsters/zed_misc.json +++ b/data/json/monsters/zed_misc.json @@ -63,7 +63,8 @@ "NO_BREATHE", "REVIVES", "PUSH_MON", - "RANGED_ATTACKER" + "RANGED_ATTACKER", + "POISON" ] }, { @@ -110,7 +111,8 @@ } ], "regenerates": 40, - "armor": { "bash": 12, "cut": 2, "bullet": 1, "electric": 2 } + "armor": { "bash": 12, "cut": 2, "bullet": 1, "electric": 2 }, + "burn_into": "mon_frog_smoker_hulk" }, { "id": "mon_tadpole_grabber", @@ -156,6 +158,7 @@ "description": "The wound covered skin of this large bullfrog appears to be peeling in places, revealing a black goop beneath the surface. Its vacant stare passes by anything that isn't food, and it will leap to devour anything it can.", "copy-from": "mon_proxy_frog_zombie", "attack_cost": 50, + "burn_into": "mon_frog_mummy", "upgrades": { "half_life": 34, "into_group": "GROUP_ZOMBULL_FROG_UPGRADE" } }, { @@ -200,7 +203,8 @@ [ "SHRIEK_ALERT", 20 ], [ "SHRIEK_STUN", 5 ] ], - "armor": { "bash": 15, "cut": 7, "bullet": 5, "electric": 2 } + "armor": { "bash": 15, "cut": 7, "bullet": 5, "electric": 2 }, + "burn_into": "mon_frog_smoker_hulk" }, { "id": "mon_toad_zombie", @@ -210,8 +214,8 @@ "copy-from": "mon_proxy_frog_zombie", "color": "brown_green", "attack_cost": 50, - "upgrades": { "half_life": 30, "into": "mon_toad_bloat" }, - "extend": { "flags": [ "POISON" ] } + "burn_into": "mon_frog_mummy", + "upgrades": { "half_life": 30, "into_group": "GROUP_DEADTOAD_UPGRADE" } }, { "id": "mon_frog_shocker", @@ -237,6 +241,7 @@ "move_cost": 0, "max_range": 6, "min_consider_range": 2, + "allow_no_target": true, "condition": { "not": { "u_has_effect": "maimed_leg" } } }, { @@ -258,6 +263,7 @@ [ "PARROT", 8 ] ], "special_when_hit": [ "ZAPBACK", 100 ], + "burn_into": "mon_frog_mummy", "extend": { "flags": [ "ELECTRIC" ] } }, { @@ -302,8 +308,8 @@ "corpse_type": "NO_CORPSE" }, "death_drops": "explode_toad", - "upgrades": { "half_life": 30, "into_group": "GROUP_DEADTOAD_UPGRADE" }, - "extend": { "flags": [ "POISON", "SMALLSLUDGETRAIL", "SLUDGEPROOF" ] }, + "upgrades": { "half_life": 30, "into_group": "GROUP_BLOAT_TOAD_UPGRADE" }, + "extend": { "flags": [ "SMALLSLUDGETRAIL", "SLUDGEPROOF" ] }, "//": "Create new death_sludge effect." }, { @@ -319,7 +325,7 @@ "speed": 90, "symbol": "K", "color": "brown_green", - "melee_dice_sides": 5, + "melee_dice_sides": 4, "melee_damage": [ { "damage_type": "bash", "amount": 3 } ], "dodge": 4, "armor": { "bash": 4, "cut": 2, "bullet": 1 }, @@ -348,6 +354,7 @@ { "id": "grab_drag", "cooldown": 3 }, { "id": "drag_followup" } ], + "burn_into": "mon_frog_husk", "upgrades": { "half_life": 30, "into_group": "GROUP_ZOMBTREEFROG_UPGRADE" }, "extend": { "flags": [ "HARDTOSHOOT", "HIT_AND_RUN" ] }, "//": "Translation note - 'Croaked' is a euphimistic way of saying 'died' in American English, while 'croak' is an onomatopoeic word for the sound frogs make. A simple, literal translation of 'zombie treefrog' would also be fitting." @@ -396,6 +403,7 @@ { "id": "grab_drag", "cooldown": 3 }, { "id": "drag_followup" } ], + "burn_into": "mon_frog_husk", "extend": { "flags": [ "HARDTOSHOOT", "NIGHT_INVISIBILITY", "HIT_AND_RUN" ] } }, { @@ -442,7 +450,7 @@ "corpse_type": "NO_CORPSE" }, "death_drops": "explode_toad", - "extend": { "flags": [ "POISON", "SLUDGETRAIL", "SLUDGEPROOF" ] }, + "extend": { "flags": [ "SLUDGETRAIL", "SLUDGEPROOF" ] }, "//": "When possible, give a sludge-spray on hit effect." }, { @@ -494,7 +502,133 @@ { "id": "grab_drag", "cooldown": 3 }, { "id": "drag_followup" } ], - "extend": { "flags": [ "POISON" ] } + "burn_into": "mon_frog_smoker_hulk" + }, + { + "id": "mon_frog_husk", + "type": "MONSTER", + "name": { "str": "leaping husk" }, + "description": "The dehydrated remains of a frog, like the unfortunate sort you might find trapped between a window and screen. This one is much larger than those and surely capable of doing you real harm. You see its dry skin crack and shed wisps of tainted dust as it moves.", + "copy-from": "mon_proxy_frog_zombie", + "volume": "80 L", + "weight": "100 kg", + "hp": 45, + "speed": 80, + "symbol": "X", + "color": "brown_green", + "melee_dice_sides": 4, + "melee_damage": [ { "damage_type": "cut", "amount": 5 } ], + "dodge": 2, + "armor": { "bash": 4, "cut": 2, "bullet": 1, "electric": 2 }, + "attack_cost": 60, + "grab_strength": 15, + "special_attacks": [ + { + "type": "leap", + "cooldown": 8, + "move_cost": 0, + "max_range": 6, + "min_consider_range": 2, + "condition": { "not": { "u_has_effect": "maimed_leg" } }, + "self_effects": [ { "id": "fragile_frog", "duration": 30 } ] + }, + { + "id": "dusty_frog_leap", + "type": "spell", + "spell_data": { "id": "dusty_frog_leap" }, + "allow_no_target": true, + "condition": { "u_has_effect": "fragile_frog" }, + "monster_message": "The %s crumbles!" + }, + { "id": "scratch", "cooldown": 10 }, + { "id": "bite_grab", "cooldown": 10 }, + { "id": "drag_followup" } + ], + "death_function": { "effect": { "id": "death_smokeburst_tiny", "hit_self": true }, "message": "The %s crumbles!" }, + "upgrades": { "half_life": 30, "into_group": "GROUP_ZOMBTREEFROG_UPGRADE" }, + "extend": { "flags": [ "REVIVES_HEALTHY", "HARDTOSHOOT", "HIT_AND_RUN" ] }, + "delete": { "flags": [ "RANGED_ATTACKER" ] } + }, + { + "id": "mon_frog_mummy", + "type": "MONSTER", + "name": { "str": "batrachian mummy", "str_pl": "batrachian mummies" }, + "description": "The ambulatory, desiccated corpse of an enormous amphibian. What papery skin remains hugs tightly to the bones and shrunken flesh beneath. Each stuttering leap it makes leaves it looking worse off as it sheds clouds of ash and soot.", + "copy-from": "mon_proxy_frog_zombie", + "hp": 80, + "speed": 75, + "symbol": "H", + "color": "brown_green", + "melee_damage": [ { "damage_type": "bash", "amount": 5 } ], + "armor": { "bash": 4, "cut": 2, "bullet": 1, "electric": 2 }, + "attack_cost": 75, + "grab_strength": 25, + "special_attacks": [ + { "id": "grab_drag", "cooldown": 3 }, + { "id": "drag_followup" }, + { + "type": "leap", + "cooldown": 10, + "move_cost": 0, + "max_range": 4, + "min_consider_range": 2, + "condition": { "not": { "u_has_effect": "maimed_leg" } }, + "self_effects": [ { "id": "fragile_frog", "duration": 30 } ] + }, + { + "id": "fragile_frog_leap", + "type": "spell", + "spell_data": { "id": "fragile_frog_leap" }, + "allow_no_target": true, + "condition": { "u_has_effect": "fragile_frog" }, + "monster_message": "The %s crumbles!" + } + ], + "death_function": { "effect": { "id": "death_smokeburst", "hit_self": true } }, + "upgrades": { "half_life": 30, "into": "mon_meat_cocoon_med" }, + "delete": { "flags": [ "RANGED_ATTACKER" ] }, + "extend": { "flags": [ "REVIVES_HEALTHY" ] } + }, + { + "id": "mon_frog_smoker_hulk", + "type": "MONSTER", + "name": { "str": "batrachian smoker" }, + "description": "Even without the haze of smoke that constantly fumes off of it, it would be difficult to tell what this once was. The massive thing seems to have dried out and shriveled up, though unevenly. Rind through core it has warped. Its whole dry body crinkles and folds as it moves.", + "copy-from": "mon_proxy_frog_zombie", + "volume": "200 L", + "weight": "180 kg", + "hp": 200, + "symbol": "H", + "color": "brown_green", + "melee_dice": 5, + "melee_damage": [ { "damage_type": "bash", "amount": 5 } ], + "armor": { "bash": 4, "cut": 2, "bullet": 1, "electric": 2 }, + "emit_fields": [ { "emit_id": "emit_smoke_stream", "delay": "1 s" } ], + "special_attacks": [ + { "id": "grab_drag", "cooldown": 3 }, + { "id": "drag_followup" }, + { + "type": "leap", + "cooldown": 10, + "move_cost": 0, + "max_range": 4, + "min_consider_range": 2, + "condition": { "not": { "u_has_effect": "maimed_leg" } }, + "self_effects": [ { "id": "fragile_frog", "duration": 30 } ] + }, + { + "id": "fragile_frog_leap", + "type": "spell", + "spell_data": { "id": "fragile_frog_leap" }, + "allow_no_target": true, + "condition": { "u_has_effect": "fragile_frog" }, + "monster_message": "The %s crumbles!" + } + ], + "death_function": { "effect": { "id": "death_smokeburst", "hit_self": true } }, + "upgrades": { "half_life": 30, "into": "mon_meat_cocoon_large" }, + "delete": { "flags": [ "RANGED_ATTACKER" ] }, + "extend": { "flags": [ "REVIVES_HEALTHY" ] } }, { "id": "mon_zombie_biter", From 8774447c0cf37dbb5f7883360432d629e1b00c03 Mon Sep 17 00:00:00 2001 From: TheMurderUnicorn Date: Tue, 7 May 2024 00:36:17 -0400 Subject: [PATCH 066/104] Add Recipe for Portable Soldering Iron (#73347) * Add Recipe for Portable Soldering Iron * Remove Line to Make Test Happy --- data/json/recipes/tools/tools_electronic.json | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/data/json/recipes/tools/tools_electronic.json b/data/json/recipes/tools/tools_electronic.json index 2d02aba25f2e0..16a8ed2ce41ae 100644 --- a/data/json/recipes/tools/tools_electronic.json +++ b/data/json/recipes/tools/tools_electronic.json @@ -418,6 +418,23 @@ [ [ "cable", 5 ] ] ] }, + { + "type": "recipe", + "activity_level": "MODERATE_EXERCISE", + "result": "soldering_iron_portable", + "category": "CC_ELECTRONIC", + "subcategory": "CSC_ELECTRONIC_TOOLS", + "skill_used": "electronics", + "difficulty": 2, + "time": "12 m", + "decomp_learn": 0, + "autolearn": [ [ "electronics", 2 ] ], + "book_learn": [ [ "manual_electronics", 1 ], [ "advanced_electronics", 1 ], [ "textbook_anarch", 1 ] ], + "qualities": [ { "id": "SCREW", "level": 1 } ], + "proficiencies": [ { "proficiency": "prof_elec_soldering", "skill_penalty": 0.125 }, { "proficiency": "prof_elec_circuits" } ], + "using": [ [ "soldering_standard", 5 ] ], + "components": [ [ [ "soldering_iron", 1 ] ], [ [ "e_scrap", 1 ] ], [ [ "scrap", 1 ] ], [ [ "cable", 5 ] ] ] + }, { "type": "recipe", "activity_level": "LIGHT_EXERCISE", From 7a1aa9cd06275f2f5f0cbc401543867df4ee01af Mon Sep 17 00:00:00 2001 From: PatrikLundell Date: Tue, 7 May 2024 06:37:40 +0200 Subject: [PATCH 067/104] Introduce camp z level construction (#73176) * Added Z level aware construction * Added Z level aware construction * Unused parameter bug * 'nother unused parameter (for later use) * 'demanded astyle * bug + style demands * doc, token change * Added missing z description line * Removed actual roof usage due to other issues * Update data/json/mapgen/basecamps/expansion/modular_livestock/version_2/modular_livestock_construction.json Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Restore disappearing constant * Sort out merge mess * satisfy insistent style demand --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .../modular_livestock_construction.json | 38 + .../version_2/modular_livestock_palettes.json | 56 +- doc/MAPGEN.md | 53 +- src/clzones.cpp | 10 +- src/debug_menu.cpp | 2 +- src/map.cpp | 34 +- src/map.h | 33 +- src/map_extras.cpp | 73 +- src/mapgen.cpp | 980 ++++++++++-------- src/mapgen.h | 50 +- src/mapgen_functions.cpp | 40 +- src/mapgen_functions.h | 6 +- src/mapgenformat.cpp | 2 +- src/start_location.cpp | 1 + tests/mapgen_helpers.cpp | 2 +- 15 files changed, 794 insertions(+), 586 deletions(-) diff --git a/data/json/mapgen/basecamps/expansion/modular_livestock/version_2/modular_livestock_construction.json b/data/json/mapgen/basecamps/expansion/modular_livestock/version_2/modular_livestock_construction.json index 5776bb1d7d585..de49087be57f4 100644 --- a/data/json/mapgen/basecamps/expansion/modular_livestock/version_2/modular_livestock_construction.json +++ b/data/json/mapgen/basecamps/expansion/modular_livestock/version_2/modular_livestock_construction.json @@ -37,6 +37,44 @@ "palettes": [ { "param": "fbml_2_construction_palette" } ] } }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "fbml_2_coop_roof_construction", + "object": { + "parameters": { + "fbml_2_construction_palette": { + "type": "palette_id", + "scope": "omt", + "default": { + "distribution": [ + "fbml_2_concrete_palette", + "fbml_2_log_palette", + "fbml_2_metal_palette", + "fbml_2_migo_resin_palette", + "fbml_2_rammed_earth_palette", + "fbml_2_rock_palette", + "fbml_2_wad_palette", + "fbml_2_wood_palette" + ] + } + } + }, + "mapgensize": [ 8, 8 ], + "rows": [ + "rrrrrrr ", + "rrrrrrr ", + "rrrrrrr ", + "rrrrrrr ", + "rrrrrrr ", + "rrrrrrr ", + "rrrrrrr ", + "r r " + ], + "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ], + "palettes": [ { "param": "fbml_2_construction_palette" } ] + } + }, { "type": "mapgen", "update_mapgen_id": "fbml_2_coop_construction", diff --git a/data/json/mapgen/basecamps/expansion/modular_livestock/version_2/modular_livestock_palettes.json b/data/json/mapgen/basecamps/expansion/modular_livestock/version_2/modular_livestock_palettes.json index bc9df9c158fa9..3d97b1c5f6637 100644 --- a/data/json/mapgen/basecamps/expansion/modular_livestock/version_2/modular_livestock_palettes.json +++ b/data/json/mapgen/basecamps/expansion/modular_livestock/version_2/modular_livestock_palettes.json @@ -14,25 +14,53 @@ { "type": "palette", "id": "fbml_2_concrete_palette", - "terrain": { ",": "t_dirtfloor", ".": "t_thconc_floor", "+": "t_door_metal_c", "v": "t_window_no_curtains", "w": "t_sconc_wall" }, + "terrain": { + ",": "t_dirtfloor", + ".": "t_thconc_floor", + "+": "t_door_metal_c", + "r": "t_concrete_roof", + "v": "t_window_no_curtains", + "w": "t_sconc_wall" + }, "furniture": { } }, { "type": "palette", "id": "fbml_2_log_palette", - "terrain": { ",": "t_dirtfloor", ".": "t_floor", "+": "t_door_c", "v": "t_window_no_curtains", "w": "t_wall_log" }, + "terrain": { + ",": "t_dirtfloor", + ".": "t_floor", + "+": "t_door_c", + "r": "t_wood_treated_roof", + "v": "t_window_no_curtains", + "w": "t_wall_log" + }, "furniture": { } }, { "type": "palette", "id": "fbml_2_metal_palette", - "terrain": { ",": "t_dirtfloor", ".": "t_scrap_floor", "+": "t_door_metal_c", "v": "t_window_no_curtains", "w": "t_scrap_wall" }, + "terrain": { + ",": "t_dirtfloor", + ".": "t_scrap_floor", + "+": "t_door_metal_c", + "r": "t_metal_flat_roof", + "v": "t_window_no_curtains", + "w": "t_scrap_wall" + }, "furniture": { } }, { "type": "palette", "id": "fbml_2_migo_resin_palette", - "terrain": { ",": "t_dirtfloor", ".": "t_floor_resin", "+": "t_resin_hole_c", "v": "t_wall_resin_cage", "w": "t_wall_resin" }, + "terrain": { + ",": "t_dirtfloor", + ".": "t_floor_resin", + "+": "t_resin_hole_c", + "r": "t_resin_roof", + "v": "t_wall_resin_cage", + "w": "t_wall_resin" + }, "furniture": { } }, { @@ -42,6 +70,7 @@ ",": "t_dirtfloor", ".": "t_floor_primitive", "+": "t_door_makeshift_c", + "r": "t_log_sod_roof", "v": "t_window_empty", "w": "t_wall_rammed_earth" }, @@ -50,7 +79,14 @@ { "type": "palette", "id": "fbml_2_rock_palette", - "terrain": { ",": "t_dirtfloor", ".": "t_floor", "+": "t_door_c", "v": "t_window_no_curtains", "w": "t_rock_wall" }, + "terrain": { + ",": "t_dirtfloor", + ".": "t_floor", + "+": "t_door_c", + "r": "t_wood_treated_roof", + "v": "t_window_no_curtains", + "w": "t_rock_wall" + }, "furniture": { } }, { @@ -60,6 +96,7 @@ ",": "t_dirtfloor", ".": "t_floor_primitive", "+": "t_door_makeshift_c", + "r": "t_log_sod_roof", "v": "t_wall_wattle_half", "w": "t_wall_wattle" }, @@ -68,7 +105,14 @@ { "type": "palette", "id": "fbml_2_wood_palette", - "terrain": { ",": "t_dirtfloor", ".": "t_floor", "+": "t_door_c", "v": "t_window_no_curtains", "w": "t_wall_wood" }, + "terrain": { + ",": "t_dirtfloor", + ".": "t_floor", + "+": "t_door_c", + "r": "t_wood_treated_roof", + "v": "t_window_no_curtains", + "w": "t_wall_wood" + }, "furniture": { } } ] diff --git a/doc/MAPGEN.md b/doc/MAPGEN.md index 80ab4ec62cc0e..b056e31f42866 100644 --- a/doc/MAPGEN.md +++ b/doc/MAPGEN.md @@ -212,7 +212,10 @@ applied universally to all of the listed overmap terrains. Placing things using x/y coordinates ("place_monsters", "place_loot", "place_item", etc) works using the full extended coordinates beyond 24x24. An important limitation is that ranged random coordinates (such as "x": `[ 10, 18 ]`) must not cross the 24x24 terrain boundaries. Ranges such as `[ 0, 23 ]` and `[ 50, 70 ]` are valid, but `[ 0, 47 ]` and -`[ 15, 35 ]` are not because they extend beyond a single 24x24 block. +`[ 15, 35 ]` are not because they extend beyond a single 24x24 block. Note that the syntax supports an optional +*relative* "z" coordinate (NOT absolute Z level, although it often would look the same as the reference is often zero), +but it is usable only for faction camp construction for the time being (mapgen separates Z levels by using different +overmap terrain identifiers instead). Example: @@ -470,7 +473,7 @@ Example: ```json "set": [ - { "point": "furniture", "id": "f_chair", "x": 5, "y": 10 }, + { "point": "furniture", "id": "f_chair", "x": 5, "y": 10, "z": 1 }, { "point": "radiation", "id": "f_chair", "x": 12, "y": 12, "amount": 20 }, { "point": "trap", "id": "tr_beartrap", "x": [ 0, 23 ], "y": [ 5, 18 ], "chance": 10, "repeat": [ 2, 5 ] }, { "point": "variable", "id": "nether_dungeon_door", "x": 4, "y": 2 } @@ -481,13 +484,16 @@ All X and Y values may be either a single integer between `0` and `23`, or an ar between `0` and `23`). If X or Y are set to an array, the result is a random number in that range (inclusive). In the above examples, the furniture `"f_chair"` is always at coordinates `"x": 5, "y": 10`, but the trap `"tr_beartrap"` is randomly repeated in the area `"x": [ 0, 23 ], "y": [ 5, 18 ]"`. +The Z value is optional and currently usable only for faction camps. It is a *relative* level with the nominal Z level +of the construction being the reference point, and thus can span the range of +/ the thickness of the world (minus 1). +As opposed to the other coordinates, it cannot span a range, but has to be a single integer. See terrain.json, furniture.json, and trap.json for "id" strings. ### Set things at a "point" -- Requires "point" type, and coordinates "x" and "y" +- Requires "point" type, and coordinates "x" and "y", with an optional "z" (only for faction camps). - For "point" type "radiation", requires "amount" - For other types, requires "id" of terrain, furniture, trap, trap_remove, or name of the global variable @@ -496,6 +502,7 @@ See terrain.json, furniture.json, and trap.json for "id" strings. | point | Allowed values: `"terrain"`, `"furniture"`, `"trap"`, `"trap_remove"`, `"item_remove"`, `"field_remove"`, `"radiation"`, `"variable"`, `"creature_remove"` | id | Terrain, furniture, trap ID or the variable's name. Examples: `"id": "f_counter"`, `"id": "tr_beartrap"`. Omit for "radiation", "item_remove", "creature_remove", and "field_remove". For `trap_remove` if tr_null is used any traps present will be removed. | x, y | X, Y coordinates. Value from `0-23`, or range `[ 0-23, 0-23 ]` for a random value in that range. Example: `"x": 12, "y": [ 5, 15 ]` +| z | (optional) Z coordinate. Value from `-20 to 20`. The value is *relative* to the Z level nominally modified, cannot have a range, and can only be used for faction camps. | amount | Radiation amount. Value from `0-100`. | chance | (optional) One-in-N chance to apply | repeat | (optional) Value: `[ n1, n2 ]`. Spawn item randomly between `n1` and `n2` times. Only makes sense if the coordinates are random. Example: `[ 1, 3 ]` - repeat 1-3 times. @@ -504,13 +511,15 @@ See terrain.json, furniture.json, and trap.json for "id" strings. ### Set things in a "line" - Requires "line" type, and endpoints "x", "y" and "x2", "y2" +- Optional relative "z" level specification - For "line" type "radiation", requires "amount" - For other types, requires "id" of terrain, furniture, trap, trap_remove - creature_remove has no "id" or "amount" Example: ```json -{ "line": "terrain", "id": "t_lava", "x": 5, "y": 5, "x2": 20, "y2": 20 } +{ "line": "terrain", "id": "t_lava", "x": 5, "y": 5, "x2": 20, "y2": 20 }, +{ "line": "terrain", "id": "t_wood_treated_roof", "x": 5, "y": 5, "z": 1 "x2": 20, "y2": 20 } ``` | Field | Description @@ -518,6 +527,7 @@ Example: | line | Allowed values: `"terrain"`, `"furniture"`, `"trap"`, `"radiation"`, `"trap_remove"`, `"item_remove"`, `"field_remove"`, `"creature_remove"` | id | Terrain, furniture, or trap ID. Examples: `"id": "f_counter"`, `"id": "tr_beartrap"`. Omit for "radiation", "item_remove", "creature_remove", and "field_remove". For `trap_remove` if tr_null is used any traps present will be removed. | x, y | Start X, Y coordinates. Value from `0-23`, or range `[ 0-23, 0-23 ]` for a random value in that range. Example: `"x": 12, "y": [ 5, 15 ]` +| z | (optional) Relative Z coordinate for placement at a different Z level than the nominal one. Value from `-20 to 20`. Also note that range is not supported, and it can only be used for faction camps. | x2, y2 | End X, Y coordinates. Value from `0-23`, or range `[ 0-23, 0-23 ]` for a random value in that range. Example: `"x": 22, "y": [ 15, 20 ]` | amount | Radiation amount. Value from `0-100`. | chance | (optional) One-in-N chance to apply @@ -527,6 +537,7 @@ Example: ### Set things in a "square" - Requires "square" type, and opposite corners at "x", "y" and "x2", "y2" +- Optional relative "z" level specification - For "square" type "radiation", requires "amount" - For other types, requires "id" of terrain, furniture, trap, creature_remove, or trap_remove @@ -534,7 +545,8 @@ The "square" arguments are the same as for "line", but "x", "y" and "x2", "y2" d Example: ```json -{ "square": "radiation", "amount": 10, "x": [ 0, 5 ], "y": [ 0, 5 ], "x2": [ 18, 23 ], "y2": [ 18, 23 ] } +{ "square": "radiation", "amount": 10, "x": [ 0, 5 ], "y": [ 0, 5 ], "x2": [ 18, 23 ], "y2": [ 18, 23 ] }, +{ "square": "radiation", "amount": 10, "x": [ 0, 5 ], "y": [ 0, 5 ], "z": -1, "x2": [ 18, 23 ], "y2": [ 18, 23 ] } ``` | Field | Description @@ -542,6 +554,7 @@ Example: | square | Allowed values: `"terrain"`, `"furniture"`, `"trap"`, `"radiation"`, `"trap_remove"`, `"item_remove"`, `"field_remove"`, `"creature_remove"` | id | Terrain, furniture, or trap ID. Examples: `"id": "f_counter"`, `"id": "tr_beartrap"`. Omit for "radiation", "item_remove", creature_remove, and "field_remove". For `trap_remove` if tr_null is used any traps present will be removed. | x, y | Top-left corner of square. +| z | (optional) Relative Z coordinate for placement at a different Z level than the nominal one. Value from `-20 to 20`. Also note that range is not supported, and it can only be used for faction camps. | x2, y2 | Bottom-right corner of square. ## Spawn a single monster with "place_monster" @@ -555,6 +568,7 @@ Value: `[ array of {objects} ]: [ { "monster": ... } ]` | monster | ID of the monster to spawn. | group | ID of the monster group from which the spawned monster is selected. `monster` and `group` should not be used together. `group` will act over `monster`. | x, y | Spawn coordinates ( specific or area rectangle ). Value: 0-23 or `[ 0-23, 0-23 ]` - random value between `[ a, b ]`. +| z | (optional) Relative Z coordinate for placement at a different Z level than the nominal one. Value from `-20 to 20`. Also note that range is not supported, and it can only be used for faction camps. | chance | Percentage chance to do spawning. If repeat is used each repeat has separate chance. | repeat | The spawning is repeated this many times. Can be a number or a range. | pack_size | How many monsters are spawned. Can be single number or range like `[1-4]`. Is affected by the chance and spawn density. Ignored when spawning from a group. @@ -583,6 +597,15 @@ Example: This places a single random monster from group "GROUP_REFUGEE_BOSS_ZOMBIE", sets the name to "Sean McLaughlin", spawns the monster at coordinate (10, 10) and also sets the monster as the target of this mission. +Example: +```json +"place_monster": [ + { "group": "GROUP_REFUGEE_BOSS_ZOMBIE", "name": "Sean McLaughlin", "x": 11, "y": 17, "z": 1, "target": false } +] +``` +This spawns the same monster as before, but one Z level higher up (hopefully on the roof of something), but it's not a +mission target. + Example: ```json "place_monster": [ @@ -626,6 +649,7 @@ Using `place_monsters` to spawn a group of monsters works in a similar fashion t |--|--| | monster | The ID of the monster group that you wish to spawn | | x, y | Spawn coordinates ( specific or area rectangle ). Value: 0-23 or `[ 0-23, 0-23 ]` - random value between `[ a, b ]`. +| z | (optional) Relative Z coordinate for placement at a different Z level than the nominal one. Value from `-20 to 20`. Also note that range is not supported, and it can only be used for faction camps. | chance | Represents a 1 in N chance that the entire group will spawn. This is done once for each repeat. If this dice roll fails, the entire group specified will not spawn. Leave blank to guarantee spawns. | repeat | The spawning is repeated this many times. Can be a number or a range. Again, this represents the number of times the group will be spawned. | density | This number is multiplied by the spawn density of the world the player is in and then probabilistically rounded to determine how many times to spawn the group. This is done for each time the spawn is repeated. For instance, if the final multiplier from this calculation ends up being `2`, and the repeat value is `6`, then the group will be spawned `2 * 6` or 12 times. @@ -636,9 +660,10 @@ Using `place_npcs` to spawn a group of npcs. |Field|Description | |--|--| | x, y | Spawn coordinates ( specific or area rectangle ). Value: 0-23 or `[ 0-23, 0-23 ]` - random value between `[ a, b ]`. -| class | The class of the npc that you wish to spawn | -| add_trait | A string of array of strings for traits the npc starts with. -| unique_id | A string for the unique_id the npc has. +| z | (optional) Relative Z coordinate for placement at a different Z level than the nominal one. Value from `-20 to 20`. Also note that range is not supported, and it can only be used for faction camps. +| class | The class of the npc that you wish to spawn | +| add_trait | A string of array of strings for traits the npc starts with. +| unique_id | A string for the unique_id the npc has. ## Set variables with "place_variables" Using `place_variables` to set a group of variables. @@ -646,7 +671,8 @@ Using `place_variables` to set a group of variables. |Field|Description | |--|--| | x, y | Spawn coordinates ( specific or area rectangle ). Value: 0-23 or `[ 0-23, 0-23 ]` - random value between `[ a, b ]`. -| name | The name of the global variable to set with the absolute coordinates of x and y. +| z | (optional) Relative Z coordinate for placement at a different Z level than the nominal one. Value from `-20 to 20`. Also note that range is not supported, and it can only be used for faction camps. +| name | The name of the global variable to set with the absolute coordinates of x and y. ## Spawn specific items with a "place_item" array **optional** A list of *specific* things to add. WIP: Monsters and vehicles will be here too @@ -664,6 +690,7 @@ Example: | --- | --- | item | (required) ID of the item to spawn | x, y | (required) Spawn coordinates. Value from `0-23`, or range `[ 0-23, 0-23 ]` for a random value in that range. +| z | (optional) Relative Z coordinate for placement at a different Z level than the nominal one. Value from `-20 to 20`. Also note that range is not supported, and it can only be used for faction camps. | amount | (required) Number of items to spawn. Single integer, or range `[ a, b ]` for a random value in that range. | chance | (optional) One-in-N chance to spawn item. | repeat | (optional) Value: `[ n1, n2 ]`. Spawn item randomly between `n1` and `n2` times. Only makes sense if the coordinates are random. Example: `[ 1, 3 ]` - repeat 1-3 times. @@ -683,6 +710,7 @@ Example: | --- | --- | id | (required) ID of the faction to apply ownership to. | x, y | (required) Spawn coordinates. Value from `0-23`, or range `[ 0-23, 0-23 ]` for a random value in that range. +| z | (optional) Relative Z coordinate for placement at a different Z level than the nominal one. Value from `-20 to 20`. Also note that range is not supported, and it can only be used for faction camps. This is an array, so multiple entries can be defined. @@ -1144,12 +1172,13 @@ Place_nested allows for conditional spawning of chunks based on the `"id"`s and/ | --- | --- | chunks/else_chunks | (required, string) the nested_mapgen_id of the chunk that will be conditionally placed. Chunks are placed if the specified neighbor matches, and "else_chunks" otherwise. | x and y | (required, int) the cardinal position in which the chunk will be placed. +| z | (optional) Relative Z coordinate for placement at a different Z level than the nominal one. Value from `-20 to 20`. Also note that range is not supported, and it can only be used for faction camps. | neighbors | (optional) Any of the neighboring overmaps that should be checked before placing the chunk. Each direction is associated with a list of overmap `"id"` substrings. See [JSON_INFO.md](JSON_INFO.md#Starting-locations) "terrain" section to do more advanced searches, note this field defaults to CONTAINS not TYPE. | joins | (optional) Any mutable overmap special joins that should be checked before placing the chunk. Each direction is associated with a list of join `"id"` strings. | flags | (optional) Any overmap terrain flags that should be checked before placing the chunk. Each direction is associated with a list of `oter_flags` flags. | flags_any | (optional) Identical to flags except only requires a single direction to pass. Useful to check if there's at least one of a flag in cardinal or orthoganal directions etc. | predecessors | (optional) Any of the maps' predecessors that should be checked before placing the chunk. Only useful if using fallback_predecessor_mapgen. -| z | (optional, array of ints ) Any number of z-levels that should be checked before placing the chunk. +| check_z | (optional, array of ints ) Any number of z-levels that should be checked before placing the chunk. The adjacent overmaps which can be checked in this manner are: @@ -1164,17 +1193,19 @@ Example: ```json "place_nested": [ { "chunks": [ "nest1" ], "x": 0, "y": 0, "neighbors": { "north": [ "empty_rock", "field" ] } }, + { "chunks": [ "nest1_roof" ], "x": 0, "y": 0, "z": 1, "neighbors": { "north": [ "empty_rock", "field" ] } }, { "chunks": [ "nest2" ], "x": 0, "y": 0, "neighbors": { "north": [ { "om_terrain": "fort", "om_terrain_match_type": "PREFIX" }, "mansion" ] } }, { "chunks": [ "nest3" ], "x": 0, "y": 0, "joins": { "north": [ "interior_to_exterior" ] } }, { "chunks": [ "nest4" ], "x": 0, "y": 0, "flags": { "north": [ "RIVER" ] }, "flags_any": { "north_east": [ "RIVER" ], "north_west": [ "RIVER" ] } }, { "else_chunks": [ "nest5" ], "x": 0, "y": 0, "flags": { "north_west": [ "RIVER", "LAKE", "LAKE_SHORE" ] } }, { "chunks": [ "nest6" ], "x": 0, "y": 0, "predecessors": [ "field", { "om_terrain": "river", "om_terrain_match_type": "PREFIX" } ] }, { "chunks": [ "nest7" ], "x": 0, "y": 0, "neighbors": { "north": [ { "om_terrain": "road_curved", "om_terrain_match_type": "SUBTYPE" } ] } }, - { "chunks": [ "nest8" ], "x": 0, "y": 0, "neighbors": { "z": [ -3, 1, 3, 5 ] } } + { "chunks": [ "nest8" ], "x": 0, "y": 0, "neighbors": { "check_z": [ -3, 1, 3, 5 ] } } ], ``` The code excerpt above will place chunks as follows: * `"nest1"` if the north neighbor's om terrain contains `"field"` or `"empty_rock"`. +* `"nest1_roof"` at the Z level above nest1 if the north neighbor's om terrain (on the nominal Z level) contains `"field"` or `"empty_rock"`. * `"nest2"` if the north neighbor has the prefix `"fort"` or contains `"mansion"`, so for example `"fort_1a_north"` and `"mansion_t2u"` would match but `"house_fortified"` wouldn't. * `"nest3"` if the join `"interior_to_exterior"` was used to the north during mutable overmap placement. * `"nest4"` if the north neighboring overmap terrain has a flag `"RIVER"` and either of the north east or north west neighboring overmap terrains have a `"RIVER"` flag. diff --git a/src/clzones.cpp b/src/clzones.cpp index 41c0d446ee011..4a5b0e503119f 100644 --- a/src/clzones.cpp +++ b/src/clzones.cpp @@ -1515,13 +1515,17 @@ void zone_manager::rotate_zones( map &target_map, const int turns ) } for( zone_data &zone : zones ) { - if( !zone.get_is_personal() ) { + if( !zone.get_is_personal() && target_map.inbounds_z( zone.get_center_point().z() ) ) { _rotate_zone( target_map, zone, turns ); } } - for( zone_data *zone : target_map.get_vehicle_zones( target_map.get_abs_sub().z() ) ) { - _rotate_zone( target_map, *zone, turns ); + for( int z_level = target_map.supports_zlevels() ? -OVERMAP_DEPTH : target_map.get_abs_sub().z(); + z_level <= ( target_map.supports_zlevels() ? OVERMAP_HEIGHT : target_map.get_abs_sub().z() ); + z_level++ ) { + for( zone_data *zone : target_map.get_vehicle_zones( z_level ) ) { + _rotate_zone( target_map, *zone, turns ); + } } } diff --git a/src/debug_menu.cpp b/src/debug_menu.cpp index f8dfe007f2559..310d2cf06b3c4 100644 --- a/src/debug_menu.cpp +++ b/src/debug_menu.cpp @@ -1445,7 +1445,7 @@ static void spawn_nested_mapgen() if( ptr == nullptr ) { return; } - ( *ptr )->nest( md, local_ms.xy(), "debug menu" ); + ( *ptr )->nest( md, tripoint_rel_ms( local_ms.x, local_ms.y, 0 ), "debug menu" ); target_map.save(); g->load_npcs(); here.invalidate_map_cache( here.get_abs_sub().z() ); diff --git a/src/map.cpp b/src/map.cpp index 5b02853a5c62f..ce0adc5efe841 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -3079,6 +3079,11 @@ bool map::has_flag( const std::string &flag, const tripoint &p ) const return has_flag_ter_or_furn( flag, p ); // Does bound checking } +bool map::has_flag( const std::string &flag, const tripoint_bub_ms &p ) const +{ + return has_flag_ter_or_furn( flag, p.raw() ); // Does bound checking +} + bool map::can_put_items( const tripoint &p ) const { return can_put_items_ter_furn( p ) || veh_at( p ).cargo().has_value(); @@ -3109,6 +3114,11 @@ bool map::has_flag_furn( const std::string &flag, const tripoint &p ) const return furn( p ).obj().has_flag( flag ); } +bool map::has_flag_furn( const std::string &flag, const tripoint_bub_ms &p ) const +{ + return furn( p ).obj().has_flag( flag ); +} + bool map::has_flag_ter_or_furn( const std::string &flag, const tripoint &p ) const { if( !inbounds( p ) ) { @@ -9733,19 +9743,19 @@ size_t map::get_nonant( const tripoint &gridp ) const } } -void map::draw_line_ter( const ter_id &type, const point &p1, const point &p2, +void map::draw_line_ter( const ter_id &type, const point &p1, const point &p2, const int z, bool avoid_creatures ) { - draw_line( [this, type, avoid_creatures]( const point & p ) { - this->ter_set( p, type, avoid_creatures ); + draw_line( [this, type, avoid_creatures, z]( const point & p ) { + this->ter_set( tripoint_bub_ms( p.x, p.y, z ), type, avoid_creatures ); }, p1, p2 ); } -void map::draw_line_furn( const furn_id &type, const point &p1, const point &p2, +void map::draw_line_furn( const furn_id &type, const point &p1, const point &p2, const int z, bool avoid_creatures ) { - draw_line( [this, type, avoid_creatures]( const point & p ) { - this->furn_set( p, type, avoid_creatures ); + draw_line( [this, type, avoid_creatures, z]( const point & p ) { + this->furn_set( tripoint_bub_ms( p.x, p.y, z ), type, avoid_creatures ); }, p1, p2 ); } @@ -9779,19 +9789,19 @@ void map::draw_fill_background( const weighted_int_list &f ) draw_square_ter( f, point_zero, point( SEEX * my_MAPSIZE - 1, SEEY * my_MAPSIZE - 1 ) ); } -void map::draw_square_ter( const ter_id &type, const point &p1, const point &p2, +void map::draw_square_ter( const ter_id &type, const point &p1, const point &p2, const int z, bool avoid_creatures ) { - draw_square( [this, type, avoid_creatures]( const point & p ) { - this->ter_set( p, type, avoid_creatures ); + draw_square( [this, type, avoid_creatures, z]( const point & p ) { + this->ter_set( tripoint_bub_ms( p.x, p.y, z ), type, avoid_creatures ); }, p1, p2 ); } -void map::draw_square_furn( const furn_id &type, const point &p1, const point &p2, +void map::draw_square_furn( const furn_id &type, const point &p1, const point &p2, const int z, bool avoid_creatures ) { - draw_square( [this, type, avoid_creatures]( const point & p ) { - this->furn_set( p, type, avoid_creatures ); + draw_square( [this, type, avoid_creatures, z]( const point & p ) { + this->furn_set( tripoint_bub_ms( p.x, p.y, z ), type, avoid_creatures ); }, p1, p2 ); } diff --git a/src/map.h b/src/map.h index cdb503768c313..b8f336eb75f4b 100644 --- a/src/map.h +++ b/src/map.h @@ -354,7 +354,6 @@ class map friend void field_processor_wandering_field( const tripoint &, field_entry &, field_proc_data & ); friend void field_processor_fd_fire_vent( const tripoint &, field_entry &, field_proc_data & ); friend void field_processor_fd_flame_burst( const tripoint &, field_entry &, field_proc_data & ); - friend void field_processor_fd_bees( const tripoint &, field_entry &, field_proc_data & ); friend void field_processor_fd_incendiary( const tripoint &, field_entry &, field_proc_data & ); // for testing @@ -1152,17 +1151,17 @@ class map point random_outdoor_tile() const; // mapgen - void draw_line_ter( const ter_id &type, const point &p1, const point &p2, + void draw_line_ter( const ter_id &type, const point &p1, const point &p2, int z, bool avoid_creature = false ); - void draw_line_furn( const furn_id &type, const point &p1, const point &p2, + void draw_line_furn( const furn_id &type, const point &p1, const point &p2, int z, bool avoid_creatures = false ); void draw_fill_background( const ter_id &type ); void draw_fill_background( ter_id( *f )() ); void draw_fill_background( const weighted_int_list &f ); - void draw_square_ter( const ter_id &type, const point &p1, const point &p2, + void draw_square_ter( const ter_id &type, const point &p1, const point &p2, int z, bool avoid_creature = false ); - void draw_square_furn( const furn_id &type, const point &p1, const point &p2, + void draw_square_furn( const furn_id &type, const point &p1, const point &p2, int z, bool avoid_creatures = false ); void draw_square_ter( ter_id( *f )(), const point &p1, const point &p2, bool avoid_creatures = false ); @@ -1480,11 +1479,11 @@ class map bool ongrass, const time_point &turn, int magazine = 0, int ammo = 0, const std::string &faction = "" ); std::vector place_items( - const item_group_id &group_id, int chance, const point &p1, const point &p2, + const item_group_id &group_id, int chance, const point &p1, const point &p2, const int z_level, bool ongrass, const time_point &turn, int magazine = 0, int ammo = 0, const std::string &faction = "" ) { - return place_items( group_id, chance, tripoint( p1, abs_sub.z() ), - tripoint( p2, abs_sub.z() ), ongrass, turn, magazine, ammo, faction ); + return place_items( group_id, chance, tripoint( p1, z_level ), + tripoint( p2, z_level ), ongrass, turn, magazine, ammo, faction ); } /** * Place items from an item group at p. Places as much items as the item group says. @@ -1789,15 +1788,15 @@ class map // tripoint_abs_omt coordinate guarantees this will be fulfilled. void generate( const tripoint_abs_omt &p, const time_point &when ); void place_spawns( const mongroup_id &group, int chance, - const point_bub_ms &p1, const point_bub_ms &p2, float density, + const point_bub_ms &p1, const point_bub_ms &p2, int z_level, float density, bool individual = false, bool friendly = false, const std::optional &name = std::nullopt, int mission_id = -1 ); - void place_gas_pump( const point &p, int charges, const itype_id &fuel_type ); - void place_gas_pump( const point &p, int charges ); + void place_gas_pump( const tripoint_bub_ms &p, int charges, const itype_id &fuel_type ); + void place_gas_pump( const tripoint_bub_ms &p, int charges ); // 6 liters at 250 ml per charge - void place_toilet( const point &p, int charges = 6 * 4 ); - void place_vending( const point &p, const item_group_id &type, bool reinforced = false, + void place_toilet( const tripoint_bub_ms &p, int charges = 6 * 4 ); + void place_vending( const tripoint_bub_ms &p, const item_group_id &type, bool reinforced = false, bool lootable = false ); // places an NPC, if static NPCs are enabled or if force is true character_id place_npc( const point &p, const string_id &type ); @@ -2327,6 +2326,9 @@ class map std::optional _main_cleanup_override = std::nullopt; public: + int supports_zlevels() const { + return zlevels; + } void queue_main_cleanup(); bool is_main_cleanup_queued() const; void main_cleanup_override( bool over ); @@ -2451,11 +2453,12 @@ class tinymap : private map using map::main_cleanup_override; using map::generate; void place_spawns( const mongroup_id &group, int chance, - const point_omt_ms &p1, const point_omt_ms &p2, float density, + const point_omt_ms &p1, const point_omt_ms &p2, const int z_level, float density, bool individual = false, bool friendly = false, const std::optional &name = std::nullopt, int mission_id = -1 ) { - map::place_spawns( group, chance, rebase_bub( p1 ), rebase_bub( p2 ), density, individual, friendly, + map::place_spawns( group, chance, rebase_bub( p1 ), rebase_bub( p2 ), z_level, density, individual, + friendly, name, mission_id ); } void add_spawn( const mtype_id &type, int count, const tripoint_omt_ms &p, diff --git a/src/map_extras.cpp b/src/map_extras.cpp index 9cce878b4c864..ba459490f4ce8 100644 --- a/src/map_extras.cpp +++ b/src/map_extras.cpp @@ -406,9 +406,9 @@ static bool mx_helicopter( map &m, const tripoint &abs_sub ) const tripoint_bub_ms pos = vp.pos_bub(); // Spawn pilots in seats with controls.CTRL_ELECTRONIC if( controls_at( wreckage, pos ) ) { - m.place_spawns( GROUP_MIL_PILOT, 1, pos.xy(), pos.xy(), 1, true ); + m.place_spawns( GROUP_MIL_PILOT, 1, pos.xy(), pos.xy(), pos.z(), 1, true ); } else { - m.place_spawns( GROUP_MIL_PASSENGER, 1, pos.xy(), pos.xy(), 1, true ); + m.place_spawns( GROUP_MIL_PASSENGER, 1, pos.xy(), pos.xy(), pos.z(), 1, true ); } delete_items_at_mount( *wreckage, vp.mount() ); // delete corpse items } @@ -420,9 +420,9 @@ static bool mx_helicopter( map &m, const tripoint &abs_sub ) const tripoint_bub_ms pos = vp.pos_bub(); // Spawn pilots in seats with controls. if( controls_at( wreckage, pos ) ) { - m.place_spawns( GROUP_MIL_PILOT, 1, pos.xy(), pos.xy(), 1, true ); + m.place_spawns( GROUP_MIL_PILOT, 1, pos.xy(), pos.xy(), pos.z(), 1, true ); } else { - m.place_spawns( GROUP_MIL_WEAK, 2, pos.xy(), pos.xy(), 1, true ); + m.place_spawns( GROUP_MIL_WEAK, 2, pos.xy(), pos.xy(), pos.z(), 1, true ); } delete_items_at_mount( *wreckage, vp.mount() ); // delete corpse items } @@ -431,7 +431,7 @@ static bool mx_helicopter( map &m, const tripoint &abs_sub ) // Just pilots for( const vpart_reference &vp : wreckage->get_any_parts( VPFLAG_CONTROLS ) ) { const tripoint_bub_ms pos = vp.pos_bub(); - m.place_spawns( GROUP_MIL_PILOT, 1, pos.xy(), pos.xy(), 1, true ); + m.place_spawns( GROUP_MIL_PILOT, 1, pos.xy(), pos.xy(), pos.z(), 1, true ); delete_items_at_mount( *wreckage, vp.mount() ); // delete corpse items } break; @@ -1037,14 +1037,15 @@ static bool mx_portal_in( map &m, const tripoint &abs_sub ) } } //50% chance to spawn pouf-maker - m.place_spawns( GROUP_FUNGI_FUNGALOID, 2, p + point_north_west, p + point_south_east, 1, true ); + m.place_spawns( GROUP_FUNGI_FUNGALOID, 2, p + point_north_west, p + point_south_east, + portal_location.z(), 1, true ); break; } //Netherworld monsters spawning around the portal case 2: { m.add_field( portal_location, fd_reality_tear, 3 ); for( const tripoint_bub_ms &loc : m.points_in_radius( portal_location, 5 ) ) { - m.place_spawns( GROUP_NETHER_PORTAL, 15, loc.xy(), loc.xy(), 1, true ); + m.place_spawns( GROUP_NETHER_PORTAL, 15, loc.xy(), loc.xy(), loc.z(), 1, true ); } break; } @@ -1144,7 +1145,8 @@ static bool mx_jabberwock( map &m, const tripoint &/*loc*/ ) // into the monster group, but again the hardcoded rarity it had in the forest mapgen was // not easily replicated there. if( one_in( 50 ) ) { - m.place_spawns( GROUP_JABBERWOCK, 1, point_bub_ms( point_zero ), { SEEX * 2, SEEY * 2 }, 1, true ); + m.place_spawns( GROUP_JABBERWOCK, 1, point_bub_ms( point_zero ), { SEEX * 2, SEEY * 2 }, + m.get_abs_sub().z(), 1, true ); return true; } @@ -1267,8 +1269,8 @@ static bool mx_pond( map &m, const tripoint &abs_sub ) } } - m.place_spawns( GROUP_FISH, 1, point_bub_ms( point_zero ), point_bub_ms( width, height ), 0.15f ); - + m.place_spawns( GROUP_FISH, 1, point_bub_ms( point_zero ), point_bub_ms( width, height ), abs_sub.z, + 0.15f ); return true; } @@ -1585,9 +1587,9 @@ static bool mx_roadworks( map &m, const tripoint &abs_sub ) if( road_at_north && road_at_south && !road_at_east && !road_at_west ) { if( one_in( 2 ) ) { // west side of the NS road // road barricade - line_furn( &m, furn_f_barricade_road, point( 4, 0 ), point( 11, 7 ) ); - line_furn( &m, furn_f_barricade_road, point( 11, 8 ), point( 11, 15 ) ); - line_furn( &m, furn_f_barricade_road, point( 11, 16 ), point( 4, 23 ) ); + line_furn( &m, furn_f_barricade_road, point( 4, 0 ), point( 11, 7 ), abs_sub.z ); + line_furn( &m, furn_f_barricade_road, point( 11, 8 ), point( 11, 15 ), abs_sub.z ); + line_furn( &m, furn_f_barricade_road, point( 11, 16 ), point( 4, 23 ), abs_sub.z ); // road defects defects_from = { 9, 7 }; defects_to = { 4, 16 }; @@ -1605,9 +1607,9 @@ static bool mx_roadworks( map &m, const tripoint &abs_sub ) } } else { // east side of the NS road // road barricade - line_furn( &m, furn_f_barricade_road, point( 19, 0 ), point( 12, 7 ) ); - line_furn( &m, furn_f_barricade_road, point( 12, 8 ), point( 12, 15 ) ); - line_furn( &m, furn_f_barricade_road, point( 12, 16 ), point( 19, 23 ) ); + line_furn( &m, furn_f_barricade_road, point( 19, 0 ), point( 12, 7 ), abs_sub.z ); + line_furn( &m, furn_f_barricade_road, point( 12, 8 ), point( 12, 15 ), abs_sub.z ); + line_furn( &m, furn_f_barricade_road, point( 12, 16 ), point( 19, 23 ), abs_sub.z ); // road defects defects_from = { 13, 7 }; defects_to = { 19, 16 }; @@ -1627,9 +1629,9 @@ static bool mx_roadworks( map &m, const tripoint &abs_sub ) } else if( road_at_west && road_at_east && !road_at_north && !road_at_south ) { if( one_in( 2 ) ) { // north side of the EW road // road barricade - line_furn( &m, furn_f_barricade_road, point( 0, 4 ), point( 7, 11 ) ); - line_furn( &m, furn_f_barricade_road, point( 8, 11 ), point( 15, 11 ) ); - line_furn( &m, furn_f_barricade_road, point( 16, 11 ), point( 23, 4 ) ); + line_furn( &m, furn_f_barricade_road, point( 0, 4 ), point( 7, 11 ), abs_sub.z ); + line_furn( &m, furn_f_barricade_road, point( 8, 11 ), point( 15, 11 ), abs_sub.z ); + line_furn( &m, furn_f_barricade_road, point( 16, 11 ), point( 23, 4 ), abs_sub.z ); // road defects defects_from = { 7, 9 }; defects_to = { 16, 4 }; @@ -1647,9 +1649,9 @@ static bool mx_roadworks( map &m, const tripoint &abs_sub ) } } else { // south side of the EW road // road barricade - line_furn( &m, furn_f_barricade_road, point( 0, 19 ), point( 7, 12 ) ); - line_furn( &m, furn_f_barricade_road, point( 8, 12 ), point( 15, 12 ) ); - line_furn( &m, furn_f_barricade_road, point( 16, 12 ), point( 23, 19 ) ); + line_furn( &m, furn_f_barricade_road, point( 0, 19 ), point( 7, 12 ), abs_sub.z ); + line_furn( &m, furn_f_barricade_road, point( 8, 12 ), point( 15, 12 ), abs_sub.z ); + line_furn( &m, furn_f_barricade_road, point( 16, 12 ), point( 23, 19 ), abs_sub.z ); // road defects defects_from = { 7, 13 }; defects_to = { 16, 19 }; @@ -1670,9 +1672,9 @@ static bool mx_roadworks( map &m, const tripoint &abs_sub ) // SW side of the N-E road curve // road barricade // NOLINTNEXTLINE(cata-use-named-point-constants) - line_furn( &m, furn_f_barricade_road, point( 1, 0 ), point( 11, 0 ) ); - line_furn( &m, furn_f_barricade_road, point( 12, 0 ), point( 23, 10 ) ); - line_furn( &m, furn_f_barricade_road, point( 23, 22 ), point( 23, 11 ) ); + line_furn( &m, furn_f_barricade_road, point( 1, 0 ), point( 11, 0 ), abs_sub.z ); + line_furn( &m, furn_f_barricade_road, point( 12, 0 ), point( 23, 10 ), abs_sub.z ); + line_furn( &m, furn_f_barricade_road, point( 23, 22 ), point( 23, 11 ), abs_sub.z ); // road defects switch( rng( 1, 3 ) ) { case 1: @@ -1703,9 +1705,9 @@ static bool mx_roadworks( map &m, const tripoint &abs_sub ) } else if( road_at_south && road_at_west && !road_at_east && !road_at_north ) { // NE side of the S-W road curve // road barricade - line_furn( &m, furn_f_barricade_road, point( 0, 4 ), point( 0, 12 ) ); - line_furn( &m, furn_f_barricade_road, point( 1, 13 ), point( 11, 23 ) ); - line_furn( &m, furn_f_barricade_road, point( 12, 23 ), point( 19, 23 ) ); + line_furn( &m, furn_f_barricade_road, point( 0, 4 ), point( 0, 12 ), abs_sub.z ); + line_furn( &m, furn_f_barricade_road, point( 1, 13 ), point( 11, 23 ), abs_sub.z ); + line_furn( &m, furn_f_barricade_road, point( 12, 23 ), point( 19, 23 ), abs_sub.z ); // road defects switch( rng( 1, 3 ) ) { case 1: @@ -1736,9 +1738,9 @@ static bool mx_roadworks( map &m, const tripoint &abs_sub ) } else if( road_at_north && road_at_west && !road_at_east && !road_at_south ) { // SE side of the W-N road curve // road barricade - line_furn( &m, furn_f_barricade_road, point( 0, 12 ), point( 0, 19 ) ); - line_furn( &m, furn_f_barricade_road, point( 1, 11 ), point( 12, 0 ) ); - line_furn( &m, furn_f_barricade_road, point( 13, 0 ), point( 19, 0 ) ); + line_furn( &m, furn_f_barricade_road, point( 0, 12 ), point( 0, 19 ), abs_sub.z ); + line_furn( &m, furn_f_barricade_road, point( 1, 11 ), point( 12, 0 ), abs_sub.z ); + line_furn( &m, furn_f_barricade_road, point( 13, 0 ), point( 19, 0 ), abs_sub.z ); // road defects switch( rng( 1, 3 ) ) { case 1: @@ -1770,9 +1772,9 @@ static bool mx_roadworks( map &m, const tripoint &abs_sub ) } else if( road_at_south && road_at_east && !road_at_west && !road_at_north ) { // NW side of the S-E road curve // road barricade - line_furn( &m, furn_f_barricade_road, point( 4, 23 ), point( 12, 23 ) ); - line_furn( &m, furn_f_barricade_road, point( 13, 22 ), point( 22, 13 ) ); - line_furn( &m, furn_f_barricade_road, point( 23, 4 ), point( 23, 12 ) ); + line_furn( &m, furn_f_barricade_road, point( 4, 23 ), point( 12, 23 ), abs_sub.z ); + line_furn( &m, furn_f_barricade_road, point( 13, 22 ), point( 22, 13 ), abs_sub.z ); + line_furn( &m, furn_f_barricade_road, point( 23, 4 ), point( 23, 12 ), abs_sub.z ); // road defects switch( rng( 1, 3 ) ) { case 1: @@ -2065,7 +2067,7 @@ static bool mx_corpses( map &m, const tripoint &abs_sub ) for( const tripoint_bub_ms &loc : m.points_in_radius( corpse_location, 1 ) ) { if( one_in( 2 ) ) { m.add_field( { loc.xy(), abs_sub.z }, fd_gibs_flesh, rng( 1, 3 ) ); - m.place_spawns( GROUP_STRAY_DOGS, 1, loc.xy(), loc.xy(), 1, true ); + m.place_spawns( GROUP_STRAY_DOGS, 1, loc.xy(), loc.xy(), loc.z(), 1, true ); } } } @@ -2141,6 +2143,7 @@ static bool mx_fungal_zone( map &m, const tripoint &abs_sub ) m.place_spawns( GROUP_FUNGI_FUNGALOID, 1, suitable_location.xy() + point_north_west, suitable_location.xy() + point_south_east, + suitable_location.z(), 3, true ); return true; } diff --git a/src/mapgen.cpp b/src/mapgen.cpp index cb8d8944a13ff..752201d69eb31 100644 --- a/src/mapgen.cpp +++ b/src/mapgen.cpp @@ -796,7 +796,7 @@ size_t mapgen_function_json_base::calc_index( const point &p ) const return p.y * mapgensize.y + p.x; } -static bool common_check_bounds( const jmapgen_int &x, const jmapgen_int &y, +static bool common_check_bounds( const jmapgen_int &x, const jmapgen_int &y, const jmapgen_int &z, const point &mapgensize, const JsonObject &jso ) { half_open_rectangle bounds( point_zero, mapgensize ); @@ -812,6 +812,10 @@ static bool common_check_bounds( const jmapgen_int &x, const jmapgen_int &y, jso.throw_error( "y maximum is less than y minimum" ); } + if( z.valmax != z.val ) { + jso.throw_error( "z maximum has to be identical to z minimum" ); + } + if( x.valmax > mapgensize.x - 1 ) { jso.throw_error_at( "x", "coordinate range cannot cross grid boundaries" ); } @@ -832,9 +836,10 @@ void mapgen_function_json_base::merge_non_nest_parameters_into( } bool mapgen_function_json_base::check_inbounds( const jmapgen_int &x, const jmapgen_int &y, + const jmapgen_int &z, const JsonObject &jso ) const { - return common_check_bounds( x, y, mapgensize, jso ); + return common_check_bounds( x, y, z, mapgensize, jso ); } mapgen_function_json_base::mapgen_function_json_base( @@ -859,8 +864,9 @@ mapgen_function_json::mapgen_function_json( const JsonObject &jsobj, , rotation( 0 ) , fallback_predecessor_mapgen_( oter_str_id::NULL_ID() ) { - m_offset.x = grid_offset.x * mapgensize.x; - m_offset.y = grid_offset.y * mapgensize.y; + m_offset.x() = grid_offset.x * mapgensize.x; + m_offset.y() = grid_offset.y * mapgensize.y; + m_offset.z() = 0; total_size.x = grid_total.x * mapgensize.x; total_size.y = grid_total.y * mapgensize.y; objects = jmapgen_objects( m_offset, mapgensize, total_size ); @@ -996,14 +1002,15 @@ void mapgen_function_json_base::setup_setmap( const JsonArray &parray ) const jmapgen_int tmp_x( pjo, "x" ); const jmapgen_int tmp_y( pjo, "y" ); - if( !check_inbounds( tmp_x, tmp_y, pjo ) ) { + const jmapgen_int tmp_z( pjo, "z", 0, 0 ); + if( !check_inbounds( tmp_x, tmp_y, tmp_z, pjo ) ) { pjo.allow_omitted_members(); continue; } if( setmap_optype != JMAPGEN_SETMAP_OPTYPE_POINT ) { tmp_x2 = jmapgen_int( pjo, "x2" ); tmp_y2 = jmapgen_int( pjo, "y2" ); - if( !check_inbounds( tmp_x2, tmp_y2, pjo ) ) { + if( !check_inbounds( tmp_x2, tmp_y2, tmp_z, pjo ) ) { pjo.allow_omitted_members(); continue; } @@ -1062,7 +1069,7 @@ void mapgen_function_json_base::setup_setmap( const JsonArray &parray ) pjo.read( "rotation", tmp_rotation ); pjo.read( "fuel", tmp_fuel ); pjo.read( "status", tmp_status ); - jmapgen_setmap tmp( tmp_x, tmp_y, tmp_x2, tmp_y2, + jmapgen_setmap tmp( tmp_x, tmp_y, tmp_z, tmp_x2, tmp_y2, static_cast( tmpop + setmap_optype ), tmp_i, tmp_chance, tmp_repeat, tmp_rotation, tmp_fuel, tmp_status, string_val ); @@ -1086,16 +1093,19 @@ mapgen_arguments mapgen_function_json_base::get_args( jmapgen_place::jmapgen_place( const JsonObject &jsi ) : x( jsi, "x" ) , y( jsi, "y" ) + , z( jsi, "z", 0, 0 ) , repeat( jsi, "repeat", 1, 1 ) { } -void jmapgen_place::offset( const point &offset ) +void jmapgen_place::offset( const tripoint_rel_ms &offset ) { - x.val -= offset.x; - x.valmax -= offset.x; - y.val -= offset.y; - y.valmax -= offset.y; + x.val -= offset.x(); + x.valmax -= offset.x(); + y.val -= offset.y(); + y.valmax -= offset.y(); + z.val -= offset.z(); + z.valmax -= offset.z(); } map_key::map_key( const std::string &s ) : str( s ) @@ -1745,12 +1755,12 @@ class jmapgen_alternatively : public jmapgen_piece return alternatives[0].phase(); } void check( const std::string &context, const mapgen_parameters ¶ms, - const jmapgen_int &x, const jmapgen_int &y ) const override { + const jmapgen_int &x, const jmapgen_int &y, const jmapgen_int &z ) const override { if( alternatives.empty() ) { debugmsg( "zero alternatives in jmapgen_alternatively in %s", context ); } for( const PieceType &piece : alternatives ) { - piece.check( context, params, x, y ); + piece.check( context, params, x, y, z ); } } void merge_parameters_into( mapgen_parameters ¶ms, @@ -1759,14 +1769,14 @@ class jmapgen_alternatively : public jmapgen_piece piece.merge_parameters_into( params, outer_context ); } } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, const jmapgen_int &z, const std::string &context ) const override { if( const auto chosen = random_entry_opt( alternatives ) ) { - chosen->get().apply( dat, x, y, context ); + chosen->get().apply( dat, x, y, z, context ); } } - bool has_vehicle_collision( const mapgendata &dat, const point &p ) const override { - return dat.m.veh_at( tripoint( p, dat.zlevel() ) ).has_value(); + bool has_vehicle_collision( const mapgendata &dat, const tripoint_rel_ms &p ) const override { + return dat.m.veh_at( tripoint( p.x(), p.y(), dat.zlevel() + p.z() ) ).has_value(); } }; @@ -1787,15 +1797,15 @@ class jmapgen_constrained : public jmapgen_piece return underlying_piece->phase(); } void check( const std::string &context, const mapgen_parameters ¶ms, - const jmapgen_int &x, const jmapgen_int &y ) const override { - underlying_piece->check( context, params, x, y ); + const jmapgen_int &x, const jmapgen_int &y, const jmapgen_int &z ) const override { + underlying_piece->check( context, params, x, y, z ); } void merge_parameters_into( mapgen_parameters ¶ms, const std::string &outer_context ) const override { underlying_piece->merge_parameters_into( params, outer_context ); } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, const jmapgen_int &z, const std::string &context ) const override { for( const mapgen_constraint &constraint : constraints ) { Value param_value = dat.get_arg( constraint.parameter_name ); @@ -1803,7 +1813,7 @@ class jmapgen_constrained : public jmapgen_piece return; } } - underlying_piece->apply( dat, x, y, context ); + underlying_piece->apply( dat, x, y, z, context ); } }; @@ -1833,22 +1843,22 @@ class jmapgen_field : public jmapgen_piece intensities.push_back( jsi.get_int( "intensity", 1 ) ); } } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, const jmapgen_int &z, const std::string &/*context*/ ) const override { field_type_id chosen_id = ftype.get( dat ); if( chosen_id.id().is_null() ) { 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(), z.get() ), 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(), z.get() ), chosen_id, random_entry( intensities ), age ); } } void check( const std::string &oter_name, const mapgen_parameters ¶meters, - const jmapgen_int &/*x*/, const jmapgen_int &/*y*/ + const jmapgen_int &/*x*/, const jmapgen_int &/*y*/, const jmapgen_int &/*z*/ ) const override { ftype.check( oter_name, parameters ); } @@ -1877,7 +1887,7 @@ class jmapgen_npc : public jmapgen_piece jsi.read( "unique_id", unique_id ); } } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, const jmapgen_int &z, const std::string &/*context*/ ) const override { string_id chosen_id = npc_class.get( dat ); if( chosen_id.is_null() ) { @@ -1887,7 +1897,8 @@ class jmapgen_npc : public jmapgen_piece add_msg_debug( debugmode::DF_NPC, "NPC with unique id %s already exists.", unique_id ); return; } - tripoint const dst( x.get(), y.get(), dat.m.get_abs_sub().z() ); + tripoint const dst( x.get(), y.get(), z.get() ); + // TODO: Make place_npc 3D aware. character_id npc_id = dat.m.place_npc( dst.xy(), chosen_id ); if( get_map().inbounds( dat.m.getglobal( dst ) ) ) { dat.m.queue_main_cleanup(); @@ -1907,7 +1918,7 @@ class jmapgen_npc : public jmapgen_piece } void check( const std::string &oter_name, const mapgen_parameters ¶meters, - const jmapgen_int &/*x*/, const jmapgen_int &/*y*/ + const jmapgen_int &/*x*/, const jmapgen_int &/*y*/, const jmapgen_int &/*z*/ ) const override { npc_class.check( oter_name, parameters ); } @@ -1926,17 +1937,19 @@ class jmapgen_faction : public jmapgen_piece return mapgen_phase::faction_ownership; } void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + const jmapgen_int &/*z*/, const std::string &/*context*/ ) const override { faction_id chosen_id = id.get( dat ); if( chosen_id.is_null() ) { return; } + // TODO: Make apply_faction_ownership 3D aware. dat.m.apply_faction_ownership( point( x.val, y.val ), point( x.valmax, y.valmax ), chosen_id ); } void check( const std::string &oter_name, const mapgen_parameters ¶meters, - const jmapgen_int &/*x*/, const jmapgen_int &/*y*/ + const jmapgen_int &/*x*/, const jmapgen_int &/*y*/, const jmapgen_int &/*z*/ ) const override { id.check( oter_name, parameters ); } @@ -1963,9 +1976,9 @@ class jmapgen_sign : public jmapgen_piece jsi.throw_error( "jmapgen_sign: specified furniture needs SIGN flag" ); } } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, const jmapgen_int &z, const std::string &/*context*/ ) const override { - const point r( x.get(), y.get() ); + const tripoint_bub_ms r( x.get(), y.get(), z.get() ); dat.m.furn_set( r, furn_str_id::NULL_ID() ); dat.m.furn_set( r, sign_furniture ); @@ -1987,15 +2000,15 @@ class jmapgen_sign : public jmapgen_piece } signtext = apply_all_tags( signtext, cityname ); } - dat.m.set_signage( tripoint( r, dat.m.get_abs_sub().z() ), signtext ); + dat.m.set_signage( r.raw(), signtext ); } std::string apply_all_tags( std::string signtext, const std::string &cityname ) const { signtext = SNIPPET.expand( signtext ); replace_city_tag( signtext, cityname ); return signtext; } - bool has_vehicle_collision( const mapgendata &dat, const point &p ) const override { - return dat.m.veh_at( tripoint( p, dat.zlevel() ) ).has_value(); + bool has_vehicle_collision( const mapgendata &dat, const tripoint_rel_ms &p ) const override { + return dat.m.veh_at( tripoint_bub_ms( p.x(), p.y(), dat.zlevel() + p.z() ) ).has_value(); } }; /** @@ -2015,9 +2028,9 @@ class jmapgen_graffiti : public jmapgen_piece jsi.throw_error( "jmapgen_graffiti: needs either text or snippet" ); } } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, const jmapgen_int &z, const std::string &/*context*/ ) const override { - const point r( x.get(), y.get() ); + const tripoint_bub_ms r( x.get(), y.get(), dat.zlevel() + z.get() ); std::string graffiti; @@ -2037,7 +2050,7 @@ class jmapgen_graffiti : public jmapgen_piece } graffiti = apply_all_tags( graffiti, cityname ); } - dat.m.set_graffiti( tripoint( r, dat.m.get_abs_sub().z() ), graffiti ); + dat.m.set_graffiti( r.raw(), graffiti ); } std::string apply_all_tags( std::string graffiti, const std::string &cityname ) const { graffiti = SNIPPET.expand( graffiti ); @@ -2064,9 +2077,9 @@ class jmapgen_vending_machine : public jmapgen_piece group_id = mapgen_value( "default_vending_machine" ); } } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, const jmapgen_int &z, const std::string &/*context*/ ) const override { - const point r( x.get(), y.get() ); + const tripoint_bub_ms r( x.get(), y.get(), dat.zlevel() + z.get() ); dat.m.furn_set( r, furn_str_id::NULL_ID() ); item_group_id chosen_id = group_id.get( dat ); if( chosen_id.is_null() ) { @@ -2074,12 +2087,12 @@ class jmapgen_vending_machine : public jmapgen_piece } dat.m.place_vending( r, chosen_id, reinforced, lootable ); } - bool has_vehicle_collision( const mapgendata &dat, const point &p ) const override { - return dat.m.veh_at( tripoint( p, dat.zlevel() ) ).has_value(); + bool has_vehicle_collision( const mapgendata &dat, const tripoint_rel_ms &p ) const override { + return dat.m.veh_at( tripoint_bub_ms( p.x(), p.y(), dat.zlevel() + p.z() ) ).has_value(); } void check( const std::string &oter_name, const mapgen_parameters ¶meters, - const jmapgen_int &/*x*/, const jmapgen_int &/*y*/ + const jmapgen_int &/*x*/, const jmapgen_int &/*y*/, const jmapgen_int &/*z*/ ) const override { group_id.check( oter_name, parameters ); } @@ -2098,9 +2111,9 @@ class jmapgen_toilet : public jmapgen_piece mapgen_phase phase() const override { return mapgen_phase::furniture; } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, const jmapgen_int &z, const std::string &/*context*/ ) const override { - const point r( x.get(), y.get() ); + const tripoint_bub_ms r( x.get(), y.get(), dat.zlevel() + z.get() ); const int charges = amount.get(); dat.m.furn_set( r, furn_str_id::NULL_ID() ); if( charges == 0 ) { @@ -2109,8 +2122,8 @@ class jmapgen_toilet : public jmapgen_piece dat.m.place_toilet( r, charges ); } } - bool has_vehicle_collision( const mapgendata &dat, const point &p ) const override { - return dat.m.veh_at( tripoint( p, dat.zlevel() ) ).has_value(); + bool has_vehicle_collision( const mapgendata &dat, const tripoint_rel_ms &p ) const override { + return dat.m.veh_at( tripoint_bub_ms( p.x(), p.y(), dat.zlevel() + p.z() ) ).has_value(); } }; /** @@ -2130,7 +2143,7 @@ class jmapgen_gaspump : public jmapgen_piece } void check( const std::string &oter_name, const mapgen_parameters ¶meters, - const jmapgen_int &/*x*/, const jmapgen_int &/*y*/ + const jmapgen_int &/*x*/, const jmapgen_int &/*y*/, const jmapgen_int &/*z*/ ) const override { fuel.check( oter_name, parameters ); static const std::unordered_set valid_fuels = { @@ -2144,9 +2157,9 @@ class jmapgen_gaspump : public jmapgen_piece } } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, const jmapgen_int &z, const std::string &/*context*/ ) const override { - const point r( x.get(), y.get() ); + const tripoint_bub_ms r( x.get(), y.get(), dat.zlevel() + z.get() ); int charges = amount.get() * 100; dat.m.furn_set( r, furn_str_id::NULL_ID() ); if( charges == 0 ) { @@ -2159,8 +2172,8 @@ class jmapgen_gaspump : public jmapgen_piece dat.m.place_gas_pump( r, charges, chosen_fuel ); } } - bool has_vehicle_collision( const mapgendata &dat, const point &p ) const override { - return dat.m.veh_at( tripoint( p, dat.zlevel() ) ).has_value(); + bool has_vehicle_collision( const mapgendata &dat, const tripoint_rel_ms &p ) const override { + return dat.m.veh_at( tripoint_bub_ms( p.x(), p.y(), dat.zlevel() + p.z() ) ).has_value(); } }; @@ -2181,7 +2194,7 @@ class jmapgen_liquid_item : public jmapgen_piece , liquid( jsi.get_member( "liquid" ) ) , chance( jsi, "chance", 1, 1 ) { } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, const jmapgen_int &z, const std::string &/*context*/ ) const override { if( one_in( chance.get() ) ) { itype_id chosen_id = liquid.get( dat ); @@ -2208,13 +2221,13 @@ 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 ); + tripoint( x.get(), y.get(), dat.zlevel() + z.get() ), newliquid ); } } } void check( const std::string &oter_name, const mapgen_parameters ¶meters, - const jmapgen_int &/*x*/, const jmapgen_int &/*y*/ + const jmapgen_int &/*x*/, const jmapgen_int &/*y*/, const jmapgen_int & /*z*/ ) const override { liquid.check( oter_name, parameters ); } @@ -2235,14 +2248,14 @@ class jmapgen_corpse : public jmapgen_piece , age( time_duration::from_days( jsi.get_int( "age", 0 ) ) ) { } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, const jmapgen_int &z, const std::string &/*context*/ ) const override { const std::vector monster_group = MonsterGroupManager::GetMonstersFromGroup( group, true ); const mtype_id &corpse_type = random_entry_ref( monster_group ); item corpse = item::make_corpse( corpse_type, std::max( calendar::turn - age, calendar::start_of_cataclysm ) ); - dat.m.add_item_or_charges( tripoint( x.get(), y.get(), dat.m.get_abs_sub().z() ), + dat.m.add_item_or_charges( tripoint( x.get(), y.get(), dat.zlevel() + z.get() ), corpse ); } }; @@ -2274,14 +2287,15 @@ class jmapgen_item_group : public jmapgen_piece } } void check( const std::string &context, const mapgen_parameters &, - const jmapgen_int &/*x*/, const jmapgen_int &/*y*/ ) const override { + const jmapgen_int &/*x*/, const jmapgen_int &/*y*/, const jmapgen_int &/*z*/ ) const override { if( !group_id.is_valid() ) { debugmsg( "Invalid item_group_id \"%s\" in %s", group_id.str(), context ); } } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, const jmapgen_int &z, const std::string &/*context*/ ) const override { - dat.m.place_items( group_id, chance.get(), point( x.val, y.val ), point( x.valmax, y.valmax ), true, + dat.m.place_items( group_id, chance.get(), point( x.val, y.val ), point( x.valmax, y.valmax ), + dat.zlevel() + z.get(), true, calendar::start_of_cataclysm, 0, 0, faction ); } }; @@ -2325,7 +2339,7 @@ class jmapgen_loot : public jmapgen_piece result_group.finalize( itype_id::NULL_ID() ); } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, const jmapgen_int &z, const std::string &/*context*/ ) const override { if( rng( 0, 99 ) < chance ) { const Item_spawn_data *const isd = &result_group; @@ -2334,7 +2348,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.zlevel() + z.get() ), spawn ); } } @@ -2360,19 +2374,19 @@ class jmapgen_monster_group : public jmapgen_piece , density( jsi.get_float( "density", -1.0f ) ) , chance( jsi, "chance", 1, 1 ) { } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, const jmapgen_int &z, const std::string &/*context*/ ) const override { mongroup_id chosen_id = id.get( dat ); if( chosen_id.is_null() ) { return; } dat.m.place_spawns( chosen_id, chance.get(), point_bub_ms( x.val, y.val ), - point_bub_ms( x.valmax, y.valmax ), + point_bub_ms( x.valmax, y.valmax ), dat.zlevel() + z.get(), density == -1.0f ? dat.monster_density() : density ); } void check( const std::string &oter_name, const mapgen_parameters ¶meters, - const jmapgen_int &/*x*/, const jmapgen_int &/*y*/ + const jmapgen_int &/*x*/, const jmapgen_int &/*y*/, const jmapgen_int &/*z*/ ) const override { id.check( oter_name, parameters ); } @@ -2458,7 +2472,7 @@ class jmapgen_monster : public jmapgen_piece } void check( const std::string &oter_name, const mapgen_parameters ¶meters, - const jmapgen_int &/*x*/, const jmapgen_int &/*y*/ + const jmapgen_int &/*x*/, const jmapgen_int &/*y*/, const jmapgen_int &/*z*/ ) const override { for( const weighted_object> &id : ids ) { id.obj.check( oter_name, parameters ); @@ -2466,7 +2480,7 @@ class jmapgen_monster : public jmapgen_piece m_id.check( oter_name, parameters ); } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, const jmapgen_int &z, const std::string &/*context*/ ) const override { int raw_odds = chance.get(); @@ -2525,14 +2539,14 @@ class jmapgen_monster : public jmapgen_piece use_pack_size ); for( const MonsterGroupResult &mgr : spawn_details ) { dat.m.add_spawn( mgr.name, spawn_count * pack_size.get(), - { x.get(), y.get(), dat.m.get_abs_sub().z() }, + { x.get(), y.get(), dat.zlevel() + z.get()}, friendly, -1, mission_id, chosen_name, data ); } } else if( ids.is_valid() ) { 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.zlevel() + z.get()}, friendly, -1, mission_id, chosen_name, data ); } } @@ -2592,7 +2606,7 @@ class jmapgen_vehicle : public jmapgen_piece faction = jsi.get_string( "faction" ); } } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, const jmapgen_int &z, const std::string &/*context*/ ) const override { if( !x_in_y( chance.get(), 100 ) ) { return; @@ -2601,7 +2615,7 @@ class jmapgen_vehicle : public jmapgen_piece if( chosen_id.is_null() ) { return; } - tripoint const dst( x.get(), y.get(), dat.m.get_abs_sub().z() ); + tripoint const dst( x.get(), y.get(), dat.zlevel() + z.get() ); vehicle *veh = dat.m.add_vehicle( chosen_id->pick(), dst, random_entry( rotation ), fuel, status ); if( veh && !faction.empty() ) { @@ -2611,12 +2625,12 @@ class jmapgen_vehicle : public jmapgen_piece dat.m.queue_main_cleanup(); } } - bool has_vehicle_collision( const mapgendata &dat, const point &p ) const override { - return dat.m.veh_at( tripoint( p, dat.zlevel() ) ).has_value(); + bool has_vehicle_collision( const mapgendata &dat, const tripoint_rel_ms &p ) const override { + return dat.m.veh_at( tripoint_bub_ms( p.x(), p.y(), dat.zlevel() + p.z() ) ).has_value(); } void check( const std::string &context, const mapgen_parameters ¶meters, - const jmapgen_int &x, const jmapgen_int &y + const jmapgen_int &x, const jmapgen_int &y, const jmapgen_int &/*z*/ ) const override { type.check( context, parameters ); @@ -2772,7 +2786,7 @@ class jmapgen_spawn_item : public jmapgen_piece } repeat = jmapgen_int( jsi, "repeat", 1, 1 ); } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, const jmapgen_int &z, const std::string &/*context*/ ) const override { itype_id chosen_id = type.get( dat ); if( chosen_id.is_null() ) { @@ -2788,13 +2802,13 @@ class jmapgen_spawn_item : public jmapgen_piece const float spawn_rate = get_option( "ITEM_SPAWNRATE" ); int spawn_count = ( c == 100 ) ? 1 : roll_remainder( c * spawn_rate / 100.0f ); for( int i = 0; i < spawn_count; i++ ) { - dat.m.spawn_item( point( x.get(), y.get() ), chosen_id, amount.get(), + dat.m.spawn_item( tripoint( x.get(), y.get(), dat.zlevel() + z.get() ), chosen_id, amount.get(), 0, calendar::start_of_cataclysm, 0, flags, variant, faction ); } } void check( const std::string &oter_name, const mapgen_parameters ¶meters, - const jmapgen_int &/*x*/, const jmapgen_int &/*y*/ + const jmapgen_int &/*x*/, const jmapgen_int &/*y*/, const jmapgen_int &/*z*/ ) const override { type.check( oter_name, parameters ); } @@ -2825,25 +2839,25 @@ class jmapgen_trap : public jmapgen_piece } init( tid ); } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, const jmapgen_int &z, const std::string &/*context*/ ) const override { trap_id chosen_id = id.get( dat ); 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.zlevel() + z.get() ); if( remove ) { dat.m.remove_trap( actual_loc ); } else { dat.m.trap_set( actual_loc, chosen_id ); } } - bool has_vehicle_collision( const mapgendata &dat, const point &p ) const override { - return dat.m.veh_at( tripoint( p, dat.zlevel() ) ).has_value(); + bool has_vehicle_collision( const mapgendata &dat, const tripoint_rel_ms &p ) const override { + return dat.m.veh_at( tripoint_bub_ms( p.x(), p.y(), dat.zlevel() + p.z() ) ).has_value(); } void check( const std::string &oter_name, const mapgen_parameters ¶meters, - const jmapgen_int &/*x*/, const jmapgen_int &/*y*/ + const jmapgen_int &/*x*/, const jmapgen_int &/*y*/, const jmapgen_int &/*z*/ ) const override { id.check( oter_name, parameters ); } @@ -2866,22 +2880,22 @@ class jmapgen_furniture : public jmapgen_piece mapgen_phase phase() const override { return mapgen_phase::furniture; } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, const jmapgen_int &z, const std::string &context ) const override { furn_id chosen_id = id.get( dat ); if( chosen_id.id().is_null() ) { return; } - if( !dat.m.furn_set( point( x.get(), y.get() ), chosen_id ) ) { + if( !dat.m.furn_set( tripoint( x.get(), y.get(), dat.zlevel() + z.get() ), chosen_id ) ) { debugmsg( "Problem setting furniture in %s", context ); } } - bool has_vehicle_collision( const mapgendata &dat, const point &p ) const override { - return dat.m.veh_at( tripoint( p, dat.zlevel() ) ).has_value(); + bool has_vehicle_collision( const mapgendata &dat, const tripoint_rel_ms &p ) const override { + return dat.m.veh_at( tripoint_bub_ms( p.x(), p.y(), dat.zlevel() + p.z() ) ).has_value(); } void check( const std::string &oter_name, const mapgen_parameters ¶meters, - const jmapgen_int &/*x*/, const jmapgen_int &/*y*/ + const jmapgen_int &/*x*/, const jmapgen_int &/*y*/, const jmapgen_int &/*z*/ ) const override { id.check( oter_name, parameters ); } @@ -2909,14 +2923,13 @@ class jmapgen_terrain : public jmapgen_piece return mapgen_phase::terrain; } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, const jmapgen_int &z, const std::string &context ) const override { ter_id chosen_id = id.get( dat ); if( chosen_id.id().is_null() ) { return; } - point p( x.get(), y.get() ); - tripoint tp( p, dat.m.get_abs_sub().z() ); + tripoint p( x.get(), y.get(), dat.zlevel() + z.get() ); ter_id terrain_here = dat.m.ter( p ); const ter_t &chosen_ter = *chosen_id; @@ -2975,7 +2988,7 @@ class jmapgen_terrain : public jmapgen_piece if( is_boring_wall || act_furn == apply_action::act_erase ) { dat.m.furn_clear( p ); // remove sign writing data from the submap - dat.m.delete_signage( tp ); + dat.m.delete_signage( p ); } else if( act_furn == apply_action::act_dismantle ) { int max_recurse = 10; // insurance against infinite looping std::string initial_furn = dat.m.furn( p ) != furn_str_id::NULL_ID() ? dat.m.furn( @@ -3005,22 +3018,22 @@ class jmapgen_terrain : public jmapgen_piece context, dat.terrain_type().id().str(), initial_furn, p.to_string() ); } // remove sign writing data from the submap - dat.m.delete_signage( tp ); + dat.m.delete_signage( p ); } if( is_boring_wall || act_trap == apply_action::act_erase ) { - dat.m.remove_trap( tp ); + dat.m.remove_trap( p ); } else if( act_trap == apply_action::act_dismantle ) { - dat.m.tr_at( tp ).on_disarmed( dat.m, tp ); + dat.m.tr_at( p ).on_disarmed( dat.m, p ); } if( is_boring_wall || act_item == apply_action::act_erase ) { - dat.m.i_clear( tp ); + dat.m.i_clear( p ); } if( chosen_id != terrain_here ) { std::string error; - trap_str_id trap_here = dat.m.tr_at( tp ).id; + trap_str_id trap_here = dat.m.tr_at( p ).id; if( act_furn != apply_action::act_ignore && dat.m.furn( p ) != furn_str_id::NULL_ID() ) { // NOLINTNEXTLINE(cata-translate-string-literal) error = string_format( "furniture was %s", dat.m.furn( p ).id().str() ); @@ -3045,12 +3058,12 @@ class jmapgen_terrain : public jmapgen_piece } dat.m.ter_set( p, chosen_id ); } - bool has_vehicle_collision( const mapgendata &dat, const point &p ) const override { - return dat.m.veh_at( tripoint( p, dat.zlevel() ) ).has_value(); + bool has_vehicle_collision( const mapgendata &dat, const tripoint_rel_ms &p ) const override { + return dat.m.veh_at( tripoint_bub_ms( p.x(), p.y(), dat.zlevel() + p.z() ) ).has_value(); } void check( const std::string &oter_name, const mapgen_parameters ¶meters, - const jmapgen_int &/*x*/, const jmapgen_int &/*y*/ + const jmapgen_int &/*x*/, const jmapgen_int &/*y*/, const jmapgen_int &/*z*/ ) const override { id.check( oter_name, parameters ); } @@ -3066,7 +3079,7 @@ class jmapgen_ter_furn_transform: public jmapgen_piece jmapgen_ter_furn_transform( const JsonObject &jsi, const std::string_view/*context*/ ) : id( jsi.get_member( "transform" ) ) {} - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, const jmapgen_int &z, const std::string &/*context*/ ) const override { ter_furn_transform_id chosen_id = id.get( dat ); if( chosen_id.is_null() ) { @@ -3074,13 +3087,13 @@ class jmapgen_ter_furn_transform: public jmapgen_piece } for( int ix = x.val; ix <= x.valmax; ix++ ) { for( int iy = y.val; iy <= y.valmax; iy++ ) { - chosen_id->transform( dat.m, tripoint_bub_ms( ix, iy, dat.m.get_abs_sub().z() ) ); + chosen_id->transform( dat.m, tripoint_bub_ms( ix, iy, dat.zlevel() + z.get() ) ); } } } void check( const std::string &oter_name, const mapgen_parameters ¶meters, - const jmapgen_int &/*x*/, const jmapgen_int &/*y*/ + const jmapgen_int &/*x*/, const jmapgen_int &/*y*/, const jmapgen_int &/*z*/ ) const override { id.check( oter_name, parameters ); } @@ -3106,7 +3119,7 @@ class jmapgen_make_rubble : public jmapgen_piece } jsi.read( "overwrite", overwrite ); } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, const jmapgen_int &z, const std::string &/*context*/ ) const override { furn_id chosen_rubble_type = rubble_type.get( dat ); ter_id chosen_floor_type = floor_type.get( dat ); @@ -3117,12 +3130,12 @@ class jmapgen_make_rubble : public jmapgen_piece debugmsg( "null floor type when making rubble" ); chosen_floor_type = ter_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.zlevel() + z.get() ), chosen_rubble_type, items, chosen_floor_type, overwrite ); } void check( const std::string &oter_name, const mapgen_parameters ¶meters, - const jmapgen_int &/*x*/, const jmapgen_int &/*y*/ + const jmapgen_int &/*x*/, const jmapgen_int &/*y*/, const jmapgen_int &/*z*/ ) const override { rubble_type.check( oter_name, parameters ); floor_type.check( oter_name, parameters ); @@ -3171,12 +3184,12 @@ class jmapgen_computer : public jmapgen_piece } } } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, const jmapgen_int &z, const std::string &/*context*/ ) const override { - const point r( x.get(), y.get() ); + const tripoint_bub_ms r( x.get(), y.get(), dat.zlevel() + z.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(), + dat.m.add_computer( r.raw(), name.translated(), security ); for( const computer_option &opt : options ) { cpu->add_option( opt ); @@ -3198,8 +3211,8 @@ class jmapgen_computer : public jmapgen_piece cpu->set_access_denied_msg( access_denied.translated() ); } } - bool has_vehicle_collision( const mapgendata &dat, const point &p ) const override { - return dat.m.veh_at( tripoint( p, dat.zlevel() ) ).has_value(); + bool has_vehicle_collision( const mapgendata &dat, const tripoint_rel_ms &p ) const override { + return dat.m.veh_at( tripoint_bub_ms( p.x(), p.y(), dat.zlevel() + p.z() ) ).has_value(); } }; @@ -3230,7 +3243,7 @@ class jmapgen_sealed_item : public jmapgen_piece } void check( const std::string &context, const mapgen_parameters ¶ms, - const jmapgen_int &x, const jmapgen_int &y ) const override { + const jmapgen_int &x, const jmapgen_int &y, const jmapgen_int &z ) const override { std::string short_summary = string_format( "sealed_item special in json mapgen for %s", context ); if( !item_spawner && !item_group_spawner ) { @@ -3261,7 +3274,7 @@ class jmapgen_sealed_item : public jmapgen_piece } if( item_spawner ) { - item_spawner->check( context, params, x, y ); + item_spawner->check( context, params, x, y, z ); int count = item_spawner->amount.get(); if( count != 1 ) { debugmsg( "%s (with flag PLANT) spawns %d items; it should spawn " @@ -3288,7 +3301,7 @@ class jmapgen_sealed_item : public jmapgen_piece } if( item_group_spawner ) { - item_group_spawner->check( context, params, x, y ); + item_group_spawner->check( context, params, x, y, z ); int ig_chance = item_group_spawner->chance.get(); if( ig_chance != 100 ) { debugmsg( "%s (with flag PLANT) spawns item group %s with chance %d. " @@ -3313,7 +3326,7 @@ class jmapgen_sealed_item : public jmapgen_piece } } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, const jmapgen_int &z, const std::string &context ) const override { const int c = chance.get(); @@ -3324,18 +3337,19 @@ class jmapgen_sealed_item : public jmapgen_piece return; } - dat.m.furn_set( point( x.get(), y.get() ), furn_str_id::NULL_ID() ); + dat.m.furn_set( tripoint_bub_ms( x.get(), y.get(), dat.zlevel() + z.get() ), + furn_str_id::NULL_ID() ); if( item_spawner ) { - item_spawner->apply( dat, x, y, context ); + item_spawner->apply( dat, x, y, z, context ); } if( item_group_spawner ) { - item_group_spawner->apply( dat, x, y, context ); + item_group_spawner->apply( dat, x, y, z, context ); } furn_id chosen_furn = furniture.get( dat ); - dat.m.furn_set( point( x.get(), y.get() ), chosen_furn ); + dat.m.furn_set( tripoint_bub_ms( x.get(), y.get(), dat.zlevel() + z.get() ), chosen_furn ); } - bool has_vehicle_collision( const mapgendata &dat, const point &p ) const override { - return dat.m.veh_at( tripoint( p, dat.zlevel() ) ).has_value(); + bool has_vehicle_collision( const mapgendata &dat, const tripoint_rel_ms &p ) const override { + return dat.m.veh_at( tripoint_bub_ms( p.x(), p.y(), dat.zlevel() + p.z() ) ).has_value(); } }; @@ -3362,17 +3376,17 @@ class jmapgen_zone : public jmapgen_piece mapgen_phase phase() const override { return mapgen_phase::zones; } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, const jmapgen_int &z, const std::string &/*context*/ ) const override { zone_type_id chosen_zone_type = zone_type.get( dat ); faction_id chosen_faction = faction.get( dat ); - const tripoint start = dat.m.getabs( tripoint( x.val, y.val, dat.m.get_abs_sub().z() ) ); - const tripoint end = dat.m.getabs( tripoint( x.valmax, y.valmax, dat.m.get_abs_sub().z() ) ); + const tripoint start = dat.m.getabs( tripoint( x.val, y.val, dat.zlevel() + z.get() ) ); + const tripoint end = dat.m.getabs( tripoint( x.valmax, y.valmax, dat.zlevel() + z.get() ) ); mapgen_place_zone( start, end, chosen_zone_type, chosen_faction, name, filter, &dat.m ); } void check( const std::string &oter_name, const mapgen_parameters ¶meters, - const jmapgen_int &/*x*/, const jmapgen_int &/*y*/ + const jmapgen_int &/*x*/, const jmapgen_int &/*y*/, const jmapgen_int &/*z*/ ) const override { zone_type.check( oter_name, parameters ); faction.check( oter_name, parameters ); @@ -3392,10 +3406,10 @@ class jmapgen_variable : public jmapgen_piece mapgen_phase phase() const override { return mapgen_phase::zones; } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, const jmapgen_int &z, const std::string &/*context*/ ) const override { queued_points[name] = dat.m.getglobal( tripoint( x.val, y.val, - dat.m.get_abs_sub().z() ) ); + dat.zlevel() + z.get() ) ); } }; @@ -3414,11 +3428,11 @@ class jmapgen_remove_vehicles : public jmapgen_piece mapgen_phase phase() const override { return mapgen_phase::removal; } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, const jmapgen_int &z, const std::string &/*context*/ ) const override { - const tripoint start( x.val, y.val, dat.zlevel() ); - const tripoint end( x.valmax, y.valmax, dat.zlevel() ); + const tripoint start( x.val, y.val, dat.zlevel() + z.get() ); + const tripoint end( x.valmax, y.valmax, dat.zlevel() + z.get() ); const tripoint_range range = tripoint_range( start, end ); for( const tripoint &p : range ) { if( optional_vpart_position vp = dat.m.veh_at( p ) ) { @@ -3443,9 +3457,12 @@ class jmapgen_remove_npcs : public jmapgen_piece optional( jsi, false, "unique_id", unique_id ); } void apply( const mapgendata &dat, const jmapgen_int & /*x*/, const jmapgen_int & /*y*/, + const jmapgen_int &z, const std::string & /*context*/ ) const override { + tripoint_abs_omt omt_pos = project_to( dat.m.get_abs_sub() ); + omt_pos.z() += z.get(); for( auto const &npc : overmap_buffer.get_npcs_near_omt( - project_to( dat.m.get_abs_sub() ), 0 ) ) { + omt_pos, 0 ) ) { if( !npc->is_dead() && ( npc_class.empty() || npc->idz == string_id( npc_class ) ) && ( unique_id.empty() || unique_id == npc->get_unique_id() ) ) { @@ -3471,11 +3488,11 @@ class jmapgen_remove_all : public jmapgen_piece mapgen_phase phase() const override { return mapgen_phase::removal; } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, const jmapgen_int &z, const std::string &/*context*/ ) const override { - const tripoint start = tripoint( x.val, y.val, dat.zlevel() ); - const tripoint end = tripoint( x.valmax, y.valmax, dat.zlevel() ); + const tripoint start = tripoint( x.val, y.val, dat.zlevel() + z.get() ); + const tripoint end = tripoint( x.valmax, y.valmax, dat.zlevel() + z.get() ); for( const tripoint &p : tripoint_range( start, end ) ) { dat.m.furn_clear( p ); dat.m.i_clear( p ); @@ -3729,7 +3746,7 @@ class jmapgen_nested : public jmapgen_piece , neighbor_flags( jsi.get_object( "flags" ) ) , neighbor_flags_any( jsi.get_object( "flags_any" ) ) , predecessors( jsi.get_array( "predecessors" ) ) - , correct_z_level( jsi.get_array( "z" ) ) { + , correct_z_level( jsi.get_array( "check_z" ) ) { if( jsi.has_member( "chunks" ) ) { load_weighted_list( jsi.get_member( "chunks" ), entries, 100 ); } @@ -3774,7 +3791,7 @@ class jmapgen_nested : public jmapgen_piece return else_entries; } } - void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, const jmapgen_int &z, const std::string &context ) const override { const mapgen_value *val = get_entries( dat ).pick(); if( val == nullptr ) { @@ -3799,10 +3816,10 @@ class jmapgen_nested : public jmapgen_piece return; } - ( *ptr )->nest( dat, point( x.get(), y.get() ), context ); + ( *ptr )->nest( dat, tripoint_rel_ms( x.get(), y.get(), z.get() ), context ); } void check( const std::string &oter_name, const mapgen_parameters ¶meters, - const jmapgen_int &x, const jmapgen_int &y + const jmapgen_int &x, const jmapgen_int &y, const jmapgen_int &z ) const override { for( const weighted_object> &p : entries ) { p.obj.check( oter_name, parameters ); @@ -3866,8 +3883,13 @@ class jmapgen_nested : public jmapgen_piece offending_nest_y.str(), oter_name, y.valmax + max_relative.y, x.val, y.val ); } + if( z.val != z.valmax ) { + debugmsg( "nest %s within %s defines a range for Z level placement, which isn't" + "permitted. Range: %d - %d.", + offending_nest_x.str(), oter_name, z.val, z.valmax ); + } } - bool has_vehicle_collision( const mapgendata &dat, const point &p ) const override { + bool has_vehicle_collision( const mapgendata &dat, const tripoint_rel_ms &p ) const override { const weighted_int_list> &selected_entries = get_entries( dat ); if( selected_entries.empty() ) { @@ -3894,7 +3916,8 @@ class jmapgen_nested : public jmapgen_piece } }; -jmapgen_objects::jmapgen_objects( const point &offset, const point &mapsize, const point &tot_size ) +jmapgen_objects::jmapgen_objects( const tripoint_rel_ms &offset, const point &mapsize, + const point &tot_size ) : m_offset( offset ) , mapgensize( mapsize ) , total_size( tot_size ) @@ -3902,7 +3925,7 @@ jmapgen_objects::jmapgen_objects( const point &offset, const point &mapsize, con bool jmapgen_objects::check_bounds( const jmapgen_place &place, const JsonObject &jso ) { - return common_check_bounds( place.x, place.y, mapgensize, jso ); + return common_check_bounds( place.x, place.y, place.z, mapgensize, jso ); } void jmapgen_objects::add( const jmapgen_place &place, @@ -4169,7 +4192,7 @@ void mapgen_palette::check() const for( const std::pair>> &p : format_placings ) { for( const shared_ptr_fast &j : p.second ) { - j->check( context, parameters, fake_coord, fake_coord ); + j->check( context, parameters, fake_coord, fake_coord, fake_coord ); } } } @@ -4517,7 +4540,7 @@ bool mapgen_function_json_base::setup_common( const JsonObject &jo ) // mandatory: mapgensize rows of mapgensize character lines, each of which must have a // matching key in "terrain", unless fill_ter is set // "rows:" [ "aaaajustlikeinmapgen.cpp", "this.must!be!exactly.24!", "and_must_match_terrain_", .... ] - point expected_dim = mapgensize + m_offset; + point expected_dim = mapgensize + m_offset.xy().raw(); cata_assert( expected_dim.x >= 0 ); cata_assert( expected_dim.y >= 0 ); const std::string default_row( expected_dim.x, ' ' ); @@ -4546,7 +4569,7 @@ bool mapgen_function_json_base::setup_common( const JsonObject &jo ) parameters = palette.get_parameters(); - for( int c = m_offset.y; c < expected_dim.y; c++ ) { + for( int c = m_offset.y(); c < expected_dim.y; c++ ) { const std::string row = default_rows ? default_row : parray.get_string( c ); static std::vector row_keys; row_keys.clear(); @@ -4564,8 +4587,8 @@ bool mapgen_function_json_base::setup_common( const JsonObject &jo ) string_format( "format: row %d must have %d columns, not %d; check mapgensize if applicable", c + 1, total_size.x, row_keys.size() ) ); } - for( int i = m_offset.x; i < expected_dim.x; i++ ) { - const point p = point( i, c ) - m_offset; + for( int i = m_offset.x(); i < expected_dim.x; i++ ) { + const tripoint_rel_ms p = tripoint_rel_ms( i, c, 0 ) - m_offset; const map_key key{ std::string( row_keys[i] ) }; const auto iter_ter = keys_with_terrain.find( key ); const auto fpi = format_placings.find( key ); @@ -4761,7 +4784,7 @@ void jmapgen_objects::check( const std::string &context, const mapgen_parameters for( const jmapgen_obj &obj : objects ) { const jmapgen_place &where = obj.first; const jmapgen_piece &what = *obj.second; - what.check( context, parameters, where.x, where.y ); + what.check( context, parameters, where.x, where.y, where.z ); } } @@ -4835,7 +4858,7 @@ mapgen_phase jmapgen_setmap::phase() const * (set|line|square)_(ter|furn|trap|radiation); simple (x, y, int) or (x1,y1,x2,y2, int) functions * TODO: optimize, though gcc -O2 optimizes enough that splitting the switch has no effect */ -bool jmapgen_setmap::apply( const mapgendata &dat, const point &offset ) const +bool jmapgen_setmap::apply( const mapgendata &dat, const tripoint_rel_ms &offset ) const { if( chance != 1 && !one_in( chance ) ) { return true; @@ -4845,82 +4868,89 @@ bool jmapgen_setmap::apply( const mapgendata &dat, const point &offset ) const return v.get() + offset; }; const auto x_get = [this, &offset]() { - return get( x, offset.x ); + return get( x, offset.x() ); }; const auto y_get = [this, &offset]() { - return get( y, offset.y ); + return get( y, offset.y() ); + }; + const auto z_get = [this, &offset]() { + return get( z, offset.z() ); }; const auto x2_get = [this, &offset]() { - return get( x2, offset.x ); + return get( x2, offset.x() ); }; const auto y2_get = [this, &offset]() { - return get( y2, offset.y ); + return get( y2, offset.y() ); }; map &m = dat.m; const int trepeat = repeat.get(); + const tripoint_bub_ms target_pos( x_get(), y_get(), dat.zlevel() + z_get() ); + const int z_level = dat.zlevel() + z_get(); + for( int i = 0; i < trepeat; i++ ) { switch( op ) { case JMAPGEN_SETMAP_TER: { // TODO: the ter_id should be stored separately and not be wrapped in an jmapgen_int - m.ter_set( point( x_get(), y_get() ), ter_id( val.get() ), + m.ter_set( target_pos, ter_id( val.get() ), dat.has_flag( jmapgen_flags::avoid_creatures ) ); } break; case JMAPGEN_SETMAP_FURN: { // TODO: the furn_id should be stored separately and not be wrapped in an jmapgen_int - m.furn_set( point( x_get(), y_get() ), furn_id( val.get() ), + m.furn_set( target_pos, furn_id( val.get() ), dat.has_flag( jmapgen_flags::avoid_creatures ) ); } break; case JMAPGEN_SETMAP_TRAP: { // TODO: the trap_id should be stored separately and not be wrapped in an jmapgen_int - mtrap_set( &m, point( x_get(), y_get() ), trap_id( val.get() ), + mtrap_set( &m, target_pos, trap_id( val.get() ), dat.has_flag( jmapgen_flags::avoid_creatures ) ); } break; case JMAPGEN_SETMAP_RADIATION: { - m.set_radiation( point( x_get(), y_get() ), val.get() ); + m.set_radiation( target_pos.raw(), val.get() ); } break; case JMAPGEN_SETMAP_TRAP_REMOVE: { - mremove_trap( &m, point( x_get(), y_get() ), trap_id( val.get() ).id() ); + mremove_trap( &m, target_pos, trap_id( val.get() ).id() ); } break; case JMAPGEN_SETMAP_CREATURE_REMOVE: { - Creature *tmp_critter = get_creature_tracker().creature_at( tripoint_abs_ms( m.getabs( tripoint( - x_get(), y_get(), m.get_abs_sub().z() ) ) ), true ); + Creature *tmp_critter = get_creature_tracker().creature_at( tripoint_abs_ms( m.getabs( + target_pos ) ), true ); if( tmp_critter && !tmp_critter->is_avatar() ) { tmp_critter->die( nullptr ); } } break; case JMAPGEN_SETMAP_ITEM_REMOVE: { - m.i_clear( point( x_get(), y_get() ) ); + m.i_clear( target_pos ); } break; case JMAPGEN_SETMAP_FIELD_REMOVE: { - mremove_fields( &m, point( x_get(), y_get() ) ); + mremove_fields( &m, target_pos ); } break; case JMAPGEN_SETMAP_BASH: { - m.bash( tripoint( x_get(), y_get(), m.get_abs_sub().z() ), 9999 ); + m.bash( target_pos.raw(), 9999 ); } break; case JMAPGEN_SETMAP_VARIABLE: { - tripoint point( x_get(), y_get(), m.get_abs_sub().z() ); - queued_points[string_val] = m.getglobal( point ); + queued_points[string_val] = m.getglobal( target_pos ); } break; case JMAPGEN_SETMAP_LINE_TER: { // TODO: the ter_id should be stored separately and not be wrapped in an jmapgen_int m.draw_line_ter( ter_id( val.get() ), point( x_get(), y_get() ), point( x2_get(), y2_get() ), + z_level, dat.has_flag( jmapgen_flags::avoid_creatures ) ); } break; case JMAPGEN_SETMAP_LINE_FURN: { // TODO: the furn_id should be stored separately and not be wrapped in an jmapgen_int m.draw_line_furn( furn_id( val.get() ), point( x_get(), y_get() ), point( x2_get(), y2_get() ), + z_level, dat.has_flag( jmapgen_flags::avoid_creatures ) ); } break; @@ -4929,7 +4959,8 @@ bool jmapgen_setmap::apply( const mapgendata &dat, const point &offset ) const 0 ); for( const point &i : line ) { // TODO: the trap_id should be stored separately and not be wrapped in an jmapgen_int - mtrap_set( &m, i, trap_id( val.get() ), dat.has_flag( jmapgen_flags::avoid_creatures ) ); + mtrap_set( &m, tripoint_bub_ms( i.x, i.y, z_level ), trap_id( val.get() ), + dat.has_flag( jmapgen_flags::avoid_creatures ) ); } } break; @@ -4938,7 +4969,7 @@ bool jmapgen_setmap::apply( const mapgendata &dat, const point &offset ) const 0 ); for( const point &i : line ) { // TODO: the trap_id should be stored separately and not be wrapped in an jmapgen_int - mremove_trap( &m, i, trap_id( val.get() ).id() ); + mremove_trap( &m, tripoint_bub_ms( i.x, i.y, z_level ), trap_id( val.get() ).id() ); } } break; @@ -4947,7 +4978,7 @@ bool jmapgen_setmap::apply( const mapgendata &dat, const point &offset ) const 0 ); for( const point &i : line ) { Creature *tmp_critter = get_creature_tracker().creature_at( tripoint_abs_ms( m.getabs( tripoint( i, - m.get_abs_sub().z() ) ) ), true ); + z_level ) ) ), true ); if( tmp_critter && !tmp_critter->is_avatar() ) { tmp_critter->die( nullptr ); } @@ -4958,7 +4989,7 @@ bool jmapgen_setmap::apply( const mapgendata &dat, const point &offset ) const const std::vector line = line_to( point( x_get(), y_get() ), point( x2_get(), y2_get() ), 0 ); for( const point &i : line ) { - m.i_clear( i ); + m.i_clear( tripoint_bub_ms( i.x, i.y, z_level ) ); } } break; @@ -4966,7 +4997,7 @@ bool jmapgen_setmap::apply( const mapgendata &dat, const point &offset ) const const std::vector line = line_to( point( x_get(), y_get() ), point( x2_get(), y2_get() ), 0 ); for( const point &i : line ) { - mremove_fields( &m, i ); + mremove_fields( &m, tripoint_bub_ms( i.x, i.y, z_level ) ); } } break; @@ -4974,19 +5005,21 @@ bool jmapgen_setmap::apply( const mapgendata &dat, const point &offset ) const const std::vector line = line_to( point( x_get(), y_get() ), point( x2_get(), y2_get() ), 0 ); for( const point &i : line ) { - m.set_radiation( i, static_cast( val.get() ) ); + m.set_radiation( tripoint( i, z_level ), static_cast( val.get() ) ); } } break; case JMAPGEN_SETMAP_SQUARE_TER: { // TODO: the ter_id should be stored separately and not be wrapped in an jmapgen_int m.draw_square_ter( ter_id( val.get() ), point( x_get(), y_get() ), point( x2_get(), y2_get() ), + z_level, dat.has_flag( jmapgen_flags::avoid_creatures ) ); } break; case JMAPGEN_SETMAP_SQUARE_FURN: { // TODO: the furn_id should be stored separately and not be wrapped in an jmapgen_int m.draw_square_furn( furn_id( val.get() ), point( x_get(), y_get() ), point( x2_get(), y2_get() ), + z_level, dat.has_flag( jmapgen_flags::avoid_creatures ) ); } break; @@ -4997,7 +5030,7 @@ bool jmapgen_setmap::apply( const mapgendata &dat, const point &offset ) const for( int tx = c.x; tx <= cx2; tx++ ) { for( int ty = c.y; ty <= cy2; ty++ ) { // TODO: the trap_id should be stored separately and not be wrapped in an jmapgen_int - mtrap_set( &m, point( tx, ty ), trap_id( val.get() ), + mtrap_set( &m, tripoint_bub_ms( tx, ty, z_level ), trap_id( val.get() ), dat.has_flag( jmapgen_flags::avoid_creatures ) ); } } @@ -5010,7 +5043,7 @@ bool jmapgen_setmap::apply( const mapgendata &dat, const point &offset ) const for( int tx = c.x; tx <= cx2; tx++ ) { for( int ty = c.y; ty <= cy2; ty++ ) { // TODO: the trap_id should be stored separately and not be wrapped in an jmapgen_int - mremove_trap( &m, point( tx, ty ), trap_id( val.get() ).id() ); + mremove_trap( &m, tripoint_bub_ms( tx, ty, z_level ), trap_id( val.get() ).id() ); } } } @@ -5022,7 +5055,7 @@ bool jmapgen_setmap::apply( const mapgendata &dat, const point &offset ) const for( int tx = c.x; tx <= cx2; tx++ ) { for( int ty = c.y; ty <= cy2; ty++ ) { Creature *tmp_critter = get_creature_tracker().creature_at( tripoint_abs_ms( m.getabs( tripoint( tx, - ty, m.get_abs_sub().z() ) ) ), true ); + ty, z_level ) ) ), true ); if( tmp_critter && !tmp_critter->is_avatar() ) { tmp_critter->die( nullptr ); } @@ -5036,7 +5069,7 @@ bool jmapgen_setmap::apply( const mapgendata &dat, const point &offset ) const const int cy2 = y2_get(); for( int tx = c.x; tx <= cx2; tx++ ) { for( int ty = c.y; ty <= cy2; ty++ ) { - m.i_clear( point( tx, ty ) ); + m.i_clear( tripoint_bub_ms( tx, ty, z_level ) ); } } } @@ -5047,7 +5080,7 @@ bool jmapgen_setmap::apply( const mapgendata &dat, const point &offset ) const const int cy2 = y2_get(); for( int tx = c.x; tx <= cx2; tx++ ) { for( int ty = c.y; ty <= cy2; ty++ ) { - mremove_fields( &m, point( tx, ty ) ); + mremove_fields( &m, tripoint_bub_ms( tx, ty, z_level ) ); } } } @@ -5058,7 +5091,7 @@ bool jmapgen_setmap::apply( const mapgendata &dat, const point &offset ) const const int cy2 = y2_get(); for( int tx = c2.x; tx <= cx2; tx++ ) { for( int ty = c2.y; ty <= cy2; ty++ ) { - m.set_radiation( point( tx, ty ), static_cast( val.get() ) ); + m.set_radiation( tripoint( tx, ty, z_level ), static_cast( val.get() ) ); } } } @@ -5072,25 +5105,29 @@ bool jmapgen_setmap::apply( const mapgendata &dat, const point &offset ) const return true; } -bool jmapgen_setmap::has_vehicle_collision( const mapgendata &dat, const point &offset ) const +bool jmapgen_setmap::has_vehicle_collision( const mapgendata &dat, + const tripoint_rel_ms &offset ) const { static const auto get = []( const jmapgen_int & v, int v_offset ) { return v.get() + v_offset; }; const auto x_get = [this, &offset]() { - return get( x, offset.x ); + return get( x, offset.x() ); }; const auto y_get = [this, &offset]() { - return get( y, offset.y ); + return get( y, offset.y() ); + }; + const auto z_get = [this, &offset]() { + return get( z, offset.z() ); }; const auto x2_get = [this, &offset]() { - return get( x2, offset.x ); + return get( x2, offset.x() ); }; const auto y2_get = [this, &offset]() { - return get( y2, offset.y ); + return get( y2, offset.y() ); }; - const tripoint start = tripoint( x_get(), y_get(), 0 ); - tripoint end = start; + const tripoint_rel_ms start = tripoint_rel_ms( x_get(), y_get(), dat.zlevel() + z_get() ); + tripoint_rel_ms end = start; switch( op ) { case JMAPGEN_SETMAP_TER: case JMAPGEN_SETMAP_FURN: @@ -5107,14 +5144,14 @@ bool jmapgen_setmap::has_vehicle_collision( const mapgendata &dat, const point & case JMAPGEN_SETMAP_SQUARE_TRAP: case JMAPGEN_SETMAP_SQUARE_TRAP_REMOVE: case JMAPGEN_SETMAP_SQUARE_ITEM_REMOVE: - end.x = x2_get(); - end.y = y2_get(); + end.x() = x2_get(); + end.y() = y2_get(); break; /* if it's not a terrain, furniture, or trap, it can't collide */ default: return false; } - for( const tripoint &p : dat.m.points_in_rectangle( start, end ) ) { + for( const tripoint &p : dat.m.points_in_rectangle( start.raw(), end.raw() ) ) { if( dat.m.veh_at( p ) ) { return true; } @@ -5123,7 +5160,7 @@ bool jmapgen_setmap::has_vehicle_collision( const mapgendata &dat, const point & } bool mapgen_function_json_base::has_vehicle_collision( - const mapgendata &dat, const point &offset ) const + const mapgendata &dat, const tripoint_rel_ms &offset ) const { for( const jmapgen_setmap &elem : setmap_points ) { if( elem.has_vehicle_collision( dat, offset ) ) { @@ -5136,7 +5173,7 @@ bool mapgen_function_json_base::has_vehicle_collision( static bool apply_mapgen_in_phases( const mapgendata &md, const std::vector &setmap_points, - const jmapgen_objects &objects, const point &offset, const std::string &context, + const jmapgen_objects &objects, const tripoint_rel_ms &offset, const std::string &context, bool verify = false ) { if( verify && objects.has_vehicle_collision( md, offset ) ) { @@ -5221,7 +5258,8 @@ void mapgen_function_json::generate( mapgendata &md ) mapgendata md_with_params( md, get_args( md, mapgen_parameter_scope::omt ), flags_ ); - apply_mapgen_in_phases( md_with_params, setmap_points, objects, point_zero, context_ ); + apply_mapgen_in_phases( md_with_params, setmap_points, objects, tripoint_rel_ms( tripoint_zero ), + context_ ); m->rotate( rotation.get() ); @@ -5241,7 +5279,7 @@ mapgen_parameters mapgen_function_json::get_mapgen_params( mapgen_parameter_scop return parameters.params_for_scope( scope ); } -void mapgen_function_json_nested::nest( const mapgendata &md, const point &offset, +void mapgen_function_json_nested::nest( const mapgendata &md, const tripoint_rel_ms &offset, const std::string &outer_context ) const { // TODO: Make rotation work for submaps, then pass this value into elem & objects apply. @@ -5261,10 +5299,11 @@ void mapgen_function_json_nested::nest( const mapgendata &md, const point &offse void jmapgen_objects::apply( const mapgendata &dat, mapgen_phase phase, const std::string &context ) const { - apply( dat, phase, point_zero, context ); + apply( dat, phase, tripoint_rel_ms( tripoint_zero ), context ); } -void jmapgen_objects::apply( const mapgendata &dat, mapgen_phase phase, const point &offset, +void jmapgen_objects::apply( const mapgendata &dat, mapgen_phase phase, + const tripoint_rel_ms &offset, const std::string &context ) const { bool terrain_resolved = false; @@ -5274,7 +5313,7 @@ void jmapgen_objects::apply( const mapgendata &dat, mapgen_phase phase, const po for( auto it = range_at_phase.first; it != range_at_phase.second; ++it ) { const jmapgen_obj &obj = *it; jmapgen_place where = obj.first; - where.offset( -offset ); + where.offset( tripoint_rel_ms( -offset.raw() ) ); const jmapgen_piece &what = *obj.second; cata_assert( what.phase() == phase ); @@ -5292,18 +5331,20 @@ void jmapgen_objects::apply( const mapgendata &dat, mapgen_phase phase, const po // into the what and where in some cases--we just need the greater value of the two. const int repeat = std::max( where.repeat.get(), what.repeat.get() ); for( int i = 0; i < repeat; i++ ) { - what.apply( dat, where.x, where.y, context ); + what.apply( dat, where.x, where.y, where.z, context ); } } } -bool jmapgen_objects::has_vehicle_collision( const mapgendata &dat, const point &offset ) const +bool jmapgen_objects::has_vehicle_collision( const mapgendata &dat, + const tripoint_rel_ms &offset ) const { for( const jmapgen_obj &obj : objects ) { jmapgen_place where = obj.first; - where.offset( -offset ); + where.offset( tripoint_rel_ms( - offset.raw() ) ); const auto &what = *obj.second; - if( what.has_vehicle_collision( dat, point( where.x.get(), where.y.get() ) ) ) { + if( what.has_vehicle_collision( dat, tripoint_rel_ms( where.x.get(), where.y.get(), + where.z.get() ) ) ) { return true; } } @@ -5427,7 +5468,8 @@ void map::draw_lab( mapgendata &dat ) science_room( this, point( 2, 2 ), point( SEEX - 3, SEEY * 2 - 3 ), dat.zlevel(), 1 ); science_room( this, point( SEEX + 2, 2 ), point( SEEX * 2 - 3, SEEY * 2 - 3 ), dat.zlevel(), 3 ); - place_spawns( GROUP_TURRET, 1, point_bub_ms( SEEX, 5 ), point_bub_ms( SEEX, 5 ), 1, true ); + place_spawns( GROUP_TURRET, 1, point_bub_ms( SEEX, 5 ), point_bub_ms( SEEX, 5 ), dat.zlevel(), 1, + true ); if( dat.east()->get_type_id() == oter_type_road ) { rotate( 1 ); @@ -5545,21 +5587,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 ), furn_str_id::NULL_ID() ); - i_clear( tripoint( 23, i, get_abs_sub().z() ) ); + i_clear( tripoint( 23, i, dat.zlevel() ) ); ter_set( point( i, 23 ), bw_type ); furn_set( point( i, 23 ), furn_str_id::NULL_ID() ); - i_clear( tripoint( i, 23, get_abs_sub().z() ) ); + i_clear( tripoint( i, 23, dat.zlevel() ) ); if( lw == 2 ) { ter_set( point( 0, i ), lw_type ); furn_set( point( 0, i ), furn_str_id::NULL_ID() ); - i_clear( tripoint( 0, i, get_abs_sub().z() ) ); + i_clear( tripoint( 0, i, dat.zlevel() ) ); } if( tw == 2 ) { ter_set( point( i, 0 ), tw_type ); furn_set( point( i, 0 ), furn_str_id::NULL_ID() ); - i_clear( tripoint( i, 0, get_abs_sub().z() ) ); + i_clear( tripoint( i, 0, dat.zlevel() ) ); } } if( rw != 2 ) { @@ -5854,7 +5896,7 @@ void map::draw_lab( mapgendata &dat ) if( tower_lab ) { place_spawns( GROUP_LAB, 1, point_bub_ms( point_zero ), point_bub_ms( EAST_EDGE, SOUTH_EDGE ), - abs_sub.z() * 0.02f ); + abs_sub.z(), 0.02f ); } // Lab special effects. @@ -6010,7 +6052,7 @@ void map::draw_lab( mapgendata &dat ) furn_set( center.xy(), furn_str_id::NULL_ID() ); trap_set( center, tr_portal ); place_spawns( GROUP_FUNGI_FUNGALOID, 1, center.xy() + point( -2, -2 ), - center.xy() + point( 2, 2 ), 1, true ); + center.xy() + point( 2, 2 ), center.z(), 1, true ); break; } @@ -6058,21 +6100,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 ), furn_str_id::NULL_ID() ); - i_clear( tripoint( 23, i, get_abs_sub().z() ) ); + i_clear( tripoint( 23, i, dat.zlevel() ) ); ter_set( point( i, 23 ), bw_type ); furn_set( point( i, 23 ), furn_str_id::NULL_ID() ); - i_clear( tripoint( i, 23, get_abs_sub().z() ) ); + i_clear( tripoint( i, 23, dat.zlevel() ) ); if( lw == 2 ) { ter_set( point( 0, i ), lw_type ); furn_set( point( 0, i ), furn_str_id::NULL_ID() ); - i_clear( tripoint( 0, i, get_abs_sub().z() ) ); + i_clear( tripoint( 0, i, dat.zlevel() ) ); } if( tw == 2 ) { ter_set( point( i, 0 ), tw_type ); furn_set( point( i, 0 ), furn_str_id::NULL_ID() ); - i_clear( tripoint( i, 0, get_abs_sub().z() ) ); + i_clear( tripoint( i, 0, dat.zlevel() ) ); } } if( rw != 2 ) { @@ -6111,22 +6153,26 @@ void map::draw_lab( mapgendata &dat ) case 1: case 2: loot_variant = rng( 1, 100 ); //The variants have a 67/22/7/4 split. - place_spawns( GROUP_ROBOT_SECUBOT, 1, point_bub_ms( 6, 6 ), point_bub_ms( 6, 6 ), 1, true ); + place_spawns( GROUP_ROBOT_SECUBOT, 1, point_bub_ms( 6, 6 ), point_bub_ms( 6, 6 ), abs_sub.z(), 1, + true ); place_spawns( GROUP_ROBOT_SECUBOT, 1, point_bub_ms( SEEX * 2 - 7, 6 ), - point_bub_ms( SEEX * 2 - 7, 6 ), 1, true ); + point_bub_ms( SEEX * 2 - 7, 6 ), abs_sub.z(), 1, true ); place_spawns( GROUP_ROBOT_SECUBOT, 1, point_bub_ms( 6, SEEY * 2 - 7 ), - point_bub_ms( 6, SEEY * 2 - 7 ), 1, true ); + point_bub_ms( 6, SEEY * 2 - 7 ), abs_sub.z(), 1, true ); place_spawns( GROUP_ROBOT_SECUBOT, 1, point_bub_ms( SEEX * 2 - 7, SEEY * 2 - 7 ), - point_bub_ms( SEEX * 2 - 7, SEEY * 2 - 7 ), 1, true ); + point_bub_ms( SEEX * 2 - 7, SEEY * 2 - 7 ), abs_sub.z(), 1, true ); spawn_item( point( SEEX - 4, SEEY - 2 ), "id_science" ); if( loot_variant <= 96 ) { - mtrap_set( this, point( SEEX - 3, SEEY - 3 ), tr_dissector ); - mtrap_set( this, point( SEEX + 2, SEEY - 3 ), tr_dissector ); - mtrap_set( this, point( SEEX - 3, SEEY + 2 ), tr_dissector ); - mtrap_set( this, point( SEEX + 2, SEEY + 2 ), tr_dissector ); - line( this, ter_t_reinforced_glass, point( SEEX + 1, SEEY + 1 ), point( SEEX - 2, SEEY + 1 ) ); - line( this, ter_t_reinforced_glass, point( SEEX - 2, SEEY ), point( SEEX - 2, SEEY - 2 ) ); - line( this, ter_t_reinforced_glass, point( SEEX - 1, SEEY - 2 ), point( SEEX + 1, SEEY - 2 ) ); + mtrap_set( this, tripoint_bub_ms( SEEX - 3, SEEY - 3, dat.zlevel() ), tr_dissector ); + mtrap_set( this, tripoint_bub_ms( SEEX + 2, SEEY - 3, dat.zlevel() ), tr_dissector ); + mtrap_set( this, tripoint_bub_ms( SEEX - 3, SEEY + 2, dat.zlevel() ), tr_dissector ); + mtrap_set( this, tripoint_bub_ms( SEEX + 2, SEEY + 2, dat.zlevel() ), tr_dissector ); + line( this, ter_t_reinforced_glass, point( SEEX + 1, SEEY + 1 ), point( SEEX - 2, SEEY + 1 ), + dat.zlevel() ); + line( this, ter_t_reinforced_glass, point( SEEX - 2, SEEY ), point( SEEX - 2, SEEY - 2 ), + dat.zlevel() ); + line( this, ter_t_reinforced_glass, point( SEEX - 1, SEEY - 2 ), point( SEEX + 1, SEEY - 2 ), + dat.zlevel() ); ter_set( point( SEEX + 1, SEEY - 1 ), ter_t_reinforced_glass ); ter_set( point( SEEX + 1, SEEY ), ter_t_reinforced_door_glass_c ); furn_set( point( SEEX - 1, SEEY - 1 ), furn_f_table ); @@ -6152,10 +6198,10 @@ void map::draw_lab( mapgendata &dat ) spawn_item( point( SEEX, SEEY ), "recipe_caseless" ); } } else { // 4% of the lab ends will be this weapons testing end. - mtrap_set( this, point( SEEX - 4, SEEY - 3 ), tr_dissector ); - mtrap_set( this, point( SEEX + 3, SEEY - 3 ), tr_dissector ); - mtrap_set( this, point( SEEX - 4, SEEY + 2 ), tr_dissector ); - mtrap_set( this, point( SEEX + 3, SEEY + 2 ), tr_dissector ); + mtrap_set( this, tripoint_bub_ms( SEEX - 4, SEEY - 3, dat.zlevel() ), tr_dissector ); + mtrap_set( this, tripoint_bub_ms( SEEX + 3, SEEY - 3, dat.zlevel() ), tr_dissector ); + mtrap_set( this, tripoint_bub_ms( SEEX - 4, SEEY + 2, dat.zlevel() ), tr_dissector ); + mtrap_set( this, tripoint_bub_ms( SEEX + 3, SEEY + 2, dat.zlevel() ), tr_dissector ); furn_set( point( SEEX - 2, SEEY - 1 ), furn_f_rack ); furn_set( point( SEEX - 1, SEEY - 1 ), furn_f_rack ); @@ -6166,17 +6212,19 @@ void map::draw_lab( mapgendata &dat ) furn_set( point( SEEX, SEEY ), furn_f_rack ); furn_set( point( SEEX + 1, SEEY ), furn_f_rack ); line( this, ter_t_reinforced_door_glass_c, point( SEEX - 2, SEEY - 2 ), - point( SEEX + 1, SEEY - 2 ) ); + point( SEEX + 1, SEEY - 2 ), dat.zlevel() ); line( this, ter_t_reinforced_door_glass_c, point( SEEX - 2, SEEY + 1 ), - point( SEEX + 1, SEEY + 1 ) ); - line( this, ter_t_reinforced_glass, point( SEEX - 3, SEEY - 2 ), point( SEEX - 3, SEEY + 1 ) ); - line( this, ter_t_reinforced_glass, point( SEEX + 2, SEEY - 2 ), point( SEEX + 2, SEEY + 1 ) ); + point( SEEX + 1, SEEY + 1 ), dat.zlevel() ); + line( this, ter_t_reinforced_glass, point( SEEX - 3, SEEY - 2 ), point( SEEX - 3, SEEY + 1 ), + dat.zlevel() ); + line( this, ter_t_reinforced_glass, point( SEEX + 2, SEEY - 2 ), point( SEEX + 2, SEEY + 1 ), + dat.zlevel() ); place_items( Item_spawn_data_ammo_rare, 96, point( SEEX - 2, SEEY - 1 ), - point( SEEX + 1, SEEY - 1 ), false, + point( SEEX + 1, SEEY - 1 ), abs_sub.z(), false, calendar::start_of_cataclysm ); place_items( Item_spawn_data_guns_rare, 96, point( SEEX - 2, SEEY ), - point( SEEX + 1, SEEY ), false, + point( SEEX + 1, SEEY ), abs_sub.z(), false, calendar::start_of_cataclysm ); spawn_item( point( SEEX + 1, SEEY ), "plut_cell", rng( 1, 10 ) ); } @@ -6201,7 +6249,7 @@ void map::draw_lab( mapgendata &dat ) } else if( ( i - lw ) % 2 == 0 || j == tw + 2 ) { ter_set( point( i, j ), ter_t_concrete_wall ); } else { // Empty space holds monsters! - place_spawns( GROUP_NETHER, 1, point_bub_ms( i, j ), point_bub_ms( i, j ), 1, true ); + place_spawns( GROUP_NETHER, 1, point_bub_ms( i, j ), point_bub_ms( i, j ), abs_sub.z(), 1, true ); } } } @@ -6229,29 +6277,34 @@ void map::draw_lab( mapgendata &dat ) // Bionics case 4: { - place_spawns( GROUP_ROBOT_SECUBOT, 1, point_bub_ms( 6, 6 ), point_bub_ms( 6, 6 ), 1, true ); + place_spawns( GROUP_ROBOT_SECUBOT, 1, point_bub_ms( 6, 6 ), point_bub_ms( 6, 6 ), abs_sub.z(), 1, + true ); place_spawns( GROUP_ROBOT_SECUBOT, 1, point_bub_ms( SEEX * 2 - 7, 6 ), - point_bub_ms( SEEX * 2 - 7, 6 ), 1, true ); + point_bub_ms( SEEX * 2 - 7, 6 ), abs_sub.z(), 1, true ); place_spawns( GROUP_ROBOT_SECUBOT, 1, point_bub_ms( 6, SEEY * 2 - 7 ), - point_bub_ms( 6, SEEY * 2 - 7 ), 1, true ); + point_bub_ms( 6, SEEY * 2 - 7 ), abs_sub.z(), 1, true ); place_spawns( GROUP_ROBOT_SECUBOT, 1, point_bub_ms( SEEX * 2 - 7, SEEY * 2 - 7 ), - point_bub_ms( SEEX * 2 - 7, SEEY * 2 - 7 ), 1, true ); - mtrap_set( this, point( SEEX - 2, SEEY - 2 ), tr_dissector ); - mtrap_set( this, point( SEEX + 1, SEEY - 2 ), tr_dissector ); - mtrap_set( this, point( SEEX - 2, SEEY + 1 ), tr_dissector ); - mtrap_set( this, point( SEEX + 1, SEEY + 1 ), tr_dissector ); + point_bub_ms( SEEX * 2 - 7, SEEY * 2 - 7 ), abs_sub.z(), 1, true ); + mtrap_set( this, tripoint_bub_ms( SEEX - 2, SEEY - 2, dat.zlevel() ), tr_dissector ); + mtrap_set( this, tripoint_bub_ms( SEEX + 1, SEEY - 2, dat.zlevel() ), tr_dissector ); + mtrap_set( this, tripoint_bub_ms( SEEX - 2, SEEY + 1, dat.zlevel() ), tr_dissector ); + mtrap_set( this, tripoint_bub_ms( SEEX + 1, SEEY + 1, dat.zlevel() ), tr_dissector ); square_furn( this, furn_f_counter, point( SEEX - 1, SEEY - 1 ), point( SEEX, SEEY ) ); int item_count = 0; while( item_count < 5 ) { item_count += place_items( Item_spawn_data_bionics, 75, point( SEEX - 1, SEEY - 1 ), - point( SEEX, SEEY ), false, calendar::start_of_cataclysm ).size(); + point( SEEX, SEEY ), abs_sub.z(), false, calendar::start_of_cataclysm ).size(); } - line( this, ter_t_reinforced_glass, point( SEEX - 2, SEEY - 2 ), point( SEEX + 1, SEEY - 2 ) ); - line( this, ter_t_reinforced_glass, point( SEEX - 2, SEEY + 1 ), point( SEEX + 1, SEEY + 1 ) ); - line( this, ter_t_reinforced_glass, point( SEEX - 2, SEEY - 1 ), point( SEEX - 2, SEEY ) ); - line( this, ter_t_reinforced_glass, point( SEEX + 1, SEEY - 1 ), point( SEEX + 1, SEEY ) ); + line( this, ter_t_reinforced_glass, point( SEEX - 2, SEEY - 2 ), point( SEEX + 1, SEEY - 2 ), + dat.zlevel() ); + line( this, ter_t_reinforced_glass, point( SEEX - 2, SEEY + 1 ), point( SEEX + 1, SEEY + 1 ), + dat.zlevel() ); + line( this, ter_t_reinforced_glass, point( SEEX - 2, SEEY - 1 ), point( SEEX - 2, SEEY ), + dat.zlevel() ); + line( this, ter_t_reinforced_glass, point( SEEX + 1, SEEY - 1 ), point( SEEX + 1, SEEY ), + dat.zlevel() ); 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() ), @@ -6267,17 +6320,18 @@ void map::draw_lab( mapgendata &dat ) // CVD Forge case 5: - place_spawns( GROUP_ROBOT_SECUBOT, 1, point_bub_ms( 6, 6 ), point_bub_ms( 6, 6 ), 1, true ); + place_spawns( GROUP_ROBOT_SECUBOT, 1, point_bub_ms( 6, 6 ), point_bub_ms( 6, 6 ), dat.zlevel(), 1, + true ); place_spawns( GROUP_ROBOT_SECUBOT, 1, point_bub_ms( SEEX * 2 - 7, 6 ), - point_bub_ms( SEEX * 2 - 7, 6 ), 1, true ); + point_bub_ms( SEEX * 2 - 7, 6 ), dat.zlevel(), 1, true ); place_spawns( GROUP_ROBOT_SECUBOT, 1, point_bub_ms( 6, SEEY * 2 - 7 ), - point_bub_ms( 6, SEEY * 2 - 7 ), 1, true ); + point_bub_ms( 6, SEEY * 2 - 7 ), dat.zlevel(), 1, true ); place_spawns( GROUP_ROBOT_SECUBOT, 1, point_bub_ms( SEEX * 2 - 7, SEEY * 2 - 7 ), - point_bub_ms( SEEX * 2 - 7, SEEY * 2 - 7 ), 1, true ); - line( this, ter_t_cvdbody, point( SEEX - 2, SEEY - 2 ), point( SEEX - 2, SEEY + 1 ) ); - line( this, ter_t_cvdbody, point( SEEX - 1, SEEY - 2 ), point( SEEX - 1, SEEY + 1 ) ); - line( this, ter_t_cvdbody, point( SEEX, SEEY - 1 ), point( SEEX, SEEY + 1 ) ); - line( this, ter_t_cvdbody, point( SEEX + 1, SEEY - 2 ), point( SEEX + 1, SEEY + 1 ) ); + point_bub_ms( SEEX * 2 - 7, SEEY * 2 - 7 ), dat.zlevel(), 1, true ); + line( this, ter_t_cvdbody, point( SEEX - 2, SEEY - 2 ), point( SEEX - 2, SEEY + 1 ), dat.zlevel() ); + line( this, ter_t_cvdbody, point( SEEX - 1, SEEY - 2 ), point( SEEX - 1, SEEY + 1 ), dat.zlevel() ); + line( this, ter_t_cvdbody, point( SEEX, SEEY - 1 ), point( SEEX, SEEY + 1 ), dat.zlevel() ); + line( this, ter_t_cvdbody, point( SEEX + 1, SEEY - 2 ), point( SEEX + 1, SEEY + 1 ), dat.zlevel() ); ter_set( point( SEEX, SEEY - 2 ), ter_t_cvdmachine ); spawn_item( point( SEEX, SEEY - 3 ), "id_science" ); break; @@ -6366,19 +6420,22 @@ void map::draw_slimepit( const mapgendata &dat ) // Align the stairs ter_set( point( 7, 9 ), ter_t_slope_up ); } - place_spawns( GROUP_SLIME, 1, point_bub_ms( SEEX, SEEY ), point_bub_ms( SEEX, SEEY ), 0.15 ); - place_items( Item_spawn_data_sewer, 40, point_zero, point( EAST_EDGE, SOUTH_EDGE ), true, + place_spawns( GROUP_SLIME, 1, point_bub_ms( SEEX, SEEY ), point_bub_ms( SEEX, SEEY ), dat.zlevel(), + 0.15 ); + place_items( Item_spawn_data_sewer, 40, tripoint_zero, tripoint( EAST_EDGE, SOUTH_EDGE, + dat.zlevel() ), true, calendar::start_of_cataclysm ); } } void map::place_spawns( const mongroup_id &group, const int chance, - const point_bub_ms &p1, const point_bub_ms &p2, const float density, + const point_bub_ms &p1, const point_bub_ms &p2, const int z_level, const float density, const bool individual, const bool friendly, const std::optional &name, const int mission_id ) { if( !group.is_valid() ) { - const tripoint_abs_omt omt = project_to( get_abs_sub() ); + tripoint_abs_omt omt = project_to( get_abs_sub() ); + omt.z() = z_level; 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() ); @@ -6423,28 +6480,29 @@ void map::place_spawns( const mongroup_id &group, const int chance, } } -void map::place_gas_pump( const point &p, int charges, const itype_id &fuel_type ) +void map::place_gas_pump( const tripoint_bub_ms &p, int charges, const itype_id &fuel_type ) { item fuel( fuel_type, calendar::start_of_cataclysm ); fuel.charges = charges; - add_item( p, fuel ); + add_item( p.raw(), fuel ); ter_set( p, ter_id( fuel.fuel_pump_terrain() ) ); } -void map::place_gas_pump( const point &p, int charges ) +void map::place_gas_pump( const tripoint_bub_ms &p, int charges ) { place_gas_pump( p, charges, one_in( 4 ) ? itype_diesel : itype_gasoline ); } -void map::place_toilet( const point &p, int charges ) +void map::place_toilet( const tripoint_bub_ms &p, int charges ) { item water( "water", calendar::start_of_cataclysm ); water.charges = charges; - add_item( p, water ); + add_item( p.raw(), water ); furn_set( p, furn_f_toilet ); } -void map::place_vending( const point &p, const item_group_id &type, bool reinforced, bool lootable ) +void map::place_vending( const tripoint_bub_ms &p, const item_group_id &type, bool reinforced, + bool lootable ) { if( reinforced ) { furn_set( p, furn_f_vending_reinforced ); @@ -6455,7 +6513,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, furn_f_vending_o ); - for( const tripoint &loc : points_in_radius( { p, abs_sub.z() }, 1 ) ) { + for( const tripoint &loc : points_in_radius( p.raw(), 1 ) ) { if( one_in( 4 ) ) { spawn_item( loc, "glass_shard", rng( 1, 25 ) ); } @@ -6911,7 +6969,7 @@ void map::rotate( int turns, const bool setpos_safe ) 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() && !zlevels ) ) { continue; } @@ -6946,85 +7004,91 @@ void map::rotate( int turns, const bool setpos_safe ) } clear_vehicle_level_caches(); - clear_vehicle_list( abs_sub.z() ); - - submap *pz = get_submap_at_grid( point_zero ); - submap *pse = get_submap_at_grid( point_south_east ); - submap *pe = get_submap_at_grid( point_east ); - submap *ps = get_submap_at_grid( point_south ); - if( pz == nullptr || pse == nullptr || pe == nullptr || ps == nullptr ) { - debugmsg( "Tried to rotate map at (%d,%d) but the submap is not loaded", point_zero.x, - point_zero.y ); - return; - } - // Move the submaps around. - if( turns == 2 ) { - std::swap( *pz, *pse ); - std::swap( *pe, *ps ); - } else { - point p; - submap tmp; + // rotate zones + zone_manager &mgr = zone_manager::get_manager(); + mgr.rotate_zones( *this, turns ); - std::swap( *pse, tmp ); + const int bottom_level = zlevels ? -OVERMAP_DEPTH : abs_sub.z(); + const int top_level = zlevels ? OVERMAP_HEIGHT : abs_sub.z(); - for( int k = 0; k < 4; ++k ) { - p = p.rotate( turns, { 2, 2 } ); - point tmpp = point_south_east - p; - submap *psep = get_submap_at_grid( tmpp ); - if( psep == nullptr ) { - debugmsg( "Tried to rotate map at (%d,%d) but the submap is not loaded", tmpp.x, tmpp.y ); - continue; - } - std::swap( *psep, tmp ); + for( int z_level = bottom_level; z_level <= top_level; z_level++ ) { + clear_vehicle_list( z_level ); + + submap *pz = get_submap_at_grid( tripoint( point_zero, z_level ) ); + submap *pse = get_submap_at_grid( tripoint( point_south_east, z_level ) ); + submap *pe = get_submap_at_grid( tripoint( point_east, z_level ) ); + submap *ps = get_submap_at_grid( tripoint( point_south, z_level ) ); + if( pz == nullptr || pse == nullptr || pe == nullptr || ps == nullptr ) { + debugmsg( "Tried to rotate map at (%d,%d) but the submap is not loaded", point_zero.x, + point_zero.y ); + return; } - } - // Then rotate them and recalculate vehicle positions. - for( int j = 0; j < 2; ++j ) { - for( int i = 0; i < 2; ++i ) { - point p( i, j ); - submap *sm = get_submap_at_grid( p ); - if( sm == nullptr ) { - debugmsg( "Tried to rotate map at (%d,%d) but the submap is not loaded", p.x, p.y ); - continue; - } + // Move the submaps around. + if( turns == 2 ) { + std::swap( *pz, *pse ); + std::swap( *pe, *ps ); + } else { + point p; + submap tmp; - sm->rotate( turns ); + std::swap( *pse, tmp ); - for( auto &veh : sm->vehicles ) { - veh->sm_pos = tripoint( p, abs_sub.z() ); + for( int k = 0; k < 4; ++k ) { + p = p.rotate( turns, { 2, 2 } ); + point tmpp = point_south_east - p; + submap *psep = get_submap_at_grid( tripoint( tmpp, z_level ) ); + if( psep == nullptr ) { + debugmsg( "Tried to rotate map at (%d,%d) but the submap is not loaded", tmpp.x, tmpp.y ); + continue; + } + std::swap( *psep, tmp ); } - - update_vehicle_list( sm, abs_sub.z() ); } - } - rebuild_vehicle_level_caches(); - // rotate zones - zone_manager &mgr = zone_manager::get_manager(); - mgr.rotate_zones( *this, turns ); + // Then rotate them and recalculate vehicle positions. + for( int j = 0; j < 2; ++j ) { + for( int i = 0; i < 2; ++i ) { + point p( i, j ); + submap *sm = get_submap_at_grid( tripoint( p, z_level ) ); + if( sm == nullptr ) { + debugmsg( "Tried to rotate map at (%d,%d) but the submap is not loaded", p.x, p.y ); + continue; + } - std::unordered_map temp_points = queued_points; - queued_points.clear(); - for( std::pair &queued_point : temp_points ) { - //This is all just a copy of the section rotating NPCs above - real_coords np_rc; - np_rc.fromabs( queued_point.second.xy().raw() ); - // Note: We are rotating the entire overmap square (2x2 of submaps) - if( np_rc.om_pos != rc.om_pos || queued_point.second.z() != abs_sub.z() ) { - continue; - } - point old( np_rc.sub_pos ); - if( np_rc.om_sub.x % 2 != 0 ) { - old.x += SEEX; + sm->rotate( turns ); + + for( auto &veh : sm->vehicles ) { + veh->sm_pos = tripoint( p, z_level ); + } + + update_vehicle_list( sm, z_level ); + } } - if( np_rc.om_sub.y % 2 != 0 ) { - old.y += SEEY; + rebuild_vehicle_level_caches(); + + std::unordered_map temp_points = queued_points; + queued_points.clear(); + for( std::pair &queued_point : temp_points ) { + //This is all just a copy of the section rotating NPCs above + real_coords np_rc; + np_rc.fromabs( queued_point.second.xy().raw() ); + // Note: We are rotating the entire overmap square (2x2 of submaps) + if( np_rc.om_pos != rc.om_pos || ( queued_point.second.z() != abs_sub.z() && !zlevels ) ) { + continue; + } + point old( np_rc.sub_pos ); + if( np_rc.om_sub.x % 2 != 0 ) { + old.x += SEEX; + } + if( np_rc.om_sub.y % 2 != 0 ) { + old.y += SEEY; + } + const point new_pos = old.rotate( turns, { SEEX * 2, SEEY * 2 } ); + queued_points[queued_point.first] = tripoint_abs_ms( getabs( tripoint( new_pos, + z_level ) ) ); } - const point new_pos = old.rotate( turns, { SEEX * 2, SEEY * 2 } ); - queued_points[queued_point.first] = tripoint_abs_ms( getabs( tripoint( new_pos, - abs_sub.z() ) ) ); } } @@ -7043,41 +7107,44 @@ void map::mirror( bool mirror_horizontal, bool mirror_vertical ) // 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 ); - submap *pe = get_submap_at_grid( point_east ); - submap *ps = get_submap_at_grid( point_south ); - if( pz == nullptr || pse == nullptr || pe == nullptr || ps == nullptr ) { - debugmsg( "Tried to mirror map at (%d,%d) but the submap is not loaded", point_zero.x, - point_zero.y ); - return; - } + for( int z_level = zlevels ? -OVERMAP_DEPTH : abs_sub.z(); + z_level <= ( zlevels ? OVERMAP_HEIGHT : abs_sub.z() ); z_level++ ) { + submap *pz = get_submap_at_grid( tripoint( point_zero, z_level ) ); + submap *pse = get_submap_at_grid( tripoint( point_south_east, z_level ) ); + submap *pe = get_submap_at_grid( tripoint( point_east, z_level ) ); + submap *ps = get_submap_at_grid( tripoint( point_south, z_level ) ); + if( pz == nullptr || pse == nullptr || pe == nullptr || ps == nullptr ) { + debugmsg( "Tried to mirror map at (%d, %d, %d) but the submap is not loaded", point_zero.x, + point_zero.y, z_level ); + return; + } - // Move the submaps around. Note that the order doesn't matter as the outcome is the same. - if( mirror_horizontal ) { - std::swap( *pz, *pe ); - std::swap( *ps, *pse ); - } - if( mirror_vertical ) { - std::swap( *pz, *ps ); - std::swap( *pe, *pse ); - } + // Move the submaps around. Note that the order doesn't matter as the outcome is the same. + if( mirror_horizontal ) { + std::swap( *pz, *pe ); + std::swap( *ps, *pse ); + } + if( mirror_vertical ) { + std::swap( *pz, *ps ); + std::swap( *pe, *pse ); + } - // Then mirror them. - for( int j = 0; j < 2; ++j ) { - for( int i = 0; i < 2; ++i ) { - point p( i, j ); - submap *sm = get_submap_at_grid( p ); - if( sm == nullptr ) { - debugmsg( "Tried to mirror map at (%d,%d) but the submap is not loaded", p.x, p.y ); - continue; - } + // Then mirror them. + for( int j = 0; j < 2; ++j ) { + for( int i = 0; i < 2; ++i ) { + point p( i, j ); + submap *sm = get_submap_at_grid( tripoint( p, z_level ) ); + if( sm == nullptr ) { + debugmsg( "Tried to mirror map at (%d, %d, %d) but the submap is not loaded", p.x, p.y, z_level ); + continue; + } - if( mirror_horizontal ) { - sm->mirror( true ); - } - if( mirror_vertical ) { - sm->mirror( false ); + if( mirror_horizontal ) { + sm->mirror( true ); + } + if( mirror_vertical ) { + sm->mirror( false ); + } } } } @@ -7170,10 +7237,10 @@ void science_room( map *m, const point &p1, const point &p2, int z, int rotate ) } } - point trap( rng( p1.x + 1, p2.x - 1 ), rng( p1.y + 1, p2.y - 1 ) ); + tripoint_bub_ms trap( rng( p1.x + 1, p2.x - 1 ), rng( p1.y + 1, p2.y - 1 ), z ); switch( random_entry( valid_rooms ) ) { case room_closet: - m->place_items( Item_spawn_data_cleaning, 80, p1, p2, false, + m->place_items( Item_spawn_data_cleaning, 80, p1, p2, z, false, calendar::start_of_cataclysm ); break; case room_lobby: @@ -7192,7 +7259,7 @@ void science_room( map *m, const point &p1, const point &p2, int z, int rotate ) tmpcomp->add_failure( COMPFAIL_DAMAGE ); m->place_spawns( GROUP_LAB_SECURITY, 1, point_bub_ms( static_cast( ( p1.x + p2.x ) / 2 ), desk ), - point_bub_ms( static_cast( ( p1.x + p2.x ) / 2 ), desk ), 1, true ); + point_bub_ms( static_cast( ( p1.x + p2.x ) / 2 ), desk ), z, 1, true ); } else { int desk = p1.x + rng( static_cast( height / 2 ) - static_cast( height / 4 ), static_cast( height / 2 ) + 1 ); @@ -7208,7 +7275,7 @@ void science_room( map *m, const point &p1, const point &p2, int z, int rotate ) tmpcomp->add_failure( COMPFAIL_DAMAGE ); m->place_spawns( GROUP_LAB_SECURITY, 1, point_bub_ms( desk, static_cast( ( p1.y + p2.y ) / 2 ) ), - point_bub_ms( desk, static_cast( ( p1.y + p2.y ) / 2 ) ), 1, true ); + point_bub_ms( desk, static_cast( ( p1.y + p2.y ) / 2 ) ), z, 1, true ); } break; case room_chemistry: @@ -7220,11 +7287,11 @@ void science_room( map *m, const point &p1, const point &p2, int z, int rotate ) } if( one_in( 3 ) ) { m->place_items( Item_spawn_data_mut_lab, 35, point( x, p1.y + 1 ), - point( x, p2.y - 1 ), false, + point( x, p2.y - 1 ), z, false, calendar::start_of_cataclysm ); } else { m->place_items( Item_spawn_data_chem_lab, 70, point( x, p1.y + 1 ), - point( x, p2.y - 1 ), false, + point( x, p2.y - 1 ), z, false, calendar::start_of_cataclysm ); } } @@ -7237,11 +7304,11 @@ void science_room( map *m, const point &p1, const point &p2, int z, int rotate ) } if( one_in( 3 ) ) { m->place_items( Item_spawn_data_mut_lab, 35, point( p1.x + 1, y ), - point( p2.x - 1, y ), false, + point( p2.x - 1, y ), z, false, calendar::start_of_cataclysm ); } else { m->place_items( Item_spawn_data_chem_lab, 70, point( p1.x + 1, y ), - point( p2.x - 1, y ), false, + point( p2.x - 1, y ), z, false, calendar::start_of_cataclysm ); } } @@ -7263,34 +7330,35 @@ void science_room( map *m, const point &p1, const point &p2, int z, int rotate ) m->place_items( Item_spawn_data_teleport, 70, point( ( p1.x + p2.x ) / 2, static_cast( ( p1.y + p2.y ) / 2 ) ), point( static_cast( ( p1.x + p2.x ) / 2 ) + 1, static_cast( ( p1.y + p2.y ) / 2 ) + 1 ), + z, false, calendar::start_of_cataclysm ); break; case room_goo: do { mtrap_set( m, trap, tr_goo ); - trap.x = rng( p1.x + 1, p2.x - 1 ); - trap.y = rng( p1.y + 1, p2.y - 1 ); + trap.x() = rng( p1.x + 1, p2.x - 1 ); + trap.y() = rng( p1.y + 1, p2.y - 1 ); } while( !one_in( 5 ) ); if( rotate == 0 ) { - mremove_trap( m, point( p1.x, p2.y ), tr_null ); - m->furn_set( point( p1.x, p2.y ), furn_f_fridge ); - m->place_items( Item_spawn_data_goo, 60, point( p1.x, p2.y ), point( p1.x, p2.y ), + mremove_trap( m, tripoint_bub_ms( p1.x, p2.y, z ), tr_null ); + m->furn_set( tripoint_bub_ms( p1.x, p2.y, z ), furn_f_fridge ); + m->place_items( Item_spawn_data_goo, 60, point( p1.x, p2.y ), point( p1.x, p2.y ), z, false, calendar::start_of_cataclysm ); } else if( rotate == 1 ) { - mremove_trap( m, p1, tr_null ); - m->furn_set( p1, furn_f_fridge ); - m->place_items( Item_spawn_data_goo, 60, p1, p1, false, + mremove_trap( m, tripoint_bub_ms( p1.x, p1.y, z ), tr_null ); + m->furn_set( tripoint_bub_ms( p1.x, p1.y, z ), furn_f_fridge ); + m->place_items( Item_spawn_data_goo, 60, p1, p1, z, false, calendar::start_of_cataclysm ); } else if( rotate == 2 ) { - mremove_trap( m, point( p2.x, p1.y ), tr_null ); - m->furn_set( point( p2.x, p1.y ), furn_f_fridge ); - m->place_items( Item_spawn_data_goo, 60, point( p2.x, p1.y ), point( p2.x, p1.y ), + mremove_trap( m, tripoint_bub_ms( p2.x, p1.y, z ), tr_null ); + m->furn_set( tripoint_bub_ms( p2.x, p1.y, z ), furn_f_fridge ); + m->place_items( Item_spawn_data_goo, 60, point( p2.x, p1.y ), point( p2.x, p1.y ), z, false, calendar::start_of_cataclysm ); } else { - mremove_trap( m, p2, tr_null ); - m->furn_set( p2, furn_f_fridge ); - m->place_items( Item_spawn_data_goo, 60, p2, p2, false, + mremove_trap( m, tripoint_bub_ms( p2.x, p2.y, z ), tr_null ); + m->furn_set( tripoint_bub_ms( p2.x, p2.y, z ), furn_f_fridge ); + m->place_items( Item_spawn_data_goo, 60, p2, p2, z, false, calendar::start_of_cataclysm ); } break; @@ -7298,9 +7366,9 @@ void science_room( map *m, const point &p1, const point &p2, int z, int rotate ) for( int x = p1.x + 1; x <= p2.x - 1; x++ ) { for( int y = p1.y + 1; y <= p2.y - 1; y++ ) { if( x % 3 == 0 && y % 3 == 0 ) { - m->ter_set( point( x, y ), ter_t_vat ); + m->ter_set( tripoint_bub_ms( x, y, z ), ter_t_vat ); m->place_items( Item_spawn_data_cloning_vat, 20, point( x, y ), - point( x, y ), false, calendar::start_of_cataclysm ); + point( x, y ), z, false, calendar::start_of_cataclysm ); } } } @@ -7308,36 +7376,36 @@ void science_room( map *m, const point &p1, const point &p2, int z, int rotate ) case room_vivisect: if( rotate == 0 ) { for( int x = p1.x; x <= p2.x; x++ ) { - m->furn_set( point( x, p2.y - 1 ), furn_f_counter ); + m->furn_set( tripoint_bub_ms( x, p2.y - 1, z ), furn_f_counter ); } m->place_items( Item_spawn_data_dissection, 80, point( p1.x, p2.y - 1 ), - p2 + point_north, false, calendar::start_of_cataclysm ); + p2 + point_north, z, false, calendar::start_of_cataclysm ); } else if( rotate == 1 ) { for( int y = p1.y; y <= p2.y; y++ ) { - m->furn_set( point( p1.x + 1, y ), furn_f_counter ); + m->furn_set( tripoint_bub_ms( p1.x + 1, y, z ), furn_f_counter ); } m->place_items( Item_spawn_data_dissection, 80, p1 + point_east, - point( p1.x + 1, p2.y ), false, calendar::start_of_cataclysm ); + point( p1.x + 1, p2.y ), z, false, calendar::start_of_cataclysm ); } else if( rotate == 2 ) { for( int x = p1.x; x <= p2.x; x++ ) { - m->furn_set( point( x, p1.y + 1 ), furn_f_counter ); + m->furn_set( tripoint_bub_ms( x, p1.y + 1, z ), furn_f_counter ); } m->place_items( Item_spawn_data_dissection, 80, p1 + point_south, - point( p2.x, p1.y + 1 ), false, calendar::start_of_cataclysm ); + point( p2.x, p1.y + 1 ), z, false, calendar::start_of_cataclysm ); } else if( rotate == 3 ) { for( int y = p1.y; y <= p2.y; y++ ) { - m->furn_set( point( p2.x - 1, y ), furn_f_counter ); + m->furn_set( tripoint_bub_ms( p2.x - 1, y, z ), furn_f_counter ); } m->place_items( Item_spawn_data_dissection, 80, point( p2.x - 1, p1.y ), - p2 + point_west, false, calendar::start_of_cataclysm ); + p2 + point_west, z, false, calendar::start_of_cataclysm ); } - mtrap_set( m, point( ( p1.x + p2.x ) / 2, static_cast( ( p1.y + p2.y ) / 2 ) ), + mtrap_set( m, tripoint_bub_ms( ( p1.x + p2.x ) / 2, static_cast( ( p1.y + p2.y ) / 2 ), z ), tr_dissector ); m->place_spawns( GROUP_LAB_CYBORG, 10, point_bub_ms( static_cast( ( ( p1.x + p2.x ) / 2 ) + 1 ), static_cast( ( ( p1.y + p2.y ) / 2 ) + 1 ) ), point_bub_ms( static_cast( ( ( p1.x + p2.x ) / 2 ) + 1 ), - static_cast( ( ( p1.y + p2.y ) / 2 ) + 1 ) ), 1, true ); + static_cast( ( ( p1.y + p2.y ) / 2 ) + 1 ) ), z, 1, true ); break; case room_bionics: @@ -7350,9 +7418,9 @@ void science_room( map *m, const point &p1, const point &p2, int z, int rotate ) mapf::ter_bind( "- | =", ter_t_concrete_wall, ter_t_concrete_wall, ter_t_reinforced_glass ), mapf::furn_bind( "c", furn_f_counter ) ); m->place_items( Item_spawn_data_bionics_common, 70, bio, - bio, false, calendar::start_of_cataclysm ); + bio, z, false, calendar::start_of_cataclysm ); - m->furn_set( bio + point( 0, 2 ), furn_f_console ); + m->furn_set( tripoint_bub_ms( bio.x, bio.y + 2, z ), furn_f_console ); computer *tmpcomp = m->add_computer( tripoint( bio.x, bio.y + 2, z ), _( "Bionic access" ), 2 ); tmpcomp->add_option( _( "Manifest" ), COMPACT_LIST_BIONICS, 0 ); tmpcomp->add_option( _( "Open Chambers" ), COMPACT_RELEASE_BIONICS, 3 ); @@ -7369,9 +7437,9 @@ void science_room( map *m, const point &p1, const point &p2, int z, int rotate ) mapf::ter_bind( "- | =", ter_t_concrete_wall, ter_t_concrete_wall, ter_t_reinforced_glass ), mapf::furn_bind( "c", furn_f_counter ) ); m->place_items( Item_spawn_data_bionics_common, 70, bio, - bio, false, calendar::start_of_cataclysm ); + bio, z, false, calendar::start_of_cataclysm ); - m->furn_set( bio + point( 0, -2 ), furn_f_console ); + m->furn_set( tripoint_bub_ms( bio.x, bio.y - 2, z ), furn_f_console ); computer *tmpcomp2 = m->add_computer( tripoint( bio.x, bio.y - 2, z ), _( "Bionic access" ), 2 ); tmpcomp2->add_option( _( "Manifest" ), COMPACT_LIST_BIONICS, 0 ); tmpcomp2->add_option( _( "Open Chambers" ), COMPACT_RELEASE_BIONICS, 3 ); @@ -7389,9 +7457,9 @@ void science_room( map *m, const point &p1, const point &p2, int z, int rotate ) mapf::ter_bind( "- | =", ter_t_concrete_wall, ter_t_concrete_wall, ter_t_reinforced_glass ), mapf::furn_bind( "c", furn_f_counter ) ); m->place_items( Item_spawn_data_bionics_common, 70, point( biox, bioy ), - point( biox, bioy ), false, calendar::start_of_cataclysm ); + point( biox, bioy ), z, false, calendar::start_of_cataclysm ); - m->furn_set( point( biox + 2, bioy ), furn_f_console ); + m->furn_set( tripoint_bub_ms( biox + 2, bioy, z ), furn_f_console ); computer *tmpcomp = m->add_computer( tripoint( biox + 2, bioy, z ), _( "Bionic access" ), 2 ); tmpcomp->add_option( _( "Manifest" ), COMPACT_LIST_BIONICS, 0 ); tmpcomp->add_option( _( "Open Chambers" ), COMPACT_RELEASE_BIONICS, 3 ); @@ -7408,9 +7476,9 @@ void science_room( map *m, const point &p1, const point &p2, int z, int rotate ) mapf::ter_bind( "- | =", ter_t_concrete_wall, ter_t_concrete_wall, ter_t_reinforced_glass ), mapf::furn_bind( "c", furn_f_counter ) ); m->place_items( Item_spawn_data_bionics_common, 70, point( biox, bioy ), - point( biox, bioy ), false, calendar::turn_zero ); + point( biox, bioy ), z, false, calendar::turn_zero ); - m->furn_set( point( biox - 2, bioy ), furn_f_console ); + m->furn_set( tripoint_bub_ms( biox - 2, bioy, z ), furn_f_console ); computer *tmpcomp2 = m->add_computer( tripoint( biox - 2, bioy, z ), _( "Bionic access" ), 2 ); tmpcomp2->add_option( _( "Manifest" ), COMPACT_LIST_BIONICS, 0 ); tmpcomp2->add_option( _( "Open Chambers" ), COMPACT_RELEASE_BIONICS, 3 ); @@ -7423,48 +7491,48 @@ void science_room( map *m, const point &p1, const point &p2, int z, int rotate ) case room_dorm: if( rotate % 2 == 0 ) { for( int y = p1.y + 1; y <= p2.y - 1; y += 3 ) { - m->furn_set( point( p1.x, y ), furn_f_bed ); - m->place_items( Item_spawn_data_bed, 60, point( p1.x, y ), point( p1.x, y ), + m->furn_set( tripoint_bub_ms( p1.x, y, z ), furn_f_bed ); + m->place_items( Item_spawn_data_bed, 60, point( p1.x, y ), point( p1.x, y ), z, false, calendar::start_of_cataclysm ); - m->furn_set( point( p1.x + 1, y ), furn_f_bed ); + m->furn_set( tripoint_bub_ms( p1.x + 1, y, z ), furn_f_bed ); m->place_items( Item_spawn_data_bed, 60, point( p1.x + 1, y ), - point( p1.x + 1, y ), false, calendar::start_of_cataclysm ); - m->furn_set( point( p2.x, y ), furn_f_bed ); - m->place_items( Item_spawn_data_bed, 60, point( p2.x, y ), point( p2.x, y ), + point( p1.x + 1, y ), z, false, calendar::start_of_cataclysm ); + m->furn_set( tripoint_bub_ms( p2.x, y, z ), furn_f_bed ); + m->place_items( Item_spawn_data_bed, 60, point( p2.x, y ), point( p2.x, y ), z, false, calendar::start_of_cataclysm ); - m->furn_set( point( p2.x - 1, y ), furn_f_bed ); + m->furn_set( tripoint_bub_ms( p2.x - 1, y, z ), furn_f_bed ); m->place_items( Item_spawn_data_bed, 60, point( p2.x - 1, y ), - point( p2.x - 1, y ), false, calendar::start_of_cataclysm ); - m->furn_set( point( p1.x, y + 1 ), furn_f_dresser ); - m->furn_set( point( p2.x, y + 1 ), furn_f_dresser ); + point( p2.x - 1, y ), z, false, calendar::start_of_cataclysm ); + m->furn_set( tripoint_bub_ms( p1.x, y + 1, z ), furn_f_dresser ); + m->furn_set( tripoint_bub_ms( p2.x, y + 1, z ), furn_f_dresser ); m->place_items( Item_spawn_data_dresser, 70, point( p1.x, y + 1 ), - point( p1.x, y + 1 ), false, calendar::start_of_cataclysm ); + point( p1.x, y + 1 ), z, false, calendar::start_of_cataclysm ); m->place_items( Item_spawn_data_dresser, 70, point( p2.x, y + 1 ), - point( p2.x, y + 1 ), false, calendar::start_of_cataclysm ); + point( p2.x, y + 1 ), z, false, calendar::start_of_cataclysm ); } } else if( rotate % 2 == 1 ) { for( int x = p1.x + 1; x <= p2.x - 1; x += 3 ) { - m->furn_set( point( x, p1.y ), furn_f_bed ); - m->place_items( Item_spawn_data_bed, 60, point( x, p1.y ), point( x, p1.y ), + m->furn_set( tripoint_bub_ms( x, p1.y, z ), furn_f_bed ); + m->place_items( Item_spawn_data_bed, 60, point( x, p1.y ), point( x, p1.y ), z, false, calendar::start_of_cataclysm ); - m->furn_set( point( x, p1.y + 1 ), furn_f_bed ); + m->furn_set( tripoint_bub_ms( x, p1.y + 1, z ), furn_f_bed ); m->place_items( Item_spawn_data_bed, 60, point( x, p1.y + 1 ), - point( x, p1.y + 1 ), false, calendar::start_of_cataclysm ); - m->furn_set( point( x, p2.y ), furn_f_bed ); - m->place_items( Item_spawn_data_bed, 60, point( x, p2.y ), point( x, p2.y ), + point( x, p1.y + 1 ), z, false, calendar::start_of_cataclysm ); + m->furn_set( tripoint_bub_ms( x, p2.y, z ), furn_f_bed ); + m->place_items( Item_spawn_data_bed, 60, point( x, p2.y ), point( x, p2.y ), z, false, calendar::start_of_cataclysm ); - m->furn_set( point( x, p2.y - 1 ), furn_f_bed ); + m->furn_set( tripoint_bub_ms( x, p2.y - 1, z ), furn_f_bed ); m->place_items( Item_spawn_data_bed, 60, point( x, p2.y - 1 ), - point( x, p2.y - 1 ), false, calendar::start_of_cataclysm ); - m->furn_set( point( x + 1, p1.y ), furn_f_dresser ); - m->furn_set( point( x + 1, p2.y ), furn_f_dresser ); + point( x, p2.y - 1 ), z, false, calendar::start_of_cataclysm ); + m->furn_set( tripoint_bub_ms( x + 1, p1.y, z ), furn_f_dresser ); + m->furn_set( tripoint_bub_ms( x + 1, p2.y, z ), furn_f_dresser ); m->place_items( Item_spawn_data_dresser, 70, point( x + 1, p1.y ), - point( x + 1, p1.y ), false, calendar::start_of_cataclysm ); + point( x + 1, p1.y ), z, false, calendar::start_of_cataclysm ); m->place_items( Item_spawn_data_dresser, 70, point( x + 1, p2.y ), - point( x + 1, p2.y ), false, calendar::start_of_cataclysm ); + point( x + 1, p2.y ), z, false, calendar::start_of_cataclysm ); } } - m->place_items( Item_spawn_data_lab_dorm, 84, p1, p2, false, + m->place_items( Item_spawn_data_lab_dorm, 84, p1, p2, z, false, calendar::start_of_cataclysm ); break; case room_split: @@ -7472,22 +7540,24 @@ void science_room( map *m, const point &p1, const point &p2, int z, int rotate ) int w1 = static_cast( ( p1.x + p2.x ) / 2 ) - 2; int w2 = static_cast( ( p1.x + p2.x ) / 2 ) + 2; for( int y = p1.y; y <= p2.y; y++ ) { - m->ter_set( point( w1, y ), ter_t_concrete_wall ); - m->ter_set( point( w2, y ), ter_t_concrete_wall ); + m->ter_set( tripoint_bub_ms( w1, y, z ), ter_t_concrete_wall ); + m->ter_set( tripoint_bub_ms( w2, y, z ), ter_t_concrete_wall ); } - m->ter_set( point( w1, static_cast( ( p1.y + p2.y ) / 2 ) ), ter_t_door_glass_frosted_c ); - m->ter_set( point( w2, static_cast( ( p1.y + p2.y ) / 2 ) ), ter_t_door_glass_frosted_c ); + m->ter_set( tripoint_bub_ms( w1, static_cast( ( p1.y + p2.y ) / 2 ), z ), + ter_t_door_glass_frosted_c ); + m->ter_set( tripoint_bub_ms( w2, static_cast( ( p1.y + p2.y ) / 2 ), z ), + ter_t_door_glass_frosted_c ); science_room( m, p1, point( w1 - 1, p2.y ), z, 1 ); science_room( m, point( w2 + 1, p1.y ), p2, z, 3 ); } else { int w1 = static_cast( ( p1.y + p2.y ) / 2 ) - 2; int w2 = static_cast( ( p1.y + p2.y ) / 2 ) + 2; for( int x = p1.x; x <= p2.x; x++ ) { - m->ter_set( point( x, w1 ), ter_t_concrete_wall ); - m->ter_set( point( x, w2 ), ter_t_concrete_wall ); + m->ter_set( tripoint_bub_ms( x, w1, z ), ter_t_concrete_wall ); + m->ter_set( tripoint_bub_ms( x, w2, z ), ter_t_concrete_wall ); } - m->ter_set( point( ( p1.x + p2.x ) / 2, w1 ), ter_t_door_glass_frosted_c ); - m->ter_set( point( ( p1.x + p2.x ) / 2, w2 ), ter_t_door_glass_frosted_c ); + m->ter_set( tripoint_bub_ms( ( p1.x + p2.x ) / 2, w1, z ), ter_t_door_glass_frosted_c ); + m->ter_set( tripoint_bub_ms( ( p1.x + p2.x ) / 2, w2, z ), ter_t_door_glass_frosted_c ); science_room( m, p1, point( p2.x, w1 - 1 ), z, 2 ); science_room( m, point( p1.x, w2 + 1 ), p2, z, 0 ); } @@ -7500,6 +7570,7 @@ void science_room( map *m, const point &p1, const point &p2, int z, int rotate ) void map::create_anomaly( const tripoint &cp, artifact_natural_property prop, bool create_rubble ) { // TODO: Z + const int z = cp.z; point c( cp.xy() ); if( create_rubble ) { rough_circle( this, ter_t_dirt, c, 11 ); @@ -7512,7 +7583,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 ) ) == furn_f_rubble ) { - add_field( tripoint_bub_ms{i, j, abs_sub.z()}, fd_push_items, 1 ); + add_field( tripoint_bub_ms{i, j, z}, fd_push_items, 1 ); if( one_in( 3 ) ) { spawn_item( point( i, j ), "rock" ); } @@ -7526,7 +7597,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 ) ) == furn_f_rubble && one_in( 2 ) ) { - mtrap_set( this, point( i, j ), tr_glow ); + mtrap_set( this, tripoint_bub_ms( i, j, z ), tr_glow ); } } } @@ -7537,7 +7608,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 ) ) == furn_f_rubble && one_in( 2 ) ) { - mtrap_set( this, point( i, j ), tr_hum ); + mtrap_set( this, tripoint_bub_ms( i, j, z ), tr_hum ); } } } @@ -7548,7 +7619,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 ) ) == furn_f_rubble && one_in( 3 ) ) { - mtrap_set( this, point( i, j ), tr_shadow ); + mtrap_set( this, tripoint_bub_ms( i, j, z ), tr_shadow ); } } } @@ -7558,10 +7629,10 @@ void map::create_anomaly( const tripoint &cp, artifact_natural_property prop, bo for( int i = c.x - 1; i <= c.x + 1; i++ ) { for( int j = c.y - 1; j <= c.y + 1; j++ ) { if( i == c.x && j == c.y ) { - place_spawns( GROUP_BREATHER_HUB, 1, point_bub_ms( i, j ), point_bub_ms( i, j ), 1, + place_spawns( GROUP_BREATHER_HUB, 1, point_bub_ms( i, j ), point_bub_ms( i, j ), z, 1, true ); } else { - place_spawns( GROUP_BREATHER, 1, point_bub_ms( i, j ), point_bub_ms( i, j ), 1, true ); + place_spawns( GROUP_BREATHER, 1, point_bub_ms( i, j ), point_bub_ms( i, j ), z, 1, true ); } } } @@ -7571,7 +7642,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 ) ) == furn_f_rubble ) { - mtrap_set( this, point( i, j ), tr_drain ); + mtrap_set( this, tripoint_bub_ms( i, j, z ), tr_drain ); } } } @@ -7611,7 +7682,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 ) ) == furn_f_rubble ) { - mtrap_set( this, point( i, j ), tr_snake ); + mtrap_set( this, tripoint_bub_ms( i, j, z ), tr_snake ); } } } @@ -7647,17 +7718,17 @@ void map::create_anomaly( const tripoint_bub_ms &cp, artifact_natural_property p } ///////////////////// part of map -void line( map *m, const ter_id &type, const point &p1, const point &p2 ) +void line( map *m, const ter_id &type, const point &p1, const point &p2, int z ) { - m->draw_line_ter( type, p1, p2 ); + m->draw_line_ter( type, p1, p2, z ); } void line( tinymap *m, const ter_id &type, const point &p1, const point &p2 ) { m->draw_line_ter( type, p1, p2 ); } -void line_furn( map *m, const furn_id &type, const point &p1, const point &p2 ) +void line_furn( map *m, const furn_id &type, const point &p1, const point &p2, int z ) { - m->draw_line_furn( type, p1, p2 ); + m->draw_line_furn( type, p1, p2, z ); } void line_furn( tinymap *m, const furn_id &type, const point &p1, const point &p2 ) { @@ -7673,11 +7744,11 @@ void fill_background( map *m, ter_id( *f )() ) } void square( map *m, const ter_id &type, const point &p1, const point &p2 ) { - m->draw_square_ter( type, p1, p2 ); + m->draw_square_ter( type, p1, p2, m->get_abs_sub().z() ); } void square_furn( map *m, const furn_id &type, const point &p1, const point &p2 ) { - m->draw_square_furn( type, p1, p2 ); + m->draw_square_furn( type, p1, p2, m->get_abs_sub().z() ); } void square_furn( tinymap *m, const furn_id &type, const point &p1, const point &p2 ) { @@ -7748,7 +7819,7 @@ bool update_mapgen_function_json::setup_internal( const JsonObject &/*jo*/ ) } bool update_mapgen_function_json::update_map( - const tripoint_abs_omt &omt_pos, const mapgen_arguments &args, const point &offset, + const tripoint_abs_omt &omt_pos, const mapgen_arguments &args, const tripoint_rel_ms &offset, mission *miss, bool verify, bool mirror_horizontal, bool mirror_vertical, int rotation ) const { if( omt_pos == overmap::invalid_tripoint ) { @@ -7813,7 +7884,7 @@ class rotation_guard const int rotation; }; -bool update_mapgen_function_json::update_map( const mapgendata &md, const point &offset, +bool update_mapgen_function_json::update_map( const mapgendata &md, const tripoint_rel_ms &offset, const bool verify ) const { mapgendata md_with_params( md, get_args( md, mapgen_parameter_scope::omt ), flags_ ); @@ -7844,7 +7915,7 @@ mapgen_update_func add_mapgen_update_func( const JsonObject &jo, bool &defer ) return null_function; } const auto update_function = [json_data]( const tripoint_abs_omt & omt_pos, mission * miss ) { - json_data.update_map( omt_pos, {}, point_zero, miss ); + json_data.update_map( omt_pos, {}, tripoint_rel_ms( tripoint_zero ), miss ); }; defer = mapgen_defer::defer; mapgen_defer::jsi = JsonObject(); @@ -7862,7 +7933,7 @@ bool run_mapgen_update_func( return false; } return update_function->second.funcs()[0]->update_map( - omt_pos, args, point_zero, miss, cancel_on_collision, mirror_horizontal, + omt_pos, args, tripoint_rel_ms( tripoint_zero ), miss, cancel_on_collision, mirror_horizontal, mirror_vertical, rotation ); } @@ -7873,7 +7944,8 @@ bool run_mapgen_update_func( const update_mapgen_id &update_mapgen_id, mapgendat if( update_function == update_mapgens.end() || update_function->second.funcs().empty() ) { return false; } - return update_function->second.funcs()[0]->update_map( dat, point_zero, cancel_on_collision ); + return update_function->second.funcs()[0]->update_map( dat, tripoint_rel_ms( tripoint_zero ), + cancel_on_collision ); } void set_queued_points() diff --git a/src/mapgen.h b/src/mapgen.h index 0f1d9046b893b..b0ec3bbab8fe4 100644 --- a/src/mapgen.h +++ b/src/mapgen.h @@ -94,7 +94,7 @@ struct jmapgen_int { */ jmapgen_int( const JsonObject &jo, std::string_view tag ); /** - * Throws is the json is malformed (e.g. a string not an integer, but does not throw + * Throws if the json is malformed (e.g. a string not an integer, but does not throw * if the member is just missing (the default values are used instead). */ jmapgen_int( const JsonObject &jo, std::string_view tag, const int &def_val, @@ -162,6 +162,7 @@ enum jmapgen_setmap_op { struct jmapgen_setmap { jmapgen_int x; jmapgen_int y; + jmapgen_int z; jmapgen_int x2; jmapgen_int y2; jmapgen_setmap_op op; @@ -173,24 +174,24 @@ struct jmapgen_setmap { int status; std::string string_val; jmapgen_setmap( - jmapgen_int ix, jmapgen_int iy, jmapgen_int ix2, jmapgen_int iy2, + jmapgen_int ix, jmapgen_int iy, jmapgen_int iz, jmapgen_int ix2, jmapgen_int iy2, jmapgen_setmap_op iop, jmapgen_int ival, int ione_in = 1, jmapgen_int irepeat = jmapgen_int( 1, 1 ), int irotation = 0, int ifuel = -1, int istatus = -1, std::string istring_val = "" ) : - x( ix ), y( iy ), x2( ix2 ), y2( iy2 ), op( iop ), val( ival ), chance( ione_in ), + x( ix ), y( iy ), z( iz ), x2( ix2 ), y2( iy2 ), op( iop ), val( ival ), chance( ione_in ), repeat( irepeat ), rotation( irotation ), fuel( ifuel ), status( istatus ), string_val( std::move( istring_val ) ) {} mapgen_phase phase() const; - bool apply( const mapgendata &dat, const point &offset ) const; + bool apply( const mapgendata &dat, const tripoint_rel_ms &offset ) const; /** * checks if applying these objects to data would cause cause a collision with vehicles * on the same map **/ - bool has_vehicle_collision( const mapgendata &dat, const point &offset ) const; + bool has_vehicle_collision( const mapgendata &dat, const tripoint_rel_ms &offset ) const; }; struct spawn_data { @@ -232,17 +233,18 @@ class jmapgen_piece } /** Sanity-check this piece */ virtual void check( const std::string &/*context*/, const mapgen_parameters &, - const jmapgen_int &/*x*/, const jmapgen_int &/*y*/ ) const { } + const jmapgen_int &/*x*/, const jmapgen_int &/*y*/, const jmapgen_int &/*z*/ ) const { } virtual void merge_parameters_into( mapgen_parameters &, const std::string &/*outer_context*/ ) const {} /** Place something on the map from mapgendata &dat, at (x,y). */ virtual void apply( const mapgendata &dat, const jmapgen_int &x, const jmapgen_int &y, + const jmapgen_int &z, const std::string &context ) const = 0; virtual ~jmapgen_piece() = default; jmapgen_int repeat; - virtual bool has_vehicle_collision( const mapgendata &, const point &/*offset*/ ) const { + virtual bool has_vehicle_collision( const mapgendata &, const tripoint_rel_ms &/*offset*/ ) const { return false; } }; @@ -253,12 +255,14 @@ class jmapgen_piece class jmapgen_place { public: - jmapgen_place() : x( 0, 0 ), y( 0, 0 ), repeat( 1, 1 ) { } - explicit jmapgen_place( const point &p ) : x( p.x ), y( p.y ), repeat( 1, 1 ) { } + jmapgen_place() : x( 0, 0 ), y( 0, 0 ), z( 0, 0 ), repeat( 1, 1 ) { } + explicit jmapgen_place( const tripoint_rel_ms &p ) : x( p.x() ), y( p.y() ), z( p.z() ), repeat( 1, + 1 ) { } explicit jmapgen_place( const JsonObject &jsi ); - void offset( const point & ); + void offset( const tripoint_rel_ms & ); jmapgen_int x; jmapgen_int y; + jmapgen_int z; jmapgen_int repeat; }; @@ -385,7 +389,7 @@ class mapgen_palette struct jmapgen_objects { - jmapgen_objects( const point &offset, const point &mapsize, const point &tot_size ); + jmapgen_objects( const tripoint_rel_ms &offset, const point &mapsize, const point &tot_size ); bool check_bounds( const jmapgen_place &place, const JsonObject &jso ); @@ -415,14 +419,14 @@ struct jmapgen_objects { void add_placement_coords_to( std::unordered_set & ) const; void apply( const mapgendata &dat, mapgen_phase, const std::string &context ) const; - void apply( const mapgendata &dat, mapgen_phase, const point &offset, + void apply( const mapgendata &dat, mapgen_phase, const tripoint_rel_ms &offset, const std::string &context ) const; /** * checks if applying these objects to data would cause cause a collision with vehicles * on the same map **/ - bool has_vehicle_collision( const mapgendata &dat, const point &offset ) const; + bool has_vehicle_collision( const mapgendata &dat, const tripoint_rel_ms &offset ) const; private: /** @@ -430,7 +434,7 @@ struct jmapgen_objects { */ using jmapgen_obj = std::pair >; std::vector objects; - point m_offset; + tripoint_rel_ms m_offset; point mapgensize; point total_size; }; @@ -440,9 +444,10 @@ class mapgen_function_json_base public: void merge_non_nest_parameters_into( mapgen_parameters &, const std::string &outer_context ) const; - bool check_inbounds( const jmapgen_int &x, const jmapgen_int &y, const JsonObject &jso ) const; + bool check_inbounds( const jmapgen_int &x, const jmapgen_int &y, const jmapgen_int &z, + const JsonObject &jso ) const; size_t calc_index( const point &p ) const; - bool has_vehicle_collision( const mapgendata &dat, const point &offset ) const; + bool has_vehicle_collision( const mapgendata &dat, const tripoint_rel_ms &offset ) const; void add_placement_coords_to( std::unordered_set & ) const; @@ -473,7 +478,7 @@ class mapgen_function_json_base bool is_ready; point mapgensize; - point m_offset; + tripoint_rel_ms m_offset; point total_size; std::vector setmap_points; @@ -519,10 +524,11 @@ class update_mapgen_function_json : public mapgen_function_json_base void finalize_parameters(); void check() const; bool update_map( - const tripoint_abs_omt &omt_pos, const mapgen_arguments &, const point &offset, + const tripoint_abs_omt &omt_pos, const mapgen_arguments &, const tripoint_rel_ms &offset, mission *miss, bool verify = false, bool mirror_horizontal = false, bool mirror_vertical = false, int rotation = 0 ) const; - bool update_map( const mapgendata &md, const point &offset = point_zero, + bool update_map( const mapgendata &md, + const tripoint_rel_ms &offset = tripoint_rel_ms( tripoint_zero ), bool verify = false ) const; protected: @@ -539,7 +545,7 @@ class mapgen_function_json_nested : public mapgen_function_json_base mapgen_function_json_nested( const JsonObject &jsobj, const std::string &context ); ~mapgen_function_json_nested() override = default; - void nest( const mapgendata &md, const point &offset, + void nest( const mapgendata &md, const tripoint_rel_ms &offset, const std::string &outer_context ) const; protected: bool setup_internal( const JsonObject &jo ) override; @@ -642,9 +648,9 @@ enum room_type { // helpful functions bool connects_to( const oter_id &there, int dir ); // wrappers for map:: functions -void line( map *m, const ter_id &type, const point &p1, const point &p2 ); +void line( map *m, const ter_id &type, const point &p1, const point &p2, int z ); void line( tinymap *m, const ter_id &type, const point &p1, const point &p2 ); -void line_furn( map *m, const furn_id &type, const point &p1, const point &p2 ); +void line_furn( map *m, const furn_id &type, const point &p1, const point &p2, int z ); void line_furn( tinymap *m, const furn_id &type, const point &p1, const point &p2 ); void fill_background( map *m, const ter_id &type ); void fill_background( map *m, ter_id( *f )() ); diff --git a/src/mapgen_functions.cpp b/src/mapgen_functions.cpp index c423c64b4e503..bdb3933bff20a 100644 --- a/src/mapgen_functions.cpp +++ b/src/mapgen_functions.cpp @@ -605,11 +605,11 @@ void mapgen_river_straight( mapgendata &dat ) for( int x = 0; x < SEEX * 2; x++ ) { int ground_edge = rng( 1, 3 ); int shallow_edge = rng( 4, 6 ); - line( m, grass_or_dirt(), point( x, 0 ), point( x, ground_edge ) ); + line( m, grass_or_dirt(), point( x, 0 ), point( x, ground_edge ), dat.zlevel() ); if( one_in( 25 ) ) { m->ter_set( point( x, ++ground_edge ), clay_or_sand() ); } - line( m, ter_t_water_moving_sh, point( x, ++ground_edge ), point( x, shallow_edge ) ); + line( m, ter_t_water_moving_sh, point( x, ++ground_edge ), point( x, shallow_edge ), dat.zlevel() ); } if( dat.terrain_type() == oter_river_east ) { @@ -631,20 +631,20 @@ void mapgen_river_curved( mapgendata &dat ) for( int x = 0; x < SEEX * 2; x++ ) { int ground_edge = rng( 1, 3 ); int shallow_edge = rng( 4, 6 ); - line( m, grass_or_dirt(), point( x, 0 ), point( x, ground_edge ) ); + line( m, grass_or_dirt(), point( x, 0 ), point( x, ground_edge ), dat.zlevel() ); if( one_in( 25 ) ) { m->ter_set( point( x, ++ground_edge ), clay_or_sand() ); } - line( m, ter_t_water_moving_sh, point( x, ++ground_edge ), point( x, shallow_edge ) ); + line( m, ter_t_water_moving_sh, point( x, ++ground_edge ), point( x, shallow_edge ), dat.zlevel() ); } for( int y = 0; y < SEEY * 2; y++ ) { int ground_edge = rng( 19, 21 ); int shallow_edge = rng( 16, 18 ); - line( m, grass_or_dirt(), point( ground_edge, y ), point( SEEX * 2 - 1, y ) ); + line( m, grass_or_dirt(), point( ground_edge, y ), point( SEEX * 2 - 1, y ), dat.zlevel() ); if( one_in( 25 ) ) { m->ter_set( point( --ground_edge, y ), clay_or_sand() ); } - line( m, ter_t_water_moving_sh, point( shallow_edge, y ), point( --ground_edge, y ) ); + line( m, ter_t_water_moving_sh, point( shallow_edge, y ), point( --ground_edge, y ), dat.zlevel() ); } if( dat.terrain_type() == oter_river_se ) { @@ -1135,7 +1135,7 @@ void mapgen_forest( mapgendata &dat ) // Place items on this terrain as defined in the biome. for( int i = 0; i < self_biome.item_spawn_iterations; i++ ) { m->place_items( self_biome.item_group, self_biome.item_group_chance, - point_zero, point( SEEX * 2 - 1, SEEY * 2 - 1 ), true, dat.when() ); + point_zero, point( SEEX * 2 - 1, SEEY * 2 - 1 ), dat.zlevel(), true, dat.when() ); } } @@ -2113,7 +2113,7 @@ void mapgen_ravine_edge( mapgendata &dat ) if( straight ) { for( int x = 0; x < SEEX * 2; x++ ) { int ground_edge = 12 + rng( 1, 3 ); - line( m, ter_str_id::NULL_ID(), point( x, ++ground_edge ), point( x, SEEY * 2 ) ); + line( m, ter_str_id::NULL_ID(), point( x, ++ground_edge ), point( x, SEEY * 2 ), dat.zlevel() ); } if( w_ravine ) { m->rotate( 1 ); @@ -2127,7 +2127,7 @@ void mapgen_ravine_edge( mapgendata &dat ) } else if( interior_corner ) { for( int x = 0; x < SEEX * 2; x++ ) { int ground_edge = 12 + rng( 1, 3 ) + x; - line( m, ter_str_id::NULL_ID(), point( x, ++ground_edge ), point( x, SEEY * 2 ) ); + line( m, ter_str_id::NULL_ID(), point( x, ++ground_edge ), point( x, SEEY * 2 ), dat.zlevel() ); } if( nw_ravine ) { m->rotate( 1 ); @@ -2141,7 +2141,7 @@ void mapgen_ravine_edge( mapgendata &dat ) } else if( exterior_corner ) { for( int x = 0; x < SEEX * 2; x++ ) { int ground_edge = 12 + rng( 1, 3 ) - x; - line( m, ter_str_id::NULL_ID(), point( x, --ground_edge ), point( x, SEEY * 2 - 1 ) ); + line( m, ter_str_id::NULL_ID(), point( x, --ground_edge ), point( x, SEEY * 2 - 1 ), dat.zlevel() ); } if( w_ravine && s_ravine ) { m->rotate( 1 ); @@ -2162,26 +2162,23 @@ void mapgen_ravine_edge( mapgendata &dat ) } } -void mremove_trap( map *m, const point &p, trap_id type ) +void mremove_trap( map *m, const tripoint_bub_ms &p, trap_id type ) { - tripoint actual_location( p, m->get_abs_sub().z() ); - const trap_id trap_at_loc = m->maptile_at( actual_location ).get_trap().id(); + const trap_id trap_at_loc = m->maptile_at( p ).get_trap().id(); if( type == tr_null || trap_at_loc == type ) { - m->remove_trap( actual_location ); + m->remove_trap( p ); } } -void mtrap_set( map *m, const point &p, trap_id type, bool avoid_creatures ) +void mtrap_set( map *m, const tripoint_bub_ms &p, trap_id type, bool avoid_creatures ) { if( avoid_creatures ) { - Creature *c = get_creature_tracker().creature_at( tripoint_abs_ms( m->getabs( tripoint( p, - m->get_abs_sub().z() ) ) ), true ); + Creature *c = get_creature_tracker().creature_at( tripoint_abs_ms( m->getabs( p ) ), true ); if( c ) { return; } } - tripoint actual_location( p, m->get_abs_sub().z() ); - m->trap_set( actual_location, type ); + m->trap_set( p, type ); } void mtrap_set( tinymap *m, const point &p, trap_id type, bool avoid_creatures ) @@ -2203,10 +2200,9 @@ void madd_field( map *m, const point &p, field_type_id type, int intensity ) m->add_field( actual_location, type, intensity, 0_turns ); } -void mremove_fields( map *m, const point &p ) +void mremove_fields( map *m, const tripoint_bub_ms &p ) { - tripoint actual_location( p, m->get_abs_sub().z() ); - m->clear_fields( actual_location ); + m->clear_fields( p.raw() ); } void resolve_regional_terrain_and_furniture( const mapgendata &dat ) diff --git a/src/mapgen_functions.h b/src/mapgen_functions.h index 76908852b426c..c0626576e46c4 100644 --- a/src/mapgen_functions.h +++ b/src/mapgen_functions.h @@ -49,11 +49,11 @@ void mapgen_ocean_shore( mapgendata &dat ); void mapgen_ravine_edge( mapgendata &dat ); // Temporary wrappers -void mremove_trap( map *m, const point &, trap_id type ); -void mtrap_set( map *m, const point &, trap_id type, bool avoid_creatures = false ); +void mremove_trap( map *m, const tripoint_bub_ms &, trap_id type ); +void mtrap_set( map *m, const tripoint_bub_ms &, trap_id type, bool avoid_creatures = false ); void mtrap_set( tinymap *m, const point &, trap_id type, bool avoid_creatures = false ); void madd_field( map *m, const point &, field_type_id type, int intensity ); -void mremove_fields( map *m, const point & ); +void mremove_fields( map *m, const tripoint_bub_ms & ); mapgen_update_func add_mapgen_update_func( const JsonObject &jo, bool &defer ); bool run_mapgen_update_func( diff --git a/src/mapgenformat.cpp b/src/mapgenformat.cpp index 4babbc590bb89..5b812b5f24d39 100644 --- a/src/mapgenformat.cpp +++ b/src/mapgenformat.cpp @@ -28,7 +28,7 @@ void formatted_set_simple( map *m, const point &start, const char *cstr, } if( furn != furn_str_id::NULL_ID() ) { if( furn == furn_f_toilet ) { - m->place_toilet( p2 ); + m->place_toilet( tripoint_bub_ms( p2.x, p2.y, m->get_abs_sub().z() ) ); } else { m->furn_set( p2, furn ); } diff --git a/src/start_location.cpp b/src/start_location.cpp index 46d86382cc509..8a6276589c528 100644 --- a/src/start_location.cpp +++ b/src/start_location.cpp @@ -594,6 +594,7 @@ static void add_monsters( const tripoint_abs_omt &omtstart, const mongroup_id &t // map::place_spawns internally multiplies density by rng(10, 50) const float density = expected_points / ( ( 10 + 50 ) / 2.0 ); m.place_spawns( type, 1, point_omt_ms( point_zero ), point_omt_ms( SEEX * 2 - 1, SEEY * 2 - 1 ), + omtstart.z(), density ); m.save(); } diff --git a/tests/mapgen_helpers.cpp b/tests/mapgen_helpers.cpp index 761425159bca8..cad9e8e3e17b3 100644 --- a/tests/mapgen_helpers.cpp +++ b/tests/mapgen_helpers.cpp @@ -29,5 +29,5 @@ void manual_nested_mapgen( tripoint_abs_omt const &pos, nested_mapgen_id const & tm.load( pos, true ); mapgendata md( pos, *tm.cast_to_map(), 0.0f, calendar::turn, nullptr ); const auto &ptr = nested_mapgens[id].funcs().pick(); - ( *ptr )->nest( md, point_zero, "test" ); + ( *ptr )->nest( md, tripoint_rel_ms( tripoint_zero ), "test" ); } From a11bdab078fa4d08e6a88c4eaa16b543f919f0ef Mon Sep 17 00:00:00 2001 From: SomeGuyIGues <154325171+SomeGuyIGues@users.noreply.github.com> Date: Tue, 7 May 2024 21:11:02 +1000 Subject: [PATCH 068/104] Update gloves.json I realised that the gloves only partially covering the wrists and back of the hands didn't make sense. I had copied that from gloves_fingerless, now that I think about it, that doesn't make sense. --- data/json/items/armor/gloves.json | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/data/json/items/armor/gloves.json b/data/json/items/armor/gloves.json index 4de10ede59df4..e160f06704fc1 100644 --- a/data/json/items/armor/gloves.json +++ b/data/json/items/armor/gloves.json @@ -1037,20 +1037,14 @@ "material_thickness": 3, "flags": [ "ALLOWS_NATURAL_ATTACKS", "ALLOWS_TALONS" ], "armor": [ - { - "encumbrance": 7, - "coverage": 75, - "covers": [ "hand_l", "hand_r" ], - "specifically_covers": [ "hand_wrist_l", "hand_wrist_r", "hand_back_l", "hand_back_r" ] - }, { "encumbrance": 7, "coverage": 100, "covers": [ "hand_l", "hand_r" ], - "specifically_covers": [ "hand_palm_l", "hand_palm_r" ] + "specifically_covers": [ "hand_wrist_l", "hand_wrist_r", "hand_back_l", "hand_back_r", "hand_palm_l", "hand_palm_r" ] }, { - "coverage": 50, + "coverage": 67, "covers": [ "hand_l", "hand_r" ], "specifically_covers": [ "hand_fingers_l", "hand_fingers_r" ] } From cd5c13cca23d737e7f8002a22f109d6ed950c771 Mon Sep 17 00:00:00 2001 From: SomeGuyIGues <154325171+SomeGuyIGues@users.noreply.github.com> Date: Tue, 7 May 2024 21:12:06 +1000 Subject: [PATCH 069/104] Update hands.json The fingerless wool gloves cover up 83.5% of your hands now, so 84 yarn to craft then. --- data/json/recipes/armor/hands.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/json/recipes/armor/hands.json b/data/json/recipes/armor/hands.json index b22b351555e2f..713c7c28ead2c 100644 --- a/data/json/recipes/armor/hands.json +++ b/data/json/recipes/armor/hands.json @@ -839,7 +839,7 @@ "time": "4 h", "autolearn": true, "proficiencies": [ { "proficiency": "prof_knitting" }, { "proficiency": "prof_knitting_speed" } ], - "using": [ [ "tailoring_wool_knitting", 67 ] ] + "using": [ [ "tailoring_wool_knitting", 84 ] ] }, { "result": "gloves_wool_fingerless", From 076ccc6354e4967d761283e0ff9cb1a2aafe583d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Victor=20Santos=20Rodrigues?= Date: Tue, 7 May 2024 09:40:59 -0300 Subject: [PATCH 070/104] Added to greater dimensional bag to enchanted_misc item group --- data/mods/Magiclysm/itemgroups/itemgroups.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/data/mods/Magiclysm/itemgroups/itemgroups.json b/data/mods/Magiclysm/itemgroups/itemgroups.json index 2fd40a74519e6..2ec3b01068c9c 100644 --- a/data/mods/Magiclysm/itemgroups/itemgroups.json +++ b/data/mods/Magiclysm/itemgroups/itemgroups.json @@ -643,7 +643,8 @@ { "item": "cauldron_demon_chitin", "prob": 20 }, { "item": "fridge_holding_1", "prob": 12 }, { "item": "bag_holding_1", "prob": 8 }, - { "item": "bag_holding_2", "prob": 1 }, + { "item": "bag_holding_2", "prob": 2 }, + { "item": "bag_holding_3", "prob": 1 }, { "item": "cauldron_orichalcum", "prob": 100 }, { "item": "bleed_staff_minor", "prob": 8, "charges": [ 1, 5 ] }, { "item": "grim_reaper_scythe", "prob": 2, "charges": [ 1, 3 ] } From 65323b99b618fd853435d8cea4dbde8c8de56f16 Mon Sep 17 00:00:00 2001 From: RenechCDDA <84619419+RenechCDDA@users.noreply.github.com> Date: Tue, 7 May 2024 09:04:30 -0400 Subject: [PATCH 071/104] Enchantments set bonus speed, not base --- src/monster.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/monster.cpp b/src/monster.cpp index 1dd27bb367148..dc7500d1fd77a 100644 --- a/src/monster.cpp +++ b/src/monster.cpp @@ -3197,8 +3197,8 @@ void monster::process_one_effect( effect &it, bool is_new ) } } //Reset max speed - this->set_speed_base( calculate_by_enchantment( this->get_speed_base(), enchant_vals::mod::SPEED, - true ) ); + set_speed_bonus( calculate_by_enchantment( get_speed_base(), enchant_vals::mod::SPEED, + true ) - get_speed_base() ); } void monster::process_effects() From b150cf1a0f81ca639d39693e1f14cb6f144cf8f9 Mon Sep 17 00:00:00 2001 From: SomeGuyIGues <154325171+SomeGuyIGues@users.noreply.github.com> Date: Tue, 7 May 2024 23:41:47 +1000 Subject: [PATCH 072/104] Update data/json/recipes/armor/hands.json "id_suffix" from base recipe is gone. Co-authored-by: BalthazarArgall <116303491+BalthazarArgall@users.noreply.github.com> --- data/json/recipes/armor/hands.json | 1 - 1 file changed, 1 deletion(-) diff --git a/data/json/recipes/armor/hands.json b/data/json/recipes/armor/hands.json index 713c7c28ead2c..066ab4d848558 100644 --- a/data/json/recipes/armor/hands.json +++ b/data/json/recipes/armor/hands.json @@ -829,7 +829,6 @@ }, { "result": "gloves_wool_fingerless", - "id_suffix": "from_patchwork", "type": "recipe", "activity_level": "NO_EXERCISE", "category": "CC_ARMOR", From e2eff7d1f3ede513a77af7fd92918a35e00487f7 Mon Sep 17 00:00:00 2001 From: SomeGuyIGues <154325171+SomeGuyIGues@users.noreply.github.com> Date: Tue, 7 May 2024 23:43:38 +1000 Subject: [PATCH 073/104] Update data/json/items/armor/gloves.json "proprtional": "price" is removed. Co-authored-by: BalthazarArgall <116303491+BalthazarArgall@users.noreply.github.com> --- data/json/items/armor/gloves.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/json/items/armor/gloves.json b/data/json/items/armor/gloves.json index e160f06704fc1..7879be510c7a3 100644 --- a/data/json/items/armor/gloves.json +++ b/data/json/items/armor/gloves.json @@ -1064,7 +1064,7 @@ "copy-from": "gloves_wool_fingerless", "looks_like": "gloves_wool", "name": { "str": "pair of XS fingerless wool gloves", "str_pl": "pairs of XS fingerless wool gloves" }, - "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, + "proportional": { "weight": 0.75, "volume": 0.75 }, "flags": [ "UNDERSIZE" ] }, { From cd933149d409836129d06de4384131b3ed030190 Mon Sep 17 00:00:00 2001 From: SomeGuyIGues <154325171+SomeGuyIGues@users.noreply.github.com> Date: Tue, 7 May 2024 23:52:54 +1000 Subject: [PATCH 074/104] Update data/json/recipes/armor/hands.json Added xl_gloves_wool_fingerless base recipe Co-authored-by: BalthazarArgall <116303491+BalthazarArgall@users.noreply.github.com> --- data/json/recipes/armor/hands.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/data/json/recipes/armor/hands.json b/data/json/recipes/armor/hands.json index 066ab4d848558..fdb160683a5ab 100644 --- a/data/json/recipes/armor/hands.json +++ b/data/json/recipes/armor/hands.json @@ -866,6 +866,12 @@ "qualities": [ { "id": "CUT", "level": 1 } ], "components": [ [ [ "xs_gloves_wool", 1 ] ] ] }, + { + "copy-from": "gloves_wool_fingerless", + "result": "xl_gloves_wool_fingerless", + "type": "recipe", + "using": [ [ "tailoring_wool_knitting", 93 ] ] + }, { "result": "xl_gloves_wool_fingerless", "id_suffix": "from_gloves", From c5ecf9ef828ee175b217c7abd1dfb1332fc7de77 Mon Sep 17 00:00:00 2001 From: SomeGuyIGues <154325171+SomeGuyIGues@users.noreply.github.com> Date: Tue, 7 May 2024 23:53:20 +1000 Subject: [PATCH 075/104] Update data/json/recipes/armor/hands.json Added xs_gloves_wool_fingerless base recipe Co-authored-by: BalthazarArgall <116303491+BalthazarArgall@users.noreply.github.com> --- data/json/recipes/armor/hands.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/data/json/recipes/armor/hands.json b/data/json/recipes/armor/hands.json index fdb160683a5ab..7fa150e3c28ea 100644 --- a/data/json/recipes/armor/hands.json +++ b/data/json/recipes/armor/hands.json @@ -853,6 +853,12 @@ "qualities": [ { "id": "CUT", "level": 1 } ], "components": [ [ [ "gloves_wool", 1 ] ] ] }, + { + "copy-from": "gloves_wool_fingerless", + "result": "xs_gloves_wool_fingerless", + "type": "recipe", + "using": [ [ "tailoring_wool_knitting", 50 ] ] + }, { "result": "xs_gloves_wool_fingerless", "id_suffix": "from_gloves", From 5cec7ea87ac1c555a3306f9a996a78d0f833900c Mon Sep 17 00:00:00 2001 From: SomeGuyIGues <154325171+SomeGuyIGues@users.noreply.github.com> Date: Wed, 8 May 2024 00:00:53 +1000 Subject: [PATCH 076/104] Update hands.json Changed values for making the xs and xl versions of the fingerless wool gloves to be more appropriate. --- data/json/recipes/armor/hands.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data/json/recipes/armor/hands.json b/data/json/recipes/armor/hands.json index 7fa150e3c28ea..d5cefae81c04f 100644 --- a/data/json/recipes/armor/hands.json +++ b/data/json/recipes/armor/hands.json @@ -838,7 +838,7 @@ "time": "4 h", "autolearn": true, "proficiencies": [ { "proficiency": "prof_knitting" }, { "proficiency": "prof_knitting_speed" } ], - "using": [ [ "tailoring_wool_knitting", 84 ] ] + "using": [ [ "tailoring_wool_knitting", 83 ] ] }, { "result": "gloves_wool_fingerless", @@ -857,7 +857,7 @@ "copy-from": "gloves_wool_fingerless", "result": "xs_gloves_wool_fingerless", "type": "recipe", - "using": [ [ "tailoring_wool_knitting", 50 ] ] + "using": [ [ "tailoring_wool_knitting", 62 ] ] }, { "result": "xs_gloves_wool_fingerless", @@ -876,7 +876,7 @@ "copy-from": "gloves_wool_fingerless", "result": "xl_gloves_wool_fingerless", "type": "recipe", - "using": [ [ "tailoring_wool_knitting", 93 ] ] + "using": [ [ "tailoring_wool_knitting", 116 ] ] }, { "result": "xl_gloves_wool_fingerless", From 51d5603358c3cc72f108879924abbc632c8d0ea4 Mon Sep 17 00:00:00 2001 From: SomeGuyIGues <154325171+SomeGuyIGues@users.noreply.github.com> Date: Wed, 8 May 2024 00:05:41 +1000 Subject: [PATCH 077/104] Update data/json/items/armor/gloves.json Removed "looks_like" from xs_gloves_wool_fingerless, as it already already inheriting from gloves_wool. It's unnecessary. Co-authored-by: BalthazarArgall <116303491+BalthazarArgall@users.noreply.github.com> --- data/json/items/armor/gloves.json | 1 - 1 file changed, 1 deletion(-) diff --git a/data/json/items/armor/gloves.json b/data/json/items/armor/gloves.json index 7879be510c7a3..fca7c1d72b77f 100644 --- a/data/json/items/armor/gloves.json +++ b/data/json/items/armor/gloves.json @@ -1062,7 +1062,6 @@ "id": "xs_gloves_wool_fingerless", "type": "ARMOR", "copy-from": "gloves_wool_fingerless", - "looks_like": "gloves_wool", "name": { "str": "pair of XS fingerless wool gloves", "str_pl": "pairs of XS fingerless wool gloves" }, "proportional": { "weight": 0.75, "volume": 0.75 }, "flags": [ "UNDERSIZE" ] From ec028a90bee5e4774cda5e61cedd3e5e54f30501 Mon Sep 17 00:00:00 2001 From: PatrikLundell Date: Tue, 7 May 2024 16:05:53 +0200 Subject: [PATCH 078/104] typified lightmap --- src/avatar.cpp | 15 ++ src/avatar.h | 2 + src/cata_tiles.cpp | 2 +- src/character.cpp | 11 +- src/creature.cpp | 20 +-- src/editmap.cpp | 2 +- src/explosion.cpp | 2 +- src/game.cpp | 5 +- src/lightmap.cpp | 228 +++++++++++++++++-------------- src/map.cpp | 28 +++- src/map.h | 30 ++-- src/mapgen.cpp | 13 +- src/monster.cpp | 8 +- src/player_hardcoded_effects.cpp | 6 +- src/ranged.cpp | 5 +- src/shadowcasting.cpp | 31 +++-- src/shadowcasting.h | 4 +- src/suffer.cpp | 2 +- tests/char_sight_test.cpp | 12 +- tests/map_test_case.cpp | 24 +++- tests/monster_attack_test.cpp | 8 +- tests/shadowcasting_test.cpp | 42 +++--- 22 files changed, 294 insertions(+), 206 deletions(-) diff --git a/src/avatar.cpp b/src/avatar.cpp index 304f971d6a912..48d2d850f777f 100644 --- a/src/avatar.cpp +++ b/src/avatar.cpp @@ -1245,6 +1245,21 @@ bool avatar::cant_see( const tripoint &p ) return aim_cache[p.x][p.y]; } +bool avatar::cant_see( const tripoint_bub_ms &p ) +{ + + // calc based on recoil + if( !last_target_pos.has_value() ) { + return false; + } + + if( aim_cache_dirty ) { + rebuild_aim_cache(); + } + + return aim_cache[p.x()][p.y()]; +} + void avatar::rebuild_aim_cache() { double pi = 2 * acos( 0.0 ); diff --git a/src/avatar.h b/src/avatar.h index 5d3f78b53018a..2a53a1fd8b991 100644 --- a/src/avatar.h +++ b/src/avatar.h @@ -283,7 +283,9 @@ class avatar : public Character std::string preferred_aiming_mode; // checks if the point is blocked based on characters current aiming state + // TODO Remove untyped overload bool cant_see( const tripoint &p ); + bool cant_see( const tripoint_bub_ms &p ); // rebuilds the full aim cache for the character if it is dirty void rebuild_aim_cache(); diff --git a/src/cata_tiles.cpp b/src/cata_tiles.cpp index ff707696e1ca7..290dc2d307ef9 100644 --- a/src/cata_tiles.cpp +++ b/src/cata_tiles.cpp @@ -1619,7 +1619,7 @@ void cata_tiles::draw( const point &dest, const tripoint ¢er, int width, int } if( g->display_overlay_state( ACTION_DISPLAY_TRANSPARENCY ) ) { - const float tr = here.light_transparency( {x, y, center.z} ); + const float tr = here.light_transparency( tripoint_bub_ms{x, y, center.z} ); int intensity = tr <= LIGHT_TRANSPARENCY_SOLID ? 10 : static_cast ( ( tr - LIGHT_TRANSPARENCY_OPEN_AIR ) * 8 ); draw_debug_tile( intensity, string_format( "%.2f", tr ) ); diff --git a/src/character.cpp b/src/character.cpp index 6172005aa15b5..316dc028345c4 100644 --- a/src/character.cpp +++ b/src/character.cpp @@ -1252,7 +1252,7 @@ int Character::sight_range( float light_level ) const */ int range = static_cast( -std::log( get_vision_threshold( get_map().ambient_light_at( - pos() ) ) / light_level ) / LIGHT_TRANSPARENCY_OPEN_AIR ); + pos_bub() ) ) / light_level ) / LIGHT_TRANSPARENCY_OPEN_AIR ); // Clamp to [1, sight_max]. return clamp( range, 1, sight_max ); @@ -1349,7 +1349,7 @@ int Character::clairvoyance() const bool Character::sight_impaired() const { - const bool in_light = get_map().ambient_light_at( pos() ) > LIGHT_AMBIENT_LIT; + const bool in_light = get_map().ambient_light_at( pos_bub() ) > LIGHT_AMBIENT_LIT; return ( ( has_effect( effect_boomered ) || has_effect( effect_no_sight ) || has_effect( effect_darkness ) ) && ( !has_trait( trait_PER_SLIME_OK ) ) ) || @@ -2518,7 +2518,7 @@ void Character::recalc_sight_limits() { sight_max = 9999; vision_mode_cache.reset(); - const bool in_light = get_map().ambient_light_at( pos() ) > LIGHT_AMBIENT_LIT; + const bool in_light = get_map().ambient_light_at( pos_bub() ) > LIGHT_AMBIENT_LIT; bool in_shell = has_active_mutation( trait_SHELL2 ) || has_active_mutation( trait_SHELL3 ); @@ -2805,9 +2805,10 @@ float Character::fine_detail_vision_mod( const tripoint &p ) const // Same calculation as above, but with a result 3 lower. float ambient_light{}; - tripoint const check_p = p == tripoint_min ? pos() : p; + tripoint_bub_ms const check_p = tripoint_bub_ms( p ) == tripoint_bub_ms( + tripoint_min ) ? pos_bub() : tripoint_bub_ms( p ); tripoint const avatar_p = get_avatar().pos(); - if( is_avatar() || check_p.z == avatar_p.z ) { + if( is_avatar() || check_p.z() == avatar_p.z ) { ambient_light = std::max( 1.0f, LIGHT_AMBIENT_LIT - get_map().ambient_light_at( check_p ) + 1.0f ); } else { diff --git a/src/creature.cpp b/src/creature.cpp index bce766d515c6e..1f7dc9478f7a1 100644 --- a/src/creature.cpp +++ b/src/creature.cpp @@ -491,7 +491,12 @@ bool Creature::sees( const Creature &critter ) const bool Creature::sees( const tripoint &t, bool is_avatar, int range_mod ) const { - if( std::abs( posz() - t.z ) > fov_3d_z_range ) { + return Creature::sees( tripoint_bub_ms( t ), is_avatar, range_mod ); +} + +bool Creature::sees( const tripoint_bub_ms &t, bool is_avatar, int range_mod ) const +{ + if( std::abs( posz() - t.z() ) > fov_3d_z_range ) { return false; } @@ -501,12 +506,12 @@ bool Creature::sees( const tripoint &t, bool is_avatar, int range_mod ) const const int range_night = sight_range( 0 ); const int range_max = std::max( range_day, range_night ); const int range_min = std::min( range_cur, range_max ); - const int wanted_range = rl_dist( pos(), t ); + const int wanted_range = rl_dist( pos_bub(), t ); if( wanted_range <= range_min || ( wanted_range <= range_max && - here.ambient_light_at( t ) > here.get_cache_ref( t.z ).natural_light_level_cache ) ) { + here.ambient_light_at( t ) > here.get_cache_ref( t.z() ).natural_light_level_cache ) ) { int range = 0; - if( here.ambient_light_at( t ) > here.get_cache_ref( t.z ).natural_light_level_cache ) { + if( here.ambient_light_at( t ) > here.get_cache_ref( t.z() ).natural_light_level_cache ) { range = MAX_VIEW_DISTANCE; } else { range = range_min; @@ -524,18 +529,13 @@ bool Creature::sees( const tripoint &t, bool is_avatar, int range_mod ) const return adj_range >= wanted_range && here.get_cache_ref( pos().z ).seen_cache[pos().x][pos().y] > LIGHT_TRANSPARENCY_SOLID; } else { - return here.sees( pos(), t, range ); + return here.sees( pos_bub(), t, range ); } } else { return false; } } -bool Creature::sees( const tripoint_bub_ms &t, bool is_avatar, int range_mod ) const -{ - return sees( t.raw(), is_avatar, range_mod ); -} - // Helper function to check if potential area of effect of a weapon overlaps vehicle // Maybe TODO: If this is too slow, precalculate a bounding box and clip the tested area to it static bool overlaps_vehicle( const std::set &veh_area, const tripoint &pos, diff --git a/src/editmap.cpp b/src/editmap.cpp index 9c5445cde88cd..f9c58970a2a0e 100644 --- a/src/editmap.cpp +++ b/src/editmap.cpp @@ -755,7 +755,7 @@ void editmap::update_view_with_help( const std::string &txt, const std::string & map_cache.seen_cache[target.x][target.y], map_cache.camera_cache[target.x][target.y] ); - map::apparent_light_info al = map::apparent_light_helper( map_cache, target ); + map::apparent_light_info al = map::apparent_light_helper( map_cache, tripoint_bub_ms( target ) ); int apparent_light = static_cast( here.apparent_light_at( target, here.get_visibility_variables_cache() ) ); mvwprintw( w_info, point( 1, off++ ), _( "outside: %d obstructed: %d floor: %d" ), diff --git a/src/explosion.cpp b/src/explosion.cpp index 586b894b4e7dd..77dd8c2ddc7d7 100644 --- a/src/explosion.cpp +++ b/src/explosion.cpp @@ -425,7 +425,7 @@ static std::vector shrapnel( const Creature *source, const tripoint &s castLightAll - ( visited_cache, obstacle_cache, src.xy(), 0, initial_cloud ); + ( visited_cache, obstacle_cache, point_bub_ms( src.xy() ), 0, initial_cloud ); creature_tracker &creatures = get_creature_tracker(); Creature *mutable_source = source == nullptr ? nullptr : creatures.creature_at( source->pos() ); diff --git a/src/game.cpp b/src/game.cpp index 60bb40646521a..bb3df4cf0e55a 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -6636,7 +6636,7 @@ void game::print_terrain_info( const tripoint &lp, const catacurses::window &w_l // Print light level on the selected tile. std::pair ll = get_light_level( std::max( 1.0, - LIGHT_AMBIENT_LIT - m.ambient_light_at( lp ) + 1.0 ) ); + LIGHT_AMBIENT_LIT - m.ambient_light_at( tripoint_bub_ms( lp ) ) + 1.0 ) ); mvwprintz( w_look, point( column, ++line ), c_light_gray, _( "Lighting: " ) ); mvwprintz( w_look, point( column + utf8_width( _( "Lighting: " ) ), line ), ll.second, ll.first ); @@ -10547,7 +10547,8 @@ bool game::walk_move( const tripoint &dest_loc, const bool via_ramp, const bool } const int ramp_adjust = via_ramp ? u.posz() : dest_loc.z; - const float dest_light_level = get_map().ambient_light_at( tripoint( dest_loc.xy(), ramp_adjust ) ); + const float dest_light_level = get_map().ambient_light_at( tripoint_bub_ms( point_bub_ms( + dest_loc.xy() ), ramp_adjust ) ); // Allow players with nyctophobia to move freely through cloudy and dark tiles const float nyctophobia_threshold = LIGHT_AMBIENT_LIT - 3.0f; diff --git a/src/lightmap.cpp b/src/lightmap.cpp index bbe88a5b40f94..14ed3ee467218 100644 --- a/src/lightmap.cpp +++ b/src/lightmap.cpp @@ -56,10 +56,10 @@ static const efftype_id effect_quadruped_full( "quadruped_full" ); static constexpr int LIGHTMAP_CACHE_X = MAPSIZE_X; static constexpr int LIGHTMAP_CACHE_Y = MAPSIZE_Y; -static constexpr point lightmap_boundary_min{}; -static constexpr point lightmap_boundary_max( LIGHTMAP_CACHE_X, LIGHTMAP_CACHE_Y ); +static constexpr point_bub_ms lightmap_boundary_min{}; +static constexpr point_bub_ms lightmap_boundary_max( LIGHTMAP_CACHE_X, LIGHTMAP_CACHE_Y ); -static const half_open_rectangle lightmap_boundaries( +static const half_open_rectangle lightmap_boundaries( lightmap_boundary_min, lightmap_boundary_max ); std::string four_quadrants::to_string() const @@ -69,7 +69,7 @@ std::string four_quadrants::to_string() const ( *this )[quadrant::SW], ( *this )[quadrant::NW] ); } -void map::add_light_from_items( const tripoint &p, const item_stack &items ) +void map::add_light_from_items( const tripoint_bub_ms &p, const item_stack &items ) { for( const item &it : items ) { float ilum = 0.0f; // brightness @@ -230,17 +230,17 @@ bool map::build_vision_transparency_cache( const int zlev ) void map::apply_character_light( Character &p ) { if( p.has_effect( effect_onfire ) ) { - apply_light_source( p.pos(), 8 ); + apply_light_source( p.pos_bub(), 8 ); } else if( p.has_effect( effect_haslight ) ) { - apply_light_source( p.pos(), 4 ); + apply_light_source( p.pos_bub(), 4 ); } const float held_luminance = p.active_light(); if( held_luminance > LIGHT_AMBIENT_LOW ) { - apply_light_source( p.pos(), held_luminance ); + apply_light_source( p.pos_bub(), held_luminance ); } - if( held_luminance >= 4 && held_luminance > ambient_light_at( p.pos() ) - 0.5f ) { + if( held_luminance >= 4 && held_luminance > ambient_light_at( p.pos_bub() ) - 0.5f ) { p.add_effect( effect_haslight, 1_turns ); } } @@ -426,7 +426,7 @@ void map::generate_lightmap( const int zlev ) apply_character_light( guy ); } - std::vector> lm_override; + std::vector> lm_override; // Traverse the submaps in order for( int smx = 0; smx < my_MAPSIZE; ++smx ) { for( int smy = 0; smy < my_MAPSIZE; ++smy ) { @@ -438,25 +438,25 @@ void map::generate_lightmap( const int zlev ) for( int sx = 0; sx < SEEX; ++sx ) { for( int sy = 0; sy < SEEY; ++sy ) { - const point p2( sx + smx * SEEX, sy + smy * SEEY ); - const tripoint p( p2, zlev ); + const point_bub_ms p2( sx + smx * SEEX, sy + smy * SEEY ); + const tripoint_bub_ms p( p2, zlev ); // Project light into any openings into buildings. - if( !outside_cache[p.x][p.y] || ( !top_floor && prev_floor_cache[p.x][p.y] ) ) { + if( !outside_cache[p.x()][p.y()] || ( !top_floor && prev_floor_cache[p.x()][p.y()] ) ) { // Apply light sources for external/internal divide for( int i = 0; i < 4; ++i ) { - point neighbour = p.xy() + point( dir_x[i], dir_y[i] ); + point_bub_ms neighbour = p.xy() + point( dir_x[i], dir_y[i] ); if( lightmap_boundaries.contains( neighbour ) - && outside_cache[neighbour.x][neighbour.y] && - ( top_floor || !prev_floor_cache[neighbour.x][neighbour.y] ) + && outside_cache[neighbour.x()][neighbour.y()] && + ( top_floor || !prev_floor_cache[neighbour.x()][neighbour.y()] ) ) { const float source_light = - std::min( natural_light, lm[neighbour.x][neighbour.y].max() ); + std::min( natural_light, lm[neighbour.x()][neighbour.y()].max() ); if( light_transparency( p ) > LIGHT_TRANSPARENCY_SOLID ) { - update_light_quadrants( lm[p.x][p.y], source_light, quadrant::default_ ); + update_light_quadrants( lm[p.x()][p.y()], source_light, quadrant::default_ ); apply_directional_light( p, dir_d[i], source_light ); } else { - update_light_quadrants( lm[p.x][p.y], source_light, dir_quadrants[i][0] ); - update_light_quadrants( lm[p.x][p.y], source_light, dir_quadrants[i][1] ); + update_light_quadrants( lm[p.x()][p.y()], source_light, dir_quadrants[i][0] ); + update_light_quadrants( lm[p.x()][p.y()], source_light, dir_quadrants[i][1] ); } } } @@ -495,7 +495,7 @@ void map::generate_lightmap( const int zlev ) if( critter.is_hallucination() ) { continue; } - const tripoint mp = critter.pos(); + const tripoint_bub_ms mp = critter.pos_bub(); if( inbounds( mp ) ) { if( critter.has_effect( effect_onfire ) ) { apply_light_source( mp, 8 ); @@ -530,7 +530,7 @@ void map::generate_lightmap( const int zlev ) for( const vehicle_part *pt : lights ) { const vpart_info &vp = pt->info(); - tripoint src = v->global_part_pos3( *pt ); + tripoint_bub_ms src = v->bub_part_pos( *pt ); if( !inbounds( src ) ) { continue; @@ -554,9 +554,9 @@ void map::generate_lightmap( const int zlev ) if( vp.has_flag( VPFLAG_WALL_MOUNTED ) ) { tileray tdir( v->face.dir() + pt->direction ); tdir.advance(); - tripoint offset = src; - offset.x = src.x + tdir.dx(); - offset.y = src.y + tdir.dy(); + tripoint_bub_ms offset = src; + offset.x() = src.x() + tdir.dx(); + offset.y() = src.y() + tdir.dy(); add_light_source( offset, M_SQRT2 ); // Add a little surrounding light apply_light_arc( offset, v->face.dir() + pt->direction, vp.bonus, 180_degrees ); } else { @@ -579,7 +579,7 @@ void map::generate_lightmap( const int zlev ) } for( const vpart_reference &vpr : v->get_any_parts( VPFLAG_CARGO ) ) { - const tripoint pos = vpr.pos(); + const tripoint_bub_ms pos = vpr.pos_bub(); if( !inbounds( pos ) || vpr.info().has_flag( "COVERED" ) ) { continue; } @@ -592,22 +592,22 @@ void map::generate_lightmap( const int zlev ) unbuffered: (12^2)*(160*4) = apply_light_ray x 92160 buffered: (12*4)*(160) = apply_light_ray x 7680 */ - const tripoint cache_start( 0, 0, zlev ); - const tripoint cache_end( LIGHTMAP_CACHE_X, LIGHTMAP_CACHE_Y, zlev ); - for( const tripoint &p : points_in_rectangle( cache_start, cache_end ) ) { - if( light_source_buffer[p.x][p.y] > 0.0 ) { - apply_light_source( p, light_source_buffer[p.x][p.y] ); + const tripoint_bub_ms cache_start( 0, 0, zlev ); + const tripoint_bub_ms cache_end( LIGHTMAP_CACHE_X, LIGHTMAP_CACHE_Y, zlev ); + for( const tripoint_bub_ms &p : points_in_rectangle( cache_start, cache_end ) ) { + if( light_source_buffer[p.x()][p.y()] > 0.0 ) { + apply_light_source( p, light_source_buffer[p.x()][p.y()] ); } } - for( const std::pair &elem : lm_override ) { - lm[elem.first.x][elem.first.y].fill( elem.second ); + for( const std::pair &elem : lm_override ) { + lm[elem.first.x()][elem.first.y()].fill( elem.second ); } } -void map::add_light_source( const tripoint &p, float luminance ) +void map::add_light_source( const tripoint_bub_ms &p, float luminance ) { - auto &light_source_buffer = get_cache( p.z ).light_source_buffer; - light_source_buffer[p.x][p.y] = std::max( luminance, light_source_buffer[p.x][p.y] ); + auto &light_source_buffer = get_cache( p.z() ).light_source_buffer; + light_source_buffer[p.x()][p.y()] = std::max( luminance, light_source_buffer[p.x()][p.y()] ); } // Tile light/transparency: 3D @@ -637,13 +637,13 @@ lit_level map::light_at( const tripoint &p ) const return lit_level::DARK; } -float map::ambient_light_at( const tripoint &p ) const +float map::ambient_light_at( const tripoint_bub_ms &p ) const { - if( !inbounds( p ) ) { + if( !this->inbounds( p ) ) { return 0.0f; } - return get_cache_ref( p.z ).lm[p.x][p.y].max(); + return get_cache_ref( p.z() ).lm[p.x()][p.y()].max(); } bool map::is_transparent( const tripoint &p ) const @@ -661,22 +661,27 @@ float map::light_transparency( const tripoint &p ) const return get_cache_ref( p.z ).transparency_cache[p.x][p.y]; } +float map::light_transparency( const tripoint_bub_ms &p ) const +{ + return get_cache_ref( p.z() ).transparency_cache[p.x()][p.y()]; +} + // End of tile light/transparency map::apparent_light_info map::apparent_light_helper( const level_cache &map_cache, - const tripoint &p ) + const tripoint_bub_ms &p ) { avatar const &u = get_avatar(); - const int dist = rl_dist( u.pos(), p ); + const int dist = rl_dist( u.pos_bub(), p ); const float abs_vis = - std::max( map_cache.seen_cache[p.x][p.y], map_cache.camera_cache[p.x][p.y] ); - const float vis = dist > u.unimpaired_range() ? map_cache.camera_cache[p.x][p.y] : abs_vis; + std::max( map_cache.seen_cache[p.x()][p.y()], map_cache.camera_cache[p.x()][p.y()] ); + const float vis = dist > u.unimpaired_range() ? map_cache.camera_cache[p.x()][p.y()] : abs_vis; const bool obstructed = vis <= LIGHT_TRANSPARENCY_SOLID + 0.1; const bool abs_obstructed = abs_vis <= LIGHT_TRANSPARENCY_SOLID + 0.1; - auto is_opaque = [&map_cache]( const point & p ) { - return map_cache.transparency_cache[p.x][p.y] <= LIGHT_TRANSPARENCY_SOLID && - map_cache.vision_transparency_cache[p.x][p.y] <= LIGHT_TRANSPARENCY_SOLID; + auto is_opaque = [&map_cache]( const point_bub_ms & p ) { + return map_cache.transparency_cache[p.x()][p.y()] <= LIGHT_TRANSPARENCY_SOLID && + map_cache.vision_transparency_cache[p.x()][p.y()] <= LIGHT_TRANSPARENCY_SOLID; }; // possibly reduce view if aiming (also blocks light) @@ -711,7 +716,7 @@ map::apparent_light_info map::apparent_light_helper( const level_cache &map_cach four_quadrants seen_from( 0 ); for( const offset_and_quadrants &oq : adjacent_offsets ) { - const point neighbour = p.xy() + oq.offset; + const point_bub_ms neighbour = p.xy() + oq.offset; if( !lightmap_boundaries.contains( neighbour ) ) { continue; @@ -719,10 +724,10 @@ map::apparent_light_info map::apparent_light_helper( const level_cache &map_cach if( is_opaque( neighbour ) ) { continue; } - if( ( rl_dist( u.pos().xy(), neighbour ) > u.unimpaired_range() && - map_cache.camera_cache[neighbour.x][neighbour.y] == 0 ) || - ( map_cache.seen_cache[neighbour.x][neighbour.y] == 0 && - map_cache.camera_cache[neighbour.x][neighbour.y] == 0 ) ) { + if( ( rl_dist( u.pos_bub().xy(), neighbour ) > u.unimpaired_range() && + map_cache.camera_cache[neighbour.x()][neighbour.y()] == 0 ) || + ( map_cache.seen_cache[neighbour.x()][neighbour.y()] == 0 && + map_cache.camera_cache[neighbour.x()][neighbour.y()] == 0 ) ) { continue; } // This is a non-opaque visible neighbour, so count visibility from the relevant @@ -730,19 +735,25 @@ map::apparent_light_info map::apparent_light_helper( const level_cache &map_cach seen_from[oq.quadrants[0]] = vis; seen_from[oq.quadrants[1]] = vis; } - apparent_light = ( seen_from * map_cache.lm[p.x][p.y] ).max(); + apparent_light = ( seen_from * map_cache.lm[p.x()][p.y()] ).max(); } else { // This is the simple case, for a non-opaque tile light from all // directions is equivalent - apparent_light = vis * map_cache.lm[p.x][p.y].max(); + apparent_light = vis * map_cache.lm[p.x()][p.y()].max(); } return { obstructed, abs_obstructed, apparent_light }; } lit_level map::apparent_light_at( const tripoint &p, const visibility_variables &cache ) const +{ + return apparent_light_at( tripoint_bub_ms( p ), cache ); +} + +lit_level map::apparent_light_at( const tripoint_bub_ms &p, + const visibility_variables &cache ) const { Character &player_character = get_player_character(); - const int dist = rl_dist( player_character.pos(), p ); + const int dist = rl_dist( player_character.pos_bub(), p ); // Clairvoyance overrides everything. if( cache.u_clairvoyance > 0 && dist <= cache.u_clairvoyance ) { @@ -751,13 +762,13 @@ lit_level map::apparent_light_at( const tripoint &p, const visibility_variables if( cache.clairvoyance_field && field_at( p ).find_field( *cache.clairvoyance_field ) ) { return lit_level::BRIGHT; } - const level_cache &map_cache = get_cache_ref( p.z ); + const level_cache &map_cache = get_cache_ref( p.z() ); const apparent_light_info a = apparent_light_helper( map_cache, p ); // Unimpaired range is an override to strictly limit vision range based on various conditions, // but the player can still see light sources - if( dist > player_character.unimpaired_range() && map_cache.camera_cache[p.x][p.y] == 0.0 ) { - if( !a.abs_obstructed && map_cache.sm[p.x][p.y] > 0.0 ) { + if( dist > player_character.unimpaired_range() && map_cache.camera_cache[p.x()][p.y()] == 0.0 ) { + if( !a.abs_obstructed && map_cache.sm[p.x()][p.y()] > 0.0 ) { return lit_level::BRIGHT_ONLY; } return lit_level::BLANK; @@ -774,7 +785,7 @@ lit_level map::apparent_light_at( const tripoint &p, const visibility_variables return lit_level::BLANK; } // Then we just search for the light level in descending order. - if( a.apparent_light > LIGHT_SOURCE_BRIGHT || map_cache.sm[p.x][p.y] > 0.0 ) { + if( a.apparent_light > LIGHT_SOURCE_BRIGHT || map_cache.sm[p.x()][p.y()] > 0.0 ) { return lit_level::BRIGHT; } if( a.apparent_light > LIGHT_AMBIENT_LIT ) { @@ -788,24 +799,29 @@ lit_level map::apparent_light_at( const tripoint &p, const visibility_variables } bool map::pl_sees( const tripoint &t, const int max_range ) const +{ + return pl_sees( tripoint_bub_ms( t ), max_range ); +} + +bool map::pl_sees( const tripoint_bub_ms &t, const int max_range ) const { if( !inbounds( t ) ) { return false; } - const level_cache &map_cache = get_cache_ref( t.z ); + const level_cache &map_cache = get_cache_ref( t.z() ); Character &player_character = get_player_character(); if( max_range >= 0 && square_dist( getglobal( t ), player_character.get_location() ) > max_range && - map_cache.camera_cache[t.x][t.y] == 0 ) { + map_cache.camera_cache[t.x()][t.y()] == 0 ) { return false; // Out of range! } const apparent_light_info a = apparent_light_helper( map_cache, t ); // avatar might not be on *this* map - const float light_at_player = get_map().ambient_light_at( player_character.pos() ); + const float light_at_player = get_map().ambient_light_at( player_character.pos_bub() ); return !a.obstructed && ( a.apparent_light >= player_character.get_vision_threshold( light_at_player ) || - map_cache.sm[t.x][t.y] > 0.0 ); + map_cache.sm[t.x()][t.y()] > 0.0 ); } // For a direction vector defined by x, y, return the quadrant that's the @@ -825,7 +841,7 @@ template void castLight( cata::mdarray &output_cache, const cata::mdarray &input_array, - const point &offset, int offsetDistance, + const point_bub_ms &offset, int offsetDistance, T numerator = VISIBILITY_FULL, int row = 1, float start = 1.0f, float end = 0.0f, T cumulative_transparency = T( LIGHT_TRANSPARENCY_OPEN_AIR ) ); @@ -837,7 +853,7 @@ template void castLight( cata::mdarray &output_cache, const cata::mdarray &input_array, - const point &offset, const int offsetDistance, const T numerator, + const point_bub_ms &offset, const int offsetDistance, const T numerator, const int row, float start, const float end, T cumulative_transparency ) { constexpr quadrant quad = quadrant_from_x_y( -xx - xy, -yx - yy ); @@ -859,7 +875,7 @@ void castLight( cata::mdarray &output_cache, delta.x = -distance + std::max( static_cast( std::ceil( away * ( -distance - 0.5f ) ) ), 0 ); for( ; delta.x <= 0; delta.x++ ) { - point current( offset.x + delta.x * xx + delta.y * xy, offset.y + delta.x * yx + delta.y * yy ); + point current( offset.x() + delta.x * xx + delta.y * xy, offset.y() + delta.x * yx + delta.y * yy ); float trailingEdge = ( delta.x - 0.5f ) / ( delta.y + 0.5f ); float leadingEdge = ( delta.x + 0.5f ) / ( delta.y - 0.5f ); @@ -927,7 +943,7 @@ template void castLightAll( cata::mdarray &output_cache, const cata::mdarray &input_array, - const point &offset, int offsetDistance, T numerator ) + const point_bub_ms &offset, int offsetDistance, T numerator ) { castLight<0, 1, 1, 0, T, Out, calc, check, update_output, accumulate>( output_cache, input_array, offset, offsetDistance, numerator ); @@ -954,7 +970,7 @@ template void castLightAll( cata::mdarray &output_cache, const cata::mdarray &input_array, - const point &offset, int offsetDistance, float numerator ); + const point_bub_ms &offset, int offsetDistance, float numerator ); template void castLightAll &output_cache, const cata::mdarray &input_array, - const point &offset, int offsetDistance, fragment_cloud numerator ); + const point_bub_ms &offset, int offsetDistance, fragment_cloud numerator ); /** * Calculates the Field Of View for the provided map from the given x, y @@ -976,7 +992,7 @@ castLightAll( @@ -1037,14 +1053,14 @@ void map::build_seen_cache( const tripoint &origin, const int target_z, int exte if( vp.part().removed || vp.part().is_broken() || !vp.info().has_flag( VPFLAG_EXTENDS_VISION ) ) { continue; } - const tripoint mirror_pos = vp.pos(); - if( rl_dist( origin, vp.pos() ) > extension_range ) { + const tripoint_bub_ms mirror_pos = vp.pos_bub(); + if( rl_dist( origin, vp.pos_bub() ) > extension_range ) { continue; } // We can utilize the current state of the seen cache to determine // if the player can see the mirror from their position. if( !vp.info().has_flag( "CAMERA" ) && - out_cache[mirror_pos.x][mirror_pos.y] < LIGHT_TRANSPARENCY_SOLID + 0.1 ) { + out_cache[mirror_pos.x()][mirror_pos.y()] < LIGHT_TRANSPARENCY_SOLID + 0.1 ) { continue; } else if( !vp.info().has_flag( "CAMERA_CONTROL" ) ) { mirrors.emplace_back( static_cast( vp.part_index() ) ); @@ -1063,7 +1079,7 @@ void map::build_seen_cache( const tripoint &origin, const int target_z, int exte continue; // Player not at camera control, so cameras don't work } - const tripoint mirror_pos = veh->global_part_pos3( vp_mirror ); + const tripoint_bub_ms mirror_pos = veh->bub_part_pos( vp_mirror ); // Determine how far the light has already traveled so mirrors // don't cheat the light distance falloff. @@ -1074,7 +1090,7 @@ void map::build_seen_cache( const tripoint &origin, const int target_z, int exte } else { offsetDistance = 60 - vpi_mirror.bonus * vp_mirror.hp() / vpi_mirror.durability; mocache = &camera_cache; - ( *mocache )[mirror_pos.x][mirror_pos.y] = LIGHT_TRANSPARENCY_OPEN_AIR; + ( *mocache )[mirror_pos.x()][mirror_pos.y()] = LIGHT_TRANSPARENCY_OPEN_AIR; } // TODO: Factor in the mirror facing and only cast in the @@ -1152,9 +1168,9 @@ static bool light_check( const float &transparency, const float &intensity ) return transparency > LIGHT_TRANSPARENCY_SOLID && intensity > LIGHT_AMBIENT_LOW; } -void map::apply_light_source( const tripoint &p, float luminance ) +void map::apply_light_source( const tripoint_bub_ms &p, float luminance ) { - level_cache &cache = get_cache( p.z ); + level_cache &cache = get_cache( p.z() ); cata::mdarray &lm = cache.lm; cata::mdarray &sm = cache.sm; cata::mdarray &transparency_cache = @@ -1162,12 +1178,12 @@ void map::apply_light_source( const tripoint &p, float luminance ) cata::mdarray &light_source_buffer = cache.light_source_buffer; - const point p2( p.xy() ); + const point_bub_ms p2( p.xy() ); if( inbounds( p ) ) { const float min_light = std::max( static_cast( lit_level::LOW ), luminance ); - lm[p2.x][p2.y] = elementwise_max( lm[p2.x][p2.y], min_light ); - sm[p2.x][p2.y] = std::max( sm[p2.x][p2.y], luminance ); + lm[p2.x()][p2.y()] = elementwise_max( lm[p2.x()][p2.y()], min_light ); + sm[p2.x()][p2.y()] = std::max( sm[p2.x()][p2.y()], luminance ); } if( luminance <= lit_level::LOW ) { return; @@ -1192,10 +1208,10 @@ void map::apply_light_source( const tripoint &p, float luminance ) sy */ const int peer_inbounds = LIGHTMAP_CACHE_X - 1; - bool north = p2.y != 0 && light_source_buffer[p2.x][p2.y - 1] < luminance; - bool south = p2.y != peer_inbounds && light_source_buffer[p2.x][p2.y + 1] < luminance; - bool east = p2.x != peer_inbounds && light_source_buffer[p2.x + 1][p2.y] < luminance; - bool west = p2.x != 0 && light_source_buffer[p2.x - 1][p2.y] < luminance; + bool north = p2.y() != 0 && light_source_buffer[p2.x()][p2.y() - 1] < luminance; + bool south = p2.y() != peer_inbounds && light_source_buffer[p2.x()][p2.y() + 1] < luminance; + bool east = p2.x() != peer_inbounds && light_source_buffer[p2.x() + 1][p2.y()] < luminance; + bool west = p2.x() != 0 && light_source_buffer[p2.x() - 1][p2.y()] < luminance; if( north ) { castLight < 1, 0, 0, -1, float, four_quadrants, light_calc, light_check, @@ -1234,11 +1250,11 @@ void map::apply_light_source( const tripoint &p, float luminance ) } } -void map::apply_directional_light( const tripoint &p, int direction, float luminance ) +void map::apply_directional_light( const tripoint_bub_ms &p, int direction, float luminance ) { - const point p2( p.xy() ); + const point_bub_ms p2( p.xy() ); - level_cache &cache = get_cache( p.z ); + level_cache &cache = get_cache( p.z() ); cata::mdarray &lm = cache.lm; cata::mdarray &transparency_cache = cache.transparency_cache; @@ -1274,7 +1290,7 @@ void map::apply_directional_light( const tripoint &p, int direction, float lumin } } -void map::apply_light_arc( const tripoint &p, const units::angle &angle, float luminance, +void map::apply_light_arc( const tripoint_bub_ms &p, const units::angle &angle, float luminance, const units::angle &wideangle ) { if( luminance <= LIGHT_SOURCE_LOCAL ) { @@ -1283,9 +1299,9 @@ void map::apply_light_arc( const tripoint &p, const units::angle &angle, float l apply_light_source( p, LIGHT_SOURCE_LOCAL ); - const point p2( p.xy() ); + const point_bub_ms p2( p.xy() ); - level_cache &cache = get_cache( p.z ); + level_cache &cache = get_cache( p.z() ); cata::mdarray &lm = cache.lm; cata::mdarray &transparency_cache = cache.transparency_cache; @@ -1446,7 +1462,7 @@ void map::apply_light_ray( { point a( std::abs( e.x - s.x ) * 2, std::abs( e.y - s.y ) * 2 ); point d( ( s.x < e.x ) ? 1 : -1, ( s.y < e.y ) ? 1 : -1 ); - point p( s.xy() ); + point_bub_ms p( s.xy() ); quadrant quad = quadrant_from_x_y( d.x, d.y ); @@ -1467,23 +1483,23 @@ void map::apply_light_ray( int t = a.y - ( a.x / 2 ); do { if( t >= 0 ) { - p.y += d.y; + p.y() += d.y; t -= a.x; } - p.x += d.x; + p.x() += d.x; t += a.y; // TODO: clamp coordinates to map bounds before this method is called. if( lightmap_boundaries.contains( p ) ) { - float current_transparency = transparency_cache[p.x][p.y]; + float current_transparency = transparency_cache[p.x()][p.y()]; bool is_opaque = current_transparency == LIGHT_TRANSPARENCY_SOLID; - if( !lit[p.x][p.y] ) { + if( !lit[p.x()][p.y()] ) { // Multiple rays will pass through the same squares so we need to record that - lit[p.x][p.y] = true; + lit[p.x()][p.y()] = true; float lm_val = luminance / ( fastexp( transparency * distance ) * distance ); quadrant q = is_opaque ? quad : quadrant::default_; - lm[p.x][p.y][q] = std::max( lm[p.x][p.y][q], lm_val ); + lm[p.x()][p.y()][q] = std::max( lm[p.x()][p.y()][q], lm_val ); } if( is_opaque ) { break; @@ -1495,27 +1511,27 @@ void map::apply_light_ray( } distance += scaling_factor; - } while( !( p.x == e.x && p.y == e.y ) ); + } while( !( p.x() == e.x && p.y() == e.y ) ); } else { int t = a.x - ( a.y / 2 ); do { if( t >= 0 ) { - p.x += d.x; + p.x() += d.x; t -= a.y; } - p.y += d.y; + p.y() += d.y; t += a.x; if( lightmap_boundaries.contains( p ) ) { - float current_transparency = transparency_cache[p.x][p.y]; + float current_transparency = transparency_cache[p.x()][p.y()]; bool is_opaque = current_transparency == LIGHT_TRANSPARENCY_SOLID; - if( !lit[p.x][p.y] ) { + if( !lit[p.x()][p.y()] ) { // Multiple rays will pass through the same squares so we need to record that - lit[p.x][p.y] = true; + lit[p.x()][p.y()] = true; float lm_val = luminance / ( fastexp( transparency * distance ) * distance ); quadrant q = is_opaque ? quad : quadrant::default_; - lm[p.x][p.y][q] = std::max( lm[p.x][p.y][q], lm_val ); + lm[p.x()][p.y()][q] = std::max( lm[p.x()][p.y()][q], lm_val ); } if( is_opaque ) { break; @@ -1527,6 +1543,6 @@ void map::apply_light_ray( } distance += scaling_factor; - } while( !( p.x == e.x && p.y == e.y ) ); + } while( !( p.x() == e.x && p.y() == e.y ) ); } } diff --git a/src/map.cpp b/src/map.cpp index ce0adc5efe841..2c5f23d1bbaf4 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -6394,6 +6394,11 @@ const field &map::field_at( const tripoint &p ) const return current_submap->get_field( l ); } +const field &map::field_at( const tripoint_bub_ms &p ) const +{ + return field_at( p.raw() ); +} + /* * As above, except not const */ @@ -7380,6 +7385,13 @@ bool map::sees( const tripoint &F, const tripoint &T, const int range, bool with return sees( F, T, range, dummy, with_fields ); } +bool map::sees( const tripoint_bub_ms &F, const tripoint_bub_ms &T, const int range, + bool with_fields ) const +{ + int dummy = 0; + return sees( F.raw(), T.raw(), range, dummy, with_fields ); +} + point map::sees_cache_key( const tripoint &from, const tripoint &to ) const { @@ -9579,7 +9591,7 @@ void map::build_map_cache( const int zlev, bool skip_lightmap ) seen_cache_dirty |= player_prev_pos != p || sr != player_prev_range || camera_cache_dirty; if( seen_cache_dirty ) { if( inbounds( p ) ) { - build_seen_cache( getlocal( p ), zlev, sr ); + build_seen_cache( bub_from_abs( p ), zlev, sr ); } player_prev_pos = p; player_prev_range = sr; @@ -9597,7 +9609,7 @@ void map::build_map_cache( const int zlev, bool skip_lightmap ) for( Character::cached_moncam const &mon : u.moncam_cache ) { if( inbounds( mon.second ) ) { int const range = mon.first->type->vision_day; - build_seen_cache( getlocal( mon.second ), mon.second.z(), range, cumulative, + build_seen_cache( bub_from_abs( mon.second ), mon.second.z(), range, cumulative, true, std::max( 60 - range, 0 ) ); cumulative = true; } @@ -10106,6 +10118,18 @@ tripoint_range map::points_in_rectangle( const tripoint &from, const t return tripoint_range( min, max ); } +tripoint_range map::points_in_rectangle( const tripoint_bub_ms &from, + const tripoint_bub_ms &to ) const +{ + const tripoint_bub_ms min( std::max( 0, std::min( from.x(), to.x() ) ), std::max( 0, + std::min( from.y(), + to.y() ) ), std::max( -OVERMAP_DEPTH, std::min( from.z(), to.z() ) ) ); + const tripoint_bub_ms max( std::min( SEEX * my_MAPSIZE - 1, std::max( from.x(), to.x() ) ), + std::min( SEEX * my_MAPSIZE - 1, std::max( from.y(), to.y() ) ), std::min( OVERMAP_HEIGHT, + std::max( from.z(), to.z() ) ) ); + return tripoint_range( min, max ); +} + tripoint_range map::points_in_radius( const tripoint ¢er, size_t radius, size_t radiusz ) const { diff --git a/src/map.h b/src/map.h index b8f336eb75f4b..1f48c732547b1 100644 --- a/src/map.h +++ b/src/map.h @@ -430,14 +430,16 @@ class map /** Helper function for light calculation; exposed here for map editor */ static apparent_light_info apparent_light_helper( const level_cache &map_cache, - const tripoint &p ); + const tripoint_bub_ms &p ); /** Determine the visible light level for a tile, based on light_at * for the tile, vision distance, etc * * @param p The tile on this map to draw. * @param cache Currently cached visibility parameters */ + // TODO: Get rid of untyped overload lit_level apparent_light_at( const tripoint &p, const visibility_variables &cache ) const; + lit_level apparent_light_at( const tripoint_bub_ms &p, const visibility_variables &cache ) const; visibility_type get_visibility( lit_level ll, const visibility_variables &cache ) const; @@ -613,7 +615,10 @@ class map /** * Returns whether `F` sees `T` with a view range of `range`. */ + // TODO: Get rid of untyped overload. bool sees( const tripoint &F, const tripoint &T, int range, bool with_fields = true ) const; + bool sees( const tripoint_bub_ms &F, const tripoint_bub_ms &T, int range, + bool with_fields = true ) const; private: /** * Don't expose the slope adjust outside map functions. @@ -1575,7 +1580,9 @@ class map * one can not change the fields. * @param p The local map coordinates, if out of bounds, returns an empty field. */ + // TODO: fix point types (remove the first overload) const field &field_at( const tripoint &p ) const; + const field &field_at( const tripoint_bub_ms &p ) const; /** * Gets fields that are here. Both for querying and edition. */ @@ -1836,11 +1843,13 @@ class map int init_veh_fuel = -1, int init_veh_status = -1, bool merge_wrecks = true ); // Light/transparency + // TODO: Remove untyped overload float light_transparency( const tripoint &p ) const; + float light_transparency( const tripoint_bub_ms &p ) const; // Assumes 0,0 is light map center lit_level light_at( const tripoint &p ) const; // Raw values for tilesets - float ambient_light_at( const tripoint &p ) const; + float ambient_light_at( const tripoint_bub_ms &p ) const; /** * Returns whether the tile at `p` is transparent(you can look past it). */ @@ -1856,7 +1865,9 @@ class map * @param max_range All squares that are further away than this are invisible. * Ignored if smaller than 0. */ + // TODO: Get rid of untyped overload. bool pl_sees( const tripoint &t, int max_range ) const; + bool pl_sees( const tripoint_bub_ms &t, int max_range ) const; std::set dirty_vehicle_list; @@ -2039,7 +2050,7 @@ class map protected: void generate_lightmap( int zlev ); - void build_seen_cache( const tripoint &origin, int target_z, int extension_range = 60, + void build_seen_cache( const tripoint_bub_ms &origin, int target_z, int extension_range = 60, bool cumulative = false, bool camera = false, int penalty = 0 ); void apply_character_light( Character &p ); @@ -2206,17 +2217,17 @@ class map int determine_wall_corner( const tripoint &p ) const; // apply a circular light pattern immediately, however it's best to use... - void apply_light_source( const tripoint &p, float luminance ); + void apply_light_source( const tripoint_bub_ms &p, float luminance ); // ...this, which will apply the light after at the end of generate_lightmap, and prevent redundant // light rays from causing massive slowdowns, if there's a huge amount of light. - void add_light_source( const tripoint &p, float luminance ); + void add_light_source( const tripoint_bub_ms &p, float luminance ); // Handle just cardinal directions and 45 deg angles. - void apply_directional_light( const tripoint &p, int direction, float luminance ); - void apply_light_arc( const tripoint &p, const units::angle &angle, float luminance, + void apply_directional_light( const tripoint_bub_ms &p, int direction, float luminance ); + void apply_light_arc( const tripoint_bub_ms &p, const units::angle &angle, float luminance, const units::angle &wideangle = 30_degrees ); void apply_light_ray( cata::mdarray &lit, const tripoint &s, const tripoint &e, float luminance ); - void add_light_from_items( const tripoint &p, const item_stack &items ); + void add_light_from_items( const tripoint_bub_ms &p, const item_stack &items ); std::unique_ptr add_vehicle_to_map( std::unique_ptr veh, bool merge_wrecks ); // Internal methods used to bash just the selected features @@ -2352,8 +2363,11 @@ class map return submaps_with_active_items; } // Clips the area to map bounds + // TODO: fix point types (remove the first overload) tripoint_range points_in_rectangle( const tripoint &from, const tripoint &to ) const; + tripoint_range points_in_rectangle( + const tripoint_bub_ms &from, const tripoint_bub_ms &to ) const; // TODO: fix point types (remove the first overload) tripoint_range points_in_radius( const tripoint ¢er, size_t radius, size_t radiusz = 0 ) const; diff --git a/src/mapgen.cpp b/src/mapgen.cpp index 752201d69eb31..7200ba72b2cb7 100644 --- a/src/mapgen.cpp +++ b/src/mapgen.cpp @@ -5537,9 +5537,10 @@ void map::draw_lab( mapgendata &dat ) return ter( p ) == ter_t_thconc_floor && furn( p ) == furn_str_id::NULL_ID() && 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() } ); + // Can't the tripoint_bub_ms because 'random_point' below only supports the untyped version. + const tripoint_range range = + points_in_rectangle( tripoint{ 0, 0, abs_sub.z() }, + tripoint{ SEEX * 2 - 2, SEEY * 2 - 2, abs_sub.z() } ); if( const auto p = random_point( range, predicate ) ) { ter_set( *p, t_stair_type ); @@ -5977,8 +5978,9 @@ void map::draw_lab( mapgendata &dat ) } // portal with an artifact effect. case 5: { + // Can't use tripoint_bub_ms because 'random_point' below only supports the untyped version. tripoint_range options = - points_in_rectangle( { 6, 6, abs_sub.z() }, + points_in_rectangle( tripoint{ 6, 6, abs_sub.z() }, { SEEX * 2 - 7, SEEY * 2 - 7, abs_sub.z() } ); std::optional center = random_point( options, [&]( const tripoint & p ) { @@ -6347,7 +6349,8 @@ void map::draw_lab( mapgendata &dat ) return ter( p ) == ter_t_thconc_floor && furn( p ) == furn_str_id::NULL_ID() && tr_at( p ).is_null(); }; - const auto range = points_in_rectangle( { 0, 0, abs_sub.z() }, + // Can't use tripoint_bub_ms because 'random_point' below only supports the untyped version. + const tripoint_range range = points_in_rectangle( tripoint{ 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 ); diff --git a/src/monster.cpp b/src/monster.cpp index 1dd27bb367148..0305137728473 100644 --- a/src/monster.cpp +++ b/src/monster.cpp @@ -1668,7 +1668,7 @@ void monster::process_triggers() process_trigger( mon_trigger::BRIGHT_LIGHT, [this]() { int ret = 0; static const int dim_light = round( .75 * default_daylight_level() ); - int light = round( get_map().ambient_light_at( pos() ) ); + int light = round( get_map().ambient_light_at( pos_bub() ) ); if( light >= dim_light ) { ret += 10; } @@ -3246,7 +3246,7 @@ void monster::process_effects() } if( type->regenerates_in_dark && !g->is_in_sunlight( pos() ) ) { - const float light = get_map().ambient_light_at( pos() ); + const float light = get_map().ambient_light_at( pos_bub() ); // Magic number 10000 was chosen so that a floodlight prevents regeneration in a range of 20 tiles const float dHP = 50.0 * std::exp( - light * light / 10000 ); if( heal( static_cast( dHP ) ) > 0 && one_in( 2 ) ) { @@ -3342,7 +3342,7 @@ void monster::process_effects() add_effect( effect_nemesis_buff, 1000_turns, true ); } - if( has_flag( mon_flag_PHOTOPHOBIC ) && get_map().ambient_light_at( pos() ) >= 30.0f ) { + if( has_flag( mon_flag_PHOTOPHOBIC ) && get_map().ambient_light_at( pos_bub() ) >= 30.0f ) { add_msg_if_player_sees( *this, m_good, _( "The shadow withers in the light!" ), name() ); add_effect( effect_photophobia, 5_turns, true ); } @@ -3988,7 +3988,7 @@ std::unordered_set monster::get_path_avoid() const std::unordered_set ret; map &here = get_map(); - int radius = std::min( sight_range( here.ambient_light_at( pos() ) ), 5 ); + int radius = std::min( sight_range( here.ambient_light_at( pos_bub() ) ), 5 ); for( const tripoint &p : here.points_in_radius( pos(), radius ) ) { if( !can_move_to( p ) ) { diff --git a/src/player_hardcoded_effects.cpp b/src/player_hardcoded_effects.cpp index 3b5f98fcb8877..679768e2a5402 100644 --- a/src/player_hardcoded_effects.cpp +++ b/src/player_hardcoded_effects.cpp @@ -1150,7 +1150,7 @@ static void eff_fun_sleep( Character &u, effect &it ) if( !u.has_flag( json_flag_SEESLEEP ) ) { if( u.has_trait( trait_HEAVYSLEEPER2 ) && !u.has_trait( trait_HIBERNATE ) ) { // So you can too sleep through noon - if( ( tirednessVal * 1.25 ) < here.ambient_light_at( u.pos() ) && ( u.get_sleepiness() < 10 || + if( ( tirednessVal * 1.25 ) < here.ambient_light_at( u.pos_bub() ) && ( u.get_sleepiness() < 10 || one_in( u.get_sleepiness() / 2 ) ) ) { u.add_msg_if_player( _( "It's too bright to sleep." ) ); // Set ourselves up for removal @@ -1159,14 +1159,14 @@ static void eff_fun_sleep( Character &u, effect &it ) } // Ursine hibernators would likely do so indoors. Plants, though, might be in the sun. } else if( u.has_trait( trait_HIBERNATE ) ) { - if( ( tirednessVal * 5 ) < here.ambient_light_at( u.pos() ) && ( u.get_sleepiness() < 10 || + if( ( tirednessVal * 5 ) < here.ambient_light_at( u.pos_bub() ) && ( u.get_sleepiness() < 10 || one_in( u.get_sleepiness() / 2 ) ) ) { u.add_msg_if_player( _( "It's too bright to sleep." ) ); // Set ourselves up for removal it.set_duration( 0_turns ); woke_up = true; } - } else if( tirednessVal < here.ambient_light_at( u.pos() ) && ( u.get_sleepiness() < 10 || + } else if( tirednessVal < here.ambient_light_at( u.pos_bub() ) && ( u.get_sleepiness() < 10 || one_in( u.get_sleepiness() / 2 ) ) ) { u.add_msg_if_player( _( "It's too bright to sleep." ) ); // Set ourselves up for removal diff --git a/src/ranged.cpp b/src/ranged.cpp index ef1c977e31e1e..4fc81dc3fe5f1 100644 --- a/src/ranged.cpp +++ b/src/ranged.cpp @@ -1608,7 +1608,7 @@ Target_attributes::Target_attributes( tripoint src, tripoint target ) target_critter->ranged_target_size() : get_map().ranged_target_size( target ); size_in_moa = target_size_in_moa( range, size ) ; - light = get_map().ambient_light_at( target ); + light = get_map().ambient_light_at( tripoint_bub_ms( target ) ); visible = shooter->sees( target ); } @@ -1994,7 +1994,8 @@ static void draw_throw_aim( const target_ui &ui, const Character &you, const cat const target_ui::TargetMode throwing_target_mode = is_blind_throw ? target_ui::TargetMode::ThrowBlind : target_ui::TargetMode::Throw; - Target_attributes attributes( range, target_size, get_map().ambient_light_at( target_pos ), + Target_attributes attributes( range, target_size, + get_map().ambient_light_at( tripoint_bub_ms( target_pos ) ), you.sees( target_pos ) ); const std::vector aim_chances = calculate_ranged_chances( ui, you, diff --git a/src/shadowcasting.cpp b/src/shadowcasting.cpp index 437aa74709e5d..d6f464f46369e 100644 --- a/src/shadowcasting.cpp +++ b/src/shadowcasting.cpp @@ -163,7 +163,7 @@ void cast_horizontal_zlight_segment( const array_of_grids_of &output_caches, const array_of_grids_of &input_arrays, const array_of_grids_of &floor_caches, - const tripoint &offset, const int offset_distance, + const tripoint_bub_ms &offset, const int offset_distance, const T numerator ) { const int radius = 60 - offset_distance; @@ -216,7 +216,7 @@ void cast_horizontal_zlight_segment( // leading and trailing edges being considered. const slope trailing_edge_major( delta.z * 2 - 1, delta.y * 2 + 1 ); const slope leading_edge_major( delta.z * 2 + 1, delta.y * 2 - 1 ); - current.z = offset.z + delta.z * z_transform; + current.z = offset.z() + delta.z * z_transform; if( current.z > max_z || current.z < min_z ) { // Current tile is out of bounds, advance to the next tile. continue; @@ -245,8 +245,8 @@ void cast_horizontal_zlight_segment( bool started_span = false; const int z_index = current.z + OVERMAP_DEPTH; for( delta.x = 0; delta.x <= distance; delta.x++ ) { - current.x = offset.x + delta.x * xx_transform + delta.y * xy_transform; - current.y = offset.y + delta.x * yx_transform + delta.y * yy_transform; + current.x = offset.x() + delta.x * xx_transform + delta.y * xy_transform; + current.y = offset.y() + delta.x * yx_transform + delta.y * yy_transform; // See definition of trailing_edge_major and leading_edge_major for clarification. const slope trailing_edge_minor( delta.x * 2 - 1, delta.y * 2 + 1 ); const slope leading_edge_minor( delta.x * 2 + 1, delta.y * 2 - 1 ); @@ -278,12 +278,12 @@ void cast_horizontal_zlight_segment( // TODO: Revisit this logic and differentiate between "can see bottom of tile" // and "can see majority of tile". bool floor_block = false; - if( current.z < offset.z ) { + if( current.z < offset.z() ) { if( ( *floor_caches[z_index + 1] )[current.x][current.y] ) { floor_block = true; new_transparency = LIGHT_TRANSPARENCY_SOLID; } - } else if( current.z > offset.z ) { + } else if( current.z > offset.z() ) { if( ( *floor_caches[z_index] )[current.x][current.y] ) { floor_block = true; new_transparency = LIGHT_TRANSPARENCY_SOLID; @@ -359,7 +359,7 @@ void cast_vertical_zlight_segment( const array_of_grids_of &output_caches, const array_of_grids_of &input_arrays, const array_of_grids_of &floor_caches, - const tripoint &offset, const int offset_distance, + const tripoint_bub_ms &offset, const int offset_distance, const T numerator ) { const int radius = 60 - offset_distance; @@ -395,7 +395,7 @@ void cast_vertical_zlight_segment( // See comment above trailing_edge_major and leading_edge_major in above function. const slope trailing_edge_major( delta.y * 2 - 1, delta.z * 2 + 1 ); const slope leading_edge_major( delta.y * 2 + 1, delta.z * 2 - 1 ); - current.y = offset.y + delta.y * y_transform; + current.y = offset.y() + delta.y * y_transform; if( current.y < 0 || current.y >= MAPSIZE_Y ) { // Current tile is out of bounds, advance to the next tile. continue; @@ -423,8 +423,8 @@ void cast_vertical_zlight_segment( bool started_span = false; for( delta.x = 0; delta.x <= distance; delta.x++ ) { - current.x = offset.x + delta.x * x_transform; - current.z = offset.z + delta.z * z_transform; + current.x = offset.x() + delta.x * x_transform; + current.z = offset.z() + delta.z * z_transform; // See comment above trailing_edge_major and leading_edge_major in above function. const slope trailing_edge_minor( delta.x * 2 - 1, delta.z * 2 + 1 ); const slope leading_edge_minor( delta.x * 2 + 1, delta.z * 2 - 1 ); @@ -450,12 +450,12 @@ void cast_vertical_zlight_segment( // If we're looking at a tile with floor or roof from the floor/roof side, // that tile is actually invisible to us. bool floor_block = false; - if( current.z < offset.z ) { + if( current.z < offset.z() ) { if( ( *floor_caches[z_index + 1] )[current.x][current.y] ) { floor_block = true; new_transparency = LIGHT_TRANSPARENCY_SOLID; } - } else if( current.z > offset.z ) { + } else if( current.z > offset.z() ) { if( ( *floor_caches[z_index] )[current.x][current.y] ) { floor_block = true; new_transparency = LIGHT_TRANSPARENCY_SOLID; @@ -530,7 +530,8 @@ void cast_zlight( const array_of_grids_of &output_caches, const array_of_grids_of &input_arrays, const array_of_grids_of &floor_caches, - const tripoint &origin, const int offset_distance, const T numerator, vertical_direction dir ) + const tripoint_bub_ms &origin, const int offset_distance, const T numerator, + vertical_direction dir ) { if( dir == vertical_direction::DOWN || dir == vertical_direction::BOTH ) { // Down lateral @@ -663,12 +664,12 @@ template void cast_zlight &output_caches, const array_of_grids_of &input_arrays, const array_of_grids_of &floor_caches, - const tripoint &origin, int offset_distance, float numerator, + const tripoint_bub_ms &origin, int offset_distance, float numerator, vertical_direction dir ); template void cast_zlight( const array_of_grids_of &output_caches, const array_of_grids_of &input_arrays, const array_of_grids_of &floor_caches, - const tripoint &origin, int offset_distance, fragment_cloud numerator, + const tripoint_bub_ms &origin, int offset_distance, fragment_cloud numerator, vertical_direction dir ); diff --git a/src/shadowcasting.h b/src/shadowcasting.h index a120f45536860..ef6a02e2ebb07 100644 --- a/src/shadowcasting.h +++ b/src/shadowcasting.h @@ -121,7 +121,7 @@ template void castLightAll( cata::mdarray &output_cache, const cata::mdarray &input_array, - const point &offset, int offsetDistance = 0, + const point_bub_ms &offset, int offsetDistance = 0, T numerator = 1.0 ); template @@ -140,7 +140,7 @@ void cast_zlight( const array_of_grids_of &output_caches, const array_of_grids_of &input_arrays, const array_of_grids_of &floor_caches, - const tripoint &origin, int offset_distance, T numerator, + const tripoint_bub_ms &origin, int offset_distance, T numerator, vertical_direction dir = vertical_direction::BOTH ); #endif // CATA_SRC_SHADOWCASTING_H diff --git a/src/suffer.cpp b/src/suffer.cpp index 684d128a79442..d36e43759e45d 100644 --- a/src/suffer.cpp +++ b/src/suffer.cpp @@ -1521,7 +1521,7 @@ void suffer::from_nyctophobia( Character &you ) { const float nyctophobia_threshold = LIGHT_AMBIENT_LIT - 3.0f; - const bool in_darkness = get_map().ambient_light_at( you.pos() ) < nyctophobia_threshold; + const bool in_darkness = get_map().ambient_light_at( you.pos_bub() ) < nyctophobia_threshold; if( in_darkness ) { if( one_in( 80 ) && !you.has_effect( effect_shakes ) ) { you.add_msg_if_player( m_bad, diff --git a/tests/char_sight_test.cpp b/tests/char_sight_test.cpp index e3a16f69e9673..7211bae4e4f55 100644 --- a/tests/char_sight_test.cpp +++ b/tests/char_sight_test.cpp @@ -65,7 +65,7 @@ TEST_CASE( "light_and_fine_detail_vision_mod", "[character][sight][light][vision here.build_map_cache( 0, false ); REQUIRE( g->is_in_sunlight( dummy.pos() ) ); // ambient_light_at is ~100.0 at this time of day (this fails if lightmap cache is not built) - REQUIRE( here.ambient_light_at( dummy.pos() ) == Approx( 100.0f ).margin( 1 ) ); + REQUIRE( here.ambient_light_at( dummy.pos_bub() ) == Approx( 100.0f ).margin( 1 ) ); // 1.0 is LIGHT_AMBIENT_LIT or brighter CHECK( dummy.fine_detail_vision_mod() == Approx( 1.0f ) ); @@ -91,7 +91,7 @@ TEST_CASE( "light_and_fine_detail_vision_mod", "[character][sight][light][vision dummy.setpos( dummy.pos() + z_shift ); // This implicitly rebuilds the light map. CAPTURE( z_shift ); REQUIRE_FALSE( g->is_in_sunlight( dummy.pos() ) ); - REQUIRE( here.ambient_light_at( dummy.pos() ) == Approx( LIGHT_AMBIENT_MINIMAL ) ); + REQUIRE( here.ambient_light_at( dummy.pos_bub() ) == Approx( LIGHT_AMBIENT_MINIMAL ) ); // 7.3 is LIGHT_AMBIENT_MINIMAL, a dark cloudy night, unlit indoors CHECK( dummy.fine_detail_vision_mod() == Approx( 7.3f ) ); @@ -275,7 +275,7 @@ TEST_CASE( "ursine_vision", "[character][ursine][vision]" ) WHEN( "under a new moon" ) { calendar::turn = calendar::turn_zero; here.build_map_cache( 0, false ); - light_here = here.ambient_light_at( dummy.pos() ); + light_here = here.ambient_light_at( dummy.pos_bub() ); REQUIRE( light_here == Approx( LIGHT_AMBIENT_MINIMAL ) ); THEN( "unimpaired sight, with 7 tiles of range" ) { @@ -289,7 +289,7 @@ TEST_CASE( "ursine_vision", "[character][ursine][vision]" ) WHEN( "under a half moon" ) { calendar::turn = calendar::turn_zero + 7_days; here.build_map_cache( 0, false ); - light_here = here.ambient_light_at( dummy.pos() ); + light_here = here.ambient_light_at( dummy.pos_bub() ); REQUIRE( light_here == Approx( LIGHT_AMBIENT_DIM ).margin( 1.0f ) ); THEN( "unimpaired sight, with 8 tiles of range" ) { @@ -303,7 +303,7 @@ TEST_CASE( "ursine_vision", "[character][ursine][vision]" ) WHEN( "under a full moon" ) { calendar::turn = calendar::turn_zero + 14_days; here.build_map_cache( 0, false ); - light_here = here.ambient_light_at( dummy.pos() ); + light_here = here.ambient_light_at( dummy.pos_bub() ); REQUIRE( light_here == Approx( 7 ) ); THEN( "unimpaired sight, with 27 tiles of range" ) { @@ -317,7 +317,7 @@ TEST_CASE( "ursine_vision", "[character][ursine][vision]" ) WHEN( "under the noonday sun" ) { calendar::turn = calendar::turn_zero + 9_hours + 30_minutes; here.build_map_cache( 0, false ); - light_here = here.ambient_light_at( dummy.pos() ); + light_here = here.ambient_light_at( dummy.pos_bub() ); REQUIRE( g->is_in_sunlight( dummy.pos() ) ); REQUIRE( light_here == Approx( 100.0f ).margin( 1 ) ); diff --git a/tests/map_test_case.cpp b/tests/map_test_case.cpp index f0fbcd4aab4c3..c8ce3298e8290 100644 --- a/tests/map_test_case.cpp +++ b/tests/map_test_case.cpp @@ -233,10 +233,20 @@ static std::string print_and_format_helper( map_test_case &t, int zshift, } ) ); } +static std::string print_and_format_helper( map_test_case &t, int zshift, + std::function print_tile ) +{ + tripoint_bub_ms shift = { point_bub_ms( point_zero ), zshift }; + return map_test_case_common::printers::format_2d_array( + t.map_tiles_str( [&]( map_test_case::tile t, std::ostringstream & out ) { + print_tile( t.p + shift, out ); + } ) ); +} + std::string map_test_case_common::printers::fields( map_test_case &t, int zshift ) { map &here = get_map(); - return print_and_format_helper( t, zshift, [&]( auto p, auto & out ) { + return print_and_format_helper( t, zshift, [&]( tripoint p, auto & out ) { bool first = true; for( auto &pr : here.field_at( p ) ) { out << ( first ? " " : "," ) << pr.second.name(); @@ -248,7 +258,7 @@ std::string map_test_case_common::printers::fields( map_test_case &t, int zshift std::string map_test_case_common::printers::transparency( map_test_case &t, int zshift ) { const level_cache &cache = get_map().access_cache( t.get_origin().z + zshift ); - return print_and_format_helper( t, zshift, [&]( auto p, auto & out ) { + return print_and_format_helper( t, zshift, [&]( tripoint p, auto & out ) { out << std::setprecision( 3 ) << cache.transparency_cache[p.x][p.y] << ' '; } ); } @@ -256,7 +266,7 @@ std::string map_test_case_common::printers::transparency( map_test_case &t, int std::string map_test_case_common::printers::seen( map_test_case &t, int zshift ) { const auto &cache = get_map().access_cache( t.get_origin().z + zshift ).seen_cache; - return print_and_format_helper( t, zshift, [&]( auto p, auto & out ) { + return print_and_format_helper( t, zshift, [&]( tripoint p, auto & out ) { out << std::setprecision( 3 ) << cache[p.x][p.y] << ' '; } ); } @@ -264,7 +274,7 @@ std::string map_test_case_common::printers::seen( map_test_case &t, int zshift ) std::string map_test_case_common::printers::lm( map_test_case &t, int zshift ) { const level_cache &cache = get_map().access_cache( t.get_origin().z + zshift ); - return print_and_format_helper( t, zshift, [&]( auto p, auto & out ) { + return print_and_format_helper( t, zshift, [&]( tripoint p, auto & out ) { out << cache.lm[p.x][p.y].to_string() << ' '; } ); } @@ -272,7 +282,7 @@ std::string map_test_case_common::printers::lm( map_test_case &t, int zshift ) std::string map_test_case_common::printers::apparent_light( map_test_case &t, int zshift ) { const level_cache &cache = get_map().access_cache( t.get_origin().z + zshift ); - return print_and_format_helper( t, zshift, [&]( auto p, auto & out ) { + return print_and_format_helper( t, zshift, [&]( tripoint_bub_ms p, auto & out ) { out << std::setprecision( 3 ) << map::apparent_light_helper( cache, p ).apparent_light << ' '; } ); } @@ -280,7 +290,7 @@ std::string map_test_case_common::printers::apparent_light( map_test_case &t, in std::string map_test_case_common::printers::obstructed( map_test_case &t, int zshift ) { const level_cache &cache = get_map().access_cache( t.get_origin().z + zshift ); - return print_and_format_helper( t, zshift, [&]( auto p, auto & out ) { + return print_and_format_helper( t, zshift, [&]( tripoint_bub_ms p, auto & out ) { bool obs = map::apparent_light_helper( cache, p ).obstructed; out << ( obs ? '#' : '.' ); } ); @@ -289,7 +299,7 @@ std::string map_test_case_common::printers::obstructed( map_test_case &t, int zs std::string map_test_case_common::printers::floor( map_test_case &t, int zshift ) { const level_cache &cache = get_map().access_cache( t.get_origin().z + zshift ); - return print_and_format_helper( t, zshift, [&]( auto p, auto & out ) { + return print_and_format_helper( t, zshift, [&]( tripoint p, auto & out ) { out << ( cache.floor_cache[p.x][p.y] ? '#' : '.' ); } ); } diff --git a/tests/monster_attack_test.cpp b/tests/monster_attack_test.cpp index 72313b4c8409a..e50cf509d6d1b 100644 --- a/tests/monster_attack_test.cpp +++ b/tests/monster_attack_test.cpp @@ -211,22 +211,22 @@ TEST_CASE( "monster_throwing_sanity_test", "[throwing],[balance]" ) restore_on_out_of_scope restore_calendar_turn( calendar::turn ); calendar::turn = sunrise( calendar::turn ); scoped_weather_override weather_clear( WEATHER_CLEAR ); - const tripoint target_location = { 65, 65, 0 }; + const tripoint_bub_ms target_location = { 65, 65, 0 }; // You got a player Character &you = get_player_character(); clear_avatar(); you.set_dodges_left( 1 ) ; REQUIRE( Approx( you.get_dodge() ) == 4.0 ); - you.setpos( target_location ); + you.setpos( target_location.raw() ); const tripoint_abs_ms abs_target_location = you.get_location(); - reset_caches( target_location.z, target_location.z ); + reset_caches( target_location.z(), target_location.z() ); REQUIRE( g->natural_light_level( 0 ) > 50.0 ); CHECK( here.ambient_light_at( target_location ) > 50.0 ); const std::string monster_type = "mon_feral_human_pipe"; for( int distance = 2; distance <= 5; ++distance ) { float expected_damage = expected_average_damage_at_range[ distance ]; // and you got a monster - const tripoint attacker_location = target_location + tripoint_east * distance; + const tripoint attacker_location = target_location.raw() + tripoint_east * distance; monster &test_monster = spawn_test_monster( monster_type, attacker_location ); test_monster.set_dest( you.get_location() ); const mtype_special_attack &attack = test_monster.type->special_attacks.at( "gun" ); diff --git a/tests/shadowcasting_test.cpp b/tests/shadowcasting_test.cpp index f00217633be65..b3586a511010e 100644 --- a/tests/shadowcasting_test.cpp +++ b/tests/shadowcasting_test.cpp @@ -153,7 +153,7 @@ bool grids_are_equivalent( template void print_grid_comparison( - const point &offset, + const point_bub_ms &offset, cata::mdarray &transparency_cache, const cata::mdarray &control, const cata::mdarray &experiment ) @@ -164,7 +164,7 @@ void print_grid_comparison( const bool shadowcasting_disagrees = is_nonzero( control[x][y] ) != is_nonzero( experiment[x][y] ); const bool bresenham_disagrees = - bresenham_visibility_check( offset, point( x, y ), transparency_cache ) != + bresenham_visibility_check( offset.raw(), point( x, y ), transparency_cache ) != is_nonzero( experiment[x][y] ); if( shadowcasting_disagrees && bresenham_disagrees ) { @@ -189,7 +189,7 @@ void print_grid_comparison( if( transparency_cache[x][y] == LIGHT_TRANSPARENCY_SOLID ) { output = '#'; } - if( x == offset.x && y == offset.y ) { + if( x == offset.x() && y == offset.y() ) { output = '@'; } printf( "%c", output ); @@ -230,23 +230,23 @@ static void shadowcasting_runoff( const int iterations, const bool test_bresenha map dummy; - const point offset( 65, 65 ); + const point_bub_ms offset( 65, 65 ); const std::chrono::high_resolution_clock::time_point start1 = std::chrono::high_resolution_clock::now(); for( int i = 0; i < iterations; i++ ) { // First the control algorithm. - oldCastLight( seen_squares_control, transparency_cache, 0, 1, 1, 0, offset.x, offset.y, 0 ); - oldCastLight( seen_squares_control, transparency_cache, 1, 0, 0, 1, offset.x, offset.y, 0 ); + oldCastLight( seen_squares_control, transparency_cache, 0, 1, 1, 0, offset.x(), offset.y(), 0 ); + oldCastLight( seen_squares_control, transparency_cache, 1, 0, 0, 1, offset.x(), offset.y(), 0 ); - oldCastLight( seen_squares_control, transparency_cache, 0, -1, 1, 0, offset.x, offset.y, 0 ); - oldCastLight( seen_squares_control, transparency_cache, -1, 0, 0, 1, offset.x, offset.y, 0 ); + oldCastLight( seen_squares_control, transparency_cache, 0, -1, 1, 0, offset.x(), offset.y(), 0 ); + oldCastLight( seen_squares_control, transparency_cache, -1, 0, 0, 1, offset.x(), offset.y(), 0 ); - oldCastLight( seen_squares_control, transparency_cache, 0, 1, -1, 0, offset.x, offset.y, 0 ); - oldCastLight( seen_squares_control, transparency_cache, 1, 0, 0, -1, offset.x, offset.y, 0 ); + oldCastLight( seen_squares_control, transparency_cache, 0, 1, -1, 0, offset.x(), offset.y(), 0 ); + oldCastLight( seen_squares_control, transparency_cache, 1, 0, 0, -1, offset.x(), offset.y(), 0 ); - oldCastLight( seen_squares_control, transparency_cache, 0, -1, -1, 0, offset.x, offset.y, 0 ); - oldCastLight( seen_squares_control, transparency_cache, -1, 0, 0, -1, offset.x, offset.y, 0 ); + oldCastLight( seen_squares_control, transparency_cache, 0, -1, -1, 0, offset.x(), offset.y(), 0 ); + oldCastLight( seen_squares_control, transparency_cache, -1, 0, 0, -1, offset.x(), offset.y(), 0 ); } const std::chrono::high_resolution_clock::time_point end1 = std::chrono::high_resolution_clock::now(); @@ -276,7 +276,7 @@ static void shadowcasting_runoff( const int iterations, const bool test_bresenha for( int x = 0; test_bresenham && passed && x < MAPSIZE * SEEX; ++x ) { for( int y = 0; y < MAPSIZE * SEEX; ++y ) { // Check that both agree on the outcome, but not necessarily the same values. - if( bresenham_visibility_check( offset, point( x, y ), transparency_cache ) != + if( bresenham_visibility_check( offset.raw(), point( x, y ), transparency_cache ) != ( seen_squares_experiment[x][y] > LIGHT_TRANSPARENCY_SOLID ) ) { passed = false; break; @@ -310,7 +310,7 @@ static void shadowcasting_float_quad( map dummy; - const point offset( 65, 65 ); + const point_bub_ms offset( 65, 65 ); const std::chrono::high_resolution_clock::time_point start1 = std::chrono::high_resolution_clock::now(); @@ -367,7 +367,7 @@ static void do_3d_benchmark( std::unique_ptr grids = std::make_unique(); - const tripoint origin( 65, 65, 0 ); + const tripoint_bub_ms origin( 65, 65, 0 ); array_of_grids_of seen_caches; array_of_grids_of floor_caches; @@ -446,7 +446,7 @@ static void shadowcasting_3d_2d( const int iterations ) map dummy; - const tripoint offset( 65, 65, 0 ); + const tripoint_bub_ms offset( 65, 65, 0 ); const std::chrono::high_resolution_clock::time_point start1 = std::chrono::high_resolution_clock::now(); @@ -458,7 +458,7 @@ static void shadowcasting_3d_2d( const int iterations ) const std::chrono::high_resolution_clock::time_point end1 = std::chrono::high_resolution_clock::now(); - const tripoint origin( offset ); + const tripoint_bub_ms origin( offset ); array_of_grids_of transparency_caches; array_of_grids_of seen_caches; array_of_grids_of floor_caches; @@ -508,7 +508,7 @@ static constexpr float O = LIGHT_TRANSPARENCY_SOLID; static constexpr float V = LIGHT_TRANSPARENCY_OPEN_AIR; static constexpr float X = LIGHT_TRANSPARENCY_SOLID; -static const tripoint ORIGIN( 65, 65, 11 ); +static const tripoint_bub_ms ORIGIN( 65, 65, 11 ); struct grid_overlay { std::vector>> data; @@ -519,11 +519,11 @@ struct grid_overlay { // origin_offset is specified as the coordinates of the "camera" within the overlay. grid_overlay( const point &origin_offset, const float default_value ) { - this->offset = ORIGIN - origin_offset; + this->offset = ORIGIN.raw() - origin_offset; this->default_value = default_value; } grid_overlay( const tripoint &origin_offset, const float default_value ) { - this->offset = ORIGIN - origin_offset; + this->offset = ORIGIN.raw() - origin_offset; this->default_value = default_value; } @@ -595,7 +595,7 @@ static void run_spot_check( const grid_overlay &test_case, const grid_overlay &e if( fov_3d ) { cast_zlight( seen_squares, transparency_cache, floor_cache, ORIGIN - tripoint( 0, 0, OVERMAP_DEPTH ), 0, 1.0 ); - get_map().seen_cache_process_ledges( seen_squares, floor_cache, ORIGIN - tripoint( 0, 0, + get_map().seen_cache_process_ledges( seen_squares, floor_cache, ORIGIN.raw() - tripoint( 0, 0, OVERMAP_DEPTH ) ); } else { castLightAll( From fab50dce249f82bf04fd62b56b3455652596ba9b Mon Sep 17 00:00:00 2001 From: Kate M Date: Mon, 6 May 2024 20:48:46 -0400 Subject: [PATCH 079/104] Fixing issue where Android gesture inputs were broken --- src/cata_imgui.cpp | 12 +++++++++++- src/cata_imgui.h | 1 + 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/cata_imgui.cpp b/src/cata_imgui.cpp index dd61907cb41d3..7db097919f9c2 100644 --- a/src/cata_imgui.cpp +++ b/src/cata_imgui.cpp @@ -74,6 +74,11 @@ void cataimgui::client::end_frame() ImTui_ImplText_RenderDrawData( ImGui::GetDrawData() ); ImTui_ImplNcurses_DrawScreen(); + ImGuiIO &io = ImGui::GetIO(); + for( const int &code : cata_input_trail ) { + io.AddKeyEvent( cata_key_to_imgui( code ), false ); + } + cata_input_trail.clear(); } void cataimgui::client::upload_color_pair( int p, int f, int b ) @@ -261,6 +266,11 @@ void cataimgui::client::end_frame() { ImGui::Render(); ImGui_ImplSDLRenderer2_RenderDrawData( ImGui::GetDrawData() ); + ImGuiIO &io = ImGui::GetIO(); + for( const int &code : cata_input_trail ) { + io.AddKeyEvent( cata_key_to_imgui( code ), false ); + } + cata_input_trail.clear(); } void cataimgui::client::process_input( void *input ) @@ -328,7 +338,7 @@ void cataimgui::client::process_cata_input( const input_event &event ) int code = event.get_first_input(); ImGuiIO &io = ImGui::GetIO(); io.AddKeyEvent( cata_key_to_imgui( code ), true ); - io.AddKeyEvent( cata_key_to_imgui( code ), false ); + cata_input_trail.push_back( code ); } } diff --git a/src/cata_imgui.h b/src/cata_imgui.h index 1bb3789aebc7c..c89153ed53009 100644 --- a/src/cata_imgui.h +++ b/src/cata_imgui.h @@ -43,6 +43,7 @@ enum class dialog_result { class client { + std::vector cata_input_trail; public: #if !(defined(TILES) || defined(WIN32)) client(); From e80d6ada0efd931cba835b4570dd5bfd6675c408 Mon Sep 17 00:00:00 2001 From: PatrikLundell Date: Tue, 7 May 2024 18:10:13 +0200 Subject: [PATCH 080/104] called real operation from overload --- src/avatar.cpp | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/src/avatar.cpp b/src/avatar.cpp index 48d2d850f777f..93fe6b19c7264 100644 --- a/src/avatar.cpp +++ b/src/avatar.cpp @@ -1232,17 +1232,7 @@ bool avatar::is_obeying( const Character &p ) const bool avatar::cant_see( const tripoint &p ) { - - // calc based on recoil - if( !last_target_pos.has_value() ) { - return false; - } - - if( aim_cache_dirty ) { - rebuild_aim_cache(); - } - - return aim_cache[p.x][p.y]; + return cant_see( tripoint_bub_ms( p ) ); } bool avatar::cant_see( const tripoint_bub_ms &p ) From 4bf22b217f343e61ae4bf08d27ea82b16c02aa1b Mon Sep 17 00:00:00 2001 From: casswedson <58050969+casswedson@users.noreply.github.com> Date: Tue, 7 May 2024 14:56:37 -0500 Subject: [PATCH 081/104] fix pupating nuclar detonation (#73526) no more mininuke loudness levels from exploding pupating zeds also increase aoe cause they were failing to spawn even if the pupating zed was by itself with nothig around it, tweak a few things also add a description sound Co-authored-by: casswedson --- data/json/monster_special_attacks/spells.json | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/data/json/monster_special_attacks/spells.json b/data/json/monster_special_attacks/spells.json index 821a68ae07a4c..b2ee29e98202d 100644 --- a/data/json/monster_special_attacks/spells.json +++ b/data/json/monster_special_attacks/spells.json @@ -184,8 +184,8 @@ "valid_targets": [ "ground", "self" ], "min_damage": 1, "max_damage": 2, - "min_aoe": 2, - "max_aoe": 2, + "min_aoe": 4, + "max_aoe": 4, "extra_effects": [ { "id": "spawning_zombie_die", "hit_self": true } ], "shape": "blast", "effect": "summon", @@ -216,8 +216,8 @@ "valid_targets": [ "ground", "self" ], "min_damage": 1, "max_damage": 1, - "min_aoe": 2, - "max_aoe": 2, + "min_aoe": 4, + "max_aoe": 4, "extra_effects": [ { "id": "wretch_hurt_self", "hit_self": true } ], "shape": "blast", "effect": "summon", @@ -232,8 +232,8 @@ "valid_targets": [ "ground", "self" ], "min_damage": 1, "max_damage": 1, - "min_aoe": 3, - "max_aoe": 3, + "min_aoe": 4, + "max_aoe": 4, "shape": "blast", "effect": "summon", "effect_str": "mon_spawn_raptor" @@ -247,8 +247,8 @@ "valid_targets": [ "ground", "self" ], "min_damage": 1, "max_damage": 2, - "min_aoe": 2, - "max_aoe": 2, + "min_aoe": 4, + "max_aoe": 4, "extra_effects": [ { "id": "spawning_zombie_die", "hit_self": true } ], "shape": "blast", "effect": "summon", @@ -263,8 +263,8 @@ "valid_targets": [ "ground", "self" ], "min_damage": 1, "max_damage": 1, - "min_aoe": 2, - "max_aoe": 2, + "min_aoe": 4, + "max_aoe": 4, "extra_effects": [ { "id": "wretch_hurt_self", "hit_self": true } ], "shape": "blast", "effect": "summon", @@ -279,8 +279,8 @@ "valid_targets": [ "ground", "self" ], "min_damage": 1, "max_damage": 2, - "min_aoe": 2, - "max_aoe": 2, + "min_aoe": 4, + "max_aoe": 4, "extra_effects": [ { "id": "spawning_zombie_die", "hit_self": true } ], "shape": "blast", "effect": "summon", @@ -291,7 +291,7 @@ "id": "spawning_zombie_die", "name": { "str": "Spawning Zombie Die" }, "description": "For zombies that are spawning something and die in the process.", - "flags": [ "LOUD", "RANDOM_DAMAGE", "NO_PROJECTILE", "NO_EXPLOSION_SFX", "EXTRA_EFFECTS_FIRST" ], + "flags": [ "SILENT", "NO_PROJECTILE", "NO_EXPLOSION_SFX", "EXTRA_EFFECTS_FIRST" ], "min_damage": 2000, "max_damage": 2000, "damage_type": "pure", @@ -305,10 +305,11 @@ "id": "soft_squelch", "name": { "str": "Soft Squelch" }, "description": "Noise, emitted by the monster when it explode with gore.", - "flags": [ "LOUD", "NO_PROJECTILE", "NO_EXPLOSION_SFX" ], - "min_damage": 16, + "flags": [ "NO_PROJECTILE", "NO_EXPLOSION_SFX" ], + "min_damage": 6, "max_damage": 16, "sound_type": "combat", + "sound_description": "a loud tearing!", "valid_targets": [ "self" ], "shape": "blast", "effect": "noise" From fa5bcf9881dd38f23b6fece74fd9779d45849535 Mon Sep 17 00:00:00 2001 From: Victoria Eastep <114838742+BarndoBoi@users.noreply.github.com> Date: Tue, 7 May 2024 17:56:07 -0400 Subject: [PATCH 082/104] Add medical cart to both nursing homes --- data/json/mapgen/nursing_home.json | 18 ++++++++++-------- .../mapgen_palettes/nursing_home_palette.json | 8 ++++++-- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/data/json/mapgen/nursing_home.json b/data/json/mapgen/nursing_home.json index 97841f80108fd..0c8892792e5d6 100644 --- a/data/json/mapgen/nursing_home.json +++ b/data/json/mapgen/nursing_home.json @@ -22,12 +22,12 @@ "|&6Wk.W..WWWW..WWWWWWWWW//WGGGGGGGGGGGGGGGGGGW//WWW..W+.n~=~=|spppppppppppppppppppppppppppppssgg", "|.kW6&W..WflW..WT3.3TGŠÆgss####################ssgŠÆW..WWWWWW|||sPPPPpppppppppppppppppppppppppssgg", "|DWWWWW..aooa..D.....G*gss!BBB!gggggg*ggg*BBB!ssg*W.......i|||ŠÆssssssssssssIppppppppppppppppIsgg", - "G.5TT5W..a..-..W5TT5.G*gssssssssssssssssssssssssg*Wi.......|||||||||||||**ssppppppppppppppppssgg", + "G.5TT5W..aV.-..W5TT5.G*gssssssssssssssssssssssssg*Wi.......|||||||||||||**ssppppppppppppppppssgg", "G.....D..aAaa..WWWWWDW*gssssssssssssssssssssssssg*WWWWWWW........L.....Xsssspppppppyypppppppssgg", "GT8.8TW.......iW&6Wk.W*gss!BBBgggggsssggggBBB!ssg*W&6WWWW..WWWW..WWWWWW|*gsspppppppyypppppppssgg", "|WWWWWW..CCCC..W.kW6&W*gssgggggggggBBBgg*gggggssg*W.kWWWW.wWflW..WT3.3TG#gsspppppppyypppppppssgg", "X.....L..CCCC..WDWWWWW*gss*gggg%%%%%%%%%%%ggggssg*WDWWWWW..aooa..D.....G#gssppppppppppppppppssgg", - "|WWWWWW..HttC..W.5TT5G*gssggggg%g*gJJJ#*g%ggggssg*G.5TT5W..-..a..W5TT5.G#gsspppppppyypppppppssgg", + "|WWWWWW..HttC..W.5TT5G*gssggggg%g*gJJJ#*g%ggggssg*G.5TT5W..-.Va..W5TT5.G#gsspppppppyypppppppssgg", "GT3.3TW..CttH..D.....G*gssggggB%#JJJJJJJ#%Bgggssg*G.....D..aAaa..WWWWWD|#gsspppppppyypppppppssgg", "G.....D..CCCC..WT8.8TG*gssg!ggB%JJJ*!*JJJ%Bgggssg*GT8.8TWi.......W&6Wk.|#gsspppppppyypppppppssgg", "G5TT5.W..CKKC..WWWWWWW*gssggggB%gJJJJJJJ*%Bgg*ssg*WWWWWWW..CCCC..W.kW6&|#gssppppppppppppppppssgg", @@ -39,9 +39,9 @@ "G.....D.......iW.kW6&W*gssssssssssssssssssssssssg*W.kW6&W..CCCC..WT3.3TG#gsspppppppyypppppppssgg", "GT8.8TW..WWWW..WDWWWWW*gssssssssssssssssssssssssg*WDWWWWW..CCCC..D.....G#gsspppppppyypppppppssgg", "|WWWWWW..WflW..W.5TT5G*gss!gggggggggggggggggg!ssg*G.5TT5W..COCt..W5TT5.G#gssppppppppppppppppssgg", - "GT3.3TW..ao.a..D.....G*gss#################qqqssg*G.....D..COCt..WWWWWD|#gsspppppppyypppppppssgg", + "GT3.3TW..aoVa..D.....G*gss#################qqqssg*G.....D..COCt..WWWWWD|#gsspppppppyypppppppssgg", "G.....D..a.o-..WT8.8TG*gss*gŠÆWWGGGGGGGGGGWWq^QssgŠÆGT8.8TW..COCt..W&6Wk.|#gsspppppppyypppppppssgg", - "G5TT5.W..aAaa..WWWWWWWWW//WWWWf....i.....lWWWW//WWWWWWWWW..CCCC..W.kW6&|#gsspppppppyypppppppIsgg", + "G5TT5.W..aAaa..WWWWWWWWW//WWWWf....i....VlWWWW//WWWWWWWWW..CCCC..W.kW6&|#gsspppppppyypppppppIsgg", "|WWWWDW........bbbi.ibbb.....A...o....o...A.....bbbi.ibbb..CttC..WDWWWW|#gssppppppppppppppppssgg", "|&6Wk.W..CttH................aa-aaaaaaaaaaa................CCHC..W.5TT5G#gsspppppppyypppppppssgg", "|.kW6&W..CHCC...............................................w....D.....G#gsspppppppyypppppppssgg", @@ -128,6 +128,7 @@ "F": { "item": "SUS_office_filing_cabinet", "chance": 90, "repeat": [ 1, 2 ] }, "k": { "item": "SUS_toilet", "chance": 100, "repeat": [ 0, 1 ] }, "d": { "item": "SUS_office_desk", "chance": 25 }, + "V": { "item": "gear_medical", "chance": 40, "repeat": [ 1, 2 ] }, "K": [ { "item": "novels", "chance": 70, "repeat": [ 0, 1 ] }, { "item": "literature", "chance": 70, "repeat": [ 1, 2 ] }, @@ -232,12 +233,12 @@ "|&6Wk.W..WWWW..WWWWWWWWW//WGGGGGGGGGGGGGGGGGGW//WWW..WWZZZZZv|spppppppppppppppppppppppppppppssgg", "|.kW6&W..WflW..WT3.3TGŠÆgss####################ssgŠÆW..WWWWWW|||sPPPPpppppppppppppppppppppppppssgg", "|DWWWWW..aooa..D.....G*gss!BBB!gggggg*ggg*BBB!ssg*W.......i|||ŠÆssssssssssssIppppppppppppppppIsgg", - "G.5TT5W..a..-..W5TT5.G*gssssssssssssssssssssssssg*Wi.......|||||||||||||**ssppppppppppppppppssgg", + "G.5TT5W..aV.-..W5TT5.G*gssssssssssssssssssssssssg*Wi.......|||||||||||||**ssppppppppppppppppssgg", "G.....D..aAaa..WWWWWDW*gssssssssssssssssssssssssg*WWWWWWW........L.....Xsssspppppppyypppppppssgg", "GT8.8TW.......iW&6Wk.W*gss!BBBgggggsssggggBBB!ssg*W&6WWWW..WWWW..WWWWWW|*gsspppppppyypppppppssgg", "|WWWWWW..CCCC..W.kW6&W*gssgggggggggBBBgg*gggggssg*W.kWWWW.wWflW..WT3.3TG#gsspppppppyypppppppssgg", "X.....L..CCCC..WDWWWWW*gss*gggg%%%%%%%%%%%ggggssg*WDWWWWW..aooa..D.....G#gssppppppppppppppppssgg", - "|WWWWWW..HttC..W.5TT5G*gssggggg%g*gJJJ#*g%ggggssg*G.5TT5W..-..a..W5TT5.G#gsspppppppyypppppppssgg", + "|WWWWWW..HttC..W.5TT5G*gssggggg%g*gJJJ#*g%ggggssg*G.5TT5W..-.Va..W5TT5.G#gsspppppppyypppppppssgg", "GT3.3TW..CttH..D.....G*gssggggB%#JJJJJJJ#%Bgggssg*G.....D..aAaa..WWWWWD|#gsspppppppyypppppppssgg", "G.....D..CCCC..WT8.8TG*gssg!ggB%JJJ*!*JJJ%Bgggssg*GT8.8TWi.......W&6Wk.|#gsspppppppyypppppppssgg", "G5TT5.W..CKKC..WWWWWWW*gssggggB%gJJJJJJJ*%Bgg*ssg*WWWWWWW..CCCC..W.kW6&|#gssppppppppppppppppssgg", @@ -249,9 +250,9 @@ "G.....D.......iW.kW6&W*gssssssssssssssssssssssssg*W.kW6&W..CCCC..WT3.3TG#gsspppppppyypppppppssgg", "GT8.8TW..WWWW..WDWWWWW*gssssssssssssssssssssssssg*WDWWWWW..CCCC..D.....G#gsspppppppyypppppppssgg", "|WWWWWW..WflW..W.5TT5G*gss!gggggggggggggggggg!ssg*G.5TT5W..COCt..W5TT5.G#gssppppppppppppppppssgg", - "GT3.3TW..ao.a..D.....G*gss#################qqqssg*G.....D..COCt..WWWWWD|#gsspppppppyypppppppssgg", + "GT3.3TW..aoVa..D.....G*gss#################qqqssg*G.....D..COCt..WWWWWD|#gsspppppppyypppppppssgg", "G.....D..a.o-..WT8.8TG*gss*gŠÆWWGGGGGGGGGGWWq^QssgŠÆGT8.8TW..COCt..W&6Wk.|#gsspppppppyypppppppssgg", - "G5TT5.W..aAaa..WWWWWWWWW//WWWWf....i.....lWWWW//WWWWWWWWW..CCCC..W.kW6&|#gsspppppppyypppppppIsgg", + "G5TT5.W..aAaa..WWWWWWWWW//WWWWf....i....VlWWWW//WWWWWWWWW..CCCC..W.kW6&|#gsspppppppyypppppppIsgg", "|WWWWDW........bbbi.ibbb.....A...o....o...A.....bbbi.ibbb..CttC..WDWWWW|#gssppppppppppppppppssgg", "|&6Wk.W..CttH................aa-aaaaaaaaaaa................CCHC..W.5TT5G#gsspppppppyypppppppssgg", "|.kW6&W..CHCC...............................................w....D.....G#gsspppppppyypppppppssgg", @@ -344,6 +345,7 @@ "F": { "item": "SUS_office_filing_cabinet", "chance": 90, "repeat": [ 1, 2 ] }, "k": { "item": "SUS_toilet", "chance": 100, "repeat": [ 0, 1 ] }, "d": { "item": "SUS_office_desk", "chance": 25 }, + "V": { "item": "gear_medical", "chance": 40, "repeat": [ 1, 2 ] }, "K": [ { "item": "novels", "chance": 70, "repeat": [ 0, 1 ] }, { "item": "literature", "chance": 70, "repeat": [ 1, 2 ] }, diff --git a/data/json/mapgen_palettes/nursing_home_palette.json b/data/json/mapgen_palettes/nursing_home_palette.json index aafe08b8f45d8..4d95b036ef36b 100644 --- a/data/json/mapgen_palettes/nursing_home_palette.json +++ b/data/json/mapgen_palettes/nursing_home_palette.json @@ -33,6 +33,7 @@ "s": "t_sidewalk", "t": "t_carpet_red", "v": "t_ladder_down", + "V": "t_floor", "W": "t_wall", "X": "t_door_metal_pickable", "y": "t_pavement_y", @@ -89,7 +90,8 @@ "vehicles": { "3": { "vehicle": "hospital_bed_small", "chance": 100, "rotation": 90 }, "8": { "vehicle": "hospital_bed_small", "chance": 100, "rotation": 270 }, - "w": { "vehicle": "wheelchair", "chance": 100, "rotation": 90 } + "w": { "vehicle": "wheelchair", "chance": 100, "rotation": 90 }, + "V": { "vehicle": "medical_cart", "chance": 100, "rotation": 0 } } }, { @@ -126,6 +128,7 @@ "s": "t_sidewalk", "t": "t_carpet_red", "v": "t_ladder_down", + "V": "t_floor", "W": "t_wall", "X": "t_door_metal_pickable", "y": "t_pavement_y", @@ -187,7 +190,8 @@ "vehicles": { "3": { "vehicle": "hospital_bed_small", "chance": 100, "rotation": 90 }, "8": { "vehicle": "hospital_bed_small", "chance": 100, "rotation": 270 }, - "w": { "vehicle": "wheelchair", "chance": 100, "rotation": 90 } + "w": { "vehicle": "wheelchair", "chance": 100, "rotation": 90 }, + "V": { "vehicle": "medical_cart", "chance": 100, "rotation": 0 } } }, { From 7f15ed22b9afec3633c64b0b79110d696f1edf05 Mon Sep 17 00:00:00 2001 From: Victoria Eastep <114838742+BarndoBoi@users.noreply.github.com> Date: Tue, 7 May 2024 19:46:54 -0400 Subject: [PATCH 083/104] Add medical cart to hospital --- data/json/mapgen/hospital.json | 29 +++++++++++++------------ data/json/mapgen_palettes/hospital.json | 4 +++- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/data/json/mapgen/hospital.json b/data/json/mapgen/hospital.json index d766a6494f82a..44e43b4080a50 100644 --- a/data/json/mapgen/hospital.json +++ b/data/json/mapgen/hospital.json @@ -96,44 +96,44 @@ "#...............#.........x.c.c.c.c.x..............b#``#....l#...#l....#", "#...............+........./.........x..............b#``#BB...+...+...BB#", "#+#+#+#+#+#.....+........./.........x..............b#``#BB...+...+...BB#", - "#.#.#.#.#.#.....#.........x.........x..............b#``#...cT#...#Tc...#", + "#.#.#.#.#.#.....#.........x...a.....x..............b#``#...cT#...#Tc...#", "#&#&#&#&#&#sssss#.D.....F.#rr###+####.DF.TbbbbTbbbbT#``#######///#######", - "####################//########r....d#################``#l.rrr#...#rrr.l#", + "####################//########r..a.d#################``#l.rrr#...#rrr.l#", "#...ll...x...ll...x....#SSSTf#r...cd#s.&#&.s#s.&#&.s#``#l....!...!....l#", - "#.TB..BT.x.TB..BT.x....#.....+.....L#...#...#...#...#``#l.rrr#...#rrr.l#", + "#.TB..BT.x.TB..BT.x....#.....+.....L#...#...#...#...#``#larrr#...#rrral#", "#r.B..B.rxr.B..B.rx....#########!#####+###+###+###+##;;#######...#######", - "#r......rxr......rx....................................................#", + "#r....a.rxr....a.rx....................................................#", "#xxx//xxxxxxx//xxxx....................................................;", "#......................................................................#", "#......................####################...#######;;#######...#######", "#......................x...........l#8....#...#rrr.l#``#l.rrr#...#rrr.l#", "#....................../.....A..BT.l#8....!...!....l#``#l....!...!....l#", - "#....................../.....?..B..r#88888#...#rrr.l#``#l.rrr#...#rrr.l#", - "#5.....................x...........r#######///#######``#######///#######", + "#....................../.....?..B..r#88888#...#rrral#``#larrr#...#rrral#", + "#5.....................x..........ar#######///#######``#######///#######", "##X#################///##############...cT#...#Tc...#``#...cT#...#Tc...#", - "#H.......H#.......l#...x...........l#BB...+...+...BB#``#BB...+...+...BB#", - "#H.......H#r.TBBT..#.../.....TBBT...#BB...+...+...BB#``#BB...+...+...BB#", + "#H.......H#a......l#...x...........l#BB...+...+...BB#``#BB...+...+...BB#", + "#H.......H#r.TBBT..#.../.....TBBT..a#BB...+...+...BB#``#BB...+...+...BB#", "#H.......H#r..BB...#.../......BB...r#....l#...#l....#``#....l#...#l....#", "#H.......H#........#...x...........r#######...#######``#######...#######", "###########xxx//xxx#...##############....l#...#l....#``#....l#...#l....#", - "#l........x............x...........R#BB...+...+...BB#``#BB...+...+...BB#", + "#l........x............x........a..R#BB...+...+...BB#``#BB...+...+...BB#", "#R.TB..A../............/.....6.....R#BB...+...+...BB#``#BB...+...+...BB#", "#R..B..?../............/.....*.....R#...cT#...#Tc...#``#...cT#...#Tc...#", - "#.........x............x.......22..R#######...#######``#######...#######", + "#a........x............x.......22..R#######...#######``#######...#######", "###########xxx//xxx#...##############...cT#...#Tc...#``#...cT#...#Tc...#", "#..KKKKK..#........#...x...........r#BB...+...+...BB#``#BB...+...+...BB#", "#N........#r..BB...#.../......BB...r#BB...+...+...BB#``#BB...+...+...BB#", - "#Y.......8#r.TBBT..#.../.....TBBT...#....l#...#l....#``#....l#...#l....#", - "#...TT...8#.......l#...x...........l#######...#######``#######...#######", + "#Y.......8#r.TBBT..#.../.....TBBT..a#....l#...#l....#``#....l#...#l....#", + "#...TT...8#a......l#...x...........l#######...#######``#######...#######", "#######!#############///#############....l#...#l....#``#....l#...#l....#", ";``````````````````;....bbb.bbb.bbb.#BB...+...+...BB#``#BB...+...+...BB#", ";``````````````````;...............b#BB...+...+...BB#``#BB...+...+...BB#", "######;;############...............b#...cT#...#Tc...#``#...cT#...#Tc...#", "#&..#....LLLLLLLLLL#...............b#######...#######``#######...#######", "#...+..............!................#...cT#...#Tc...#``#...cT#...#Tc...#", - "#..s#.....bbb.rrrr.#...............b#BB...+...+...BB#``#BB...+...+...BB#", + "#..s#.....bbb.rrrra#...............b#BB...+...+...BB#``#BB...+...+...BB#", "#####....###########...............b#BB...#...+...BB#``#BB...#...+...BB#", - "#kddd...C#d..ddd..d#...............b#....l#...#l....#``#....l#...#l....#", + "#kddd...C#d..ddd.ad#...............b#....l#...#l....#``#....l#...#l....#", "w..c....C#dc..c..cd#................#######///#######;;#######///#######", "#.......C#d.......d#.............................................#88888#", "w........+.........!.............................................!....8#", @@ -186,6 +186,7 @@ "2": { "item": "hospital_samples", "chance": 50 }, "k": { "item": "doctors_books", "chance": 60 }, "K": { "item": "hospital_oxygen", "chance": 85 }, + "a": { "item": "gear_medical", "chance": 65, "repeat": [ 2, 3 ] }, "H": [ { "item": "harddrugs", "chance": 60 }, { "item": "gear_medical", "chance": 60, "repeat": [ 1, 3 ] }, diff --git a/data/json/mapgen_palettes/hospital.json b/data/json/mapgen_palettes/hospital.json index 4a7705a3485dc..58e69ef17cc02 100644 --- a/data/json/mapgen_palettes/hospital.json +++ b/data/json/mapgen_palettes/hospital.json @@ -8,6 +8,7 @@ ":": "t_pavement_y", "&": "t_floor", ".": "t_floor", + "a": "t_floor", "b": "t_floor", "c": "t_floor", "d": "t_floor", @@ -76,7 +77,8 @@ "N": "f_oxygen_concentrator", "Y": "f_hd_compressor_unit" }, - "toilets": { "&": { } } + "toilets": { "&": { } }, + "vehicles": { "a": { "vehicle": "medical_cart", "chance": 100, "rotation": 0 } } }, { "type": "palette", From 3fc92a1da8894bb071e62b6ede9db37afb557e09 Mon Sep 17 00:00:00 2001 From: Karol1223 <68503002+Karol1223@users.noreply.github.com> Date: Wed, 8 May 2024 03:16:30 +0200 Subject: [PATCH 084/104] Vegetable Audit (#71969) * first half * gherkins vs salads, you must choose * oops gherkin recipes * cabbage, lettuce + gherkin density fix * tupperware max length * lower the carrots in the sack * spinach war I * spinach war II * beet sugar amount normalizing * second half * obsolete lentils * language cleanup * canned tomatoes + eggplant fix * tomato and tomato accessories * density * V8 * fuck around and find what for * is this progress * lower it tf down * mass conservation * pumpkins * final push? --------- Co-authored-by: Maleclypse <54345792+Maleclypse@users.noreply.github.com> --- .../agriculture.json | 1 + data/json/itemgroups/food_service.json | 2 +- data/json/items/comestibles/drink.json | 16 +- data/json/items/comestibles/drink_other.json | 16 +- data/json/items/comestibles/other.json | 6 +- data/json/items/comestibles/raw_veggy.json | 406 ++++++++++-------- data/json/items/comestibles/seed.json | 22 +- data/json/items/comestibles/soup.json | 10 +- data/json/items/comestibles/veggy_dishes.json | 10 +- data/json/items/generic/dining_kitchen.json | 3 +- .../migration_items.json | 5 + data/json/recipes/food/canned.json | 4 + data/json/recipes/food/casseroles.json | 2 +- data/json/recipes/food/seed.json | 10 +- data/json/recipes/recipe_food.json | 15 +- .../json/requirements/cooking_components.json | 3 +- data/json/uncraft/comestibles/vegetable.json | 26 +- data/mods/TEST_DATA/known_bad_density.json | 2 - tests/iteminfo_test.cpp | 2 +- 19 files changed, 338 insertions(+), 223 deletions(-) diff --git a/data/json/itemgroups/Agriculture_Forage_Excavation/agriculture.json b/data/json/itemgroups/Agriculture_Forage_Excavation/agriculture.json index 33e35c113192b..13eaa977af0de 100644 --- a/data/json/itemgroups/Agriculture_Forage_Excavation/agriculture.json +++ b/data/json/itemgroups/Agriculture_Forage_Excavation/agriculture.json @@ -25,6 +25,7 @@ [ "seed_broccoli", 60 ], [ "seed_celery", 60 ], [ "seed_cucumber", 60 ], + [ "seed_gherkin", 60 ], [ "seed_potato_raw", 60 ], [ "seed_zucchini", 60 ], [ "seed_cotton_boll", 10 ], diff --git a/data/json/itemgroups/food_service.json b/data/json/itemgroups/food_service.json index d415d98de817b..a804879ff4df1 100644 --- a/data/json/itemgroups/food_service.json +++ b/data/json/itemgroups/food_service.json @@ -1556,7 +1556,7 @@ "container-item": "bag_canvas", "entries": [ { "item": "potato", "prob": 6, "container-item": "null", "count": [ 1, 40 ] }, - { "item": "carrot", "prob": 4, "container-item": "null", "count": [ 1, 116 ] }, + { "item": "carrot", "prob": 4, "container-item": "null", "count": [ 1, 102 ] }, { "item": "onion", "prob": 4, "container-item": "null", "count": [ 1, 60 ] } ] }, diff --git a/data/json/items/comestibles/drink.json b/data/json/items/comestibles/drink.json index bf4ac9ef1038b..005f4bae711a6 100644 --- a/data/json/items/comestibles/drink.json +++ b/data/json/items/comestibles/drink.json @@ -1462,16 +1462,16 @@ "id": "V8", "looks_like": "juice", "name": { "str_sp": "V8" }, - "weight": "250 g", + "weight": "240 g", "color": "red", "spoils_in": "10 days", "container": "can_drink", "comestible_type": "DRINK", "symbol": "~", "quench": 6, - "calories": 51, + "calories": 45, "description": "Contains up to eight vegetables! Nutritious and tasty.", - "price": "40 cent", + "price": "71 cent", "price_postapoc": "50 cent", "material": [ "veggy" ], "primary_material": "water", @@ -1480,7 +1480,7 @@ "phase": "liquid", "flags": [ "EATEN_COLD" ], "fun": 1, - "vitamins": [ [ "vitC", 180 ], [ "calcium", 4 ], [ "iron", 4 ] ] + "vitamins": [ [ "vitC", "71 mg" ], [ "iron", "700 Ī¼g" ], [ "calcium", "19200 Ī¼g" ] ] }, { "id": "water", @@ -1616,16 +1616,16 @@ "type": "COMESTIBLE", "id": "tomato_juice", "name": { "str_sp": "tomato juice" }, - "weight": "253 g", + "weight": "243 g", "color": "red", "spoils_in": "5 days", "container": "bottle_plastic", "comestible_type": "DRINK", "symbol": "~", "quench": 40, - "calories": 40, + "calories": 41, "description": "A thick red liquid, made from tomatoes. Not to everyone's taste, it is a healthy and refreshing drink when chilled.", - "price": "90 cent", + "price": "23 cent", "price_postapoc": "40 cent", "material": [ "tomato" ], "primary_material": "water", @@ -1633,7 +1633,7 @@ "charges": 1, "phase": "liquid", "flags": [ "EATEN_COLD" ], - "vitamins": [ [ "vitC", 120 ], [ "calcium", 2 ], [ "iron", 2 ] ], + "vitamins": [ [ "vitC", "170300 Ī¼g" ], [ "iron", "900 Ī¼g" ], [ "calcium", "24300 Ī¼g" ] ], "fun": 2 }, { diff --git a/data/json/items/comestibles/drink_other.json b/data/json/items/comestibles/drink_other.json index 8e1bbc648ca13..e173fc34c6dd8 100644 --- a/data/json/items/comestibles/drink_other.json +++ b/data/json/items/comestibles/drink_other.json @@ -10,10 +10,10 @@ "container": "can_medium", "comestible_type": "FOOD", "symbol": "%", - "calories": 28, + "calories": 14, "sealed": true, "description": "A minimally seasoned sauce of cooked tomatoes.", - "price": "4 cent", + "price": "20 cent", "price_postapoc": "50 cent", "//": "Small cans--needs upsized after the string freeze.", "material": [ "tomato" ], @@ -21,7 +21,8 @@ "charges": 8, "phase": "liquid", "flags": [ "EATEN_HOT" ], - "fun": 1 + "fun": 1, + "vitamins": [ [ "vitC", "4300 Ī¼g" ], [ "iron", "600 Ī¼g" ], [ "calcium", "8600 Ī¼g" ] ] }, { "id": "maple_sap", @@ -80,20 +81,21 @@ "color": "red", "name": { "str_sp": "ketchup" }, "description": "A viscous paste of tomato, salt, and vinegar.", - "price": "18 USD 75 cent", + "price": "59 cent", "price_postapoc": "1 USD", "material": [ "veggy", "junk" ], - "weight": "17 g", + "weight": "15 g", "volume": "250 ml", "comestible_type": "DRINK", "container": "condiment_bottle_sealed", "sealed": false, - "calories": 28, + "calories": 14, "spoils_in": 600, "charges": 16, "fun": -1, "flags": [ "NO_AUTO_CONSUME" ], - "phase": "liquid" + "phase": "liquid", + "vitamins": [ [ "vitC", "2300 Ī¼g" ], [ "iron", "100 Ī¼g" ], [ "calcium", "2700 Ī¼g" ] ] }, { "id": "barbecue_sauce", diff --git a/data/json/items/comestibles/other.json b/data/json/items/comestibles/other.json index 8fb4298bbf2eb..00ca5073dca55 100644 --- a/data/json/items/comestibles/other.json +++ b/data/json/items/comestibles/other.json @@ -1003,7 +1003,7 @@ "type": "COMESTIBLE", "id": "can_tomato", "name": { "str_sp": "canned tomato" }, - "weight": "128 g", + "weight": "120 g", "color": "red", "spoils_in": "3 days 18 hours", "container": "can_food", @@ -1011,13 +1011,13 @@ "comestible_type": "FOOD", "symbol": "%", "quench": 3, - "calories": 55, + "calories": 26, "description": "Canned tomato. A staple in many pantries, and useful for many recipes.", "price": "175 cent", "price_postapoc": "50 cent", "material": [ "tomato" ], "volume": "125 ml", - "vitamins": [ [ "vitC", 26 ], [ "calcium", 9 ], [ "iron", 18 ] ], + "vitamins": [ [ "vitC", "11 mg" ], [ "iron", "1600 Ī¼g" ], [ "calcium", "40800 Ī¼g" ] ], "flags": [ "RAW" ] }, { diff --git a/data/json/items/comestibles/raw_veggy.json b/data/json/items/comestibles/raw_veggy.json index 9aa0bba00721c..72ed8899d1bdc 100644 --- a/data/json/items/comestibles/raw_veggy.json +++ b/data/json/items/comestibles/raw_veggy.json @@ -101,41 +101,62 @@ "type": "COMESTIBLE", "id": "broccoli", "name": { "str_sp": "broccoli" }, - "weight": "96 g", + "weight": "151 g", "color": "green", "spoils_in": "6 days 16 hours", "comestible_type": "FOOD", "symbol": "%", - "calories": 44, + "calories": 51, "description": "A big stalk of broccoli. It's a bit tough, but rich in Vitamin C and quite delicious when properly cooked.", - "price": "4 USD", + "price": "47 cent", "price_postapoc": "50 cent", "material": [ "veggy" ], "volume": "180 ml", "flags": [ "EATEN_HOT", "SMOKABLE", "RAW" ], "smoking_result": "dry_veggy", - "vitamins": [ [ "vitC", 95 ], [ "calcium", 5 ], [ "iron", 4 ] ] + "vitamins": [ [ "vitC", "134700 Ī¼g" ], [ "iron", "1100 Ī¼g" ], [ "calcium", "71 mg" ] ] + }, + { + "type": "COMESTIBLE", + "id": "cabbage_head", + "name": { "str_sp": "cabbage head" }, + "weight": "910 g", + "color": "white", + "spoils_in": "10 days", + "comestible_type": "FOOD", + "symbol": "%", + "quench": 2, + "calories": 234, + "description": "A head of crisp white cabbage. You should probably prepare it before eating.", + "price": "104 cent", + "price_postapoc": "104 cent", + "material": [ "veggy" ], + "volume": "1632 ml", + "fun": -2, + "flags": [ "SMOKABLE", "RAW", "CATTLE" ], + "smoking_result": "dry_veggy", + "vitamins": [ [ "vitC", "332800 Ī¼g" ], [ "iron", "12900 Ī¼g" ], [ "calcium", "364 mg" ] ] }, { "type": "COMESTIBLE", "id": "cabbage", - "name": { "str_sp": "cabbage" }, - "weight": "82 g", + "name": { "str": "handful of shredded cabbage", "str_pl": "handfuls of shredded cabbage" }, + "weight": "70 g", "color": "white", "spoils_in": "10 days", "comestible_type": "FOOD", "symbol": "%", "quench": 2, - "calories": 27, - "description": "A head of crisp white cabbage.", - "price": "12 cent", - "price_postapoc": "12 cent", + "calories": 18, + "description": "A handful of shredded cabbage.", + "price": "8 cent", + "price_postapoc": "8 cent", "material": [ "veggy" ], - "volume": "156 ml", + "volume": "250 ml", "fun": -2, "flags": [ "SMOKABLE", "RAW" ], "smoking_result": "dry_veggy", - "vitamins": [ [ "vitC", 56 ], [ "calcium", 5 ], [ "iron", 5 ] ] + "vitamins": [ [ "vitC", "25600 Ī¼g" ], [ "iron", "300 Ī¼g" ], [ "calcium", "28 mg" ] ] }, { "type": "COMESTIBLE", @@ -159,23 +180,23 @@ { "type": "COMESTIBLE", "id": "spinach", - "name": { "str_sp": "spinach" }, - "weight": "139 g", + "name": { "str": "handful of spinach", "str_pl": "handfuls of spinach" }, + "weight": "30 g", "color": "green", "spoils_in": "8 days", "comestible_type": "FOOD", "symbol": "%", "quench": 2, - "calories": 43, + "calories": 7, "description": "A bunch of spinach leaves. Their ability to provide one with superhuman strength has been greatly exaggerated by popular media.", - "price": "11 cent", + "price": "18 cent", "price_postapoc": "5 cent", "material": [ "veggy" ], "volume": "250 ml", "fun": -2, "flags": [ "SMOKABLE", "RAW" ], "smoking_result": "dry_veggy", - "vitamins": [ [ "calcium", 8 ], [ "iron", 18 ] ] + "vitamins": [ [ "vitC", "8400 Ī¼g" ], [ "iron", "800 Ī¼g" ], [ "calcium", "29700 Ī¼g" ] ] }, { "type": "COMESTIBLE", @@ -186,16 +207,17 @@ "spoils_in": "5 days", "comestible_type": "FOOD", "symbol": "%", - "calories": 39, + "calories": 30, "description": "A healthy root vegetable. Rich in vitamin A!", - "price": "33 cent", + "price": "23 cent", "price_postapoc": "8 cent", "material": [ "veggy" ], - "volume": "128 ml", + "volume": "146 ml", + "longest_side": "19 cm", "fun": 1, "flags": [ "SMOKABLE", "RAW" ], "smoking_result": "dry_veggy", - "vitamins": [ [ "vitC", 5 ], [ "calcium", 3 ], [ "iron", 1 ] ] + "vitamins": [ [ "vitC", "4200 Ī¼g" ], [ "iron", "200 Ī¼g" ], [ "calcium", "23800 Ī¼g" ] ] }, { "type": "COMESTIBLE", @@ -266,21 +288,22 @@ "type": "COMESTIBLE", "id": "celery", "name": { "str_sp": "celery" }, - "weight": "107 g", + "weight": "40 g", "color": "light_green", "spoils_in": "6 days 6 hours", "comestible_type": "FOOD", "symbol": "%", "quench": 3, - "calories": 19, - "description": "Neither tasty nor very nutritious, but it goes well with salad.", - "price": "2 USD", + "calories": 6, + "description": "A single stalk of celery. Neither tasty nor very nutritious, but it goes well with salad.", + "price": "10 cent", "price_postapoc": "10 cent", "material": [ "veggy" ], - "volume": "190 ml", + "volume": "146 ml", + "longest_side": "19 cm", "flags": [ "FREEZERBURN", "SMOKABLE", "RAW" ], "smoking_result": "dry_veggy", - "vitamins": [ [ "vitC", 4 ], [ "calcium", 4 ], [ "iron", 1 ] ] + "vitamins": [ [ "vitC", "8400 Ī¼g" ], [ "iron", "800 Ī¼g" ], [ "calcium", "29700 Ī¼g" ] ] }, { "type": "COMESTIBLE", @@ -304,19 +327,19 @@ "type": "COMESTIBLE", "id": "chili_pepper", "name": { "str": "chili pepper" }, - "weight": "53 g", + "weight": "45 g", "color": "red", "spoils_in": "30 days", "comestible_type": "FOOD", "symbol": "%", - "calories": 21, + "calories": 18, "description": "A spicy chili pepper. Not the best on its own, but adds great flavor when used in cooking.", - "price": "16 cent", + "price": "8 cent", "price_postapoc": "16 cent", "material": [ "veggy" ], - "volume": "83 ml", + "volume": "70 ml", "flags": [ "FREEZERBURN", "RAW" ], - "vitamins": [ [ "vitC", 88 ], [ "calcium", 1 ], [ "iron", 3 ] ], + "vitamins": [ [ "vitC", "64700 Ī¼g" ], [ "iron", "500 Ī¼g" ], [ "calcium", "6300 Ī¼g" ] ], "fun": -2 }, { @@ -325,8 +348,6 @@ "copy-from": "chili_pepper", "cooks_like": "chili_pepper", "name": { "str": "cut chili pepper" }, - "weight": "52 g", - "volume": "83 ml", "spoils_in": "3 days", "description": "A chili pepper that's been cut into pieces. The seeds have been removed.", "price": "3 cent", @@ -335,36 +356,69 @@ { "type": "COMESTIBLE", "id": "cucumber", - "name": { "str": "cucumber" }, - "weight": "185 g", + "name": { "str": "salad cucumber" }, + "weight": "301 g", "color": "green", "spoils_in": "6 days 6 hours", "comestible_type": "FOOD", "symbol": "%", "quench": 7, - "calories": 37, - "description": "A vegetable from the gourd family. Not especially flavorful, but very refreshing.", - "price": "3 USD", + "calories": 45, + "description": "The larger cousin of a pickle. A vegetable from the gourd family. Not especially flavorful, but very refreshing.", + "price": "84 cent", "price_postapoc": "50 cent", "material": [ "veggy" ], - "volume": "320 ml", + "volume": "275 ml", + "longest_side": "22 cm", "flags": [ "FREEZERBURN", "SMOKABLE", "RAW" ], "smoking_result": "dry_veggy", - "vitamins": [ [ "vitC", 9 ], [ "calcium", 6 ], [ "iron", 6 ] ] + "vitamins": [ [ "vitC", "8400 Ī¼g" ], [ "iron", "800 Ī¼g" ], [ "calcium", "48200 Ī¼g" ] ] }, { "type": "COMESTIBLE", "id": "cucumber_cut", - "name": { "str": "cut cucumber" }, - "volume": "319 ml", - "weight": "184 g", + "name": { "str": "cut salad cucumber" }, + "volume": "274 ml", + "weight": "300 g", "copy-from": "cucumber", "cooks_like": "cucumber", "spoils_in": "2 days", - "description": "A chopped-up cucumber.", + "description": "A chopped-up salad cucumber.", "price": "30 cent", "price_postapoc": "10 cent" }, + { + "type": "COMESTIBLE", + "id": "gherkin", + "name": { "str": "gherkin cucumber" }, + "weight": "65 g", + "color": "green", + "spoils_in": "6 days 6 hours", + "comestible_type": "FOOD", + "symbol": "%", + "quench": 2, + "calories": 7, + "description": "A pickle before it becomes a pickle. Gherkins are smaller cucumbers that - you guessed it - are used to make pickles.", + "price": "13 cent", + "price_postapoc": "11 cent", + "material": [ "veggy" ], + "volume": "60 ml", + "longest_side": "10 cm", + "flags": [ "FREEZERBURN", "SMOKABLE", "RAW" ], + "smoking_result": "dry_veggy", + "vitamins": [ [ "vitC", "700 Ī¼g" ], [ "iron", "300 Ī¼g" ] ] + }, + { + "type": "COMESTIBLE", + "id": "gherkin_cut", + "name": { "str": "cut gherkin cucumber" }, + "copy-from": "gherkin", + "cooks_like": "gherkin", + "spoils_in": "2 days", + "description": "A chopped-up gherkin cucumber.", + "price": "13 cent", + "price_postapoc": "5 cent" + }, { "type": "COMESTIBLE", "id": "dahlia_root", @@ -396,33 +450,33 @@ "calories": 109, "//": "Serving Size is 1 cup of sliced roots. Salsify grows in bountiful clumps, it's a weed.", "description": "A highly nutritious root, it is tough and bland until cooked, at which point it tastes strangely similar to oysters.", - "price": "75 cent", + "price": "39 cent", "price_postapoc": "50 cent", "material": [ "veggy" ], "volume": "250 ml", "fun": -2, "smoking_result": "dry_veggy", "flags": [ "RAW", "SMOKABLE" ], - "vitamins": [ [ "vitC", 18 ], [ "iron", 5 ], [ "calcium", 8 ] ] + "vitamins": [ [ "vitC", "10600 Ī¼g" ], [ "iron", "900 Ī¼g" ], [ "calcium", "79800 Ī¼g" ] ] }, { "type": "COMESTIBLE", "id": "chicory_raw", - "name": { "str_sp": "chicory" }, + "name": { "str": "chicory root" }, "weight": "60 g", "color": "cyan", "spoils_in": "30 days", "comestible_type": "FOOD", "symbol": "%", "calories": 43, - "description": "A modest blue flower. The flower's roots are very bitter and not meant to be eaten raw.", - "price": "1 USD 10 cent", + "description": "A very bitter root, not meant to be eaten raw.", + "price": "4 cent", "price_postapoc": "25 cent", "material": [ "veggy" ], - "volume": "250 ml", + "volume": "135 ml", "fun": -8, "flags": [ "RAW" ], - "vitamins": [ [ "vitC", 5 ], [ "iron", 3 ], [ "calcium", 2 ] ] + "vitamins": [ [ "vitC", "3 mg" ], [ "iron", "500 Ī¼g" ], [ "calcium", "24600 Ī¼g" ] ] }, { "type": "COMESTIBLE", @@ -469,13 +523,13 @@ "quench": -18, "calories": 24, "description": "A pungent garlic bulb. Popular as a seasoning for its strong flavor. Can be disassembled into cloves.", - "price": "3 USD", - "price_postapoc": "50 cent", + "price": "12 cent", + "price_postapoc": "48 cent", "material": [ "garlic" ], - "volume": "150 ml", + "volume": "45 ml", "fun": -18, "flags": [ "RAW", "PLANTABLE_SEED" ], - "vitamins": [ [ "vitC", 5 ], [ "calcium", 3 ], [ "iron", 1 ] ], + "vitamins": [ [ "vitC", "5400 Ī¼g" ], [ "iron", "600 Ī¼g" ], [ "calcium", "32400 Ī¼g" ] ], "//": "Who in their right mind would eat an entire garlic bulb raw?" }, { @@ -490,11 +544,12 @@ "quench": -3, "calories": 4, "description": "Cloves of garlic. Useful as a seasoning.", - "price": "8 cent", + "price": "2 cent", + "price_postapoc": "8 cent", "material": [ "garlic" ], - "volume": "25 ml", + "volume": "6 ml", "fun": -3, - "flags": [ "NUTRIENT_OVERRIDE" ], + "vitamins": [ [ "vitC", "900 Ī¼g" ], [ "iron", "100 Ī¼g" ], [ "calcium", "5400 Ī¼g" ] ], "seed_data": { "plant_name": "garlic", "fruit": "garlic", "byproducts": [ "withered" ], "grow": "65 days" } }, { @@ -524,34 +579,55 @@ "spoils_in": "60 days", "comestible_type": "FOOD", "symbol": "%", - "calories": 166, + "calories": 120, "description": "A large white tapered root of a horseradish plant. Way too spicy to eat in this form, but can be used for making condiments.", - "price": "80 cent", + "price": "107 cent", + "price_postapoc": "80 cent", "material": [ "veggy" ], "volume": "400 ml", "fun": -12, "flags": [ "FREEZERBURN", "RAW" ], - "vitamins": [ [ "vitC", 41 ], [ "calcium", 6 ], [ "iron", 5 ] ] + "vitamins": [ [ "vitC", "62300 Ī¼g" ], [ "iron", "1100 Ī¼g" ], [ "calcium", "140 mg" ] ] + }, + { + "type": "COMESTIBLE", + "id": "lettuce_head", + "name": { "str_sp": "lettuce head" }, + "weight": "504 g", + "color": "light_green", + "spoils_in": "10 days", + "comestible_type": "INVALID", + "symbol": "%", + "quench": 2, + "calories": 70, + "description": "A crisp head of iceberg lettuce. You should probably prepare it before eating.", + "price": "264 cent", + "price_postapoc": "132 cent", + "material": [ "veggy" ], + "volume": "1850 ml", + "flags": [ "FREEZERBURN", "SMOKABLE", "RAW", "CATTLE" ], + "smoking_result": "dry_veggy", + "vitamins": [ [ "vitC", "14 mg" ], [ "iron", "2100 Ī¼g" ], [ "calcium", "91 mg" ] ] }, { "type": "COMESTIBLE", "id": "lettuce", - "name": { "str_sp": "lettuce" }, - "weight": "90 g", + "name": { "str": "handful of shredded lettuce", "str_pl": "handfuls of shredded lettuce" }, + "weight": "72 g", "color": "light_green", "spoils_in": "10 days", "comestible_type": "FOOD", "symbol": "%", "quench": 2, - "calories": 17, - "description": "A crisp head of iceberg lettuce.", - "price": "20 cent", - "price_postapoc": "10 cent", + "calories": 10, + "description": "A handful of shredded iceberg lettuce.", + "price": "35 cent", + "price_postapoc": "20 cent", "material": [ "veggy" ], - "volume": "170 ml", + "volume": "250 ml", "flags": [ "FREEZERBURN", "SMOKABLE", "RAW" ], "smoking_result": "dry_veggy", - "vitamins": [ [ "vitC", 4 ], [ "calcium", 1 ], [ "iron", 2 ] ] + "vitamins": [ [ "vitC", "2 mg" ], [ "iron", "300 Ī¼g" ], [ "calcium", "13 mg" ] ] }, { "type": "COMESTIBLE", @@ -575,22 +651,22 @@ "type": "COMESTIBLE", "id": "onion", "name": { "str": "onion" }, - "weight": "150 g", + "weight": "110 g", "color": "white", "spoils_in": "30 days", "comestible_type": "FOOD", "symbol": "%", - "calories": 80, + "calories": 44, "description": "An aromatic onion used in cooking. Cutting these up can make your eyes sting!", - "price": "50 cent", + "price": "17 cent", "price_postapoc": "50 cent", "material": [ "veggy" ], - "volume": "250 ml", + "volume": "135 ml", "fun": -1, "flags": [ "FREEZERBURN", "SMOKABLE", "RAW" ], "smoking_result": "dry_veggy", "//": "Raw onions probably aren't all that tasty to most people.", - "vitamins": [ [ "vitC", 12 ], [ "calcium", 4 ], [ "iron", 2 ] ] + "vitamins": [ [ "vitC", "8100 Ī¼g" ], [ "iron", "200 Ī¼g" ], [ "calcium", "25300 Ī¼g" ] ] }, { "type": "COMESTIBLE", @@ -618,61 +694,61 @@ "type": "COMESTIBLE", "id": "potato", "name": { "str": "raw potato", "str_pl": "raw potatoes" }, - "weight": "210 g", + "weight": "213 g", "color": "brown", "spoils_in": "60 days", "comestible_type": "FOOD", "symbol": "%", "healthy": -1, - "calories": 193, + "calories": 164, "description": "A potato, mildly toxic and not very tasty raw. Delicious and filling when properly cooked.", - "price": "90 cent", + "price": "84 cent", "price_postapoc": "50 cent", "material": [ "veggy" ], - "volume": "375 ml", + "volume": "232 ml", "fun": -3, "flags": [ "FREEZERBURN", "SMOKABLE", "RAW" ], "smoking_result": "dry_veggy", - "vitamins": [ [ "vitC", 47 ], [ "calcium", 3 ], [ "iron", 9 ] ] + "vitamins": [ [ "vitC", "42 mg" ], [ "iron", "1700 Ī¼g" ], [ "calcium", "25600 Ī¼g" ] ] }, { "type": "COMESTIBLE", "id": "plantain", "name": { "str": "cooking banana" }, - "weight": "118 g", + "weight": "179 g", "color": "yellow", "spoils_in": "5 days", "comestible_type": "FOOD", "symbol": "%", - "calories": 141, + "calories": 218, "description": "A much less sweet and more starchy relative of the banana; unlike dessert bananas, they usually are eaten cooked rather than raw, and can be processed into flour. They are a staple food in tropical regions of the world. Also known as plantains.", - "price": "1 USD 20 cent", + "price": "72 cent", "price_postapoc": "1 USD", "material": [ "veggy" ], - "volume": "500 ml", + "volume": "190 ml", "fun": -1, "flags": [ "SMOKABLE", "RAW" ], "smoking_result": "dry_veggy", - "vitamins": [ [ "vitC", 26 ], [ "iron", 6 ] ] + "vitamins": [ [ "vitC", "32900 Ī¼g" ], [ "iron", "1100 Ī¼g" ], [ "calcium", "5400 Ī¼g" ] ] }, { "type": "COMESTIBLE", "id": "pumpkin", "name": { "str": "pumpkin" }, - "weight": "2267 g", + "weight": "2264 g", "color": "light_red", "spoils_in": "60 days", "comestible_type": "FOOD", "symbol": "%", - "calories": 120, + "calories": 292, "description": "A large gourd, about the size of a person's head. It'll require some disassembly before use.", - "price": "2 USD 50 cent", + "price": "250 cent", "price_postapoc": "6 USD", "material": [ "veggy" ], - "volume": "3 L", + "volume": "2062 ml", "fun": -1, "flags": [ "RAW", "INEDIBLE" ], - "vitamins": [ [ "vitC", 69 ], [ "calcium", 9 ], [ "iron", 19 ] ], + "vitamins": [ [ "vitC", "102 mg" ], [ "iron", "9200 Ī¼g" ], [ "calcium", "237600 Ī¼g" ] ], "melee_damage": { "bash": 2 } }, { @@ -682,15 +758,15 @@ "copy-from": "pumpkin", "spoils_in": "6 days", "description": "A quarter section of a pumpkin. The seeds and stringy inner pulp have been removed.", - "price": "25 cent", - "calories": 30, + "price": "64 cent", + "calories": 73, "quench": 5, "volume": "500 ml", - "weight": "525 g", + "weight": "283 g", "price_postapoc": "60 cent", "flags": [ "SMOKABLE", "RAW" ], "smoking_result": "dry_veggy", - "vitamins": [ [ "vitC", 17 ], [ "calcium", 2 ], [ "iron", 4 ] ], + "vitamins": [ [ "vitC", "25500 Ī¼g" ], [ "iron", "2300 Ī¼g" ], [ "calcium", "59400 Ī¼g" ] ], "melee_damage": { "bash": 0 } }, { @@ -755,63 +831,64 @@ { "type": "COMESTIBLE", "id": "raw_bamboo", - "name": { "str_sp": "bamboo shoots" }, + "name": { "str": "handful of bamboo shoots", "str_pl": "handfuls of bamboo shoots" }, "weight": "151 g", "color": "green", "spoils_in": "1 day 6 hours", "comestible_type": "FOOD", "symbol": "^", "healthy": -1, - "calories": 42, + "calories": 41, "description": "Raw woody bamboo shoots, they require some preparation before they can be eaten safely.", "price": "15 cent", "price_postapoc": "12 cent", "material": [ "veggy" ], - "volume": "59 ml", + "volume": "250 ml", "fun": -12, "flags": [ "FREEZERBURN", "SMOKABLE", "RAW" ], "smoking_result": "dry_veggy", - "vitamins": [ [ "vitC", 1 ], [ "calcium", 23 ], [ "iron", 10 ] ] + "vitamins": [ [ "vitC", "6 mg" ], [ "iron", "1 mg" ], [ "calcium", "20 mg" ] ] }, { "type": "COMESTIBLE", "id": "rhubarb", "name": { "str": "rhubarb" }, - "weight": "129 g", + "weight": "51 g", "color": "red", "spoils_in": "6 days 16 hours", "comestible_type": "FOOD", "symbol": "%", "quench": 3, "calories": 36, - "description": "Sour stems of the rhubarb plant, often used in baking pies.", - "price": "4 USD 10 cent", + "description": "A sour stalk of the rhubarb plant, often used in baking pies.", + "price": "29 cent", "price_postapoc": "50 cent", "material": [ "veggy" ], - "volume": "250 ml", + "volume": "186 ml", + "longest_side": "19 cm", "flags": [ "SMOKABLE", "RAW" ], "smoking_result": "dry_veggy", - "vitamins": [ [ "vitC", 11 ], [ "calcium", 11 ], [ "iron", 2 ] ] + "vitamins": [ [ "vitC", "4100 Ī¼g" ], [ "iron", "100 Ī¼g" ], [ "calcium", "43900 Ī¼g" ] ] }, { "type": "COMESTIBLE", "id": "sugar_beet", "name": { "str": "sugar beet" }, - "weight": "143 g", + "weight": "82 g", "color": "brown", "spoils_in": "95 days", "comestible_type": "FOOD", "symbol": "%", - "calories": 82, + "calories": 35, "description": "This fleshy root is ripe and flowing with sugars; it'll just take some processing to extract them.", "price": "12 cent", "price_postapoc": "12 cent", "material": [ "veggy" ], - "volume": "250 ml", + "volume": "75 ml", "fun": -10, "flags": [ "SMOKABLE" ], "smoking_result": "dry_veggy", - "vitamins": [ [ "vitC", 8 ], [ "calcium", 2 ], [ "iron", 6 ] ] + "vitamins": [ [ "vitC", "4 mg" ], [ "iron", "1 mg" ], [ "calcium", "13 mg" ] ] }, { "type": "COMESTIBLE", @@ -872,21 +949,21 @@ "type": "COMESTIBLE", "id": "tomato", "name": { "str": "tomato", "str_pl": "tomatoes" }, - "weight": "231 g", + "weight": "123 g", "color": "red", "spoils_in": "3 days 18 hours", "comestible_type": "FOOD", "symbol": "%", "quench": 28, - "calories": 55, + "calories": 22, "description": "A juicy red tomato. It gained popularity in Italy after being brought back from the New World.", - "price": "90 cent", + "price": "51 cent", "price_postapoc": "50 cent", "material": [ "tomato" ], - "volume": "375 ml", + "volume": "150 ml", "flags": [ "SMOKABLE" ], "smoking_result": "dry_veggy", - "vitamins": [ [ "vitC", 22 ], [ "calcium", 3 ], [ "iron", 6 ] ] + "vitamins": [ [ "vitC", "16900 Ī¼g" ], [ "iron", "300 Ī¼g" ], [ "calcium", "12300 Ī¼g" ] ] }, { "type": "COMESTIBLE", @@ -947,27 +1024,26 @@ "type": "COMESTIBLE", "id": "zucchini", "name": { "str": "zucchini" }, - "weight": "210 g", + "weight": "196 g", "color": "light_green", "spoils_in": "5 days", "comestible_type": "FOOD", "symbol": "%", - "calories": 59, + "calories": 33, "description": "A tasty summer squash.", - "price": "3 USD", + "price": "46 cent", "price_postapoc": "50 cent", "material": [ "veggy" ], - "volume": "395 ml", + "volume": "180 ml", + "longest_side": "22 cm", "flags": [ "EATEN_HOT", "SMOKABLE" ], "smoking_result": "dry_veggy", - "vitamins": [ [ "vitC", 39 ], [ "calcium", 3 ], [ "iron", 4 ] ] + "vitamins": [ [ "vitC", "35100 Ī¼g" ], [ "iron", "700 Ī¼g" ], [ "calcium", "31400 Ī¼g" ] ] }, { "type": "COMESTIBLE", "id": "zucchini_cut", "name": { "str": "cut zucchini" }, - "weight": "209 g", - "volume": "394 ml", "copy-from": "zucchini", "cooks_like": "zucchini", "spoils_in": "2 days 12 hours", @@ -976,47 +1052,25 @@ { "type": "COMESTIBLE", "id": "raw_beans", - "name": { "str_sp": "raw beans" }, + "name": { "str": "handful of raw beans", "str_pl": "handfuls of raw beans" }, "color": "brown", "spoils_in": "2 days", "comestible_type": "FOOD", "volume": "250 ml", - "weight": "194 g", + "weight": "184 g", "symbol": "%", - "calories": 56, - "description": "Raw, uncooked beans. They are mildly toxic to humans in this form, but you could cook them to make them tasty.", + "calories": 53, + "description": "Raw, uncooked kidney beans. They are mildly toxic to humans in this form, but you could cook them to make them tasty.", "price": "90 cent", "price_postapoc": "25 cent", "material": [ "veggy" ], "cooks_like": "beans_cooked", "smoking_result": "dry_beans", - "vitamins": [ [ "iron", 2 ], [ "vitC", 20 ] ], + "vitamins": [ [ "vitC", "71 mg" ], [ "iron", "1 mg" ], [ "calcium", "31 mg" ] ], "petfood": [ "CATTLEFOOD" ], "flags": [ "EDIBLE_FROZEN", "SMOKABLE", "RAW", "INEDIBLE", "CATTLE", "PLANTABLE_SEED" ], "seed_data": { "plant_name": "beans", "fruit": "raw_beans", "seeds": false, "byproducts": [ "withered" ], "grow": "91 days" } }, - { - "type": "COMESTIBLE", - "id": "raw_lentils", - "name": { "str_sp": "raw lentils" }, - "color": "light_green", - "spoils_in": "2 days", - "comestible_type": "FOOD", - "volume": "250 ml", - "weight": "194 g", - "symbol": "%", - "calories": 42, - "description": "Raw, uncooked lentils.", - "price": "90 cent", - "price_postapoc": "25 cent", - "material": [ "veggy" ], - "fun": -1, - "cooks_like": "lentils_cooked", - "//": "These come out of the field dry, so this item can probably be obsoleted.", - "flags": [ "SMOKABLE", "RAW" ], - "smoking_result": "dry_lentils", - "vitamins": [ [ "calcium", 2 ], [ "iron", 3 ], [ "vitC", 1 ] ] - }, { "type": "COMESTIBLE", "id": "fiddlehead_raw", @@ -1062,10 +1116,13 @@ "id": "chicory_leaves", "name": { "str": "handful of chicory greens", "str_pl": "handfuls of chicory greens" }, "copy-from": "young_leaves", - "description": "Some chicory greens. They are quite bitter but high in vitamins.", - "price_postapoc": "20 cent", + "description": "Some chicory greens. They are quite bitter but high in calcium.", + "price_postapoc": 20, + "weight": "29 g", + "volume": "250 ml", "fun": -8, - "vitamins": [ [ "vitC", 6 ], [ "iron", 1 ], [ "calcium", 2 ] ] + "calories": 6, + "vitamins": [ [ "vitC", "7 mg" ], [ "iron", "300 Ī¼g" ], [ "calcium", "29 mg" ] ] }, { "type": "COMESTIBLE", @@ -1091,28 +1148,28 @@ "type": "COMESTIBLE", "id": "bell_pepper", "name": { "str": "bell pepper" }, - "weight": "113 g", + "weight": "119 g", "color": "green", "spoils_in": "3 days 8 hours", "comestible_type": "FOOD", "symbol": "%", "quench": 2, - "calories": 39, + "calories": 23, "description": "A green bell pepper. Eating it whole and raw would be kind of a hassle, considering all the seeds.", - "price": "20 cent", + "price": "54 cent", + "price_postapoc": "20 cent", "material": [ "veggy" ], - "volume": "250 ml", + "volume": "221 ml", "flags": [ "SMOKABLE", "RAW" ], "smoking_result": "dry_veggy", "fun": -5, - "vitamins": [ [ "calcium", 2 ], [ "vitC", 12 ] ] + "vitamins": [ [ "vitC", "95700 Ī¼g" ], [ "iron", "400 Ī¼g" ], [ "calcium", "11900 Ī¼g" ] ] }, { "type": "COMESTIBLE", "id": "bell_pepper_cut", "name": { "str": "cut bell pepper" }, "copy-from": "bell_pepper", - "weight": "112 g", "spoils_in": "1 days 16 hours", "description": "A chopped up bell pepper with the seeds removed.", "price": "10 cent", @@ -1134,10 +1191,10 @@ "price": "45 cent", "price_postapoc": "10 cent", "material": [ "veggy", "powder" ], - "volume": "24 ml", - "//": "240 ml is equivalent to 1 cup of flour. 10 charges is roughly equivalent to a cup of flour for American recipes.", + "volume": "25 ml", + "//": "250 ml is equivalent to 1 cup of flour. 10 charges is roughly equivalent to a cup of flour for American recipes. Nutritional data based off buckwheat flour.", "flags": [ "EDIBLE_FROZEN", "RAW" ], - "vitamins": [ [ "iron", 1 ] ], + "vitamins": [ [ "iron", "500 Ī¼g" ], [ "calcium", "5 mg" ] ], "fun": -5 }, { @@ -1151,53 +1208,54 @@ "comestible_type": "FOOD", "symbol": "6", "quench": 2, - "calories": 36, + "calories": 60, "fun": -5, "description": "A vegetable from the gourd family, bottle gourds were brought to the Americas by the first Native American settlers crossing the Bering strait. It can be further prepared to produce a hard, watertight shell, usable as a biodegradable liquid container. Eating it doesn't look worth it.", "volume": "4500 ml", "flags": [ "FREEZERBURN", "SMOKABLE", "RAW" ], - "smoking_result": "dry_bottle_gourd" + "smoking_result": "dry_bottle_gourd", + "vitamins": [ [ "iron", "1 mg" ], [ "calcium", "95890 Ī¼g" ] ] }, { "type": "COMESTIBLE", "id": "eggplant", "name": { "str": "eggplant" }, "comestible_type": "FOOD", - "weight": "194 g", - "volume": "250 ml", - "price": "20 cent", + "weight": "548 g", + "volume": "501 ml", + "longest_side": "22 cm", + "price": "3 USD", "price_postapoc": "50 cent", "color": "black", "material": [ "veggy" ], - "calories": 40, + "calories": 137, "spoils_in": "20 days", - "description": "A normal and healthy purple eggplant.", + "description": "A normal and healthy purple eggplant. Needs to be disassembled before being useful for cooking.", "healthy": -1, "symbol": "e", - "looks_like": "eggplant", "flags": [ "RAW" ], - "vitamins": [ [ "calcium", 9 ], [ "iron", 2 ], [ "vitC", 10 ] ], - "fun": -5 + "vitamins": [ [ "vitC", "12100 Ī¼g" ], [ "iron", "1300 Ī¼g" ], [ "calcium", "49300 Ī¼g" ] ], + "fun": -8 }, { "type": "COMESTIBLE", "id": "eggplant_cut", "name": { "str": "cut eggplant" }, "comestible_type": "FOOD", - "weight": "193 g", - "volume": "249 ml", - "price": "10 cent", - "price_postapoc": "10 cent", + "weight": "274 g", + "volume": "250 ml", + "price": "150 cent", + "price_postapoc": "20 cent", "color": "black", "material": [ "veggy" ], - "calories": 40, + "calories": 68, "spoils_in": "4 days", "description": "A cut-up eggplant with many of the seeds picked out.", "healthy": -1, "symbol": "e", "looks_like": "eggplant", "flags": [ "RAW" ], - "vitamins": [ [ "calcium", 9 ], [ "iron", 2 ], [ "vitC", 10 ] ], + "vitamins": [ [ "vitC", "60500 Ī¼g" ], [ "iron", "650 Ī¼g" ], [ "calcium", "24650 Ī¼g" ] ], "fun": -5 } ] diff --git a/data/json/items/comestibles/seed.json b/data/json/items/comestibles/seed.json index f5ee611fb2bb2..02eb2d15dd8ca 100644 --- a/data/json/items/comestibles/seed.json +++ b/data/json/items/comestibles/seed.json @@ -183,7 +183,7 @@ "name": { "str_sp": "lettuce seeds" }, "description": "Some lettuce seeds.", "flags": [ "PLANTABLE_SEED", "NUTRIENT_OVERRIDE", "INEDIBLE" ], - "seed_data": { "plant_name": "lettuce", "fruit": "lettuce", "byproducts": [ "withered" ], "grow": "85 days" } + "seed_data": { "plant_name": "lettuce", "fruit": "lettuce_head", "byproducts": [ "withered" ], "grow": "85 days" } }, { "type": "COMESTIBLE", @@ -194,7 +194,7 @@ "color": "light_gray", "description": "Some white cabbage seeds.", "flags": [ "PLANTABLE_SEED", "NUTRIENT_OVERRIDE", "INEDIBLE" ], - "seed_data": { "plant_name": "cabbage", "fruit": "cabbage", "byproducts": [ "withered" ], "grow": "85 days" } + "seed_data": { "plant_name": "cabbage", "fruit": "cabbage_head", "byproducts": [ "withered" ], "grow": "85 days" } }, { "type": "COMESTIBLE", @@ -419,11 +419,21 @@ "type": "COMESTIBLE", "id": "seed_cucumber", "copy-from": "seed", - "price": "50 cent", - "name": { "str_sp": "cucumber seeds" }, - "description": "Some cucumber seeds.", + "price": 50, + "name": { "str_sp": "salad cucumber seeds" }, + "description": "Some salad cucumber seeds.", + "flags": [ "PLANTABLE_SEED", "NUTRIENT_OVERRIDE", "INEDIBLE" ], + "seed_data": { "plant_name": "salad cucumber", "fruit": "cucumber", "byproducts": [ "withered" ], "grow": "60 days" } + }, + { + "type": "COMESTIBLE", + "id": "seed_gherkin", + "copy-from": "seed", + "price": 50, + "name": { "str_sp": "gherkin cucumber seeds" }, + "description": "Some gherkin cucumber seeds.", "flags": [ "PLANTABLE_SEED", "NUTRIENT_OVERRIDE", "INEDIBLE" ], - "seed_data": { "plant_name": "cucumber", "fruit": "cucumber", "byproducts": [ "withered" ], "grow": "60 days" } + "seed_data": { "plant_name": "gherkin cucumber", "fruit": "gherkin", "byproducts": [ "withered" ], "grow": "60 days" } }, { "type": "COMESTIBLE", diff --git a/data/json/items/comestibles/soup.json b/data/json/items/comestibles/soup.json index 0aecd0010f45e..ccc70498a8c4e 100644 --- a/data/json/items/comestibles/soup.json +++ b/data/json/items/comestibles/soup.json @@ -377,16 +377,16 @@ "id": "soup_tomato", "looks_like": "tomato_juice", "name": { "str_sp": "tomato soup" }, - "weight": "257 g", + "weight": "242 g", "color": "red", "spoils_in": "6 days 16 hours", "container": "can_food", "comestible_type": "DRINK", "symbol": "~", "quench": 15, - "calories": 90, - "description": "Thin red tomato soup. Not very filling, but it goes well with grilled cheese.", - "price": "4 USD", + "calories": 159, + "description": "Condensed tomato soup. Not very filling, but it goes well with grilled cheese.", + "price": "87 cent", "price_postapoc": "50 cent", "sealed": true, "material": [ "tomato" ], @@ -394,7 +394,7 @@ "charges": 1, "phase": "liquid", "flags": [ "EATEN_HOT", "USE_EAT_VERB" ], - "vitamins": [ [ "vitC", 10 ], [ "calcium", 1 ], [ "iron", 4 ] ], + "vitamins": [ [ "vitC", "31200 Ī¼g" ], [ "iron", "1400 Ī¼g" ], [ "calcium", "31500 Ī¼g" ] ], "fun": 2 }, { diff --git a/data/json/items/comestibles/veggy_dishes.json b/data/json/items/comestibles/veggy_dishes.json index 907fe2a25d5a1..3994785b4a7d9 100644 --- a/data/json/items/comestibles/veggy_dishes.json +++ b/data/json/items/comestibles/veggy_dishes.json @@ -951,15 +951,13 @@ "type": "COMESTIBLE", "id": "pickle", "name": { "str": "pickle" }, - "copy-from": "cucumber", + "copy-from": "gherkin", "color": "green", "spoils_in": "30 days", "quench": 5, - "description": "A pickled cucumber. Rather sour, but tastes good and lasts for a long time.", - "price": "2 USD 50 cent", - "price_postapoc": "50 cent", - "material": [ "veggy" ], - "volume": "250 ml", + "description": "A small pickled cucumber. Rather sour, but tastes good and lasts for a long time.", + "price": "13 cent", + "price_postapoc": "20 cent", "fun": 5 }, { diff --git a/data/json/items/generic/dining_kitchen.json b/data/json/items/generic/dining_kitchen.json index aeb192323a7c2..909cf69fe6ff9 100644 --- a/data/json/items/generic/dining_kitchen.json +++ b/data/json/items/generic/dining_kitchen.json @@ -575,7 +575,8 @@ "watertight": true, "rigid": true, "max_contains_volume": "750 ml", - "max_contains_weight": "1 kg" + "max_contains_weight": "1 kg", + "max_item_length": "239 mm" } ], "qualities": [ [ "CONTAIN", 1 ] ], diff --git a/data/json/obsoletion_and_migration_0.I/migration_items.json b/data/json/obsoletion_and_migration_0.I/migration_items.json index 03f6bc806fcd1..2d12351f74953 100644 --- a/data/json/obsoletion_and_migration_0.I/migration_items.json +++ b/data/json/obsoletion_and_migration_0.I/migration_items.json @@ -1350,6 +1350,11 @@ "replace": "con_mix_foldable", "reset_item_vars": true }, + { + "id": "raw_lentils", + "type": "MIGRATION", + "replace": "dry_lentils" + }, { "id": "uno", "type": "MIGRATION", diff --git a/data/json/recipes/food/canned.json b/data/json/recipes/food/canned.json index d5a13aee1cb16..fd7b74d4c2879 100644 --- a/data/json/recipes/food/canned.json +++ b/data/json/recipes/food/canned.json @@ -960,6 +960,8 @@ [ "zucchini", 2 ], [ "cucumber_cut", 2 ], [ "cucumber", 2 ], + [ "gherkin_cut", 2 ], + [ "gherkin", 2 ], [ "veggy_potatolike", 2, "LIST" ], [ "corn", 2 ], [ "onion", 2 ], @@ -1003,6 +1005,8 @@ [ "zucchini", 12 ], [ "cucumber_cut", 12 ], [ "cucumber", 12 ], + [ "gherkin_cut", 12 ], + [ "gherkin", 12 ], [ "veggy_potatolike", 12, "LIST" ], [ "corn", 12 ], [ "onion", 12 ], diff --git a/data/json/recipes/food/casseroles.json b/data/json/recipes/food/casseroles.json index 27572ef700459..bf6de49f54d3e 100644 --- a/data/json/recipes/food/casseroles.json +++ b/data/json/recipes/food/casseroles.json @@ -41,7 +41,7 @@ "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], "tools": [ [ [ "surface_heat", 6, "LIST" ] ], [ [ "casserole", -1 ] ] ], "components": [ - [ [ "spinach", 8 ] ], + [ [ "spinach", 30 ] ], [ [ "salt", 7 ], [ "seasoning_salt", 7 ], [ "soysauce", 4 ] ], [ [ "seasoning_italian", 7 ], diff --git a/data/json/recipes/food/seed.json b/data/json/recipes/food/seed.json index 42906e15f35d3..441366ca6b366 100644 --- a/data/json/recipes/food/seed.json +++ b/data/json/recipes/food/seed.json @@ -63,12 +63,20 @@ "components": [ [ [ "cucumber", 1 ] ] ], "charges": 2 }, + { + "result": "seed_gherkin", + "type": "recipe", + "copy-from": "seed_extraction_cutting", + "byproducts": [ [ "gherkin_cut", 1 ] ], + "components": [ [ [ "gherkin", 1 ] ] ], + "charges": 2 + }, { "result": "seed_eggplant", "id_suffix": "with_cutting_tool", "type": "recipe", "copy-from": "seed_extraction_cutting", - "byproducts": [ [ "eggplant_cut", 1 ] ], + "byproducts": [ [ "eggplant_cut", 2 ] ], "components": [ [ [ "eggplant", 1 ] ] ], "charges": 2 }, diff --git a/data/json/recipes/recipe_food.json b/data/json/recipes/recipe_food.json index b39b4195a16d1..fde8f74cf86f0 100644 --- a/data/json/recipes/recipe_food.json +++ b/data/json/recipes/recipe_food.json @@ -6347,7 +6347,7 @@ "skill_used": "cooking", "difficulty": 5, "time": "1 h 30 m", - "charges": 13, + "charges": 10, "batch_time_factors": [ 20, 1 ], "book_learn": { "adv_chemistry": { "skill_level": 6 }, @@ -6837,6 +6837,8 @@ [ "dahlia_baked", 1 ], [ "cucumber", 1 ], [ "cucumber_cut", 1 ], + [ "gherkin_cut", 1 ], + [ "gherkin", 1 ], [ "veggy_pickled", 1 ], [ "cooked_cattail_stalk", 1 ], [ "cooked_burdock_stalk", 1 ], @@ -6910,6 +6912,8 @@ [ "dahlia_baked", 1 ], [ "cucumber", 1 ], [ "cucumber_cut", 1 ], + [ "gherkin_cut", 1 ], + [ "gherkin", 1 ], [ "veggy_pickled", 1 ], [ "cooked_cattail_stalk", 1 ], [ "cooked_burdock_stalk", 1 ], @@ -7746,7 +7750,7 @@ [ [ "vinegar", 1 ] ], [ [ "saline", 1 ], [ "salt", 2 ] ], [ [ "jar_glass_sealed", 1 ] ], - [ [ "cucumber", 1 ], [ "cucumber_cut", 1 ] ] + [ [ "gherkin", 1 ], [ "gherkin_cut", 1 ] ] ] }, { @@ -9266,6 +9270,7 @@ [ "seed_carrot", 3 ], [ "seed_chili_pepper", 3 ], [ "seed_cucumber", 3 ], + [ "seed_gherkin", 3 ], [ "seed_weed", 3 ], [ "seed_thyme", 3 ], [ "seed_canola", 1 ], @@ -10035,7 +10040,7 @@ "qualities": [ { "id": "BOIL", "level": 1 } ], "tools": [ [ [ "water_boiling_heat", 2, "LIST" ], [ "food_processor", 20 ] ] ], "components": [ - [ [ "tomato", 5 ] ], + [ [ "tomato", 10 ] ], [ [ "water", 1 ], [ "water_clean", 1 ] ], [ [ "sugar", 1 ], [ "artificial_sweetener", 1 ] ], [ [ "salt", 1 ], [ "seasoning_salt", 1 ] ] @@ -10266,7 +10271,7 @@ "tools": [ [ [ "surface_heat", 44, "LIST" ] ] ], "qualities": [ { "id": "COOK", "level": 3 }, { "id": "CUT", "level": 2 } ], "components": [ - [ [ "eggplant", 2 ], [ "eggplant_cut", 2 ] ], + [ [ "eggplant_cut", 2 ] ], [ [ "garlic_clove", 4 ], [ "rehydrated_garlic", 4 ], [ "wild_garlic", 4 ], [ "garlic_powder", 18 ] ], [ [ "salt", 1 ], [ "seasoning_salt", 1 ] ], [ [ "seasoning_mild", 1, "LIST" ], [ "chilly-p", 1 ] ], @@ -10293,7 +10298,7 @@ "tools": [ [ [ "surface_heat", 44, "LIST" ], [ "food_processor", 20 ] ] ], "qualities": [ { "id": "COOK", "level": 3 } ], "components": [ - [ [ "eggplant", 2 ], [ "eggplant_cut", 2 ] ], + [ [ "eggplant_cut", 2 ] ], [ [ "garlic_clove", 4 ], [ "rehydrated_garlic", 4 ], [ "wild_garlic", 4 ], [ "garlic_powder", 18 ] ], [ [ "salt", 1 ], [ "seasoning_salt", 1 ] ], [ [ "seasoning_mild", 1, "LIST" ], [ "chilly-p", 1 ] ], diff --git a/data/json/requirements/cooking_components.json b/data/json/requirements/cooking_components.json index c2b3774bd95b8..e17bc1382f411 100644 --- a/data/json/requirements/cooking_components.json +++ b/data/json/requirements/cooking_components.json @@ -1161,6 +1161,8 @@ [ "corn_kernels", 1 ], [ "cucumber", 1 ], [ "cucumber_cut", 1 ], + [ "gherkin_cut", 1 ], + [ "gherkin", 1 ], [ "lettuce", 1 ], [ "onion", 1 ], [ "plant_sac", 1 ], @@ -1179,7 +1181,6 @@ [ "veggy_wild", 1 ], [ "zucchini", 1 ], [ "zucchini_cut", 1 ], - [ "eggplant", 1 ], [ "eggplant_cut", 1 ], [ "carrot_wild", 1 ], [ "wild_garlic", 2 ], diff --git a/data/json/uncraft/comestibles/vegetable.json b/data/json/uncraft/comestibles/vegetable.json index cef8174388b7d..8341d7ba170bf 100644 --- a/data/json/uncraft/comestibles/vegetable.json +++ b/data/json/uncraft/comestibles/vegetable.json @@ -31,6 +31,14 @@ "qualities": [ { "id": "CUT", "level": 1 } ], "components": [ [ [ "seed_cucumber", 2 ] ], [ [ "cucumber_cut", 1 ] ] ] }, + { + "result": "gherkin", + "type": "uncraft", + "activity_level": "LIGHT_EXERCISE", + "time": "30 s", + "qualities": [ { "id": "CUT", "level": 1 } ], + "components": [ [ [ "seed_gherkin", 2 ] ], [ [ "gherkin_cut", 1 ] ] ] + }, { "result": "chili_pepper", "type": "uncraft", @@ -68,7 +76,7 @@ "activity_level": "NO_EXERCISE", "time": "30 s", "qualities": [ { "id": "CUT", "level": 1 } ], - "components": [ [ [ "seed_eggplant", 2 ], [ "eggplant_cut", 1 ] ] ] + "components": [ [ [ "seed_eggplant", 2 ], [ "eggplant_cut", 2 ] ] ] }, { "result": "cattlefodder_medium", @@ -83,5 +91,21 @@ "activity_level": "NO_EXERCISE", "time": "30 s", "components": [ [ [ "cattlefodder", 36 ] ] ] + }, + { + "result": "lettuce_head", + "type": "uncraft", + "activity_level": "NO_EXERCISE", + "time": "30 s", + "qualities": [ { "id": "CUT", "level": 1 } ], + "components": [ [ [ "lettuce", 7 ] ] ] + }, + { + "result": "cabbage_head", + "type": "uncraft", + "activity_level": "NO_EXERCISE", + "time": "30 s", + "qualities": [ { "id": "CUT", "level": 1 } ], + "components": [ [ [ "cabbage", 13 ] ] ] } ] diff --git a/data/mods/TEST_DATA/known_bad_density.json b/data/mods/TEST_DATA/known_bad_density.json index 8628b368ca73c..0b80921f012c9 100644 --- a/data/mods/TEST_DATA/known_bad_density.json +++ b/data/mods/TEST_DATA/known_bad_density.json @@ -150,7 +150,6 @@ "dandelion_tea", "scots_cookbook", "primitive_hammer", - "bamboo_cooked", "throwing_stick", "cookbook_sushi", "willowbark", @@ -187,7 +186,6 @@ "fish_bait", "xl_k_gambeson_loose", "mre_accessory", - "raw_bamboo", "manual_bashing", "nic_gum", "saline", diff --git a/tests/iteminfo_test.cpp b/tests/iteminfo_test.cpp index 4d9a54927f8db..fe7b907476b38 100644 --- a/tests/iteminfo_test.cpp +++ b/tests/iteminfo_test.cpp @@ -1922,7 +1922,7 @@ TEST_CASE( "nutrients_in_food", "[iteminfo][food]" ) "--\n" "Nutrition will vary with chosen ingredients.\n" "Vitamins (RDA): 63-354 mg Calcium (6-35%), 0-23 mg Iron (0-128%)," - " and 0-49 mg Vitamin C (0-54%)\n" ); + " and 0-45 mg Vitamin C (0-50%)\n" ); } } From 5b6812663727c0b95c3813b34a5abde9a6f3dfc3 Mon Sep 17 00:00:00 2001 From: KyunKitsune Date: Tue, 7 May 2024 21:20:12 -0400 Subject: [PATCH 085/104] Update coats.json (Coyote Combat Jacket) Changed 'hansom' to 'handsome' to correct typo. --- data/json/items/armor/coats.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/json/items/armor/coats.json b/data/json/items/armor/coats.json index dd5aece7701d3..b4c965620238d 100644 --- a/data/json/items/armor/coats.json +++ b/data/json/items/armor/coats.json @@ -1054,7 +1054,7 @@ { "id": "m65_coyote", "name": { "str": "coyote combat jacket" }, - "description": "Dyed in a solid shade of rugged, earthen brown with a brass main zip and press-studs, this is a relatively hansom coat, so far as reproduction military equipment goes. Obviously, the would-be soldier, prepper, and general wearer would most appreciate its utility in going undercover among the insurgent coyote population.", + "description": "Dyed in a solid shade of rugged, earthen brown with a brass main zip and press-studs, this is a relatively handsome coat, so far as reproduction military equipment goes. Obviously, the would-be soldier, prepper, and general wearer would most appreciate its utility in going undercover among the insurgent coyote population.", "color": "brown", "weight": 20, "append": true From 7de3ac2912ab92425d35cc7b4c506a68b2b7c5cf Mon Sep 17 00:00:00 2001 From: irwiss Date: Tue, 7 May 2024 22:06:44 +0300 Subject: [PATCH 086/104] Add fake part obstacles test --- data/mods/TEST_DATA/vehicle.json | 13 +++++++++++++ tests/vehicle_fake_part_test.cpp | 25 +++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/data/mods/TEST_DATA/vehicle.json b/data/mods/TEST_DATA/vehicle.json index 7c40b68f2a0db..bb35d3b72a50f 100644 --- a/data/mods/TEST_DATA/vehicle.json +++ b/data/mods/TEST_DATA/vehicle.json @@ -307,6 +307,19 @@ { "x": 0, "y": -1, "parts": [ "frame#vertical", "seat", "large_storage_battery" ] } ] }, + { + "id": "obstacle_test", + "type": "vehicle", + "name": "TEST obstacle boards", + "blueprint": [ "===" ], + "parts": [ + { "x": -2, "y": 0, "parts": [ "frame", "board" ] }, + { "x": -1, "y": 0, "parts": [ "frame", "board" ] }, + { "x": 0, "y": 0, "parts": [ "frame", "board", "omnicam" ] }, + { "x": 1, "y": 0, "parts": [ "frame", "board" ] }, + { "x": 2, "y": 0, "parts": [ "frame", "board" ] } + ] + }, { "id": "scooter_test", "type": "vehicle", diff --git a/tests/vehicle_fake_part_test.cpp b/tests/vehicle_fake_part_test.cpp index b71ffaf2b0f70..74fc761d135d6 100644 --- a/tests/vehicle_fake_part_test.cpp +++ b/tests/vehicle_fake_part_test.cpp @@ -20,6 +20,7 @@ #include "veh_type.h" static const vproto_id vehicle_prototype_bicycle( "bicycle" ); +static const vproto_id vehicle_prototype_obstacle_test( "obstacle_test" ); static const vproto_id vehicle_prototype_schoolbus( "schoolbus" ); static const vproto_id vehicle_prototype_suv( "suv" ); static const vproto_id vehicle_prototype_test_van( "test_van" ); @@ -322,6 +323,30 @@ TEST_CASE( "ensure_vehicle_with_no_obstacles_has_no_fake_parts", "[vehicle] [veh } } +TEST_CASE( "vehicle_with_fake_obstacle_parts_block_movement", "[vehicle][vehicle_fake]" ) +{ + clear_avatar(); + really_clear_map(); + map &here = get_map(); + Character &you = get_player_character(); + const tripoint test_origin( 30, 30, 0 ); + vehicle *veh = here.add_vehicle( vehicle_prototype_obstacle_test, + test_origin, 315_degrees, 100, 0 ); + REQUIRE( veh != nullptr ); + veh->refresh(); + here.set_seen_cache_dirty( 0 ); + here.build_map_cache( 0 ); + validate_part_count( *veh, 0, 315_degrees, 11, 6, 5 ); + std::vector route = here.route( + tripoint_bub_ms( test_origin - point( 2, 0 ) ), + tripoint_bub_ms( test_origin + point( 2, 0 ) ), + you.get_pathfinding_settings(), + {} ); + REQUIRE( !route.empty() ); + CAPTURE( route ); + REQUIRE( route.size() == 7 ); +} + TEST_CASE( "fake_parts_are_opaque", "[vehicle][vehicle_fake]" ) { really_clear_map(); From 177a48234a742a1cbbd62992f36fad21fe1400ce Mon Sep 17 00:00:00 2001 From: irwiss Date: Wed, 8 May 2024 04:38:47 +0300 Subject: [PATCH 087/104] Narrow down curtain criteria for fake parts --- src/vehicle.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vehicle.cpp b/src/vehicle.cpp index ac6dbed263a0d..88df2f69385bc 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -6450,7 +6450,7 @@ void vehicle::refresh( const bool remove_fakes ) } // add fake curtains so vision is correctly blocked for( const std::pair > &rp : relative_parts ) { - add_fake_part( rp.first, "OPAQUE" ); + add_fake_part( rp.first, "CURTAIN" ); } } else { // Always repopulate fake parts in relative_parts cache since we cleared it. From cc59f3c5a44ddfde120d8c41d0f70d69293d3d69 Mon Sep 17 00:00:00 2001 From: irwiss Date: Wed, 8 May 2024 04:38:59 +0300 Subject: [PATCH 088/104] Pass through include_fake for part_with_feature --- src/vehicle.cpp | 25 ++++++++++++++----------- src/vehicle.h | 11 ++++++++--- src/vpart_position.h | 6 ++++-- 3 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 88df2f69385bc..e587151dec4f1 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -2603,7 +2603,7 @@ std::vector vehicle::parts_at_relative( const point &dp, const bool use_cac std::optional vpart_position::obstacle_at_part() const { - std::optional part = part_with_feature( VPFLAG_OBSTACLE, true ); + std::optional part = part_with_feature( VPFLAG_OBSTACLE, true, true ); if( !part ) { return std::nullopt; // No obstacle here } @@ -2663,9 +2663,9 @@ std::optional vpart_position::cargo() const } std::optional vpart_position::part_with_feature( const std::string &f, - const bool unbroken ) const + bool unbroken, bool include_fake ) const { - const int i = vehicle().part_with_feature( mount(), f, unbroken ); + const int i = vehicle().part_with_feature( mount(), f, unbroken, include_fake ); if( i < 0 ) { return std::nullopt; } @@ -2673,9 +2673,9 @@ std::optional vpart_position::part_with_feature( const std::str } std::optional vpart_position::part_with_feature( const vpart_bitflags f, - const bool unbroken ) const + bool unbroken, bool include_fake ) const { - const int i = vehicle().part_with_feature( part_index(), f, unbroken ); + const int i = vehicle().part_with_feature( part_index(), f, unbroken, include_fake ); if( i < 0 ) { return std::nullopt; } @@ -2756,13 +2756,14 @@ std::string optional_vpart_position::extended_description() const return desc; } -int vehicle::part_with_feature( int part, vpart_bitflags flag, bool unbroken ) const +int vehicle::part_with_feature( int part, vpart_bitflags flag, bool unbroken, + bool include_fake ) const { const vehicle_part &vp = this->part( part ); if( vp.info().has_flag( flag ) && !( unbroken && vp.is_broken() ) ) { return part; } - for( const int p : parts_at_relative( vp.mount, /* use_cache = */ true ) ) { + for( const int p : parts_at_relative( vp.mount, /* use_cache = */ true, include_fake ) ) { const vehicle_part &vp_here = this->part( p ); if( vp_here.info().has_flag( flag ) && !( unbroken && vp_here.is_broken() ) ) { return p; @@ -2771,9 +2772,10 @@ int vehicle::part_with_feature( int part, vpart_bitflags flag, bool unbroken ) c return -1; } -int vehicle::part_with_feature( const point &pt, vpart_bitflags f, bool unbroken ) const +int vehicle::part_with_feature( const point &pt, vpart_bitflags f, bool unbroken, + bool include_fake ) const { - for( const int p : parts_at_relative( pt, /* use_cache = */ true ) ) { + for( const int p : parts_at_relative( pt, /* use_cache = */ true, include_fake ) ) { const vehicle_part &vp_here = this->part( p ); if( vp_here.info().has_flag( f ) && !( unbroken && vp_here.is_broken() ) ) { return p; @@ -2782,9 +2784,10 @@ int vehicle::part_with_feature( const point &pt, vpart_bitflags f, bool unbroken return -1; } -int vehicle::part_with_feature( const point &pt, const std::string &flag, bool unbroken ) const +int vehicle::part_with_feature( const point &pt, const std::string &flag, bool unbroken, + bool include_fake ) const { - for( const int p : parts_at_relative( pt, /* use_cache = */ false ) ) { + for( const int p : parts_at_relative( pt, /* use_cache = */ false, include_fake ) ) { const vehicle_part &vp_here = this->part( p ); if( vp_here.info().has_flag( flag ) && !( unbroken && vp_here.is_broken() ) ) { return p; diff --git a/src/vehicle.h b/src/vehicle.h index 5b1ed7c793e73..bfc19867efb65 100644 --- a/src/vehicle.h +++ b/src/vehicle.h @@ -1178,27 +1178,32 @@ class vehicle * @param pt only returns parts from this mount point * @param f required flag in part's vpart_info flags collection * @param unbroken if true also requires the part to be !is_broken + * @param include_fake if true fake parts are included * @returns part index or -1 */ - int part_with_feature( const point &pt, const std::string &f, bool unbroken ) const; + int part_with_feature( const point &pt, const std::string &f, bool unbroken, + bool include_fake = false ) const; /** * Returns part index at mount point \p pt which has given \p f flag * @note uses relative_parts cache * @param pt only returns parts from this mount point * @param f required flag in part's vpart_info flags collection * @param unbroken if true also requires the part to be !is_broken() + * @param include_fake if true fake parts are included * @returns part index or -1 */ - int part_with_feature( const point &pt, vpart_bitflags f, bool unbroken ) const; + int part_with_feature( const point &pt, vpart_bitflags f, bool unbroken, + bool include_fake = false ) const; /** * Returns \p p or part index at mount point \p pt which has given \p f flag * @note uses relative_parts cache * @param p index of part to start searching from * @param f required flag in part's vpart_info flags collection * @param unbroken if true also requires the part to be !is_broken() + * @param include_fake if true fake parts are included * @returns part index or -1 */ - int part_with_feature( int p, vpart_bitflags f, bool unbroken ) const; + int part_with_feature( int p, vpart_bitflags f, bool unbroken, bool include_fake = false ) const; /** * Returns index of part at mount point \p pt which has given \p f flag * and is_available(), or -1 if no such part or it's not is_available() diff --git a/src/vpart_position.h b/src/vpart_position.h index 66748f3428de0..47efb5466c1d6 100644 --- a/src/vpart_position.h +++ b/src/vpart_position.h @@ -70,9 +70,11 @@ class vpart_position // @return reference to unbroken CARGO part at this position or std::nullopt std::optional cargo() const; /// @see vehicle::part_with_feature - std::optional part_with_feature( const std::string &f, bool unbroken ) const; + std::optional part_with_feature( const std::string &f, bool unbroken, + bool include_fake = false ) const; /// @see vehicle::part_with_feature - std::optional part_with_feature( vpart_bitflags f, bool unbroken ) const; + std::optional part_with_feature( vpart_bitflags f, bool unbroken, + bool include_fake = false ) const; /// @see vehicle::part_with_feature std::optional avail_part_with_feature( const std::string &f ) const; /// @see vehicle::part_with_feature From d5427bee791d73eab2f261680e2262ad201435bd Mon Sep 17 00:00:00 2001 From: bateau-de-coal <64527852+bateau-de-coal@users.noreply.github.com> Date: Wed, 8 May 2024 12:23:20 +0800 Subject: [PATCH 089/104] change hole to spiked pit --- data/json/mapgen/hells_raiders/bandit_work_camp.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/json/mapgen/hells_raiders/bandit_work_camp.json b/data/json/mapgen/hells_raiders/bandit_work_camp.json index c804642cda433..bb6957006f3c5 100644 --- a/data/json/mapgen/hells_raiders/bandit_work_camp.json +++ b/data/json/mapgen/hells_raiders/bandit_work_camp.json @@ -97,7 +97,7 @@ "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||" ], "palettes": [ "farm" ], - "terrain": { "|": "t_hole", "^": "t_palisade", "W": "t_embrasure_wood", "M": "t_palisade_gate", "O": "t_palisade_pulley" }, + "terrain": { "|": "t_pit_spiked", "^": "t_palisade", "W": "t_embrasure_wood", "M": "t_palisade_gate", "O": "t_palisade_pulley" }, "furniture": { "5": "f_utility_shelf", "*": "f_utility_shelf", From f2d17607a88d0f55826ea46dee49892dfc9f311d Mon Sep 17 00:00:00 2001 From: Anton Simakov <67688115+GuardianDll@users.noreply.github.com> Date: Wed, 8 May 2024 15:50:58 +0200 Subject: [PATCH 090/104] fix arithmetical error crash (#73566) * fix arithmetical error crash * Apply suggestions from code review Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Apply suggestions from code review --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- src/display.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/display.cpp b/src/display.cpp index 488f8eacd8543..8905a8871c7cc 100644 --- a/src/display.cpp +++ b/src/display.cpp @@ -986,7 +986,14 @@ std::pair display::move_count_and_mode_text_color( const // Weight carried, relative to capacity, in %, like "90%". std::pair display::carry_weight_text_color( const avatar &u ) { - int carry_wt = ( 100 * u.weight_carried() ) / u.weight_capacity(); + int carry_wt; + + if( u.weight_capacity() > 0_gram ) { + carry_wt = ( 100 * u.weight_carried() ) / u.weight_capacity(); + } else { + carry_wt = 100; + } + std::string weight_text = string_format( "%d%%", carry_wt ); nc_color weight_color = c_green; From 0278bea4783704dcaed6092bacc8d91cbc285ae0 Mon Sep 17 00:00:00 2001 From: Anton Simakov <67688115+GuardianDll@users.noreply.github.com> Date: Wed, 8 May 2024 15:51:30 +0200 Subject: [PATCH 091/104] fix summon_undead_swarm using summon_undead spell level as check --- data/mods/Magiclysm/Spells/animist.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/mods/Magiclysm/Spells/animist.json b/data/mods/Magiclysm/Spells/animist.json index 900a5e8bed1bf..6bb7b45cfe6e9 100644 --- a/data/mods/Magiclysm/Spells/animist.json +++ b/data/mods/Magiclysm/Spells/animist.json @@ -240,7 +240,7 @@ "type": "effect_on_condition", "id": "EOC_SUMMON_ZOMBIE_SWARM", "effect": { - "switch": { "math": [ "u_spell_level('summon_undead')" ] }, + "switch": { "math": [ "u_spell_level('summon_undead_swarm')" ] }, "cases": [ { "case": 0, "effect": { "u_cast_spell": { "id": "summon_zombie_dog" } } }, { "case": 5, "effect": { "u_cast_spell": { "id": "summon_dog_skeleton" } } }, From 386a00c3e40ae35f6647c40bfac979f58a54da14 Mon Sep 17 00:00:00 2001 From: Xygen Date: Wed, 8 May 2024 23:16:57 +0900 Subject: [PATCH 092/104] Fix meat ingredient in several recipes (#73439) * ugh * frenchy? * pemmican, protein powder, dehydration * burgers pasta etc * lintylint * smoking, dog and cat food * the rest * Update data/json/recipes/recipe_food.json Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * fix load errors --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- data/json/items/comestibles/meat_dishes.json | 2 +- data/json/items/comestibles/soup.json | 2 +- data/json/recipes/food/canned.json | 116 ++++++++++++++++-- data/json/recipes/food/dry.json | 36 +++++- data/json/recipes/food/meat_dishes.json | 2 +- data/json/recipes/food/pasta.json | 34 ++--- data/json/recipes/other/other.json | 1 + data/json/recipes/recipe_food.json | 67 ++++++---- .../json/requirements/cooking_components.json | 52 ++++---- 9 files changed, 225 insertions(+), 87 deletions(-) diff --git a/data/json/items/comestibles/meat_dishes.json b/data/json/items/comestibles/meat_dishes.json index 6a328b34ab1f4..0dcbcd5092a32 100644 --- a/data/json/items/comestibles/meat_dishes.json +++ b/data/json/items/comestibles/meat_dishes.json @@ -1561,7 +1561,7 @@ "copy-from": "dry_meat", "color": "white", "description": "Dehydrated flakes of bird meat. With proper storage, this dried food will remain edible for an incredibly long time.", - "calories": 240 + "calories": 220 }, { "type": "COMESTIBLE", diff --git a/data/json/items/comestibles/soup.json b/data/json/items/comestibles/soup.json index ccc70498a8c4e..d45ddefb6211d 100644 --- a/data/json/items/comestibles/soup.json +++ b/data/json/items/comestibles/soup.json @@ -574,7 +574,7 @@ "symbol": "~", "quench": 8, "calories": 580, - "description": "Frenchy chicken stew braised with red wine.", + "description": "French chicken stew braised with red wine.", "price": 500, "price_postapoc": 100, "material": [ "flesh", "veggy" ], diff --git a/data/json/recipes/food/canned.json b/data/json/recipes/food/canned.json index fd7b74d4c2879..a250120cdfc98 100644 --- a/data/json/recipes/food/canned.json +++ b/data/json/recipes/food/canned.json @@ -41,7 +41,7 @@ "components": [ [ [ "water_clean", 1 ] ], [ [ "jar_glass_sealed", 1 ] ], - [ [ "meat_red_raw", 1, "LIST" ], [ "fish", 1 ], [ "lobster", 1 ] ], + [ [ "meat_nofish", 1, "LIST" ], [ "fish", 1 ], [ "lobster", 1 ] ], [ [ "veggy_green", 1, "LIST" ] ] ] }, @@ -66,7 +66,7 @@ "components": [ [ [ "water_clean", 6 ] ], [ [ "jar_3l_glass_sealed", 1 ] ], - [ [ "meat_red_raw", 6, "LIST" ], [ "fish", 6 ], [ "lobster", 6 ] ], + [ [ "meat_nofish", 6, "LIST" ], [ "fish", 6 ], [ "lobster", 6 ] ], [ [ "veggy_green", 6, "LIST" ] ] ] }, @@ -91,7 +91,7 @@ "components": [ [ [ "water_clean", 1 ] ], [ [ "jar_glass_sealed", 1 ] ], - [ [ "meat_red_raw", 4, "LIST" ], [ "fish", 4 ], [ "fish", 4 ] ] + [ [ "meat_nofish", 4, "LIST" ], [ "fish", 4 ], [ "fish", 4 ] ] ] }, { @@ -115,7 +115,7 @@ "components": [ [ [ "water_clean", 6 ] ], [ [ "jar_3l_glass_sealed", 1 ] ], - [ [ "meat_red_raw", 24, "LIST" ], [ "fish", 24 ], [ "lobster", 24 ] ] + [ [ "meat_nofish", 24, "LIST" ], [ "fish", 24 ], [ "lobster", 24 ] ] ] }, { @@ -238,6 +238,26 @@ "//1": "pressure canning is measured in 0.5 liter quantities, so 1u of canning_high_heat.", "components": [ [ [ "water_clean", 1 ] ], [ [ "jar_glass_sealed", 1 ] ], [ [ "mushroom", 4 ], [ "veggy_any_uncooked", 2, "LIST" ] ] ] }, + { + "type": "recipe", + "activity_level": "NO_EXERCISE", + "result": "can_chicken", + "id_suffix": "jarred", + "byproducts": [ [ "water_clean", 2 ] ], + "container": "jar_glass_sealed", + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_MEAT", + "skill_used": "cooking", + "difficulty": 4, + "time": "30 m", + "book_learn": [ [ "cookbook", 4 ], [ "manual_canning", 3 ] ], + "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_preservation" }, { "proficiency": "prof_food_canning" } ], + "batch_time_factors": [ 83, 5 ], + "charges": 2, + "using": [ [ "canning_high_heat", 1, "LIST" ] ], + "//1": "pressure canning is measured in 0.5 liter quantities, so 1u of canning_high_heat.", + "components": [ [ [ "water_clean", 1 ] ], [ [ "jar_glass_sealed", 1 ] ], [ [ "poultry_raw_any", 4, "LIST" ] ] ] + }, { "type": "recipe", "activity_level": "NO_EXERCISE", @@ -510,6 +530,26 @@ [ [ "beans_cooked", 12 ], [ "dry_beans", 12 ], [ "raw_beans", 12 ] ] ] }, + { + "type": "recipe", + "activity_level": "NO_EXERCISE", + "result": "can_chicken", + "id_suffix": "jarred_3l", + "byproducts": [ [ "water_clean", 12 ] ], + "container": "jar_3l_glass_sealed", + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_MEAT", + "skill_used": "cooking", + "difficulty": 4, + "time": "40 m", + "charges": 12, + "book_learn": [ [ "cookbook", 4 ], [ "manual_canning", 3 ] ], + "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_preservation" }, { "proficiency": "prof_food_canning" } ], + "batch_time_factors": [ 83, 5 ], + "using": [ [ "canning_high_heat", 6, "LIST" ] ], + "//1": "pressure canning is measured in 0.5 liter quantities, so 6u of canning_high_heat.", + "components": [ [ [ "water_clean", 6 ] ], [ [ "jar_3l_glass_sealed", 1 ] ], [ [ "poultry_raw_any", 24, "LIST" ] ] ] + }, { "type": "recipe", "activity_level": "NO_EXERCISE", @@ -1522,7 +1562,7 @@ "batch_time_factors": [ 83, 5 ], "components": [ [ [ "water_clean", 1 ] ], - [ [ "meat_red_raw", 1, "LIST" ], [ "fish", 1 ], [ "lobster", 1 ] ], + [ [ "meat_nofish", 1, "LIST" ], [ "fish", 1 ], [ "lobster", 1 ] ], [ [ "veggy_green", 1, "LIST" ] ] ], "using": [ [ "canning_metal", 2, "LIST" ], [ "tincan_medium", 1 ] ], @@ -1546,7 +1586,7 @@ "batch_time_factors": [ 83, 5 ], "components": [ [ [ "water_clean", 1 ] ], - [ [ "meat_red_raw", 6, "LIST" ], [ "fish", 6 ], [ "lobster", 6 ] ], + [ [ "meat_nofish", 6, "LIST" ], [ "fish", 6 ], [ "lobster", 6 ] ], [ [ "veggy_green", 6, "LIST" ] ] ], "using": [ [ "canning_metal", 12, "LIST" ], [ "tincan_large", 1 ] ], @@ -1567,7 +1607,7 @@ "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_preservation" }, { "proficiency": "prof_food_canning" } ], "contained": true, "batch_time_factors": [ 83, 5 ], - "components": [ [ [ "water_clean", 1 ] ], [ [ "meat_red_raw", 2, "LIST" ], [ "fish", 2 ], [ "lobster", 2 ] ] ], + "components": [ [ [ "water_clean", 1 ] ], [ [ "meat_nofish", 2, "LIST" ], [ "fish", 2 ], [ "lobster", 2 ] ] ], "using": [ [ "canning_metal", 1, "LIST" ], [ "tincan_small", 1 ] ], "//1": "tincan canning is measured in 0.25 liter quantities, so 1u of canning_metal.", "byproducts": [ [ "water_clean", 1 ] ] @@ -1587,7 +1627,7 @@ "container": "can_medium", "charges": 2, "batch_time_factors": [ 83, 5 ], - "components": [ [ [ "water_clean", 1 ] ], [ [ "meat_red_raw", 4, "LIST" ], [ "fish", 4 ], [ "lobster", 4 ] ] ], + "components": [ [ [ "water_clean", 1 ] ], [ [ "meat_nofish", 4, "LIST" ], [ "fish", 4 ], [ "lobster", 4 ] ] ], "using": [ [ "canning_metal", 2, "LIST" ], [ "tincan_medium", 1 ] ], "//1": "tincan canning is measured in 0.25 liter quantities, so 2u of canning_metal.", "byproducts": [ [ "water_clean", 1 ] ] @@ -1608,7 +1648,7 @@ "charges": 12, "batch_time_factors": [ 83, 5 ], "tools": [ [ [ "surface_heat", 60, "LIST" ] ] ], - "components": [ [ [ "water_clean", 1 ] ], [ [ "meat_red_raw", 24, "LIST" ], [ "fish", 24 ], [ "lobster", 24 ] ] ], + "components": [ [ [ "water_clean", 1 ] ], [ [ "meat_nofish", 24, "LIST" ], [ "fish", 24 ], [ "lobster", 24 ] ] ], "using": [ [ "canning_metal", 12, "LIST" ], [ "tincan_large", 1 ] ], "//1": "tincan canning is measured in 0.25 liter quantities, so 12u of canning_metal.", "byproducts": [ [ "water_clean", 6 ] ] @@ -2061,6 +2101,64 @@ "//1": "tincan canning is measured in 0.25 liter quantities, so 12u of canning_metal.", "byproducts": [ [ "water_clean", 6 ] ] }, + { + "type": "recipe", + "activity_level": "NO_EXERCISE", + "result": "can_chicken", + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_MEAT", + "skill_used": "cooking", + "difficulty": 5, + "time": "20 m", + "book_learn": [ [ "manual_sealing", 4 ] ], + "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_preservation" }, { "proficiency": "prof_food_canning" } ], + "contained": true, + "batch_time_factors": [ 83, 5 ], + "components": [ [ [ "water_clean", 1 ] ], [ [ "poultry_raw_any", 2, "LIST" ] ] ], + "using": [ [ "canning_metal", 1, "LIST" ], [ "tincan_small", 1 ] ], + "//1": "tincan canning is measured in 0.25 liter quantities, so 1u of canning_metal.", + "byproducts": [ [ "water_clean", 1 ] ] + }, + { + "type": "recipe", + "activity_level": "NO_EXERCISE", + "result": "can_chicken", + "id_suffix": "canned_medium", + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_MEAT", + "skill_used": "cooking", + "difficulty": 5, + "time": "24 m", + "book_learn": [ [ "manual_sealing", 4 ] ], + "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_preservation" }, { "proficiency": "prof_food_canning" } ], + "container": "can_medium", + "charges": 2, + "batch_time_factors": [ 83, 5 ], + "components": [ [ [ "water_clean", 1 ] ], [ [ "poultry_raw_any", 4, "LIST" ] ] ], + "using": [ [ "canning_metal", 2, "LIST" ], [ "tincan_medium", 1 ] ], + "//1": "tincan canning is measured in 0.25 liter quantities, so 2u of canning_metal.", + "byproducts": [ [ "water_clean", 1 ] ] + }, + { + "type": "recipe", + "activity_level": "NO_EXERCISE", + "result": "can_chicken", + "id_suffix": "canned_big", + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_MEAT", + "skill_used": "cooking", + "difficulty": 5, + "time": "48 m", + "book_learn": [ [ "manual_sealing", 4 ] ], + "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_preservation" }, { "proficiency": "prof_food_canning" } ], + "container": "can_food_big", + "charges": 12, + "batch_time_factors": [ 83, 5 ], + "components": [ [ [ "water_clean", 1 ] ], [ [ "poultry_raw_any", 24, "LIST" ] ] ], + "using": [ [ "canning_metal", 12, "LIST" ], [ "tincan_large", 1 ] ], + "//1": "tincan canning is measured in 0.25 liter quantities, so 12u of canning_metal.", + "byproducts": [ [ "water_clean", 6 ] ] + }, { "type": "recipe", "activity_level": "NO_EXERCISE", diff --git a/data/json/recipes/food/dry.json b/data/json/recipes/food/dry.json index 9a7990a83b931..6c3b750e7ff96 100644 --- a/data/json/recipes/food/dry.json +++ b/data/json/recipes/food/dry.json @@ -726,7 +726,7 @@ "autolearn": true, "qualities": [ { "id": "CHEM", "level": 2 }, { "id": "FINE_GRIND", "level": 1 } ], "tools": [ [ [ "surface_heat", 25, "LIST" ] ] ], - "components": [ [ [ "dry_meat", 1 ], [ "dry_fish", 2 ], [ "dry_lobster", 2 ] ] ] + "components": [ [ [ "dry_meat", 1 ], [ "dry_fish", 2 ], [ "dry_lobster", 2 ], [ "dry_poultry", 2 ] ] ] }, { "result": "protein_powder", @@ -743,7 +743,7 @@ "autolearn": true, "qualities": [ { "id": "CHEM", "level": 2 } ], "tools": [ [ [ "food_processor", 20 ] ], [ [ "surface_heat", 10, "LIST" ] ] ], - "components": [ [ [ "dry_meat", 1 ], [ "dry_fish", 2 ], [ "dry_lobster", 2 ] ] ] + "components": [ [ [ "dry_meat", 1 ], [ "dry_fish", 2 ], [ "dry_lobster", 2 ], [ "dry_poultry", 2 ] ] ] }, { "type": "recipe", @@ -810,5 +810,37 @@ "tools": [ [ [ "dehydrating_heat", 3, "LIST" ] ], [ [ "surface_heat", 3, "LIST" ] ] ], "//": "30 g acorns", "components": [ [ [ "acorns_blanched", 1 ] ] ] + }, + { + "type": "recipe", + "activity_level": "NO_EXERCISE", + "result": "dry_poultry", + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_DRY", + "delete_flags": [ "BAD_TASTE" ], + "skill_used": "cooking", + "difficulty": 2, + "time": "12 m", + "autolearn": true, + "batch_time_factors": [ 67, 5 ], + "tools": [ [ [ "dehydrating_heat", 10, "LIST" ] ] ], + "//": "100g of stuff", + "components": [ [ [ "poultry_raw_any", 1, "LIST" ] ] ] + }, + { + "type": "recipe", + "activity_level": "NO_EXERCISE", + "result": "dry_poultry", + "category": "CC_FOOD", + "id_suffix": "frozen_ingredients", + "subcategory": "CSC_FOOD_DRY", + "skill_used": "cooking", + "difficulty": 2, + "time": "18 m", + "autolearn": true, + "batch_time_factors": [ 67, 5 ], + "tools": [ [ [ "dehydrating_heat", 10, "LIST" ] ], [ [ "surface_heat", 7, "LIST" ] ] ], + "//": "100g of stuff, 6.6u to cook it", + "components": [ [ [ "poultry_raw_any", 1, "LIST" ] ] ] } ] diff --git a/data/json/recipes/food/meat_dishes.json b/data/json/recipes/food/meat_dishes.json index 80b3434dd44fb..0bcb87ae587ff 100644 --- a/data/json/recipes/food/meat_dishes.json +++ b/data/json/recipes/food/meat_dishes.json @@ -64,7 +64,7 @@ "tools": [ [ [ "surface_heat", 40, "LIST" ] ] ], "components": [ [ [ "flatbread", 1 ] ], - [ [ "meat_red_raw", 1, "LIST" ] ], + [ [ "meat_red_raw", 1, "LIST" ], [ "poultry_raw_any", 2, "LIST" ] ], [ [ "salt", 1 ] ], [ [ "onion", 1 ] ], [ [ "tomato", 1 ] ], diff --git a/data/json/recipes/food/pasta.json b/data/json/recipes/food/pasta.json index 5c8477b614670..7f404e8bd3c54 100644 --- a/data/json/recipes/food/pasta.json +++ b/data/json/recipes/food/pasta.json @@ -49,9 +49,9 @@ "charges": 3, "book_learn": [ [ "cookbook_italian", 3 ] ], "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], - "tools": [ [ [ "surface_heat", 12, "LIST" ] ] ], + "tools": [ [ [ "surface_heat", 28, "LIST" ] ] ], "//": "There are ways to cook pasta that don't require boiling the water, and they are a lot more efficient, so this uses surface_heat", - "//1": "pasta by weight is 5u flour, 1u for sauce, 4u for meat + heating the water (2u)", + "//1": "pasta by weight is 5u flour, 1u for sauce, 20u for meat + heating the water (2u)", "components": [ [ [ "spaghetti_raw", 1 ] ], [ [ "water_clean", 1 ] ], @@ -63,7 +63,7 @@ [ "can_tomato", 1 ], [ "wild_herbs", 10 ] ], - [ [ "meat_cooked", 1, "LIST" ], [ "can_chicken", 1 ], [ "dry_meat", 1 ], [ "meatball", 2 ] ] + [ [ "meat_red", 1, "LIST" ], [ "meatball", 2 ] ] ] }, { @@ -192,21 +192,7 @@ "//": "pasta by weight is 5u flour, 2u for the cheese, 4u for meat + heating the water (2u)", "components": [ [ [ "spaghetti_raw", 1 ], [ "macaroni_raw", 1 ], [ "noodles_fast", 1 ] ], - [ - [ "meat_cooked", 1, "LIST" ], - [ "dry_meat", 1 ], - [ "can_chicken", 1 ], - [ "fish", 1 ], - [ "dry_fish", 1 ], - [ "rehydrated_fish", 1 ], - [ "fish_canned", 1 ], - [ "can_salmon", 1 ], - [ "can_tuna", 1 ], - [ "bacon", 1 ], - [ "can_spam", 2 ], - [ "sausage", 1 ], - [ "bratwurst_sausage", 1 ] - ], + [ [ "meat_red_cooked", 1, "LIST" ] ], [ [ "cheese_standard", 2, "LIST" ], [ "cheese_powder", 2 ] ], [ [ "water_clean", 1 ] ] ] @@ -222,15 +208,15 @@ "time": "25 m", "book_learn": [ [ "cookbook_italian", 3 ] ], "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], - "tools": [ [ [ "surface_heat", 13, "LIST" ] ] ], + "tools": [ [ [ "surface_heat", 31, "LIST" ] ] ], "//": "There are ways to cook pasta that don't require boiling the water, and they are a lot more efficient, so this uses surface_heat", - "//1": "pasta by weight is 5u flour, 1u for cheese, 2u of egg, 2u for meat, heating the water (2u)", + "//1": "pasta by weight is 5u flour, 1u for cheese, 2u of egg, 20u for meat, heating the water (2u)", "components": [ [ [ "spaghetti_raw", 1 ] ], [ [ "water_clean", 1 ] ], [ [ "eggs_any_shape", 3, "LIST" ] ], [ [ "cheese_standard", 1, "LIST" ], [ "pecorino_cheese", 1 ] ], - [ [ "meat_cooked", 1, "LIST" ], [ "dry_meat", 1 ], [ "bacon", 1 ] ] + [ [ "meat_red", 1, "LIST" ], [ "bacon", 1 ] ] ], "charges": 4 }, @@ -245,15 +231,15 @@ "time": "25 m", "book_learn": [ [ "cookbook_italian", 3 ] ], "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 3 } ], - "tools": [ [ [ "surface_heat", 13, "LIST" ] ] ], + "tools": [ [ [ "surface_heat", 31, "LIST" ] ] ], "//": "There are ways to cook pasta that don't require boiling the water, and they are a lot more efficient, so this uses surface_heat", - "//1": "pasta by weight is 5u flour, 1u for cheese, 4u of red sauce, 2u for meat, heating the water (2u)", + "//1": "pasta by weight is 5u flour, 1u for cheese, 4u of red sauce, 20u for meat, heating the water (2u)", "components": [ [ [ "spaghetti_raw", 1 ] ], [ [ "water_clean", 1 ] ], [ [ "sauce_red", 3 ] ], [ [ "cheese_standard", 1, "LIST" ], [ "pecorino_cheese", 1 ] ], - [ [ "meat_cooked", 1, "LIST" ], [ "dry_meat", 1 ], [ "bacon", 1 ] ] + [ [ "meat_red", 1, "LIST" ], [ "bacon", 1 ] ] ], "charges": 4 } diff --git a/data/json/recipes/other/other.json b/data/json/recipes/other/other.json index 9d21553823667..f5603cf95291d 100644 --- a/data/json/recipes/other/other.json +++ b/data/json/recipes/other/other.json @@ -12,6 +12,7 @@ "components": [ [ [ "meat_red_raw", 1, "LIST" ], + [ "poultry_raw_any", 1, "LIST" ], [ "fish", 1 ], [ "dry_meat", 1 ], [ "dry_fish", 1 ], diff --git a/data/json/recipes/recipe_food.json b/data/json/recipes/recipe_food.json index fde8f74cf86f0..d3c72429995a7 100644 --- a/data/json/recipes/recipe_food.json +++ b/data/json/recipes/recipe_food.json @@ -1137,6 +1137,24 @@ "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_preservation" }, { "proficiency": "prof_food_curing" } ], "components": [ [ [ "mollusk", 1 ] ] ] }, + { + "type": "recipe", + "activity_level": "NO_EXERCISE", + "result": "poultry_smoked", + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_MEAT", + "skill_used": "cooking", + "difficulty": 3, + "time": "20 m", + "charges": 1, + "autolearn": true, + "batch_time_factors": [ 83, 9 ], + "qualities": [ { "id": "COOK", "level": 1 } ], + "tools": [ [ [ "smoking_heat", 10, "LIST" ] ] ], + "//": "100g of meat for 10 smoking_heats", + "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_preservation" }, { "proficiency": "prof_food_curing" } ], + "components": [ [ [ "poultry_raw_any", 1, "LIST" ] ] ] + }, { "type": "recipe", "activity_level": "LIGHT_EXERCISE", @@ -1885,7 +1903,7 @@ "//": "dogs can eat raw meat, but should cook this just to be safe. 2u for veggy, 10u for meat (red meat will be undercooked, not a big deal)", "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_knife_skills" } ], "components": [ - [ [ "meat_red", 1, "LIST" ], [ "fish", 1 ], [ "lobster", 1 ] ], + [ [ "meat_nofish", 1, "LIST" ], [ "fish", 1 ], [ "lobster", 1 ] ], [ [ "veggy_green", 1, "LIST" ] ], [ [ "water", 1 ], [ "water_clean", 1 ] ] ] @@ -1904,7 +1922,7 @@ "tools": [ [ [ "surface_heat", 20, "LIST" ] ] ], "//": "cats can eat raw meat, but should cook this just to be safe. 20u for meat (red meat will be undercooked, not a big deal)", "proficiencies": [ { "proficiency": "prof_food_prep" }, { "proficiency": "prof_knife_skills" } ], - "components": [ [ [ "meat_red", 2, "LIST" ], [ "fish", 2 ], [ "lobster", 2 ] ], [ [ "water", 1 ], [ "water_clean", 1 ] ] ] + "components": [ [ [ "meat_nofish", 2, "LIST" ], [ "fish", 2 ], [ "lobster", 2 ] ], [ [ "water", 1 ], [ "water_clean", 1 ] ] ] }, { "type": "recipe", @@ -3538,7 +3556,8 @@ [ "dry_fish", 2 ], [ "fish_smoked", 2 ], [ "dry_lobster", 2 ], - [ "lobster_smoked", 2 ] + [ "lobster_smoked", 2 ], + [ "poultry_smoked", 2 ] ], [ [ "dry_fruit", 2 ], @@ -4214,7 +4233,7 @@ "//": "veggy = 2u, oil = 4u, 300g steak = 20u, sugar = 4u", "components": [ [ [ "sugar_standard", 2, "LIST" ], [ "honeycomb", 1 ] ], - [ [ "meat_raw_steak", 1, "LIST" ] ], + [ [ "meat_red_raw_steak", 1, "LIST" ] ], [ [ "any_butter_or_oil", 8, "LIST" ] ], [ [ "veggy_any", 1, "LIST" ] ], [ [ "salt", 1 ], [ "soysauce", 1 ], [ "seasoning_salt", 1 ], [ "pepper", 1 ] ] @@ -6584,10 +6603,8 @@ "charges": 2, "autolearn": true, "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], - "tools": [ [ [ "surface_heat", 5, "LIST" ] ] ], - "//": "meat: 4u, cheese: 1u. Other ingredients don't need to be cooked.", "components": [ - [ [ "meat_cooked", 1, "LIST" ], [ "scrambled_eggs", 2 ], [ "boiled_egg", 2 ], [ "fried_eggs", 1 ], [ "omelet", 1 ] ], + [ [ "meat_red_cooked", 1, "LIST" ], [ "scrambled_eggs", 2 ], [ "boiled_egg", 2 ], [ "fried_eggs", 1 ], [ "omelet", 1 ] ], [ [ "bread_sandwich", 2, "LIST" ] ], [ [ "cheese_standard", 1, "LIST" ] ], [ @@ -6626,10 +6643,8 @@ "charges": 2, "autolearn": true, "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], - "tools": [ [ [ "surface_heat", 6, "LIST" ] ] ], - "//": "meat: 4u, cheese: 1u, onion: 1u-2u. could cook it with the meat to save power. Other ingredients don't need to be cooked.", "components": [ - [ [ "meat_cooked", 1, "LIST" ], [ "scrambled_eggs", 2 ], [ "boiled_egg", 2 ], [ "fried_eggs", 1 ], [ "omelet", 1 ] ], + [ [ "meat_red_cooked", 1, "LIST" ], [ "scrambled_eggs", 2 ], [ "boiled_egg", 2 ], [ "fried_eggs", 1 ], [ "omelet", 1 ] ], [ [ "bread_sandwich", 2, "LIST" ] ], [ [ "cheese_standard", 1, "LIST" ] ], [ [ "pickle", 1 ], [ "veggy_pickled", 1 ], [ "sauerkraut", 1 ] ], @@ -6949,10 +6964,8 @@ "time": "7 m 30 s", "autolearn": true, "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], - "tools": [ [ [ "surface_heat", 2, "LIST" ] ] ], - "//": "this is made entirely of cooked ingredients, so its power usage is low.", "components": [ - [ [ "meat_cooked", 1, "LIST" ] ], + [ [ "meat_red_cooked", 1, "LIST" ] ], [ [ "cheese_standard", 2, "LIST" ] ], [ [ "bread_sandwich", 2, "LIST" ] ], [ [ "sauerkraut", 1 ] ], @@ -6976,10 +6989,8 @@ "time": "7 m 30 s", "autolearn": true, "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], - "tools": [ [ [ "surface_heat", 2, "LIST" ] ] ], - "//": "this is made entirely of cooked ingredients, so its power usage is low.", "components": [ - [ [ "meat_cooked", 1, "LIST" ] ], + [ [ "meat_red_cooked", 1, "LIST" ] ], [ [ "cheese_standard", 2, "LIST" ] ], [ [ "bread_sandwich_wheat_free", 2, "LIST" ] ], [ [ "sauerkraut", 1 ] ], @@ -7004,10 +7015,8 @@ "charges": 2, "autolearn": true, "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], - "tools": [ [ [ "surface_heat", 4, "LIST" ] ] ], - "//": "power usage mostly for the meat, though this arguably doesn't even need power since meat is pre cooked", "components": [ - [ [ "meat_cooked", 1, "LIST" ], [ "scrambled_eggs", 2 ], [ "boiled_egg", 2 ], [ "fried_eggs", 1 ], [ "omelet", 1 ] ], + [ [ "meat_red_cooked", 1, "LIST" ], [ "scrambled_eggs", 2 ], [ "boiled_egg", 2 ], [ "fried_eggs", 1 ], [ "omelet", 1 ] ], [ [ "bread_sandwich", 2, "LIST" ] ], [ [ "pickle", 1 ], @@ -7045,10 +7054,8 @@ "charges": 2, "autolearn": true, "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], - "tools": [ [ [ "surface_heat", 4, "LIST" ] ] ], - "//": "power usage mostly for the meat, though this arguably doesn't even need power since meat is pre cooked", "components": [ - [ [ "meat_cooked", 1, "LIST" ], [ "scrambled_eggs", 2 ], [ "boiled_egg", 2 ], [ "fried_eggs", 1 ], [ "omelet", 1 ] ], + [ [ "meat_red_cooked", 1, "LIST" ], [ "scrambled_eggs", 2 ], [ "boiled_egg", 2 ], [ "fried_eggs", 1 ], [ "omelet", 1 ] ], [ [ "bread_sandwich_wheat_free", 2, "LIST" ] ], [ [ "pickle", 1 ], @@ -7089,7 +7096,7 @@ "qualities": [ { "id": "CUT", "level": 2 }, { "id": "COOK", "level": 2 } ], "tools": [ [ [ "surface_heat", 10, "LIST" ] ] ], "components": [ - [ [ "meat_cooked", 1, "LIST" ] ], + [ [ "meat_red_cooked", 1, "LIST" ] ], [ [ "frybread", 3 ] ], [ [ "can_beans", 1 ], [ "beans_cooked", 1 ] ], [ [ "lettuce", 1 ], [ "cabbage", 1 ] ] @@ -7294,7 +7301,8 @@ [ "bratwurst_sausage", 1 ], [ "meat_red", 1, "LIST" ], [ "dry_meat", 1 ], - [ "can_chicken", 1 ] + [ "can_chicken", 1 ], + [ "poultry_raw_any", 1, "LIST" ] ], [ [ "edible_tallow_lard", 2, "LIST" ] ], [ [ "flour_any", 2, "LIST" ], [ "cornmeal", 1 ] ], @@ -7409,7 +7417,7 @@ "components": [ [ [ "bread_sandwich", 2, "LIST" ] ], [ [ "sauce_red", 2 ], [ "can_tomato", 1 ], [ "tomato", 1 ] ], - [ [ "meat_cooked", 1, "LIST" ], [ "dry_meat", 1 ], [ "can_chicken", 1 ] ] + [ [ "meat_red_cooked", 1, "LIST" ] ] ] }, { @@ -7429,7 +7437,7 @@ "components": [ [ [ "bread_sandwich_wheat_free", 2, "LIST" ] ], [ [ "sauce_red", 2 ], [ "can_tomato", 1 ], [ "tomato", 1 ] ], - [ [ "meat_cooked", 1, "LIST" ], [ "dry_meat", 1 ], [ "can_chicken", 1 ] ] + [ [ "meat_red_cooked", 1, "LIST" ] ] ] }, { @@ -8816,7 +8824,11 @@ "qualities": [ { "id": "COOK", "level": 1 }, { "id": "CUT", "level": 2 } ], "tools": [ [ [ "surface_heat", 22, "LIST" ] ] ], "//": "300g raw meat (20u) + 26g of flour (2u) for a total of 22", - "components": [ [ [ "flour_any", 2, "LIST" ] ], [ [ "meat_red", 1, "LIST" ], [ "dry_meat", 1 ] ], [ [ "water_clean", 1 ] ] ], + "components": [ + [ [ "flour_any", 2, "LIST" ] ], + [ [ "meat_red", 1, "LIST" ], [ "poultry_raw_any", 2, "LIST" ], [ "dry_meat", 1 ] ], + [ [ "water_clean", 1 ] ] + ], "charges": 2 }, { @@ -10160,6 +10172,7 @@ [ [ "dry_rice", 1 ], [ "dry_wild_rice", 1 ] ], [ [ "meat_red", 1, "LIST" ], + [ "poultry_raw_any", 1, "LIST" ], [ "meat_smoked", 1 ], [ "dry_meat", 1 ], [ "can_chicken", 1 ], diff --git a/data/json/requirements/cooking_components.json b/data/json/requirements/cooking_components.json index e17bc1382f411..64f72432265c7 100644 --- a/data/json/requirements/cooking_components.json +++ b/data/json/requirements/cooking_components.json @@ -449,20 +449,17 @@ ] ] }, + { + "id": "meat_red_raw_steak", + "type": "requirement", + "//": "A whole slab of raw, red meat. Substitutes pork and beef, but not chicken, in common recipes.", + "components": [ [ [ "meat", 1 ], [ "mutant_meat", 1 ], [ "human_flesh", 1 ], [ "mutant_human_flesh", 1 ], [ "demihuman_flesh", 1 ] ] ] + }, { "id": "meat_raw_steak", "type": "requirement", - "//": "An unbroken slab of raw meat. For when scraps just aren't good enough.", - "components": [ - [ - [ "meat", 1 ], - [ "mutant_meat", 1 ], - [ "human_flesh", 1 ], - [ "mutant_human_flesh", 1 ], - [ "demihuman_flesh", 1 ], - [ "poultry", 1 ] - ] - ] + "//": "An unbroken slab of raw meat including poultry. For when scraps aren't good enough.", + "components": [ [ [ "meat_red_raw_steak", 1, "LIST" ], [ "poultry", 1 ] ] ] }, { "id": "meat_red_raw", @@ -594,12 +591,11 @@ ] }, { - "id": "meat_cooked", + "id": "meat_red_cooked", "type": "requirement", - "//": "meat you'd put on a sandwich", + "//": "cooked red meat.", "components": [ [ - [ "any_cracklins", 2, "LIST" ], [ "meat_cooked", 1 ], [ "meat_fatty_cooked", 1 ], [ "meat_scrap_cooked", 10 ], @@ -610,7 +606,6 @@ [ "demihuman_cooked", 1 ], [ "meat_pickled", 1 ], [ "meat_smoked", 1 ], - [ "earthworm_dried", 10 ], [ "meat_salted", 1 ], [ "dry_meat", 1 ], [ "rehydrated_meat", 1 ], @@ -620,6 +615,25 @@ [ "bologna", 2 ], [ "can_spam", 2 ], [ "fried_spam", 2 ], + [ "meat_canned", 1 ], + [ "meat_aspic", 1 ], + [ "sausage", 1 ], + [ "sausage_cooked", 1 ], + [ "sausage_wasteland", 1 ], + [ "bratwurst_sausage", 1 ], + [ "meat_fried", 1 ] + ] + ] + }, + { + "id": "meat_cooked", + "type": "requirement", + "//": "meat you'd put on a sandwich", + "components": [ + [ + [ "meat_red_cooked", 1, "LIST" ], + [ "any_cracklins", 2, "LIST" ], + [ "earthworm_dried", 10 ], [ "can_chicken", 1 ], [ "fish_cooked", 1 ], [ "fish_scrap_cooked", 10 ], @@ -632,16 +646,9 @@ [ "can_sardine", 1 ], [ "can_clams", 1 ], [ "salted_fish", 1 ], - [ "meat_canned", 1 ], [ "fish_canned", 1 ], [ "fish_pickled", 1 ], [ "lobster_canned", 1 ], - [ "meat_aspic", 1 ], - [ "sausage", 1 ], - [ "sausage_cooked", 1 ], - [ "sausage_wasteland", 1 ], - [ "bratwurst_sausage", 1 ], - [ "meat_fried", 1 ], [ "poultry_cooked", 1 ], [ "poultry_pepper", 1 ], [ "poultry_smoked", 1 ] @@ -698,6 +705,7 @@ [ "dry_meat", 1 ], [ "can_chicken", 1 ], [ "poultry_raw_any", 1, "LIST" ], + [ "poultry_smoked", 1 ], [ "dry_poultry", 1 ] ] ] From efdb35cfbdda4d7ff3f4d2982e15be09fac28e43 Mon Sep 17 00:00:00 2001 From: GuardianDll Date: Wed, 8 May 2024 22:04:16 +0200 Subject: [PATCH 093/104] Clamp metabolism enchantment to prevent lag Co-authored-by: RenechCDDA <84619419+RenechCDDA@users.noreply.github.com> --- src/consumption.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/consumption.cpp b/src/consumption.cpp index 2796a2039f47f..70a9341a4c9ad 100644 --- a/src/consumption.cpp +++ b/src/consumption.cpp @@ -715,7 +715,9 @@ float Character::metabolic_rate_base() const { static const std::string hunger_rate_string( "PLAYER_HUNGER_RATE" ); float hunger_rate = get_option< float >( hunger_rate_string ); - return enchantment_cache->modify_value( enchant_vals::mod::METABOLISM, hunger_rate ); + const float final_hunger_rate = enchantment_cache->modify_value( enchant_vals::mod::METABOLISM, + hunger_rate ); + return std::clamp( final_hunger_rate, 0.0f, float_max ); } // TODO: Make this less chaotic to let NPC retroactive catch up work here From eef9f1320609747254c9466756cc4ebf9262417e Mon Sep 17 00:00:00 2001 From: BalthazarArgall Date: Thu, 9 May 2024 01:01:11 +0200 Subject: [PATCH 094/104] initial commit --- data/json/items/armor/combat_exoskeleton.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/data/json/items/armor/combat_exoskeleton.json b/data/json/items/armor/combat_exoskeleton.json index 737c9410d9cbe..42988b709f246 100644 --- a/data/json/items/armor/combat_exoskeleton.json +++ b/data/json/items/armor/combat_exoskeleton.json @@ -147,7 +147,7 @@ "copy-from": "combat_exoskeleton_abstract", "type": "TOOL_ARMOR", "name": { "str": "combat exoskeleton mk1", "str_pl": "combat exoskeletons mk1" }, - "description": "Colloquially known as a 'tank suit' in the media, these first-generation exoskeletons were tested in military service a few years back and determined to be too expensive for regular use. The exoskeleton itself is strapped on an environmental suit with an integrated life-support system. A variety of of webbing, magnets, and clips allows the attachment of special armor plating onto the frame.", + "description": "Colloquially known as a 'tank suit' in the media, these first-generation exoskeletons were tested in military service a few years back and determined to be too expensive for regular use. The exoskeleton itself is strapped on an environmental suit with an integrated life-support system. A variety of webbing, magnets, and clips allows the attachment of special armor plating onto the frame.", "looks_like": "power_armor_heavy", "ammo": "battery", "relic_data": { "passive_effects": [ { "id": "combat_exoskeleton_heavy_active" } ] }, @@ -252,7 +252,7 @@ "copy-from": "combat_exoskeleton_abstract", "type": "TOOL_ARMOR", "name": { "str": "combat exoskeleton mk2", "str_pl": "combat exoskeletons mk2" }, - "description": "These were the second wave of military combat exoskeleton, and got a lot of media attention, with popular Navy commercials featuring them heavily. The exoskeleton itself is strapped on an environmental suit with an integrated life-support system. A variety of of webbing, magnets, and clips allows the attachment of special armor plating onto the frame.", + "description": "These were the second wave of military combat exoskeleton, and got a lot of media attention, with popular Navy commercials featuring them heavily. The exoskeleton itself is strapped on an environmental suit with an integrated life-support system. A variety of webbing, magnets, and clips allows the attachment of special armor plating onto the frame.", "looks_like": "power_armor_basic", "ammo": "battery", "relic_data": { "passive_effects": [ { "id": "combat_exoskeleton_medium_active" } ] }, @@ -357,7 +357,7 @@ "copy-from": "combat_exoskeleton_abstract", "type": "TOOL_ARMOR", "name": { "str": "combat exoskeleton mk3", "str_pl": "combat exoskeletons mk3" }, - "description": "The final iteration of military power armor before the fall of civilization, this version was designed for actual widespread combat use and was seen on the front lines during the last days of the Cataclysm, unfortunately, the world ended before it could roll out in significant numbers. The exoskeleton itself is strapped on an environmental suit with an integrated life-support system. A variety of of webbing, magnets, and clips allows the attachment of special armor plating onto the frame.", + "description": "The final iteration of military power armor before the fall of civilization, this version was designed for actual widespread combat use and was seen on the front lines during the last days of the Cataclysm, unfortunately, the world ended before it could roll out in significant numbers. The exoskeleton itself is strapped on an environmental suit with an integrated life-support system. A variety of webbing, magnets, and clips allows the attachment of special armor plating onto the frame.", "looks_like": "power_armor_light", "ammo": "battery", "relic_data": { "passive_effects": [ { "id": "combat_exoskeleton_light_active" } ] }, @@ -462,7 +462,7 @@ "copy-from": "combat_exoskeleton_light", "type": "ARMOR", "name": { "str": "salvaged combat exoskeleton" }, - "description": "This used to be a combat exoskeleton of third generation but it has been rendered non-functional: as one might expect, this makes it a lot harder to wear. A variety of of webbing, magnets, and clips allows the attachment of special armor plating onto the frame.", + "description": "This used to be a combat exoskeleton of third generation but it has been rendered non-functional: as one might expect, this makes it a lot harder to wear. A variety of webbing, magnets, and clips allows the attachment of special armor plating onto the frame.", "relative": { "environmental_protection": 0, "warmth": 0 }, "proportional": { "volume": 0.25, "weight": 0.5, "price": 0.1, "price_postapoc": 0.1 }, "delete": { From 8b49c2c951f48f9537329fcd8a4d119e862c46f7 Mon Sep 17 00:00:00 2001 From: Venera3 <72006894+Venera3@users.noreply.github.com> Date: Thu, 9 May 2024 04:04:51 +0200 Subject: [PATCH 095/104] Unhardcode and limbify attack vectors take two: Electric boogaloo (#73064) * WIP attack vector * Version Two * Getting there * oop * Deprecate, dewippify * Aight clang, lemme have it * Getting there * Limb type restrictions * BB * Actually working substitutions * Tests * Tests, clang, magiclysm oopsies * Tests * ntegrated is def a word, shutup * Mandatorify * Fine, no mandatory You get verified for that, mister --- data/json/attack_vectors.json | 123 ++++ data/json/bionics.json | 3 +- data/json/body_parts.json | 7 + data/json/items/armor/integrated.json | 36 +- data/json/martialarts_fictional.json | 44 +- data/json/mutations/mutation_techs.json | 205 ++++++- data/json/mutations/mutations.json | 3 - data/json/techniques.json | 527 ++++++------------ .../Limb_WIP/mutations/mutation_limbs.json | 1 + .../Limb_WIP/mutations/mutation_techs.json | 13 + .../Limb_WIP/mutations/mutation_vectors.json | 8 + data/mods/MMA/techniques.json | 60 +- data/mods/Magiclysm/items/armor.json | 77 +++ data/mods/Magiclysm/items/integrated.json | 6 +- data/mods/Magiclysm/mutations/mutations.json | 18 +- data/mods/Magiclysm/techniques.json | 2 +- .../Magiclysm/techniques_fantasy_species.json | 34 +- .../traits/temporary_demon_traits.json | 4 +- data/mods/TEST_DATA/body_parts.json | 19 + data/mods/TEST_DATA/martialarts.json | 48 +- data/mods/Xedra_Evolved/techniques.json | 7 +- doc/JSON_FLAGS.md | 1 - doc/MARTIALART_JSON.md | 50 +- doc/MUTATIONS.md | 2 +- src/bodypart.cpp | 10 + src/bodypart.h | 3 + src/character.cpp | 7 +- src/character.h | 20 +- src/character_attire.cpp | 48 +- src/character_attire.h | 2 +- src/character_martial_arts.h | 11 +- src/init.cpp | 1 + src/item.cpp | 14 +- src/martialarts.cpp | 294 ++++++++-- src/martialarts.h | 44 +- src/melee.cpp | 464 +++++++-------- src/subbodypart.cpp | 1 + src/subbodypart.h | 3 + src/talker_character.cpp | 5 +- src/type_id.h | 3 + tests/martial_art_test.cpp | 115 +++- 41 files changed, 1402 insertions(+), 941 deletions(-) create mode 100644 data/json/attack_vectors.json create mode 100644 data/mods/Limb_WIP/mutations/mutation_techs.json create mode 100644 data/mods/Limb_WIP/mutations/mutation_vectors.json diff --git a/data/json/attack_vectors.json b/data/json/attack_vectors.json new file mode 100644 index 0000000000000..8928cf53fd311 --- /dev/null +++ b/data/json/attack_vectors.json @@ -0,0 +1,123 @@ +[ + { + "type": "attack_vector", + "id": "vector_null", + "//": "Fallback weapon vector, unarmed attacks always go through techs", + "weapon": true + }, + { + "type": "attack_vector", + "id": "test_test", + "limbs": [ "debug_tail" ], + "encumbrance_limit": 33, + "bp_hp_limit": 75 + }, + { + "type": "attack_vector", + "id": "vector_headbutt", + "limbs": [ "head" ], + "contact_area": [ "head_forehead" ], + "bp_hp_limit": 50 + }, + { + "type": "attack_vector", + "id": "vector_bite", + "limbs": [ "mouth" ], + "contact_area": [ "mouth_lips" ], + "encumbrance_limit": 1 + }, + { + "type": "attack_vector", + "id": "vector_punch", + "limbs": [ "hand_l", "hand_r" ], + "contact_area": [ "hand_fingers_l", "hand_fingers_r" ] + }, + { + "type": "attack_vector", + "id": "vector_wrist", + "limbs": [ "hand_l", "hand_r" ], + "contact_area": [ "hand_wrist_l", "hand_wrist_r" ] + }, + { + "type": "attack_vector", + "id": "vector_palm", + "limbs": [ "hand_l", "hand_r" ], + "contact_area": [ "hand_palm_l", "hand_palm_r" ] + }, + { + "type": "attack_vector", + "id": "vector_grasp", + "limbs": [ "hand_l", "hand_r" ], + "contact_area": [ "hand_palm_l", "hand_palm_r" ], + "limb_req": [ [ "arm", 2 ] ], + "armor_bonus": false + }, + { + "type": "attack_vector", + "id": "vector_backhand", + "limbs": [ "hand_l", "hand_r" ], + "contact_area": [ "hand_back_l", "hand_back_r" ] + }, + { + "type": "attack_vector", + "id": "vector_shoulder", + "limbs": [ "arm_l", "arm_r" ], + "contact_area": [ "arm_shoulder_l", "arm_shoulder_r" ] + }, + { + "type": "attack_vector", + "id": "vector_arm", + "limbs": [ "arm_l", "arm_r" ], + "contact_area": [ "arm_upper_r", "arm_elbow_r", "arm_lower_r", "arm_upper_l", "arm_elbow_l", "arm_lower_l" ] + }, + { + "type": "attack_vector", + "id": "vector_arm_grapple", + "limbs": [ "arm_l", "arm_r" ], + "contact_area": [ "arm_upper_r", "arm_elbow_r", "arm_lower_r", "arm_upper_l", "arm_elbow_l", "arm_lower_l" ], + "armor_bonus": false, + "limb_req": [ [ "arm", 2 ] ] + }, + { + "type": "attack_vector", + "id": "vector_elbow", + "limbs": [ "arm_l", "arm_r" ], + "contact_area": [ "arm_elbow_l", "arm_elbow_r" ] + }, + { + "type": "attack_vector", + "id": "vector_foot_toes", + "limbs": [ "foot_l", "foot_r" ], + "contact_area": [ "foot_toes_l", "foot_toes_r" ], + "limb_req": [ [ "leg", 2 ] ] + }, + { + "type": "attack_vector", + "id": "vector_foot_sole", + "limbs": [ "foot_l", "foot_r" ], + "contact_area": [ "foot_sole_l", "foot_sole_r" ], + "limb_req": [ [ "leg", 2 ] ] + }, + { + "type": "attack_vector", + "id": "vector_foot_heel", + "limbs": [ "foot_l", "foot_r" ], + "contact_area": [ "foot_heel_l", "foot_heel_r" ], + "limb_req": [ [ "leg", 2 ] ] + }, + { + "type": "attack_vector", + "id": "vector_knee", + "limbs": [ "leg_l", "leg_r" ], + "contact_area": [ "leg_knee_l", "leg_knee_r" ], + "limb_req": [ [ "leg", 2 ] ] + }, + { + "type": "attack_vector", + "id": "vector_shin", + "limbs": [ "leg_l", "leg_r" ], + "contact_area": [ "leg_lower_l", "leg_lower_r" ], + "bp_hp_limit": 50, + "limb_req": [ [ "leg", 2 ] ] + } +] diff --git a/data/json/bionics.json b/data/json/bionics.json index 0f63b42c787d8..4fb4b4f00823f 100644 --- a/data/json/bionics.json +++ b/data/json/bionics.json @@ -1417,7 +1417,8 @@ "description": "You possess razor-sharp claws underneath your fingernails that do a small amount of unarmed slashing damage whenever your fingertips are uncovered.", "occupied_bodyparts": [ [ "hand_l", 1 ], [ "hand_r", 1 ] ], "passive_pseudo_items": [ "fake_razor" ], - "flags": [ "BIONIC_NPC_USABLE" ] + "flags": [ "BIONIC_NPC_USABLE" ], + "enchantments": [ { "condition": { "not": "u_has_weapon" }, "values": [ { "value": "ITEM_DAMAGE_STAB", "add": 2 } ] } ] }, { "id": "bio_recycler", diff --git a/data/json/body_parts.json b/data/json/body_parts.json index 2b84c094f938a..b9a2a56a6d967 100644 --- a/data/json/body_parts.json +++ b/data/json/body_parts.json @@ -228,6 +228,7 @@ "base_hp": 60, "drench_capacity": 700, "smash_message": "You smash the %s with a firm headbutt.", + "techniques": [ "tech_base_headbutt" ], "smash_efficiency": 0.25, "bionic_slots": 18, "flags": [ "LIMB_UPPER" ], @@ -550,6 +551,7 @@ "limb_scores": [ [ "grip", 0.5 ], [ "manip", 0.5, 1.0 ], [ "swim", 0.15 ] ], "side": "left", "legacy_id": "HAND_L", + "techniques": [ "tech_base_punch" ], "stylish_bonus": 0.5, "hot_morale_mod": 0.5, "cold_morale_mod": 0.5, @@ -581,6 +583,7 @@ "limb_scores": [ [ "grip", 0.5 ], [ "manip", 0.5, 1.0 ], [ "swim", 0.15 ] ], "side": "right", "legacy_id": "HAND_R", + "techniques": [ "tech_base_punch" ], "stylish_bonus": 0.5, "hot_morale_mod": 0.5, "cold_morale_mod": 0.5, @@ -809,6 +812,7 @@ "base_hp": 60, "drench_capacity": 300, "smash_message": "You kick down the %s, smashing it.", + "techniques": [ "tech_base_kick" ], "bionic_slots": 7, "sub_parts": [ "foot_sole_l", "foot_arch_l", "foot_toes_l", "foot_ankle_l", "foot_heel_l" ], "flags": [ "LIMB_LOWER" ], @@ -842,6 +846,8 @@ "base_hp": 60, "drench_capacity": 300, "smash_message": "You kick down the %s, smashing it.", + "technique_encumbrance_limit": 40, + "techniques": [ "tech_base_kick" ], "bionic_slots": 7, "sub_parts": [ "foot_sole_r", "foot_arch_r", "foot_toes_r", "foot_ankle_r", "foot_heel_r" ], "flags": [ "LIMB_LOWER" ], @@ -870,6 +876,7 @@ "accusative": { "ctxt": "bodypart_accusative", "str": "debug tail" }, "hp_bar_ui_text": "DBG TAIL", "base_hp": 20, + "health_limit": 5, "flags": [ "ALWAYS_BLOCK", "NONSTANDARD_BLOCK", "MEND_LIMB", "WALL_CLING" ], "armor": { "bash": 10 }, "unarmed_damage": [ { "damage_type": "acid", "amount": 10 }, { "damage_type": "bullet", "amount": 5, "armor_penetration": 100 } ], diff --git a/data/json/items/armor/integrated.json b/data/json/items/armor/integrated.json index b588e1aa79fef..640656277eced 100644 --- a/data/json/items/armor/integrated.json +++ b/data/json/items/armor/integrated.json @@ -1531,10 +1531,7 @@ "encumbrance": 1 } ], - "melee_damage": { "cut": 9 }, - "relic_data": { - "passive_effects": [ { "has": "WORN", "condition": { "not": "u_has_weapon" }, "values": [ { "value": "ATTACK_SPEED", "add": -20 } ] } ] - } + "melee_damage": { "cut": 9 } }, { "id": "integrated_claws_rat", @@ -1560,10 +1557,7 @@ "encumbrance": 3 } ], - "melee_damage": { "cut": 10 }, - "relic_data": { - "passive_effects": [ { "has": "WORN", "condition": { "not": "u_has_weapon" }, "values": [ { "value": "ATTACK_SPEED", "add": -20 } ] } ] - } + "melee_damage": { "cut": 10 } }, { "id": "integrated_claws_st", @@ -1589,10 +1583,7 @@ "encumbrance": 5 } ], - "melee_damage": { "cut": 11 }, - "relic_data": { - "passive_effects": [ { "has": "WORN", "condition": { "not": "u_has_weapon" }, "values": [ { "value": "ATTACK_SPEED", "add": -20 } ] } ] - } + "melee_damage": { "cut": 11 } }, { "id": "integrated_talons", @@ -1618,10 +1609,7 @@ "encumbrance": 7 } ], - "melee_damage": { "cut": 16 }, - "relic_data": { - "passive_effects": [ { "has": "WORN", "condition": { "not": "u_has_weapon" }, "values": [ { "value": "ATTACK_SPEED", "add": -20 } ] } ] - } + "melee_damage": { "cut": 16 } }, { "id": "integrated_fangs", @@ -1638,16 +1626,18 @@ "color": "white", "warmth": 5, "qualities": [ [ "CUT", 2 ], [ "BUTCHER", 4 ] ], - "techniques": [ "FANGS_BITE", "FANGS_BITE_NATURAL" ], + "techniques": [ "FANGS_BITE", "FANGS_BITE_NATURAL", "FANGS_BITE_CRIT" ], "flags": [ "INTEGRATED", "ALLOWS_NATURAL_ATTACKS", "UNBREAKABLE", "PERSONAL", "PADDED", "PROVIDES_TECHNIQUES" ], "armor": [ { "material": [ { "type": "bone", "covered_by_mat": 100, "thickness": 3.2 } ], "covers": [ "mouth" ], - "coverage": 0, + "specifically_covers": [ "mouth_lips" ], + "coverage": 100, "encumbrance": 0 } - ] + ], + "melee_damage": { "stab": 9 } }, { "id": "integrated_vampire_fangs", @@ -1664,15 +1654,17 @@ "color": "white", "warmth": 5, "qualities": [ [ "CUT", 2 ], [ "BUTCHER", 4 ] ], - "techniques": [ "VAMPIRE_BITE", "VAMPIRE_BITE_NATURAL" ], + "techniques": [ "VAMPIRE_BITE", "VAMPIRE_BITE_NATURAL", "VAMPIRE_BITE_CRIT" ], "flags": [ "INTEGRATED", "ALLOWS_NATURAL_ATTACKS", "UNBREAKABLE", "PERSONAL", "PADDED", "PROVIDES_TECHNIQUES" ], "armor": [ { "material": [ { "type": "bone", "covered_by_mat": 100, "thickness": 3.2 } ], "covers": [ "mouth" ], - "coverage": 0, + "specifically_covers": [ "mouth_lips" ], + "coverage": 100, "encumbrance": 0 } - ] + ], + "melee_damage": { "stab": 15 } } ] diff --git a/data/json/martialarts_fictional.json b/data/json/martialarts_fictional.json index 9944da87a5737..912b18fd2d2c4 100644 --- a/data/json/martialarts_fictional.json +++ b/data/json/martialarts_fictional.json @@ -380,7 +380,7 @@ } ], "stun_dur": 1, - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_grasp" ] }, { "type": "technique", @@ -389,7 +389,7 @@ "messages": [ "You make an efficient strike against %s!", " makes an efficient strike against %s!" ], "melee_allowed": true, "mult_bonuses": [ { "stat": "movecost", "scale": 0.8 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -399,7 +399,7 @@ "unarmed_allowed": true, "crit_ok": true, "mult_bonuses": [ { "stat": "movecost", "scale": 0.8 } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_punch" ] }, { "type": "technique", @@ -415,7 +415,7 @@ { "stat": "damage", "type": "stab", "scale": 1.5 } ], "stun_dur": 1, - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -429,7 +429,7 @@ "condition": { "not": { "npc_has_effect": "downed" } }, "condition_desc": "* Only works on a non-downed target", "down_dur": 2, - "attack_vectors": [ "FOOT" ] + "attack_vectors": [ "vector_foot_toes" ] }, { "type": "technique", @@ -442,7 +442,7 @@ "weighting": 2, "crit_tec": true, "aoe": "wide", - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -456,7 +456,7 @@ { "stat": "damage", "type": "cut", "scale": 0.66 }, { "stat": "damage", "type": "stab", "scale": 0.66 } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_punch" ] }, { "type": "technique", @@ -467,7 +467,7 @@ "unarmed_allowed": true, "crit_ok": true, "mult_bonuses": [ { "stat": "damage", "type": "bash", "scale": 1.2 } ], - "attack_vectors": [ "FOOT" ] + "attack_vectors": [ "vector_foot_toes" ] }, { "type": "technique", @@ -496,7 +496,7 @@ "knockback_dist": 1, "knockback_spread": 1, "mult_bonuses": [ { "stat": "damage", "type": "bash", "scale": 2.5 } ], - "attack_vectors": [ "TORSO" ] + "attack_vectors": [ "vector_shoulder" ] }, { "type": "technique", @@ -521,7 +521,7 @@ { "stat": "damage", "type": "cut", "scale": 0.66 }, { "stat": "damage", "type": "stab", "scale": 0.66 } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_wrist" ] }, { "type": "technique", @@ -533,7 +533,7 @@ "crit_tec": true, "stun_dur": 2, "mult_bonuses": [ { "stat": "damage", "type": "bash", "scale": 1.25 } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_punch" ] }, { "type": "technique", @@ -546,7 +546,7 @@ "condition_desc": "Requires a stunned target", "weighting": 2, "mult_bonuses": [ { "stat": "damage", "type": "bash", "scale": 1.5 } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_punch" ] }, { "type": "technique", @@ -560,7 +560,7 @@ "weighting": 2, "crit_tec": true, "mult_bonuses": [ { "stat": "damage", "type": "bash", "scale": 2.0 } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_punch" ] }, { "type": "technique", @@ -569,7 +569,7 @@ "messages": [ "You roundhouse kick %s!", " roundhouse kicks %s!" ], "unarmed_allowed": true, "mult_bonuses": [ { "stat": "damage", "type": "bash", "scale": 1.2 } ], - "attack_vectors": [ "FOOT" ] + "attack_vectors": [ "vector_foot_heel" ] }, { "type": "technique", @@ -582,7 +582,7 @@ "knockback_dist": 3, "mult_bonuses": [ { "stat": "damage", "type": "bash", "scale": 2.0 } ], "messages": [ "Your Stinger Kick sends %s flying!", "'s Stinger Kick sends %s flying!" ], - "attack_vectors": [ "FOOT" ] + "attack_vectors": [ "vector_foot_sole" ] }, { "type": "technique", @@ -594,7 +594,7 @@ "required_buffs_all": [ "buff_scorpion_onmove" ], "stun_dur": 1, "mult_bonuses": [ { "stat": "damage", "type": "bash", "scale": 1.25 } ], - "attack_vectors": [ "FOOT" ] + "attack_vectors": [ "vector_foot_toes" ] }, { "type": "technique", @@ -605,7 +605,7 @@ "crit_ok": true, "unarmed_allowed": true, "mult_bonuses": [ { "stat": "damage", "type": "bash", "scale": 1.25 } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_punch" ] }, { "type": "technique", @@ -617,7 +617,7 @@ "crit_tec": true, "stun_dur": 1, "mult_bonuses": [ { "stat": "damage", "type": "bash", "scale": 1.4 } ], - "attack_vectors": [ "ARM" ] + "attack_vectors": [ "vector_arm" ] }, { "type": "technique", @@ -632,7 +632,7 @@ "condition_desc": "* Only works on a non-downed target", "down_dur": 2, "mult_bonuses": [ { "stat": "movecost", "scale": 0.5 } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_grasp" ] }, { "type": "technique", @@ -656,7 +656,7 @@ { "stat": "damage", "type": "cut", "scale": 0.66 }, { "stat": "damage", "type": "stab", "scale": 0.66 } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_punch" ] }, { "type": "technique", @@ -670,7 +670,7 @@ "condition_desc": "* Only works on a non-downed target", "down_dur": 1, "mult_bonuses": [ { "stat": "movecost", "scale": 0.5 } ], - "attack_vectors": [ "PALM" ] + "attack_vectors": [ "vector_palm" ] }, { "type": "technique", @@ -689,6 +689,6 @@ "message": "The weapon of %s has been forced out ot their hands!" } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_grasp" ] } ] diff --git a/data/json/mutations/mutation_techs.json b/data/json/mutations/mutation_techs.json index dfa8b9c0c79a0..36d19691e9eab 100644 --- a/data/json/mutations/mutation_techs.json +++ b/data/json/mutations/mutation_techs.json @@ -6,11 +6,8 @@ "messages": [ "You sting %s with your bug-laden tail", " stings %s with their bug-laden tail" ], "unarmed_allowed": true, "melee_allowed": true, - "attack_override": true, - "weighting": -2, + "weighting": 200, "crit_ok": true, - "required_char_flags": [ "SEESLEEP" ], - "forbidden_char_flags": [ "EYE_MEMBRANE" ], "repeat_min": 1, "repeat_max": 5, "mult_bonuses": [ { "stat": "damage", "type": "bullet", "scale": 15 } ], @@ -30,6 +27,206 @@ "message": "You bleed the %s dry!" }, { "id": "downed", "chance": 50, "duration": 2, "message": "You bonk the %s real good", "req_flag": "DREAMY" } + ], + "attack_vectors": [ "test_test" ] + }, + { + "type": "technique", + "id": "FANGS_BITE", + "name": "Fang Bite", + "melee_allowed": true, + "messages": [ "You bite %s", " bites %s!" ], + "unarmed_allowed": true, + "weighting": -5, + "reach_ok": false, + "attack_vectors": [ "vector_bite" ], + "condition": { + "and": [ + { "not": { "u_has_effect": "natural_stance" } }, + { "and": [ { "not": { "npc_has_flag": "GRAB_FILTER" } }, { "not": { "u_has_effect": "GRAB" } } ] } + ] + }, + "tech_effects": [ + { + "id": "anticoagulant_draculin", + "chance": 70, + "duration": 3000, + "on_damage": true, + "message": "Saliva glistens across %s's wound!", + "req_flag": "DRACULIN_VENOM" + } + ], + "flat_bonuses": [ + { "stat": "damage", "type": "stab", "scaling-stat": "unarmed", "scale": 1.0 }, + { "stat": "damage", "type": "bash", "scaling-stat": "str", "scale": 0.75 }, + { "stat": "damage", "type": "bash", "scaling-stat": "unarmed", "scale": 0.06 }, + { "stat": "movecost", "scaling-stat": "melee", "scale": -1.25 }, + { "stat": "movecost", "scaling-stat": "dex", "scale": -0.5 } + ] + }, + { + "type": "technique", + "id": "FANGS_BITE_NATURAL", + "name": "Fang Bite", + "melee_allowed": true, + "messages": [ "You bite %s", " bites %s!" ], + "unarmed_allowed": true, + "weighting": -2, + "reach_ok": false, + "attack_vectors": [ "vector_bite" ], + "condition": { + "and": [ + { + "or": [ { "u_has_effect": "natural_stance" }, { "and": [ { "npc_has_flag": "GRAB_FILTER" }, { "u_has_flag": "GRAB" } ] } ] + } + ] + }, + "tech_effects": [ + { + "id": "anticoagulant_draculin", + "chance": 70, + "duration": 3000, + "on_damage": true, + "message": "Saliva glistens across %s's wound!", + "req_flag": "DRACULIN_VENOM" + } + ], + "flat_bonuses": [ + { "stat": "damage", "type": "stab", "scaling-stat": "unarmed", "scale": 1.0 }, + { "stat": "damage", "type": "bash", "scaling-stat": "str", "scale": 0.75 }, + { "stat": "damage", "type": "bash", "scaling-stat": "unarmed", "scale": 0.06 }, + { "stat": "movecost", "scaling-stat": "melee", "scale": -1.25 }, + { "stat": "movecost", "scaling-stat": "dex", "scale": -0.5 } + ] + }, + { + "type": "technique", + "id": "FANGS_BITE_CRIT", + "name": "Critical Fang Bite", + "melee_allowed": true, + "messages": [ "You deliver a wicked bite to %s", " delivers a wicked bite to %s!" ], + "unarmed_allowed": true, + "reach_ok": false, + "crit_tec": true, + "attack_vectors": [ "vector_bite" ], + "tech_effects": [ + { + "id": "anticoagulant_draculin", + "chance": 90, + "duration": 6000, + "on_damage": true, + "message": "Saliva glistens across %s's wound!", + "req_flag": "DRACULIN_VENOM" + } + ], + "flat_bonuses": [ + { "stat": "damage", "type": "stab", "scaling-stat": "unarmed", "scale": 4.4 }, + { "stat": "damage", "type": "bash", "scaling-stat": "str", "scale": 0.75 }, + { "stat": "damage", "type": "bash", "scaling-stat": "unarmed", "scale": 0.24 }, + { "stat": "arpen", "type": "bash", "scaling-stat": "unar,ed", "scale": 1 }, + { "stat": "arpen", "type": "stab", "scaling-stat": "unarmed", "scale": 1 }, + { "stat": "movecost", "scaling-stat": "melee", "scale": -1.25 }, + { "stat": "movecost", "scaling-stat": "dex", "scale": -0.5 } + ] + }, + { + "type": "technique", + "id": "VAMPIRE_BITE", + "name": "Vampire Bite", + "melee_allowed": true, + "messages": [ "You bite %s", " bites %s!" ], + "unarmed_allowed": true, + "weighting": -5, + "reach_ok": false, + "attack_vectors": [ "vector_bite" ], + "condition": { + "and": [ + { "not": { "u_has_effect": "natural_stance" } }, + { "and": [ { "not": { "npc_has_flag": "GRAB_FILTER" } }, { "not": { "u_has_effect": "GRAB" } } ] } + ] + }, + "tech_effects": [ + { + "id": "anticoagulant_draculin", + "chance": 90, + "duration": 3000, + "on_damage": true, + "message": "Saliva glistens across %s's wound!", + "req_flag": "DRACULIN_VENOM" + } + ], + "flat_bonuses": [ + { "stat": "damage", "type": "stab", "scaling-stat": "unarmed", "scale": 1.0 }, + { "stat": "damage", "type": "bash", "scaling-stat": "str", "scale": 0.75 }, + { "stat": "damage", "type": "bash", "scaling-stat": "unarmed", "scale": 0.06 }, + { "stat": "movecost", "scaling-stat": "melee", "scale": -1.25 }, + { "stat": "movecost", "scaling-stat": "dex", "scale": -0.5 } + ] + }, + { + "type": "technique", + "id": "VAMPIRE_BITE_NATURAL", + "name": "Vampire Bite", + "melee_allowed": true, + "messages": [ "You bite %s", " bites %s!" ], + "unarmed_allowed": true, + "weighting": -2, + "reach_ok": false, + "attack_vectors": [ "vector_bite" ], + "tech_effects": [ + { + "id": "anticoagulant_draculin", + "chance": 90, + "duration": 3000, + "on_damage": true, + "message": "Saliva glistens across %s's wound!", + "req_flag": "DRACULIN_VENOM" + } + ], + "condition": { + "and": [ + { + "or": [ { "u_has_effect": "natural_stance" }, { "and": [ { "npc_has_flag": "GRAB_FILTER" }, { "u_has_flag": "GRAB" } ] } ] + } + ] + }, + "flat_bonuses": [ + { "stat": "damage", "type": "stab", "scaling-stat": "unarmed", "scale": 1.0 }, + { "stat": "damage", "type": "bash", "scaling-stat": "str", "scale": 0.75 }, + { "stat": "damage", "type": "bash", "scaling-stat": "unarmed", "scale": 0.06 }, + { "stat": "movecost", "scaling-stat": "melee", "scale": -1.25 }, + { "stat": "movecost", "scaling-stat": "dex", "scale": -0.5 } + ] + }, + { + "type": "technique", + "id": "VAMPIRE_BITE_CRIT", + "name": "Critical Vampire Bite", + "melee_allowed": true, + "messages": [ "You sink your fangs deep into %s!", " sinks their fangs deep into %s!" ], + "unarmed_allowed": true, + "weighting": -4, + "reach_ok": false, + "crit_tec": true, + "tech_effects": [ + { + "id": "anticoagulant_draculin", + "chance": 100, + "duration": 6000, + "on_damage": true, + "message": "Saliva glistens across %s's wound!", + "req_flag": "DRACULIN_VENOM" + } + ], + "attack_vectors": [ "vector_bite" ], + "flat_bonuses": [ + { "stat": "damage", "type": "stab", "scaling-stat": "unarmed", "scale": 4.4 }, + { "stat": "damage", "type": "bash", "scaling-stat": "str", "scale": 0.75 }, + { "stat": "damage", "type": "bash", "scaling-stat": "unarmed", "scale": 0.24 }, + { "stat": "arpen", "type": "bash", "scaling-stat": "unarmed", "scale": 1 }, + { "stat": "arpen", "type": "stab", "scaling-stat": "unarmed", "scale": 1 }, + { "stat": "movecost", "scaling-stat": "melee", "scale": -1.25 }, + { "stat": "movecost", "scaling-stat": "dex", "scale": -0.5 } ] } ] diff --git a/data/json/mutations/mutations.json b/data/json/mutations/mutations.json index 47597d00eb9fd..693706ebec38e 100644 --- a/data/json/mutations/mutations.json +++ b/data/json/mutations/mutations.json @@ -3612,7 +3612,6 @@ "visibility": 3, "ugliness": 2, "integrated_armor": [ "integrated_claws" ], - "flags": [ "UNARMED_BONUS" ], "description": "You have claws on the ends of your fingers. If you aren't wearing gloves, your unarmed attacks deal a minor amount of cutting damage.", "types": [ "CLAWS" ], "prereqs": [ "NAILS" ], @@ -3628,7 +3627,6 @@ "visibility": 3, "ugliness": 4, "integrated_armor": [ "integrated_claws_rat" ], - "flags": [ "UNARMED_BONUS" ], "description": "Your claws have grown tougher and slightly gnarled.", "types": [ "CLAWS" ], "prereqs": [ "CLAWS" ], @@ -3770,7 +3768,6 @@ "visibility": 4, "ugliness": 3, "integrated_armor": [ "integrated_talons" ], - "flags": [ "UNARMED_BONUS" ], "mixed_effect": true, "description": "Your index fingers have grown into huge talons. After a bit of practice, you find that this does not affect your dexterity, but allows for a deadly unarmed attack. They also prevent wearing gloves.", "types": [ "CLAWS" ], diff --git a/data/json/techniques.json b/data/json/techniques.json index 657e81f65ab52..4e5fad23b5f03 100644 --- a/data/json/techniques.json +++ b/data/json/techniques.json @@ -3,8 +3,40 @@ "type": "technique", "id": "tec_none", "name": "Not a technique at all", + "attack_vectors": [ "vector_null" ], "dummy": true }, + { + "type": "technique", + "id": "tech_base_headbutt", + "name": "Headbutt", + "crit_ok": true, + "unarmed_allowed": true, + "messages": [ "You headbutt %s!", " headbutts %s!" ], + "description": "A basic headbutt", + "skill_requirements": [ { "name": "unarmed", "level": 3 } ], + "attack_vectors": [ "vector_headbutt" ] + }, + { + "type": "technique", + "id": "tech_base_punch", + "name": "Punch", + "crit_ok": true, + "unarmed_allowed": true, + "messages": [ "You punch %s!", " punches %s!" ], + "description": "A basic punch", + "attack_vectors": [ "vector_punch" ] + }, + { + "type": "technique", + "id": "tech_base_kick", + "name": "Kick", + "crit_ok": true, + "unarmed_allowed": true, + "messages": [ "You kick %s!", " kicks %s!" ], + "description": "A basic kick", + "attack_vectors": [ "vector_foot_toes", "vector_knee", "vector_shin" ] + }, { "type": "technique", "id": "WBLOCK_1", @@ -49,7 +81,7 @@ "message": "The weapon of %s has been forced out of their hands!" } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_grasp" ] }, { "type": "technique", @@ -68,7 +100,7 @@ "messages": [ "You swing through %s and everyone nearby", " swings through %s and everyone nearby!" ], "aoe": "spin", "description": "Attack adjacent enemies, crit only, min 4 melee", - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -81,7 +113,7 @@ "messages": [ "You swing in a wide arc through %s", " swings in a wide arc through %s!" ], "aoe": "wide", "description": "Attack in a wide arc, crit only, min 3 melee", - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -93,7 +125,7 @@ "messages": [ "You pierce straight through %s", " pierces through %s!" ], "aoe": "impale", "description": "Attack target and another one behind it, crit only, min 4 melee", - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -147,7 +179,7 @@ "condition_desc": "* Only works on a non-stunned mundane target of similar or smaller size, may fail on enemies grabbing you", "messages": [ "You send %s reeling", " sends %s reeling!" ], "description": "Stun 1 turn, knockback 1 tile, crit only, min 2 melee", - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -163,7 +195,7 @@ ], "messages": [ "You quickly strike %s", " quickly strikes %s!" ], "description": "50% moves, 66% damage, min 2 melee", - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -178,7 +210,7 @@ "Snicker-snack! slices through %s like a hot knife through butter!" ], "description": "Cut damage multiply by 99, crit only", - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -200,7 +232,7 @@ "stun_dur": 2, "messages": [ "You wrap up %s", " wraps up %s!" ], "description": "Stun 2 turns, min 4 melee", - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -222,7 +254,7 @@ "down_dur": 2, "messages": [ "You sweep %s", " sweeps %s!" ], "description": "Down 2 turns, min 3 melee", - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -243,7 +275,7 @@ ], "messages": [ "With a loud crack the piston extends, sending %s reeling", " sends %s reeling!" ], "description": "Stun 1 turn, knockback 2 tile, crit only, requires ammo", - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -264,7 +296,7 @@ "messages": [ "You precisely hit %s", " precisely hits %s!" ], "stun_dur": 2, "description": "Stun 2 turns, crit only, min 3 melee", - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -283,7 +315,7 @@ "message": "The weapon of %s has been forced out ot their hands!" } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -323,7 +355,7 @@ "condition_desc": "* Only works on a non-stunned humanoid target of similar or smaller size", "messages": [ "You jab deftly at %s!", " jabs deftly at %s!" ], "stun_dur": 2, - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -365,7 +397,7 @@ "down_dur": 1, "knockback_dist": 1, "mult_bonuses": [ { "stat": "movecost", "scale": 0.7 } ], - "attack_vectors": [ "THROW" ] + "attack_vectors": [ "vector_grasp" ] }, { "type": "technique", @@ -406,7 +438,7 @@ "down_dur": 1, "knockback_dist": 1, "mult_bonuses": [ { "stat": "movecost", "scale": 0.7 } ], - "attack_vectors": [ "THROW" ] + "attack_vectors": [ "vector_grasp" ] }, { "type": "technique", @@ -458,7 +490,7 @@ "down_dur": 1, "knockback_dist": 1, "mult_bonuses": [ { "stat": "movecost", "scale": 0.7 } ], - "attack_vectors": [ "THROW" ] + "attack_vectors": [ "vector_grasp" ] }, { "type": "technique", @@ -510,7 +542,7 @@ "down_dur": 1, "knockback_dist": 1, "mult_bonuses": [ { "stat": "movecost", "scale": 0.7 } ], - "attack_vectors": [ "THROW" ] + "attack_vectors": [ "vector_grasp" ] }, { "type": "technique", @@ -534,7 +566,7 @@ "skill_requirements": [ { "name": "melee", "level": 1 } ], "melee_allowed": true, "mult_bonuses": [ { "stat": "damage", "type": "bash", "scale": 1.2 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -561,7 +593,7 @@ "condition_desc": "* Only works on a non-downed humanoid target of similar or smaller size incapable of flight", "down_dur": 1, "mult_bonuses": [ { "stat": "movecost", "scale": 0.8 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -587,7 +619,7 @@ "condition_desc": "* Only works on a non-stunned target of similar or smaller size", "stun_dur": 1, "mult_bonuses": [ { "stat": "damage", "type": "bash", "scale": 1.4 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -600,7 +632,7 @@ "weighting": 2, "crit_ok": true, "mult_bonuses": [ { "stat": "movecost", "scale": 0.75 }, { "stat": "damage", "type": "bash", "scale": 1.5 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -631,7 +663,7 @@ "message": "The weapon of %s has been forced out of their hands!" } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -648,7 +680,7 @@ { "stat": "damage", "type": "stab", "scale": 1.1 }, { "stat": "movecost", "scale": 1.2 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -665,7 +697,7 @@ { "stat": "damage", "type": "cut", "scale": 0.66 }, { "stat": "damage", "type": "stab", "scale": 0.66 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -674,7 +706,7 @@ "messages": [ "You throw a heavy cross at %s", " throws a cross at %s!" ], "unarmed_allowed": true, "mult_bonuses": [ { "stat": "damage", "type": "bash", "scale": 1.2 } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_punch" ] }, { "type": "technique", @@ -701,7 +733,7 @@ "condition_desc": "* Only works on a non-downed humanoid target of similar or smaller size incapable of flight", "down_dur": 1, "mult_bonuses": [ { "stat": "damage", "type": "bash", "scale": 1.5 } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_punch" ] }, { "type": "technique", @@ -716,7 +748,7 @@ { "stat": "damage", "type": "cut", "scale": 0.66 }, { "stat": "damage", "type": "stab", "scale": 0.66 } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_punch" ] }, { "type": "technique", @@ -747,7 +779,7 @@ "condition_desc": "* Only works on a non-stunned target of similar size incapable of flight", "stun_dur": 1, "mult_bonuses": [ { "stat": "damage", "type": "bash", "scale": 1.4 } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_punch" ] }, { "type": "technique", @@ -812,7 +844,7 @@ "message": "The weapon of %s has been forced out of their hands!" } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -831,7 +863,7 @@ "message": "The weapon of %s has been forced out of their hands!" } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_grasp" ] }, { "type": "technique", @@ -853,7 +885,7 @@ ] }, "condition_desc": "* Only works on a non-downed and non-stunned target of similar or smaller size incapable of flight", - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_punch" ] }, { "type": "technique", @@ -873,7 +905,7 @@ }, "condition_desc": "* Only works on a non-downed humanoid target of similar size incapable of flight", "down_dur": 1, - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_shin" ] }, { "type": "technique", @@ -896,7 +928,7 @@ { "stat": "damage", "type": "cut", "scale": 1.2 }, { "stat": "damage", "type": "stab", "scale": 1.2 } ], - "attack_vectors": [ "FOOT" ] + "attack_vectors": [ "vector_foot_sole" ] }, { "type": "technique", @@ -911,7 +943,7 @@ { "stat": "damage", "type": "cut", "scale": 1.4 }, { "stat": "damage", "type": "stab", "scale": 1.4 } ], - "attack_vectors": [ "FOOT" ] + "attack_vectors": [ "vector_foot_sole" ] }, { "type": "technique", @@ -939,7 +971,7 @@ { "stat": "damage", "type": "cut", "scale": 1.2 }, { "stat": "damage", "type": "stab", "scale": 1.2 } ], - "attack_vectors": [ "FOOT" ] + "attack_vectors": [ "vector_foot_toes" ] }, { "type": "technique", @@ -960,7 +992,7 @@ { "stat": "damage", "type": "cut", "scale": 1.4 }, { "stat": "damage", "type": "stab", "scale": 1.4 } ], - "attack_vectors": [ "FOOT" ] + "attack_vectors": [ "vector_foot_sole" ] }, { "type": "technique", @@ -995,7 +1027,7 @@ { "stat": "damage", "type": "cut", "scale": 1.25 }, { "stat": "damage", "type": "stab", "scale": 1.25 } ], - "attack_vectors": [ "FOOT" ] + "attack_vectors": [ "vector_foot_toes" ] }, { "type": "technique", @@ -1051,7 +1083,7 @@ { "stat": "damage", "type": "cut", "scale": 1.5 }, { "stat": "damage", "type": "stab", "scale": 1.5 } ], - "attack_vectors": [ "WRIST" ] + "attack_vectors": [ "vector_wrist" ] }, { "type": "technique", @@ -1060,7 +1092,7 @@ "unarmed_allowed": true, "mult_bonuses": [ { "stat": "damage", "type": "bash", "scale": 1.2 } ], "messages": [ "You lash out at %s with a Dragon Claw", " lashes out at %s with a Dragon Claw!" ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_punch" ] }, { "type": "technique", @@ -1086,7 +1118,7 @@ { "stat": "damage", "type": "cut", "scale": 1.4 }, { "stat": "damage", "type": "stab", "scale": 1.4 } ], - "attack_vectors": [ "FOOT" ] + "attack_vectors": [ "vector_foot_heel" ] }, { "type": "technique", @@ -1104,7 +1136,7 @@ { "stat": "damage", "type": "cut", "scale": 1.5 }, { "stat": "damage", "type": "stab", "scale": 1.5 } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_punch" ] }, { "type": "technique", @@ -1114,7 +1146,7 @@ "skill_requirements": [ { "name": "melee", "level": 4 } ], "melee_allowed": true, "mult_bonuses": [ { "stat": "movecost", "scale": 0.6 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -1124,7 +1156,7 @@ "skill_requirements": [ { "name": "melee", "level": 2 } ], "melee_allowed": true, "mult_bonuses": [ { "stat": "movecost", "scale": 0.75 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -1133,7 +1165,7 @@ "messages": [ "You snap out at %s", " snaps quickly at %s!" ], "melee_allowed": true, "mult_bonuses": [ { "stat": "movecost", "scale": 0.8 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -1150,7 +1182,7 @@ { "stat": "damage", "type": "cut", "scale": 1.5 }, { "stat": "damage", "type": "stab", "scale": 1.5 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -1187,7 +1219,7 @@ "condition_desc": "* Only works on a non-stunned mundane target of similar or smaller size", "stun_dur": 1, "mult_bonuses": [ { "stat": "movecost", "scale": 0.8 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -1208,7 +1240,7 @@ }, "condition_desc": "* Only works on a non-downed humanoid target of similar or smaller size incapable of flight", "down_dur": 1, - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -1229,7 +1261,7 @@ "melee_allowed": true, "crit_ok": true, "mult_bonuses": [ { "stat": "movecost", "scale": 0.8 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -1246,7 +1278,7 @@ { "stat": "damage", "type": "cut", "scale": 1.25 }, { "stat": "damage", "type": "stab", "scale": 1.25 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -1263,7 +1295,7 @@ { "stat": "damage", "type": "cut", "scale": 1.25 }, { "stat": "damage", "type": "stab", "scale": 1.25 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -1307,7 +1339,7 @@ { "stat": "damage", "type": "cut", "scale": 1.2 }, { "stat": "damage", "type": "stab", "scale": 1.2 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -1336,7 +1368,7 @@ { "stat": "damage", "type": "cut", "scale": 0.5 }, { "stat": "damage", "type": "stab", "scale": 0.5 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -1352,7 +1384,7 @@ { "stat": "damage", "type": "cut", "scale": 1.1 }, { "stat": "damage", "type": "stab", "scale": 1.1 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -1402,7 +1434,7 @@ { "stat": "damage", "type": "cut", "scale": 0.5 }, { "stat": "damage", "type": "stab", "scale": 0.5 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -1421,7 +1453,7 @@ { "stat": "damage", "type": "cut", "scale": 1.5 }, { "stat": "damage", "type": "stab", "scale": 1.5 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -1443,7 +1475,7 @@ "condition_desc": "* Only works on a non-downed humanoid target of identical size incapable of flight", "down_dur": 1, "mult_bonuses": [ { "stat": "damage", "type": "bash", "scale": 1.25 } ], - "attack_vectors": [ "THROW" ] + "attack_vectors": [ "vector_grasp" ] }, { "type": "technique", @@ -1475,7 +1507,7 @@ "condition_desc": "* Only works on a non-downed humanoid target of identical size incapable of flight", "down_dur": 1, "mult_bonuses": [ { "stat": "damage", "type": "bash", "scale": 1.25 } ], - "attack_vectors": [ "THROW" ] + "attack_vectors": [ "vector_grasp" ] }, { "type": "technique", @@ -1500,7 +1532,7 @@ "down_dur": 1, "stun_dur": 1, "mult_bonuses": [ { "stat": "damage", "type": "bash", "scale": 1.5 } ], - "attack_vectors": [ "THROW" ] + "attack_vectors": [ "vector_grasp" ] }, { "type": "technique", @@ -1555,7 +1587,7 @@ { "stat": "damage", "type": "cut", "scale": 1.4 }, { "stat": "damage", "type": "stab", "scale": 1.4 } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_wrist" ] }, { "type": "technique", @@ -1570,7 +1602,7 @@ { "stat": "damage", "type": "cut", "scale": 0.66 }, { "stat": "damage", "type": "stab", "scale": 0.66 } ], - "attack_vectors": [ "HAND_BACK" ] + "attack_vectors": [ "vector_backhand" ] }, { "type": "technique", @@ -1584,7 +1616,7 @@ { "stat": "damage", "type": "cut", "scale": 1.2 }, { "stat": "damage", "type": "stab", "scale": 1.2 } ], - "attack_vectors": [ "FOOT" ] + "attack_vectors": [ "vector_foot_toes" ] }, { "type": "technique", @@ -1595,7 +1627,7 @@ "melee_allowed": true, "weapon_categories_allowed": "QUARTERSTAVES", "mult_bonuses": [ { "stat": "movecost", "scale": 0.9 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -1622,7 +1654,7 @@ { "stat": "damage", "type": "cut", "scale": 1.1 }, { "stat": "damage", "type": "stab", "scale": 1.1 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -1637,7 +1669,7 @@ { "stat": "damage", "type": "cut", "scale": 0.66 }, { "stat": "damage", "type": "stab", "scale": 0.66 } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_punch" ] }, { "type": "technique", @@ -1650,7 +1682,7 @@ { "stat": "damage", "type": "cut", "scale": 1.2 }, { "stat": "damage", "type": "stab", "scale": 1.2 } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_punch" ] }, { "type": "technique", @@ -1682,7 +1714,7 @@ }, "condition_desc": "* Only works on a target of similar or smaller size, may fail on enemies grabbing you", "knockback_dist": 1, - "attack_vectors": [ "FOOT" ] + "attack_vectors": [ "vector_foot_sole" ] }, { "type": "technique", @@ -1731,7 +1763,7 @@ "condition_desc": "* Only works on a non-stunned target of similar size incapable of flight", "stun_dur": 1, "mult_bonuses": [ { "stat": "damage", "type": "bash", "scale": 1.4 } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_punch" ] }, { "type": "technique", @@ -1747,7 +1779,7 @@ { "stat": "damage", "type": "cut", "scale": 1.4 }, { "stat": "damage", "type": "stab", "scale": 1.4 } ], - "attack_vectors": [ "FOOT" ] + "attack_vectors": [ "vector_foot_toes" ] }, { "type": "technique", @@ -1763,7 +1795,7 @@ { "stat": "damage", "type": "cut", "scale": 0.66 }, { "stat": "damage", "type": "stab", "scale": 0.66 } ], - "attack_vectors": [ "WEAPON", "HAND" ] + "attack_vectors": [ "vector_null", "vector_punch" ] }, { "type": "technique", @@ -1784,7 +1816,7 @@ "message": "The weapon of %s has been forced out of their hands!" } ], - "attack_vectors": [ "WEAPON", "HAND" ] + "attack_vectors": [ "vector_null", "vector_grasp" ] }, { "type": "technique", @@ -1822,8 +1854,7 @@ }, "condition_desc": "* Only works on a non-stunned mundane target of similar or smaller size", "stun_dur": 1, - "attack_vectors": [ "WEAPON" ], - "attack_vectors_random": [ "HAND", "FINGERS", "FOOT", "ELBOW", "KNEE", "LOWER_LEG", "HEAD" ] + "attack_vectors": [ "vector_null", "vector_headbutt", "vector_punch", "vector_elbow", "vector_foot_toes", "vector_shin", "vector_knee" ] }, { "type": "technique", @@ -1845,7 +1876,7 @@ }, "condition_desc": "* Only works on a non-downed humanoid target of similar or smaller size incapable of flight", "down_dur": 1, - "attack_vectors": [ "THROW" ] + "attack_vectors": [ "vector_grasp" ] }, { "type": "technique", @@ -1877,7 +1908,7 @@ ], "flat_bonuses": [ { "stat": "arpen", "type": "bash", "scaling-stat": "str", "scale": 1.0 } ], "mult_bonuses": [ { "stat": "damage", "type": "bash", "scale": 2.0 } ], - "attack_vectors": [ "GRAPPLE" ] + "attack_vectors": [ "vector_arm_grapple" ] }, { "type": "technique", @@ -1935,7 +1966,7 @@ "condition_desc": "* Only works on a non-stunned mundane target of similar or smaller size", "stun_dur": 1, "mult_bonuses": [ { "stat": "movecost", "scale": 0.5 } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_punch" ] }, { "type": "technique", @@ -1949,7 +1980,7 @@ { "stat": "damage", "type": "cut", "scale": 0.66 }, { "stat": "damage", "type": "stab", "scale": 0.66 } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_punch" ] }, { "type": "technique", @@ -1959,7 +1990,7 @@ "unarmed_allowed": true, "crit_tec": true, "mult_bonuses": [ { "stat": "movecost", "scale": 0.8 }, { "stat": "damage", "type": "bash", "scale": 1.3 } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_punch" ] }, { "type": "technique", @@ -1980,7 +2011,7 @@ "condition_desc": "* Only works on a non-downed humanoid target of identical or smaller size incapable of flight", "down_dur": 1, "mult_bonuses": [ { "stat": "movecost", "scale": 0.8 }, { "stat": "damage", "type": "bash", "scale": 2.0 } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_punch" ] }, { "type": "technique", @@ -2006,7 +2037,7 @@ }, "condition_desc": "* Only works on a non-downed humanoid target of similar or smaller size incapable of flight", "down_dur": 2, - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -2023,7 +2054,7 @@ { "stat": "arpen", "type": "stab", "scaling-stat": "str", "scale": 1.5 } ], "mult_bonuses": [ { "stat": "damage", "type": "bash", "scale": 0 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -2051,7 +2082,7 @@ { "stat": "damage", "type": "cut", "scale": 0.66 }, { "stat": "damage", "type": "stab", "scale": 0.66 } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_punch" ] }, { "type": "technique", @@ -2064,7 +2095,7 @@ { "stat": "damage", "type": "cut", "scale": 1.2 }, { "stat": "damage", "type": "stab", "scale": 1.2 } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_punch" ] }, { "type": "technique", @@ -2076,7 +2107,7 @@ "crit_tec": true, "flat_bonuses": [ { "stat": "damage", "type": "cut", "scale": 2 } ], "mult_bonuses": [ { "stat": "movecost", "scale": 0.66 } ], - "attack_vectors": [ "ELBOW" ] + "attack_vectors": [ "vector_elbow" ] }, { "type": "technique", @@ -2091,7 +2122,7 @@ { "stat": "damage", "type": "cut", "scale": 1.4 }, { "stat": "damage", "type": "stab", "scale": 1.4 } ], - "attack_vectors_random": [ "LOWER_LEG", "FOOT" ] + "attack_vectors": [ "vector_shin", "vector_foot_toes" ] }, { "type": "technique", @@ -2123,7 +2154,7 @@ }, "condition_desc": "* Only works on a target of similar or smaller size, may fail on enemies grabbing you", "knockback_dist": 1, - "attack_vectors": [ "FOOT" ] + "attack_vectors": [ "vector_foot_sole" ] }, { "type": "technique", @@ -2160,7 +2191,7 @@ }, "condition_desc": "* Only works on a non-stunned mundane target of similar or smaller size", "mult_bonuses": [ { "stat": "damage", "type": "bash", "scale": 1.35 } ], - "attack_vectors": [ "KNEE" ] + "attack_vectors": [ "vector_knee" ] }, { "type": "technique", @@ -2185,8 +2216,7 @@ "unarmed_allowed": true, "melee_allowed": true, "mult_bonuses": [ { "stat": "movecost", "scale": 0.8 } ], - "attack_vectors": [ "WEAPON" ], - "attack_vectors_random": [ "HAND", "ELBOW", "LOWER_LEG", "FOOT" ] + "attack_vectors": [ "vector_null", "vector_punch", "vector_elbow", "vector_foot_toes", "vector_shin" ] }, { "type": "technique", @@ -2199,8 +2229,7 @@ "required_buffs_all": [ "buff_ninjutsu_onattack" ], "crit_tec": true, "mult_bonuses": [ { "stat": "movecost", "scale": 0.8 } ], - "attack_vectors": [ "WEAPON" ], - "attack_vectors_random": [ "HAND", "ELBOW", "LOWER_LEG", "FOOT" ] + "attack_vectors": [ "vector_null", "vector_punch", "vector_elbow", "vector_foot_toes", "vector_shin" ] }, { "type": "technique", @@ -2217,7 +2246,7 @@ { "stat": "damage", "type": "cut", "scale": 1.3 }, { "stat": "damage", "type": "stab", "scale": 1.3 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -2240,7 +2269,7 @@ "down_dur": 2, "weighting": 3, "mult_bonuses": [ { "stat": "damage", "type": "bash", "scale": 2.0 } ], - "attack_vectors": [ "THROW" ] + "attack_vectors": [ "vector_grasp" ] }, { "type": "technique", @@ -2264,7 +2293,7 @@ "down_dur": 2, "weighting": 3, "mult_bonuses": [ { "stat": "damage", "type": "bash", "scale": 2.0 } ], - "attack_vectors": [ "THROW" ] + "attack_vectors": [ "vector_grasp" ] }, { "type": "technique", @@ -2289,7 +2318,7 @@ "condition_desc": "* Only works on a non-downed humanoid target of similar or smaller size incapable of flight", "down_dur": 2, "weighting": 2, - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -2330,8 +2359,7 @@ "stun_dur": 2, "disarms": true, "tech_effects": [ { "id": "disarmed", "chance": 100, "duration": 400, "on_damage": true, "message": "The hand of %s is forced open!" } ], - "attack_vectors": [ "WEAPON" ], - "attack_vectors_random": [ "HAND", "ELBOW", "LOWER_LEG", "FOOT" ] + "attack_vectors": [ "vector_null", "vector_punch", "vector_elbow", "vector_foot_heel", "vector_shin" ] }, { "type": "technique", @@ -2345,7 +2373,7 @@ { "stat": "damage", "type": "bash", "scale": 2.0 }, { "stat": "damage", "type": "cut", "scale": 2.0 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -2364,7 +2392,7 @@ }, "condition_desc": "* Only works on a non-downed humanoid target of similar or smaller size incapable of flight", "down_dur": 1, - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -2405,7 +2433,7 @@ { "stat": "damage", "type": "cut", "scale": 1.5 }, { "stat": "damage", "type": "stab", "scale": 1.5 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -2447,7 +2475,7 @@ { "stat": "damage", "type": "bash", "scale": 1.5 }, { "stat": "damage", "type": "cut", "scale": 1.5 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -2471,7 +2499,7 @@ { "stat": "damage", "type": "cut", "scale": 1.2 }, { "stat": "damage", "type": "stab", "scale": 1.2 } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_punch" ] }, { "type": "technique", @@ -2493,7 +2521,7 @@ }, "condition_desc": "* Only works on a non-downed humanoid target of similar or smaller size incapable of flight", "down_dur": 2, - "attack_vectors": [ "FOOT" ] + "attack_vectors": [ "vector_foot_sole" ] }, { "type": "technique", @@ -2516,7 +2544,7 @@ "condition_desc": "* Only works on a downed target", "weighting": 3, "mult_bonuses": [ { "stat": "movecost", "scale": 0.5 } ], - "attack_vectors": [ "KNEE" ] + "attack_vectors": [ "vector_knee" ] }, { "type": "technique", @@ -2533,7 +2561,7 @@ "tech_effects": [ { "id": "disarmed", "chance": 100, "duration": 400, "on_damage": true, "message": "The hand of %s is forced open!" } ], "flat_bonuses": [ { "stat": "arpen", "type": "bash", "scaling-stat": "str", "scale": 1.0 } ], "mult_bonuses": [ { "stat": "damage", "type": "bash", "scale": 1.25 } ], - "attack_vectors": [ "GRAPPLE" ] + "attack_vectors": [ "vector_arm_grapple" ] }, { "type": "technique", @@ -2575,7 +2603,7 @@ }, "condition_desc": "* Only works on a non-downed humanoid target of similar or smaller size incapable of flight, may fail on targets grabbing you", "mult_bonuses": [ { "stat": "damage", "type": "bash", "scale": 2.0 } ], - "attack_vectors": [ "THROW" ] + "attack_vectors": [ "vector_grasp" ] }, { "type": "technique", @@ -2595,7 +2623,7 @@ }, "condition_desc": "* Only works on a non-downed humanoid target of similar or smaller size incapable of flight", "down_dur": 2, - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -2613,7 +2641,7 @@ { "stat": "damage", "type": "cut", "scale": 1.33 }, { "stat": "damage", "type": "stab", "scale": 1.33 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -2649,7 +2677,7 @@ }, "condition_desc": "* Only works on a non-stunned mundane target of similar or smaller size", "stun_dur": 2, - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -2667,7 +2695,7 @@ { "stat": "damage", "type": "cut", "scale": 1.33 }, { "stat": "damage", "type": "stab", "scale": 1.33 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -2682,7 +2710,7 @@ { "stat": "arpen", "type": "stab", "scaling-stat": "per", "scale": 0.5 } ], "mult_bonuses": [ { "stat": "movecost", "scale": 0.8 } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_punch" ] }, { "type": "technique", @@ -2745,7 +2773,7 @@ { "stat": "arpen", "type": "stab", "scaling-stat": "per", "scale": 1.0 } ], "mult_bonuses": [ { "stat": "damage", "type": "bash", "scale": 1.5 } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_punch" ] }, { "type": "technique", @@ -2782,7 +2810,7 @@ { "stat": "damage", "type": "cut", "scale": 0.5 }, { "stat": "damage", "type": "stab", "scale": 0.5 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -2807,7 +2835,7 @@ { "stat": "damage", "type": "cut", "scale": 0.5 }, { "stat": "damage", "type": "stab", "scale": 0.5 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -2823,7 +2851,7 @@ { "stat": "damage", "type": "cut", "scale": 0.66 }, { "stat": "damage", "type": "stab", "scale": 0.66 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -2845,7 +2873,7 @@ "weighting": 2, "take_weapon": true, "mult_bonuses": [ { "stat": "damage", "type": "bash", "scale": 0.5 } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_grasp" ] }, { "type": "technique", @@ -2893,7 +2921,7 @@ { "stat": "damage", "type": "cut", "scale": 1.5 }, { "stat": "damage", "type": "stab", "scale": 1.5 } ], - "attack_vectors": [ "FOOT" ] + "attack_vectors": [ "vector_foot_heel" ] }, { "type": "technique", @@ -2925,7 +2953,7 @@ }, "condition_desc": "* Only works on a target of similar or smaller size, may fail on enemies grabbing you", "knockback_dist": 1, - "attack_vectors": [ "FOOT" ] + "attack_vectors": [ "vector_foot_sole" ] }, { "type": "technique", @@ -2946,7 +2974,7 @@ }, "condition_desc": "* Only works on a non-downed humanoid target of similar or smaller size incapable of flight", "down_dur": 1, - "attack_vectors_random": [ "FOOT", "LOWER_LEG" ] + "attack_vectors": [ "vector_foot_toes", "vector_shin" ] }, { "type": "technique", @@ -2960,7 +2988,7 @@ { "stat": "damage", "type": "cut", "scale": 1.2 }, { "stat": "damage", "type": "stab", "scale": 1.2 } ], - "attack_vectors": [ "FOOT" ] + "attack_vectors": [ "vector_foot_toes" ] }, { "type": "technique", @@ -2990,7 +3018,7 @@ "message": "The weapon of %s has been forced out of their hands!" } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_grasp" ] }, { "type": "technique", @@ -3028,7 +3056,7 @@ { "stat": "damage", "type": "cut", "scale": 1.5 }, { "stat": "damage", "type": "stab", "scale": 1.5 } ], - "attack_vectors": [ "PALM" ] + "attack_vectors": [ "vector_palm" ] }, { "type": "technique", @@ -3055,7 +3083,7 @@ { "stat": "damage", "type": "cut", "scale": 1.2 }, { "stat": "damage", "type": "stab", "scale": 1.2 } ], - "attack_vectors": [ "THROW" ] + "attack_vectors": [ "vector_grasp" ] }, { "type": "technique", @@ -3114,7 +3142,7 @@ { "stat": "damage", "type": "cut", "scale": 2.0 }, { "stat": "damage", "type": "stab", "scale": 2.0 } ], - "attack_vectors": [ "PALM" ] + "attack_vectors": [ "vector_palm" ] }, { "type": "technique", @@ -3146,7 +3174,7 @@ "condition_desc": "* Only works on a non-downed humanoid target of similar or smaller size incapable of flight", "down_dur": 1, "mult_bonuses": [ { "stat": "damage", "type": "bash", "scale": 1.25 } ], - "attack_vectors": [ "THROW" ] + "attack_vectors": [ "vector_grasp" ] }, { "type": "technique", @@ -3166,7 +3194,7 @@ { "stat": "damage", "type": "cut", "scale": 1.25 }, { "stat": "damage", "type": "stab", "scale": 1.25 } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_palm" ] }, { "type": "technique", @@ -3207,7 +3235,7 @@ { "stat": "damage", "type": "cut", "scale": 1.25 }, { "stat": "damage", "type": "stab", "scale": 1.25 } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_punch" ] }, { "type": "technique", @@ -3224,7 +3252,7 @@ { "stat": "damage", "type": "cut", "scale": 1.25 }, { "stat": "damage", "type": "stab", "scale": 1.25 } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_punch" ] }, { "type": "technique", @@ -3237,7 +3265,7 @@ { "stat": "damage", "type": "cut", "scale": 1.1 }, { "stat": "damage", "type": "stab", "scale": 1.1 } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_punch" ] }, { "type": "technique", @@ -3277,7 +3305,7 @@ { "stat": "damage", "type": "cut", "scale": 1.1 }, { "stat": "damage", "type": "stab", "scale": 1.1 } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_punch" ] }, { "type": "technique", @@ -3302,7 +3330,7 @@ { "stat": "damage", "type": "cut", "scale": 1.2 }, { "stat": "damage", "type": "stab", "scale": 1.2 } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_punch" ] }, { "type": "technique", @@ -3347,7 +3375,7 @@ { "stat": "damage", "type": "cut", "scale": 1.2 }, { "stat": "damage", "type": "stab", "scale": 1.2 } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_punch" ] }, { "type": "technique", @@ -3381,7 +3409,7 @@ { "stat": "damage", "type": "cut", "scale": 1.2 }, { "stat": "damage", "type": "stab", "scale": 1.2 } ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_punch" ] }, { "type": "technique", @@ -3409,7 +3437,7 @@ { "stat": "damage", "type": "cut", "scale": 1.3 }, { "stat": "damage", "type": "stab", "scale": 1.3 } ], - "attack_vectors_random": [ "HAND", "FOOT" ] + "attack_vectors": [ "vector_punch", "vector_foot_toes" ] }, { "type": "technique", @@ -3424,7 +3452,7 @@ ], "messages": [ "You quickly strike %s!", " quickly strikes %s!" ], "description": "50% moves, 66% damage", - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -3438,7 +3466,7 @@ ], "flat_bonuses": [ { "stat": "movecost", "scale": 100 }, { "stat": "movecost", "scaling-stat": "str", "scale": 10 } ], "messages": [ "You slowly strike %s!", " slowly strikes %s!" ], - "attack_vectors": [ "HAND" ] + "attack_vectors": [ "vector_punch" ] }, { "type": "technique", @@ -3459,7 +3487,7 @@ ], "crit_tec": true, "messages": [ "You phase-strike %s!", " phase-strikes %s!" ], - "attack_vectors": [ "WEAPON", "HAND" ] + "attack_vectors": [ "vector_null", "vector_punch" ] }, { "type": "technique", @@ -3480,231 +3508,6 @@ ] } ], - "attack_vectors": [ "WEAPON", "HAND" ] - }, - { - "type": "technique", - "id": "FANGS_BITE", - "name": "Fang Bite", - "melee_allowed": true, - "messages": [ "You bite %s", " bites %s!" ], - "unarmed_allowed": true, - "weighting": -5, - "reach_ok": false, - "attack_override": true, - "crit_ok": true, - "crit_tec_id": "FANGS_BITE_CRIT", - "attack_vectors": [ "MOUTH" ], - "condition": { - "and": [ - { "not": { "u_has_effect": "natural_stance" } }, - { "and": [ { "not": { "npc_has_flag": "GRAB_FILTER" } }, { "not": { "u_has_effect": "GRAB" } } ] } - ] - }, - "tech_effects": [ - { - "id": "anticoagulant_draculin", - "chance": 70, - "duration": 3000, - "on_damage": true, - "message": "Saliva glistens across %s's wound!", - "req_flag": "DRACULIN_VENOM" - } - ], - "flat_bonuses": [ - { "stat": "damage", "type": "stab", "scale": 9 }, - { "stat": "damage", "type": "stab", "scaling-stat": "unarmed", "scale": 1.0 }, - { "stat": "damage", "type": "bash", "scaling-stat": "str", "scale": 0.75 }, - { "stat": "damage", "type": "bash", "scaling-stat": "unarmed", "scale": 0.06 }, - { "stat": "movecost", "scale": 75 }, - { "stat": "movecost", "scaling-stat": "melee", "scale": -1.25 }, - { "stat": "movecost", "scaling-stat": "dex", "scale": -0.5 } - ] - }, - { - "type": "technique", - "id": "FANGS_BITE_NATURAL", - "name": "Fang Bite", - "melee_allowed": true, - "messages": [ "You bite %s", " bites %s!" ], - "unarmed_allowed": true, - "weighting": -2, - "reach_ok": false, - "attack_override": true, - "crit_ok": true, - "crit_tec_id": "FANGS_BITE_CRIT", - "attack_vectors": [ "MOUTH" ], - "condition": { - "and": [ - { - "or": [ { "u_has_effect": "natural_stance" }, { "and": [ { "npc_has_flag": "GRAB_FILTER" }, { "u_has_flag": "GRAB" } ] } ] - } - ] - }, - "tech_effects": [ - { - "id": "anticoagulant_draculin", - "chance": 70, - "duration": 3000, - "on_damage": true, - "message": "Saliva glistens across %s's wound!", - "req_flag": "DRACULIN_VENOM" - } - ], - "flat_bonuses": [ - { "stat": "damage", "type": "stab", "scale": 9 }, - { "stat": "damage", "type": "stab", "scaling-stat": "unarmed", "scale": 1.0 }, - { "stat": "damage", "type": "bash", "scaling-stat": "str", "scale": 0.75 }, - { "stat": "damage", "type": "bash", "scaling-stat": "unarmed", "scale": 0.06 }, - { "stat": "movecost", "scale": 75 }, - { "stat": "movecost", "scaling-stat": "melee", "scale": -1.25 }, - { "stat": "movecost", "scaling-stat": "dex", "scale": -0.5 } - ] - }, - { - "type": "technique", - "id": "FANGS_BITE_CRIT", - "name": "Critical Fang Bite", - "melee_allowed": true, - "messages": [ "You deliver a wicked bite to %s", " delivers a wicked bite to %s!" ], - "unarmed_allowed": true, - "reach_ok": false, - "attack_override": true, - "crit_tec": true, - "attack_vectors": [ "MOUTH" ], - "tech_effects": [ - { - "id": "anticoagulant_draculin", - "chance": 90, - "duration": 6000, - "on_damage": true, - "message": "Saliva glistens across %s's wound!", - "req_flag": "DRACULIN_VENOM" - } - ], - "flat_bonuses": [ - { "stat": "damage", "type": "stab", "scale": 9 }, - { "stat": "damage", "type": "stab", "scaling-stat": "unarmed", "scale": 4.4 }, - { "stat": "damage", "type": "bash", "scaling-stat": "str", "scale": 0.75 }, - { "stat": "damage", "type": "bash", "scaling-stat": "unarmed", "scale": 0.24 }, - { "stat": "arpen", "type": "bash", "scaling-stat": "unar,ed", "scale": 1 }, - { "stat": "arpen", "type": "stab", "scaling-stat": "unarmed", "scale": 1 }, - { "stat": "movecost", "scale": 75 }, - { "stat": "movecost", "scaling-stat": "melee", "scale": -1.25 }, - { "stat": "movecost", "scaling-stat": "dex", "scale": -0.5 } - ] - }, - { - "type": "technique", - "id": "VAMPIRE_BITE", - "name": "Vampire Bite", - "melee_allowed": true, - "messages": [ "You bite %s", " bites %s!" ], - "unarmed_allowed": true, - "weighting": -5, - "reach_ok": false, - "attack_override": true, - "crit_ok": true, - "crit_tec_id": "VAMPIRE_BITE_CRIT", - "attack_vectors": [ "MOUTH" ], - "condition": { - "and": [ - { "not": { "u_has_effect": "natural_stance" } }, - { "and": [ { "not": { "npc_has_flag": "GRAB_FILTER" } }, { "not": { "u_has_effect": "GRAB" } } ] } - ] - }, - "tech_effects": [ - { - "id": "anticoagulant_draculin", - "chance": 90, - "duration": 3000, - "on_damage": true, - "message": "Saliva glistens across %s's wound!", - "req_flag": "DRACULIN_VENOM" - } - ], - "flat_bonuses": [ - { "stat": "damage", "type": "stab", "scale": 15 }, - { "stat": "damage", "type": "stab", "scaling-stat": "unarmed", "scale": 1.0 }, - { "stat": "damage", "type": "bash", "scaling-stat": "str", "scale": 0.75 }, - { "stat": "damage", "type": "bash", "scaling-stat": "unarmed", "scale": 0.06 }, - { "stat": "movecost", "scale": 75 }, - { "stat": "movecost", "scaling-stat": "melee", "scale": -1.25 }, - { "stat": "movecost", "scaling-stat": "dex", "scale": -0.5 } - ] - }, - { - "type": "technique", - "id": "VAMPIRE_BITE_NATURAL", - "name": "Vampire Bite", - "melee_allowed": true, - "messages": [ "You bite %s", " bites %s!" ], - "unarmed_allowed": true, - "weighting": -2, - "reach_ok": false, - "attack_override": true, - "crit_ok": true, - "crit_tec_id": "VAMPIRE_BITE_CRIT", - "attack_vectors": [ "MOUTH" ], - "tech_effects": [ - { - "id": "anticoagulant_draculin", - "chance": 90, - "duration": 3000, - "on_damage": true, - "message": "Saliva glistens across %s's wound!", - "req_flag": "DRACULIN_VENOM" - } - ], - "condition": { - "and": [ - { - "or": [ { "u_has_effect": "natural_stance" }, { "and": [ { "npc_has_flag": "GRAB_FILTER" }, { "u_has_flag": "GRAB" } ] } ] - } - ] - }, - "flat_bonuses": [ - { "stat": "damage", "type": "stab", "scale": 15 }, - { "stat": "damage", "type": "stab", "scaling-stat": "unarmed", "scale": 1.0 }, - { "stat": "damage", "type": "bash", "scaling-stat": "str", "scale": 0.75 }, - { "stat": "damage", "type": "bash", "scaling-stat": "unarmed", "scale": 0.06 }, - { "stat": "movecost", "scale": 75 }, - { "stat": "movecost", "scaling-stat": "melee", "scale": -1.25 }, - { "stat": "movecost", "scaling-stat": "dex", "scale": -0.5 } - ] - }, - { - "type": "technique", - "id": "VAMPIRE_BITE_CRIT", - "name": "Critical Vampire Bite", - "melee_allowed": true, - "messages": [ "You sink your fangs deep into %s!", " sinks their fangs deep into %s!" ], - "unarmed_allowed": true, - "weighting": -4, - "reach_ok": false, - "attack_override": true, - "crit_tec": true, - "tech_effects": [ - { - "id": "anticoagulant_draculin", - "chance": 100, - "duration": 6000, - "on_damage": true, - "message": "Saliva glistens across %s's wound!", - "req_flag": "DRACULIN_VENOM" - } - ], - "attack_vectors": [ "MOUTH" ], - "flat_bonuses": [ - { "stat": "damage", "type": "stab", "scale": 15 }, - { "stat": "damage", "type": "stab", "scaling-stat": "unarmed", "scale": 4.4 }, - { "stat": "damage", "type": "bash", "scaling-stat": "str", "scale": 0.75 }, - { "stat": "damage", "type": "bash", "scaling-stat": "unarmed", "scale": 0.24 }, - { "stat": "arpen", "type": "bash", "scaling-stat": "unarmed", "scale": 1 }, - { "stat": "arpen", "type": "stab", "scaling-stat": "unarmed", "scale": 1 }, - { "stat": "movecost", "scale": 75 }, - { "stat": "movecost", "scaling-stat": "melee", "scale": -1.25 }, - { "stat": "movecost", "scaling-stat": "dex", "scale": -0.5 } - ] + "attack_vectors": [ "vector_null", "vector_wrist" ] } ] diff --git a/data/mods/Limb_WIP/mutations/mutation_limbs.json b/data/mods/Limb_WIP/mutations/mutation_limbs.json index 7beceb51e8516..c9ccd484b6bf1 100644 --- a/data/mods/Limb_WIP/mutations/mutation_limbs.json +++ b/data/mods/Limb_WIP/mutations/mutation_limbs.json @@ -358,6 +358,7 @@ [ "crawl", 0.2 ] ], "smash_message": "You buffet the %s with your wing.", + "techniques": [ "tech_wing_slap" ], "side": "left", "base_hp": 45, "sub_parts": [ diff --git a/data/mods/Limb_WIP/mutations/mutation_techs.json b/data/mods/Limb_WIP/mutations/mutation_techs.json new file mode 100644 index 0000000000000..318842aec9aec --- /dev/null +++ b/data/mods/Limb_WIP/mutations/mutation_techs.json @@ -0,0 +1,13 @@ +[ + { + "type": "technique", + "id": "tech_wing_slap", + "name": "Wing Slap", + "crit_ok": true, + "unarmed_allowed": true, + "messages": [ "You slap %s with your wings", " slaps %s with their wings" ], + "description": "A slap of the wings.", + "attack_vectors": [ "vector_wing_slap" ], + "flat_bonuses": [ { "stat": "movecost", "scale": 20 } ] + } +] diff --git a/data/mods/Limb_WIP/mutations/mutation_vectors.json b/data/mods/Limb_WIP/mutations/mutation_vectors.json new file mode 100644 index 0000000000000..316b415a11cc0 --- /dev/null +++ b/data/mods/Limb_WIP/mutations/mutation_vectors.json @@ -0,0 +1,8 @@ +[ + { + "type": "attack_vector", + "id": "vector_wing_slap", + "limbs": [ "arm_wing_bird_l", "arm_wing_bird_r" ], + "contact_area": [ "arm_wing_bird_lower_r", "arm_wing_bird_lower_l" ] + } +] diff --git a/data/mods/MMA/techniques.json b/data/mods/MMA/techniques.json index beca51c0fb43c..6cf652b9b9c1e 100644 --- a/data/mods/MMA/techniques.json +++ b/data/mods/MMA/techniques.json @@ -6,7 +6,7 @@ "messages": [ "You unleash a fiery attack against %s!", " unleash a fiery attack against %s!" ], "melee_allowed": true, "flat_bonuses": [ { "stat": "damage", "type": "heat", "scale": 3.0 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -17,7 +17,7 @@ "melee_allowed": true, "crit_tec": true, "flat_bonuses": [ { "stat": "damage", "type": "heat", "scale": 7.0 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -29,7 +29,7 @@ "crit_ok": true, "aoe": "impale", "flat_bonuses": [ { "stat": "damage", "type": "heat", "scale": 7.0 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -44,7 +44,7 @@ "crit_tec": true, "aoe": "spin", "flat_bonuses": [ { "stat": "damage", "type": "heat", "scale": 10.0 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -54,7 +54,7 @@ "skill_requirements": [ { "name": "melee", "level": 2 } ], "melee_allowed": true, "aoe": "wide", - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -64,7 +64,7 @@ "skill_requirements": [ { "name": "melee", "level": 1 } ], "melee_allowed": true, "flat_bonuses": [ { "stat": "damage", "type": "stab", "scaling-stat": "int", "scale": 0.5 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -75,7 +75,7 @@ "melee_allowed": true, "crit_tec": true, "flat_bonuses": [ { "stat": "damage", "type": "stab", "scaling-stat": "int", "scale": 1.0 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -90,7 +90,7 @@ "required_buffs_any": [ "mma_buff_hylian_onpause", "mma_buff_hylian_spin" ], "crit_ok": true, "aoe": "spin", - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -105,7 +105,7 @@ "required_buffs_any": [ "mma_buff_hylian_onpause", "mma_buff_hylian_spin" ], "crit_ok": true, "aoe": "wide", - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -123,7 +123,7 @@ "message": "The weapon of %s has been forced out ot their hands!" } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -134,7 +134,7 @@ "melee_allowed": true, "defensive": true, "miss_recovery": true, - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -175,7 +175,7 @@ { "stat": "damage", "type": "cut", "scale": 1.25 }, { "stat": "damage", "type": "stab", "scale": 1.25 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -216,7 +216,7 @@ { "stat": "damage", "type": "cut", "scale": 1.4 }, { "stat": "damage", "type": "stab", "scale": 1.4 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -229,7 +229,7 @@ "skill_requirements": [ { "name": "melee", "level": 3 } ], "melee_allowed": true, "aoe": "wide", - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -245,7 +245,7 @@ { "stat": "damage", "type": "cut", "scale": 1.25 }, { "stat": "damage", "type": "stab", "scale": 1.25 } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -260,7 +260,7 @@ { "stat": "damage", "type": "cut", "scale": 1.2 }, { "stat": "damage", "type": "stab", "scale": 1.2 } ], - "attack_vectors": [ "WEAPON", "FOOT" ] + "attack_vectors": [ "vector_null", "vector_foot_heel" ] }, { "type": "technique", @@ -309,7 +309,7 @@ { "stat": "damage", "type": "cut", "scale": 1.5 }, { "stat": "damage", "type": "stab", "scale": 1.5 } ], - "attack_vectors": [ "WEAPON", "HAND" ] + "attack_vectors": [ "vector_null", "vector_punch" ] }, { "type": "technique", @@ -326,7 +326,7 @@ { "stat": "damage", "type": "cut", "scale": 0.66 }, { "stat": "damage", "type": "stab", "scale": 0.66 } ], - "attack_vectors": [ "WEAPON", "HAND" ] + "attack_vectors": [ "vector_null", "vector_punch" ] }, { "type": "technique", @@ -341,7 +341,7 @@ { "stat": "damage", "type": "cut", "scale": 2.0 }, { "stat": "damage", "type": "stab", "scale": 2.0 } ], - "attack_vectors": [ "FOOT" ] + "attack_vectors": [ "vector_foot_sole" ] }, { "type": "technique", @@ -356,7 +356,7 @@ { "stat": "arpen", "type": "cut", "scaling-stat": "str", "scale": 1.5 }, { "stat": "arpen", "type": "stab", "scaling-stat": "str", "scale": 1.5 } ], - "attack_vectors": [ "ARM" ] + "attack_vectors": [ "vector_arm" ] }, { "type": "technique", @@ -367,7 +367,7 @@ "unarmed_allowed": true, "crit_ok": true, "flat_bonuses": [ { "stat": "hit", "scale": 5.0 } ], - "attack_vectors_random": [ "HAND", "FOOT", "HEAD", "TORSO", "HEAD" ] + "attack_vectors": [ "vector_punch", "vector_foot_toes", "vector_headbutt", "vector_shoulder" ] }, { "type": "technique", @@ -387,7 +387,7 @@ }, "condition_desc": "* Only works on a non-downed humanoid target of similar or smaller size incapable of flight", "down_dur": 1, - "attack_vectors_random": [ "FOOT", "LOWER_LEG" ] + "attack_vectors": [ "vector_foot_toes", "vector_shin" ] }, { "type": "technique", @@ -424,7 +424,7 @@ }, "condition_desc": "* Only works on a non-stunned mundane target of similar or smaller size", "stun_dur": 1, - "attack_vectors": [ "WEAPON", "HAND" ] + "attack_vectors": [ "vector_null", "vector_punch" ] }, { "type": "technique", @@ -465,7 +465,7 @@ { "stat": "damage", "type": "cut", "scale": 1.33 }, { "stat": "damage", "type": "stab", "scale": 1.33 } ], - "attack_vectors": [ "THROW" ] + "attack_vectors": [ "vector_grasp" ] }, { "type": "technique", @@ -508,7 +508,7 @@ { "stat": "damage", "type": "cut", "scale": 1.5 }, { "stat": "damage", "type": "stab", "scale": 1.5 } ], - "attack_vectors": [ "THROW" ] + "attack_vectors": [ "vector_grasp" ] }, { "type": "technique", @@ -528,7 +528,7 @@ "message": "The weapon of %s has been forced out ot their hands!" } ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -539,7 +539,7 @@ "melee_allowed": true, "crit_ok": true, "aoe": "wide", - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -557,7 +557,7 @@ { "stat": "arpen", "type": "cut", "scaling-stat": "str", "scale": 0.5 }, { "stat": "arpen", "type": "stab", "scaling-stat": "str", "scale": 0.5 } ], - "attack_vectors": [ "WEAPON", "HAND" ] + "attack_vectors": [ "vector_null", "vector_wrist" ] }, { "type": "technique", @@ -594,7 +594,7 @@ }, "condition_desc": "* Only works on a non-stunned mundane target of similar or smaller size", "stun_dur": 1, - "attack_vectors": [ "WEAPON", "HAND" ] + "attack_vectors": [ "vector_null", "vector_wrist" ] }, { "type": "technique", @@ -614,7 +614,7 @@ { "stat": "damage", "type": "cut", "scale": 1.3 }, { "stat": "damage", "type": "stab", "scale": 1.3 } ], - "attack_vectors": [ "WEAPON", "HAND" ] + "attack_vectors": [ "vector_null", "vector_punch" ] }, { "type": "technique", diff --git a/data/mods/Magiclysm/items/armor.json b/data/mods/Magiclysm/items/armor.json index 305610abcc80f..2076cf9f0aff0 100644 --- a/data/mods/Magiclysm/items/armor.json +++ b/data/mods/Magiclysm/items/armor.json @@ -144,5 +144,82 @@ "volume": "150 L", "material_thickness": 6, "environmental_protection": 8 + }, + { + "id": "integrated_scaled_hands", + "type": "ARMOR", + "category": "armor", + "name": { "str_sp": "talons" }, + "description": "Your scales have grown to cover your hands and elongate the tips in to jagged claws that can be serviceable as cutting and piercing weapons in unarmed combat.", + "weight": "100 g", + "volume": "350 ml", + "qualities": [ [ "CUT", 2 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 6 ] ], + "price": 0, + "price_postapoc": 0, + "material": [ "black_dragon_scales" ], + "symbol": ";", + "color": "dark_gray", + "flags": [ "INTEGRATED", "ALLOWS_NATURAL_ATTACKS", "UNBREAKABLE", "OUTER", "PADDED", "NO_SALVAGE" ], + "armor": [ + { + "material": [ { "type": "black_dragon_scales", "covered_by_mat": 100, "thickness": 3 } ], + "covers": [ "hand_l", "hand_r" ], + "coverage": 100, + "encumbrance": 5 + } + ], + "melee_damage": { "cut": 5, "stab": 5 } + }, + { + "id": "integrated_demon_claws", + "type": "ARMOR", + "category": "armor", + "name": { "str_sp": "talons" }, + "description": "Your index fingers have become talons. They make for wicked natural daggers. Unfortunately, they get in the way of everything including gloves.", + "weight": "100 g", + "volume": "350 ml", + "qualities": [ [ "CUT", 2 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 12 ] ], + "price": 0, + "price_postapoc": 0, + "material": [ "demon_chitin" ], + "symbol": ";", + "color": "dark_gray", + "flags": [ "INTEGRATED", "ALLOWS_NATURAL_ATTACKS", "UNBREAKABLE", "OUTER", "PADDED", "NO_SALVAGE" ], + "armor": [ + { + "material": [ { "type": "demon_chitin", "covered_by_mat": 100, "thickness": 3 } ], + "covers": [ "hand_l", "hand_r" ], + "specifically_covers": [ "hand_fingers_l", "hand_fingers_r" ], + "coverage": 10, + "encumbrance": 3 + } + ], + "melee_damage": { "cut": 10 } + }, + { + "id": "integrated_dragon_talons_black", + "type": "ARMOR", + "category": "armor", + "name": { "str_sp": "talons" }, + "description": "All of your fingers have developed into huge scaled talons. They prevent wearing gloves, but you can use them to powerful effect in melee combat and you appear to have uncovered some secrets about black dragons.", + "weight": "100 g", + "volume": "350 ml", + "qualities": [ [ "CUT", 2 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 12 ] ], + "price": 0, + "price_postapoc": 0, + "material": [ "black_dragon_scales" ], + "symbol": ";", + "color": "dark_gray", + "flags": [ "INTEGRATED", "ALLOWS_NATURAL_ATTACKS", "UNBREAKABLE", "OUTER", "PADDED", "NO_SALVAGE" ], + "armor": [ + { + "material": [ { "type": "black_dragon_scales", "covered_by_mat": 100, "thickness": 3 } ], + "covers": [ "hand_l", "hand_r" ], + "specifically_covers": [ "hand_fingers_l", "hand_fingers_r" ], + "coverage": 100, + "encumbrance": 7 + } + ], + "melee_damage": { "cut": 10, "stab": 10 } } ] diff --git a/data/mods/Magiclysm/items/integrated.json b/data/mods/Magiclysm/items/integrated.json index 90c5fc6955102..25ccfa3e50ca0 100644 --- a/data/mods/Magiclysm/items/integrated.json +++ b/data/mods/Magiclysm/items/integrated.json @@ -6,7 +6,8 @@ "category": "armor", "name": { "str_sp": "goblin teeth" }, "description": "A set of goblin teeth, small but needle-sharp.", - "techniques": [ "FANGS_BITE_GOBLIN", "FANGS_BITE_GOBLIN_GRAB" ] + "techniques": [ "FANGS_BITE_GOBLIN", "FANGS_BITE_GOBLIN_GRAB", "FANGS_BITE_GOBLIN_CRIT" ], + "melee_damage": { "stab": 6 } }, { "id": "integrated_lizardfolk_teeth", @@ -15,6 +16,7 @@ "category": "armor", "name": { "str_sp": "lizardfolk teeth" }, "description": "A set of lizardfolk teeth, made for biting chunks of out their prey.", - "techniques": [ "FANGS_BITE_LIZARDFOLK" ] + "techniques": [ "FANGS_BITE_LIZARDFOLK", "LIZARDFOLK_BITE_CRIT" ], + "melee_damage": { "stab": 20 } } ] diff --git a/data/mods/Magiclysm/mutations/mutations.json b/data/mods/Magiclysm/mutations/mutations.json index a51d612aa9d39..3e7d2e811ad2f 100644 --- a/data/mods/Magiclysm/mutations/mutations.json +++ b/data/mods/Magiclysm/mutations/mutations.json @@ -768,14 +768,7 @@ "points": 2, "visibility": 4, "ugliness": 3, - "enchantments": [ - { - "condition": { "not": "u_has_weapon" }, - "values": [ { "value": "ITEM_DAMAGE_CUT", "add": 5 }, { "value": "ITEM_DAMAGE_STAB", "add": 5 } ] - } - ], - "butchering_quality": 4, - "flags": [ "UNARMED_BONUS" ], + "integrated_armor": [ "integrated_scaled_hands" ], "mixed_effect": true, "restricts_gear": [ "hand_l", "hand_r" ], "destroys_gear": true, @@ -793,16 +786,9 @@ "points": 2, "visibility": 4, "ugliness": 3, - "enchantments": [ - { - "condition": { "not": "u_has_weapon" }, - "values": [ { "value": "ITEM_DAMAGE_CUT", "add": 10 }, { "value": "ITEM_DAMAGE_STAB", "add": 10 } ] - } - ], - "butchering_quality": 4, - "flags": [ "UNARMED_BONUS" ], "mixed_effect": true, "restricts_gear": [ "hand_l", "hand_r" ], + "integrated_armor": [ "integrated_dragon_talons_black" ], "destroys_gear": true, "description": "All of your fingers have developed into huge scaled talons. They prevent wearing gloves, but you can use them to powerful effect in melee combat and you appear to have uncovered some secrets about black dragons.", "types": [ "CLAWS" ], diff --git a/data/mods/Magiclysm/techniques.json b/data/mods/Magiclysm/techniques.json index afe9463d6cfaa..58daf4b452c24 100644 --- a/data/mods/Magiclysm/techniques.json +++ b/data/mods/Magiclysm/techniques.json @@ -13,6 +13,6 @@ "Snicker-snack! slices through %s like a hot knife slices through butter." ], "description": "Cut damage multiply by 2, crit only", - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] } ] diff --git a/data/mods/Magiclysm/techniques_fantasy_species.json b/data/mods/Magiclysm/techniques_fantasy_species.json index 3f9e922d13314..6b0927beb4b63 100644 --- a/data/mods/Magiclysm/techniques_fantasy_species.json +++ b/data/mods/Magiclysm/techniques_fantasy_species.json @@ -9,18 +9,13 @@ "unarmed_allowed": true, "weighting": -3, "reach_ok": false, - "attack_override": true, - "crit_ok": true, - "crit_tec_id": "FANGS_BITE_GOBLIN_CRIT", - "attack_vectors": [ "MOUTH" ], + "attack_vectors": [ "vector_bite" ], "condition": { "and": [ { "not": { "npc_has_flag": "GRAB_FILTER" } }, { "not": { "u_has_effect": "GRAB" } } ] }, "//": "The bonuses below are based on the natural anatomy of a non-human creature and should not be used for mutant attack scaling.", "flat_bonuses": [ - { "stat": "damage", "type": "stab", "scale": 6 }, { "stat": "damage", "type": "stab", "scaling-stat": "unarmed", "scale": 1.1 }, { "stat": "damage", "type": "bash", "scaling-stat": "str", "scale": 0.8 }, { "stat": "damage", "type": "bash", "scaling-stat": "unarmed", "scale": 0.065 }, - { "stat": "movecost", "scale": 75 }, { "stat": "movecost", "scaling-stat": "melee", "scale": -1.25 }, { "stat": "movecost", "scaling-stat": "dex", "scale": -0.5 } ] @@ -35,18 +30,13 @@ "unarmed_allowed": true, "weighting": -2, "reach_ok": false, - "attack_override": true, - "crit_ok": true, - "crit_tec_id": "FANGS_BITE_GOBLIN_CRIT", - "attack_vectors": [ "MOUTH" ], + "attack_vectors": [ "vector_bite" ], "condition": { "and": [ { "npc_has_flag": "GRAB_FILTER" }, { "u_has_flag": "GRAB" } ] }, "//": "The bonuses below are based on the natural anatomy of a non-human creature and should not be used for mutant attack scaling.", "flat_bonuses": [ - { "stat": "damage", "type": "stab", "scale": 6 }, { "stat": "damage", "type": "stab", "scaling-stat": "unarmed", "scale": 1.1 }, { "stat": "damage", "type": "bash", "scaling-stat": "str", "scale": 0.8 }, { "stat": "damage", "type": "bash", "scaling-stat": "unarmed", "scale": 0.065 }, - { "stat": "movecost", "scale": 75 }, { "stat": "movecost", "scaling-stat": "melee", "scale": -1.25 }, { "stat": "movecost", "scaling-stat": "dex", "scale": -0.5 } ] @@ -59,17 +49,14 @@ "messages": [ "You deliver a wicked bite to %s", " delivers a wicked bite to %s!" ], "unarmed_allowed": true, "reach_ok": false, - "attack_override": true, "crit_tec": true, - "attack_vectors": [ "MOUTH" ], + "attack_vectors": [ "vector_bite" ], "flat_bonuses": [ - { "stat": "damage", "type": "stab", "scale": 6 }, { "stat": "damage", "type": "stab", "scaling-stat": "unarmed", "scale": 4.4 }, { "stat": "damage", "type": "bash", "scaling-stat": "str", "scale": 0.75 }, { "stat": "damage", "type": "bash", "scaling-stat": "unarmed", "scale": 0.24 }, { "stat": "arpen", "type": "bash", "scaling-stat": "unarmed", "scale": 1 }, { "stat": "arpen", "type": "stab", "scaling-stat": "unarmed", "scale": 1 }, - { "stat": "movecost", "scale": 75 }, { "stat": "movecost", "scaling-stat": "melee", "scale": -1.25 }, { "stat": "movecost", "scaling-stat": "dex", "scale": -0.5 } ] @@ -84,17 +71,12 @@ "unarmed_allowed": true, "weighting": -2, "reach_ok": false, - "attack_override": true, - "crit_ok": true, - "crit_tec_id": "LIZARDFOLK_BITE_CRIT", - "attack_vectors": [ "MOUTH" ], + "attack_vectors": [ "vector_bite" ], "//": "The bonuses below are based on the natural anatomy of a non-human creature and should not be used for mutant attack scaling.", "flat_bonuses": [ - { "stat": "damage", "type": "stab", "scale": 20 }, { "stat": "damage", "type": "stab", "scaling-stat": "unarmed", "scale": 1.1 }, { "stat": "damage", "type": "bash", "scaling-stat": "str", "scale": 0.8 }, { "stat": "damage", "type": "bash", "scaling-stat": "unarmed", "scale": 0.065 }, - { "stat": "movecost", "scale": 75 }, { "stat": "movecost", "scaling-stat": "melee", "scale": -1.25 }, { "stat": "movecost", "scaling-stat": "dex", "scale": -0.5 } ] @@ -106,22 +88,18 @@ "melee_allowed": true, "messages": [ "You viciously tear into %s", " viciously tears %s!" ], "unarmed_allowed": true, - "weighting": -5, + "weighting": -2, "reach_ok": false, - "attack_override": true, - "crit_ok": true, "crit_tec": true, - "attack_vectors": [ "MOUTH" ], + "attack_vectors": [ "vector_bite" ], "condition": { "and": [ { "not": { "npc_has_flag": "GRAB_FILTER" } }, { "not": { "u_has_effect": "GRAB" } } ] }, "//": "The bonuses below are based on the natural anatomy of a non-human creature and should not be used for mutant attack scaling.", "flat_bonuses": [ - { "stat": "damage", "type": "stab", "scale": 20 }, { "stat": "damage", "type": "stab", "scaling-stat": "unarmed", "scale": 4.4 }, { "stat": "damage", "type": "bash", "scaling-stat": "str", "scale": 0.75 }, { "stat": "damage", "type": "bash", "scaling-stat": "unarmed", "scale": 0.24 }, { "stat": "arpen", "type": "bash", "scaling-stat": "unarmed", "scale": 1 }, { "stat": "arpen", "type": "stab", "scaling-stat": "unarmed", "scale": 1 }, - { "stat": "movecost", "scale": 100 }, { "stat": "movecost", "scaling-stat": "melee", "scale": -1.25 }, { "stat": "movecost", "scaling-stat": "dex", "scale": -0.5 } ] diff --git a/data/mods/Magiclysm/traits/temporary_demon_traits.json b/data/mods/Magiclysm/traits/temporary_demon_traits.json index 64fdc959ec4ef..16561b3d3f73f 100644 --- a/data/mods/Magiclysm/traits/temporary_demon_traits.json +++ b/data/mods/Magiclysm/traits/temporary_demon_traits.json @@ -69,13 +69,11 @@ "points": 2, "visibility": 4, "ugliness": 4, - "enchantments": [ { "condition": { "not": "u_has_weapon" }, "values": [ { "value": "ITEM_DAMAGE_CUT", "add": 10 } ] } ], - "butchering_quality": 4, - "flags": [ "UNARMED_BONUS" ], "valid": false, "starting_trait": false, "mixed_effect": true, "restricts_gear": [ "hand_l", "hand_r" ], + "integrated_armor": [ "integrated_demon_claws" ], "description": "Your index fingers have grown into huge talons. After a bit of practice, you find that this does not affect your dexterity, but allows for a deadly unarmed attack. They also prevent wearing gloves.", "types": [ "CLAWS" ], "cancels": [ "ARM_TENTACLES", "ARM_TENTACLES_4", "ARM_TENTACLES_8" ] diff --git a/data/mods/TEST_DATA/body_parts.json b/data/mods/TEST_DATA/body_parts.json index f16e14b5e573d..558a0c80320b7 100644 --- a/data/mods/TEST_DATA/body_parts.json +++ b/data/mods/TEST_DATA/body_parts.json @@ -1,4 +1,23 @@ [ + { + "type": "body_part", + "id": "mouth", + "copy-from": "mouth", + "name": "mouth", + "similar_bodyparts": [ "test_corvid_beak" ], + "limb_type": "mouth", + "limb_scores": [ [ "breathing", 1.0 ], [ "manip", 0.05, 0.2 ] ] + }, + { + "type": "sub_body_part", + "id": "mouth_lips", + "copy-from": "mouth_lips", + "similar_bodyparts": [ "sub_limb_test_corvid_beak" ], + "opposite": "mouth_lips", + "side": 0, + "name": "lips", + "name_multiple": "lips" + }, { "type": "body_part", "id": "test_arm_l", diff --git a/data/mods/TEST_DATA/martialarts.json b/data/mods/TEST_DATA/martialarts.json index a3725d7c0535b..71967a31743ce 100644 --- a/data/mods/TEST_DATA/martialarts.json +++ b/data/mods/TEST_DATA/martialarts.json @@ -1,4 +1,37 @@ [ + { + "type": "technique", + "id": "test_vector_tech_1", + "name": "Test Vectors One", + "//": "Fails because of missing limbs of type other", + "unarmed_allowed": true, + "messages": [ "You tail-slap %s", " tail-slaps %s" ], + "attack_vectors": [ "test_tail_req" ] + }, + { + "type": "technique", + "id": "test_vector_tech_2", + "name": "Test Vectors Two", + "//": "Beaks get substituted, succeeds on birdperson", + "unarmed_allowed": true, + "messages": [ "You peck the %s", " pecks the %s" ], + "attack_vectors": [ "test_beak" ] + }, + { + "type": "attack_vector", + "id": "test_tail_req", + "limbs": [ "hand_l" ], + "contact_area": [ "hand_fingers_l" ], + "bp_hp_limit": 50, + "encumbrance_limit": 10, + "limb_req": [ [ "tail", 1 ] ] + }, + { + "type": "attack_vector", + "id": "test_beak", + "limbs": [ "mouth" ], + "contact_area": [ "mouth_lips" ] + }, { "type": "technique", "id": "test_technique", @@ -25,7 +58,7 @@ }, "down_dur": 2, "messages": [ "You see if you can sweep %s", " sees if they can sweep %s" ], - "attack_vectors": [ "FOOT" ] + "attack_vectors": [ "vector_foot_toes" ] }, { "type": "technique", @@ -59,7 +92,7 @@ }, "stun_dur": 1, "weapon_categories_allowed": [ "MEDIUM_SWORDS" ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "technique", @@ -91,7 +124,7 @@ }, "knockback_dist": 2, "weapon_categories_allowed": [ "MACES" ], - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] }, { "type": "martial_art", @@ -121,7 +154,14 @@ "weapon_categories_allowed": "KNIVES" } ], - "techniques": [ "test_technique", "test_tech_condition_sweep", "test_tech_condition_stun", "test_tech_condition_knockback" ], + "techniques": [ + "test_technique", + "test_tech_condition_sweep", + "test_tech_condition_stun", + "test_tech_condition_knockback", + "test_vector_tech_1", + "test_vector_tech_2" + ], "weapon_category": [ "TEST_CAT1" ] } ] diff --git a/data/mods/Xedra_Evolved/techniques.json b/data/mods/Xedra_Evolved/techniques.json index 3ee2fbfe83ad2..9110a7a481d19 100644 --- a/data/mods/Xedra_Evolved/techniques.json +++ b/data/mods/Xedra_Evolved/techniques.json @@ -9,7 +9,6 @@ ], "unarmed_allowed": true, "melee_allowed": true, - "attack_override": true, "weighting": 2, "crit_ok": true, "repeat_min": 1, @@ -29,7 +28,6 @@ ], "unarmed_allowed": true, "melee_allowed": true, - "attack_override": true, "weighting": 2, "crit_ok": true, "repeat_min": 1, @@ -51,7 +49,6 @@ ], "unarmed_allowed": true, "melee_allowed": true, - "attack_override": true, "weighting": 2, "crit_ok": true, "repeat_min": 1, @@ -77,7 +74,7 @@ "condition_desc": "* Only works on target of similar or bigger size", "messages": [ "You send %s reeling!", " sends %s reeling!" ], "description": "Down 4 turns, knockback 3 tiles, 250% damage, 140% move, crit only, min 3 melee", - "attack_vectors": [ "WEAPON", "HAND" ] + "attack_vectors": [ "vector_null", "vector_punch" ] }, { "type": "technique", @@ -96,6 +93,6 @@ "In an instant melts %s and those nearby with a sprawling attack!" ], "description": "150% damage, 120% move, attack multiple enemies, crit only, min 4 melee", - "attack_vectors": [ "WEAPON" ] + "attack_vectors": [ "vector_null" ] } ] diff --git a/doc/JSON_FLAGS.md b/doc/JSON_FLAGS.md index 13fc4b3d53f82..3cb7cdda4c93a 100644 --- a/doc/JSON_FLAGS.md +++ b/doc/JSON_FLAGS.md @@ -422,7 +422,6 @@ Character flags can be `trait_id`, `json_flag_id` or `flag_id`. Some of these a - ```THERMOMETER``` You always know what temperature it is. - ```TINY``` Changes your size to `creature_size::tiny`. Checked first of the size category flags. - ```TREE_COMMUNION_PLUS``` Gain greatly enhanced effects from the Mycorrhizal Communion mutation. -- ```UNARMED_BONUS``` You get a bonus to unarmed bash and cut damage equal to unarmed_skill/2 up to 4. - ```WALK_UNDERWATER``` your stamina burn is not increased when you swim, emulating you walking on the water bottom. - ```WALL_CLING``` You can ascend/descend sheer cliffs as long as the tile above borders at least one wall. Chance to slip and fall each step. - ```WATCH``` You always know what time it is. diff --git a/doc/MARTIALART_JSON.md b/doc/MARTIALART_JSON.md index 8ecebf0d6d072..5fede45d49bde 100644 --- a/doc/MARTIALART_JSON.md +++ b/doc/MARTIALART_JSON.md @@ -65,12 +65,11 @@ ### Techniques -```C++ +```JSON { "id": "tec_debug_arpen", // Unique ID. Must be one continuous word "name": "phasing strike", // In-game name displayed - "attack_vectors": [ "WEAPON", "HAND" ] // What attack vector would be used for this technique; this field is order dependend, meaning in this example the game will try to use WEAPON first, and, if not possible, reject it and will use HAND instead; For more info see Attack vectors below - "attack_vectors_random": [ "FOOT", "HEAD", "TORSO", "HEAD", "HEAD" ] // same as attack_vectors, but has no priority, and pick random vector from the list; it is used only if all choises from attack_vectors are rejected + "attack_vectors": [ "vector_1", "vector_2" ], // What attack vector would be used for this technique; For more info see Attack vectors below "unarmed_allowed": true, // Can an unarmed character use this technique "weapon_categories_allowed": [ "BLADES", "KNIVES" ], // Restrict technique to only these categories of weapons. If omitted, all weapon categories are allowed. "melee_allowed": true, // Means that ANY melee weapon can be used, NOT just the martial art's weapons @@ -83,14 +82,13 @@ "forbidden_buffs_all": [ "eskrima_hit_buff" ], // This technique is forbidden if all of the named buffs are active "req_flags": [ "" ], // List of item flags the used weapon needs to be eligible for the technique "required_char_flags": [ "" ], // List of "character" (bionic, trait, effect or bodypart) flags the character needs to be able to use this technique - "required_char_flags_all": [ ""], // This technique requires all of the listed character flags to trigger + "required_char_flags_all": [ "" ], // This technique requires all of the listed character flags to trigger "forbidden_char_flags": [ "" ], // List of character flags disabling this technique "needs_ammo": true, // Technique works only if weapon is loaded; Consume 1 charge per attack "crit_tec": true, // This technique only works on a critical hit "crit_ok": true, // This technique works on both normal and critical hits "reach_tec": true, // This technique only works on a reach attack hit "reach_ok": true, // This technique works on both normal and reach attack hits - "attack_override": false, // This technique replaces the base attack it triggered on, nulling damage and movecost (instead using the tech's flat_bonuses), and counts as unarmed for the purposes of skill training and special melee effects "condition": "u_is_outside",// Optional (array of) dialog conditions the attack requires to trigger. Failing these will disqualify the tech from being selected "condition_desc": "Needs X",// Description string describing the conditions of this attack (since dialog conditions can't be automatically evaluated) "repeat_min": 1, // Technique's damage and any added effects are repeated rng(repeat_min, repeat_max) times. The target's armor and the effect's chances are applied for each repeat. @@ -123,28 +121,26 @@ ### Attack vectors -Attack vector is a way for game to separate which techniques could be used by character, and which could not - it would be odd to see player is unable to kick because their arm is broken - -List of attack vectors is currently hardcoded, and contain: - -- `HAND` - Any technique that hits with any part of the hand (backhand, jab, hammer fist). Can be used as long as at least one hand/arm limb is not broken. -- `FINGERS` - Any technique that hits with the fingers (eye gouge, spearhand). Can be used as long as at least one hand/arm limb is not broken. -- `PALM` - Any technique that hits with the palm of the hand(palm strike). Can be used as long as at least one hand/arm limb is not broken. -- `HAND_BACK` - Any technique that hits with the back of the hand(backfist, backhand slap). Can be used as long as at least one hand/arm limb is not broken. -- `WRIST` - Any technique that hits with the wrist (crane strike). Can be used as long as at least one hand/arm limb is not broken. -- `ARM` - Any technique that hits with the arm itself (clothesline). Can be used as long as at least one hand/arm limb is not broken. -- `ELBOW` - Any technique that hits with an elbow (elbow strike). Can be used as long as at least one hand/arm limb is not broken. -- `SHOULDER` - Any technique that hits with the upper part of the arm (shoulder check). Can be used as long as at least one hand/arm limb is not broken. -- `FOOT` - Any technique that hits with any part of the foot (roundhouse kick, foot stomp, heel drop). Can be used only if both legs are not broken. You need one functional leg to perform the attack and another functional leg to balance on. -- `LOWER_LEG` - Any technique that hits with shin (Muay Thai kicks). Can be used only if both legs are not broken. You need one functional leg to perform the attack and another functional leg to balance on. -- `KNEE` - Any technique that hits with the knee (knee bash). Can be used only if both legs are not broken. You need one functional leg to perform the attack and another functional leg to balance on. -- `HIP` - Any technique that hits with the hips or buttocks (Peach Bomber, R. Mika's Flying Peach). Can be used only if both legs are not broken. You need one functional leg to perform the attack and another functional leg to balance on. -- `TORSO` - Any technique that hits with the center mass of the user's body (flying body splash, throwing yourself at an enemy). Can always be used because if your Torso is broken, you are dead. // Shouldn't it requre both legs? can't really use a whole body if legs are broken, no way to deliver the momentum ain't it? -- `HEAD` - Any technique that hits with the user's head such as a headbutt. Can always be used because if your Head is broken, you are dead. -- `WEAPON` - Any technique the requires a held item to perform (see any weapon style). Can be used if the user is holding a valid style weapon for their martial art and at least one hand/arm is not broken. -- `THROW` - Any technique that forcefully moves an opponent (judo throws, suplex). Can be used only if both hands/arms are not broken. -- `GRAPPLE` - Any technique that maintains contact with an opponent and squeezes (chock, headlock), bends (Krav Maga's Arm Breaker), or twists (arm twist) some part of the opponent. Can be used only if both hands/arms are not broken. -- `MOUTH` - A technique that uses the mouth to bite or spit on an opponent. Can be used only if the mouth is not covered by anything not flagged with ALLOWS_NATURAL_ATTACKS. +Attack vectors define which (sub)bodypart is used for the attack in question, allow filtering of eligable bodyparts and apply the relevant worn armor's unarmed damage to the attack. Note for the (sub)part to apply its unarmed damage it needs unrestricted natural attacks. + +```JSON +[ + { + "type": "attack_vector", // Always attack_vector + "id": "vector_hand", // ID + "limbs": [ "hand_l", "hand_r" ], // List of bodyparts used in this attack (relevant for HP/encumbrance/flag filtering) + "contact_area": [ "hand_fingers_l", "hand_fingers_r" ], // List of subbodyparts that can be used as a strike surface in the attack using the sbp's armor or intrinsic unarmed damage + "strict_limb_definition": false, // Bool, default false. When true *only* the bodyparts defined above are used for the vector, otherwise similar bodyparts can be used as long as both the contact area and the defined limb are similar, see JSON_INFO.md/Bodyparts for bodypart similarity + "armor_bonus": true, // Bool, default true, defines if the vector takes the unarmed damage bonus of the armor worn on the contact area into account + "required_limb_flags": [ "foo", "bar" ], // List of character flags required for the bodypart to be eligable for this vector + "forbidden_limb_flags": [ "foo", "bar" ], // List of character flags that disqualify a limb from being usable by this vector + "encumbrance_limit": 15, // Int, default 100, encumbrance of the limb above this will disqualify it from this vector + "bp_hp_limit": 75 , // Int, default 10, percent of bodypart limb HP necessary for the limbs to qualify for this vector. For minor (non-main) bodyparts the corresponding main part HP is taken into account. + "limb_req": [ [ "arm", 2] ] // Array of pairs. Limb type requirements for this vector. The character must have this many limbs of the given type above the limb's health limit (See JSON_INFO.md:Bodyparts). Requirements must all be met. + + } +] +``` ### Tech effects ```C++ diff --git a/doc/MUTATIONS.md b/doc/MUTATIONS.md index fb56438437975..0665518fbf2ea 100644 --- a/doc/MUTATIONS.md +++ b/doc/MUTATIONS.md @@ -234,7 +234,7 @@ Note that **all new traits that can be obtained through mutation must be purifia "processed_eocs": [ "eoc_id_1" ], // List of effect_on_conditions that attempt to activate every time (defined above) units of time. Time of 0 means every turn it processes. Processed when the mutation is active for activatable mutations and always for non-activatable ones. "deactivated_eocs": [ "eoc_id_1" ], // List of effect_on_conditions that attempt to activate when this mutation is successfully deactivated. "enchantments": [ "ench_id_1" ], // List of enchantments granted by this mutation. Can be either IDs or an inline definition of the enchantment (see MAGIC.md) - "flags": [ "UNARMED_BONUS" ], // List of flag_IDs and json_flag_IDs granted by the mutation. Note: trait_IDs can be set and generate no errors, but they're not actually "active". + "flags": [ "WALK_UNDERWATER" ], // List of flag_IDs and json_flag_IDs granted by the mutation. Note: trait_IDs can be set and generate no errors, but they're not actually "active". "moncams": [ [ "mon_player_blob", 16 ] ], // Monster cameras, ability to use friendly monster's from the list as additional source of vision. Max view distance is equal to monster's daytime vision. The number specifies the range at which it can "transmit" vision to the avatar. "override_look": { "id": "mon_cat_black", "tile_category": "monster" } // Change the character's appearance to another specified thing with a specified ID and tile category. Please ensure that the ID corresponds to the tile category. The valid tile category are "none", "vehicle_part", "terrain", "item", "furniture", "trap", "field", "lighting", "monster", "bullet", "hit_entity", "weather", "overmap_terrain", "map_extra", "overmap_note". } diff --git a/src/bodypart.cpp b/src/bodypart.cpp index 73f9a04ed6988..c6ac999f9d3ef 100644 --- a/src/bodypart.cpp +++ b/src/bodypart.cpp @@ -602,11 +602,21 @@ bool body_part_type::has_limb_score( const limb_score_id &id ) const return limb_scores.count( id ); } +damage_instance body_part_type::unarmed_damage_instance() const +{ + return damage; +} + float body_part_type::unarmed_damage( const damage_type_id &dt ) const { return damage.type_damage( dt ); } +float body_part_type::total_unarmed_damage() const +{ + return damage.total_damage(); +} + float body_part_type::unarmed_arpen( const damage_type_id &dt ) const { return damage.type_arpen( dt ); diff --git a/src/bodypart.h b/src/bodypart.h index 72e0f8cdf2fab..c23099837c38a 100644 --- a/src/bodypart.h +++ b/src/bodypart.h @@ -367,7 +367,10 @@ struct body_part_type { return bionic_slots_; } + damage_instance unarmed_damage_instance() const; float unarmed_damage( const damage_type_id &dt ) const; + // return the total amount of unarmed damage this limb would do + float total_unarmed_damage() const; float unarmed_arpen( const damage_type_id &dt ) const; float damage_resistance( const damage_type_id &dt ) const; diff --git a/src/character.cpp b/src/character.cpp index 316dc028345c4..9af84c70a662f 100644 --- a/src/character.cpp +++ b/src/character.cpp @@ -353,8 +353,6 @@ static const limb_score_id limb_score_night_vis( "night_vis" ); static const limb_score_id limb_score_reaction( "reaction" ); static const limb_score_id limb_score_vision( "vision" ); -const matec_id tec_none( "tec_none" ); - static const material_id material_budget_steel( "budget_steel" ); static const material_id material_ch_steel( "ch_steel" ); static const material_id material_flesh( "flesh" ); @@ -1974,7 +1972,7 @@ void Character::on_dodge( Creature *source, float difficulty, float training_lev // For adjacent attackers check for techniques usable upon successful dodge if( source && square_dist( pos(), source->pos() ) == 1 ) { - matec_id tec = pick_technique( *source, used_weapon(), false, true, false ); + matec_id tec = std::get<0>( pick_technique( *source, used_weapon(), false, true, false ) ); if( tec != tec_none && !is_dead_state() ) { if( get_stamina() < get_stamina_max() / 3 ) { @@ -2090,7 +2088,8 @@ std::set Character::get_limb_techs() const { std::set result; for( const bodypart_id &part : get_all_body_parts() ) { - if( !natural_attack_restricted_on( part ) ) { + const bodypart *bp = get_part( part ); + if( !bp->is_limb_overencumbered() && bp->get_hp_cur() > part->health_limit ) { std::set part_tech = get_part( part )->get_limb_techs(); result.insert( part_tech.begin(), part_tech.end() ); } diff --git a/src/character.h b/src/character.h index 648f71dda523e..470e13f338d0c 100644 --- a/src/character.h +++ b/src/character.h @@ -1128,13 +1128,14 @@ class Character : public Creature, public visitable item_location best_shield(); /** Calculates melee weapon wear-and-tear through use, returns true if item is destroyed. */ bool handle_melee_wear( item_location shield, float wear_multiplier = 1.0f ); - /** Returns a random valid technique */ - matec_id pick_technique( Creature &t, const item_location &weap, - bool crit, bool dodge_counter, bool block_counter, const std::vector &blacklist = {} ); - // Houses the actual picking logic and returns the vector of eligable techniques - std::vector evaluate_techniques( Creature &t, const item_location &weap, - bool crit = false, bool dodge_counter = false, bool block_counter = false, - const std::vector &blacklist = {} ); + /** Returns a random technique/vector/contact area set from the possible techs */ + std::tuple pick_technique( + Creature &t, const item_location &weap, + bool crit, bool dodge_counter, bool block_counter, const std::vector &blacklist = {} ); + // Filter techniques per tech, return a tech/vector/sublimb set + std::optional> + evaluate_technique( const matec_id &tec_id, Creature &t, const item_location &weap, + bool crit = false, bool dodge_counter = false, bool block_counter = false ); void perform_technique( const ma_technique &technique, Creature &t, damage_instance &di, int &move_cost, item_location &cur_weapon ); @@ -1204,10 +1205,11 @@ class Character : public Creature, public visitable // If average == true, adds expected values of random rolls instead of rolling. /** Adds all 3 types of physical damage to instance */ void roll_all_damage( bool crit, damage_instance &di, bool average, const item &weap, - const std::string &attack_vector, + const attack_vector_id &attack_vector, const sub_bodypart_str_id &contact, const Creature *target, const bodypart_id &bp ) const; void roll_damage( const damage_type_id &dt, bool crit, damage_instance &di, bool average, - const item &weap, const std::string &attack_vector, float crit_mod ) const; + const item &weap, const attack_vector_id &attack_vector, const sub_bodypart_str_id &contact, + float crit_mod ) const; /** Returns true if the player should be dead */ bool is_dead_state() const override; diff --git a/src/character_attire.cpp b/src/character_attire.cpp index fb08f333f1ad9..464b8108a41a4 100644 --- a/src/character_attire.cpp +++ b/src/character_attire.cpp @@ -2192,55 +2192,11 @@ item *outfit::best_shield() return ret; } -item *outfit::current_unarmed_weapon( const std::string &attack_vector ) +item *outfit::current_unarmed_weapon( const sub_bodypart_str_id &contact_area ) { item *cur_weapon = &null_item_reference(); - for( item &worn_item : worn ) { - bool covers = false; - - if( attack_vector == "HAND" || attack_vector == "GRAPPLE" || attack_vector == "THROW" ) { - covers = worn_item.covers( bodypart_id( "hand_l" ) ) && - worn_item.covers( bodypart_id( "hand_r" ) ); - } else if( attack_vector == "ARM" ) { - covers = worn_item.covers( bodypart_id( "arm_l" ) ) && - worn_item.covers( bodypart_id( "arm_r" ) ); - } else if( attack_vector == "ELBOW" ) { - covers = worn_item.covers( sub_bodypart_id( "arm_elbow_l" ) ) && - worn_item.covers( sub_bodypart_id( "arm_elbow_r" ) ); - } else if( attack_vector == "FINGERS" ) { - covers = worn_item.covers( sub_bodypart_id( "hand_fingers_l" ) ) && - worn_item.covers( sub_bodypart_id( "hand_fingers_r" ) ); - } else if( attack_vector == "WRIST" ) { - covers = worn_item.covers( sub_bodypart_id( "hand_wrist_l" ) ) && - worn_item.covers( sub_bodypart_id( "hand_wrist_r" ) ); - } else if( attack_vector == "PALM" ) { - covers = worn_item.covers( sub_bodypart_id( "hand_palm_l" ) ) && - worn_item.covers( sub_bodypart_id( "hand_palm_r" ) ); - } else if( attack_vector == "HAND_BACK" ) { - covers = worn_item.covers( sub_bodypart_id( "hand_back_l" ) ) && - worn_item.covers( sub_bodypart_id( "hand_back_r" ) ); - } else if( attack_vector == "SHOULDER" ) { - covers = worn_item.covers( sub_bodypart_id( "arm_shoulder_l" ) ) && - worn_item.covers( sub_bodypart_id( "arm_shoulder_r" ) ); - } else if( attack_vector == "FOOT" ) { - covers = worn_item.covers( bodypart_id( "foot_l" ) ) && - worn_item.covers( bodypart_id( "foot_r" ) ); - } else if( attack_vector == "LOWER_LEG" ) { - covers = worn_item.covers( sub_bodypart_id( "leg_lower_l" ) ) && - worn_item.covers( sub_bodypart_id( "leg_lower_r" ) ); - } else if( attack_vector == "KNEE" ) { - covers = worn_item.covers( sub_bodypart_id( "leg_knee_l" ) ) && - worn_item.covers( sub_bodypart_id( "leg_knee_r" ) ); - } else if( attack_vector == "HIP" ) { - covers = worn_item.covers( sub_bodypart_id( "leg_hip_l" ) ) && - worn_item.covers( sub_bodypart_id( "leg_hip_r" ) ); - } else if( attack_vector == "HEAD" ) { - covers = worn_item.covers( bodypart_id( "head" ) ); - } else if( attack_vector == "TORSO" ) { - covers = worn_item.covers( bodypart_id( "torso" ) ); - } - + bool covers = worn_item.covers( contact_area ); // Uses enum layer_level to make distinction for top layer. if( covers ) { if( cur_weapon->is_null() || ( worn_item.get_layer() >= cur_weapon->get_layer() ) ) { diff --git a/src/character_attire.h b/src/character_attire.h index 365dba47751f0..68db0240e2a60 100644 --- a/src/character_attire.h +++ b/src/character_attire.h @@ -112,7 +112,7 @@ class outfit // get the best blocking value with the flag that allows worn. item *best_shield(); // find the best clothing weapon when unarmed modifies - item *current_unarmed_weapon( const std::string &attack_vector ); + item *current_unarmed_weapon( const sub_bodypart_str_id &contact_area ); item_location first_item_covering_bp( Character &guy, bodypart_id bp ); void inv_dump( std::vector &ret ); void inv_dump( std::vector &ret ) const; diff --git a/src/character_martial_arts.h b/src/character_martial_arts.h index 958414e393371..95f36598e6151 100644 --- a/src/character_martial_arts.h +++ b/src/character_martial_arts.h @@ -80,11 +80,12 @@ class character_martial_arts /** Fires all kill-triggered martial arts events */ void ma_onkill_effects( Character &owner ); - /** Returns an attack vector that the player can use */ - std::string get_valid_attack_vector( const Character &user, - const std::vector &attack_vectors ) const; - /** Returns true if the player is able to use the given attack vector */ - bool can_use_attack_vector( const Character &user, const std::string &av ) const; + // Selects a valid attack vector + std::optional> choose_attack_vector( + const Character &user, const matec_id &tech ) const; + // Calculate and return the damage of the given contact area for a given vector + damage_instance calculate_vector_damage( const Character &user, const attack_vector_id &vec, + const sub_bodypart_str_id &contact_area ) const; /** Returns true if the player has the leg block technique available */ bool can_leg_block( const Character &owner ) const; /** Returns true if the player has the arm block technique available */ diff --git a/src/init.cpp b/src/init.cpp index a50437e9a717f..c65e6be9b599c 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -407,6 +407,7 @@ void DynamicDataLoader::initialize() add( "weapon_category", &weapon_category::load_weapon_categories ); add( "martial_art", &load_martial_art ); add( "climbing_aid", &climbing_aid::load_climbing_aid ); + add( "attack_vector", &attack_vector::load_attack_vectors ); add( "effect_type", &load_effect_type ); add( "oter_id_migration", &overmap::load_oter_id_migration ); add( "overmap_terrain", &overmap_terrains::load ); diff --git a/src/item.cpp b/src/item.cpp index f64c1be94004b..9ca11aac170b5 100644 --- a/src/item.cpp +++ b/src/item.cpp @@ -124,6 +124,8 @@ static const ammotype ammo_bolt( "bolt" ); static const ammotype ammo_money( "money" ); static const ammotype ammo_plutonium( "plutonium" ); +static const attack_vector_id attack_vector_vector_null( "vector_null" ); + static const bionic_id bio_digestion( "bio_digestion" ); static const bodygraph_id bodygraph_full_body_iteminfo( "full_body_iteminfo" ); @@ -2279,7 +2281,8 @@ double item::effective_dps( const Character &guy, Creature &mon ) const Creature *temp_mon = &mon; double subtotal_damage = 0; damage_instance base_damage; - guy.roll_all_damage( crit, base_damage, true, *this, "WEAPON", &mon, bp ); + guy.roll_all_damage( crit, base_damage, true, *this, attack_vector_vector_null, + sub_body_part_sub_limb_debug, &mon, bp ); damage_instance dealt_damage = base_damage; // TODO: Modify DPS calculation to consider weakpoints. resistances r = resistances( *static_cast( temp_mon ) ); @@ -2304,7 +2307,8 @@ double item::effective_dps( const Character &guy, Creature &mon ) const if( has_technique( RAPID ) ) { Creature *temp_rs_mon = &mon; damage_instance rs_base_damage; - guy.roll_all_damage( crit, rs_base_damage, true, *this, "WEAPON", &mon, bp ); + guy.roll_all_damage( crit, rs_base_damage, true, *this, attack_vector_vector_null, + sub_body_part_sub_limb_debug, &mon, bp ); damage_instance dealt_rs_damage = rs_base_damage; for( damage_unit &dmg_unit : dealt_rs_damage.damage_units ) { dmg_unit.damage_multiplier *= 0.66; @@ -5584,9 +5588,11 @@ void item::melee_combat_info( std::vector &info, const iteminfo_query ( !dmg_types.empty() || type->m_to_hit > 0 ) ) || debug_mode ) { bodypart_id bp = bodypart_id( "torso" ); damage_instance non_crit; - player_character.roll_all_damage( false, non_crit, true, *this, "WEAPON", nullptr, bp ); + player_character.roll_all_damage( false, non_crit, true, *this, attack_vector_vector_null, + sub_body_part_sub_limb_debug, nullptr, bp ); damage_instance crit; - player_character.roll_all_damage( true, crit, true, *this, "WEAPON", nullptr, bp ); + player_character.roll_all_damage( true, crit, true, *this, attack_vector_vector_null, + sub_body_part_sub_limb_debug, nullptr, bp ); int attack_cost = player_character.attack_speed( *this ); insert_separation_line( info ); if( parts->test( iteminfo_parts::DESCRIPTION_MELEEDMG ) ) { diff --git a/src/martialarts.cpp b/src/martialarts.cpp index 8422e26fff781..3caf4fdb94f02 100644 --- a/src/martialarts.cpp +++ b/src/martialarts.cpp @@ -10,6 +10,7 @@ #include "bodypart.h" #include "character.h" +#include "character_attire.h" #include "character_martial_arts.h" #include "color.h" #include "condition.h" @@ -34,6 +35,7 @@ #include "translations.h" #include "ui_manager.h" #include "value_ptr.h" +#include "weighted_list.h" static const bionic_id bio_armor_arms( "bio_armor_arms" ); static const bionic_id bio_armor_legs( "bio_armor_legs" ); @@ -50,14 +52,54 @@ static const skill_id skill_unarmed( "unarmed" ); static const weapon_category_id weapon_category_OTHER_INVALID_WEAP_CAT( "OTHER_INVALID_WEAP_CAT" ); + namespace { generic_factory weapon_category_factory( "weapon category" ); generic_factory ma_techniques( "martial art technique" ); generic_factory martialarts( "martial art style" ); generic_factory ma_buffs( "martial art buff" ); +generic_factory attack_vector_factory( "attack vector" ); } // namespace +/** @relates string_id */ +template<> +const attack_vector &string_id::obj() const +{ + return attack_vector_factory.obj( *this ); +} + +template<> +bool attack_vector_id::is_valid() const +{ + return attack_vector_factory.is_valid( *this ); +} + +void attack_vector::load_attack_vectors( const JsonObject &jo, const std::string &src ) +{ + attack_vector_factory.load( jo, src ); +} + +void attack_vector::reset() +{ + attack_vector_factory.reset(); +} + +void attack_vector::load( const JsonObject &jo, const std::string_view ) +{ + mandatory( jo, was_loaded, "id", id ); + optional( jo, was_loaded, "weapon", weapon, false ); + optional( jo, was_loaded, "limbs", limbs ); + optional( jo, was_loaded, "strict_limb_definition", strict_limb_definition, false ); + optional( jo, was_loaded, "contact_area", contact_area ); + optional( jo, was_loaded, "limb_req", limb_req ); + optional( jo, was_loaded, "armor_bonus", armor_bonus, true ); + optional( jo, was_loaded, "encumbrance_limit", encumbrance_limit, 100 ); + optional( jo, was_loaded, "bp_hp_limit", bp_hp_limit, 10 ); + optional( jo, was_loaded, "required_limb_flags", required_limb_flags ); + optional( jo, was_loaded, "forbidden_limb_flags", forbidden_limb_flags ); +} + template<> const weapon_category &weapon_category_id::obj() const { @@ -232,8 +274,6 @@ void ma_technique::load( const JsonObject &jo, const std::string &src ) optional( jo, was_loaded, "crit_tec", crit_tec, false ); optional( jo, was_loaded, "crit_ok", crit_ok, false ); - optional( jo, was_loaded, "crit_tec_id", crit_tec_id, tec_none ); - optional( jo, was_loaded, "attack_override", attack_override, false ); optional( jo, was_loaded, "wall_adjacent", wall_adjacent, false ); optional( jo, was_loaded, "reach_tec", reach_tec, false ); optional( jo, was_loaded, "reach_ok", reach_ok, false ); @@ -264,9 +304,6 @@ void ma_technique::load( const JsonObject &jo, const std::string &src ) optional( jo, was_loaded, "flags", flags, auto_flags_reader<> {} ); optional( jo, was_loaded, "tech_effects", tech_effects, tech_effect_reader{} ); - optional( jo, was_loaded, "attack_vectors", attack_vectors, {} ); - optional( jo, was_loaded, "attack_vectors_random", attack_vectors_random, {} ); - for( JsonValue jv : jo.get_array( "eocs" ) ) { eocs.push_back( effect_on_conditions::load_inline_eoc( jv, src ) ); } @@ -277,10 +314,23 @@ void ma_technique::load( const JsonObject &jo, const std::string &src ) has_condition = true; } + optional( jo, was_loaded, "attack_vectors", attack_vectors ); reqs.load( jo, src ); bonuses.load( jo ); } +void ma_technique::verify_ma_techniques() +{ + ma_techniques.check(); +} + +void ma_technique::check() const +{ + if( attack_vectors.empty() && !dummy && !defensive && !grab_break && !miss_recovery ) { + debugmsg( "MA technique %s is missing an attack vector", id.c_str() ); + } +} + // Not implemented on purpose (martialart objects have no integer id) // int_id string_id::id() const; @@ -565,6 +615,33 @@ void finalize_martial_arts() // bother us because ma_buff_effect_type does not have any members that can be sliced. effect_type::register_ma_buff_effect( new_eff ); } + attack_vector_factory.finalize(); + for( const attack_vector &vector : attack_vector_factory.get_all() ) { + // Check if this vector allows substitutions in the first place + if( vector.strict_limb_definition ) { + continue; + } + // Add similar parts + // The vector needs both a limb and a contact area, so we can substitute safely + std::vector similar_bp; + for( const bodypart_str_id &bp : vector.limbs ) { + for( const bodypart_str_id &similar : bp->similar_bodyparts ) { + similar_bp.emplace_back( similar ); + } + } + const_cast( vector ).limbs.insert( vector.limbs.end(), similar_bp.begin(), + similar_bp.end() ); + + std::vector similar_sbp; + for( const sub_bodypart_str_id &sbp : vector.contact_area ) { + for( const sub_bodypart_str_id &similar : sbp->similar_bodyparts ) { + similar_sbp.emplace_back( similar ); + } + } + + const_cast( vector ).contact_area.insert( vector.contact_area.end(), + similar_sbp.begin(), similar_sbp.end() ); + } } std::string martialart_difficulty( const matype_id &mstyle ) @@ -639,10 +716,7 @@ bool ma_requirements::is_valid_character( const Character &u ) const bool valid_melee = !strictly_unarmed && ( forced_unarmed || melee_ok ); if( !valid_unarmed && !valid_melee ) { - return false; - } - - if( wall_adjacent && !get_map().is_wall_adjacent( u.pos() ) ) { + add_msg_debug( debugmode::DF_MELEE, "Weapon/technique conflict, attack discarded" ); return false; } @@ -827,7 +901,6 @@ ma_technique::ma_technique() { crit_tec = false; crit_ok = false; - crit_tec_id = tec_none; // if not tec_none, use this tech instead when a crit procs defensive = false; side_switch = false; // moves the target behind user dummy = false; @@ -1372,39 +1445,182 @@ ma_technique character_martial_arts::get_miss_recovery( const Character &owner ) return get_valid_technique( owner, &ma_technique::miss_recovery ); } -std::string character_martial_arts::get_valid_attack_vector( const Character &user, - const std::vector &attack_vectors ) const +std::optional> + character_martial_arts::choose_attack_vector( const Character &user, + const matec_id &tech ) const { - for( auto av : attack_vectors ) { - if( can_use_attack_vector( user, av ) ) { - return av; + // Use the simple weighted list to handle picking semi-randomly + attack_vector_id ret; + weighted_float_list list; + std::pair return_set; + std::vector> storage; + const std::vector anat = user.get_all_body_parts(); + const bool armed = user.is_armed(); + martialart ma = style_selected.obj(); + bool valid_weapon = ma.weapon_valid( user.get_wielded_item() ); + for( const attack_vector_id &vec : tech.obj().attack_vectors ) { + add_msg_debug( debugmode::DF_MELEE, "Evaluating vector %s for tech %s", vec.c_str(), tech.c_str() ); + float weight = 0.0f; + // Early break for armed vectors + if( vec->weapon && armed && valid_weapon ) { + item *weapon = user.get_wielded_item().get_item(); + // Calculate weapon damage for weighting + // Store a dummy sublimb to show we're attacking with a weapon + weight = weapon->base_damage_melee().total_damage(); + list.add_or_replace( vec, weight ); + storage.emplace_back( vec, sub_body_part_sub_limb_debug ); + add_msg_debug( debugmode::DF_MELEE, "Weapon %s eligable for attack vector %s with weight %.1f", + weapon->display_name(), + vec.c_str(), weight ); + continue; + } + // Check if we have the required limbs + bool reqs = true; + for( const std::pair &req : vec->limb_req ) { + int count = 0; + for( const bodypart_id &bp : user.get_all_body_parts_of_type( req.first ) ) { + if( user.get_part_hp_cur( bp ) > bp->health_limit ) { + count++; + } + } + if( count < req.second ) { + add_msg_debug( debugmode::DF_MELEE, + "Limb type requirements: %d matching limbs found from %d req, vector discarded", count, + req.second ); + reqs = false; + break; + } + } + if( !reqs ) { + continue; } - } - return "NONE"; -} + // Smilar bodyparts get appended to the vector limb list in the finalization step + // So we just need to check if we have a limb, a contact area sublimb and tally up the damages + std::vector> calc_vector; + for( const bodypart_str_id &bp : vec->limbs ) { + //const bodypart_str_id &bp = bp_id.id(); + if( std::find( anat.begin(), anat.end(), bp.id() ) != anat.end() ) { + add_msg_debug( debugmode::DF_MELEE, "Evaluating limb %s for vector %s", bp->name, vec.c_str() ); + // Filter on limb flags early + bool allowed = true; + for( const json_character_flag &req : vec->required_limb_flags ) { + if( !bp->has_flag( req ) ) { + add_msg_debug( debugmode::DF_MELEE, "Required limb flag %s not found on limb %s, limb discarded", + req.c_str(), + bp->name ); + allowed = false; + break; + } + } + for( const json_character_flag &forb : vec->forbidden_limb_flags ) { + if( bp->has_flag( forb ) ) { + add_msg_debug( debugmode::DF_MELEE, "Forbidden limb flag %s found on limb %s, limb discarded", + forb.c_str(), + bp->name ); + allowed = false; + break; + } + } + if( !allowed ) { + continue; + } -bool character_martial_arts::can_use_attack_vector( const Character &user, - const std::string &av ) const -{ - martialart ma = style_selected.obj(); - bool valid_weapon = ma.weapon_valid( user.get_wielded_item() ); - int arm_r_hp = user.get_part_hp_cur( bodypart_id( "arm_r" ) ); - int arm_l_hp = user.get_part_hp_cur( bodypart_id( "arm_l" ) ); - int leg_r_hp = user.get_part_hp_cur( bodypart_id( "leg_r" ) ); - int leg_l_hp = user.get_part_hp_cur( bodypart_id( "leg_l" ) ); - bool healthy_arm = arm_r_hp > 0 || arm_l_hp > 0; - bool healthy_arms = arm_r_hp > 0 && arm_l_hp > 0; - bool healthy_legs = leg_r_hp > 0 && leg_l_hp > 0; - bool mouth_ok = ( av == "MOUTH" ) && !user.natural_attack_restricted_on( bodypart_id( "mouth" ) ); - bool always_ok = av == "HEAD" || av == "TORSO"; - bool weapon_ok = av == "WEAPON" && valid_weapon && healthy_arm; - bool arm_ok = ( av == "HAND" || av == "FINGER" || av == "WRIST" || av == "ARM" || av == "ELBOW" || - av == "HAND_BACK" || av == "PALM" || av == "SHOULDER" ) && healthy_arm; - bool arms_ok = ( av == "GRAPPLE" || av == "THROW" ) && healthy_arms; - bool legs_ok = ( av == "FOOT" || av == "LOWER_LEG" || av == "KNEE" || av == "HIP" ) && healthy_legs; - - return always_ok || weapon_ok || mouth_ok || arm_ok || arms_ok || legs_ok; + // TODO: move this from being a special case to the default + int bp_hp_cur = bp->main_part == bp ? user.get_part_hp_cur( bp ) : user.get_part_hp_cur( + bp->main_part ); + int bp_hp_max = bp->main_part == bp ? user.get_part_hp_max( bp ) : user.get_part_hp_max( + bp->main_part ); + if( ( 100 * bp_hp_cur / bp_hp_max ) > vec->bp_hp_limit && + user.get_part_encumbrance_data( bp ).encumbrance < vec->encumbrance_limit ) { + sub_bodypart_str_id current_contact; + for( const sub_bodypart_str_id &sbp : bp->sub_parts ) { + if( std::find( vec->contact_area.begin(), vec->contact_area.end(), + sbp ) != vec->contact_area.end() ) { + current_contact = sbp; + break; + } + } + + float unarmed_damage = calculate_vector_damage( user, vec, current_contact ).total_damage(); + if( unarmed_damage <= 0.0f ) { + // Give extra/damage-less vectors a base chance to be chosen + unarmed_damage = 1.0f; + } + calc_vector.emplace_back( current_contact, unarmed_damage ); + add_msg_debug( debugmode::DF_MELEE, + "Bodypart %s eligable for attack vector %s weight %.1f (contact area %s)", + bp.c_str(), + vec.c_str(), unarmed_damage, current_contact->name ); + } + } + } + if( calc_vector.empty() ) { + add_msg_debug( debugmode::DF_MELEE, "Vector %s found no eligable bodyparts, discarding", + vec.c_str() ); + continue; + } + // Sort our calc_vector of sublimb/damage pairs + std::sort( calc_vector.begin(), + calc_vector.end(), []( const std::pair &a, + const std::pair &b ) { + return a.second < b.second; + } ); + list.add( vec, calc_vector.rbegin()->second ); + storage.emplace_back( vec, calc_vector.rbegin()->first ); + add_msg_debug( debugmode::DF_MELEE, + "Chose contact sublimb %s for vector %s with weight %.1f; %d stored vectors", + calc_vector.rbegin()->first->name, vec.c_str(), calc_vector.rbegin()->second, storage.size() ); + } + if( !list.empty() ) { + ret = *list.pick(); + add_msg_debug( debugmode::DF_MELEE, "Picked vector %s for technique %s", ret.c_str(), + tech.c_str() ); + // Now find the contact data matching the winning vector + for( auto &iterate : storage ) { + if( iterate.first == ret ) { + return_set = iterate; + break; + } + } + return return_set; + } + return std::nullopt; +} + +damage_instance character_martial_arts::calculate_vector_damage( const Character &user, + const attack_vector_id &vec, const sub_bodypart_str_id &contact_area ) const +{ + // Calculate unarmed damage for the given sublimb(s) + damage_instance ret; + // If we got this far the limb is not overencumbered + // But do filter on the flag to bring it in line with the actual damage calc + if( !user.natural_attack_restricted_on( contact_area->parent ) ) { + ret.add( contact_area->parent->unarmed_damage_instance() ); + add_msg_debug( debugmode::DF_MELEE, + "Unarmed damage of bodypart %s %.1f", contact_area->parent->name, + ret.total_damage() ); + } + if( !user.natural_attack_restricted_on( contact_area ) ) { + ret.add( contact_area->unarmed_damage ); + add_msg_debug( debugmode::DF_MELEE, + "Unarmed damage of subpart %s %.1f, total damage %.1f", contact_area->parent->name, + contact_area->unarmed_damage.total_damage(), + ret.total_damage() ); + } + // Add any bonus from worn armor if the vector allows it + if( vec->armor_bonus ) { + outfit current_worn = user.worn; + item *unarmed_weapon = current_worn.current_unarmed_weapon( contact_area ); + if( unarmed_weapon != nullptr ) { + ret.add( unarmed_weapon->base_damage_melee() ); + add_msg_debug( debugmode::DF_MELEE, + "Unarmed weapon %s found, melee damage %.1f, new total damage %.1f", + unarmed_weapon->display_name(), unarmed_weapon->base_damage_melee().total_damage(), + ret.total_damage() ); + } + } + return ret; } bool character_martial_arts::can_leg_block( const Character &owner ) const diff --git a/src/martialarts.h b/src/martialarts.h index 196d473e9b93e..8b98a41383c83 100644 --- a/src/martialarts.h +++ b/src/martialarts.h @@ -26,7 +26,7 @@ class effect; class item; struct itype; -extern const matec_id tec_none; +const matec_id tec_none( "tec_none" ); class weapon_category { @@ -66,6 +66,38 @@ class weapon_category matype_id martial_art_learned_from( const itype & ); +struct attack_vector { + attack_vector_id id; + + // Used with a weapon, otherwise use unarmed damage calc + bool weapon = false; + + // Explicit bodypart definitions + std::vector limbs; + // If true no limb substitution step happens + bool strict_limb_definition = false; + // The actual contact area for unarmed damage calcs + std::vector contact_area; + // If we have any bodypart count restrictions + std::vector> limb_req; + // Do we care about armor damage bonuses + bool armor_bonus = true; + + cata::flat_set required_limb_flags; + cata::flat_set forbidden_limb_flags; + + // Encumbrance limit in absolute encumbrance + int encumbrance_limit = 100; + // Percent of bodypart HP required + int bp_hp_limit = 10; + + bool was_loaded = false; + + static void load_attack_vectors( const JsonObject &jo, const std::string &src ); + static void reset(); + void load( const JsonObject &jo, std::string_view ); +}; + struct ma_requirements { bool was_loaded = false; @@ -132,6 +164,8 @@ class ma_technique ma_technique(); void load( const JsonObject &jo, const std::string &src ); + static void verify_ma_techniques(); + void check() const; matec_id id; std::vector> src; @@ -159,17 +193,11 @@ class ma_technique bool crit_ok = false; bool reach_tec = false; // only possible to use during a reach attack bool reach_ok = false; // possible to use during a reach attack - bool attack_override = false; // The attack replaces the one it triggered off of - - // performs the listed technique if this attack procs a crit. tec_none skips this behavior. - // requires crit_ok to be true - matec_id crit_tec_id = tec_none; ma_requirements reqs; // What way is the technique delivered to the target? - std::vector attack_vectors; // by priority - std::vector attack_vectors_random; // randomly + std::vector attack_vectors; int repeat_min = 1; // Number of times the technique is repeated on a successful proc int repeat_max = 1; diff --git a/src/melee.cpp b/src/melee.cpp index 105db6c65c05f..dd95f3d0c4382 100644 --- a/src/melee.cpp +++ b/src/melee.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -73,9 +74,10 @@ static const anatomy_id anatomy_human_anatomy( "human_anatomy" ); +static const attack_vector_id attack_vector_vector_null( "vector_null" ); + static const bionic_id bio_cqb( "bio_cqb" ); static const bionic_id bio_heat_absorb( "bio_heat_absorb" ); -static const bionic_id bio_razors( "bio_razors" ); static const bionic_id bio_shock( "bio_shock" ); static const character_modifier_id @@ -120,11 +122,8 @@ static const json_character_flag json_flag_GRAB( "GRAB" ); static const json_character_flag json_flag_GRAB_FILTER( "GRAB_FILTER" ); static const json_character_flag json_flag_HARDTOHIT( "HARDTOHIT" ); static const json_character_flag json_flag_HYPEROPIC( "HYPEROPIC" ); -static const json_character_flag json_flag_NEED_ACTIVE_TO_MELEE( "NEED_ACTIVE_TO_MELEE" ); static const json_character_flag json_flag_NULL( "NULL" ); static const json_character_flag json_flag_PSEUDOPOD_GRASP( "PSEUDOPOD_GRASP" ); -static const json_character_flag json_flag_UNARMED_BONUS( "UNARMED_BONUS" ); - static const limb_score_id limb_score_block( "block" ); static const limb_score_id limb_score_grip( "grip" ); static const limb_score_id limb_score_reaction( "reaction" ); @@ -440,7 +439,8 @@ std::string Character::get_miss_reason() } void Character::roll_all_damage( bool crit, damage_instance &di, bool average, - const item &weap, const std::string &attack_vector, const Creature *target, + const item &weap, const attack_vector_id &attack_vector, const sub_bodypart_str_id &contact, + const Creature *target, const bodypart_id &bp ) const { float crit_mod = 1.f; @@ -448,12 +448,12 @@ void Character::roll_all_damage( bool crit, damage_instance &di, bool average, crit_mod = target->get_crit_factor( bp ); } for( const damage_type &dt : damage_type::get_all() ) { - roll_damage( dt.id, crit, di, average, weap, attack_vector, crit_mod ); + roll_damage( dt.id, crit, di, average, weap, attack_vector, contact, crit_mod ); } } static void melee_train( Character &you, int lo, int hi, const item &weap, - const std::string &attack_vector ) + const attack_vector_id vector ) { you.practice( skill_melee, std::ceil( rng( lo, hi ) / 2.0 ), hi ); @@ -477,7 +477,7 @@ static void melee_train( Character &you, int lo, int hi, const item &weap, total = std::max( total, 1.f ); // Unarmed may deal cut, stab, and bash damage depending on the weapon - if( attack_vector != "WEAPON" ) { + if( !vector->weapon ) { you.practice( skill_unarmed, std::ceil( 1 * rng( lo, hi ) ), hi ); } else { for( const std::pair &dmg : dmg_vals ) { @@ -714,8 +714,7 @@ bool Character::melee_attack_abstract( Creature &t, bool allow_special, // Practice melee and relevant weapon skill (if any) except when using CQB bionic if( !has_active_bionic( bio_cqb ) && !t.is_hallucination() ) { - std::string attack_vector = cur_weapon ? "WEAPON" : "HAND"; - melee_train( *this, 2, std::min( 5, skill_training_cap ), cur_weap, attack_vector ); + melee_train( *this, 2, std::min( 5, skill_training_cap ), cur_weap, attack_vector_vector_null ); } // Cap stumble penalty, heavy weapons are quite weak already @@ -741,53 +740,44 @@ bool Character::melee_attack_abstract( Creature &t, bool allow_special, const bool has_force_technique = !force_technique.str().empty(); - // Pick one or more special attacks - matec_id technique_id; + // Pick an attack + vector + contact area set + // tuple matec_id, attack_vector, std::vector ? + // We need the tech for tech data, chosen vector to decide on the weapon <-> just use sbp_dummy for weapon techs? + std::tuple attack; + + // Pick our attack + // Unarmed needs a defined technique if( has_force_technique ) { - technique_id = force_technique; + attack = std::make_tuple( force_technique, attack_vector_vector_null, + sub_body_part_sub_limb_debug ); } else if( allow_special ) { - technique_id = pick_technique( t, cur_weapon, critical_hit, false, false ); - if( critical_hit && technique_id.obj().crit_tec_id != tec_none ) { - technique_id = technique_id.obj().crit_tec_id; - } + attack = pick_technique( t, cur_weapon, critical_hit, false, false ); } else { - technique_id = tec_none; - } - - std::string attack_vector; - - // Failsafe for tec_none - if( technique_id == tec_none ) { - attack_vector = cur_weapon ? "WEAPON" : "HAND"; - } else { - attack_vector = martial_arts_data->get_valid_attack_vector( *this, - technique_id.obj().attack_vectors ); - - if( attack_vector == "NONE" ) { - std::vector shuffled_attack_vectors = technique_id.obj().attack_vectors_random; - std::shuffle( shuffled_attack_vectors.begin(), shuffled_attack_vectors.end(), rng_get_engine() ); - attack_vector = martial_arts_data->get_valid_attack_vector( *this, shuffled_attack_vectors ); - } + attack = std::make_tuple( tec_none, attack_vector_vector_null, sub_body_part_sub_limb_debug ); } + // Unpack our data + matec_id attack_id; + attack_vector_id vector_id; + sub_bodypart_str_id contact_area; + std::tie( attack_id, vector_id, contact_area ) = attack; // If no weapon is selected, use highest layer of clothing for attack vector instead. - if( attack_vector != "WEAPON" ) { + if( contact_area != sub_body_part_sub_limb_debug ) { // todo: simplify this by using item_location everywhere // so only cur_weapon = worn.current_unarmed_weapon remains - item *worn_weap = worn.current_unarmed_weapon( attack_vector ); - cur_weapon = worn_weap ? item_location( *this, worn_weap ) : item_location(); - cur_weap = cur_weapon ? *cur_weapon : null_item_reference(); + // Check if our vector allows armor-derived damage + if( vector_id->armor_bonus ) { + item *worn_weap = worn.current_unarmed_weapon( contact_area ); + cur_weapon = worn_weap ? item_location( *this, worn_weap ) : item_location(); + cur_weap = cur_weapon ? *cur_weapon : null_item_reference(); + add_msg_debug( debugmode::DF_MELEE, "Vector allows armor damage calculation, chosen weapon %s", + cur_weap.display_name() ); + } } damage_instance d; - roll_all_damage( critical_hit, d, false, cur_weap, attack_vector, &t, target_bp ); + roll_all_damage( critical_hit, d, false, cur_weap, vector_id, contact_area, &t, target_bp ); - // your hits are not going to hurt very much if you can't use martial arts due to broken limbs - if( attack_vector == "HAND" && get_working_arm_count() < 1 ) { - technique_id = tec_none; - d.mult_damage( 0.1 ); - add_msg_if_player( m_bad, _( "Your arms are too damaged or encumbered to fight effectively!" ) ); - } // polearms and pikes (but not spears) do less damage to adjacent targets // In the case of a weapon like a glaive or a naginata, the wielder // lacks the room to build up momentum on a slash. @@ -809,7 +799,7 @@ bool Character::melee_attack_abstract( Creature &t, bool allow_special, d.mult_damage( 0.8 ); } - const ma_technique &technique = technique_id.obj(); + const ma_technique &technique = attack_id.obj(); // Handles effects as well; not done in melee_affect_* if( technique.id != tec_none ) { @@ -832,11 +822,7 @@ bool Character::melee_attack_abstract( Creature &t, bool allow_special, std::string specialmsg; // Handles speed penalties to monster & us, etc if( !t.is_hallucination() ) { - if( technique.attack_override ) { - specialmsg = melee_special_effects( t, d, null_item_reference() ); - } else { - specialmsg = melee_special_effects( t, d, cur_weap ); - } + specialmsg = melee_special_effects( t, d, cur_weap ); } // gets overwritten with the dealt damage values @@ -908,7 +894,7 @@ bool Character::melee_attack_abstract( Creature &t, bool allow_special, // Practice melee and relevant weapon skill (if any) except when using CQB bionic if( !has_active_bionic( bio_cqb ) && !t.is_hallucination() ) { - melee_train( *this, 5, std::min( 10, skill_training_cap ), cur_weap, attack_vector ); + melee_train( *this, 5, std::min( 10, skill_training_cap ), cur_weap, vector_id ); } // Treat monster as seen if we see it before or after the attack @@ -1284,11 +1270,11 @@ float Character::bonus_damage( bool random ) const static void roll_melee_damage_internal( const Character &u, const damage_type_id &dt, bool crit, damage_instance &di, bool average, const item &weap, - const std::string &attack_vector, float crit_mod ) + const attack_vector_id &attack_vector, const sub_bodypart_str_id &contact, float crit_mod ) { // FIXME: Hardcoded damage type float dmg = dt == damage_bash ? 0.f : u.mabuff_damage_bonus( dt ) + weap.damage_melee( dt ); - bool unarmed = attack_vector != "WEAPON"; + bool unarmed = !attack_vector->weapon; int arpen = 0; float skill = u.get_skill_level( unarmed ? skill_unarmed : dt->skill ); @@ -1297,82 +1283,16 @@ static void roll_melee_damage_internal( const Character &u, const damage_type_id skill = BIO_CQB_LEVEL; } - if( unarmed ) { - bool bp_unrestricted; - - if( attack_vector == "ARM" ) { - bp_unrestricted = !u.natural_attack_restricted_on( bodypart_id( "arm_l" ) ) || - ( !u.natural_attack_restricted_on( bodypart_id( "arm_r" ) ) ); - } else if( attack_vector == "ELBOW" ) { - bp_unrestricted = !u.natural_attack_restricted_on( sub_bodypart_id( "arm_elbow_l" ) ) || - ( !u.natural_attack_restricted_on( sub_bodypart_id( "arm_elbow_r" ) ) ); - } else if( attack_vector == "WRIST" ) { - bp_unrestricted = !u.natural_attack_restricted_on( sub_bodypart_id( "hand_wrist_l" ) ) || - ( !u.natural_attack_restricted_on( sub_bodypart_id( "hand_wrist_r" ) ) ); - } else if( attack_vector == "SHOULDER" ) { - bp_unrestricted = !u.natural_attack_restricted_on( sub_bodypart_id( "arm_shoulder_l" ) ) || - ( !u.natural_attack_restricted_on( sub_bodypart_id( "arm_shoulder_r" ) ) ); - } else if( attack_vector == "FOOT" ) { - bp_unrestricted = !u.natural_attack_restricted_on( bodypart_id( "foot_l" ) ) || - ( !u.natural_attack_restricted_on( bodypart_id( "foot_r" ) ) ); - } else if( attack_vector == "LOWER_LEG" ) { - bp_unrestricted = !u.natural_attack_restricted_on( sub_bodypart_id( "leg_lower_l" ) ) || - ( !u.natural_attack_restricted_on( sub_bodypart_id( "leg_lower_r" ) ) ); - } else if( attack_vector == "KNEE" ) { - bp_unrestricted = !u.natural_attack_restricted_on( sub_bodypart_id( "leg_knee_l" ) ) || - ( !u.natural_attack_restricted_on( sub_bodypart_id( "leg_knee_r" ) ) ); - } else if( attack_vector == "HIP" ) { - bp_unrestricted = !u.natural_attack_restricted_on( sub_bodypart_id( "leg_hip_l" ) ) || - ( !u.natural_attack_restricted_on( sub_bodypart_id( "leg_hip_r" ) ) ); - } else if( attack_vector == "HEAD" ) { - bp_unrestricted = !u.natural_attack_restricted_on( bodypart_id( "head" ) ); - } else if( attack_vector == "MOUTH" ) { - bp_unrestricted = !u.natural_attack_restricted_on( bodypart_id( "mouth" ) ); - } else if( attack_vector == "TORSO" ) { - bp_unrestricted = !u.natural_attack_restricted_on( bodypart_id( "torso" ) ); - } else { - bp_unrestricted = !u.natural_attack_restricted_on( bodypart_id( "hand_l" ) ) || - ( !u.natural_attack_restricted_on( bodypart_id( "hand_r" ) ) && weap.is_null() ); - } - - if( bp_unrestricted ) { - float extra_damage = 0.0f; - for( const trait_id &mut : u.get_mutations() ) { - if( mut->flags.count( json_flag_NEED_ACTIVE_TO_MELEE ) > 0 && !u.has_active_mutation( mut ) ) { - continue; - } - float unarmed_bonus = 0.0f; - int bonus_dmg = 0; - std::pair bonus_rand = { 0, 0 }; - if( mut->flags.count( json_flag_UNARMED_BONUS ) > 0 && bonus_dmg > 0 ) { - unarmed_bonus += std::min( u.get_skill_level( skill_unarmed ) / 2, 4.0f ); - } - extra_damage += bonus_dmg + unarmed_bonus; - extra_damage += average ? ( bonus_rand.first + bonus_rand.second ) / 2.0f : - rng( bonus_rand.first, bonus_rand.second ); - } - - // FIXME: Hardcoded damage type effect (stab) - if( attack_vector == "HAND" && dt == damage_stab && u.has_bionic( bio_razors ) ) { - extra_damage += 2; - } - - dmg += extra_damage; - } + if( unarmed && !u.natural_attack_restricted_on( contact ) ) { + // Add contact/parent damage bonuses to unarmed + dmg += contact->unarmed_damage.type_damage( dt ); + arpen += contact->unarmed_damage.type_arpen( dt ); + if( !u.natural_attack_restricted_on( contact->parent ) ) { - float dam = 0.0f; - float ap = 0.0f; - for( const bodypart_id &bp : u.get_all_body_parts() ) { - if( bp->unarmed_bonus && !u.natural_attack_restricted_on( bp ) ) { - dam += bp->unarmed_damage( dt ); - ap += bp->unarmed_arpen( dt ); - } + dmg += contact->parent->unarmed_damage( dt ); + arpen += contact->parent->unarmed_arpen( dt ); } - dmg += dam; - arpen += ap; - } - /** @ARM_STR increases bashing damage */ float stat_bonus = u.bonus_damage( !average ); stat_bonus += u.mabuff_damage_bonus( dt ); @@ -1454,29 +1374,26 @@ static void roll_melee_damage_internal( const Character &u, const damage_type_id } void Character::roll_damage( const damage_type_id &dt, bool crit, damage_instance &di, bool average, - const item &weap, const std::string &attack_vector, float crit_mod ) const + const item &weap, const attack_vector_id &attack_vector, const sub_bodypart_str_id &contact, + float crit_mod ) const { // For handling typical melee damage types (bash, cut, stab) if( dt->melee_only ) { - roll_melee_damage_internal( *this, dt, crit, di, average, weap, attack_vector, crit_mod ); + roll_melee_damage_internal( *this, dt, crit, di, average, weap, attack_vector, contact, crit_mod ); return; } - bool unarmed = attack_vector != "WEAPON"; - float other_dam = mabuff_damage_bonus( dt ) + weap.damage_melee( dt ); float arpen = 0.0f; - if( unarmed ) { - float dam = 0.0f; - float ap = 0.0f; - for( const bodypart_id &bp : get_all_body_parts() ) { - if( bp->unarmed_bonus && !natural_attack_restricted_on( bp ) ) { - dam += bp->unarmed_damage( dt ); - arpen += bp->unarmed_arpen( dt ); - } + bool unarmed = !attack_vector->weapon; + if( unarmed && !this->natural_attack_restricted_on( contact ) ) { + // Add contact/parent damage bonuses to unarmed + other_dam += contact->unarmed_damage.type_damage( dt ); + arpen += contact->unarmed_damage.type_arpen( dt ); + if( !this->natural_attack_restricted_on( contact->parent ) ) { + other_dam += contact->parent->unarmed_damage( dt ); + arpen += contact->parent->unarmed_arpen( dt ); } - other_dam += dam; - arpen += ap; } // No negative damage! @@ -1487,165 +1404,170 @@ void Character::roll_damage( const damage_type_id &dt, bool crit, damage_instanc di.add_damage( dt, other_dam, arpen, armor_mult, other_mul ); } } -matec_id Character::pick_technique( Creature &t, const item_location &weap, bool crit, - bool dodge_counter, bool block_counter, const std::vector &blacklist ) -{ - std::vector possible = evaluate_techniques( t, weap, crit, - dodge_counter, block_counter, blacklist ); - return random_entry( possible, tec_none ); -} -std::vector Character::evaluate_techniques( Creature &t, const item_location &weap, - bool crit, bool dodge_counter, bool block_counter, const std::vector &blacklist ) +std::tuple Character::pick_technique( + Creature &t, const item_location &weap, bool crit, + bool dodge_counter, bool block_counter, const std::vector &blacklist ) { - const std::vector all = martial_arts_data->get_all_techniques( weap, *this ); - std::vector possible; - - bool wall_adjacent = get_map().is_wall_adjacent( pos() ); - // this could be more robust but for now it should work fine - bool is_loaded = weap && weap->is_magazine_full(); + std::vector> possible; - // first add non-aoe tecs for( const matec_id &tec_id : all ) { - const ma_technique &tec = tec_id.obj(); - add_msg_debug( debugmode::DF_MELEE, "Evaluating technique %s", tec.name ); + add_msg_debug( debugmode::DF_MELEE, "Evaluating technique %s", tec_id->name ); - // skip techniques on the blacklist if( find( blacklist.begin(), blacklist.end(), tec_id ) != blacklist.end() ) { add_msg_debug( debugmode::DF_MELEE, "Technique is on the blacklist, discarded" ); continue; } - // ignore "dummy" techniques like WBLOCK_1 - if( tec.dummy ) { - add_msg_debug( debugmode::DF_MELEE, "Dummy technique, attack discarded" ); - continue; - } - - // skip defensive techniques - if( tec.defensive ) { - add_msg_debug( debugmode::DF_MELEE, "Defensive technique, attack discarded" ); - continue; - } - - // Ignore this technique if we fail the doalog conditions - if( tec.has_condition ) { - dialogue d( get_talker_for( this ), get_talker_for( t ) ); - if( !tec.condition( d ) ) { - add_msg_debug( debugmode::DF_MELEE, "Conditionas failed, attack discarded" ); - continue; + auto tec = evaluate_technique( tec_id, t, weap, crit, + dodge_counter, block_counter ); + if( tec ) { + possible.push_back( tec.value() ); + if( tec_id->weighting > 1 ) { + for( int i = 1; i < tec_id->weighting; i++ ) { + possible.push_back( tec.value() ); + add_msg_debug( debugmode::DF_MELEE, "Adding technique %s to the tech list (%d)", tec_id->name, i ); + } } } + } - // skip wall adjacent techniques if not next to a wall - if( tec.wall_adjacent && !wall_adjacent ) { - add_msg_debug( debugmode::DF_MELEE, "No adjacent walls found, attack discarded" ); - continue; - } + return random_entry( possible, + std::make_tuple( tec_none, attack_vector_vector_null, + sub_body_part_sub_limb_debug ) ); +} +std::optional> + Character::evaluate_technique( const matec_id &tec_id, Creature &t, const item_location &weap, + bool crit, bool dodge_counter, bool block_counter ) +{ + // this could be more robust but for now it should work fine + bool is_loaded = weap && weap->is_magazine_full(); - // skip non reach ok techniques if reach attacking - if( !( tec.reach_ok || tec.reach_tec ) && reach_attacking ) { - add_msg_debug( debugmode::DF_MELEE, "Not usable with reach attack, attack discarded" ); - continue; - } + // ignore "dummy" techniques like WBLOCK_1 + if( tec_id->dummy ) { + add_msg_debug( debugmode::DF_MELEE, "Dummy technique, attack discarded" ); + return std::nullopt; + } - // skip reach techniques if not reach attacking - if( tec.reach_tec && !reach_attacking ) { - add_msg_debug( debugmode::DF_MELEE, "Only usable with reach attack, attack discarded" ); - continue; - } + // skip defensive techniques + if( tec_id->defensive ) { + add_msg_debug( debugmode::DF_MELEE, "Defensive technique, attack discarded" ); + return std::nullopt; + } - // skip dodge counter techniques if it's not a dodge count, and vice versa - if( dodge_counter != tec.dodge_counter ) { - add_msg_debug( debugmode::DF_MELEE, "Not a dodge counter, attack discarded" ); - continue; - } - // likewise for block counters - if( block_counter != tec.block_counter ) { - add_msg_debug( debugmode::DF_MELEE, "Not a block counter, attack discarded" ); - continue; + // Ignore this technique if we fail the dialog conditions + if( tec_id->has_condition ) { + dialogue d( get_talker_for( this ), get_talker_for( t ) ); + if( !tec_id->condition( d ) ) { + add_msg_debug( debugmode::DF_MELEE, "Conditionals failed, attack discarded" ); + return std::nullopt; } + } - // Don't counter if it would exhaust moves. - if( tec.block_counter || tec.dodge_counter ) { - item &used_weap = used_weapon() ? *used_weapon() : null_item_reference(); - float move_cost = attack_speed( used_weap ); - move_cost *= tec.move_cost_multiplier( *this ); - move_cost += tec.move_cost_penalty( *this ); - float move_mult = exertion_adjusted_move_multiplier( EXTRA_EXERCISE ); - move_cost *= ( 1.0f / move_mult ); - if( get_moves() + get_speed() - move_cost < 0 ) { - add_msg_debug( debugmode::DF_MELEE, - "Counter technique would exhaust remaining moves, attack discarded" ); - continue; - } - } + // skip wall adjacent techniques if not next to a wall + if( tec_id->wall_adjacent && !get_map().is_wall_adjacent( pos() ) ) { + add_msg_debug( debugmode::DF_MELEE, "No adjacent walls found, attack discarded" ); + return std::nullopt; + } - // if critical then select only from critical tecs - // but allow the technique if its crit ok - if( !tec.crit_ok && ( crit != tec.crit_tec ) ) { - add_msg_debug( debugmode::DF_MELEE, "Attack is%s critical, attack discarded", crit ? "" : "n't" ); - continue; - } + // skip non reach ok techniques if reach attacking + if( !( tec_id->reach_ok || tec_id->reach_tec ) && reach_attacking ) { + add_msg_debug( debugmode::DF_MELEE, "Not usable with reach attack, attack discarded" ); + return std::nullopt; + } - // if the technique needs a loaded weapon and it isn't loaded skip it - if( tec.needs_ammo && !is_loaded ) { - add_msg_debug( debugmode::DF_MELEE, "No ammo, attack discarded" ); - continue; - } + // skip reach techniques if not reach attacking + if( tec_id->reach_tec && !reach_attacking ) { + add_msg_debug( debugmode::DF_MELEE, "Only usable with reach attack, attack discarded" ); + return std::nullopt; + } + + // skip dodge counter techniques if it's not a dodge count, and vice versa + if( dodge_counter != tec_id->dodge_counter ) { + add_msg_debug( debugmode::DF_MELEE, "%s a dodge counter, discarded", + dodge_counter ? "Looking for" : + "Attack is" ); + return std::nullopt; + } + // likewise for block counters + if( block_counter != tec_id->block_counter ) { + add_msg_debug( debugmode::DF_MELEE, "%s a block counter, attack discarded", + block_counter ? "Looking for" : "Attack is" ); + return std::nullopt; + } - // don't apply disarming techniques to someone without a weapon - // TODO: these are the stat requirements for tec_disarm - // dice( dex_cur + get_skill_level("unarmed"), 8) > - // dice(p->dex_cur + p->get_skill_level("melee"), 10)) - if( tec.disarms && !t.has_weapon() ) { + // Don't counter if it would exhaust moves. + if( tec_id->block_counter || tec_id->dodge_counter ) { + item &used_weap = used_weapon() ? *used_weapon() : null_item_reference(); + float move_cost = attack_speed( used_weap ); + move_cost *= tec_id->move_cost_multiplier( *this ); + move_cost += tec_id->move_cost_penalty( *this ); + float move_mult = exertion_adjusted_move_multiplier( EXTRA_EXERCISE ); + move_cost *= ( 1.0f / move_mult ); + if( get_moves() + get_speed() - move_cost < 0 ) { add_msg_debug( debugmode::DF_MELEE, - "Disarming technique against unarmed opponent, attack discarded" ); - continue; + "Counter technique would exhaust remaining moves, attack discarded" ); + return std::nullopt; } + } - if( tec.take_weapon && ( has_weapon() || !t.has_weapon() ) ) { - add_msg_debug( debugmode::DF_MELEE, "Weapon-taking technique %s, attack discarded", - has_weapon() ? "while armed" : "against an unarmed opponent" ); - continue; - } + // if critical then select only from critical tecs + // but allow the technique if its crit ok + if( !tec_id->crit_ok && ( crit != tec_id->crit_tec ) ) { + add_msg_debug( debugmode::DF_MELEE, "Attack is%s critical, attack discarded", crit ? "" : "n't" ); + return std::nullopt; + } - // if aoe, check if there are valid targets - if( !tec.aoe.empty() && !valid_aoe_technique( t, tec ) ) { - add_msg_debug( debugmode::DF_MELEE, "AoE technique witout valid AoE targets, attack discarded" ); - continue; - } + // if the technique needs a loaded weapon and it isn't loaded skip it + if( tec_id->needs_ammo && !is_loaded ) { + add_msg_debug( debugmode::DF_MELEE, "No ammo, attack discarded" ); + return std::nullopt; + } - // If we have negative weighting then roll to see if it's valid this time - if( tec.weighting < 0 && !one_in( std::abs( tec.weighting ) ) ) { - add_msg_debug( debugmode::DF_MELEE, - "Negative technique weighting failed weight roll, attack discarded" ); - continue; - } + // don't apply disarming techniques to someone without a weapon + // TODO: these are the stat requirements for tec_disarm + // dice( dex_cur + get_skill_level("unarmed"), 8) > + // dice(p->dex_cur + p->get_skill_level("melee"), 10)) + if( tec_id->disarms && !t.has_weapon() ) { + add_msg_debug( debugmode::DF_MELEE, + "Disarming technique against unarmed opponent, attack discarded" ); + return std::nullopt; + } - // Does the player have a functional attack vector to deliver the technique? - std::vector shuffled_attack_vectors = tec.attack_vectors_random; - std::shuffle( shuffled_attack_vectors.begin(), shuffled_attack_vectors.end(), rng_get_engine() ); - if( martial_arts_data->get_valid_attack_vector( *this, tec.attack_vectors ) == "NONE" && - martial_arts_data->get_valid_attack_vector( *this, shuffled_attack_vectors ) == "NONE" ) { - add_msg_debug( debugmode::DF_MELEE, "No valid attack vector found, attack discarded" ); - continue; - } + if( tec_id->take_weapon && ( has_weapon() || !t.has_weapon() ) ) { + add_msg_debug( debugmode::DF_MELEE, "Weapon-taking technique %s, attack discarded", + has_weapon() ? "while armed" : "against an unarmed opponent" ); + return std::nullopt; + } - if( tec.is_valid_character( *this ) ) { - possible.push_back( tec.id ); + // if aoe, check if there are valid targets + if( !tec_id->aoe.empty() && !valid_aoe_technique( t, tec_id.obj() ) ) { + add_msg_debug( debugmode::DF_MELEE, "AoE technique witout valid AoE targets, attack discarded" ); + return std::nullopt; + } - //add weighted options into the list extra times, to increase their chance of being selected - if( tec.weighting > 1 ) { - for( int i = 1; i < tec.weighting; i++ ) { - possible.push_back( tec.id ); - } - } + // If we have negative weighting then roll to see if it's valid this time + if( tec_id->weighting < 0 && !one_in( std::abs( tec_id->weighting ) ) ) { + add_msg_debug( debugmode::DF_MELEE, + "Negative technique weighting failed weight roll, attack discarded" ); + return std::nullopt; + } + + std::optional> vector; + + if( tec_id->is_valid_character( *this ) ) { + // We made it this far, choose an actual vector if possible + vector = martial_arts_data->choose_attack_vector( *this, tec_id ); + if( vector ) { + return std::make_tuple( tec_id, vector->first, vector->second ); + } else { + add_msg_debug( debugmode::DF_MELEE, "No valid attack vector found, attack discarded" ); + return std::nullopt; } } - return possible; + return std::nullopt; } bool Character::valid_aoe_technique( Creature &t, const ma_technique &technique ) @@ -1807,12 +1729,6 @@ void Character::perform_technique( const ma_technique &technique, Creature &t, int rep = rng( technique.repeat_min, technique.repeat_max ); add_msg_debug( debugmode::DF_MELEE, "Tech repeats %d times", rep ); - // Keep the technique definitions shorter - if( technique.attack_override ) { - move_cost = 0; - di.clear(); - } - for( const damage_type &dt : damage_type::get_all() ) { float dam = technique.damage_bonus( *this, dt.id ); float arpen = technique.armor_penetration( *this, dt.id ); @@ -2258,7 +2174,7 @@ bool Character::block_hit( Creature *source, bodypart_id &bp_hit, damage_instanc martial_arts_data->ma_onblock_effects( *this ); // Check if we have any block counters - matec_id tec = pick_technique( *source, shield, false, false, true ); + matec_id tec = std::get<0>( pick_technique( *source, shield, false, false, true ) ); if( tec != tec_none && !is_dead_state() ) { int twenty_percent = std::round( ( 20 * weapon.type->mat_portion_total ) / 100.0f ); diff --git a/src/subbodypart.cpp b/src/subbodypart.cpp index 8c69f4f1884dd..8a4732741470d 100644 --- a/src/subbodypart.cpp +++ b/src/subbodypart.cpp @@ -84,6 +84,7 @@ void sub_body_part_type::load( const JsonObject &jo, const std::string_view ) // defaults to self optional( jo, was_loaded, "locations_under", locations_under, { id } ); optional( jo, was_loaded, "similar_bodyparts", similar_bodyparts ); + optional( jo, was_loaded, "unarmed_damage", unarmed_damage ); } void sub_body_part_type::reset() diff --git a/src/subbodypart.h b/src/subbodypart.h index 94a86e62bb780..16cb6af3dd17a 100644 --- a/src/subbodypart.h +++ b/src/subbodypart.h @@ -10,6 +10,7 @@ #include #include +#include "damage.h" #include "enums.h" #include "flat_set.h" #include "int_id.h" @@ -75,6 +76,8 @@ struct sub_body_part_type { // These subparts act like this limb for armor coverage // TODO: Coverage/Encumbrance multiplier std::vector similar_bodyparts; + // Unarmed damage when this subpart is our contact area + damage_instance unarmed_damage; static void load_bp( const JsonObject &jo, const std::string &src ); diff --git a/src/talker_character.cpp b/src/talker_character.cpp index b12146efc0b12..5fa81e2dde7c2 100644 --- a/src/talker_character.cpp +++ b/src/talker_character.cpp @@ -1215,8 +1215,9 @@ void talker_character::die() matec_id talker_character::get_random_technique( Creature &t, bool crit, bool dodge_counter, bool block_counter, const std::vector &blacklist ) const { - return me_chr->pick_technique( t, me_chr->used_weapon(), crit, dodge_counter, block_counter, - blacklist ); + return std::get<0>( me_chr->pick_technique( t, me_chr->used_weapon(), crit, dodge_counter, + block_counter, + blacklist ) ); } void talker_character::attack_target( Creature &t, bool allow_special, diff --git a/src/type_id.h b/src/type_id.h index b13f55a9d9469..13685d8e419b9 100644 --- a/src/type_id.h +++ b/src/type_id.h @@ -23,6 +23,9 @@ struct ammo_effect; using ammo_effect_id = int_id; using ammo_effect_str_id = string_id; +struct attack_vector; +using attack_vector_id = string_id; + struct bionic_data; using bionic_id = string_id; diff --git a/tests/martial_art_test.cpp b/tests/martial_art_test.cpp index af1a617914a65..2bbfee2bb5af9 100644 --- a/tests/martial_art_test.cpp +++ b/tests/martial_art_test.cpp @@ -1,3 +1,5 @@ +#include + #include "catch/catch.hpp" #include "player_helpers.h" @@ -8,11 +10,14 @@ #include "mtype.h" #include "npc.h" +static const bodypart_str_id body_part_debug_tail( "debug_tail" ); static const efftype_id effect_downed( "downed" ); static const efftype_id effect_grabbed( "grabbed" ); static const efftype_id effect_grabbing( "grabbing" ); static const efftype_id effect_stunned( "stunned" ); +static const enchantment_id enchantment_ENCH_TEST_BIRD_PARTS( "ENCH_TEST_BIRD_PARTS" ); + static const itype_id itype_club_wooden( "club_wooden" ); static const itype_id itype_sword_crude( "sword_crude" ); static const itype_id itype_test_weapon1( "test_weapon1" ); @@ -22,11 +27,15 @@ static const matec_id test_tech_condition_knockback( "test_tech_condition_knockb static const matec_id test_tech_condition_stun( "test_tech_condition_stun" ); static const matec_id test_tech_condition_sweep( "test_tech_condition_sweep" ); static const matec_id test_technique( "test_technique" ); +static const matec_id test_vector_tech_1( "test_vector_tech_1" ); +static const matec_id test_vector_tech_2( "test_vector_tech_2" ); static const matype_id test_style_ma1( "test_style_ma1" ); static const species_id species_SLIME( "SLIME" ); static const species_id species_ZOMBIE( "ZOMBIE" ); +static const trait_id trait_DEBUG_TAIL( "DEBUG_TAIL" ); + static constexpr tripoint dude_pos( HALF_MAPSIZE_X, HALF_MAPSIZE_Y, 0 ); TEST_CASE( "martial_arts", "[martial_arts]" ) @@ -78,6 +87,68 @@ TEST_CASE( "Martial_art_required_weapon_categories", "[martial_arts]" ) } } +TEST_CASE( "Attack_vector_test", "[martial_arts][limb]" ) +{ + clear_map(); + standard_npc dude( "TestCharacter", dude_pos, {}, 0, 8, 8, 8, 8 ); + clear_character( dude ); + dude.martial_arts_data->add_martialart( test_style_ma1 ); + dude.martial_arts_data->set_style( test_style_ma1, false ); + monster &target_1 = spawn_test_monster( "mon_zombie_fat", dude_pos + tripoint_east ); + const matec_id &tec = *test_style_ma1->techniques.find( test_vector_tech_1 ); + const matec_id &tec2 = *test_style_ma1->techniques.find( test_vector_tech_2 ); + REQUIRE( !dude.evaluate_technique( tec, target_1, dude.used_weapon(), false, false, + false ) ); + REQUIRE( dude.evaluate_technique( tec2, target_1, dude.used_weapon(), false, false, + false ) ); + REQUIRE( dude.get_all_body_parts_of_type( body_part_type::type::tail ).empty() ); + + SECTION( "Limb requirements" ) { + // Grow a tail, suddenly we can use it + dude.toggle_trait( trait_DEBUG_TAIL ); + CHECK( dude.evaluate_technique( tec, target_1, dude.used_weapon(), false, false, + false ) ); + // Unless our tail breaks + REQUIRE( body_part_debug_tail->health_limit == 5 ); + dude.set_part_hp_cur( body_part_debug_tail, 1 ); + CHECK( !dude.evaluate_technique( tec, target_1, dude.used_weapon(), false, false, + false ) ); + } + SECTION( "Missing contact" ) { + // Lose our vector limb + dude.toggle_trait( trait_DEBUG_TAIL ); + CHECK( dude.evaluate_technique( tec, target_1, dude.used_weapon(), false, false, + false ) ); + dude.enchantment_cache->force_add( *enchantment_ENCH_TEST_BIRD_PARTS, dude ); + dude.recalculate_bodyparts(); + REQUIRE( !dude.has_part( body_part_hand_l ) ); + CHECK( !dude.evaluate_technique( tec, target_1, dude.used_weapon(), false, false, + false ) ); + } + SECTION( "Limb HP" ) { + dude.toggle_trait( trait_DEBUG_TAIL ); + CHECK( dude.evaluate_technique( tec, target_1, dude.used_weapon(), false, false, + false ) ); + // Check bp hp limit (hands don't have HP so we check arms) + dude.set_part_hp_cur( body_part_arm_l, 1 ); + CHECK( !dude.evaluate_technique( tec, target_1, dude.used_weapon(), false, false, + false ) ); + } + SECTION( "Encumbrance" ) { + REQUIRE( dude.get_all_body_parts_of_type( body_part_type::type::tail ).empty() ); + item test_eoc_armor_suit( "test_eoc_armor_suit" ); + REQUIRE( dude.wear_item( test_eoc_armor_suit, false ) ); + CHECK( !dude.evaluate_technique( tec, target_1, dude.used_weapon(), false, false, + false ) ); + } + SECTION( "Limb substitution" ) { + dude.enchantment_cache->force_add( *enchantment_ENCH_TEST_BIRD_PARTS, dude ); + dude.recalculate_bodyparts(); + CHECK( dude.evaluate_technique( tec2, target_1, dude.used_weapon(), false, false, + false ) ); + } +} + TEST_CASE( "Martial_art_technique_conditionals", "[martial_arts]" ) { clear_map(); @@ -94,22 +165,24 @@ TEST_CASE( "Martial_art_technique_conditionals", "[martial_arts]" ) monster &target_1 = spawn_test_monster( "mon_zombie_fat", target_1_pos ); monster &target_2 = spawn_test_monster( "mon_zombie_hulk", target_2_pos ); monster &target_3 = spawn_test_monster( "mon_blob", target_3_pos ); - std::vector tech_1 = dude.evaluate_techniques( target_1, dude.used_weapon() ); // test sweeping a zombie (succeed) REQUIRE( target_1.get_size() == 3 ); - CHECK( tech_1.size() == 1 ); - CHECK( std::find( tech_1.begin(), tech_1.end(), tec ) != tech_1.end() ); + CHECK( dude.evaluate_technique( tec, target_1, dude.used_weapon(), false, false, + false ).has_value() ); // Being downed disables the attack target_1.add_effect( effect_downed, 1_days ); - CHECK( dude.evaluate_techniques( target_1, dude.used_weapon() ).empty() ); + CHECK( !dude.evaluate_technique( tec, target_1, dude.used_weapon(), false, false, + false ).has_value() ); // test sweeping a big zomb (fail) REQUIRE( target_2.get_size() == 5 ); - CHECK( dude.evaluate_techniques( target_2, dude.used_weapon() ).empty() ); + CHECK( !dude.evaluate_technique( tec, target_2, dude.used_weapon(), false, false, + false ).has_value() ); // test sweeping a slime (fail) REQUIRE( target_3.get_size() == 3 ); REQUIRE( target_3.type->bodytype == "blob" ); - CHECK( dude.evaluate_techniques( target_3, dude.used_weapon() ).empty() ); + CHECK( !dude.evaluate_technique( tec, target_3, dude.used_weapon(), false, false, + false ).has_value() ); } SECTION( "Test stun" ) { @@ -119,22 +192,26 @@ TEST_CASE( "Martial_art_technique_conditionals", "[martial_arts]" ) monster &target_3 = spawn_test_monster( "mon_blob", target_3_pos ); item weap( itype_sword_crude ); dude.wield( weap ); + // test stunning a feral (succeed) - std::vector tech_1 = dude.evaluate_techniques( target_1, dude.used_weapon() ); REQUIRE( target_1.get_size() == 3 ); REQUIRE( !target_1.type->in_species( species_ZOMBIE ) ); - CHECK( std::find( tech_1.begin(), tech_1.end(), tec ) != tech_1.end() ); - // Being downed disables the attack + CHECK( dude.evaluate_technique( tec, target_1, dude.used_weapon(), false, false, + false ).has_value() ); + // Being stunned disables the attack target_1.add_effect( effect_stunned, 1_days ); - CHECK( dude.evaluate_techniques( target_1, dude.used_weapon() ).empty() ); + CHECK( !dude.evaluate_technique( tec, target_1, dude.used_weapon(), false, false, + false ).has_value() ); // test stunning a zombie (fail) REQUIRE( target_2.get_size() == 3 ); REQUIRE( target_2.type->in_species( species_ZOMBIE ) ); - CHECK( dude.evaluate_techniques( target_2, dude.used_weapon() ).empty() ); + CHECK( !dude.evaluate_technique( tec, target_2, dude.used_weapon(), false, false, + false ).has_value() ); // test stunning a slime (fail) REQUIRE( target_3.get_size() == 3 ); REQUIRE( target_3.type->in_species( species_SLIME ) ); - CHECK( dude.evaluate_techniques( target_3, dude.used_weapon() ).empty() ); + CHECK( !dude.evaluate_technique( tec, target_3, dude.used_weapon(), false, false, + false ).has_value() ); } SECTION( "Test knockback" ) { const matec_id &tec = *test_style_ma1->techniques.find( test_tech_condition_knockback ); @@ -143,21 +220,25 @@ TEST_CASE( "Martial_art_technique_conditionals", "[martial_arts]" ) monster &target_3 = spawn_test_monster( "mon_test_tech_grabber", target_3_pos ); item weap( itype_club_wooden ); dude.wield( weap ); + // test throwing a feral (succeed) - std::vector tech_1 = dude.evaluate_techniques( target_1, dude.used_weapon() ); REQUIRE( target_1.get_size() == 3 ); - CHECK( std::find( tech_1.begin(), tech_1.end(), tec ) != tech_1.end() ); + CHECK( dude.evaluate_technique( tec, target_1, dude.used_weapon(), false, false, + false ).has_value() ); // Being downed disables the attack target_1.add_effect( effect_downed, 1_days ); - CHECK( dude.evaluate_techniques( target_1, dude.used_weapon() ).empty() ); + CHECK( !dude.evaluate_technique( tec, target_1, dude.used_weapon(), false, false, + false ).has_value() ); // test throwing a large target (fail) REQUIRE( target_2.get_size() == 5 ); - CHECK( dude.evaluate_techniques( target_2, dude.used_weapon() ).empty() ); + CHECK( !dude.evaluate_technique( tec, target_2, dude.used_weapon(), false, false, + false ).has_value() ); // test throwing a monster grabbing you (succeed) dude.add_effect( effect_grabbed, 1_days ); target_3.add_effect( effect_grabbing, 1_days ); REQUIRE( target_3.get_size() == 3 ); REQUIRE( target_3.get_grab_strength() == 0 ); - CHECK( dude.evaluate_techniques( target_3, dude.used_weapon() ).size() == 1 ); + CHECK( dude.evaluate_technique( tec, target_3, dude.used_weapon(), false, false, + false ).has_value() ); } } From a66060873f76888c859c0850847f7179e30b457a Mon Sep 17 00:00:00 2001 From: Standing-Storm <120433252+Standing-Storm@users.noreply.github.com> Date: Wed, 8 May 2024 21:05:17 -0500 Subject: [PATCH 096/104] [Sky Island] Fix rock outside of windows (#73576) * Bugfixes * switch approach * Remove pillars * Restore skylight deletions --- data/mods/Sky_Island/island_upgrades.json | 74 ++++++++++++----------- 1 file changed, 38 insertions(+), 36 deletions(-) diff --git a/data/mods/Sky_Island/island_upgrades.json b/data/mods/Sky_Island/island_upgrades.json index b488a6dd843c7..e551fd3a1425a 100644 --- a/data/mods/Sky_Island/island_upgrades.json +++ b/data/mods/Sky_Island/island_upgrades.json @@ -578,7 +578,9 @@ "x": [ "t_null" ], "T": [ "t_null" ], "V": [ "t_thconc_floor" ], - "X": [ "t_thconc_floor" ] + "X": [ "t_thconc_floor" ], + "/": "t_fake_air", + ",": "t_open_air" }, "furniture": { "X": "f_exitportal", "V": "f_islandstatue" }, "items": { } @@ -696,19 +698,19 @@ "rows": [ " ", " ########### ", - " ##.........## ", - " #####...........## ", - " G..#.............# ", - " G..#...-------...# ", - " G..#...-------...# ", - " G..#...-------...#xxxx", - " G..+....--O---...+----", - " G..#...-------...#xxxx", - " G..#...-------...# ", - " G..#...-------...# ", - " G..#.............# ", - " #####...........## ", - " ##.........## ", + ", ##.........## ", + ",/#####...........## ", + ",/G..#.............# ", + ",/G..#...-------...# ", + ",/G..#...-------...# ", + ",/G..#...-------...#xxxx", + ",/G..+....--O---...+----", + ",/G..#...-------...#xxxx", + ",/G..#...-------...# ", + ",/G..#...-------...# ", + ",/G..#.............# ", + ",/#####...........## ", + ", ##.........## ", " ########### ", " ", " ", @@ -836,19 +838,19 @@ "rows": [ " ", " ########### ", - " ##.........## ", - " ##...........##### ", - " #.............#..G ", - " #...-------...#..G ", - " #...-------...#..G ", - "xxxx#...-------...#..G ", - "----+...---O--....+..G ", - "xxxx#...-------...#..G ", - " #...-------...#..G ", - " #...-------...#..G ", - " #.............#..G ", - " ##...........##### ", - " ##.........## ", + " ##.........## ,", + " ##...........#####/,", + " #.............#..G/,", + " #...-------...#..G/,", + " #...-------...#..G/,", + "xxxx#...-------...#..G/,", + "----+...---O--....+..G/,", + "xxxx#...-------...#..G/,", + " #...-------...#..G/,", + " #...-------...#..G/,", + " #.............#..G/,", + " ##...........#####/,", + " ##.........## ,", " ########### ", " ", " ", @@ -869,8 +871,8 @@ "update_mapgen_id": "mx_skyisland_n1", "object": { "rows": [ - " ", - " ", + " ,,,,,,,,,,, ", + " ///////// ", " #GGGGGGG# ", " #.......# ", " #.......# ", @@ -904,8 +906,8 @@ "update_mapgen_id": "mx_skyisland_n2", "object": { "rows": [ - " ", - " ", + " ,,,,,,,,,,,,,,, ", + " ///////////// ", " #GGGGGGGGGGG# ", " #..-------..# ", " #..-------..# ", @@ -939,8 +941,8 @@ "update_mapgen_id": "mx_skyisland_n3", "object": { "rows": [ - " ", - " ", + " ,,,,,,,,,,,,,,,,,,, ", + " ///////////////// ", " #GGGGGGGGGGGGGGG# ", " #..-----------..# ", " #..-----------..# ", @@ -974,8 +976,8 @@ "update_mapgen_id": "mx_skyisland_n4", "object": { "rows": [ - " ", - " ", + " ,,,,,,,,,,,,,,,,,,,,,,,", + " ///////////////////// ", " #GGGGGGGGGGGGGGGGGGGGG#", " #...---------------...#", " #...---------------...#", @@ -983,7 +985,7 @@ " #...---------------...#", " #...---------------...#", " #...---------------...#", - " #...---------------...#", + " #....-------------....#", " #.....................#", " ##.........-.........##", " ##........-........## ", From d268840a626517485a71e0632168e2184978e355 Mon Sep 17 00:00:00 2001 From: Standing-Storm <120433252+Standing-Storm@users.noreply.github.com> Date: Wed, 8 May 2024 21:07:08 -0500 Subject: [PATCH 097/104] [MoM] Rework Passive traits to use spell_level_sum (#73569) * Change variables * Rework lifting field application * Update lifting field recipe description * Fix tools * Update data/mods/MindOverMatter/mutations/psi_passives.json Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update data/mods/MindOverMatter/mutations/psi_passives.json Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update data/mods/MindOverMatter/mutations/psi_passives.json Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update data/mods/MindOverMatter/mutations/psi_passives.json Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update data/mods/MindOverMatter/mutations/psi_passives.json Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update data/mods/MindOverMatter/mutations/psi_passives.json Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Vitamins, update documentation --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .../PowerDescriptionSpoilers.md | 16 ++--- .../effectoncondition/eoc_mutations.json | 62 +++++++++---------- .../mutations/psi_passives.json | 57 ++++++++++++----- .../recipes/power_improvements.json | 8 ++- 4 files changed, 87 insertions(+), 56 deletions(-) diff --git a/data/mods/MindOverMatter/PowerDescriptionSpoilers.md b/data/mods/MindOverMatter/PowerDescriptionSpoilers.md index a1e1e61bb4a97..daea818fd97c8 100644 --- a/data/mods/MindOverMatter/PowerDescriptionSpoilers.md +++ b/data/mods/MindOverMatter/PowerDescriptionSpoilers.md @@ -8,7 +8,7 @@ All powers have a kCal cost equal to (Difficulty of power * 5) times a randomize # Biokinesis **Note**: No biokinetic powers have a target listed because they only affect the psion. -**Passive Power: Efficient System**: Reduces hunger, thirst, and metabolic burn rate by 3% plus 1.5% times the highest single biokinetic power the psion knows. +**Passive Power: Efficient System**: Reduces hunger, thirst, and metabolic burn rate by 3% plus 0.075% times the sum total levels of the psion's biokinetic powers, and increases the number of vitamins absorbed from food by a similar amount. ## Overcome Pain (C) *Difficulty*: 1
@@ -149,7 +149,7 @@ This is natural painkiller and so has natural effects (reduces speed slightly) @@ -297,7 +297,7 @@ This is natural painkiller and so has natural effects (reduces speed slightly) @@ -596,7 +596,7 @@ Powers causing photokinetic damage have a 40% chance to blind the target for 3 s # Pyrokinesis -**Passive Power: Internal Fire**: The pyrokinetic slightly heats the air around themselves, gaining a small amount of warmth at all times (and more in colder temperatures) and becoming more comfortable when sleeping, as well as ignoring the first 10 points of wetness on any part of their body. +**Passive Power: Internal Fire**: The pyrokinetic slightly heats the air around themselves, gaining a small amount of warmth at all times (and more in colder temperatures) and increasing their temperature when sleeping by 0.05 times the total levels in the psion's pyrokinetic powers, as well as ignoring the first 10 points of wetness on any part of their body. ## Brilliant Flash *Difficulty*: 1
@@ -726,7 +726,7 @@ Powers causing photokinetic damage have a 40% chance to blind the target for 3 s # Telekinesis -**Passive Power: Lifting Hand**: The telekinetic may carry a single item next to them in a field of telekinetic force. The item's weight increases proportional to their highest telekinetic power, though they must use the recipe Contemplate Lifting Field to increase it. +**Passive Power: Lifting Hand**: The telekinetic may carry a single item next to them in a field of telekinetic force. The item's weight increases proportional to their total levels in their telekinetic powers, increasing by one rank per 8 total telekinetic levels, though they must use the recipe Contemplate Lifting Field to increase it. Powers causing telekinetic damage have a 40% chance to stagger the target for 2 seconds and a 20% chance to down the target. Each of these is checked independently. @@ -876,7 +876,7 @@ Powers causing telekinetic damage have a 40% chance to stagger the target for 2 # Telepathy -**Passive Power: Telepathic Suggestion**: Influence the attitude of those the psion is speaking to, increasing Persuade, Lie, and Intimidate chances by 5% plus 1.5% times the psion's highest-leveled telepathy power. +**Passive Power: Telepathic Suggestion**: Influence the attitude of those the psion is speaking to, increasing Persuade, Lie, and Intimidate chances by 5% plus 0.075% times the psion's total levels in telepathic powers. Powers causing telepathic damage have a 5% chance to down the target, a 33% chance to stun the target for 1 second, and a 66% chance to daze the target for 1 second. Each of these is checked independently. @@ -999,7 +999,7 @@ Powers causing telepathic damage have a 5% chance to down the target, a 33% chan # Teleportation -**Passive Power: Spacial Recalibration**: Immunity to teleglow and a small chance to avoid incoming damage: a 1% chance per attack plus 0.5% times the psion's highest-leveled teleportation power. +**Passive Power: Spacial Recalibration**: Immunity to teleglow and a small chance to avoid incoming damage: a 1% chance per attack plus 0.025% times the psion's total levels in teleportation powers. ## Blink *Difficulty*: 1
@@ -1102,7 +1102,7 @@ Powers causing telepathic damage have a 5% chance to down the target, a 33% chan # Vitakinesis -**Passive Power: Bloom of Vitality**: Increased max HP equal to 5% plus 1% times the psion's highest-leveled vitakinetic power, faster healing equal to 10% plus 1% times the psion's highest-leveled vitakinetic power, the ability to heal broken limbs without a splint, and 5x faster processing of mutant toxins. +**Passive Power: Bloom of Vitality**: Increased max HP equal to 5% plus 0.05% times the psion's total levels in vitakinetic powers, faster healing equal to 10% plus 0.05% times the psion's total levels in vitakinetic powers, the ability to heal broken limbs without a splint, and 5x faster processing of mutant toxins. ## Healthy Glow (C) *Difficulty*: 1
diff --git a/data/mods/MindOverMatter/effectoncondition/eoc_mutations.json b/data/mods/MindOverMatter/effectoncondition/eoc_mutations.json index d6ed399d78f30..99a0c6f32e9e8 100644 --- a/data/mods/MindOverMatter/effectoncondition/eoc_mutations.json +++ b/data/mods/MindOverMatter/effectoncondition/eoc_mutations.json @@ -4,10 +4,10 @@ "id": "EOC_TELEKINETIC_LIFTER", "condition": { "u_has_trait": "TELEKINETIC" }, "effect": { - "switch": { "math": [ "u_school_level('TELEKINETIC')" ] }, + "switch": { "math": [ "u_spell_level_sum('school': 'TELEKINETIC') / 8" ] }, "cases": [ { - "case": 2, + "case": 0, "effect": [ { "run_eocs": "EOC_TELEKIN_REMOVE_LIFTING_FIELD" }, { "u_add_trait": "TELEKINETIC_LIFTER_1" }, @@ -15,7 +15,7 @@ ] }, { - "case": 3, + "case": 1, "effect": [ { "run_eocs": "EOC_TELEKIN_REMOVE_LIFTING_FIELD" }, { "u_add_trait": "TELEKINETIC_LIFTER_2" }, @@ -23,7 +23,7 @@ ] }, { - "case": 4, + "case": 2, "effect": [ { "run_eocs": "EOC_TELEKIN_REMOVE_LIFTING_FIELD" }, { "u_add_trait": "TELEKINETIC_LIFTER_3" }, @@ -31,7 +31,7 @@ ] }, { - "case": 5, + "case": 3, "effect": [ { "run_eocs": "EOC_TELEKIN_REMOVE_LIFTING_FIELD" }, { "u_add_trait": "TELEKINETIC_LIFTER_4" }, @@ -39,7 +39,7 @@ ] }, { - "case": 6, + "case": 4, "effect": [ { "run_eocs": "EOC_TELEKIN_REMOVE_LIFTING_FIELD" }, { "u_add_trait": "TELEKINETIC_LIFTER_5" }, @@ -47,7 +47,7 @@ ] }, { - "case": 7, + "case": 5, "effect": [ { "run_eocs": "EOC_TELEKIN_REMOVE_LIFTING_FIELD" }, { "u_add_trait": "TELEKINETIC_LIFTER_6" }, @@ -55,7 +55,7 @@ ] }, { - "case": 8, + "case": 6, "effect": [ { "run_eocs": "EOC_TELEKIN_REMOVE_LIFTING_FIELD" }, { "u_add_trait": "TELEKINETIC_LIFTER_7" }, @@ -63,7 +63,7 @@ ] }, { - "case": 9, + "case": 7, "effect": [ { "run_eocs": "EOC_TELEKIN_REMOVE_LIFTING_FIELD" }, { "u_add_trait": "TELEKINETIC_LIFTER_8" }, @@ -71,7 +71,7 @@ ] }, { - "case": 10, + "case": 8, "effect": [ { "run_eocs": "EOC_TELEKIN_REMOVE_LIFTING_FIELD" }, { "u_add_trait": "TELEKINETIC_LIFTER_9" }, @@ -79,7 +79,7 @@ ] }, { - "case": 11, + "case": 9, "effect": [ { "run_eocs": "EOC_TELEKIN_REMOVE_LIFTING_FIELD" }, { "u_add_trait": "TELEKINETIC_LIFTER_10" }, @@ -87,7 +87,7 @@ ] }, { - "case": 12, + "case": 10, "effect": [ { "run_eocs": "EOC_TELEKIN_REMOVE_LIFTING_FIELD" }, { "u_add_trait": "TELEKINETIC_LIFTER_11" }, @@ -95,7 +95,7 @@ ] }, { - "case": 13, + "case": 11, "effect": [ { "run_eocs": "EOC_TELEKIN_REMOVE_LIFTING_FIELD" }, { "u_add_trait": "TELEKINETIC_LIFTER_12" }, @@ -103,7 +103,7 @@ ] }, { - "case": 14, + "case": 12, "effect": [ { "run_eocs": "EOC_TELEKIN_REMOVE_LIFTING_FIELD" }, { "u_add_trait": "TELEKINETIC_LIFTER_13" }, @@ -111,7 +111,7 @@ ] }, { - "case": 15, + "case": 13, "effect": [ { "run_eocs": "EOC_TELEKIN_REMOVE_LIFTING_FIELD" }, { "u_add_trait": "TELEKINETIC_LIFTER_14" }, @@ -119,7 +119,7 @@ ] }, { - "case": 16, + "case": 14, "effect": [ { "run_eocs": "EOC_TELEKIN_REMOVE_LIFTING_FIELD" }, { "u_add_trait": "TELEKINETIC_LIFTER_15" }, @@ -127,7 +127,7 @@ ] }, { - "case": 17, + "case": 15, "effect": [ { "run_eocs": "EOC_TELEKIN_REMOVE_LIFTING_FIELD" }, { "u_add_trait": "TELEKINETIC_LIFTER_16" }, @@ -135,7 +135,7 @@ ] }, { - "case": 18, + "case": 16, "effect": [ { "run_eocs": "EOC_TELEKIN_REMOVE_LIFTING_FIELD" }, { "u_add_trait": "TELEKINETIC_LIFTER_17" }, @@ -143,7 +143,7 @@ ] }, { - "case": 19, + "case": 17, "effect": [ { "run_eocs": "EOC_TELEKIN_REMOVE_LIFTING_FIELD" }, { "u_add_trait": "TELEKINETIC_LIFTER_18" }, @@ -151,7 +151,7 @@ ] }, { - "case": 20, + "case": 18, "effect": [ { "run_eocs": "EOC_TELEKIN_REMOVE_LIFTING_FIELD" }, { "u_add_trait": "TELEKINETIC_LIFTER_19" }, @@ -159,7 +159,7 @@ ] }, { - "case": 21, + "case": 19, "effect": [ { "run_eocs": "EOC_TELEKIN_REMOVE_LIFTING_FIELD" }, { "u_add_trait": "TELEKINETIC_LIFTER_20" }, @@ -167,7 +167,7 @@ ] }, { - "case": 22, + "case": 20, "effect": [ { "run_eocs": "EOC_TELEKIN_REMOVE_LIFTING_FIELD" }, { "u_add_trait": "TELEKINETIC_LIFTER_21" }, @@ -175,7 +175,7 @@ ] }, { - "case": 23, + "case": 21, "effect": [ { "run_eocs": "EOC_TELEKIN_REMOVE_LIFTING_FIELD" }, { "u_add_trait": "TELEKINETIC_LIFTER_22" }, @@ -183,7 +183,7 @@ ] }, { - "case": 24, + "case": 22, "effect": [ { "run_eocs": "EOC_TELEKIN_REMOVE_LIFTING_FIELD" }, { "u_add_trait": "TELEKINETIC_LIFTER_23" }, @@ -191,7 +191,7 @@ ] }, { - "case": 25, + "case": 23, "effect": [ { "run_eocs": "EOC_TELEKIN_REMOVE_LIFTING_FIELD" }, { "u_add_trait": "TELEKINETIC_LIFTER_24" }, @@ -199,7 +199,7 @@ ] }, { - "case": 26, + "case": 24, "effect": [ { "run_eocs": "EOC_TELEKIN_REMOVE_LIFTING_FIELD" }, { "u_add_trait": "TELEKINETIC_LIFTER_25" }, @@ -207,7 +207,7 @@ ] }, { - "case": 27, + "case": 25, "effect": [ { "run_eocs": "EOC_TELEKIN_REMOVE_LIFTING_FIELD" }, { "u_add_trait": "TELEKINETIC_LIFTER_26" }, @@ -215,7 +215,7 @@ ] }, { - "case": 28, + "case": 26, "effect": [ { "run_eocs": "EOC_TELEKIN_REMOVE_LIFTING_FIELD" }, { "u_add_trait": "TELEKINETIC_LIFTER_27" }, @@ -223,7 +223,7 @@ ] }, { - "case": 29, + "case": 27, "effect": [ { "run_eocs": "EOC_TELEKIN_REMOVE_LIFTING_FIELD" }, { "u_add_trait": "TELEKINETIC_LIFTER_28" }, @@ -231,7 +231,7 @@ ] }, { - "case": 30, + "case": 28, "effect": [ { "run_eocs": "EOC_TELEKIN_REMOVE_LIFTING_FIELD" }, { "u_add_trait": "TELEKINETIC_LIFTER_29" }, @@ -239,7 +239,7 @@ ] }, { - "case": 31, + "case": 29, "effect": [ { "run_eocs": "EOC_TELEKIN_REMOVE_LIFTING_FIELD" }, { "u_add_trait": "TELEKINETIC_LIFTER_30" }, diff --git a/data/mods/MindOverMatter/mutations/psi_passives.json b/data/mods/MindOverMatter/mutations/psi_passives.json index 2f2470286a067..e2ca49fcd67fa 100644 --- a/data/mods/MindOverMatter/mutations/psi_passives.json +++ b/data/mods/MindOverMatter/mutations/psi_passives.json @@ -25,16 +25,25 @@ "name": { "str": "Efficient System" }, "points": 0, "description": "Thanks to your powers, you need less food and drink than the average person and are more efficient at processing it.", - "vitamins_absorb_multi": [ [ "all", [ [ "vitA", 1.05 ], [ "vitB", 1.05 ], [ "vitC", 1.05 ], [ "calcium", 1.05 ], [ "iron", 1.05 ] ] ] ], "player_display": true, "valid": false, "purifiable": false, "enchantments": [ { "values": [ - { "value": "HUNGER", "multiply": { "math": [ "(-0.03 - (0.015 * u_school_level('BIOKINETIC')))" ] } }, - { "value": "THIRST", "multiply": { "math": [ "(-0.03 - (0.015 * u_school_level('BIOKINETIC')))" ] } }, - { "value": "METABOLISM", "multiply": { "math": [ "(-0.03 - (0.015 * u_school_level('BIOKINETIC')))" ] } } + { "value": "HUNGER", "multiply": { "math": [ "(-0.03 - (0.00075 * u_spell_level_sum('school': 'BIOKINETIC')))" ] } }, + { + "value": "THIRST", + "multiply": { "math": [ "(-0.03 - (0.00075 * u_spell_level_sum('school': 'BIOKINETIC')))" ] } + }, + { + "value": "METABOLISM", + "multiply": { "math": [ "(-0.03 - (0.00075 * u_spell_level_sum('school': 'BIOKINETIC')))" ] } + }, + { + "value": "VITAMIN_ABSORB_MOD", + "multiply": { "math": [ "(0.03 + (0.00075 * u_spell_level_sum('school': 'BIOKINETIC')))" ] } + } ] } ] @@ -53,7 +62,10 @@ { "values": [ { "value": "HEARING_MULT", "multiply": 0.2 }, - { "value": "SIGHT_RANGE_NETHER", "add": { "math": [ "(2 + (1.5 * u_school_level('CLAIRSENTIENT')))" ] } } + { + "value": "SIGHT_RANGE_NETHER", + "add": { "math": [ "(2 + (0.075 * u_spell_level_sum('school': 'CLAIRSENTIENT')))" ] } + } ] } ] @@ -70,8 +82,8 @@ "enchantments": [ { "values": [ - { "value": "ARMOR_ELEC", "add": { "math": [ "u_school_level('ELECTROKINETIC') / -4" ] } }, - { "value": "PAIN", "multiply": { "math": [ "u_school_level('ELECTROKINETIC') * -0.007" ] } } + { "value": "ARMOR_ELEC", "add": { "math": [ "u_spell_level_sum('school': 'ELECTROKINETIC') / -0.2" ] } }, + { "value": "PAIN", "multiply": { "math": [ "u_spell_level_sum('school': 'ELECTROKINETIC') * -0.00035" ] } } ] } ] @@ -95,7 +107,11 @@ "points": 0, "description": "You naturally heat the air around you slightly, making it more comfortable in the cold. It also helps prevent you from getting too wet.", "bodytemp_modifiers": [ 250, 750 ], - "enchantments": [ { "values": [ { "value": "BODYTEMP_SLEEP", "add": { "math": [ "1 * u_school_level('PYROKINETIC')" ] } } ] } ], + "enchantments": [ + { + "values": [ { "value": "BODYTEMP_SLEEP", "add": { "math": [ "0.05 * u_spell_level_sum('school': 'PYROKINETIC')" ] } } ] + } + ], "wet_protection": [ { "part": "head", "ignored": 10 }, { "part": "leg_l", "ignored": 10 }, @@ -454,9 +470,15 @@ "enchantments": [ { "values": [ - { "value": "SOCIAL_INTIMIDATE", "add": { "math": [ "(5 + (1.5 * u_school_level('TELEPATHIC')))" ] } }, - { "value": "SOCIAL_LIE", "add": { "math": [ "(5 + (1.5 * u_school_level('TELEPATHIC')))" ] } }, - { "value": "SOCIAL_PERSUADE", "add": { "math": [ "(5 + (1.5 * u_school_level('TELEPATHIC')))" ] } } + { "value": "SOCIAL_INTIMIDATE", "add": { "math": [ "(5 + (0.075 * u_spell_level_sum('school': 'TELEPATHIC')))" ] } }, + { + "value": "SOCIAL_LIE", + "add": { "math": [ "(5 + (0.075 * u_spell_level_sum('school': 'TELEPATHIC')))" ] } + }, + { + "value": "SOCIAL_PERSUADE", + "add": { "math": [ "(5 + (0.075 * u_spell_level_sum('school': 'TELEPATHIC')))" ] } + } ] } ] @@ -471,7 +493,11 @@ "valid": false, "player_display": true, "purifiable": false, - "enchantments": [ { "values": [ { "value": "EVASION", "add": { "math": [ "(0.01 + (0.005 * u_school_level('TELEPORTER')))" ] } } ] } ] + "enchantments": [ + { + "values": [ { "value": "EVASION", "add": { "math": [ "(0.01 + (0.00025 * u_spell_level_sum('school': 'TELEPORTER')))" ] } } ] + } + ] }, { "type": "mutation", @@ -487,8 +513,11 @@ "enchantments": [ { "values": [ - { "value": "REGEN_HP", "multiply": { "math": [ "(0.1 + (0.01 * u_school_level('VITAKINETIC')))" ] } }, - { "value": "MAX_HP", "multiply": { "math": [ "(0.05 + (0.01 * u_school_level('VITAKINETIC')))" ] } } + { "value": "REGEN_HP", "multiply": { "math": [ "(0.1 + (0.0005 * u_spell_level_sum('school': 'VITAKINETIC')))" ] } }, + { + "value": "MAX_HP", + "multiply": { "math": [ "(0.05 + (0.0005 * u_spell_level_sum('school': 'VITAKINETIC')))" ] } + } ] } ] diff --git a/data/mods/MindOverMatter/recipes/power_improvements.json b/data/mods/MindOverMatter/recipes/power_improvements.json index 0d900c9cd142f..09987c7f2a812 100644 --- a/data/mods/MindOverMatter/recipes/power_improvements.json +++ b/data/mods/MindOverMatter/recipes/power_improvements.json @@ -4,15 +4,17 @@ "activity_level": "LIGHT_EXERCISE", "name": "contemplation: lifting field", "id": "improve_telekinesis_lifting_field", - "description": "WARNING: DO NOT USE IF YOUR LIFTING FIELD CONTAINS ANYTHING.\n\nContemplate your powers and update your ability to carry objects for long periods of time to a level commensurate with your overall telekinetic mastery.\n\nWARNING: DO NOT USE IF YOUR LIFTING FIELD CONTAINS ANYTHING.", + "description": "WARNING: DO NOT USE IF YOUR LIFTING FIELD CONTAINS ANYTHING.\n\nContemplate your powers and update your ability to carry objects for long periods of time to a level commensurate with your overall telekinetic mastery. The capability of your lifting field is based on your total levels in telekinetic powers.\n\nWARNING: DO NOT USE IF YOUR LIFTING FIELD CONTAINS ANYTHING.", "category": "CC_PSIONIC", "subcategory": "CSC_PSIONIC_OTHER", "skill_used": "metaphysics", "difficulty": 0, "time": "1 h", "autolearn": false, - "tools": [ [ [ "matrix_crystal_drained", -1 ] ] ], - "flags": [ "SECRET", "BLIND_HARD" ], + "tools": [ + [ [ "matrix_crystal_drained", -1 ], [ "black_nether_crystal_pseudo_tool", -1 ], [ "matrix_crystal_telekinesis", -1 ] ] + ], + "flags": [ "SECRET", "BLIND_EASY" ], "result_eocs": [ "EOC_TELEKINETIC_LIFTER" ] } ] From 1d5dcfa90d92e86713386e0ba1fc9399cf9aff45 Mon Sep 17 00:00:00 2001 From: TheMurderUnicorn Date: Thu, 9 May 2024 00:54:31 -0400 Subject: [PATCH 098/104] Add Skunks! (#73537) * Add Skunks! * Add Skunk Spray Spell * Sprayed by Skunk Effect * Add Skunk Skull * Add Skunk Harvest With Skull * Make Skunks Spawn * Oops * MakeDurationRandom Co-authored-by: Anton Simakov <67688115+GuardianDll@users.noreply.github.com> * Guardian Missed a Comma How Dare You --------- Co-authored-by: Anton Simakov <67688115+GuardianDll@users.noreply.github.com> --- data/json/effects.json | 21 ++++++++ data/json/harvest.json | 17 ++++++ data/json/items/generic/skulls.json | 10 ++++ data/json/monster_special_attacks/spells.json | 16 ++++++ data/json/monstergroups/wilderness.json | 2 + data/json/monsters/mammal.json | 54 +++++++++++++++++++ 6 files changed, 120 insertions(+) diff --git a/data/json/effects.json b/data/json/effects.json index 04713177cbb64..9494cfd83405b 100644 --- a/data/json/effects.json +++ b/data/json/effects.json @@ -2073,6 +2073,27 @@ "rating": "bad", "base_mods": { "vomit_chance": [ 500 ] } }, + { + "type": "effect_type", + "id": "skunk_spray", + "name": [ "Skunk Spray" ], + "desc": [ "You were sprayed by a skunk!" ], + "apply_message": "You're covered in a foul smelling fluid!", + "rating": "bad", + "max_duration": "5 hours", + "base_mods": { "per_mod": [ -1 ], "int_mod": [ -1 ], "vomit_chance": [ 2000 ] }, + "enchantments": [ + { + "values": [ + { "value": "SOCIAL_PERSUADE", "add": -10 }, + { "value": "SOCIAL_LIE", "add": -4 }, + { "value": "SOCIAL_INTIMIDATE", "add": 2 }, + { "value": "UGLINESS", "add": 5 }, + { "value": "SCENT_MASK", "add": 300 } + ] + } + ] + }, { "type": "effect_type", "id": "invisibility", diff --git a/data/json/harvest.json b/data/json/harvest.json index 10ce9dfd19247..f398599762f39 100644 --- a/data/json/harvest.json +++ b/data/json/harvest.json @@ -2715,6 +2715,23 @@ { "drop": "fat", "type": "flesh", "mass_ratio": 0.07 } ] }, + { + "id": "skunk_with_skull", + "type": "harvest", + "entries": [ + { "drop": "skull_skunk", "type": "bone", "scale_num": [ 1, 1 ], "max": 1 }, + { "drop": "meat", "type": "flesh", "mass_ratio": 0.28 }, + { "drop": "meat_scrap", "type": "flesh", "mass_ratio": 0.05 }, + { "drop": "lung", "type": "flesh", "mass_ratio": 0.0035 }, + { "drop": "liver", "type": "offal", "mass_ratio": 0.01 }, + { "drop": "brain", "type": "flesh", "mass_ratio": 0.005 }, + { "drop": "bone", "type": "bone", "mass_ratio": 0.15 }, + { "drop": "animal_blood", "type": "blood", "mass_ratio": 0.1 }, + { "drop": "sinew", "type": "bone", "mass_ratio": 0.00035 }, + { "drop": "raw_fur", "type": "skin", "mass_ratio": 0.02 }, + { "drop": "fat", "type": "flesh", "mass_ratio": 0.07 } + ] + }, { "id": "beaver_with_skull", "type": "harvest", diff --git a/data/json/items/generic/skulls.json b/data/json/items/generic/skulls.json index 5a0f3400bbb9a..f3a5ba0834444 100644 --- a/data/json/items/generic/skulls.json +++ b/data/json/items/generic/skulls.json @@ -130,6 +130,16 @@ "volume": "275 ml", "longest_side": "11 cm" }, + { + "type": "GENERIC", + "id": "skull_skunk", + "name": { "str": "skunk skull" }, + "description": "The skull of a skunk.", + "copy-from": "skull_abstract", + "weight": "56 g", + "volume": "300 ml", + "longest_side": "8 cm" + }, { "type": "GENERIC", "id": "skull_rodent", diff --git a/data/json/monster_special_attacks/spells.json b/data/json/monster_special_attacks/spells.json index b2ee29e98202d..f34bf6bca9368 100644 --- a/data/json/monster_special_attacks/spells.json +++ b/data/json/monster_special_attacks/spells.json @@ -733,6 +733,22 @@ "id": "portal_cage_revert_transform", "furniture": [ { "result": [ "f_null" ], "valid_furniture": [ "f_absence" ] } ] }, + { + "id": "skunk_squirt", + "type": "SPELL", + "name": { "str": "Skunk Spray" }, + "description": "Skunk spray defense mechanism.", + "valid_targets": [ "hostile" ], + "effect": "attack", + "shape": "cone", + "min_range": 4, + "max_range": 4, + "//": "Duration is 3-5 hours, can't seem to write it in hours, had to write it in moves which is terrible", + "min_duration": 1080000, + "max_duration": 1800000, + "flags": [ "RANDOM_DURATION" ], + "effect_str": "skunk_spray" + }, { "id": "boomer_claymore_initial", "type": "SPELL", diff --git a/data/json/monstergroups/wilderness.json b/data/json/monstergroups/wilderness.json index f1de59072f8ae..cfe6ff04ad713 100644 --- a/data/json/monstergroups/wilderness.json +++ b/data/json/monstergroups/wilderness.json @@ -146,6 +146,7 @@ { "monster": "mon_weasel", "weight": 5, "cost_multiplier": 5 }, { "monster": "mon_raccoon", "weight": 8, "cost_multiplier": 0, "pack_size": [ 1, 3 ] }, { "monster": "mon_opossum", "weight": 8, "cost_multiplier": 0, "pack_size": [ 1, 3 ] }, + { "monster": "mon_skunk", "weight": 6, "cost_multiplier": 0, "pack_size": [ 1, 2 ] }, { "monster": "mon_black_rat", "weight": 10, "cost_multiplier": 0, "pack_size": [ 1, 5 ] }, { "group": "GROUP_WILDERNESS_FOREST_MAMMAL_WINTER", "weight": 22 }, { "group": "GROUP_WILDERNESS_FOREST_MAMMAL_MUTANT", "weight": 1, "starts": "14 days" }, @@ -505,6 +506,7 @@ { "group": "GROUP_RABBIT_WILD", "weight": 50, "cost_multiplier": 0 }, { "monster": "mon_squirrel", "weight": 50, "cost_multiplier": 0 }, { "monster": "mon_squirrel_red", "weight": 50, "cost_multiplier": 0 }, + { "monster": "mon_skunk", "weight": 2, "cost_multiplier": 0 }, { "monster": "mon_mantis_small", "weight": 5, "cost_multiplier": 10 }, { "monster": "mon_lady_bug", "weight": 8, "cost_multiplier": 10 }, { "monster": "mon_aphid", "weight": 20, "cost_multiplier": 0 }, diff --git a/data/json/monsters/mammal.json b/data/json/monsters/mammal.json index 214126ca57adc..e4064a377a827 100644 --- a/data/json/monsters/mammal.json +++ b/data/json/monsters/mammal.json @@ -2652,6 +2652,60 @@ "fear_triggers": [ "PLAYER_CLOSE" ], "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "CLIMBS", "PATH_AVOID_DANGER_1", "WARM", "KEENNOSE", "EATS", "SMALL_HIDER" ] }, + { + "id": "mon_skunk", + "type": "MONSTER", + "name": { "str": "skunk" }, + "description": "The common striped skunk, similar in size to opossum or domestic cats, these mammals can often be smelled before they are seen.", + "default_faction": "small_animal", + "bodytype": "pig", + "categories": [ "WILDLIFE" ], + "species": [ "MAMMAL" ], + "volume": "4000 ml", + "weight": "5 kg", + "hp": 12, + "speed": 110, + "material": [ "flesh" ], + "symbol": "s", + "color": "black_white", + "//": "Aggression note - No matter what anger triggers I gave the skunk they would never spray, HAD to raise aggression. Its not a perfect solution but don't lower their aggression or they won't spray anymore", + "aggression": 15, + "morale": 10, + "melee_dice": 1, + "melee_dice_sides": 4, + "melee_damage": [ { "damage_type": "cut", "amount": 1 } ], + "special_attacks": [ + { + "type": "spell", + "spell_data": { "id": "skunk_squirt", "min_level": 0 }, + "monster_message": "A skunk raises its tail and squirts!", + "cooldown": 10 + }, + [ "BROWSE", 150 ] + ], + "dodge": 2, + "vision_day": 9, + "vision_night": 9, + "stomach_size": 50, + "harvest": "skunk_with_skull", + "families": [ "prof_intro_biology", "prof_physiology" ], + "anger_triggers": [ "FRIEND_ATTACKED", "HURT" ], + "fear_triggers": [ "PLAYER_CLOSE" ], + "flags": [ + "SEES", + "HEARS", + "SMELLS", + "ANIMAL", + "CLIMBS", + "PATH_AVOID_DANGER_1", + "WARM", + "KEENNOSE", + "GOODHEARING", + "EATS", + "CORNERED_FIGHTER", + "SMALL_HIDER" + ] + }, { "id": "mon_otter", "type": "MONSTER", From 93d07baded50b6b374f5ffb9e00b9d61a5756a9a Mon Sep 17 00:00:00 2001 From: osuphobia <78858975+osuphobia@users.noreply.github.com> Date: Thu, 9 May 2024 12:58:14 +0800 Subject: [PATCH 099/104] Fix stamina regains when dodging (#73558) * Add missing - to burn_energy_legs in on_try_dodge. * Update src/character.cpp Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- src/character.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/character.cpp b/src/character.cpp index 9af84c70a662f..d61b10f1a0461 100644 --- a/src/character.cpp +++ b/src/character.cpp @@ -1939,8 +1939,8 @@ void Character::on_try_dodge() const int base_burn_rate = get_option( STATIC( "PLAYER_BASE_STAMINA_BURN_RATE" ) ); const float dodge_skill_modifier = ( 20.0f - get_skill_level( skill_dodge ) ) / 20.0f; - burn_energy_legs( std::floor( static_cast( base_burn_rate ) * 6.0f * - dodge_skill_modifier ) ); + burn_energy_legs( - std::floor( static_cast( base_burn_rate ) * 6.0f * + dodge_skill_modifier ) ); set_activity_level( EXTRA_EXERCISE ); } From 44872f59adc60ef3e67f9896572770ec8886a14d Mon Sep 17 00:00:00 2001 From: RenechCDDA <84619419+RenechCDDA@users.noreply.github.com> Date: Thu, 9 May 2024 01:54:24 -0400 Subject: [PATCH 100/104] Debug menu monster editing (#73563) * Make wisheffect a template, so it accepts monsters * creature getter for lifespan * debug menu monster editor * Common menu to run EOCs from debug * Clang fixes Un-template wisheffect --- src/creature.cpp | 9 ++ src/creature.h | 1 + src/debug_menu.cpp | 254 ++++++++++++++++++++++++++++++++++++++++++--- src/debug_menu.h | 4 +- src/wish.cpp | 2 +- 5 files changed, 256 insertions(+), 14 deletions(-) diff --git a/src/creature.cpp b/src/creature.cpp index 1f7dc9478f7a1..e29e670191549 100644 --- a/src/creature.cpp +++ b/src/creature.cpp @@ -2047,6 +2047,15 @@ void Creature::set_summon_time( const time_duration &length ) lifespan_end = calendar::turn + length; } +time_point Creature::get_summon_time() +{ + if( !lifespan_end.has_value() ) { + return calendar::turn_zero; + } + + return lifespan_end.value(); +} + void Creature::decrement_summon_timer() { if( !lifespan_end ) { diff --git a/src/creature.h b/src/creature.h index 666fefab05d5a..481ad6b9b85c4 100644 --- a/src/creature.h +++ b/src/creature.h @@ -1183,6 +1183,7 @@ class Creature : public viewer void clear_killer(); // summoned creatures via spells void set_summon_time( const time_duration &length ); + time_point get_summon_time(); // handles removing the creature if the timer runs out void decrement_summon_timer(); void set_summoner( Creature *summoner ); diff --git a/src/debug_menu.cpp b/src/debug_menu.cpp index 310d2cf06b3c4..6e1b7782761a5 100644 --- a/src/debug_menu.cpp +++ b/src/debug_menu.cpp @@ -194,6 +194,7 @@ std::string enum_to_string( debug_menu::debug_menu case debug_menu::debug_menu_index::FORGET_ALL_RECIPES: return "FORGET_ALL_RECIPES"; case debug_menu::debug_menu_index::FORGET_ALL_ITEMS: return "FORGET_ALL_ITEMS"; case debug_menu::debug_menu_index::EDIT_PLAYER: return "EDIT_PLAYER"; + case debug_menu::debug_menu_index::EDIT_MONSTER: return "EDIT_MONSTER"; case debug_menu::debug_menu_index::CONTROL_NPC: return "CONTROL_NPC"; case debug_menu::debug_menu_index::SPAWN_ARTIFACT: return "SPAWN_ARTIFACT"; case debug_menu::debug_menu_index::SPAWN_CLAIRVOYANCE: return "SPAWN_CLAIRVOYANCE"; @@ -474,6 +475,237 @@ static int player_uilist() return uilist( _( "Playerā€¦" ), uilist_initializer ); } +static void monster_ammo_edit( monster &mon ) +{ + uilist smenu; + int pos = 0; + char hotkey = 'a'; + const auto &ammo_map = mon.type->starting_ammo; + std::vector ammos; + for( const std::pair &pair : ammo_map ) { + ammos.emplace_back( pair.first ); + const itype *display_type = item::find_type( pair.first ); + smenu.addentry( pos, true, hotkey, "%s: %d", display_type->nname( 1 ), mon.ammo[pair.first] ); + pos++; + hotkey++; + } + smenu.query(); + + if( smenu.ret > static_cast( ammo_map.size() ) || smenu.ret < 0 ) { + return; + } + itype_id new_ammo; + new_ammo = ammos[smenu.ret]; + if( new_ammo.is_valid() ) { + int value; + const itype *display_type = item::find_type( new_ammo ); + if( query_int( value, _( "Set %s to how much ammo? Currently: %d" ), display_type->nname( 1 ), + mon.ammo[new_ammo] ) ) { + if( value < 0 ) { + value = 0; + } + mon.ammo[new_ammo] = value; + } + } +} + +static void run_eoc_menu( Creature *target = nullptr, bool target_as_alpha = false ) +{ + if( !target && target_as_alpha ) { + return; + } + const std::vector &eocs = effect_on_conditions::get_all(); + uilist eoc_menu; + for( const effect_on_condition &eoc : eocs ) { + eoc_menu.addentry( -1, true, -1, eoc.id.str() ); + } + eoc_menu.query(); + + if( eoc_menu.ret >= 0 && eoc_menu.ret < static_cast( eocs.size() ) ) { + dialogue newDialog; + if( target_as_alpha ) { + newDialog = dialogue( get_talker_for( target ), get_talker_for( get_avatar() ) ); + } else { + newDialog = dialogue( get_talker_for( get_avatar() ), target ? get_talker_for( target ) : nullptr ); + } + eocs[eoc_menu.ret].activate( newDialog ); + } +} + +static int creature_uilist() +{ + std::vector uilist_initializer = { + { uilist_entry( debug_menu_index::EDIT_MONSTER, true, 'c', _( "Edit monster" ) ) }, + }; + + return uilist( _( "Monsterā€¦" ), uilist_initializer ); +} + +static void monster_edit_menu() +{ + std::vector locations; + uilist monster_menu; + int charnum = 0; + for( const monster &mon : g->all_monsters() ) { + monster_menu.addentry( charnum++, true, MENU_AUTOASSIGN, mon.disp_name() ); + locations.emplace_back( mon.pos() ); + } + + if( locations.empty() ) { + popup( _( "No monsters found inside the bubble, aborting." ) ); + return; + } + + pointmenu_cb callback( locations ); + monster_menu.callback = &callback; + monster_menu.w_y_setup = 0; + monster_menu.query(); + if( monster_menu.ret < 0 || static_cast( monster_menu.ret ) >= locations.size() ) { + return; + } + const size_t index = monster_menu.ret; + monster *critter = get_creature_tracker().creature_at( locations[index], true ); + uilist nmenu; + + if( critter ) { + std::string size_string = "DEBUG"; + // This existing map isn't already extracted for translation...? + for( const std::pair &size_pair : monster::size_map ) { + if( size_pair.second == critter->get_size() ) { + size_string = size_pair.first; + break; + } + } + std::stringstream data; + data << string_format( _( "Monster %s of type %s" ), critter->disp_name(), + critter->type->id.c_str() ) << std::endl; + if( Creature *summoner = critter->get_summoner() ) { + data << string_format( _( "Summoned by: %s" ), summoner->disp_name() ) << std::endl; + } + if( critter->get_summon_time() != calendar::turn_zero ) { + data << string_format( _( "Expires in: %s" ), + to_string( critter->get_summon_time() - calendar::turn ) ) << std::endl; + } + data << string_format( _( "Faction: %s" ), critter->get_monster_faction().id().str() ) << std::endl; + data << string_format( _( "HP(max): %d (%d)" ), critter->get_hp(), + critter->get_hp_max() ) << std::endl; + data << string_format( _( "Volume: %sL (size %s)" ), units::to_liter( critter->get_volume() ), + size_string ) << std::endl; + data << string_format( _( "Speed(base): %d (%d)" ), critter->get_speed(), + critter->get_speed_base() ) << std::endl; + data << string_format( _( "Aggression(base): %d (%d)" ), critter->anger, + critter->type->agro ) << std::endl; + data << string_format( _( "Morale(base): %d (%d)" ), critter->morale, + critter->type->morale ) << std::endl; + if( !critter->ammo.empty() ) { + for( auto &ammos : critter->ammo ) { + data << string_format( _( "Ammo: %s rounds of %s" ), ammos.second, + ammos.first.c_str() ) << std::endl; + } + } + if( critter->wander_pos != critter->get_location() && critter->wander_pos != tripoint_abs_ms() ) { + data << string_format( _( "Wandering towards: %s" ), critter->wander_pos.to_string() ) << std::endl; + data << string_format( _( "From cur location: %s" ), + critter->get_location().to_string() ) << std::endl; + data << string_format( _( "Desire to wander: %d" ), critter->wandf ) << std::endl; + } + // TODO: Move these out into a sub-menu, this is too many lines! + if( !critter->inv.empty() ) { + for( item &drop : critter->inv ) { + data << string_format( _( "Cached item drop: %s" ), drop.tname() ) << std::endl; + } + } + if( !critter->dissectable_inv.empty() ) { + for( item &harvest : critter->dissectable_inv ) { + data << string_format( _( "Cached dissection result: %s" ), harvest.tname() ) << std::endl; + } + } + + nmenu.text = data.str(); + } else { + return; //No monster, no editing! + } + + enum { + D_HP, D_MORALE, D_AGGRO, D_ADD_EFFECT, D_ADD_AMMO, D_TELE, D_WANDER_DES, D_WANDER, D_ALPHA_EOC, D_BETA_EOC + }; + nmenu.addentry( D_HP, true, 'h', "%s", _( "Set hit points" ) ); + nmenu.addentry( D_MORALE, true, 'o', "%s", _( "Set morale" ) ); + nmenu.addentry( D_AGGRO, true, 'a', "%s", _( "Set aggression" ) ); + nmenu.addentry( D_ADD_EFFECT, true, 'E', "%s", _( "Add an effect" ) ); + nmenu.addentry( D_ADD_AMMO, true, 'A', "%s", _( "Modify ammo" ) ); + nmenu.addentry( D_TELE, true, 'e', "%s", _( "Teleport" ) ); + nmenu.addentry( D_WANDER_DES, true, 'W', "%s", + _( "Set wander destination (also sets wander desire to 1000 turns)" ) ); + nmenu.addentry( D_WANDER, true, 'w', "%s", _( "Set wander desire" ) ); + nmenu.addentry( D_ALPHA_EOC, true, 'r', "%s", + _( "Run EOC with monster as alpha talker (avatar as beta)" ) ); + nmenu.addentry( D_BETA_EOC, true, 't', "%s", + _( "Run EOC with monster as beta talker (avatar as alpha)" ) ); + + nmenu.query(); + switch( nmenu.ret ) { + case D_HP: { + int value = 0; + if( query_int( value, _( "Set the hitpoints to? Currently: %d" ), critter->get_hp() ) ) { + critter->set_hp( value ); + } + } + break; + case D_MORALE: { + int value = 0; + if( query_int( value, _( "Set the morale to? Currently: %d" ), critter->morale ) ) { + critter->morale = value; + } + } + break; + case D_AGGRO: { + int value = 0; + if( query_int( value, _( "Set aggression to? Currently: %d" ), critter->anger ) ) { + critter->anger = value; + } + } + break; + case D_ADD_EFFECT: { + wisheffect( *critter->as_monster() ); + break; + } + case D_ADD_AMMO: { + if( critter->ammo.empty() ) { + popup( _( "This monster doesn't have any defined ammo." ) ); + break; + } + monster_ammo_edit( *critter ); + break; + } + case D_TELE: { + if( const std::optional newpos = g->look_around() ) { + critter->setpos( *newpos ); + } + break; + } + case D_WANDER_DES: { + if( const std::optional newpos = g->look_around() ) { + critter->wander_to( get_map().getglobal( *newpos ), 1000 ); + } + break; + } + case D_WANDER: { + int value = 0; + if( query_int( value, _( "Set wander desire to? Currently: %d" ), critter->wandf ) ) { + critter->wandf = value; + } + break; + } + case D_ALPHA_EOC: + run_eoc_menu( critter, true ); + break; + case D_BETA_EOC: + run_eoc_menu( critter ); + break; + } +} + static int info_uilist( bool display_all_entries = true ) { // always displayed @@ -636,7 +868,7 @@ static int faction_uilist() static std::optional debug_menu_uilist( bool display_all_entries = true ) { enum { - D_INFO, D_GAME, D_SPAWNING, D_PLAYER, D_FACTION, D_VEHICLE, D_TELEPORT, D_MAP, D_QUICK_SETUP + D_INFO, D_GAME, D_SPAWNING, D_PLAYER, D_MONSTER, D_FACTION, D_VEHICLE, D_TELEPORT, D_MAP, D_QUICK_SETUP }; std::vector menu = { @@ -648,6 +880,7 @@ static std::optional debug_menu_uilist( bool display_all_entri { uilist_entry( D_GAME, true, 'g', _( "Gameā€¦" ) ) }, { uilist_entry( D_SPAWNING, true, 's', _( "Spawningā€¦" ) ) }, { uilist_entry( D_PLAYER, true, 'p', _( "Playerā€¦" ) ) }, + { uilist_entry( D_MONSTER, true, 'c', _( "Monsterā€¦" ) ) }, { uilist_entry( D_FACTION, true, 'f', _( "Factionā€¦" ) ) }, { uilist_entry( D_VEHICLE, true, 'v', _( "Vehicleā€¦" ) ) }, { uilist_entry( D_TELEPORT, true, 't', _( "Teleportā€¦" ) ) }, @@ -681,6 +914,9 @@ static std::optional debug_menu_uilist( bool display_all_entri case D_PLAYER: action = player_uilist(); break; + case D_MONSTER: + action = creature_uilist(); + break; case D_FACTION: action = faction_uilist(); break; @@ -3519,6 +3755,10 @@ void debug() character_edit_menu(); break; + case debug_menu_index::EDIT_MONSTER: + monster_edit_menu(); + break; + case debug_menu_index::CONTROL_NPC: control_npc_menu(); break; @@ -3679,17 +3919,7 @@ void debug() static_cast( raise( SIGSEGV ) ); break; case debug_menu_index::ACTIVATE_EOC: { - const std::vector &eocs = effect_on_conditions::get_all(); - uilist eoc_menu; - for( const effect_on_condition &eoc : eocs ) { - eoc_menu.addentry( -1, true, -1, eoc.id.str() ); - } - eoc_menu.query(); - - if( eoc_menu.ret >= 0 && eoc_menu.ret < static_cast( eocs.size() ) ) { - dialogue newDialog( get_talker_for( get_avatar() ), nullptr ); - eocs[eoc_menu.ret].activate( newDialog ); - } + run_eoc_menu(); } break; case debug_menu_index::MAP_EXTRA: diff --git a/src/debug_menu.h b/src/debug_menu.h index c3b3d36ab0be4..21c724359a22a 100644 --- a/src/debug_menu.h +++ b/src/debug_menu.h @@ -9,6 +9,7 @@ #include class Character; +class Creature; struct tripoint; template struct enum_traits; @@ -36,6 +37,7 @@ enum class debug_menu_index : int { FORGET_ALL_ITEMS, UNLOCK_ALL, EDIT_PLAYER, + EDIT_MONSTER, CONTROL_NPC, SPAWN_ARTIFACT, SPAWN_CLAIRVOYANCE, @@ -109,7 +111,7 @@ enum class debug_menu_index : int { last }; -void wisheffect( Character &p ); +void wisheffect( Creature &p ); void wishitem( Character *you = nullptr ); void wishitem( Character *you, const tripoint & ); void wishmonster( const std::optional &p ); diff --git a/src/wish.cpp b/src/wish.cpp index f886e6ddd0926..20cfc62eaa532 100644 --- a/src/wish.cpp +++ b/src/wish.cpp @@ -466,7 +466,7 @@ void debug_menu::wishbionics( Character *you ) } } -void debug_menu::wisheffect( Character &p ) +void debug_menu::wisheffect( Creature &p ) { static bodypart_str_id effectbp = bodypart_str_id::NULL_ID(); std::vector effects; From fa8ae46eb0a1d42a9a6646858ffb60449c53fe9f Mon Sep 17 00:00:00 2001 From: osuphobia <78858975+osuphobia@users.noreply.github.com> Date: Thu, 9 May 2024 13:55:50 +0800 Subject: [PATCH 101/104] clang-tidy (#73572) * clang-tidy * More descriptive parameter name. --- src/npcmove.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/npcmove.cpp b/src/npcmove.cpp index a98697f777abe..6b841d3eb3a62 100644 --- a/src/npcmove.cpp +++ b/src/npcmove.cpp @@ -4042,21 +4042,21 @@ bool npc::do_player_activity() return moves != old_moves; } -double npc::evaluate_weapon( item &it, bool can_use_gun, bool use_silent ) const +double npc::evaluate_weapon( item &maybe_weapon, bool can_use_gun, bool use_silent ) const { - bool allowed = can_use_gun && it.is_gun() && ( !use_silent || it.is_silent() ); + bool allowed = can_use_gun && maybe_weapon.is_gun() && ( !use_silent || maybe_weapon.is_silent() ); // According to unmodified evaluation score, NPCs almost always prioritize wielding guns if they have one. // This is relatively reasonable, as players can issue commands to NPCs when we do not want them to use ranged weapons. // Conversely, we cannot directly issue commands when we want NPCs to prioritize ranged weapons. // Note that the scoring method here is different from the 'weapon_value' used elsewhere. - double val_gun = allowed ? gun_value( it, it.shots_remaining( this ) ) : 0; + double val_gun = allowed ? gun_value( maybe_weapon, maybe_weapon.shots_remaining( this ) ) : 0; add_msg_debug( debugmode::DF_NPC_ITEMAI, "%s %s valued at %1.2f as a ranged weapon to wield.", - disp_name( true ), it.type->get_id().str(), val_gun ); - double val_melee = melee_value( it ); + disp_name( true ), maybe_weapon.type->get_id().str(), val_gun ); + double val_melee = melee_value( maybe_weapon ); add_msg_debug( debugmode::DF_NPC_ITEMAI, "%s %s valued at %1.2f as a melee weapon to wield.", disp_name( true ), - it.type->get_id().str(), val_melee ); + maybe_weapon.type->get_id().str(), val_melee ); double val = std::max( val_gun, val_melee ); return val; } From 67902af9303657132dc699cb2816c23d1856dceb Mon Sep 17 00:00:00 2001 From: yuganxia <31246176+yuganxia@users.noreply.github.com> Date: Thu, 9 May 2024 21:56:59 +0800 Subject: [PATCH 102/104] Use wash interface to remake a batch heat items menu (#72514) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update iuse.cpp * frame copy * DEBUG TOOL * basic fream * UI and basic select logic * HOTPLATE 2 * Now connected tool can be found * C++ part finished * little change * Astyled and msg * remove unused * remove unused * sorting... * BUG fix, change require based on weight * Update src/iuse.cpp Co-authored-by: Jianxiang Wang (ēŽ‹å„ēæ”) * Update iuse.cpp * UPS supported. * unrecognized words * Don't add liquid on floor * add more debug tool * JSON part (With out mods) * Without mod * Update data/json/item_actions.json Co-authored-by: anothersimulacrum * reframe * Little change * clang tidy * Update src/activity_actor.cpp Co-authored-by: anothersimulacrum * Update src/activity_actor.cpp Co-authored-by: anothersimulacrum * Update src/activity_actor.cpp Co-authored-by: anothersimulacrum * Update src/activity_actor_definitions.h Co-authored-by: anothersimulacrum * Update dining_kitchen.json * Update plating.json * Update dining_kitchen.json * Update plating.json * Update plating.json * Update dining_kitchen.json * Update plating.json * Update dining_kitchen.json * Update plating.json * cost formula * formula change again * typo * Do the checking * Duplicate thing lol --------- Co-authored-by: Jianxiang Wang (ēŽ‹å„ēæ”) Co-authored-by: anothersimulacrum --- data/json/item_actions.json | 15 ++ data/json/items/armor/helmets.json | 2 + data/json/items/containers/containers.json | 30 +++ data/json/items/generic.json | 4 +- data/json/items/generic/dining_kitchen.json | 18 +- data/json/items/melee/bludgeons.json | 1 + .../json/items/melee/spears_and_polearms.json | 33 +++ data/json/items/melee/swords_and_blades.json | 2 + data/json/items/resources/wood.json | 1 + data/json/items/tool/container.json | 1 + data/json/items/tool/cooking.json | 53 ++-- data/json/items/tool/firefighting.json | 1 + data/json/items/tool/metalworking.json | 7 +- data/json/items/tool/misc.json | 3 + data/json/items/tool/science.json | 4 +- data/json/items/vehicle/plating.json | 9 +- data/json/player_activities.json | 8 + data/json/tool_qualities.json | 5 + src/activity_actor.cpp | 103 ++++++++ src/activity_actor_definitions.h | 32 +++ src/item.cpp | 5 + src/item.h | 2 + src/item_contents.cpp | 13 + src/item_contents.h | 2 + src/item_factory.cpp | 3 + src/iuse.cpp | 249 ++++++++++++++++++ src/iuse.h | 18 ++ 27 files changed, 595 insertions(+), 29 deletions(-) diff --git a/data/json/item_actions.json b/data/json/item_actions.json index da9ba00ff1ec4..ff2b901e2ac89 100644 --- a/data/json/item_actions.json +++ b/data/json/item_actions.json @@ -500,6 +500,21 @@ "id": "HEAT_FOOD", "name": { "str": "Heat up food (in it)" } }, + { + "type": "item_action", + "id": "HEAT_LIQUID_ITEMS", + "name": { "str": "Heat up liquid items" } + }, + { + "type": "item_action", + "id": "HEAT_SOLID_ITEMS", + "name": { "str": "Heat up solid items" } + }, + { + "type": "item_action", + "id": "HEAT_ALL_ITEMS", + "name": { "str": "Heat up solid or liquid items" } + }, { "type": "item_action", "id": "HONEYCOMB", diff --git a/data/json/items/armor/helmets.json b/data/json/items/armor/helmets.json index e08d1017c51db..0d0e9c507e31b 100644 --- a/data/json/items/armor/helmets.json +++ b/data/json/items/armor/helmets.json @@ -16,6 +16,7 @@ "warmth": 5, "material_thickness": 2, "qualities": [ [ "COOK", 3 ], [ "BOIL", 2 ], [ "CONTAIN", 1 ], [ "CHEM", 1 ] ], + "use_action": [ "HEAT_ALL_ITEMS" ], "techniques": [ "WBLOCK_1" ], "armor": [ { @@ -46,6 +47,7 @@ "warmth": 70, "material_thickness": 1, "qualities": [ [ "COOK", 2 ], [ "BOIL", 1 ] ], + "use_action": [ "HEAT_ALL_ITEMS" ], "techniques": [ "WBLOCK_1" ], "armor": [ { diff --git a/data/json/items/containers/containers.json b/data/json/items/containers/containers.json index 536f9ee00d964..b9c3d6176feab 100644 --- a/data/json/items/containers/containers.json +++ b/data/json/items/containers/containers.json @@ -96,6 +96,7 @@ } ], "qualities": [ [ "BOIL", 2 ], [ "CONTAIN", 1 ] ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "flags": [ "COLLAPSE_CONTENTS" ], "melee_damage": { "bash": 8 } }, @@ -125,6 +126,7 @@ } ], "qualities": [ [ "BOIL", 2 ], [ "CONTAIN", 1 ] ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "flags": [ "COLLAPSE_CONTENTS" ], "melee_damage": { "bash": 8 } }, @@ -525,6 +527,7 @@ } ], "qualities": [ [ "BOIL", 1 ] ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "flags": [ "COLLAPSE_CONTENTS" ], "melee_damage": { "bash": 2 }, "//2": "Based on https://www.amazon.com/dp/B09K2VQLZV" @@ -859,6 +862,7 @@ "max_contains_weight": "3 kg" } ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "qualities": [ [ "BOIL", 2 ], [ "CONTAIN", 1 ] ] }, { @@ -1555,6 +1559,7 @@ "max_contains_weight": "20 kg" } ], + "use_action": [ "HEAT_ALL_ITEMS" ], "qualities": [ [ "BOIL", 2 ], [ "CONTAIN", 1 ] ] }, { @@ -1680,6 +1685,7 @@ } ], "qualities": [ [ "BOIL", 1 ] ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "flags": [ "COLLAPSE_CONTENTS" ], "melee_damage": { "bash": 2 } }, @@ -1825,6 +1831,7 @@ } ], "qualities": [ [ "BOIL", 1 ] ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "flags": [ "COLLAPSE_CONTENTS" ] }, { @@ -1850,6 +1857,7 @@ } ], "qualities": [ [ "BOIL", 1 ] ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "volume": "525 ml", "flags": [ "COLLAPSE_CONTENTS" ] }, @@ -1947,6 +1955,7 @@ "max_contains_weight": "1 kg" } ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "qualities": [ [ "BOIL", 2 ], [ "CONTAIN", 1 ] ] }, { @@ -1974,6 +1983,7 @@ "max_contains_weight": "25 kg" } ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "qualities": [ [ "BOIL", 2 ], [ "CONTAIN", 1 ] ], "melee_damage": { "bash": 1 } }, @@ -2002,6 +2012,7 @@ "max_contains_weight": "50 kg" } ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "qualities": [ [ "BOIL", 2 ], [ "CONTAIN", 1 ] ] }, { @@ -2056,6 +2067,7 @@ } ], "qualities": [ [ "BOIL", 1 ], [ "CONTAIN", 1 ] ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "flags": [ "SOFT", "NO_REPAIR", "COLLAPSE_CONTENTS" ] }, { @@ -2086,6 +2098,7 @@ } ], "qualities": [ [ "BOIL", 1 ] ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "flags": [ "COLLAPSE_CONTENTS" ], "melee_damage": { "bash": 3 } }, @@ -2117,6 +2130,7 @@ } ], "qualities": [ [ "BOIL", 1 ], [ "CONTAIN", 1 ] ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "flags": [ "COLLAPSE_CONTENTS" ], "melee_damage": { "bash": 1 } }, @@ -2148,6 +2162,7 @@ } ], "qualities": [ [ "BOIL", 1 ], [ "CONTAIN", 1 ] ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "flags": [ "COLLAPSE_CONTENTS" ] }, { @@ -2180,6 +2195,7 @@ } ], "qualities": [ [ "BOIL", 1 ], [ "CONTAIN", 1 ] ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "flags": [ "COLLAPSE_CONTENTS" ] }, { @@ -2209,6 +2225,7 @@ } ], "qualities": [ [ "BOIL", 1 ], [ "CONTAIN", 1 ] ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "flags": [ "COLLAPSE_CONTENTS" ] }, { @@ -2250,6 +2267,7 @@ ] }, "qualities": [ [ "BOIL", 1 ] ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "flags": [ "BELTED", "OVERSIZE", "WATER_FRIENDLY", "COLLAPSE_CONTENTS" ], "melee_damage": { "bash": 3 } }, @@ -2376,6 +2394,7 @@ } ], "qualities": [ [ "BOIL", 1 ] ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "flags": [ "COLLAPSE_CONTENTS" ], "melee_damage": { "bash": 4 } }, @@ -2403,6 +2422,7 @@ "max_contains_weight": "2 kg" } ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "qualities": [ [ "CONTAIN", 1 ], [ "BOIL", 2 ] ], "melee_damage": { "bash": 1 } }, @@ -2496,6 +2516,7 @@ "max_contains_weight": "100 kg" } ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "qualities": [ [ "BOIL", 2 ], [ "CONTAIN", 1 ] ], "flags": [ "COLLAPSE_CONTENTS" ], "melee_damage": { "bash": 10 } @@ -2526,6 +2547,7 @@ "max_contains_weight": "120 kg" } ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "qualities": [ [ "BOIL", 2 ], [ "CONTAIN", 1 ] ], "flags": [ "COLLAPSE_CONTENTS" ], "melee_damage": { "bash": 10 } @@ -2581,6 +2603,7 @@ "max_contains_weight": "120 kg" } ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "qualities": [ [ "BOIL", 2 ], [ "CONTAIN", 1 ] ], "flags": [ "COLLAPSE_CONTENTS" ], "melee_damage": { "bash": 6 } @@ -2612,6 +2635,7 @@ "max_contains_weight": "4 kg" } ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "qualities": [ [ "BOIL", 2 ], [ "CONTAIN", 1 ] ], "flags": [ "COLLAPSE_CONTENTS" ], "melee_damage": { "bash": 5 } @@ -3514,6 +3538,7 @@ "//2": "mathematically perfect sprehe out of sheet is 2110 ml, but we are less than perfect", "pocket_data": [ { "pocket_type": "CONTAINER", "max_contains_volume": "1500 ml", "max_contains_weight": "6 kg" } ], "qualities": [ [ "COOK", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "flags": [ "SOFT", "NO_REPAIR", "COLLAPSE_CONTENTS" ] }, { @@ -3777,6 +3802,7 @@ } ], "qualities": [ [ "BOIL", 1 ] ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "flags": [ "COLLAPSE_CONTENTS" ] }, { @@ -3803,6 +3829,7 @@ "max_contains_weight": "4000 g" } ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "qualities": [ [ "CONTAIN", 1 ], [ "BOIL", 2 ] ] }, { @@ -4684,6 +4711,7 @@ "max_contains_weight": "250 kg" } ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "qualities": [ [ "BOIL", 2 ], [ "CONTAIN", 1 ] ], "flags": [ "COLLAPSE_CONTENTS" ], "melee_damage": { "bash": 8 } @@ -4713,6 +4741,7 @@ "max_contains_weight": "500 kg" } ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "qualities": [ [ "BOIL", 2 ], [ "CONTAIN", 1 ] ], "flags": [ "COLLAPSE_CONTENTS" ], "melee_damage": { "bash": 8 } @@ -4839,6 +4868,7 @@ } ], "qualities": [ [ "BOIL", 1 ], [ "CONTAIN", 1 ] ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "flags": [ "COLLAPSE_CONTENTS" ] }, { diff --git a/data/json/items/generic.json b/data/json/items/generic.json index 526a3ebe00443..ed4ca0dd103f2 100644 --- a/data/json/items/generic.json +++ b/data/json/items/generic.json @@ -667,6 +667,7 @@ "volume": "263 ml", "to_hit": -1, "qualities": [ [ "BOIL", 2 ], [ "CONTAIN", 1 ] ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "pocket_data": [ { "pocket_type": "CONTAINER", @@ -1150,7 +1151,8 @@ "volume": "25 ml", "to_hit": -5, "milling": { "into": "meal_bone_tainted", "recipe": "meal_bone_tainted_mill_6_1" }, - "qualities": [ [ "COOK", 1 ] ] + "qualities": [ [ "COOK", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ] }, { "type": "GENERIC", diff --git a/data/json/items/generic/dining_kitchen.json b/data/json/items/generic/dining_kitchen.json index 909cf69fe6ff9..28d196e4c6c48 100644 --- a/data/json/items/generic/dining_kitchen.json +++ b/data/json/items/generic/dining_kitchen.json @@ -113,7 +113,7 @@ "to_hit": { "grip": "bad", "length": "hand", "surface": "any", "balance": "clumsy" }, "price": "45 USD", "price_postapoc": "10 cent", - "use_action": [ "HEAT_FOOD" ], + "use_action": [ "HEAT_ALL_ITEMS" ], "qualities": [ [ "COOK", 3 ], [ "BOIL", 2 ], [ "CONTAIN", 1 ], [ "CHEM", 1 ] ], "flags": [ "ALLOWS_REMOTE_USE" ] }, @@ -146,6 +146,7 @@ "rigid": true } ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "qualities": [ [ "BOIL", 2 ], [ "CONTAIN", 1 ] ] }, { @@ -172,6 +173,7 @@ "rigid": true } ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "qualities": [ [ "BOIL", 2 ], [ "CONTAIN", 1 ] ], "//3": "Based on https://www.dimensions.com/element/ikea-vardagen-coffee-cup-saucer" }, @@ -198,6 +200,7 @@ "rigid": true } ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "qualities": [ [ "BOIL", 2 ], [ "CONTAIN", 1 ] ], "variants": [ { @@ -431,6 +434,7 @@ "rigid": true } ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "qualities": [ [ "BOIL", 2 ], [ "CONTAIN", 1 ] ] }, { @@ -450,6 +454,7 @@ "rigid": true } ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "qualities": [ [ "BOIL", 2 ], [ "CONTAIN", 1 ] ] }, { @@ -481,6 +486,7 @@ "rigid": true } ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "qualities": [ [ "BOIL", 1 ], [ "CONTAIN", 1 ] ] }, { @@ -526,6 +532,7 @@ "rigid": true } ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "qualities": [ [ "BOIL", 1 ], [ "CONTAIN", 1 ] ] }, { @@ -1134,7 +1141,7 @@ } ], "qualities": [ [ "COOK", 3 ], [ "BOIL", 2 ], [ "CONTAIN", 1 ], [ "CHEM", 1 ] ], - "use_action": [ "HEAT_FOOD" ], + "use_action": [ "HEAT_ALL_ITEMS" ], "flags": [ "ALLOWS_REMOTE_USE" ], "melee_damage": { "bash": 10 }, "//": "Based on https://www.amazon.com/dp/B0075O2Z34" @@ -1164,7 +1171,7 @@ } ], "qualities": [ [ "COOK", 3 ], [ "BOIL", 2 ], [ "CONTAIN", 1 ], [ "CHEM", 1 ] ], - "use_action": "HEAT_FOOD", + "use_action": [ "HEAT_ALL_ITEMS" ], "flags": [ "ALLOWS_REMOTE_USE" ], "melee_damage": { "bash": 9 } }, @@ -1273,7 +1280,7 @@ } ], "qualities": [ [ "COOK", 2 ], [ "BOIL", 2 ], [ "CONTAIN", 1 ] ], - "use_action": [ "HEAT_FOOD" ], + "use_action": [ "HEAT_ALL_ITEMS" ], "flags": [ "ALLOWS_REMOTE_USE" ], "melee_damage": { "bash": 10 } }, @@ -1302,7 +1309,7 @@ } ], "qualities": [ [ "COOK", 2 ], [ "BOIL", 2 ], [ "CONTAIN", 1 ] ], - "use_action": [ "HEAT_FOOD" ], + "use_action": [ "HEAT_ALL_ITEMS" ], "flags": [ "ALLOWS_REMOTE_USE" ], "melee_damage": { "bash": 10 } }, @@ -1400,6 +1407,7 @@ "volume": "250 ml", "to_hit": -1, "qualities": [ [ "COOK", 1 ], [ "CONTAIN", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "melee_damage": { "bash": 2 } }, { diff --git a/data/json/items/melee/bludgeons.json b/data/json/items/melee/bludgeons.json index 4d84241814cfd..109c7536ddd91 100644 --- a/data/json/items/melee/bludgeons.json +++ b/data/json/items/melee/bludgeons.json @@ -1153,6 +1153,7 @@ "to_hit": { "grip": "weapon", "length": "long", "surface": "any", "balance": "uneven" }, "price_postapoc": "100 USD", "qualities": [ [ "COOK", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "category": "weapons", "melee_damage": { "bash": 44, "stab": 33 } }, diff --git a/data/json/items/melee/spears_and_polearms.json b/data/json/items/melee/spears_and_polearms.json index 98e139b0814a9..fef61715265c0 100644 --- a/data/json/items/melee/spears_and_polearms.json +++ b/data/json/items/melee/spears_and_polearms.json @@ -14,6 +14,7 @@ "longest_side": "140 cm", "to_hit": { "grip": "solid", "length": "long", "surface": "point", "balance": "neutral" }, "qualities": [ [ "COOK", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "flags": [ "SPEAR", "REACH_ATTACK", "NONCONDUCTIVE", "SHEATH_SPEAR" ], "weapon_category": [ "POLEARMS", "SPEARS" ], "price": "20 USD", @@ -36,6 +37,7 @@ "flags": [ "SPEAR" ], "techniques": [ "WBLOCK_1" ], "qualities": [ [ "COOK", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "melee_damage": { "bash": 5, "stab": 9 } }, { @@ -56,6 +58,7 @@ "flags": [ "SPEAR", "REACH_ATTACK", "NPC_THROWN", "SHEATH_SPEAR" ], "weapon_category": [ "POLEARMS", "SPEARS" ], "qualities": [ [ "COOK", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "melee_damage": { "bash": 5, "stab": 9 } }, { @@ -76,6 +79,7 @@ "weapon_category": [ "POLEARMS", "SPEARS" ], "price": "4 USD", "qualities": [ [ "COOK", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "melee_damage": { "bash": 4, "stab": 18 } }, { @@ -104,6 +108,7 @@ "weapon_category": [ "POLEARMS", "SPEARS" ], "price": "40 USD", "qualities": [ [ "COOK", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "melee_damage": { "bash": 4, "stab": 18 } }, { @@ -176,6 +181,7 @@ "looks_like": "spear_steel", "techniques": [ "WBLOCK_1" ], "qualities": [ [ "COOK", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "flags": [ "SPEAR", "REACH_ATTACK", "NONCONDUCTIVE", "FRAGILE_MELEE", "SHEATH_SPEAR" ], "weapon_category": [ "POLEARMS", "SPEARS" ], "melee_damage": { "bash": 4, "stab": 24 } @@ -189,6 +195,7 @@ "price": "7 USD", "price_postapoc": "1 USD 50 cent", "qualities": [ [ "CUT", 1 ], [ "COOK", 1 ], [ "BUTCHER", -42 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "extend": { "flags": [ "FRAGILE_MELEE" ] } }, { @@ -209,6 +216,7 @@ "looks_like": "spear_steel", "techniques": [ "WBLOCK_1" ], "qualities": [ [ "CUT", 1 ], [ "COOK", 1 ], [ "BUTCHER", -28 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "flags": [ "SPEAR", "REACH_ATTACK", "NONCONDUCTIVE", "SHEATH_SPEAR" ], "weapon_category": [ "POLEARMS", "SPEARS" ], "melee_damage": { "bash": 4, "stab": 26 } @@ -232,6 +240,7 @@ "weapon_category": [ "POLEARMS", "SPEARS" ], "price": "160 USD", "qualities": [ [ "CUT", 1 ], [ "COOK", 1 ], [ "BUTCHER", -28 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "melee_damage": { "bash": 4, "stab": 26 } }, { @@ -252,6 +261,7 @@ "looks_like": "spear_steel", "techniques": [ "WBLOCK_1" ], "qualities": [ [ "COOK", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "flags": [ "SPEAR", "REACH_ATTACK", "NONCONDUCTIVE", "SHEATH_SPEAR" ], "weapon_category": [ "POLEARMS", "SPEARS" ], "melee_damage": { "bash": 4, "stab": 24 } @@ -275,6 +285,7 @@ "weapon_category": [ "POLEARMS", "SPEARS" ], "price": "160 USD", "qualities": [ [ "COOK", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "melee_damage": { "bash": 4, "stab": 24 } }, { @@ -296,6 +307,7 @@ "weapon_category": [ "POLEARMS", "SPEARS" ], "price": "49 USD", "qualities": [ [ "COOK", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "melee_damage": { "bash": 6, "stab": 18 } }, { @@ -316,6 +328,7 @@ "weapon_category": [ "POLEARMS", "SPEARS" ], "price": "14 USD", "qualities": [ [ "COOK", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "melee_damage": { "bash": 4, "stab": 28 } }, { @@ -336,6 +349,7 @@ "weapon_category": [ "POLEARMS", "SPEARS" ], "price": "160 USD", "qualities": [ [ "COOK", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "melee_damage": { "bash": 6, "stab": 30 } }, { @@ -356,6 +370,7 @@ "weapon_category": [ "FENCING_WEAPONRY" ], "techniques": [ "WBLOCK_1" ], "qualities": [ [ "COOK", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "melee_damage": { "bash": 3, "stab": 13 } }, { @@ -377,6 +392,7 @@ "weapon_category": [ "POLEARMS", "SPEARS" ], "price": "80 USD", "qualities": [ [ "COOK", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "melee_damage": { "bash": 6, "stab": 18 } }, { @@ -397,6 +413,7 @@ "weapon_category": [ "POLEARMS", "SPEARS" ], "price": "80 USD", "qualities": [ [ "COOK", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "melee_damage": { "bash": 7, "stab": 24 } }, { @@ -417,6 +434,7 @@ "flags": [ "SPEAR", "FRAGILE_MELEE" ], "weapon_category": [ "POLEARMS" ], "qualities": [ [ "COOK", 1 ], [ "HAMMER", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "melee_damage": { "bash": 9, "stab": 4 } }, { @@ -437,6 +455,7 @@ "flags": [ "SPEAR", "FRAGILE_MELEE" ], "weapon_category": [ "POLEARMS" ], "qualities": [ [ "COOK", 1 ], [ "HAMMER", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "melee_damage": { "bash": 6, "stab": 13 } }, { @@ -457,6 +476,7 @@ "flags": [ "SPEAR", "REACH_ATTACK", "FRAGILE_MELEE", "SHEATH_SPEAR" ], "weapon_category": [ "POLEARMS", "SPEARS" ], "qualities": [ [ "COOK", 1 ], [ "HAMMER", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "melee_damage": { "bash": 5, "stab": 16 } }, { @@ -478,6 +498,7 @@ "weapon_category": [ "POLEARMS", "SPEARS" ], "price": "800 USD", "qualities": [ [ "COOK", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "melee_damage": { "bash": 8, "stab": 43 } }, { @@ -499,6 +520,7 @@ "to_hit": { "grip": "weapon", "length": "long", "surface": "line", "balance": "neutral" }, "price_postapoc": "100 USD", "qualities": [ [ "COOK", 1 ], [ "BUTCHER", -70 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "category": "weapons", "melee_damage": { "bash": 15, "cut": 49 } }, @@ -604,6 +626,7 @@ "price": "80 USD", "price_postapoc": "45 USD", "qualities": [ [ "COOK", 1 ], [ "CUT", 1 ], [ "BUTCHER", -24 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "melee_damage": { "bash": 4, "cut": 36 } }, { @@ -625,6 +648,7 @@ "price": "40 USD", "price_postapoc": "2 USD 50 cent", "qualities": [ [ "COOK", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "melee_damage": { "stab": 11 } }, { @@ -646,6 +670,7 @@ "price": "90 USD", "price_postapoc": "5 USD", "qualities": [ [ "COOK", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "melee_damage": { "bash": 5, "stab": 19 } }, { @@ -666,6 +691,7 @@ "looks_like": "pike", "techniques": [ "IMPALE", "WBLOCK_1" ], "qualities": [ [ "COOK", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "flags": [ "DURABLE_MELEE", "POLEARM", "SPEAR", "REACH_ATTACK", "REACH3", "NONCONDUCTIVE", "ALWAYS_TWOHAND" ], "weapon_category": [ "POLEARMS" ], "melee_damage": { "bash": 9, "stab": 16 } @@ -688,6 +714,7 @@ "looks_like": "pike", "techniques": [ "IMPALE", "WBLOCK_1" ], "qualities": [ [ "COOK", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "flags": [ "DURABLE_MELEE", "POLEARM", "SPEAR", "REACH_ATTACK", "REACH3", "NONCONDUCTIVE", "ALWAYS_TWOHAND" ], "weapon_category": [ "POLEARMS" ], "melee_damage": { "bash": 9, "stab": 23 } @@ -708,6 +735,7 @@ "color": "brown", "techniques": [ "IMPALE", "WBLOCK_1" ], "qualities": [ [ "COOK", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "flags": [ "DURABLE_MELEE", "POLEARM", "SPEAR", "REACH_ATTACK", "REACH3", "NONCONDUCTIVE", "ALWAYS_TWOHAND" ], "weapon_category": [ "POLEARMS" ], "category": "weapons", @@ -776,6 +804,7 @@ "color": "yellow", "techniques": [ "WBLOCK_1", "IMPALE" ], "qualities": [ [ "COOK", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "flags": [ "SPEAR", "REACH_ATTACK", "DURABLE_MELEE", "SHEATH_SPEAR", "NONCONDUCTIVE", "POLEARM" ], "weapon_category": [ "POLEARMS", "SPEARS" ], "melee_damage": { "bash": 8, "stab": 39 } @@ -797,6 +826,7 @@ "looks_like": "spear_dory", "techniques": [ "WBLOCK_1" ], "qualities": [ [ "COOK", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "flags": [ "SPEAR", "REACH_ATTACK", "DURABLE_MELEE", "SHEATH_SPEAR", "NONCONDUCTIVE" ], "weapon_category": [ "POLEARMS", "SPEARS" ], "melee_damage": { "bash": 5, "stab": 29 } @@ -820,6 +850,7 @@ "to_hit": { "grip": "weapon", "length": "long", "surface": "line", "balance": "neutral" }, "price_postapoc": "50 USD", "qualities": [ [ "COOK", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "melee_damage": { "bash": 28, "cut": 31 } }, { @@ -859,6 +890,7 @@ "color": "light_gray", "techniques": [ "WBLOCK_1" ], "qualities": [ [ "COOK", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "flags": [ "SPEAR", "REACH_ATTACK", "SHEATH_SPEAR" ], "weapon_category": [ "POLEARMS", "SPEARS" ], "melee_damage": { "bash": 8, "stab": 20 } @@ -881,6 +913,7 @@ "looks_like": "spear_stone", "techniques": [ "WBLOCK_1" ], "qualities": [ [ "COOK", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "flags": [ "SPEAR", "REACH_ATTACK", "SHEATH_SPEAR" ], "weapon_category": [ "POLEARMS", "SPEARS" ], "melee_damage": { "bash": 8, "stab": 20 } diff --git a/data/json/items/melee/swords_and_blades.json b/data/json/items/melee/swords_and_blades.json index 1a10db40f82ba..8a338638c6041 100644 --- a/data/json/items/melee/swords_and_blades.json +++ b/data/json/items/melee/swords_and_blades.json @@ -1704,6 +1704,7 @@ "min_skills": [ [ "weapon", 2 ], [ "melee", 2 ] ], "techniques": [ "WBLOCK_1", "RAPID" ], "qualities": [ [ "CUT", 1 ], [ "COOK", 1 ], [ "BUTCHER", 7 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "flags": [ "DURABLE_MELEE", "PUMP_RAIL_COMPATIBLE", "SHEATH_SWORD" ], "weapon_category": [ "SHORT_SWORDS" ], "melee_damage": { "bash": 7, "stab": 21 } @@ -3135,6 +3136,7 @@ "min_skills": [ [ "weapon", 2 ], [ "melee", 1 ] ], "techniques": [ "WBLOCK_1" ], "qualities": [ [ "CUT", 1 ], [ "COOK", 1 ], [ "BUTCHER", 7 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "flags": [ "DURABLE_MELEE", "SHEATH_SWORD" ], "weapon_category": [ "KNIVES" ] }, diff --git a/data/json/items/resources/wood.json b/data/json/items/resources/wood.json index d9341f5bb1aaa..556b01648d375 100644 --- a/data/json/items/resources/wood.json +++ b/data/json/items/resources/wood.json @@ -31,6 +31,7 @@ "longest_side": "30 cm", "to_hit": 1, "qualities": [ [ "COOK", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "flags": [ "NO_SALVAGE", "TRADER_AVOID", "FIREWOOD" ], "melee_damage": { "bash": 4 } }, diff --git a/data/json/items/tool/container.json b/data/json/items/tool/container.json index 1c65395305ec5..de788757a08d7 100644 --- a/data/json/items/tool/container.json +++ b/data/json/items/tool/container.json @@ -23,6 +23,7 @@ } ], "qualities": [ [ "CONTAIN", 1 ], [ "BOIL", 2 ] ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "melee_damage": { "bash": 4 } }, { diff --git a/data/json/items/tool/cooking.json b/data/json/items/tool/cooking.json index ad17e24f26424..c6a16da132205 100644 --- a/data/json/items/tool/cooking.json +++ b/data/json/items/tool/cooking.json @@ -221,7 +221,8 @@ "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "charcoal": 2000 } } ], "flags": [ "ALLOWS_REMOTE_USE" ], "charges_per_use": 5, - "use_action": [ "HOTPLATE" ], + "qualities": [ [ "HOTPLATE", 2 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "melee_damage": { "bash": 9 } }, { @@ -243,7 +244,8 @@ "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "charcoal": 400, "coal": 2000 } } ], "flags": [ "ALLOWS_REMOTE_USE" ], "charges_per_use": 5, - "use_action": [ "HOTPLATE" ], + "qualities": [ [ "HOTPLATE", 2 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "melee_damage": { "bash": 4 } }, { @@ -261,7 +263,7 @@ "color": "brown", "pocket_data": [ { "max_contains_volume": "2 L", "max_contains_weight": "2100 g", "watertight": true, "rigid": true } ], "qualities": [ [ "COOK", 3 ], [ "BOIL", 2 ], [ "CONTAIN", 1 ], [ "CHEM", 1 ] ], - "use_action": [ "HEAT_FOOD" ], + "use_action": [ "HEAT_ALL_ITEMS" ], "flags": [ "ALLOWS_REMOTE_USE" ], "melee_damage": { "bash": 1 } }, @@ -295,6 +297,7 @@ "color": "brown", "pocket_data": [ { "max_contains_volume": "750 ml", "max_contains_weight": "2 kg", "watertight": true, "rigid": true } ], "qualities": [ [ "BOIL", 1 ] ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "melee_damage": { "bash": 1 } }, { @@ -314,8 +317,9 @@ "ammo": [ "battery" ], "flags": [ "WATER_BREAK", "ALLOWS_REMOTE_USE" ], "charges_per_use": 25, - "qualities": [ [ "BOIL", 1 ] ], - "use_action": [ "HOTPLATE", { "type": "link_up", "cable_length": 2, "charge_rate": "1 kW" } ], + "qualities": [ [ "BOIL", 1 ], [ "HOTPLATE", 1 ] ], + "pocket_data": [ { "max_contains_volume": "2 L", "max_contains_weight": "2400 g", "watertight": true, "rigid": true } ], + "use_action": [ "HEAT_LIQUID_ITEMS", { "type": "link_up", "cable_length": 2, "charge_rate": "1 kW" } ], "melee_damage": { "bash": 2 } }, { @@ -379,7 +383,8 @@ "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "esbit": 100 } } ], "flags": [ "ALLOWS_REMOTE_USE" ], "charges_per_use": 2, - "use_action": [ "HOTPLATE", "HEAT_FOOD" ], + "qualities": [ [ "HOTPLATE", 2 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "melee_damage": { "bash": 2 } }, { @@ -447,7 +452,8 @@ "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "gasoline": 500 }, "watertight": true, "rigid": true } ], "flags": [ "ALLOWS_REMOTE_USE" ], "charges_per_use": 2, - "use_action": [ "HOTPLATE" ], + "qualities": [ [ "HOTPLATE", 2 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "melee_damage": { "bash": 4 } }, { @@ -499,7 +505,8 @@ "flags": [ "WATER_BREAK", "ALLOWS_REMOTE_USE" ], "ammo": [ "battery" ], "charges_per_use": 35, - "use_action": [ "HOTPLATE", { "type": "link_up", "cable_length": 3, "charge_rate": "1 kW" } ], + "qualities": [ [ "HOTPLATE", 2 ] ], + "use_action": [ "HEAT_SOLID_ITEMS", { "type": "link_up", "cable_length": 3, "charge_rate": "1 kW" } ], "melee_damage": { "bash": 4 } }, { @@ -520,7 +527,8 @@ "flags": [ "WATER_BREAK", "ELECTRONIC", "ALLOWS_REMOTE_USE" ], "ammo": [ "battery" ], "charges_per_use": 25, - "use_action": [ "HOTPLATE", { "type": "link_up", "cable_length": 3, "charge_rate": "1500 W" } ], + "qualities": [ [ "HOTPLATE", 2 ] ], + "use_action": [ "HEAT_SOLID_ITEMS", { "type": "link_up", "cable_length": 3, "charge_rate": "1500 W" } ], "melee_damage": { "bash": 4 } }, { @@ -566,7 +574,7 @@ "symbol": ";", "color": "green", "qualities": [ [ "COOK", 3 ], [ "BOIL", 2 ], [ "CONTAIN", 1 ], [ "CHEM", 1 ] ], - "use_action": [ "HEAT_FOOD" ], + "use_action": [ "HEAT_ALL_ITEMS" ], "pocket_data": [ { "max_contains_volume": "1000 ml", "max_contains_weight": "2 kg", "watertight": true, "rigid": true } ], "melee_damage": { "bash": 4 } }, @@ -626,6 +634,7 @@ "material": [ "stone" ], "symbol": ":", "color": "light_gray", + "use_action": [ "HEAT_LIQUID_ITEMS" ], "qualities": [ [ "BOIL", 2 ], [ "CONTAIN", 1 ], [ "FINE_GRIND", 1 ], [ "HAMMER", 1 ] ], "melee_damage": { "bash": 3 } }, @@ -805,7 +814,7 @@ "looks_like": "pot_canning", "pocket_data": [ { "max_contains_volume": "6 L", "max_contains_weight": "100 kg", "watertight": true, "rigid": true } ], "qualities": [ [ "COOK", 3 ], [ "BOIL", 2 ], [ "CONTAIN", 1 ], [ "CHEM", 1 ] ], - "use_action": [ "HEAT_FOOD" ], + "use_action": [ "HEAT_ALL_ITEMS" ], "flags": [ "ALLOWS_REMOTE_USE" ], "melee_damage": { "bash": 6 } }, @@ -911,6 +920,7 @@ "material": [ "copper" ], "symbol": "L", "color": "white", + "use_action": [ "HEAT_LIQUID_ITEMS" ], "qualities": [ [ "DISTILL", 2 ], [ "BOIL", 2 ], [ "CONTAIN", 1 ] ], "melee_damage": { "bash": 10 } }, @@ -930,11 +940,14 @@ "color": "brown", "ammo": [ "lamp_oil" ], "sub": "oil_cooker", - "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "lamp_oil": 800 }, "watertight": true, "rigid": true } ], + "pocket_data": [ + { "pocket_type": "MAGAZINE", "ammo_restriction": { "lamp_oil": 800 }, "watertight": true, "rigid": true }, + { "max_contains_volume": "1 L", "max_contains_weight": "2 kg", "watertight": true, "rigid": true } + ], "flags": [ "ALLOWS_REMOTE_USE" ], "charges_per_use": 2, - "qualities": [ [ "COOK", 3 ], [ "BOIL", 2 ], [ "CONTAIN", 1 ], [ "CHEM", 1 ] ], - "use_action": [ "HOTPLATE", "HEAT_FOOD" ], + "qualities": [ [ "COOK", 3 ], [ "BOIL", 2 ], [ "CONTAIN", 1 ], [ "CHEM", 1 ], [ "HOTPLATE", 1 ] ], + "use_action": [ "HEAT_ALL_ITEMS" ], "melee_damage": { "bash": 6 } }, { @@ -954,6 +967,7 @@ "color": "dark_gray", "pocket_data": [ { "max_contains_volume": "500 ml", "max_contains_weight": "2 kg", "watertight": true, "rigid": true } ], "qualities": [ [ "BOIL", 1 ] ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "melee_damage": { "bash": 3 } }, { @@ -999,6 +1013,7 @@ "symbol": ")", "color": "dark_gray", "qualities": [ [ "COOK", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "//": "Based on: https://www.amazon.com/Noxious-Additives-Material-Sandwich-Breakfast/dp/B07WWW1S84/ref=sr_1_1?crid=QSRJMOJRQ89G&keywords=manual+waffle+iron&qid=1680812963&sprefix=manualwaffle+iron%2Caps%2C183&sr=8-1", "melee_damage": { "bash": 10 } }, @@ -1046,7 +1061,8 @@ "ammo": [ "propane" ], "pocket_data": [ { "pocket_type": "MAGAZINE_WELL", "flag_restriction": [ "GAS_TANK" ], "default_magazine": "small_propane_tank" } ], "charges_per_use": 2, - "use_action": [ "HOTPLATE", "HEAT_FOOD", { "type": "firestarter", "moves": 100, "moves_slow": 1000 } ], + "qualities": [ [ "HOTPLATE", 2 ] ], + "use_action": [ "HEAT_SOLID_ITEMS", { "type": "firestarter", "moves": 100, "moves_slow": 1000 } ], "flags": [ "FIRESTARTER" ], "melee_damage": { "bash": 4 } }, @@ -1090,8 +1106,9 @@ "default_magazine": "tinyweldtank" } ], + "qualities": [ [ "HOTPLATE", 2 ] ], "charges_per_use": 1, - "use_action": [ "HOTPLATE", "HEAT_FOOD", { "type": "firestarter", "moves": 100, "moves_slow": 1000 } ], + "use_action": [ "HEAT_SOLID_ITEMS", { "type": "firestarter", "moves": 100, "moves_slow": 1000 } ], "flags": [ "FIRESTARTER" ], "melee_damage": { "bash": 4 } }, @@ -1107,8 +1124,8 @@ "material": [ "steel", "plastic" ], "weight": "11339 g", "volume": "9 L", - "use_action": [ "HOTPLATE", { "type": "link_up", "cable_length": 2, "charge_rate": "1800 W" } ], - "qualities": [ [ "COOK", 1 ], [ "OVEN", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS", { "type": "link_up", "cable_length": 2, "charge_rate": "1800 W" } ], + "qualities": [ [ "COOK", 1 ], [ "OVEN", 1 ], [ "HOTPLATE", 1 ] ], "flags": [ "WATER_BREAK", "ALLOWS_REMOTE_USE" ], "charges_per_use": 25, "ammo": [ "battery" ] diff --git a/data/json/items/tool/firefighting.json b/data/json/items/tool/firefighting.json index 23360611a1faa..4596382f79a18 100644 --- a/data/json/items/tool/firefighting.json +++ b/data/json/items/tool/firefighting.json @@ -191,6 +191,7 @@ "longest_side": "160 cm", "to_hit": -1, "qualities": [ [ "COOK", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "melee_damage": { "bash": 20, "cut": 6 } }, { diff --git a/data/json/items/tool/metalworking.json b/data/json/items/tool/metalworking.json index f669ecce2bebb..61556d2d6379f 100644 --- a/data/json/items/tool/metalworking.json +++ b/data/json/items/tool/metalworking.json @@ -115,6 +115,7 @@ "material": [ "steel" ], "symbol": ";", "color": "dark_gray", + "use_action": [ "HEAT_LIQUID_ITEMS" ], "qualities": [ [ "BOIL", 2 ], [ "CONTAIN", 1 ] ], "melee_damage": { "bash": 10 } }, @@ -170,6 +171,7 @@ } ], "qualities": [ [ "COOK", 1 ], [ "CHEM", 1 ], [ "BOIL", 2 ], [ "CONTAIN", 1 ] ], + "use_action": [ "HEAT_ALL_ITEMS" ], "melee_damage": { "bash": 10 } }, { @@ -196,6 +198,7 @@ } ], "qualities": [ [ "COOK", 1 ], [ "CHEM", 1 ], [ "BOIL", 2 ], [ "CONTAIN", 1 ] ], + "use_action": [ "HEAT_ALL_ITEMS" ], "melee_damage": { "bash": 10 } }, { @@ -406,7 +409,7 @@ "symbol": ";", "color": "light_gray", "qualities": [ [ "COOK", 1 ] ], - "use_action": [ "HEAT_FOOD" ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "flags": [ "BELT_CLIP", "ALLOWS_REMOTE_USE" ], "melee_damage": { "bash": 3 }, "//": "Based on https://www.amazon.com/dp/B07Q5CJDM9" @@ -432,7 +435,7 @@ "symbol": ";", "color": "light_gray", "qualities": [ [ "COOK", 1 ] ], - "use_action": [ "HEAT_FOOD" ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "flags": [ "BELT_CLIP", "ALLOWS_REMOTE_USE" ], "to_hit": { "grip": "solid", "length": "short", "surface": "any", "balance": "uneven" }, "melee_damage": { "bash": 9 }, diff --git a/data/json/items/tool/misc.json b/data/json/items/tool/misc.json index ad81ae562118c..356cc2dd67d74 100644 --- a/data/json/items/tool/misc.json +++ b/data/json/items/tool/misc.json @@ -120,6 +120,7 @@ "max_contains_weight": "4 kg" } ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "qualities": [ [ "BOIL", 2 ], [ "CONTAIN", 1 ] ] }, { @@ -161,6 +162,7 @@ "max_contains_weight": "4 kg" } ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "qualities": [ [ "BOIL", 2 ], [ "CONTAIN", 1 ] ] }, { @@ -511,6 +513,7 @@ "max_contains_weight": "4 kg" } ], + "use_action": [ "HEAT_LIQUID_ITEMS" ], "qualities": [ [ "BOIL", 2 ], [ "CONTAIN", 1 ] ] }, { diff --git a/data/json/items/tool/science.json b/data/json/items/tool/science.json index 48b08785d84b8..177afdc064eae 100644 --- a/data/json/items/tool/science.json +++ b/data/json/items/tool/science.json @@ -54,8 +54,8 @@ "flags": [ "WATER_BREAK", "ALLOWS_REMOTE_USE" ], "sub": "hotplate", "charges_per_use": 1, - "qualities": [ [ "DISTILL", 1 ], [ "CHEM", 3 ], [ "BOIL", 1 ] ], - "use_action": [ "HOTPLATE", { "type": "link_up", "cable_length": 7, "charge_rate": "1 kW" } ], + "qualities": [ [ "DISTILL", 1 ], [ "CHEM", 3 ], [ "BOIL", 1 ], [ "HOTPLATE", 2 ] ], + "use_action": [ { "type": "link_up", "cable_length": 7, "charge_rate": "1 kW" } ], "melee_damage": { "bash": 2 } }, { diff --git a/data/json/items/vehicle/plating.json b/data/json/items/vehicle/plating.json index 507552e38aaf8..7d001b6f299ef 100644 --- a/data/json/items/vehicle/plating.json +++ b/data/json/items/vehicle/plating.json @@ -16,6 +16,7 @@ "price": "60 USD", "price_postapoc": "1 USD", "qualities": [ [ "COOK", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "melee_damage": { "bash": 5 } }, { @@ -49,6 +50,7 @@ "price": "120 USD", "price_postapoc": "2 USD 50 cent", "qualities": [ [ "COOK", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "melee_damage": { "bash": 6 } }, { @@ -66,6 +68,7 @@ "price": "185 USD", "price_postapoc": "5 USD", "qualities": [ [ "COOK", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "melee_damage": { "bash": 6 } }, { @@ -82,7 +85,8 @@ "category": "veh_parts", "price": "85 USD", "price_postapoc": "5 USD", - "qualities": [ [ "COOK", 1 ] ] + "qualities": [ [ "COOK", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ] }, { "type": "GENERIC", @@ -100,6 +104,7 @@ "price": "185 USD", "price_postapoc": "2 USD 50 cent", "qualities": [ [ "COOK", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "melee_damage": { "bash": 6, "stab": 3 } }, { @@ -117,6 +122,7 @@ "price": "160 USD", "price_postapoc": "5 USD", "qualities": [ [ "COOK", 1 ], [ "ANVIL", 2 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "melee_damage": { "bash": 6 } }, { @@ -135,6 +141,7 @@ "price_postapoc": "7 USD 50 cent", "flags": [ "NO_REPAIR" ], "qualities": [ [ "COOK", 1 ] ], + "use_action": [ "HEAT_SOLID_ITEMS" ], "melee_damage": { "bash": 8 } }, { diff --git a/data/json/player_activities.json b/data/json/player_activities.json index bc53aee4d9005..f8da0e7a2b8ff 100644 --- a/data/json/player_activities.json +++ b/data/json/player_activities.json @@ -738,6 +738,14 @@ "rooted": true, "based_on": "speed" }, + { + "id": "ACT_HEAT", + "type": "activity_type", + "activity_level": "NO_EXERCISE", + "verb": "heating", + "rooted": true, + "based_on": "time" + }, { "id": "ACT_HACKSAW", "type": "activity_type", diff --git a/data/json/tool_qualities.json b/data/json/tool_qualities.json index 64be8ca87213b..f9b52e8f96848 100644 --- a/data/json/tool_qualities.json +++ b/data/json/tool_qualities.json @@ -115,6 +115,11 @@ "id": "COOK", "name": { "str": "food cooking" } }, + { + "type": "tool_quality", + "id": "HOTPLATE", + "name": { "str": "hotplate" } + }, { "type": "tool_quality", "id": "BOIL", diff --git a/src/activity_actor.cpp b/src/activity_actor.cpp index 284f1d1ac9a01..a28b78c73dfc5 100644 --- a/src/activity_actor.cpp +++ b/src/activity_actor.cpp @@ -138,6 +138,7 @@ static const activity_id ACT_HACKING( "ACT_HACKING" ); static const activity_id ACT_HACKSAW( "ACT_HACKSAW" ); static const activity_id ACT_HAIRCUT( "ACT_HAIRCUT" ); static const activity_id ACT_HARVEST( "ACT_HARVEST" ); +static const activity_id ACT_HEAT( "ACT_HEAT" ); static const activity_id ACT_HOTWIRE_CAR( "ACT_HOTWIRE_CAR" ); static const activity_id ACT_INSERT_ITEM( "ACT_INSERT_ITEM" ); static const activity_id ACT_INVOKE_ITEM( "ACT_INVOKE_ITEM" ); @@ -7602,6 +7603,107 @@ std::unique_ptr vehicle_unfolding_activity_actor::deserialize( J return actor.clone(); } +int heat_activity_actor::get_available_heater( Character &p, item_location &loc ) const +{ + int available_heater = 0; + if( !loc->has_no_links() ) { + available_heater = loc->link().t_veh->connected_battery_power_level().first; + } else if( !loc->has_flag( flag_USE_UPS ) ) { + available_heater = loc->ammo_remaining(); + } else if( loc->has_flag( flag_USE_UPS ) ) { + available_heater = units::to_kilojoule( p.available_ups() ); + } + return available_heater; +} + +void heat_activity_actor::start( player_activity &act, Character & ) +{ + act.moves_total = requirements.time; + act.moves_left = requirements.time; +} + +void heat_activity_actor::do_turn( player_activity &act, Character &p ) +{ + if( !h.loc ) { + p.add_msg_if_player( _( "You can't find the heater any more." ) ); + act.set_to_null(); + } + for( drop_location &ait : to_heat ) { + if( !ait.first ) { + p.add_msg_if_player( _( "Some of the food you selected is gone." ) ); + act.set_to_null(); + } + } + if( get_available_heater( p, h.loc ) < requirements.ammo * h.heating_effect ) { + p.add_msg_if_player( _( "You need more energy to heat these items." ) ); + act.set_to_null(); + } +} + +void heat_activity_actor::finish( player_activity &act, Character &p ) +{ + for( drop_location &ait : to_heat ) { + item_location cold_item = ait.first; + if( cold_item->count_by_charges() ) { + item copy( *cold_item ); + copy.charges = ait.second; + copy.unset_flag( flag_FROZEN ); + copy.set_flag( flag_HOT ); + cold_item->charges -= ait.second; + if( cold_item->charges <= 0 ) { + cold_item.remove_item(); + } + if( copy.made_of( phase_id::LIQUID ) ) { + liquid_handler::handle_all_liquid( copy, PICKUP_RANGE ); + } else { + p.i_add_or_drop( copy ); + } + } else { + cold_item->unset_flag( flag_FROZEN ); + cold_item->set_flag( flag_HOT ); + if( cold_item.get_item()->made_of( phase_id::LIQUID ) ) { + liquid_handler::handle_all_liquid( *cold_item, PICKUP_RANGE ); + } else { + p.i_add_or_drop( *cold_item ); + cold_item.remove_item(); + } + } + } + if( h.consume_flag == true ) { + h.loc->activation_consume( requirements.ammo, h.loc.position(), &p ); + } + p.add_msg_if_player( m_good, _( "You heated your items." ) ); + + p.invalidate_crafting_inventory(); + + act.set_to_null(); +} + +void heat_activity_actor::serialize( JsonOut &jsout ) const +{ + jsout.start_object(); + jsout.member( "to_heat", to_heat ); + jsout.member( "heating_effect", h.heating_effect ); + jsout.member( "loc", h.loc ); + jsout.member( "consume_flag", h.consume_flag ); + jsout.member( "time", requirements.time ); + jsout.member( "ammo", requirements.ammo ); + jsout.end_object(); +} + +std::unique_ptr heat_activity_actor::deserialize( JsonValue &jsin ) +{ + heat_activity_actor actor; + JsonObject data = jsin.get_object(); + data.read( "to_heat", actor.to_heat ); + data.read( "heating_effect", actor.h.heating_effect ); + data.read( "loc", actor.h.loc ); + data.read( "consume_flag", actor.h.consume_flag ); + data.read( "time", actor.requirements.time ); + data.read( "ammo", actor.requirements.ammo ); + return actor.clone(); +} + void wash_activity_actor::start( player_activity &act, Character & ) { act.moves_total = requirements.time; @@ -7722,6 +7824,7 @@ deserialize_functions = { { ACT_HACKSAW, &hacksaw_activity_actor::deserialize }, { ACT_HAIRCUT, &haircut_activity_actor::deserialize }, { ACT_HARVEST, &harvest_activity_actor::deserialize}, + { ACT_HEAT, &heat_activity_actor::deserialize }, { ACT_HOTWIRE_CAR, &hotwire_car_activity_actor::deserialize }, { ACT_INSERT_ITEM, &insert_item_activity_actor::deserialize }, { ACT_INVOKE_ITEM, &invoke_item_activity_actor::deserialize }, diff --git a/src/activity_actor_definitions.h b/src/activity_actor_definitions.h index b0b4dcf0b7fcb..ef9fb1d6204a5 100644 --- a/src/activity_actor_definitions.h +++ b/src/activity_actor_definitions.h @@ -1700,6 +1700,38 @@ class wash_activity_actor : public activity_actor washing_requirements requirements; }; +class heat_activity_actor : public activity_actor +{ + private: + heat_activity_actor() = default; + int get_available_heater( Character &p, item_location &loc ) const; + public: + heat_activity_actor( drop_locations to_heat, + heating_requirements &requirements, + heater h ) : + to_heat( std::move( to_heat ) ), requirements( requirements ), h( std::move( h ) ) {}; + + activity_id get_type() const override { + return activity_id( "ACT_HEAT" ); + } + + void start( player_activity &act, Character & ) override; + void do_turn( player_activity &act, Character &p ) override; + void finish( player_activity &act, Character &p ) override; + + std::unique_ptr clone() const override { + return std::make_unique( *this ); + } + + void serialize( JsonOut &jsout ) const override; + static std::unique_ptr deserialize( JsonValue &jsin ); + + private: + drop_locations to_heat; + heating_requirements requirements; + heater h; +}; + class wear_activity_actor : public activity_actor { public: diff --git a/src/item.cpp b/src/item.cpp index 9ca11aac170b5..35a7871775f0d 100644 --- a/src/item.cpp +++ b/src/item.cpp @@ -9706,6 +9706,11 @@ bool item::all_pockets_rigid() const return contents.all_pockets_rigid(); } +bool item::container_type_pockets_empty() const +{ + return contents.container_type_pockets_empty(); +} + std::vector item::get_all_contained_pockets() const { return contents.get_all_contained_pockets(); diff --git a/src/item.h b/src/item.h index 1f8d9d23280c0..d32c15fa10b03 100644 --- a/src/item.h +++ b/src/item.h @@ -836,6 +836,8 @@ class item : public visitable /** True if every pocket is rigid or we have no pockets */ bool all_pockets_rigid() const; + bool container_type_pockets_empty() const; + // gets all pockets contained in this item std::vector get_all_contained_pockets() const; std::vector get_all_contained_pockets(); diff --git a/src/item_contents.cpp b/src/item_contents.cpp index 54131ab238b57..4bffa558cca33 100644 --- a/src/item_contents.cpp +++ b/src/item_contents.cpp @@ -2566,6 +2566,19 @@ bool item_contents::all_pockets_rigid() const return true; } +bool item_contents::container_type_pockets_empty() const +{ + for( const item_pocket &pocket : contents ) { + if( !pocket.is_type( pocket_type::CONTAINER ) ) { + continue; + } + if( !pocket.empty() ) { + return false; + } + } + return true; +} + units::volume item_contents::item_size_modifier() const { units::volume total_vol = 0_ml; diff --git a/src/item_contents.h b/src/item_contents.h index 99fabf3da362a..6406dc57c4a32 100644 --- a/src/item_contents.h +++ b/src/item_contents.h @@ -247,6 +247,8 @@ class item_contents /** True if every pocket is rigid or we have no pockets */ bool all_pockets_rigid() const; + bool container_type_pockets_empty() const; + /** returns the best quality of the id that's contained in the item in CONTAINER pockets */ int best_quality( const quality_id &id ) const; diff --git a/src/item_factory.cpp b/src/item_factory.cpp index b94d34d5c2abb..9a596de29c60b 100644 --- a/src/item_factory.cpp +++ b/src/item_factory.cpp @@ -1879,6 +1879,9 @@ void Item_factory::init() add_iuse( "WASH_SOFT_ITEMS", &iuse::wash_soft_items ); add_iuse( "WASH_HARD_ITEMS", &iuse::wash_hard_items ); add_iuse( "WASH_ALL_ITEMS", &iuse::wash_all_items ); + add_iuse( "HEAT_LIQUID_ITEMS", &iuse::heat_liquid_items ); + add_iuse( "HEAT_SOLID_ITEMS", &iuse::heat_solid_items ); + add_iuse( "HEAT_ALL_ITEMS", &iuse::heat_all_items ); add_iuse( "WATER_PURIFIER", &iuse::water_purifier ); add_iuse( "WEAK_ANTIBIOTIC", &iuse::weak_antibiotic ); add_iuse( "WEATHER_TOOL", &iuse::weather_tool ); diff --git a/src/iuse.cpp b/src/iuse.cpp index 7cbbc591731b4..48e6b4c3f14b8 100644 --- a/src/iuse.cpp +++ b/src/iuse.cpp @@ -318,6 +318,7 @@ static const proficiency_id proficiency_prof_lockpicking_expert( "prof_lockpicki static const quality_id qual_AXE( "AXE" ); static const quality_id qual_GLARE( "GLARE" ); +static const quality_id qual_HOTPLATE( "HOTPLATE" ); static const quality_id qual_LOCKPICK( "LOCKPICK" ); static const quality_id qual_PRY( "PRY" ); static const quality_id qual_SCREW_FINE( "SCREW_FINE" ); @@ -4886,6 +4887,7 @@ static bool heat_item( Character &p ) } p.add_msg_if_player( m_info, _( "You start heating up the food." ) ); p.assign_activity( ACT_HEATING, duration ); + p.i_add_or_drop( *heat ); p.activity.targets.emplace_back( p, heat ); return true; } @@ -8083,6 +8085,253 @@ std::optional iuse::capture_monster_act( Character *p, item *it, const trip return 0; } +heating_requirements heating_requirements_for_weight( const units::mass &frozen, + const units::mass &nfrozen, const units::volume &used_volume ) +{ + // Accroding to the charge_per_use in game, microwave takes 25kJ per use, almost equal to 1000w microwave runs 2.5 minutes + // 1*2.5*60 = 150kJ, 6*25 = 150kJ, Ithat means every use of microwave takes about 25 seconds. + // The thermal efficiency of microwave is about 80%, 25*8.% = 20kJ, means every use of microwave, 20kJ energy is given to the food. + // We will use water heat capacity, 4.2kJ/(kg*K), it means 20Kj can increase 120g water 40K. + // So microwave can at least heat up 120 gram food in 25 second and cost 25kJ energy + units::volume volume = used_volume; + // Retain one decimal place when dividing + int ammo = divide_round_up( int ( 3 * divide_round_up( frozen, 12_gram ) + divide_round_up( nfrozen, + 12_gram ) ), 10 ); + int time = to_moves( 25_seconds * ammo ); + return {volume, ammo, time}; +} + +heater find_heater( Character *p, item *it ) +{ + bool consume_flag = true; + int available_heater = 1; + int heating_effect = 0; + item_location loc = item_location( *p, it ); + if( get_map().has_nearby_fire( p->pos() ) && !it->has_quality( qual_HOTPLATE ) ) { + p->add_msg_if_player( m_info, _( "You put %1$s on fire to start heating." ), it->tname() ); + return {loc, false, 1, 0}; + } else if( it->has_quality( qual_HOTPLATE ) ) { + if( it->ammo_remaining() >= it->type->charges_to_use() ) { + p->add_msg_if_player( m_info, _( "You use %1$s to start heating." ), loc->tname() ); + } else if( !it->has_no_links() ) { + p->add_msg_if_player( m_info, _( "You use %1$s to start heating." ), loc->tname() ); + } else if( it->has_flag( flag_USE_UPS ) && + units::to_kilojoule( p->available_ups() ) >= it->type->charges_to_use() ) { + p->add_msg_if_player( m_info, _( "You use %1$s to start heating." ), loc->tname() ); + } else { + p->add_msg_if_player( m_info, _( "The %s has been used up." ), it->tname() ); + return {loc, true, -1, 0}; + } + } else if( !it->has_quality( qual_HOTPLATE ) ) { + auto filter = [p]( const item & e ) { + if( e.has_quality( qual_HOTPLATE, 2 ) && e.ammo_remaining() >= e.type->charges_to_use() ) { + return true; + } + if( e.has_quality( qual_HOTPLATE, 2 ) && ( !e.has_no_links() ) ) { + if( e.link().t_veh->connected_battery_power_level().first >= e.type->charges_to_use() ) { + return true; + } + } + if( e.has_quality( qual_HOTPLATE, 2 ) && e.has_flag( flag_USE_UPS ) ) { + if( units::to_kilojoule( p->available_ups() ) >= e.type->charges_to_use() ) { + return true; + } + } + return false; + }; + loc = g->inv_map_splice( filter, _( "Select a tool to heat:" ), 1, + _( "You don't have proper heating source." ) ); + if( !loc ) { + return {loc, true, -1, 0}; + } + p->add_msg_if_player( m_info, _( "You put %1$s on %2$s to start heating." ), it->tname(), + loc->tname() ); + } + heating_effect = loc->type->charges_to_use(); + if( !loc->has_no_links() ) { + available_heater = loc->link().t_veh->connected_battery_power_level().first; + } else if( !loc->has_flag( flag_USE_UPS ) ) { + available_heater = loc->ammo_remaining(); + } else if( loc->has_flag( flag_USE_UPS ) ) { + available_heater = units::to_kilojoule( p->available_ups() ); + } + return {loc, consume_flag, available_heater, heating_effect}; +} + +static bool heat_items( Character *p, item *it, bool liquid_items, bool solid_items ) +{ + p->inv->restack( *p ); + heater h = find_heater( p, it ); + if( h.available_heater == -1 ) { + add_msg( m_info, _( "Never mind." ) ); + return false; + } + //Hotplate can only use it self as heat source + bool multiple = it->has_pocket_type( pocket_type::CONTAINER ); + drop_locations to_heat; + units::volume used_volume = 0_ml; + units::volume available_volume = 0_ml; + units::mass frozen_weight = 0_gram; + units::mass not_frozen_weight = 0_gram; + if( multiple == false ) { + item_location loc = g->inv_map_splice( []( const item_location & itm ) { + return itm->has_temperature() && !itm->has_own_flag( flag_HOT ) && + ( !itm->made_of_from_type( phase_id::LIQUID ) || + itm.where() == item_location::type::container || + get_map().has_flag_furn( ter_furn_flag::TFLAG_LIQUIDCONT, itm.position() ) ); + }, _( "Heat up what?" ), 1, _( "You don't have any appropriate food to heat up." ) ); + to_heat = {{loc, 1}}; + if( to_heat.empty() ) { + return false; + } + } else if( multiple == true ) { + available_volume = it->max_containable_volume(); + const inventory_filter_preset preset( [liquid_items, + solid_items]( const item_location & location ) { + return location->has_temperature() && !location->has_own_flag( flag_HOT ) && + ( ( liquid_items && location->made_of_from_type( phase_id::LIQUID ) && location.has_parent() ) || + ( solid_items && !location->made_of_from_type( phase_id::LIQUID ) ) ); + } ); + auto make_raw_stats = [available_volume, + h]( const std::vector> &locs + ) { + units::volume used_volume = 0_ml; + units::mass frozen_weight = 0_gram; + units::mass not_frozen_weight = 0_gram; + for( const auto &pair : locs ) { + used_volume += pair.first->volume( false, true, pair.second ); + if( pair.first->has_own_flag( flag_FROZEN ) && !pair.first->has_own_flag( flag_EATEN_COLD ) ) { + frozen_weight += pair.first->weight( false, false ) * pair.second ; + } else { + not_frozen_weight += pair.first->weight( false, false ) * pair.second; + } + } + heating_requirements required = heating_requirements_for_weight( frozen_weight, not_frozen_weight, + used_volume ); + const std::string time = colorize( to_string( time_duration::from_moves( required.time ), true ), + c_light_gray ); + auto to_string = []( int val ) -> std::string { + if( val == INT_MAX ) + { + return pgettext( "short for infinity", "inf" ); + } + return string_format( "%3d", val ); + }; + const std::string volume = string_join( display_stat( "", used_volume.value(), + available_volume.value(), + to_string ), "" ); + const std::string ammo = string_join( display_stat( "", required.ammo * h.heating_effect, + h.available_heater, + to_string ), "" ); + using stats = inventory_selector::stats; + return stats{{ + {{ _( "Container" ), volume }}, + {{ _( "Fuel" ), ammo }}, + {{ _( "Estimated time" ), time }} + }}; + }; + inventory_multiselector inv_s( *p, preset, _( "ITEMS TO HEAT" ), + make_raw_stats, /*allow_select_contained=*/true ); + inv_s.add_character_items( *p ); + inv_s.add_nearby_items( PICKUP_RANGE ); + inv_s.set_title( _( "Heat menu" ) ); + inv_s.set_hint( _( "To heat x items, type a number before selecting." ) ); + if( inv_s.empty() ) { + popup( std::string( _( "You have nothing to heat." ) ), PF_GET_KEY ); + return false; + } + to_heat = inv_s.execute(); + if( to_heat.empty() ) { + return false; + } + } + for( const auto &pair : to_heat ) { + used_volume += pair.first->volume( false, true, pair.second ); + if( pair.first->has_own_flag( flag_FROZEN ) && !pair.first->has_own_flag( flag_EATEN_COLD ) ) { + frozen_weight += pair.first->weight( false, false ) * pair.second ; + } else { + not_frozen_weight += pair.first->weight( false, false ) * pair.second; + } + } + heating_requirements required = heating_requirements_for_weight( frozen_weight, not_frozen_weight, + used_volume ); + if( multiple ? used_volume > available_volume : false ) { + p->add_msg_if_player( _( "You need more space to contain these items." ) ); + return false; + } else if( h.available_heater < required.ammo * h.heating_effect ) { + p->add_msg_if_player( _( "You need more energy to heat these items." ) ); + return false; + } + const std::vector helpers = p->get_crafting_helpers(); + const std::size_t helpersize = p->get_num_crafting_helpers( 3 ); + required.time *= ( 1.0f - ( helpersize / 10.0f ) ); + for( std::size_t i = 0; i < helpersize; i++ ) { + add_msg( m_info, _( "%s helps with this taskā€¦" ), helpers[i]->get_name() ); + } + p->assign_activity( heat_activity_actor( to_heat, required, h ) ); + return true; +} + +std::optional iuse::heat_solid_items( Character *p, item *it, const tripoint & ) +{ + if( p->fine_detail_vision_mod() > 4 ) { + p->add_msg_if_player( _( "You can't see to do that!" ) ); + return std::nullopt; + } + if( p->cant_do_mounted() ) { + return std::nullopt; + } + if( !it->container_type_pockets_empty() ) { + p->add_msg_if_player( _( "You need an empty container to heat items." ) ); + return std::nullopt; + } + //If *it don't have container,such like COOK level 1 tools(tongs,spear), you can only heat one solid item a time(and can't be liquid), but no volume limit on each batch. + if( heat_items( p, it, true, true ) ) { + return 0; + } + return std::nullopt; +} + +std::optional iuse::heat_liquid_items( Character *p, item *it, const tripoint & ) +{ + if( p->fine_detail_vision_mod() > 4 ) { + p->add_msg_if_player( _( "You can't see to do that!" ) ); + return std::nullopt; + } + if( p->cant_do_mounted() ) { + return std::nullopt; + } + if( !it->container_type_pockets_empty() ) { + p->add_msg_if_player( _( "You need an empty container to heat items." ) ); + return std::nullopt; + } + //If *it don't have container,such like COOK level 1 tools(tongs,spear), you can only heat one solid item a time(and can't be liquid), but no volume limit on each batch. + if( heat_items( p, it, true, true ) ) { + return 0; + } + return std::nullopt; +} + +std::optional iuse::heat_all_items( Character *p, item *it, const tripoint & ) +{ + if( p->fine_detail_vision_mod() > 4 ) { + p->add_msg_if_player( _( "You can't see to do that!" ) ); + return std::nullopt; + } + if( p->cant_do_mounted() ) { + return std::nullopt; + } + if( !it->container_type_pockets_empty() ) { + p->add_msg_if_player( _( "You need an empty container to heat items." ) ); + return std::nullopt; + } + //If *it don't have container,such like COOK level 1 tools(tongs,spear), you can only heat one solid item a time(and can't be liquid), but no volume limit on each batch. + if( heat_items( p, it, true, true ) ) { + return 0; + } + return std::nullopt; +} + washing_requirements washing_requirements_for_volume( const units::volume &vol ) { int water = divide_round_up( vol, 125_ml ); diff --git a/src/iuse.h b/src/iuse.h index afe23b0b60411..8dfe49d962716 100644 --- a/src/iuse.h +++ b/src/iuse.h @@ -80,6 +80,9 @@ std::optional call_of_tindalos( Character *, item *, const tripoint & ); std::optional camera( Character *, item *, const tripoint & ); std::optional can_goo( Character *, item *, const tripoint & ); std::optional capture_monster_act( Character *, item *, const tripoint & ); +std::optional heat_solid_items( Character *p, item *it, const tripoint & ); +std::optional heat_liquid_items( Character *p, item *it, const tripoint & ); +std::optional heat_all_items( Character *p, item *it, const tripoint & ); std::optional capture_monster_veh( Character *, item *, const tripoint & ); std::optional change_eyes( Character *, item *, const tripoint & ); std::optional change_skin( Character *, item *, const tripoint & ); @@ -246,6 +249,21 @@ struct washing_requirements { }; washing_requirements washing_requirements_for_volume( const units::volume & ); +struct heating_requirements { + units::volume volume; + int ammo; + int time; +}; +struct heater { + item_location loc; + bool consume_flag; + int available_heater; + int heating_effect; +}; +heater find_heater( Character *, item * ); +heating_requirements heating_requirements_for_weight( const units::mass &, + const units::mass &, const units::volume & ); + using use_function_pointer = std::optional ( * )( Character *, item *, const tripoint & ); From a161974459cabdc3115c4d7acaebe3c3d5f03dfa Mon Sep 17 00:00:00 2001 From: John Candlebury Date: Thu, 9 May 2024 08:49:23 -0600 Subject: [PATCH 103/104] Aftershock: Audit mod gun sizes (#73357) * Audit main gun sizes * Update data/mods/Aftershock/items/gun/laser.json * Update data/mods/Aftershock/items/gun/laser.json --------- Co-authored-by: Maleclypse <54345792+Maleclypse@users.noreply.github.com> --- data/mods/Aftershock/items/gun/laser.json | 3 ++- data/mods/Aftershock/items/gun/plasma.json | 4 ++-- data/mods/Aftershock/items/tools.json | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/data/mods/Aftershock/items/gun/laser.json b/data/mods/Aftershock/items/gun/laser.json index 1aec31fea0a48..ed0399ad789d7 100644 --- a/data/mods/Aftershock/items/gun/laser.json +++ b/data/mods/Aftershock/items/gun/laser.json @@ -227,7 +227,8 @@ "overheat_threshold": 100, "cooling_value": 1, "heat_per_shot": 20, - "volume": "3 L", + "volume": "8 L", + "longest_side": "1065 mm", "range": 37, "modes": [ [ "DEFAULT", "pulse", 1 ], [ "BURST", "2s sequence", 2 ], [ "AUTO", "3s sequence", 3 ] ], "extend": { "ammo_effects": [ "TACTICAL_LASER_EXPLOSION" ] }, diff --git a/data/mods/Aftershock/items/gun/plasma.json b/data/mods/Aftershock/items/gun/plasma.json index c233f5236258b..eec17fb7b57d5 100644 --- a/data/mods/Aftershock/items/gun/plasma.json +++ b/data/mods/Aftershock/items/gun/plasma.json @@ -35,7 +35,7 @@ "description": "A heavy plasma railgun that easily defeats most forms of conventional armor and flash-incinerates anything behind it. Its large size and liability to overheat make it unsuitable for infantry use, but it is a common sight on military vehicles and in the hands of power-armored troops, especially when heavy armor is expected.", "weight": "8500 g", "volume": "4 L", - "longest_side": "45 cm", + "longest_side": "100 cm", "price": "15 kUSD", "price_postapoc": "15 kUSD", "range": 15, @@ -72,7 +72,7 @@ "description": "A short and stubby 2 gram plasma railgun occasionally used by espatiers as a hull breaching tool. Like larger plasma weapons, it propels toroids of plasma that detonate on contact, but its reduced size heavily hampers its range and damage output. Fired within an atmosphere, its very low range makes it dangerous to shooter and target alike.", "weight": "2500 g", "volume": "1 L", - "longest_side": "45 cm", + "longest_side": "30 cm", "price": "350 USD", "price_postapoc": "350 USD", "range": 5, diff --git a/data/mods/Aftershock/items/tools.json b/data/mods/Aftershock/items/tools.json index 6cfc8fe08813f..6d7bce02dd092 100644 --- a/data/mods/Aftershock/items/tools.json +++ b/data/mods/Aftershock/items/tools.json @@ -586,7 +586,7 @@ "pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "battery": 5000 } } ], "relic_data": { "charge_info": { "recharge_type": "periodic", "time": "1 h", "regenerate_ammo": true } }, "material": [ "superalloy" ], - "flags": [ "DURABLE_MELEE" ], + "flags": [ "DURABLE_MELEE", "HEAVY_TOOL" ], "melee_damage": { "bash": 5 } }, { From c08fba4e9e178477829309bed219f0e0876b055e Mon Sep 17 00:00:00 2001 From: inogenous <123803852+inogenous@users.noreply.github.com> Date: Thu, 9 May 2024 19:50:47 +0200 Subject: [PATCH 104/104] Resume butchering Allows resuming previously started butchering activities. This is done by storing a var on the corpse item with the progress. For example, aborting a dissection after 90% has been completed will store var `DISSECT_progress`=`0.9` on the corpse. Displays percent of previous progress in the butchery ui, if it has already started earlier. --- src/activity_handlers.cpp | 78 +++++++++++++++++++++++++++++---------- src/activity_handlers.h | 2 + src/game.cpp | 41 ++++++++++++++++---- 3 files changed, 94 insertions(+), 27 deletions(-) diff --git a/src/activity_handlers.cpp b/src/activity_handlers.cpp index 9fe12c8d4e261..4c5b06755b155 100644 --- a/src/activity_handlers.cpp +++ b/src/activity_handlers.cpp @@ -299,6 +299,14 @@ activity_handlers::do_turn_functions = { { ACT_MULTIPLE_CRAFT, multiple_craft_do_turn }, { ACT_MULTIPLE_DIS, multiple_dis_do_turn }, { ACT_MULTIPLE_READ, multiple_read_do_turn }, + { ACT_BLEED, butcher_do_turn }, + { ACT_BUTCHER, butcher_do_turn }, + { ACT_BUTCHER_FULL, butcher_do_turn }, + { ACT_FIELD_DRESS, butcher_do_turn }, + { ACT_SKIN, butcher_do_turn }, + { ACT_QUARTER, butcher_do_turn }, + { ACT_DISMEMBER, butcher_do_turn }, + { ACT_DISSECT, butcher_do_turn }, }; const std::map< activity_id, std::function > @@ -426,6 +434,53 @@ static bool butcher_dissect_item( item &what, const tripoint &pos, return success; } +static std::string butcher_progress_var( const butcher_type action ) +{ + return io::enum_to_string( action ) + "_progress"; +} + +// How much of `butcher_type` has already been completed, in range [0..1], 0=not started yet, 1=completed. +// used for resuming previously started butchery +double butcher_get_progress( const item &corpse_item, const butcher_type action ) +{ + return corpse_item.get_var( butcher_progress_var( action ), 0.0 ); +} + +static butcher_type get_butcher_type( player_activity *act ) +{ + butcher_type action = butcher_type::QUICK; + if( act->id() == ACT_BUTCHER ) { + action = butcher_type::QUICK; + } else if( act->id() == ACT_BUTCHER_FULL ) { + action = butcher_type::FULL; + } else if( act->id() == ACT_FIELD_DRESS ) { + action = butcher_type::FIELD_DRESS; + } else if( act->id() == ACT_QUARTER ) { + action = butcher_type::QUARTER; + } else if( act->id() == ACT_DISSECT ) { + action = butcher_type::DISSECT; + } else if( act->id() == ACT_BLEED ) { + action = butcher_type::BLEED; + } else if( act->id() == ACT_SKIN ) { + action = butcher_type::SKIN; + } else if( act->id() == ACT_DISMEMBER ) { + action = butcher_type::DISMEMBER; + } + return action; +} + +void activity_handlers::butcher_do_turn( player_activity *act, Character * ) +{ + if( act->targets.empty() || act->moves_total <= 0 || act->moves_left <= 0 ) { + return; + } + const butcher_type action = get_butcher_type( act ); + const double progress = static_cast( act->moves_total - act->moves_left ) / + act->moves_total; + item &corpse_item = *act->targets.back(); + corpse_item.set_var( butcher_progress_var( action ), progress ); +} + static void set_up_butchery( player_activity &act, Character &you, butcher_type action ) { const int factor = you.max_quality( action == butcher_type::DISSECT ? qual_CUT_FINE : qual_BUTCHER, @@ -666,7 +721,9 @@ static void set_up_butchery( player_activity &act, Character &you, butcher_type } } } - act.moves_left = butcher_time_to_cut( you, corpse_item, action ) * butchery_requirements.first; + const double progress = butcher_get_progress( corpse_item, action ); + act.moves_total = butcher_time_to_cut( you, corpse_item, action ) * butchery_requirements.first; + act.moves_left = act.moves_total - static_cast( act.moves_total * progress ); // We have a valid target, so preform the full finish function // instead of just selecting the next valid target @@ -1256,24 +1313,7 @@ void activity_handlers::butcher_finish( player_activity *act, Character *you ) return; } - butcher_type action = butcher_type::QUICK; - if( act->id() == ACT_BUTCHER ) { - action = butcher_type::QUICK; - } else if( act->id() == ACT_BUTCHER_FULL ) { - action = butcher_type::FULL; - } else if( act->id() == ACT_FIELD_DRESS ) { - action = butcher_type::FIELD_DRESS; - } else if( act->id() == ACT_QUARTER ) { - action = butcher_type::QUARTER; - } else if( act->id() == ACT_DISSECT ) { - action = butcher_type::DISSECT; - } else if( act->id() == ACT_BLEED ) { - action = butcher_type::BLEED; - } else if( act->id() == ACT_SKIN ) { - action = butcher_type::SKIN; - } else if( act->id() == ACT_DISMEMBER ) { - action = butcher_type::DISMEMBER; - } + const butcher_type action = get_butcher_type( act ); // index is a bool that determines if we are ready to start the next target if( act->index ) { diff --git a/src/activity_handlers.h b/src/activity_handlers.h index d5c6a527611e8..3ffa13075c495 100644 --- a/src/activity_handlers.h +++ b/src/activity_handlers.h @@ -166,6 +166,7 @@ bool generic_multi_activity_handler( player_activity &act, Character &you, void activity_on_turn_fetch( player_activity &, Character *you ); int get_auto_consume_moves( Character &you, bool food ); bool try_fuel_fire( player_activity &act, Character &you, bool starting_fire = false ); +double butcher_get_progress( const item &corpse_item, const butcher_type action ); enum class item_drop_reason : int { deliberate, @@ -195,6 +196,7 @@ void adv_inventory_do_turn( player_activity *act, Character *you ); void armor_layers_do_turn( player_activity *act, Character *you ); void atm_do_turn( player_activity *act, Character *you ); void build_do_turn( player_activity *act, Character *you ); +void butcher_do_turn( player_activity *act, Character *you ); void dismember_do_turn( player_activity *act, Character *you ); void chop_trees_do_turn( player_activity *act, Character *you ); void consume_drink_menu_do_turn( player_activity *act, Character *you ); diff --git a/src/game.cpp b/src/game.cpp index bb3df4cf0e55a..f5394ca814163 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -9467,6 +9467,23 @@ static void butcher_submenu( const std::vector &corpses, in } return to_string_clipped( time_duration::from_moves( time_to_cut ) ); }; + auto progress_str = [&]( butcher_type bt ) { + std::string result = ""; + if( index != -1 ) { + const double progress = butcher_get_progress( *corpses[index], bt ); + if( progress > 0 ) { + result = string_format( _( "%d%% complete" ), static_cast( 100 * progress ) ); + } + } else { + for( const map_stack::iterator &it : corpses ) { + const double progress = butcher_get_progress( *it, bt ); + if( progress > 0 ) { + result = _( "partially complete" ); + } + } + } + return ( result == "" ) ? "" : ( " " + colorize( result, c_dark_gray ) ); + }; const bool enough_light = player_character.fine_detail_vision_mod() <= 4; const int factor = player_character.max_quality( qual_BUTCHER, PICKUP_RANGE ); @@ -9529,7 +9546,8 @@ static void butcher_submenu( const std::vector &corpses, in const std::string cannot_see = colorize( _( "can't see!" ), c_red ); smenu.addentry_col( static_cast( butcher_type::QUICK ), enough_light, - 'B', _( "Quick butchery" ), + 'B', _( "Quick butchery" ) + + progress_str( butcher_type::QUICK ), enough_light ? cut_time( butcher_type::QUICK ) : cannot_see, string_format( "%s %s", _( "This technique is used when you are in a hurry, " @@ -9539,7 +9557,8 @@ static void butcher_submenu( const std::vector &corpses, in "Prevents zombies from raising." ), msgFactor ) ); smenu.addentry_col( static_cast( butcher_type::FULL ), enough_light, - 'b', _( "Full butchery" ), + 'b', _( "Full butchery" ) + + progress_str( butcher_type::FULL ), enough_light ? cut_time( butcher_type::FULL ) : cannot_see, string_format( "%s %s", _( "This technique is used to properly butcher a corpse, " @@ -9549,7 +9568,8 @@ static void butcher_submenu( const std::vector &corpses, in "but it is time consuming." ), msgFactor ) ); smenu.addentry_col( static_cast( butcher_type::FIELD_DRESS ), enough_light && has_organs, - 'f', _( "Field dress corpse" ), + 'f', _( "Field dress corpse" ) + + progress_str( butcher_type::FIELD_DRESS ), enough_light ? ( has_organs ? cut_time( butcher_type::FIELD_DRESS ) : colorize( _( "has no organs" ), c_red ) ) : cannot_see, string_format( "%s %s", @@ -9560,7 +9580,8 @@ static void butcher_submenu( const std::vector &corpses, in "better effects." ), msgFactor ) ); smenu.addentry_col( static_cast( butcher_type::SKIN ), enough_light && has_skin, - 's', _( "Skin corpse" ), + 's', _( "Skin corpse" ) + + progress_str( butcher_type::SKIN ), enough_light ? ( has_skin ? cut_time( butcher_type::SKIN ) : colorize( _( "has no skin" ), c_red ) ) : cannot_see, string_format( "%s %s", @@ -9571,7 +9592,8 @@ static void butcher_submenu( const std::vector &corpses, in "scraps that can be used in other ways." ), msgFactor ) ); smenu.addentry_col( static_cast( butcher_type::BLEED ), enough_light && has_blood, - 'l', _( "Bleed corpse" ), + 'l', _( "Bleed corpse" ) + + progress_str( butcher_type::BLEED ), enough_light ? ( has_blood ? cut_time( butcher_type::BLEED ) : colorize( _( "has no blood" ), c_red ) ) : cannot_see, string_format( "%s %s", @@ -9581,7 +9603,8 @@ static void butcher_submenu( const std::vector &corpses, in "to do a good job." ), msgFactor ) ); smenu.addentry_col( static_cast( butcher_type::QUARTER ), enough_light, - 'k', _( "Quarter corpse" ), + 'k', _( "Quarter corpse" ) + + progress_str( butcher_type::QUARTER ), enough_light ? cut_time( butcher_type::QUARTER ) : cannot_see, string_format( "%s %s", _( "By quartering a previously field dressed corpse you will " @@ -9591,7 +9614,8 @@ static void butcher_submenu( const std::vector &corpses, in "harvest them later." ), msgFactor ) ); smenu.addentry_col( static_cast( butcher_type::DISMEMBER ), true, - 'm', _( "Dismember corpse" ), + 'm', _( "Dismember corpse" ) + + progress_str( butcher_type::DISMEMBER ), cut_time( butcher_type::DISMEMBER ), string_format( "%s %s", _( "If you're aiming to just destroy a body outright and don't " @@ -9599,7 +9623,8 @@ static void butcher_submenu( const std::vector &corpses, in "in a very short amount of time but yields little to no usable flesh." ), msgFactor ) ); smenu.addentry_col( static_cast( butcher_type::DISSECT ), enough_light, - 'd', _( "Dissect corpse" ), + 'd', _( "Dissect corpse" ) + + progress_str( butcher_type::DISSECT ), enough_light ? cut_time( butcher_type::DISSECT ) : cannot_see, string_format( "%s %s%s", _( "By careful dissection of the corpse, you will examine it for "