use anyhow::Result; use assetpath::AssetPath; use rpg_components::{ components::{ attributes::Attributes, character_status::CharacterStatus, inventory::Inventory, item_slots::ItemSlotContainer, statistics::Statistics, }, config::{attributes::AttributeSettings, items::ItemSettings}, items::{Item, ItemAffix, Tooltip}, }; use crate::*; use std::sync::{Arc, Weak}; use super::{ super::traits::*, jewel_right_side::{ReferenceItemSource, ReferenceObject}, }; pub struct ItemRightSide { snippet: Arc, empty_icons: InventoryEmptyIcons, } impl ItemRightSide { pub fn new( world: &mut World, file: &str, reference: &Weak, hero: Entity, ) -> Result { let snippet = GuiSnippet::from_str(world, file)?; let icons = InventoryEmptyIcons::new(world)?; let me = Self { snippet, empty_icons: icons, }; me.setup::(reference, hero)?; Ok(me) } fn setup( &self, reference: &Weak, hero: Entity, ) -> Result<()> { button_setup!(self, reference, hero, helmet, "helmet"); button_setup!(self, reference, hero, chest, "chest"); button_setup!(self, reference, hero, gloves, "gloves"); button_setup!(self, reference, hero, belt, "belt"); button_setup!(self, reference, hero, boots, "boots"); #[rustfmt::skip] button_setup!(self, reference, hero, primary_hand, "main hand"); #[rustfmt::skip] button_setup!(self, reference, hero, secondary_hand, "off hand"); #[rustfmt::skip] button_setup!(self, reference, hero, amulet, "amulet_0", 0); #[rustfmt::skip] button_setup!(self, reference, hero, amulet, "amulet_1", 1); #[rustfmt::skip] button_setup!(self, reference, hero, ring, "ring_0", 0); #[rustfmt::skip] button_setup!(self, reference, hero, ring, "ring_1", 1); #[rustfmt::skip] button_setup!(self, reference, hero, ring, "ring_2", 2); #[rustfmt::skip] button_setup!(self, reference, hero, ring, "ring_3", 3); Ok(()) } fn update_icons(&self, gui_handler: &mut GuiHandler, items: &ItemSlotContainer) -> Result<()> { let ui = &self.snippet; let empty_icons = &self.empty_icons; equip_update!(ui, gui_handler, items, helmet, empty_icons); equip_update!(ui, gui_handler, items, chest, empty_icons); equip_update!(ui, gui_handler, items, boots, empty_icons); equip_update!(ui, gui_handler, items, gloves, empty_icons); equip_update!(ui, gui_handler, items, belt, empty_icons); #[rustfmt::skip] equip_update!(ui,gui_handler, items, primary_hand, empty_icons, "main hand"); #[rustfmt::skip] equip_update!(ui, gui_handler,items, secondary_hand, empty_icons, "off hand"); equip_update!(ui, gui_handler, items, ring, empty_icons, "ring_0", 0); equip_update!(ui, gui_handler, items, ring, empty_icons, "ring_1", 1); equip_update!(ui, gui_handler, items, ring, empty_icons, "ring_2", 2); equip_update!(ui, gui_handler, items, ring, empty_icons, "ring_3", 3); equip_update!(ui, gui_handler, items, amulet, empty_icons, "amulet_0", 0); equip_update!(ui, gui_handler, items, amulet, empty_icons, "amulet_1", 1); Ok(()) } fn create_tooltip( world: &mut World, item: &Item, attributes: &Attributes, (x, y, w, _h): (i32, i32, u32, u32), ) -> Result { let target_x = x + w as i32; let target_y = y; let gui = item.create_tooltip(world, attributes, (target_x, target_y))?; gui.enable(world)?; gui.perform_single_check(world.resources.get_mut()?, x, y)?; Ok(gui) } } impl RightSide for ItemRightSide { fn refresh(&mut self, world: &mut World, hero: Entity) -> Result<()> { let (hero_object, resources) = world.entity_resources(hero)?; let items = hero_object.get_component::()?; self.update_icons(resources.get_mut()?, items) } fn base(&self) -> &Arc { &self.snippet } } struct InventoryEmptyIcons { helmet: Arc, chest: Arc, belt: Arc, boots: Arc, gloves: Arc, primary_hand: Arc, secondary_hand: Arc, ring: Arc, amulet: Arc, } impl InventoryEmptyIcons { fn new(world: &World) -> Result { let place_holder_settings = &world .resources .get::() .icon_place_holder_paths; let context = world.resources.get::(); Ok(Self { helmet: Self::image(context, &place_holder_settings.helmet)?, chest: Self::image(context, &place_holder_settings.chest)?, belt: Self::image(context, &place_holder_settings.belt)?, boots: Self::image(context, &place_holder_settings.boots)?, gloves: Self::image(context, &place_holder_settings.gloves)?, primary_hand: Self::image(context, &place_holder_settings.main_hand)?, secondary_hand: Self::image(context, &place_holder_settings.off_hand)?, ring: Self::image(context, &place_holder_settings.ring)?, amulet: Self::image(context, &place_holder_settings.amulet)?, }) } fn image(context: &Context, path: &AssetPath) -> Result> { Image::from_file(path.clone())? .max_mip_map_levels() .attach_pretty_sampler(context.device())? .build(context.device(), context.queue()) } } mod macros { #[macro_export] macro_rules! button_setup { ($self:ident, $reference:ident, $hero:ident, $item:ident, $button:literal) => { paste::expr! { let [<$item _button>]: Arc