local CONST = require 'config.const' local M = {} local STATE = { PREPARE = 'prepare', PLAYING = 'playing', OVERTIME = 'overtime', ENDED = 'ended', } local current_state = nil function M.init() M.switch_state(STATE.PREPARE) end function M.switch_state(new_state) current_state = new_state if new_state == STATE.PREPARE then M.on_prepare() elseif new_state == STATE.PLAYING then M.on_playing() elseif new_state == STATE.OVERTIME then M.on_overtime() elseif new_state == STATE.ENDED then M.on_ended() end end function M.get_state() return current_state end -- --------------------------------------------------------- -- PREPARE:10秒准备期,玩家不可攻击 -- --------------------------------------------------------- function M.on_prepare() local NpcMgr = require 'core.npc_manager' local PlayerMgr = require 'core.player_manager' local ItemSpawner = require 'systems.item_spawner' local ModeMgr = require 'core.mode_manager' local Suspicion = require 'systems.suspicion' local Corpse = require 'systems.corpse' NpcMgr.init() PlayerMgr.init_all_players() ItemSpawner.init() ModeMgr.init() Suspicion.start() Corpse.start_discovery_scan() for _, pd in ipairs(PlayerMgr.get_all_player_units()) do pd.unit:add_state(CONST.STATE_INVINCIBLE) end clicli.timer.wait(10.0, function() local PlayerMgr2 = require 'core.player_manager' for _, pd in ipairs(PlayerMgr2.get_all_player_units()) do pd.unit:remove_state(CONST.STATE_INVINCIBLE) end M.switch_state(STATE.PLAYING) end) end -- --------------------------------------------------------- -- PLAYING:正常阶段 -- --------------------------------------------------------- function M.on_playing() local Circle = require 'systems.circle' local total = CONST.MATCH_DURATION local overtime_at = total - 60 Circle.start() clicli.timer.wait(overtime_at, function() M.switch_state(STATE.OVERTIME) end) end -- --------------------------------------------------------- -- OVERTIME:紧迫期,怀疑值增速×2,NPC减少30% -- --------------------------------------------------------- function M.on_overtime() local Suspicion = require 'systems.suspicion' local NpcMgr = require 'core.npc_manager' Suspicion.set_multiplier(2.0) NpcMgr.reduce_npc_count(0.3) clicli.timer.wait(60.0, function() M.switch_state(STATE.ENDED) end) end -- --------------------------------------------------------- -- ENDED:结算 -- --------------------------------------------------------- function M.on_ended() local Suspicion = require 'systems.suspicion' local Circle = require 'systems.circle' local PlayerMgr = require 'core.player_manager' Suspicion.stop() Circle.stop() local rankings = PlayerMgr.get_rankings() for _, pd in ipairs(rankings) do clicli.game.end_player_game(pd.player, pd.rank == 1 and '胜利' or '失败', true) end end return M