inv-sys
A robust and effective inventory system for games.
Features
- simple but robust API
- automatic stacking functionality
- taking stacks
- finding slots
- iterator
- max stacksize via trait
- and more!
Usage
impl super::Stacksize for char {
fn get_max_stacksize(&self) -> usize {
3
}
}
fn main() {
let mut inv = Inv::<char>::new(32);
assert!(
inv.stack_at(
666, ItemStack::new('x', 1)
).is_err()
);
assert_eq!(
inv.stack_at(
2, ItemStack::new('a', 4)
),
Ok(Err(
StackErr::StackSizeOverflow(
ItemStack::new('a', 1)
)
))
);
inv.stack_at(
1, ItemStack::new('c', 1)
).ok();
assert_eq!(
inv.stack_at(
1, ItemStack::new('y', 1)
),
Ok(Err(
StackErr::ItemTypeDoesNotMatch(
ItemStack::new('y', 1)
)
))
);
assert!(
inv.auto_stack(
ItemStack::new('c', 3)
).is_ok()
);
assert_eq!(
inv.get_slot(0),
Ok(&Slot::new(ItemStack::new('c', 1)))
);
assert_eq!(
inv.get_slot(1),
Ok(&Slot::new(ItemStack::new('c', 3)))
);
inv.stack_at(5, ItemStack::new('t', 1)).ok();
inv.auto_stack(ItemStack::new('t', 1)).ok();
assert_eq!(
inv.take_stack(5),
Ok(ItemStack::new('t', 2))
);
assert_eq!(
inv.take_stack(5),
Err(InvAccessErr::SlotEmpty)
);
}
You can look at the unit tests for more examples.
Todo
- better way to handle item remove/decrease
- finding items
- trees for sorting and performance improvements
- simple configuration options
- any requests? please just submit an issue, thanks!
Contributions
Feel free to open an issue/PR explaining possible improvements or changes
Help
Also, please do not hesitate and open an issue when needed. I am happy to help!