From 0a38567e8d3c7365fc29c01153cdc7b37ae349b4 Mon Sep 17 00:00:00 2001 From: Sam Date: Sat, 7 Aug 2021 16:11:27 -0400 Subject: [PATCH] Modular weapons can now be properly displayed in the inventory. --- .../items/crafting_ing/cloth/lifecloth.ron | 2 +- .../common/items/crafting_ing/cloth/linen.ron | 2 +- .../items/crafting_ing/cloth/moonweave.ron | 2 +- .../common/items/crafting_ing/cloth/silk.ron | 2 +- .../items/crafting_ing/cloth/sunsilk.ron | 2 +- .../common/items/crafting_ing/cloth/wool.ron | 2 +- .../items/crafting_ing/hide/carapace.ron | 2 +- .../items/crafting_ing/hide/dragon_scale.ron | 2 +- .../common/items/crafting_ing/hide/plate.ron | 2 +- .../common/items/crafting_ing/hide/scales.ron | 2 +- .../crafting_ing/leather/simple_leather.ron | 2 +- .../crafting_ing/leather/thick_leather.ron | 2 +- assets/common/items/log/bamboo.ron | 2 +- assets/common/items/log/eldwood.ron | 2 +- assets/common/items/log/frostwood.ron | 2 +- assets/common/items/log/hardwood.ron | 2 +- assets/common/items/log/ironwood.ron | 2 +- assets/common/items/log/wood.ron | 2 +- .../common/items/mineral/ingot/bloodsteel.ron | 2 +- assets/common/items/mineral/ingot/bronze.ron | 2 +- assets/common/items/mineral/ingot/cobalt.ron | 2 +- assets/common/items/mineral/ingot/iron.ron | 2 +- .../common/items/mineral/ingot/orichalcum.ron | 2 +- assets/common/items/mineral/ingot/steel.ron | 2 +- assets/voxygen/item_image_manifest.ron | 4 ++ common/src/comp/inventory/item/item_key.rs | 11 +++++- common/src/comp/inventory/item/mod.rs | 18 ++------- common/src/comp/inventory/item/modular.rs | 39 ++++++++++++++++++- common/src/lottery.rs | 6 ++- voxygen/src/hud/crafting.rs | 14 +++---- voxygen/src/hud/skillbar.rs | 5 ++- voxygen/src/ui/widgets/item_tooltip.rs | 6 +-- 32 files changed, 96 insertions(+), 55 deletions(-) diff --git a/assets/common/items/crafting_ing/cloth/lifecloth.ron b/assets/common/items/crafting_ing/cloth/lifecloth.ron index 508cf08dc9..d7c00c2116 100644 --- a/assets/common/items/crafting_ing/cloth/lifecloth.ron +++ b/assets/common/items/crafting_ing/cloth/lifecloth.ron @@ -6,5 +6,5 @@ ItemDef( descriptor: "Lifecloth", ), quality: Direct(High), - tags: [MaterialKind(Cloth)], + tags: [MaterialKind(Cloth), Material(Lifecloth)], ) \ No newline at end of file diff --git a/assets/common/items/crafting_ing/cloth/linen.ron b/assets/common/items/crafting_ing/cloth/linen.ron index f852c8b431..9c702bd4c1 100644 --- a/assets/common/items/crafting_ing/cloth/linen.ron +++ b/assets/common/items/crafting_ing/cloth/linen.ron @@ -6,5 +6,5 @@ ItemDef( descriptor: "Linen", ), quality: Direct(Low), - tags: [MaterialKind(Cloth)], + tags: [MaterialKind(Cloth), Material(Linen)], ) \ No newline at end of file diff --git a/assets/common/items/crafting_ing/cloth/moonweave.ron b/assets/common/items/crafting_ing/cloth/moonweave.ron index 1f0a6451d1..b103095c1b 100644 --- a/assets/common/items/crafting_ing/cloth/moonweave.ron +++ b/assets/common/items/crafting_ing/cloth/moonweave.ron @@ -6,5 +6,5 @@ ItemDef( descriptor: "Moonwoven", ), quality: Direct(Epic), - tags: [MaterialKind(Cloth)], + tags: [MaterialKind(Cloth), Material(Moonweave)], ) \ No newline at end of file diff --git a/assets/common/items/crafting_ing/cloth/silk.ron b/assets/common/items/crafting_ing/cloth/silk.ron index 9bf310d18e..c4b262a4d6 100644 --- a/assets/common/items/crafting_ing/cloth/silk.ron +++ b/assets/common/items/crafting_ing/cloth/silk.ron @@ -6,5 +6,5 @@ ItemDef( descriptor: "Silken", ), quality: Direct(Moderate), - tags: [MaterialKind(Cloth)], + tags: [MaterialKind(Cloth), Material(Silk)], ) \ No newline at end of file diff --git a/assets/common/items/crafting_ing/cloth/sunsilk.ron b/assets/common/items/crafting_ing/cloth/sunsilk.ron index 447037f5eb..51596b6f09 100644 --- a/assets/common/items/crafting_ing/cloth/sunsilk.ron +++ b/assets/common/items/crafting_ing/cloth/sunsilk.ron @@ -6,5 +6,5 @@ ItemDef( descriptor: "Sunsilken", ), quality: Direct(Legendary), - tags: [MaterialKind(Cloth)], + tags: [MaterialKind(Cloth), Material(Sunsilk)], ) \ No newline at end of file diff --git a/assets/common/items/crafting_ing/cloth/wool.ron b/assets/common/items/crafting_ing/cloth/wool.ron index e6ec58a67c..4f04db23b1 100644 --- a/assets/common/items/crafting_ing/cloth/wool.ron +++ b/assets/common/items/crafting_ing/cloth/wool.ron @@ -6,5 +6,5 @@ ItemDef( descriptor: "Woolen", ), quality: Direct(Common), - tags: [MaterialKind(Cloth)], + tags: [MaterialKind(Cloth), Material(Wool)], ) \ No newline at end of file diff --git a/assets/common/items/crafting_ing/hide/carapace.ron b/assets/common/items/crafting_ing/hide/carapace.ron index 6fed454ec4..0f06d55ed6 100644 --- a/assets/common/items/crafting_ing/hide/carapace.ron +++ b/assets/common/items/crafting_ing/hide/carapace.ron @@ -6,5 +6,5 @@ ItemDef( descriptor: "Carapace", ), quality: Direct(High), - tags: [MaterialKind(Hide)], + tags: [MaterialKind(Hide), Material(Carapace)], ) \ No newline at end of file diff --git a/assets/common/items/crafting_ing/hide/dragon_scale.ron b/assets/common/items/crafting_ing/hide/dragon_scale.ron index 18876245a4..9abb939094 100644 --- a/assets/common/items/crafting_ing/hide/dragon_scale.ron +++ b/assets/common/items/crafting_ing/hide/dragon_scale.ron @@ -6,5 +6,5 @@ ItemDef( descriptor: "Dragonscale", ), quality: Direct(Legendary), - tags: [MaterialKind(Hide)], + tags: [MaterialKind(Hide), Material(Dragonscale)], ) \ No newline at end of file diff --git a/assets/common/items/crafting_ing/hide/plate.ron b/assets/common/items/crafting_ing/hide/plate.ron index fb757d93bb..fbe4a67215 100644 --- a/assets/common/items/crafting_ing/hide/plate.ron +++ b/assets/common/items/crafting_ing/hide/plate.ron @@ -6,5 +6,5 @@ ItemDef( descriptor: "Plate", ), quality: Direct(Epic), - tags: [MaterialKind(Hide)], + tags: [MaterialKind(Hide), Material(Plate)], ) \ No newline at end of file diff --git a/assets/common/items/crafting_ing/hide/scales.ron b/assets/common/items/crafting_ing/hide/scales.ron index aa74b7a12d..76eaa39daa 100644 --- a/assets/common/items/crafting_ing/hide/scales.ron +++ b/assets/common/items/crafting_ing/hide/scales.ron @@ -6,5 +6,5 @@ ItemDef( descriptor: "Scale", ), quality: Direct(Moderate), - tags: [MaterialKind(Hide)], + tags: [MaterialKind(Hide), Material(Scale)], ) \ No newline at end of file diff --git a/assets/common/items/crafting_ing/leather/simple_leather.ron b/assets/common/items/crafting_ing/leather/simple_leather.ron index ad325460d0..9b3a45c6b9 100644 --- a/assets/common/items/crafting_ing/leather/simple_leather.ron +++ b/assets/common/items/crafting_ing/leather/simple_leather.ron @@ -6,5 +6,5 @@ ItemDef( descriptor: "Raw Hide", ), quality: Direct(Low), - tags: [BaseMaterial, Leather, MaterialKind(Hide)], + tags: [BaseMaterial, Leather, MaterialKind(Hide), Material(Rawhide)], ) diff --git a/assets/common/items/crafting_ing/leather/thick_leather.ron b/assets/common/items/crafting_ing/leather/thick_leather.ron index 08f753bfa5..af378a5281 100644 --- a/assets/common/items/crafting_ing/leather/thick_leather.ron +++ b/assets/common/items/crafting_ing/leather/thick_leather.ron @@ -6,5 +6,5 @@ ItemDef( descriptor: "Leather", ), quality: Direct(Common), - tags: [BaseMaterial, Leather, MaterialKind(Hide)], + tags: [BaseMaterial, Leather, MaterialKind(Hide), Material(Leather)], ) diff --git a/assets/common/items/log/bamboo.ron b/assets/common/items/log/bamboo.ron index 921ce44af9..5b18d51ff3 100644 --- a/assets/common/items/log/bamboo.ron +++ b/assets/common/items/log/bamboo.ron @@ -6,5 +6,5 @@ ItemDef( descriptor: "Bamboo", ), quality: Direct(Common), - tags: [MaterialKind(Wood)], + tags: [MaterialKind(Wood), Material(Bamboo)], ) \ No newline at end of file diff --git a/assets/common/items/log/eldwood.ron b/assets/common/items/log/eldwood.ron index 98aa4a7cb0..8f6908d7d6 100644 --- a/assets/common/items/log/eldwood.ron +++ b/assets/common/items/log/eldwood.ron @@ -6,5 +6,5 @@ ItemDef( descriptor: "Eldwood", ), quality: Direct(Common), - tags: [MaterialKind(Wood)], + tags: [MaterialKind(Wood), Material(Eldwood)], ) \ No newline at end of file diff --git a/assets/common/items/log/frostwood.ron b/assets/common/items/log/frostwood.ron index b78cb578e3..818fbfc2e7 100644 --- a/assets/common/items/log/frostwood.ron +++ b/assets/common/items/log/frostwood.ron @@ -6,5 +6,5 @@ ItemDef( descriptor: "Frostwood", ), quality: Direct(Common), - tags: [MaterialKind(Wood)], + tags: [MaterialKind(Wood), Material(Frostwood)], ) \ No newline at end of file diff --git a/assets/common/items/log/hardwood.ron b/assets/common/items/log/hardwood.ron index 931eec7d1a..5379db775d 100644 --- a/assets/common/items/log/hardwood.ron +++ b/assets/common/items/log/hardwood.ron @@ -6,5 +6,5 @@ ItemDef( descriptor: "Hardwood", ), quality: Direct(Common), - tags: [MaterialKind(Wood)], + tags: [MaterialKind(Wood), Material(Hardwood)], ) \ No newline at end of file diff --git a/assets/common/items/log/ironwood.ron b/assets/common/items/log/ironwood.ron index 01ea5e9842..6989b31981 100644 --- a/assets/common/items/log/ironwood.ron +++ b/assets/common/items/log/ironwood.ron @@ -6,5 +6,5 @@ ItemDef( descriptor: "Ironwood", ), quality: Direct(High), - tags: [MaterialKind(Wood)], + tags: [MaterialKind(Wood), Material(Ironwood)], ) \ No newline at end of file diff --git a/assets/common/items/log/wood.ron b/assets/common/items/log/wood.ron index cf5e003268..8e7d739e26 100644 --- a/assets/common/items/log/wood.ron +++ b/assets/common/items/log/wood.ron @@ -6,5 +6,5 @@ ItemDef( descriptor: "Wooden", ), quality: Direct(Common), - tags: [MaterialKind(Wood)], + tags: [MaterialKind(Wood), Material(Wood)], ) \ No newline at end of file diff --git a/assets/common/items/mineral/ingot/bloodsteel.ron b/assets/common/items/mineral/ingot/bloodsteel.ron index 2a2c6fa8b9..1c74fab172 100644 --- a/assets/common/items/mineral/ingot/bloodsteel.ron +++ b/assets/common/items/mineral/ingot/bloodsteel.ron @@ -6,5 +6,5 @@ ItemDef( descriptor: "Bloodsteel", ), quality: Direct(Epic), - tags: [MaterialKind(Metal)], + tags: [MaterialKind(Metal), Material(Bloodsteel)], ) diff --git a/assets/common/items/mineral/ingot/bronze.ron b/assets/common/items/mineral/ingot/bronze.ron index 11f7a90b7c..ea6c95483c 100644 --- a/assets/common/items/mineral/ingot/bronze.ron +++ b/assets/common/items/mineral/ingot/bronze.ron @@ -6,5 +6,5 @@ ItemDef( descriptor: "Bronze", ), quality: Direct(Low), - tags: [MaterialKind(Metal)], + tags: [MaterialKind(Metal), Material(Bronze)], ) diff --git a/assets/common/items/mineral/ingot/cobalt.ron b/assets/common/items/mineral/ingot/cobalt.ron index b3c7c1c294..1448c2d0d9 100644 --- a/assets/common/items/mineral/ingot/cobalt.ron +++ b/assets/common/items/mineral/ingot/cobalt.ron @@ -6,5 +6,5 @@ ItemDef( descriptor: "Cobalt", ), quality: Direct(High), - tags: [MaterialKind(Metal)], + tags: [MaterialKind(Metal), Material(Cobalt)], ) diff --git a/assets/common/items/mineral/ingot/iron.ron b/assets/common/items/mineral/ingot/iron.ron index 9c65b4bc73..23bef0facf 100644 --- a/assets/common/items/mineral/ingot/iron.ron +++ b/assets/common/items/mineral/ingot/iron.ron @@ -6,5 +6,5 @@ ItemDef( descriptor: "Iron", ), quality: Direct(Common), - tags: [MaterialKind(Metal)], + tags: [MaterialKind(Metal), Material(Iron)], ) diff --git a/assets/common/items/mineral/ingot/orichalcum.ron b/assets/common/items/mineral/ingot/orichalcum.ron index e34e0b70ce..314289741d 100644 --- a/assets/common/items/mineral/ingot/orichalcum.ron +++ b/assets/common/items/mineral/ingot/orichalcum.ron @@ -6,5 +6,5 @@ ItemDef( descriptor: "Orichalcum", ), quality: Direct(Legendary), - tags: [MaterialKind(Metal)], + tags: [MaterialKind(Metal), Material(Orichalcum)], ) \ No newline at end of file diff --git a/assets/common/items/mineral/ingot/steel.ron b/assets/common/items/mineral/ingot/steel.ron index e0634ba36e..b3764eb871 100644 --- a/assets/common/items/mineral/ingot/steel.ron +++ b/assets/common/items/mineral/ingot/steel.ron @@ -6,5 +6,5 @@ ItemDef( descriptor: "Steel", ), quality: Direct(Moderate), - tags: [MaterialKind(Metal)], + tags: [MaterialKind(Metal), Material(Steel)], ) diff --git a/assets/voxygen/item_image_manifest.ron b/assets/voxygen/item_image_manifest.ron index 857e40a290..264a2b0a56 100644 --- a/assets/voxygen/item_image_manifest.ron +++ b/assets/voxygen/item_image_manifest.ron @@ -316,6 +316,10 @@ "voxel.weapon.sword.iron-5", (0.0, 0.0, -4.0), (-135.0, 90.0, 0.0), 1.1, ), + ModularWeapon(("common.items.crafting_ing.modular.damage.sword.longsword", "iron", One)): VoxTrans( + "voxel.weapon.sword.iron-5", + (0.0, 0.0, -4.0), (-135.0, 90.0, 0.0), 1.1, + ), Tool("common.items.weapons.sword.iron-6"): VoxTrans( "voxel.weapon.sword.iron-6", (0.0, 0.0, -4.0), (-135.0, 90.0, 0.0), 1.1, diff --git a/common/src/comp/inventory/item/item_key.rs b/common/src/comp/inventory/item/item_key.rs index f318d096cc..62ba4bd8a0 100644 --- a/common/src/comp/inventory/item/item_key.rs +++ b/common/src/comp/inventory/item/item_key.rs @@ -2,7 +2,7 @@ use crate::{ assets::AssetExt, comp::inventory::item::{ armor::{Armor, ArmorKind}, - Glider, ItemDef, ItemDesc, ItemKind, Lantern, Throwable, Utility, + modular, tool, Glider, ItemDef, ItemDesc, ItemKind, Lantern, Throwable, Utility, }, }; use serde::{Deserialize, Serialize}; @@ -11,6 +11,7 @@ use std::sync::Arc; #[derive(Clone, Debug, Serialize, Deserialize, Hash, Eq, PartialEq)] pub enum ItemKey { Tool(String), + ModularWeapon(modular::ModularWeaponKey), ModularComponent(String), Lantern(String), Glider(String), @@ -29,7 +30,13 @@ impl From<&T> for ItemKey { let item_definition_id = item_desc.item_definition_id(); match item_kind { - ItemKind::Tool(_) => ItemKey::Tool(item_definition_id.to_owned()), + ItemKind::Tool(tool) => { + use tool::StatKind; + match tool.stats { + StatKind::Direct(_) => ItemKey::Tool(item_definition_id.to_owned()), + StatKind::Modular => ItemKey::ModularWeapon(modular::weapon_to_key(item_desc)), + } + }, ItemKind::ModularComponent(_) => { ItemKey::ModularComponent(item_definition_id.to_owned()) }, diff --git a/common/src/comp/inventory/item/mod.rs b/common/src/comp/inventory/item/mod.rs index 8a7a2131a4..19cf243d31 100644 --- a/common/src/comp/inventory/item/mod.rs +++ b/common/src/comp/inventory/item/mod.rs @@ -212,28 +212,18 @@ impl Material { } } -#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[serde(transparent)] -pub struct MaterialTag { - material: Material, -} - -impl MaterialTag { - pub fn material(&self) -> &Material { &self.material } -} - -impl TagExampleInfo for MaterialTag { - fn name(&self) -> Cow<'static, str> { Cow::Borrowed(self.material.into()) } +impl TagExampleInfo for Material { + fn name(&self) -> Cow<'static, str> { Cow::Borrowed(self.into()) } fn exemplar_identifier(&self) -> Cow<'static, str> { - Cow::Borrowed("common.items.tag_examples.placeholder") + Cow::Borrowed(self.asset_identifier().unwrap_or("")) } } #[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize)] pub enum ItemTag { Leather, - Material(MaterialTag), + Material(Material), MaterialKind(MaterialKind), ModularComponent(ModularComponentTag), Cultist, diff --git a/common/src/comp/inventory/item/modular.rs b/common/src/comp/inventory/item/modular.rs index 422f09f3eb..fc1cb6d0f7 100644 --- a/common/src/comp/inventory/item/modular.rs +++ b/common/src/comp/inventory/item/modular.rs @@ -1,6 +1,6 @@ use super::{ tool::{self, Hands}, - Item, ItemKind, ItemName, ItemTag, RawItemDef, TagExampleInfo, ToolKind, + Item, ItemDesc, ItemKind, ItemName, ItemTag, RawItemDef, TagExampleInfo, ToolKind, }; use crate::{ assets::AssetExt, @@ -435,7 +435,9 @@ pub fn random_weapon(tool: ToolKind, material: super::Material, hands: Option ModularWeaponKey { + let hands = if let ItemKind::Tool(tool) = mod_weap.kind() { + tool.hands.resolve_hands(mod_weap.components()) + } else { + Hands::One + }; + + let (main_comp, material) = if let Some(main_comp) = mod_weap.components().iter().find(|comp| { + matches!(comp.kind(), ItemKind::ModularComponent(mod_comp) if ModularComponentKind::main_component(mod_comp.toolkind) == mod_comp.modkind) + }) { + let material = if let Some(material) = main_comp.components().iter().filter_map(|mat| { + if let Some(super::ItemTag::Material(material)) = mat.tags().iter().find(|tag| matches!(tag, super::ItemTag::Material(_))) { + Some(material) + } else { + None + } + }).next() { + material.into() + } else { + "" + }; + + (main_comp.item_definition_id(), material) + } else { + ("", "") + }; + + (main_comp.to_owned(), material.to_owned(), hands) +} diff --git a/common/src/lottery.rs b/common/src/lottery.rs index 8ca57e4a42..77d5df7306 100644 --- a/common/src/lottery.rs +++ b/common/src/lottery.rs @@ -139,7 +139,11 @@ impl> LootSpec { .choose() .to_item(), Self::Nothing => None, - Self::ModularWeapon { tool, material, hands } => Some(item::modular::random_weapon(*tool, *material, *hands)), + Self::ModularWeapon { + tool, + material, + hands, + } => Some(item::modular::random_weapon(*tool, *material, *hands)), } } } diff --git a/voxygen/src/hud/crafting.rs b/voxygen/src/hud/crafting.rs index 2036a76dc1..b157a8fa56 100644 --- a/voxygen/src/hud/crafting.rs +++ b/voxygen/src/hud/crafting.rs @@ -198,14 +198,12 @@ impl CraftingTab { }, CraftingTab::Glider => matches!(item.kind(), ItemKind::Glider(_)), CraftingTab::Potion => item.tags().contains(&ItemTag::Potion), - CraftingTab::ProcessedMaterial => { - item.tags().iter().any(|tag| { - matches!( - tag, - &ItemTag::MaterialKind(_) | &ItemTag::Leather | &ItemTag::BaseMaterial - ) - }) - }, + CraftingTab::ProcessedMaterial => item.tags().iter().any(|tag| { + matches!( + tag, + &ItemTag::MaterialKind(_) | &ItemTag::Leather | &ItemTag::BaseMaterial + ) + }), CraftingTab::Bag => item.tags().contains(&ItemTag::Bag), CraftingTab::Tool => item.tags().contains(&ItemTag::CraftingTool), CraftingTab::Utility => item.tags().contains(&ItemTag::Utility), diff --git a/voxygen/src/hud/skillbar.rs b/voxygen/src/hud/skillbar.rs index 9d5c97c01e..c521bbbbef 100644 --- a/voxygen/src/hud/skillbar.rs +++ b/voxygen/src/hud/skillbar.rs @@ -613,7 +613,10 @@ impl<'a> Skillbar<'a> { .get(i) .and_then(|a| Ability::from(*a).ability_id(Some(inventory))) }) - .map(util::ability_description), + .map(|a| { + let (title, desc) = util::ability_description(a); + (Cow::Borrowed(title), desc) + }), }) }; diff --git a/voxygen/src/ui/widgets/item_tooltip.rs b/voxygen/src/ui/widgets/item_tooltip.rs index 84f6fcc12a..c24c4be155 100644 --- a/voxygen/src/ui/widgets/item_tooltip.rs +++ b/voxygen/src/ui/widgets/item_tooltip.rs @@ -472,16 +472,16 @@ impl<'a> Widget for ItemTooltip<'a> { let item_kind = util::kind_text(item, i18n).to_string(); - let material_tag = item.tags().iter().find_map(|t| match t { + let material = item.tags().iter().find_map(|t| match t { ItemTag::Material(material) => Some(material), _ => None, }); - let subtitle = if let Some(material_tag) = material_tag { + let subtitle = if let Some(material) = material { format!( "{} ({})", item_kind, - util::material_kind_text(&material_tag.material().material_kind(), i18n) + util::material_kind_text(&material.material_kind(), i18n) ) } else { item_kind