# 游戏初始化与主循环 ## main.lua — 入口 ```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 — 局状态机 ```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 — 全局时钟 ```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状态 ```