CHUAN2 DEV ENGINE
996 正版授权研发中心 · 360 授权合作教学中心 · 抖音传奇直播合作授权 · 快手推广运营商授权
OFFICIAL LICENSED ACADEMY 查验官方授权证书 →
// 威海旷世互娱教学基地 · 技术文章
进阶实战游戏功能996引擎

留情善纹:刀下留情,它念你的好

2026-10-02 00:57 作者:996 技术组 996引擎Lua教程传奇脚本进阶实战游戏功能996引擎

【游戏功能】

先抛一个坑:打不过就杀,打得过也要杀,能不能有一回不杀?五十多个机制写下来,刀刀都是奔着怪的血条去的——留情、饶命、放它一马,这些词在战斗设计里几乎绝迹。留情纹把"不杀"做成了机制:它血薄的时候你收刀留情,它记你的好——十秒里它不咬你,你慢慢回血;可你要是趁它不设防反手一刀,恩情当场变仇,它红眼五秒跟你拼命。这篇把整套模块拆开:配置表、留情门槛、记恩结算、背信判定、定时器、调试按钮,一段一段照抄能跑。

一、效果演示:刀下留情,它念你的好

演示场怪血线见红。点「留情!」:一圈粉色的柔光罩住它——十秒留情期。它收了爪,慢慢地朝后退,头顶浮着"留情"的柔字;你这边每秒回三点血,柔光就是你的回血阵。十秒恩情期满,它转身又扑——留情买的不是永远,是十秒的喘息加三十点血。你要是不守约,留情期里反手一刀——柔光当场碎裂,"恩将仇报"砸下,它红眼五秒,爪爪二十。演示里试两笔账:留情的十秒回血加免战,和硬把它砍死的输出收益——杀是快刀,留是慢账,两笔账两种活法。留情纹教的是收刀:最强的姿态不是出刀,是收得住刀。

demo
 fx-mercywave

二、底层原理:一道留情门槛加一次记恩结算

模块的机关是一对搭档。留情门槛:血线三成以下才留得住——满血留情它不领情,血薄才知刀下恩,门槛就是这份情分的斤两。记恩结算:留情成立的那一拍起它进恩情期——十秒不攻不咬慢慢退,你的回血阵跟着恩情期走;背信判定盯着你的刀——恩情期里你敢出手,恩当仇报红眼反扑。和控场类机制的分野在"留情的和平是它认账的":眩晕是它不能动,留情是它不愿动——一只记得你刀下留人的怪,比一只被定住的怪多出一分人味。

门槛为什么钉在三成?满血留情的版本留情成了万能的免战牌,见怪就留情游戏变成过家家;三成的门槛把留情做成了"刀下超度"——它得先被你打到见红,你的恩情才有分量。

三、核心代码:完整模块(上·骨架)

lua
-- @file MercyWave.lua
-- 留情善纹 —— 刀下留情,它念你的好

local MercyWave = {}

local CONST = {
    MERCY_LIFE    = 10.0,
    MERCY_CD      = 3.0,
    THRESHOLD     = 0.3,
    REGAIN_PER_S  = 3,
    RAGE_LIFE     = 5.0,

    COLOR_MERCY   = "#d888a0",
    COLOR_DEEP    = "#583038",
    COLOR_GHOST   = "#f8d0e0",

    ZORDER_MERCY  = 133,
    ZORDER_FX     = 135,
    AUTOINC_BASE  = 1133000,
}

local _mercyT    = 0
local _rageT     = 0
local _cdLeft    = 0
local _tid       = 0
local _mercyFx   = nil
local _scheduler = nil
local _autoInc   = 0

local function GenID(prefix)
    _autoInc = _autoInc + 1
    return string.format("%s_%d", prefix or "MCW",
        CONST.AUTOINC_BASE + _autoInc)
end

local function GetActorPos(id)
    if not id then return nil end
    local x = SL:GetValue("ACTOR_POSITION_X", id)
    local y = SL:GetValue("ACTOR_POSITION_Y", id)
    if not x or not y then return nil end
    return { x = x, y = y }
end

