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
|