local CONST = require 'config.const'
|
local Balance = require 'config.balance'
|
|
local M = {}
|
|
local spawn_points = {}
|
|
local ITEM_POOL = {
|
{ key = CONST.ITEM_POISON, weight = 15 },
|
{ key = CONST.ITEM_KNIFE, weight = 10 },
|
{ key = CONST.ITEM_ARMOR, weight = 15 },
|
{ key = CONST.ITEM_SMOKE, weight = 15 },
|
{ key = CONST.ITEM_MASK, weight = 8 },
|
{ key = CONST.ITEM_TRACKER, weight = 15 },
|
{ key = CONST.ITEM_SILENCER, weight = 10 },
|
{ key = CONST.ITEM_JAMMER, weight = 12 },
|
}
|
|
-- ---------------------------------------------------------
|
-- 初始化
|
-- ---------------------------------------------------------
|
function M.init()
|
local areas = clicli.area.get_circle_areas_by_tag('item_spawn')
|
for _, area in ipairs(areas) do
|
local sp = {
|
area = area,
|
current_item = nil,
|
respawn_timer = nil,
|
}
|
M.spawn_item(sp)
|
table.insert(spawn_points, sp)
|
end
|
|
clicli.game:subscribe_event('单位-获得物品', function(trg, data)
|
local unit = data.unit
|
if unit and unit:has_tag('player_controlled') then
|
local Suspicion = require 'systems.suspicion'
|
Suspicion.add(unit, 3)
|
|
M.on_item_picked_by_unit(data.item)
|
end
|
end)
|
end
|
|
-- ---------------------------------------------------------
|
-- 在刷新点生成物品
|
-- ---------------------------------------------------------
|
function M.spawn_item(sp)
|
local item_key = M.roll_item()
|
local pos = sp.area:get_center_point()
|
local item = clicli.item.create_item(pos, item_key)
|
sp.current_item = item
|
end
|
|
-- ---------------------------------------------------------
|
-- 物品权重随机
|
-- ---------------------------------------------------------
|
function M.roll_item()
|
local total = 0
|
for _, e in ipairs(ITEM_POOL) do
|
total = total + e.weight
|
end
|
local r = math.random(total)
|
local acc = 0
|
for _, e in ipairs(ITEM_POOL) do
|
acc = acc + e.weight
|
if r <= acc then return e.key end
|
end
|
return ITEM_POOL[1].key
|
end
|
|
-- ---------------------------------------------------------
|
-- 被拾取后,找到对应刷新点并开始刷新倒计时
|
-- ---------------------------------------------------------
|
function M.on_item_picked_by_unit(item)
|
for _, sp in ipairs(spawn_points) do
|
if sp.current_item == item then
|
M.on_item_picked(sp)
|
break
|
end
|
end
|
end
|
|
function M.on_item_picked(sp)
|
sp.current_item = nil
|
local delay = Balance.ITEM_RESPAWN_TIME
|
|
local GameMgr = require 'core.game_manager'
|
if GameMgr.get_state() == 'overtime' then
|
delay = delay * 0.5
|
end
|
|
sp.respawn_timer = clicli.timer.wait(delay, function()
|
M.spawn_item(sp)
|
end)
|
end
|
|
return M
|