初始化提交
This commit is contained in:
108
Content/Lua/GamePlay/Bonefire/Storage.lua
Normal file
108
Content/Lua/GamePlay/Bonefire/Storage.lua
Normal file
@ -0,0 +1,108 @@
|
||||
-- 禁用不必要的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
|
||||
Reference in New Issue
Block a user