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