-- =========================================================
-- Killer - 多人潜行刺杀游戏
-- 入口脚本:注册游戏初始化事件,串联所有模块
-- =========================================================
-- 预加载所有模块
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 TimerMgr = require 'core.timer_manager'
local Suspicion = require 'systems.suspicion'
local Disguise = require 'systems.disguise'
local Corpse = require 'systems.corpse'
local Assassination = require 'systems.assassination'
local ItemSpawner = require 'systems.item_spawner'
local Circle = require 'systems.circle'
local NpcBehavior = require 'ai.npc_behavior'
local HUD = require 'ui.hud'
local ProfBase = require 'profession.base'
-- 加载所有职业(注册到 base 中)
require 'profession.shadow_blade'
require 'profession.mimic'
require 'profession.eagle_eye'
require 'profession.surgeon'
require 'profession.phantom'
require 'profession.hound'
-- =========================================================
-- 游戏初始化
-- =========================================================
clicli.game:event('游戏-初始化', function(trg, data)
local seed = os.time()
clicli.game.set_random_seed(seed)
TimerMgr.start()
GameManager.init()
NpcBehavior.start()
HUD.start()
end)
-- =========================================================
-- 全局事件注册
-- =========================================================
-- 单位死亡事件
clicli.game:event('游戏-初始化', function()
clicli.game:subscribe_event('单位-死亡', function(trg, data)
local dead = data.dead_unit
local killer = data.killer_unit
if dead and dead:has_tag('player_controlled') then
PlayerMgr.on_player_killed(killer, dead)
end
end)
end)
-- 职业技能施法事件
clicli.game:event('游戏-初始化', function()
clicli.game:subscribe_event('技能-施法开始', function(trg, data)
local unit = data.unit
if unit and unit:has_tag('player_controlled') then
ProfBase.on_ability_cast(unit, data.ability)
end
end)
end)
-- =========================================================
-- 玩家输入事件(键盘按键映射)
-- =========================================================
clicli.game:event('游戏-初始化', function()
-- 刺杀键 (示例绑定)
clicli.game:subscribe_event('键盘-按下', function(trg, data)
local player = data.player
if not player then return end
local pd = nil
for _, p in ipairs(PlayerMgr.get_all_player_units()) do
if p.player == player then pd = p; break end
end
if not pd or not pd.alive then return end
local key = data.key
-- F键:刺杀最近目标
if key == 'F' then
local area = clicli.area.create_circle_area(pd.unit:get_point(), 3.0)
local nearby = area:get_all_unit_in_area()
area:remove()
local best_target = nil
for _, u in ipairs(nearby) do
if u ~= pd.unit and u:is_alive() then
best_target = u
break
end
end
if best_target then
Assassination.attempt(pd.unit, best_target)
end
-- E键:互动/换装/藏尸
elseif key == 'E' then
-- 优先尝试藏尸
if pd.unit:storage_get('is_dragging') then
if not Corpse.try_hide(pd.unit) then
Corpse.drop_corpse(pd.unit)
end
return
end
-- 尝试换装(对附近尸体)
local area = clicli.area.create_circle_area(pd.unit:get_point(), 2.5)
local nearby = area:get_all_unit_in_area()
area:remove()
for _, u in ipairs(nearby) do
if u:has_tag('corpse') and not u:has_tag('hidden') then
if Disguise.start_disguise(pd.unit, u) then
return
end
end
end
-- 尝试互动点
Disguise.try_player_interact(pd.unit)
-- G键:拖拽尸体
elseif key == 'G' then
if pd.unit:storage_get('is_dragging') then
Corpse.drop_corpse(pd.unit)
else
local area = clicli.area.create_circle_area(pd.unit:get_point(), 2.5)
local nearby = area:get_all_unit_in_area()
area:remove()
for _, u in ipairs(nearby) do
if u:has_tag('corpse') and not u:has_tag('hidden') then
if Corpse.start_drag(pd.unit, u) then
break
end
end
end
end
end
end)
end)