local function SafeRemove(node)
    if node and not GUI:Widget_IsNull(node) then
        GUI:removeFromParent(node)
    end
end

local function ShowTip(msg)
    if msg and msg ~= "" then SL:ShowSystemTips(msg) end
end

function MercyWave.InMercy()
    return _mercyT > 0
end

四、核心代码:完整模块(下·记恩结算与背信判定)

lua
-- 留情门槛:血薄才留,留了进恩情期
function MercyWave.Spare()
    if _cdLeft > 0 or MercyWave.InMercy() then return end
    local tid = SL:GetValue("MARK_TARGET_ID")
    if not tid then return end
    local hp = SL:GetValue("ACTOR_HP", tid) or 0
    local hpM = SL:GetValue("ACTOR_HP_MAX", tid) or 1
    if hp > hpM * CONST.THRESHOLD then
        ShowTip("它血还厚——留情要等它见红")
        return
    end
    _cdLeft = CONST.MERCY_CD
    _mercyT = CONST.MERCY_LIFE
    _tid = tid
    SL:AddBuff(tid, "MERCY_CALM", CONST.MERCY_LIFE)
    SafeRemove(_mercyFx)
    _mercyFx = GUI:Layout_Create(GUI:Attach_Scene(),
        GenID("Halo"), 0, 0, 0, 0, false)
    GUI:setLocalZOrder(_mercyFx, CONST.ZORDER_MERCY)
    SL:PlayMercyUpFx(tid)
    ShowTip("留情了——它记恩不咬,你每秒回三点")
end

-- 背信判定:恩情期里你出手,恩当仇报
SL:RegisterLUAEvent(LUA_EVENT_MELEE_HIT, "MCW_Betray", function(tid)
    if not MercyWave.InMercy() or tid ~= _tid then return 0 end
    _mercyT = 0
    SafeRemove(_mercyFx)
    _rageT = CONST.RAGE_LIFE
    SL:AddBuff(tid, "BETRAY_RAGE", CONST.RAGE_LIFE)
    SL:TipAbove(tid, "恩将仇报!")
    ShowTip("恩将仇报——它红眼五秒")
    return 0
end)

-- 定时器:恩情倒计时、回血与红眼消化
if not _scheduler then
    _scheduler = SL:Schedule(function(dt)
        _cdLeft = math.max(0, _cdLeft - dt)
        if _mercyT > 0 then
            _mercyT = _mercyT - dt
            local myID = SL:GetValue("USER_ID")
            local hp = SL:GetValue("ACTOR_HP", myID) or 0
            SL:SetValue("ACTOR_HP", myID,
                math.min(SL:GetValue("ACTOR_HP_MAX", myID),
                    hp + CONST.REGAIN_PER_S))
            if _mercyT <= 0 then
                SafeRemove(_mercyFx)
                ShowTip("恩情到期——它又不认人了")
            end
        end
        if _rageT > 0 then
            _rageT = _rageT - dt
            if _rageT <= 0 then
                ShowTip("它消气了——回到平常的爪")
            end
        end
    end, 0.02)
end

SL:ScheduleOnce(function()
    SL:BindDebugButton("留情", function()
        MercyWave.Spare()
    end)
    ShowTip("技能已加载: 留情纹 (调试按钮触发)")
end, 1.0)

function MercyWave.Unload()
    if _scheduler then SL:Unschedule(_scheduler) end
    SL:UnregisterLUAEvent(LUA_EVENT_MELEE_HIT, "MCW_Betray")
    SafeRemove(_mercyFx)
    _mercyT = 0
    _rageT = 0
end

return MercyWave

五、机制问答

问:留情的怪死了算杀生吗?
答:算——恩情期里它不还手,你的刀落下去就是背后一刀,背信判定当场触发红眼反扑,别问,问就是江湖规矩。

问:留情的十秒能续吗?
答:能——恩情期里再按一次留情,续满十秒重新计时,回血阵跟着续,长情的人可以一直留下去。

问:它退着退着退出了仇恨范围呢?
答:照留——恩情认的是它不咬你,走多远都是留情的形态,回血阵跟着它在不在场走。

