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