local Balance = require 'config.balance'
|
|
local M = {}
|
|
local current_area = nil
|
local current_radius = nil
|
local shrink_timer = nil
|
local damage_timer = nil
|
local next_shrink_timer = nil
|
|
-- ---------------------------------------------------------
|
-- 启动
|
-- ---------------------------------------------------------
|
function M.start()
|
current_radius = Balance.CIRCLE_INIT_RADIUS
|
|
local map_area = clicli.area.get_map_area()
|
local center = map_area:get_center_point()
|
|
current_area = clicli.area.create_circle_area(center, current_radius)
|
current_area:add_tag('play_zone')
|
|
next_shrink_timer = clicli.timer.wait(Balance.CIRCLE_FIRST_SHRINK, function()
|
M.shrink()
|
end)
|
end
|
|
-- ---------------------------------------------------------
|
-- 缩圈
|
-- ---------------------------------------------------------
|
function M.shrink()
|
if not current_area then return end
|
|
local new_radius = current_radius * Balance.CIRCLE_SHRINK_RATIO
|
if new_radius < Balance.CIRCLE_MIN_RADIUS then
|
new_radius = Balance.CIRCLE_MIN_RADIUS
|
end
|
|
local delta = current_radius - new_radius
|
local steps = math.max(1, math.ceil(delta / 0.5))
|
|
shrink_timer = clicli.timer.count_loop(1.0, steps, function(timer, count)
|
current_radius = current_radius - 0.5
|
if current_radius < new_radius then
|
current_radius = new_radius
|
end
|
current_area:set_radius(current_radius)
|
end)
|
|
M.start_damage()
|
|
if current_radius > Balance.CIRCLE_MIN_RADIUS then
|
next_shrink_timer = clicli.timer.wait(Balance.CIRCLE_INTERVAL, function()
|
M.shrink()
|
end)
|
end
|
end
|
|
-- ---------------------------------------------------------
|
-- 区域外持续伤害
|
-- ---------------------------------------------------------
|
function M.start_damage()
|
if damage_timer then return end
|
|
damage_timer = clicli.timer.loop(2.0, function()
|
if not current_area then return end
|
|
local PlayerMgr = require 'core.player_manager'
|
for _, pd in ipairs(PlayerMgr.get_all_player_units()) do
|
if pd.alive then
|
local pos = pd.unit:get_point()
|
if not current_area:is_point_in_area(pos) then
|
pd.unit:add_hp(-Balance.CIRCLE_DAMAGE_PER_TICK)
|
end
|
end
|
end
|
end, '圈外伤害')
|
end
|
|
-- ---------------------------------------------------------
|
-- 停止
|
-- ---------------------------------------------------------
|
function M.stop()
|
if shrink_timer then shrink_timer:remove(); shrink_timer = nil end
|
if damage_timer then damage_timer:remove(); damage_timer = nil end
|
if next_shrink_timer then next_shrink_timer:remove(); next_shrink_timer = nil end
|
if current_area then current_area:remove(); current_area = nil end
|
end
|
|
return M
|