Start applying ecs changes

This commit is contained in:
hodasemi 2025-04-05 12:16:34 +02:00
parent 5719bef6a6
commit ac1af484b8
22 changed files with 140 additions and 133 deletions

View file

@ -9,5 +9,6 @@ paste = { workspace = true }
downcast-rs = { workspace = true } downcast-rs = { workspace = true }
engine = { workspace = true } engine = { workspace = true }
ecs = { workspace = true }
rpg_components = { path = "../rpg_components" } rpg_components = { path = "../rpg_components" }
assetpath.workspace = true assetpath.workspace = true

View file

@ -34,16 +34,18 @@ impl<A: Ability + 'static> AbilityPageRightSide<A> {
include_str!("../../resources/abilities/right_side.xml"), include_str!("../../resources/abilities/right_side.xml"),
)?; )?;
let mut resources = world.resources.multi_mut(); let color_settings = world
let gui_handler = resources.get::<GuiHandler>(); .resources
let engine_settings = resources.get::<EngineSettings>();
let context = resources.get::<Context>();
let color_settings = resources
.get::<ItemSettings>() .get::<ItemSettings>()
.rarity_color_settings .rarity_color_settings
.clone(); .clone();
let (gui_handler, engine_settings, context): (
&mut GuiHandler,
&mut EngineSettings,
&mut Context,
) = world.resources.get_mut()?;
Self::rarity_icon_background(gui_handler, &snippet, "common", color_settings.common)?; Self::rarity_icon_background(gui_handler, &snippet, "common", color_settings.common)?;
Self::rarity_icon_background(gui_handler, &snippet, "uncommon", color_settings.uncommon)?; Self::rarity_icon_background(gui_handler, &snippet, "uncommon", color_settings.uncommon)?;
Self::rarity_icon_background(gui_handler, &snippet, "magical", color_settings.magical)?; Self::rarity_icon_background(gui_handler, &snippet, "magical", color_settings.magical)?;
@ -98,7 +100,7 @@ impl<A: Ability + 'static> AbilityPageRightSide<A> {
book.create_tooltip(world, statistics, (target_x, target_y))?; book.create_tooltip(world, statistics, (target_x, target_y))?;
gui.enable(world)?; gui.enable(world)?;
gui.perform_single_check( gui.perform_single_check(
world.resources.get_mut::<GuiHandler>(), world.resources.get_mut()?,
button_pos.0, button_pos.0,
button_pos.1, button_pos.1,
)?; )?;
@ -120,7 +122,6 @@ impl<A: Ability + 'static> AbilityPageRightSide<A> {
move |world, button| match button { move |world, button| match button {
ControllerButton::Y => { ControllerButton::Y => {
let entity = world.entity_mut(hero)?; let entity = world.entity_mut(hero)?;
let mut multi_mut = entity.multi_mut();
let abilities = multi_mut.get::<AbilitySlots<A>>()?; let abilities = multi_mut.get::<AbilitySlots<A>>()?;
@ -226,7 +227,7 @@ impl<A: Ability + 'static> AbilityPageRightSide<A> {
let addon_type: Arc<Label> = addon_type_snippet.element("addon_type")?; let addon_type: Arc<Label> = addon_type_snippet.element("addon_type")?;
let addon_value: Arc<Label> = addon_type_snippet.element("addon_value")?; let addon_value: Arc<Label> = addon_type_snippet.element("addon_value")?;
let gui_handler = world.resources.get_mut::<GuiHandler>(); let gui_handler: &mut GuiHandler = world.resources.get_mut()?;
addon_icon.set_icon(gui_handler, &addon.icon())?; addon_icon.set_icon(gui_handler, &addon.icon())?;
addon_type.set_text(gui_handler, &format!("{}", addon.addon_type()))?; addon_type.set_text(gui_handler, &format!("{}", addon.addon_type()))?;
@ -261,7 +262,7 @@ impl<A: Ability + 'static> RightSide for AbilityPageRightSide<A> {
let crafting = entity.get_component::<CraftingMaterials>()?; let crafting = entity.get_component::<CraftingMaterials>()?;
let gui_handler = world.resources.get_mut::<GuiHandler>(); let gui_handler: &mut GuiHandler = world.resources.get_mut()?;
self.update_crafting_count(gui_handler, "common", crafting.count(Rarities::Common))?; self.update_crafting_count(gui_handler, "common", crafting.count(Rarities::Common))?;
self.update_crafting_count(gui_handler, "uncommon", crafting.count(Rarities::Uncommon))?; self.update_crafting_count(gui_handler, "uncommon", crafting.count(Rarities::Uncommon))?;

View file

@ -32,7 +32,7 @@ impl<A: Ability + 'static> Content<A, AbilityAddon> {
let addon = inventory.addon_at(addon_index); let addon = inventory.addon_at(addon_index);
let gui = addon.create_tooltip(world, (target_x, target_y))?; let gui = addon.create_tooltip(world, (target_x, target_y))?;
gui.enable(world)?; gui.enable(world)?;
gui.perform_single_check(world.resources.get_mut::<GuiHandler>(), x, y)?; gui.perform_single_check(world.resources.get_mut()?, x, y)?;
let window = reference.upgrade().unwrap(); let window = reference.upgrade().unwrap();
window.add_tooltip(format!("addon_{addon_index}"), gui); window.add_tooltip(format!("addon_{addon_index}"), gui);
@ -47,7 +47,6 @@ impl<A: Ability + 'static> Content<A, AbilityAddon> {
ability_page: &AbilityPage<A>, ability_page: &AbilityPage<A>,
) -> Result<()> { ) -> Result<()> {
let entity = world.entity_mut(hero)?; let entity = world.entity_mut(hero)?;
let mut multi_mut = entity.multi_mut();
let inventory = multi_mut.get::<Inventory<A>>()?; let inventory = multi_mut.get::<Inventory<A>>()?;
let abilities = multi_mut.get::<AbilitySlots<A>>()?; let abilities = multi_mut.get::<AbilitySlots<A>>()?;
@ -68,7 +67,7 @@ impl<A: Ability + 'static> ContentUpdate for Content<A, AbilityAddon> {
let reference = self.reference.clone(); let reference = self.reference.clone();
self.update_base(world, |world, button, t, index| { self.update_base(world, |world, button, t, index| {
button.set_icon(world.resources.get_mut::<GuiHandler>(), &t.icon())?; button.set_icon(world.resources.get_mut()?, &t.icon())?;
button.set_custom_callback({ button.set_custom_callback({
let reference = reference.clone(); let reference = reference.clone();
@ -136,7 +135,7 @@ impl<A: Ability + 'static> ContentUpdate for Content<A, AbilityAddon> {
} }
fn select(&self, world: &mut World) -> Result<()> { fn select(&self, world: &mut World) -> Result<()> {
self.select(world.resources.get_mut::<GuiHandler>()) self.select(world.resources.get_mut()?)
} }
} }
@ -148,7 +147,6 @@ impl<A: Ability + 'static> Content<A, AbilityBook<A>> {
ability_page: &AbilityPage<A>, ability_page: &AbilityPage<A>,
) -> Result<()> { ) -> Result<()> {
let entity = world.entity_mut(hero)?; let entity = world.entity_mut(hero)?;
let mut multi_mut = entity.multi_mut();
let inventory = multi_mut.get::<Inventory<A>>()?; let inventory = multi_mut.get::<Inventory<A>>()?;
let abilitiy_slots = multi_mut.get::<AbilitySlots<A>>()?; let abilitiy_slots = multi_mut.get::<AbilitySlots<A>>()?;
@ -194,17 +192,12 @@ impl<A: Ability + 'static> Content<A, AbilityBook<A>> {
let compare_gui = let compare_gui =
selected_book.create_tooltip(world, statistics, (target_x, target_y))?; selected_book.create_tooltip(world, statistics, (target_x, target_y))?;
compare_gui.enable(world)?; compare_gui.enable(world)?;
gui.perform_double_check( gui.perform_double_check(&compare_gui, world.resources.get_mut()?, x, 2)?;
&compare_gui,
world.resources.get_mut::<GuiHandler>(),
x,
2,
)?;
window.add_tooltip("active_book", compare_gui); window.add_tooltip("active_book", compare_gui);
} }
None => { None => {
gui.perform_single_check(world.resources.get_mut::<GuiHandler>(), x, y)?; gui.perform_single_check(world.resources.get_mut()?, x, y)?;
} }
} }
@ -219,7 +212,7 @@ impl<A: Ability + 'static> ContentUpdate for Content<A, AbilityBook<A>> {
let reference = self.reference.clone(); let reference = self.reference.clone();
self.update_base(world, |world, button, t, index| { self.update_base(world, |world, button, t, index| {
button.set_icon(world.resources.get_mut::<GuiHandler>(), &t.icon())?; button.set_icon(world.resources.get_mut()?, &t.icon())?;
button.set_custom_callback({ button.set_custom_callback({
let reference = reference.clone(); let reference = reference.clone();
@ -288,6 +281,6 @@ impl<A: Ability + 'static> ContentUpdate for Content<A, AbilityBook<A>> {
} }
fn select(&self, world: &mut World) -> Result<()> { fn select(&self, world: &mut World) -> Result<()> {
self.select(world.resources.get_mut::<GuiHandler>()) self.select(world.resources.get_mut()?)
} }
} }

View file

@ -75,10 +75,11 @@ impl<A: Ability + 'static> AbilityPage<A> {
include_str!("../../resources/abilities/ability_tooltip.xml"), include_str!("../../resources/abilities/ability_tooltip.xml"),
)?; )?;
let mut resources = world.resources.multi_mut(); let (gui_handler, engine_settings, context): (
let gui_handler = resources.get::<GuiHandler>(); &mut GuiHandler,
let engine_settings = resources.get::<EngineSettings>(); &mut EngineSettings,
let context = resources.get::<Context>(); &mut Context,
) = world.resources.get_mut()?;
let equip: Arc<Label> = ui.element("equip")?; let equip: Arc<Label> = ui.element("equip")?;
equip.set_info_icon( equip.set_info_icon(
@ -129,10 +130,11 @@ impl<A: Ability + 'static> AbilityPage<A> {
include_str!("../../resources/abilities/addon_tooltip.xml"), include_str!("../../resources/abilities/addon_tooltip.xml"),
)?; )?;
let mut resources = world.resources.multi_mut(); let (gui_handler, engine_settings, context): (
let gui_handler = resources.get::<GuiHandler>(); &mut GuiHandler,
let engine_settings = resources.get::<EngineSettings>(); &mut EngineSettings,
let context = resources.get::<Context>(); &mut Context,
) = world.resources.get_mut()?;
let equip: Arc<Label> = ui.element("socket")?; let equip: Arc<Label> = ui.element("socket")?;
equip.set_info_icon( equip.set_info_icon(
@ -265,7 +267,7 @@ impl<A: Ability + 'static> Page for AbilityPage<A> {
if mode.content().is_empty() { if mode.content().is_empty() {
if let Some(close) = self.close.upgrade() { if let Some(close) = self.close.upgrade() {
close.select(world.resources.get_mut::<GuiHandler>())?; close.select(world.resources.get_mut()?)?;
} }
} }

View file

@ -36,8 +36,7 @@ impl CharacterPage {
let grid: Arc<Grid> = snippet.element("statistic_tab")?; let grid: Arc<Grid> = snippet.element("statistic_tab")?;
let name: Arc<Label> = snippet.element("character_name")?; let name: Arc<Label> = snippet.element("character_name")?;
let gui_handler = world.resources.get_mut::<GuiHandler>(); name.set_text(world.resources.get_mut()?, hero_name)?;
name.set_text(gui_handler, hero_name)?;
let strength: Arc<Button> = snippet.element("strength_field")?; let strength: Arc<Button> = snippet.element("strength_field")?;
strength.set_callback({ strength.set_callback({
@ -109,7 +108,7 @@ impl CharacterPage {
let (entity, resources) = world.entity_resources(self.hero)?; let (entity, resources) = world.entity_resources(self.hero)?;
let statistics = entity.get_component::<Statistics>()?; let statistics = entity.get_component::<Statistics>()?;
let gui_handler = resources.get_mut::<GuiHandler>(); let gui_handler: &mut GuiHandler = resources.get_mut()?;
air_def.set_text(gui_handler, &format!("{}", statistics.air_resistance.raw()))?; air_def.set_text(gui_handler, &format!("{}", statistics.air_resistance.raw()))?;
fire_def.set_text( fire_def.set_text(
@ -163,7 +162,6 @@ impl CharacterPage {
let intelligence: Arc<Button> = self.snippet.element("intelligence_field")?; let intelligence: Arc<Button> = self.snippet.element("intelligence_field")?;
let (entity, resources) = world.entity_resources(self.hero)?; let (entity, resources) = world.entity_resources(self.hero)?;
let mut resources = resources.multi_mut();
let level = entity.get_component::<Level>()?; let level = entity.get_component::<Level>()?;
let attributes = entity.get_component::<Attributes>()?; let attributes = entity.get_component::<Attributes>()?;
@ -220,7 +218,6 @@ impl CharacterPage {
let mut upgraded = false; let mut upgraded = false;
let (entity, resources) = world.entity_resources(hero)?; let (entity, resources) = world.entity_resources(hero)?;
let mut multi_mut = entity.multi_mut();
let attribute_settings = resources.get::<AttributeSettings>(); let attribute_settings = resources.get::<AttributeSettings>();
let item_settings = resources.get::<ItemSettings>(); let item_settings = resources.get::<ItemSettings>();
@ -265,7 +262,7 @@ impl Page for CharacterPage {
fn select(&self, world: &mut World) -> Result<()> { fn select(&self, world: &mut World) -> Result<()> {
let strength: Arc<Button> = self.snippet.element("strength_field")?; let strength: Arc<Button> = self.snippet.element("strength_field")?;
strength.select(world.resources.get_mut::<GuiHandler>())?; strength.select(world.resources.get_mut()?)?;
Ok(()) Ok(())
} }

View file

@ -43,10 +43,11 @@ impl<A: Ability + 'static, T: Send + Sync> Content<A, T> {
{ {
let base = GuiSnippet::from_str(world, include_str!("../resources/content.xml"))?; let base = GuiSnippet::from_str(world, include_str!("../resources/content.xml"))?;
let mut resources = world.resources.multi_mut(); let (gui_handler, engine_settings, context): (
let gui_handler = resources.get::<GuiHandler>(); &mut GuiHandler,
let engine_settings = resources.get::<EngineSettings>(); &mut EngineSettings,
let context = resources.get::<Context>(); &mut Context,
) = world.resources.get_mut()?;
let left: Arc<Button> = base.element("left")?; let left: Arc<Button> = base.element("left")?;
left.set_text(gui_handler, "<")?; left.set_text(gui_handler, "<")?;

View file

@ -389,7 +389,7 @@ impl<A: Ability + 'static> ContentUpdate for Content<A, Jewel> {
} }
fn select(&self, world: &mut World) -> Result<()> { fn select(&self, world: &mut World) -> Result<()> {
self.select(world.resources.get_mut::<GuiHandler>()) self.select(world.resources.get_mut()?)
} }
} }
@ -403,6 +403,6 @@ impl<A: Ability + 'static> ContentUpdate for Content<A, MapItem> {
} }
fn select(&self, world: &mut World) -> Result<()> { fn select(&self, world: &mut World) -> Result<()> {
self.select(world.resources.get_mut::<GuiHandler>()) self.select(world.resources.get_mut()?)
} }
} }

View file

@ -76,10 +76,11 @@ impl<A: Ability + 'static> InventoryPage<A> {
include_str!("../../resources/inventory/items/tooltip.xml"), include_str!("../../resources/inventory/items/tooltip.xml"),
)?; )?;
let mut resources = world.resources.multi_mut(); let (gui_handler, engine_settings, context): (
let gui_handler = resources.get::<GuiHandler>(); &mut GuiHandler,
let engine_settings = resources.get::<EngineSettings>(); &mut EngineSettings,
let context = resources.get::<Context>(); &mut Context,
) = world.resources.get_mut()?;
let equip: Arc<Label> = ui.element("equip")?; let equip: Arc<Label> = ui.element("equip")?;
equip.set_info_icon( equip.set_info_icon(
@ -135,10 +136,11 @@ impl<A: Ability + 'static> InventoryPage<A> {
include_str!("../../resources/inventory/jewels/tooltip.xml"), include_str!("../../resources/inventory/jewels/tooltip.xml"),
)?; )?;
let mut resources = world.resources.multi_mut(); let (gui_handler, engine_settings, context): (
let gui_handler = resources.get::<GuiHandler>(); &mut GuiHandler,
let engine_settings = resources.get::<EngineSettings>(); &mut EngineSettings,
let context = resources.get::<Context>(); &mut Context,
) = world.resources.get_mut()?;
let socket: Arc<Label> = ui.element("socket")?; let socket: Arc<Label> = ui.element("socket")?;
socket.set_info_icon( socket.set_info_icon(
@ -186,10 +188,11 @@ impl<A: Ability + 'static> InventoryPage<A> {
include_str!("../../resources/inventory/maps/tooltip.xml"), include_str!("../../resources/inventory/maps/tooltip.xml"),
)?; )?;
let mut resources = world.resources.multi_mut(); let (gui_handler, engine_settings, context): (
let gui_handler = resources.get::<GuiHandler>(); &mut GuiHandler,
let engine_settings = resources.get::<EngineSettings>(); &mut EngineSettings,
let context = resources.get::<Context>(); &mut Context,
) = world.resources.get_mut()?;
let select: Arc<Label> = ui.element("select")?; let select: Arc<Label> = ui.element("select")?;
select.set_info_icon( select.set_info_icon(

View file

@ -7,6 +7,7 @@ mod traits;
use anyhow::Result; use anyhow::Result;
use downcast_rs::{Downcast, impl_downcast}; use downcast_rs::{Downcast, impl_downcast};
use ecs::*;
use engine::prelude::*; use engine::prelude::*;
use rpg_components::{ use rpg_components::{
components::{ components::{
@ -249,10 +250,9 @@ impl CharacterWindow {
S: Storable, S: Storable,
{ {
let entity = world.entity_mut(hero)?; let entity = world.entity_mut(hero)?;
let mut multi_mut = entity.multi_mut();
let crafting_materials = multi_mut.get::<CraftingMaterials>()?; let (crafting_materials, inventory): (&mut CraftingMaterials, &mut Inventory<A>) =
let inventory = multi_mut.get::<Inventory<A>>()?; entity.get_components_mut()?;
// remove callback // remove callback
let storable = f(inventory); let storable = f(inventory);
@ -287,10 +287,11 @@ impl TopLevelGui for CharacterWindow {
self.tab_content_grid.attach(world, child, 0, 0, 1, 1)?; self.tab_content_grid.attach(world, child, 0, 0, 1, 1)?;
self.tab().select(world)?; self.tab().select(world)?;
let mut resources = world.resources.multi_mut(); let (gui_handler, engine_settings, context): (
let gui_handler = resources.get::<GuiHandler>(); &mut GuiHandler,
let engine_settings = resources.get::<EngineSettings>(); &mut EngineSettings,
let context = resources.get::<Context>(); &mut Context,
) = world.resources.get_mut()?;
let close_button: Arc<Button> = self.menu_gui.element("close")?; let close_button: Arc<Button> = self.menu_gui.element("close")?;
close_button.set_info_icon( close_button.set_info_icon(

View file

@ -8,3 +8,4 @@ anyhow = { workspace = true }
rusqlite = { workspace = true } rusqlite = { workspace = true }
assetpath = { workspace = true } assetpath = { workspace = true }
engine = { workspace = true } engine = { workspace = true }
ecs = { workspace = true }

View file

@ -36,6 +36,7 @@ pub enum MapObjectType {
Unknown, Unknown,
} }
#[derive(Resource)]
pub struct Map { pub struct Map {
async_db: AsyncDBAccess, async_db: AsyncDBAccess,

View file

@ -87,7 +87,7 @@ impl SpawnMarkerEntities {
flag.clone_component_from::<Location>(entity)?; flag.clone_component_from::<Location>(entity)?;
flag.clone_component_from::<BoundingBox>(entity)?; flag.clone_component_from::<BoundingBox>(entity)?;
Location::setup(flag.multi_mut())?; Location::setup(&mut flag)?;
Ok(flag) Ok(flag)
} }

View file

@ -10,3 +10,4 @@ assetpath = { workspace = true }
serde = { workspace = true } serde = { workspace = true }
engine = { workspace = true } engine = { workspace = true }
ecs = { workspace = true }

View file

@ -6,7 +6,7 @@ use std::collections::HashMap;
use crate::{ use crate::{
config::{items::ItemSettings, save_game::SaveGame}, config::{items::ItemSettings, save_game::SaveGame},
items::{ability_book::Ability, Item, ItemAffix, ItemSlots, ItemSystem, Rarities}, items::{Item, ItemAffix, ItemSlots, ItemSystem, Rarities, ability_book::Ability},
}; };
use super::{ use super::{
@ -125,10 +125,10 @@ macro_rules! store_item {
macro_rules! setter { macro_rules! setter {
($item:ident) => { ($item:ident) => {
paste::paste! { paste::paste! {
fn [<set_ $item>](&mut self, $item: Option<Item>, multi_mut: &mut MultiMut<'_>) { fn [<set_ $item>](&mut self, $item: Option<Item>, entity: &mut EntityObject) {
self.$item = $item; self.$item = $item;
self.[<apply_ $item _change>](multi_mut).unwrap(); self.[<apply_ $item _change>](entity).unwrap();
} }
} }
}; };
@ -154,7 +154,7 @@ pub struct ItemSlotContainer {
amulets: [Option<Item>; AMULET_COUNT], amulets: [Option<Item>; AMULET_COUNT],
slot_changed_callback: Option< slot_changed_callback: Option<
Box<dyn Fn(ItemSlots, Rarities, bool, &mut MultiMut<'_>) -> Result<()> + Send + Sync>, Box<dyn Fn(ItemSlots, Rarities, bool, &mut EntityObject) -> Result<()> + Send + Sync>,
>, >,
} }
@ -349,7 +349,7 @@ impl ItemSlotContainer {
self.amulets[index] = amulet; self.amulets[index] = amulet;
} }
fn apply_helmet_change(&mut self, multi_mut: &mut MultiMut<'_>) -> Result<()> { fn apply_helmet_change(&mut self, entity: &mut EntityObject) -> Result<()> {
self.apply_item_change( self.apply_item_change(
ItemSlots::Helmet, ItemSlots::Helmet,
match &self.helmet { match &self.helmet {
@ -357,11 +357,11 @@ impl ItemSlotContainer {
None => Rarities::Common, None => Rarities::Common,
}, },
self.helmet.is_some(), self.helmet.is_some(),
multi_mut, entity,
) )
} }
fn apply_belt_change(&mut self, multi_mut: &mut MultiMut<'_>) -> Result<()> { fn apply_belt_change(&mut self, entity: &mut EntityObject) -> Result<()> {
self.apply_item_change( self.apply_item_change(
ItemSlots::Belt, ItemSlots::Belt,
match &self.belt { match &self.belt {
@ -369,11 +369,11 @@ impl ItemSlotContainer {
None => Rarities::Common, None => Rarities::Common,
}, },
self.belt.is_some(), self.belt.is_some(),
multi_mut, entity,
) )
} }
fn apply_chest_plate_change(&mut self, multi_mut: &mut MultiMut<'_>) -> Result<()> { fn apply_chest_plate_change(&mut self, entity: &mut EntityObject) -> Result<()> {
self.apply_item_change( self.apply_item_change(
ItemSlots::ChestPlate, ItemSlots::ChestPlate,
match &self.chest_plate { match &self.chest_plate {
@ -381,11 +381,11 @@ impl ItemSlotContainer {
None => Rarities::Common, None => Rarities::Common,
}, },
self.chest_plate.is_some(), self.chest_plate.is_some(),
multi_mut, entity,
) )
} }
fn apply_gloves_change(&mut self, multi_mut: &mut MultiMut<'_>) -> Result<()> { fn apply_gloves_change(&mut self, entity: &mut EntityObject) -> Result<()> {
self.apply_item_change( self.apply_item_change(
ItemSlots::Gloves, ItemSlots::Gloves,
match &self.gloves { match &self.gloves {
@ -393,11 +393,11 @@ impl ItemSlotContainer {
None => Rarities::Common, None => Rarities::Common,
}, },
self.gloves.is_some(), self.gloves.is_some(),
multi_mut, entity,
) )
} }
fn apply_boots_change(&mut self, multi_mut: &mut MultiMut<'_>) -> Result<()> { fn apply_boots_change(&mut self, entity: &mut EntityObject) -> Result<()> {
self.apply_item_change( self.apply_item_change(
ItemSlots::Boots, ItemSlots::Boots,
match &self.boots { match &self.boots {
@ -405,11 +405,11 @@ impl ItemSlotContainer {
None => Rarities::Common, None => Rarities::Common,
}, },
self.boots.is_some(), self.boots.is_some(),
multi_mut, entity,
) )
} }
fn apply_main_hand_change(&mut self, multi_mut: &mut MultiMut<'_>) -> Result<()> { fn apply_main_hand_change(&mut self, entity: &mut EntityObject) -> Result<()> {
self.apply_item_change( self.apply_item_change(
ItemSlots::MainHand, ItemSlots::MainHand,
match &self.main_hand { match &self.main_hand {
@ -417,11 +417,11 @@ impl ItemSlotContainer {
None => Rarities::Common, None => Rarities::Common,
}, },
self.main_hand.is_some(), self.main_hand.is_some(),
multi_mut, entity,
) )
} }
fn apply_off_hand_change(&mut self, multi_mut: &mut MultiMut<'_>) -> Result<()> { fn apply_off_hand_change(&mut self, entity: &mut EntityObject) -> Result<()> {
self.apply_item_change( self.apply_item_change(
ItemSlots::OffHand, ItemSlots::OffHand,
match &self.off_hand { match &self.off_hand {
@ -429,7 +429,7 @@ impl ItemSlotContainer {
None => Rarities::Common, None => Rarities::Common,
}, },
self.off_hand.is_some(), self.off_hand.is_some(),
multi_mut, entity,
) )
} }
@ -438,10 +438,10 @@ impl ItemSlotContainer {
item_slot: ItemSlots, item_slot: ItemSlots,
rarity: Rarities, rarity: Rarities,
is_some: bool, is_some: bool,
multi_mut: &mut MultiMut<'_>, entity: &mut EntityObject,
) -> Result<()> { ) -> Result<()> {
if let Some(slot_changed_callback) = &self.slot_changed_callback { if let Some(slot_changed_callback) = &self.slot_changed_callback {
slot_changed_callback(item_slot, rarity, is_some, multi_mut)?; slot_changed_callback(item_slot, rarity, is_some, entity)?;
} }
Ok(()) Ok(())
@ -503,99 +503,99 @@ impl ItemSlotContainer {
// setter // setter
impl ItemSlotContainer { impl ItemSlotContainer {
fn _update_helmet(&mut self, helmet: Item, multi_mut: &mut MultiMut<'_>) { fn _update_helmet(&mut self, helmet: Item, entity: &mut EntityObject) {
debug_assert!(helmet.slot == ItemSlots::Helmet); debug_assert!(helmet.slot == ItemSlots::Helmet);
self.set_helmet(Some(helmet), multi_mut); self.set_helmet(Some(helmet), entity);
} }
pub fn unset_helmet(&mut self, multi_mut: &mut MultiMut<'_>) -> Result<()> { pub fn unset_helmet(&mut self, entity: &mut EntityObject) -> Result<()> {
if self.helmet.is_some() { if self.helmet.is_some() {
self.set_helmet(None, multi_mut); self.set_helmet(None, entity);
} }
Ok(()) Ok(())
} }
fn update_chest(&mut self, chest: Item, multi_mut: &mut MultiMut<'_>) { fn update_chest(&mut self, chest: Item, entity: &mut EntityObject) {
debug_assert!(chest.slot == ItemSlots::ChestPlate); debug_assert!(chest.slot == ItemSlots::ChestPlate);
self.set_chest_plate(Some(chest), multi_mut); self.set_chest_plate(Some(chest), entity);
} }
pub fn unset_chest(&mut self, multi_mut: &mut MultiMut<'_>) -> Result<()> { pub fn unset_chest(&mut self, entity: &mut EntityObject) -> Result<()> {
if self.chest_plate.is_some() { if self.chest_plate.is_some() {
self.set_chest_plate(None, multi_mut); self.set_chest_plate(None, entity);
} }
Ok(()) Ok(())
} }
fn _update_belt(&mut self, belt: Item, multi_mut: &mut MultiMut<'_>) { fn _update_belt(&mut self, belt: Item, entity: &mut EntityObject) {
debug_assert!(belt.slot == ItemSlots::Belt); debug_assert!(belt.slot == ItemSlots::Belt);
self.set_belt(Some(belt), multi_mut); self.set_belt(Some(belt), entity);
} }
pub fn unset_belt(&mut self, multi_mut: &mut MultiMut<'_>) -> Result<()> { pub fn unset_belt(&mut self, entity: &mut EntityObject) -> Result<()> {
if self.belt.is_some() { if self.belt.is_some() {
self.set_belt(None, multi_mut); self.set_belt(None, entity);
} }
Ok(()) Ok(())
} }
fn _update_gloves(&mut self, gloves: Item, multi_mut: &mut MultiMut<'_>) { fn _update_gloves(&mut self, gloves: Item, entity: &mut EntityObject) {
debug_assert!(gloves.slot == ItemSlots::Gloves); debug_assert!(gloves.slot == ItemSlots::Gloves);
self.set_gloves(Some(gloves), multi_mut); self.set_gloves(Some(gloves), entity);
} }
pub fn unset_gloves(&mut self, multi_mut: &mut MultiMut<'_>) -> Result<()> { pub fn unset_gloves(&mut self, entity: &mut EntityObject) -> Result<()> {
if self.gloves.is_some() { if self.gloves.is_some() {
self.set_gloves(None, multi_mut); self.set_gloves(None, entity);
} }
Ok(()) Ok(())
} }
fn _update_boots(&mut self, boots: Item, multi_mut: &mut MultiMut<'_>) { fn _update_boots(&mut self, boots: Item, entity: &mut EntityObject) {
debug_assert!(boots.slot == ItemSlots::Boots); debug_assert!(boots.slot == ItemSlots::Boots);
self.set_boots(Some(boots), multi_mut); self.set_boots(Some(boots), entity);
} }
pub fn unset_boots(&mut self, multi_mut: &mut MultiMut<'_>) -> Result<()> { pub fn unset_boots(&mut self, entity: &mut EntityObject) -> Result<()> {
if self.boots.is_some() { if self.boots.is_some() {
self.set_boots(None, multi_mut); self.set_boots(None, entity);
} }
Ok(()) Ok(())
} }
fn update_primary_hand(&mut self, primary_hand: Item, multi_mut: &mut MultiMut<'_>) { fn update_primary_hand(&mut self, primary_hand: Item, entity: &mut EntityObject) {
debug_assert!(primary_hand.slot == ItemSlots::MainHand); debug_assert!(primary_hand.slot == ItemSlots::MainHand);
self.set_main_hand(Some(primary_hand), multi_mut); self.set_main_hand(Some(primary_hand), entity);
} }
pub fn unset_primary_hand(&mut self, multi_mut: &mut MultiMut<'_>) -> Result<()> { pub fn unset_primary_hand(&mut self, entity: &mut EntityObject) -> Result<()> {
if self.main_hand.is_some() { if self.main_hand.is_some() {
self.set_main_hand(None, multi_mut); self.set_main_hand(None, entity);
} }
Ok(()) Ok(())
} }
fn update_secondary_hand(&mut self, secondary_hand: Item, multi_mut: &mut MultiMut<'_>) { fn update_secondary_hand(&mut self, secondary_hand: Item, entity: &mut EntityObject) {
debug_assert!(secondary_hand.slot == ItemSlots::OffHand); debug_assert!(secondary_hand.slot == ItemSlots::OffHand);
self.set_off_hand(Some(secondary_hand), multi_mut); self.set_off_hand(Some(secondary_hand), entity);
} }
pub fn unset_secondary_hand(&mut self, multi_mut: &mut MultiMut<'_>) -> Result<()> { pub fn unset_secondary_hand(&mut self, entity: &mut EntityObject) -> Result<()> {
if self.off_hand.is_some() { if self.off_hand.is_some() {
self.set_off_hand(None, multi_mut); self.set_off_hand(None, entity);
} }
Ok(()) Ok(())
@ -716,14 +716,13 @@ impl ItemSlotContainer {
} }
fn _equipment_changed( fn _equipment_changed(
multi_mut: &mut MultiMut<'_>, entity: &mut EntityObject,
item_meshes: &HashMap<ItemSlots, HashMap<Rarities, AssetMesh>>, item_meshes: &HashMap<ItemSlots, HashMap<Rarities, AssetMesh>>,
slot: ItemSlots, slot: ItemSlots,
rarity: Rarities, rarity: Rarities,
is_some: bool, is_some: bool,
) -> Result<()> { ) -> Result<()> {
let draw = multi_mut.get::<Draw>().unwrap(); let (draw, location): (&mut Draw, &mut Location) = entity.get_components_mut()?;
let location = multi_mut.get::<Location>().unwrap();
let item_name = match slot { let item_name = match slot {
ItemSlots::Helmet => "Helmet", ItemSlots::Helmet => "Helmet",
@ -784,49 +783,49 @@ impl ItemSlotContainer {
&mut self, &mut self,
item: Item, item: Item,
attributes: &Attributes, attributes: &Attributes,
multi_mut: &mut MultiMut<'_>, entity: &mut EntityObject,
) -> Result<Option<Item>> { ) -> Result<Option<Item>> {
// check attribute requirements // check attribute requirements
if attributes < &item.attributes { if attributes < &item.attributes {
return Ok(Some(item)); return Ok(Some(item));
} }
self.insert_unchecked(item, multi_mut) self.insert_unchecked(item, entity)
} }
pub fn insert_unchecked( pub fn insert_unchecked(
&mut self, &mut self,
item: Item, item: Item,
multi_mut: &mut MultiMut<'_>, entity: &mut EntityObject,
) -> Result<Option<Item>> { ) -> Result<Option<Item>> {
Ok(match item.slot { Ok(match item.slot {
ItemSlots::Helmet => { ItemSlots::Helmet => {
let current_helmet = self.helmet.clone(); let current_helmet = self.helmet.clone();
self._update_helmet(item, multi_mut); self._update_helmet(item, entity);
current_helmet current_helmet
} }
ItemSlots::ChestPlate => { ItemSlots::ChestPlate => {
let current_chest_plate = self.chest_plate.clone(); let current_chest_plate = self.chest_plate.clone();
self.update_chest(item, multi_mut); self.update_chest(item, entity);
current_chest_plate current_chest_plate
} }
ItemSlots::Belt => { ItemSlots::Belt => {
let current_belt = self.belt.clone(); let current_belt = self.belt.clone();
self._update_belt(item, multi_mut); self._update_belt(item, entity);
current_belt current_belt
} }
ItemSlots::Gloves => { ItemSlots::Gloves => {
let current_gloves = self.gloves.clone(); let current_gloves = self.gloves.clone();
self._update_gloves(item, multi_mut); self._update_gloves(item, entity);
current_gloves current_gloves
} }
ItemSlots::Boots => { ItemSlots::Boots => {
let current_boots = self.boots.clone(); let current_boots = self.boots.clone();
self._update_boots(item, multi_mut); self._update_boots(item, entity);
current_boots current_boots
} }
@ -856,13 +855,13 @@ impl ItemSlotContainer {
} }
ItemSlots::MainHand => { ItemSlots::MainHand => {
let current_main_hand = self.main_hand.clone(); let current_main_hand = self.main_hand.clone();
self.update_primary_hand(item, multi_mut); self.update_primary_hand(item, entity);
current_main_hand current_main_hand
} }
ItemSlots::OffHand => { ItemSlots::OffHand => {
let current_off_hand = self.off_hand.clone(); let current_off_hand = self.off_hand.clone();
self.update_secondary_hand(item, multi_mut); self.update_secondary_hand(item, entity);
current_off_hand current_off_hand
} }

View file

@ -91,5 +91,6 @@ create_settings_container!(
intelligence_settings: IntelligenceSettings, intelligence_settings: IntelligenceSettings,
starting_attributes: StartingAttributes, starting_attributes: StartingAttributes,
attribute_color_settings: AttributeColorSettings, attribute_color_settings: AttributeColorSettings,
} },
Resource,
); );

View file

@ -1,3 +1,4 @@
use ecs::Resource;
use engine::prelude::*; use engine::prelude::*;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@ -33,7 +34,7 @@ create_settings_container!(
mob_experience: MobExperienceSettings, mob_experience: MobExperienceSettings,
experience_curve: ExperienceCurveSettings, experience_curve: ExperienceCurveSettings,
}, },
Serialize, Deserialize, Serialize, Deserialize, Resource,
); );
impl ExperienceSettings { impl ExperienceSettings {

View file

@ -190,5 +190,6 @@ create_settings_container!(
per_strength_stats: PerStrengthLevelStatistics, per_strength_stats: PerStrengthLevelStatistics,
per_agility_stats: PerAgilityLevelStatistics, per_agility_stats: PerAgilityLevelStatistics,
per_intelligence_stats: PerIntelligenceLevelStatistics, per_intelligence_stats: PerIntelligenceLevelStatistics,
} },
Resource,
); );

View file

@ -366,7 +366,7 @@ impl SaveGame {
let mut entity_object = AssetHandler::create(world).empty_entity(); let mut entity_object = AssetHandler::create(world).empty_entity();
entity_object.insert_component(Draw::new(Vec::new())); entity_object.insert_component(Draw::new(Vec::new()));
entity_object.insert_component(Audio::new(world.resources.get_mut::<Context>(), None)?); entity_object.insert_component(Audio::new(world.resources.get_mut()?, None)?);
Location::new_and_setup(&mut entity_object)?; Location::new_and_setup(&mut entity_object)?;
let experience_settings = world.resources.get::<ExperienceSettings>(); let experience_settings = world.resources.get::<ExperienceSettings>();

View file

@ -248,7 +248,7 @@ impl AbilityAddon {
pub fn create_tooltip(&self, world: &mut World, position: (i32, i32)) -> Result<Tooltip> { pub fn create_tooltip(&self, world: &mut World, position: (i32, i32)) -> Result<Tooltip> {
let gui = GuiBuilder::from_str(world, include_str!("../../resources/addon_snippet.xml"))?; let gui = GuiBuilder::from_str(world, include_str!("../../resources/addon_snippet.xml"))?;
let gui_handler = world.resources.get_mut::<GuiHandler>(); let gui_handler: &mut GuiHandler = world.resources.get_mut()?;
let icon: Arc<Icon> = gui.element("addon_icon")?; let icon: Arc<Icon> = gui.element("addon_icon")?;
let rarity_label: Arc<Label> = gui.element("rarity_label")?; let rarity_label: Arc<Label> = gui.element("rarity_label")?;

View file

@ -304,7 +304,7 @@ impl<A: Ability> AbilityBook<A> {
) -> Result<Tooltip> { ) -> Result<Tooltip> {
let gui = GuiBuilder::from_str(world, include_str!("../../resources/book_snippet.xml"))?; let gui = GuiBuilder::from_str(world, include_str!("../../resources/book_snippet.xml"))?;
let gui_handler = world.resources.get_mut::<GuiHandler>(); let gui_handler: &mut GuiHandler = world.resources.get_mut()?;
let ability_name: Arc<Label> = gui.element("ability_name")?; let ability_name: Arc<Label> = gui.element("ability_name")?;
let rarity_label: Arc<Label> = gui.element("rarity_label")?; let rarity_label: Arc<Label> = gui.element("rarity_label")?;

View file

@ -1,5 +1,6 @@
use anyhow::Result; use anyhow::Result;
use assetpath::AssetPath; use assetpath::AssetPath;
use ecs::resources::Resource;
use engine::prelude::*; use engine::prelude::*;
use std::collections::HashMap; use std::collections::HashMap;
@ -51,6 +52,8 @@ pub struct ItemSystem<A: Ability> {
abilities: Vec<A>, abilities: Vec<A>,
} }
impl<A: Ability + 'static> Resource for ItemSystem<A> {}
impl<A: Ability> ItemSystem<A> { impl<A: Ability> ItemSystem<A> {
pub fn new( pub fn new(
world: &mut World, world: &mut World,

View file

@ -67,7 +67,7 @@ impl Jewel {
let inspector_snippet: Arc<GuiBuilder> = let inspector_snippet: Arc<GuiBuilder> =
GuiBuilder::from_str(world, include_str!("../../resources/jewel_tooltip.xml"))?; GuiBuilder::from_str(world, include_str!("../../resources/jewel_tooltip.xml"))?;
let gui_handler = world.resources.get_mut::<GuiHandler>(); let gui_handler: &mut GuiHandler = world.resources.get_mut()?;
let main_grid: Arc<Grid> = inspector_snippet.element("main_grid")?; let main_grid: Arc<Grid> = inspector_snippet.element("main_grid")?;
main_grid.change_position_unscaled(gui_handler, position.0, position.1)?; main_grid.change_position_unscaled(gui_handler, position.0, position.1)?;