问:恩将仇报的红眼能被控住吗?
答:能——红眼只是加伤不是霸体,眩晕定身照上,背信之后用控制平事不算二次背信。

问:两只怪能同时留情吗?
答:不能——恩情一次只给一只,先留的先算,想两只都留得一只到期再留一只。

六、调参指南与商业服怎么用

第四笔是门槛的位置:三成血线是情分的斤两——门槛太高留情成了见怪就留的免战牌,太低怪血薄到一爪就死留无可留,三成刚好是"打得出恩情"的位置。第三笔是回血的费率:每秒三点对十秒恩情是三十点的情分——回得太少留情不如硬拼,太多留情变成移动血泉,三点刚好是"守着它比抢血划算"的账。第二笔是背信的罚:红眼五秒刀刀二十是背信的账——罚太轻背信无成本留情变钓鱼,太重没人敢试第二刀,五秒二十刚好让背信成为真抉择。第一笔是柔光的戏:柔光、退步、柔字三段要做足——留情是整套纹的魂,光秃秃的免战状态撑不起"它念你的好"这五个字。常见坑三个:恩情期的回血在玩家满血时没有静默扣戏;背信判定漏了队友的刀导致替人背信;柔光的跟画在怪后退时拖成了长条。

商业服里留情纹是"慈悲刀"的门规:别人的刀越磨越利,他的刀学着收——商城里柔光的样式做成品级,纱光、月光、大慈悲光,那圈罩在怪身上的粉色柔光就是慈悲刀的刀鞘。运营落地还有两笔:一段是收刀教学——教一句"它见红了就是留情的时候,杀是本分留是修行",流派第一课是收得住;一段是慈悲榜——按留情的总时长排名,刀收得最稳的人有碑。变体做成放生:恩情期满它真的退场消失,还你一枚回血舍利——从留情到放生,慈悲刀的刀鞘越收越深。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。

写完留一句给做收刀系的同学:留情纹卖的是"收得住的刀才最锋利"——那圈罩着它的柔光和十秒安稳的回血阵,是把"不杀"写进战斗结算的一刀慈悲。

作者履历与出处

本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。

← 返回文章地图返回研学路径

幂尔框架 · 实战干货 · 接口调用

LATEST ARTICLES

全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →

进阶实战游戏功能

Lua自动炮台:架一个自动索敌开火

【语法算法】 上一版的炮台索敌逻辑有个隐蔽报错:炮台永远打同一个怪——即使那只怪已经死了,索敌的游标也不挪窝。追到底索敌的游…

2026-10-02 04:50 996 技术组
进阶实战游戏功能

Lua元素转换:火伤转冰伤附带减速

【语法算法】 先抛一个坑:打不完的火系怪怎么办?火抗怪火打不动,换冰系技能要切装备要换面板——切完黄花菜都凉了。元素转换的答…

2026-10-02 04:50 996 技术组
进阶实战游戏功能

Lua连锁引燃:一个着火引燃下一个

【语法算法】 上个月的事故复盘会上有个数字被念了三遍:四成——策划写的是"同伴陪疼四成",代码落下去成了"陪疼四十点",两只…

2026-10-02 04:50 996 技术组
进阶实战游戏功能

Lua弹射地垫:踩上去弹飞到空中

【语法算法】 单行代码拆解:弹射初速=-420——弹射的全部动力就这一行的负初速。负号朝上、四百二十是弹射的初速大小——踩上…

2026-10-02 04:50 996 技术组
进阶实战游戏功能

Lua时间减缓:流速减半的局部时差

【语法算法】 上一版的减速类模块全按"乘以零点五"来写,帧率无关的版本照搬了这套写法——结果高帧率机上减速效果好,低帧率机上…

2026-10-02 04:50 996 技术组
进阶实战游戏功能

Lua引力球:丢出去把怪吸过来

【语法算法】 先抛一个坑:怎么把散在四处的怪聚到一起打?逐个拉是笨办法,一个范围技又只能打一片——引力球的答案是一个会动的吸…

2026-10-02 04:50 996 技术组