游戏初始化与主循环
main.lua — 入口
local GameManager = require 'core.game_manager'
local PlayerMgr = require 'core.player_manager'
local NpcMgr = require 'core.npc_manager'
local ModeMgr = require 'core.mode_manager'
local ItemSpawner = require 'systems.item_spawner'
local Suspicion = require 'systems.suspicion'
local Circle = require 'systems.circle'
local TimerMgr = require 'core.timer_manager'
y3.game:event('游戏-初始化', function(trg, data)
-- 同步随机数种子
local seed = os.time()
y3.game.set_random_seed(seed)
GameManager.init()
end)
game_manager.lua — 局状态机
local M = {}
local STATE = {
PREPARE = 'prepare',
PLAYING = 'playing',
OVERTIME = 'overtime',
ENDED = 'ended',
}
local current_state = nil
local state_timer = 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()
NpcMgr.init()
PlayerMgr.init_all_players()
ItemSpawner.init()
ModeMgr.init()
Suspicion.start()
-- 标记所有玩家单位为不可攻击
for _, pu in ipairs(PlayerMgr.get_all_player_units()) do
pu.unit:add_state(CONST.STATE_INVINCIBLE)
end
y3.timer.wait(10.0, function()
for _, pu in ipairs(PlayerMgr.get_all_player_units()) do
pu.unit:remove_state(CONST.STATE_INVINCIBLE)
end
M.switch_state(STATE.PLAYING)
end)
end
-----------------------------------------------------------
-- PLAYING:正常阶段
-----------------------------------------------------------
function M.on_playing()
local total = CONST.MATCH_DURATION -- 如480秒(8分钟)
local overtime_at = total - 60 -- 最后60秒进入OVERTIME
Circle.start() -- 启动缩圈计时
y3.timer.wait(overtime_at, function()
M.switch_state(STATE.OVERTIME)
end)
end
-----------------------------------------------------------
-- OVERTIME:紧迫期
-----------------------------------------------------------
function M.on_overtime()
Suspicion.set_multiplier(2.0)
NpcMgr.reduce_npc_count(0.3) -- 移除30%NPC
y3.timer.wait(60.0, function()
M.switch_state(STATE.ENDED)
end)
end
-----------------------------------------------------------
-- ENDED:结算
-----------------------------------------------------------
function M.on_ended()
Suspicion.stop()
Circle.stop()
local rankings = PlayerMgr.get_rankings()
-- 对每个玩家显示结算
for _, p in ipairs(rankings) do
y3.game.end_player_game(p.player, p.rank == 1 and '胜利' or '失败', true)
end
end
return M
timer_manager.lua — 全局时钟
local M = {}
local match_timer = nil
local elapsed = 0
function M.start(duration)
elapsed = 0
match_timer = y3.timer.loop(1.0, function(timer, count)
elapsed = count
-- 可在此广播剩余时间给UI
end, '全局秒表')
end
function M.get_elapsed()
return elapsed
end
function M.stop()
if match_timer then
match_timer:remove()
match_timer = nil
end
end
return M
初始化时序图
游戏-初始化事件触发
│
├─ set_random_seed() -- 同步随机种子
├─ NpcMgr.init() -- 生成所有NPC
│ ├─ 读取地图上的NPC出生点(Point)
│ ├─ 读取Road路径
│ └─ 创建NPC单位 + 分配路径
├─ PlayerMgr.init_all_players() -- 为每位玩家创建英雄单位
│ ├─ 获取所有已加入的Player
│ ├─ 在随机出生点创建单位
│ ├─ 分配随机NPC模型(伪装)
│ └─ 赋予职业技能
├─ ItemSpawner.init() -- 在所有刷新点生成初始物品
├─ ModeMgr.init() -- 根据gamemode.json读取模式
│ └─ 设置阵营关系(如有队伍)
├─ Suspicion.start() -- 启动怀疑值每秒循环
└─ 准备期10秒倒计时
└─ 结束 → 进入PLAYING状态