4 个版本

0.2.1 2022年7月23日
0.2.0 2022年7月23日
0.1.2 2022年7月17日
0.1.1 2022年7月17日

#1921 in Rust 模式

MIT 许可证

39KB
424

game_inventory

一个用于泛化库存逻辑并将之从特定游戏中的物品数据中抽象出来的框架。

有关此软件包的更多示例和具体文档,请参阅 docs.rs


lib.rs:

一个用于泛化库存逻辑并将之从特定游戏中的物品数据中抽象出来的框架。

设计规范

  • 一切都应该是可互换的,尽可能通用。
  • 架构应支持物品实例数据和物品元数据。
  • 应非常可靠(由 Rust 编写 + 单元测试)。
  • 在新的游戏中快速设置。

限制

此框架做出的唯一假设是您的物品有堆叠。即使您的物品没有堆叠且仅是单个物品,您也可以使用此系统进行工作,但效率会较低。然而,如果您的库存系统在基本工作上有所不同,请随意从此处的设计中汲取灵感,同时进行您特定的调整。

整体架构

  • trait IItem 像物品外观、基本伤害、描述等永远不会改变的物品数据。
  • trait IItemInstance 在实例之间改变的数据,如附魔、拥有数量、耐久度等。
  • trait ISlot 管理单个物品实例。适用于将用户操作绑定到不同类型的实例修改(堆叠拆分、堆叠合并等)。允许通过回调函数绑定到 UI。
  • Vec<ISlot> 是组成库存的方式。在 inventory_management 中有内置函数可以帮助管理库存。

基本示例

// Define your item data however you like:
#[derive(Debug)]
pub struct Item<'a> {
    pub name: &'a str,
    pub max_quantity: u16,
    pub image: Option<Vec<(u8,u8,u8,u8)>>,
    pub item_type: &'a str
}
// implement IItem for it so it can interact with the rest of the system.
impl<'a> IItem for Item<'a> {
    fn stackable(&self) -> bool {
        self.max_quantity > 1
    }

    fn max_quant(&self) -> u16 {
        self.max_quantity
    }

    fn name(&self) -> &str {
        self.name
    }
}
// start using it in combination with everything else!
const CHEESE: Item = Item{name:"Cheese", max_quantity:100, image:None, item_type:"Food"};
const CHEESE_INST: Option<ItemInstance> = Some(ItemInstance{item:&CHEESE, quantity:32});
const SWORD: Item = Item{name:"Sword", max_quantity:0, image:None, item_type:"Weapon"};
const SWORD_INST: Option<ItemInstance> = Some(ItemInstance{item:&SWORD, quantity:0});
let mut inventory = vec![
    Slot::new(CHEESE_INST),
    Slot::new(None),
    Slot::new(None),
    Slot::new(CHEESE_INST)
];
add_to_inventory(&mut inventory, SWORD_INST.unwrap());
assert_eq!(inventory[0].item_instance().unwrap().item().name(), CHEESE.name());
assert_eq!(inventory[0].item_instance().unwrap().quant(), CHEESE_INST.unwrap().quant());
assert_eq!(inventory[1].item_instance().unwrap().item().name(), SWORD.name());
assert!(inventory[2].item_instance().is_none());
assert_eq!(inventory[3].item_instance().unwrap().item().name(), CHEESE.name());
assert_eq!(inventory[3].item_instance().unwrap().quant(), CHEESE_INST.unwrap().quant());

无运行时依赖