edit | blame | history | raw

游戏初始化与主循环

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状态