local CONST = require 'config.const'
local Balance = require 'config.balance'
local M = {}
-- ---------------------------------------------------------
-- 开始换装(对尸体换衣)
-- ---------------------------------------------------------
function M.start_disguise(player_unit, corpse_unit)
if not corpse_unit:has_tag('corpse') then return false end
if not player_unit:is_in_radius(corpse_unit, 2.0) then return false end
if player_unit:storage_get('is_disguising') then return false end
player_unit:storage_set('is_disguising', true)
player_unit:add_state(CONST.STATE_IMMOBILE)
player_unit:play_animation('channel', 1.0, 0, -1, false, true)
local prof = player_unit:storage_get('profession')
local dur = (prof == 'mimic') and Balance.DISGUISE_TIME_MIMIC or Balance.DISGUISE_TIME
clicli.timer.wait(dur, function()
if not player_unit:is_alive() then
player_unit:storage_set('is_disguising', false)
return
end
local Suspicion = require 'systems.suspicion'
local old_model = player_unit:storage_get('current_model')
player_unit:storage_set('previous_model', old_model)
local new_model = corpse_unit:storage_get('model_key')
if new_model then
player_unit:replace_model(new_model)
end
player_unit:storage_set('current_model', new_model)
Suspicion.set(player_unit, 0)
player_unit:remove_state(CONST.STATE_IMMOBILE)
player_unit:stop_cur_animation()
player_unit:storage_set('is_disguising', false)
-- 尸体换成旧外观(留下的"证据")
if old_model then
corpse_unit:replace_model(old_model)
corpse_unit:storage_set('model_key', old_model)
end
end)
return true
end
-- ---------------------------------------------------------
-- 玩家互动点降低怀疑值
-- ---------------------------------------------------------
function M.try_player_interact(player_unit)
local Suspicion = require 'systems.suspicion'
local pos = player_unit:get_point()
local interact_tags = {
{ tag = 'interact_bench', anim = 'sit', sus_reduce = -10, time_min = 8, time_max = 15 },
{ tag = 'interact_board', anim = 'look', sus_reduce = -8, time_min = 5, time_max = 10 },
{ tag = 'interact_well', anim = 'wash', sus_reduce = -6, time_min = 5, time_max = 8 },
{ tag = 'interact_vendor', anim = 'trade', sus_reduce = -8, time_min = 6, time_max = 12 },
}
for _, cfg in ipairs(interact_tags) do
local areas = clicli.area.get_circle_areas_by_tag(cfg.tag)
for _, area in ipairs(areas) do
if area:is_point_in_area(pos) then
player_unit:stop()
player_unit:play_animation(cfg.anim, 1.0, 0, -1, true, false)
Suspicion.add(player_unit, cfg.sus_reduce)
player_unit:storage_set('interacting', true)
local wait = math.random(cfg.time_min, cfg.time_max)
clicli.timer.wait(wait, function()
player_unit:stop_cur_animation()
player_unit:storage_set('interacting', false)
end)
return true
end
end
end
return false
end
return M