#inventory #item #game #inventory-system

inv-sys

一个简单而有效的游戏库存系统

10个版本 (6个稳定版)

1.4.1 2021年12月16日
1.3.0 2021年12月5日
0.2.2 2021年11月28日
0.1.2 2021年11月28日
0.1.1 2021年2月5日

游戏开发 中排名第 493

每月下载量 27

MIT/Apache

19KB
552

inv-sys

Latest Release Documentation

一个强大而有效的游戏库存系统。

功能

  • 简单但强大的API
  • 自动堆叠功能
  • 取堆
  • 查找槽位
  • 迭代器
  • 通过特质设置最大堆叠大小
  • 排序
  • 等等!

用法

#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub enum Item {
  Apple,
  Banana,
  Mango,
  Peach,
  Orange
}

/* 
* Implement the Stacksize trait for 
* your type that will act as your Item
*/
impl Stacksize for Item {
  fn get_max_stacksize(&self) -> usize {
    3
  }
}

fn main() {
  let mut inv = Inv::<Item>::new(32);

  // cant be placed, slot out of bounds
  assert_eq!(
    inv.stack_at(
      666, ItemStack::new(Item::Peach, 1)
    ),
    Err(InvAccessErr::SlotOutOfBounds)
  );

  // overflow, which is returned to you
  assert_eq!(
    inv.stack_at(
      2, ItemStack::new(Item::Apple, 4)
    ),
    Ok(Err(
      StackErr::StackSizeOverflow(
        ItemStack::new(Item::Apple, 1)
      )
    ))
  );

  // stack Banana at pos 1
  inv.stack_at(
    1, ItemStack::new(Item::Banana, 1)
  ).ok();
  
  // item cant be stacked, 
  // item type does not match (Banana != Orange)
  assert_eq!(
    inv.stack_at(
      1, ItemStack::new(Item::Orange, 1)
    ),
    Ok(Err(
      StackErr::ItemTypeDoesNotMatch(
        ItemStack::new(Item::Orange, 1)
      )
    ))
  );

  // auto stacking
  // this first fills slot 1 to be at the max of 3
  // since slot 1 already had 1 Banana in it
  // the leftover will be placed in the first available slot,
  // which, in this case, is 0
  assert!(
    inv.auto_stack(
      ItemStack::new(Item::Banana, 3)
    ).is_ok()
  );

  // 1 Banana, 3 Bananas
  assert_eq!(
    inv.get_slot(0), 
    Ok(&Slot::new(ItemStack::new(Item::Banana, 1)))
  );
  assert_eq!(
    inv.get_slot(1), 
    Ok(&Slot::new(ItemStack::new(Item::Banana, 3)))
  );

  // you can take a stack out of its slot
  // first, we place 2 Mangos at slot 5
  inv.stack_at(5, ItemStack::new(Item::Mango, 1)).ok();
  inv.auto_stack(ItemStack::new(Item::Mango, 1)).ok();

  // now we just take the stack
  assert_eq!(
    inv.take_stack(5), 
    Ok(ItemStack::new(Item::Mango, 2))
  );

  // slot 5 is empty now
  assert_eq!(
    inv.take_stack(5), 
    Err(InvAccessErr::SlotEmpty)
  );
}

您可以查看单元测试以获取更多示例。

待办事项

  • 排序
  • 有任何请求?请只需提交一个问题,谢谢!

贡献

请随意提交一个说明可能的改进或更改的问题/PR。

帮助

此外,当需要时,请不要犹豫,提交一个问题。我很乐意提供帮助!

无运行时依赖项