108 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| -- 禁用不必要的if诊断警告
 | |
| ---@diagnostic disable: unnecessary-if
 | |
| 
 | |
| -- 导入基类模块
 | |
| local PWClass = require("Core.PWClass")
 | |
| 
 | |
| --- @class StorageClass
 | |
| --- @field max_capacity number 最大容量(格子总数)
 | |
| --- @field cur_capacity number 当前已用容量
 | |
| --- @field grids_list table[] 存储格子列表
 | |
| local StorageClass = PWClass.derive("StorageClass")
 | |
| 
 | |
| --- 创建新物品格子
 | |
| --- @param item_id any 物品唯一标识
 | |
| --- @return table 新创建的物品格子
 | |
| local function CreateGrid(item_id)
 | |
|     return {
 | |
|         item_id = item_id,  -- 物品ID
 | |
|         cur_cnt = 0,        -- 当前数量
 | |
|         max_cnt = 1         -- 最大堆叠数(可扩展为配置项)
 | |
|     }
 | |
| end
 | |
| 
 | |
| --- 查找或创建可用物品格子
 | |
| --- @param storage StorageClass 存储实例
 | |
| --- @param item_id any 目标物品ID
 | |
| --- @return table 可用格子(找不到时创建新格子)
 | |
| local function FindOrCreateAvailableGrid(storage, item_id)
 | |
|     -- 优先查找同类型且未满的格子
 | |
|     for _, grid in ipairs(storage.grids_list) do
 | |
|         if grid.item_id == item_id and grid.cur_cnt < grid.max_cnt then
 | |
|             return grid
 | |
|         end
 | |
|     end
 | |
| 
 | |
|     -- 无可用格子时创建新的物品类型格子
 | |
|     local new_grid = CreateGrid(item_id)
 | |
|     table.insert(storage.grids_list, new_grid)
 | |
|     return new_grid
 | |
| end
 | |
| 
 | |
| --- 构造函数
 | |
| function StorageClass:ctor()
 | |
|     self.max_capacity = 10     -- 默认最大容量
 | |
|     self.cur_capacity = 0      -- 当前使用容量
 | |
|     self.grids_list = {}       -- 格子容器
 | |
| end
 | |
| 
 | |
| --- 设置存储容量上限
 | |
| --- @param capacity number 新的最大容量
 | |
| function StorageClass:SetMaxCapacity(capacity)
 | |
|     self.max_capacity = capacity
 | |
| end
 | |
| 
 | |
| --- 存储物品
 | |
| --- @param item_id any 要存储的物品ID
 | |
| function StorageClass:Store(item_id)
 | |
|     -- 容量检查
 | |
|     if self.cur_capacity >= self.max_capacity then
 | |
|         return false  -- 建议返回操作结果
 | |
|     end
 | |
| 
 | |
|     local grid = FindOrCreateAvailableGrid(self, item_id)
 | |
|     grid.cur_cnt = grid.cur_cnt + 1
 | |
|     self.cur_capacity = self.cur_capacity + 1
 | |
|     return true  -- 建议添加返回值
 | |
| end
 | |
| 
 | |
| --- 取出物品
 | |
| --- @param item_id any 目标物品ID
 | |
| --- @return boolean 是否成功取出
 | |
| function StorageClass:Withdraw(item_id)
 | |
|     -- 逆序遍历提高取出效率(通常新物品在末尾)
 | |
|     for i = #self.grids_list, 1, -1 do
 | |
|         local grid = self.grids_list[i]
 | |
|         if grid ~= nil and grid.item_id == item_id and grid.cur_cnt > 0 then
 | |
|             grid.cur_cnt = grid.cur_cnt - 1
 | |
|             self.cur_capacity = self.cur_capacity - 1
 | |
| 
 | |
|             -- 清空空格子
 | |
|             if grid.cur_cnt == 0 then
 | |
|                 table.remove(self.grids_list, i)
 | |
|             end
 | |
|             return true
 | |
|         end
 | |
|     end
 | |
|     return false
 | |
| end
 | |
| 
 | |
| function StorageClass:Visit(vistor)
 | |
|     for _, grid in ipairs(self.grids_list) do vistor(_, grid) end
 | |
| end
 | |
| 
 | |
| --- 查询物品(满足条件的物品及数量)
 | |
| --- @param query_function fun(item_id:any):boolean 物品过滤函数
 | |
| --- @return table 物品ID到数量的映射表
 | |
| function StorageClass:QueryItem(query_function)
 | |
|     local items = {}
 | |
|     for _, grid in ipairs(self.grids_list) do
 | |
|         -- 仅统计有物品且满足查询条件的格子
 | |
|         if grid.cur_cnt > 0 and query_function(grid.item_id) then
 | |
|             items[grid.item_id] = (items[grid.item_id] or 0) + grid.cur_cnt
 | |
|         end
 | |
|     end
 | |
|     return items
 | |
| end
 | |
| 
 | |
| return StorageClass |