【游戏功能】
先抛一个坑:打不过就杀,打得过也要杀,能不能有一回不杀?五十多个机制写下来,刀刀都是奔着怪的血条去的——留情、饶命、放它一马,这些词在战斗设计里几乎绝迹。留情纹把"不杀"做成了机制:它血薄的时候你收刀留情,它记你的好——十秒里它不咬你,你慢慢回血;可你要是趁它不设防反手一刀,恩情当场变仇,它红眼五秒跟你拼命。这篇把整套模块拆开:配置表、留情门槛、记恩结算、背信判定、定时器、调试按钮,一段一段照抄能跑。
一、效果演示:刀下留情,它念你的好
演示场怪血线见红。点「留情!」:一圈粉色的柔光罩住它——十秒留情期。它收了爪,慢慢地朝后退,头顶浮着"留情"的柔字;你这边每秒回三点血,柔光就是你的回血阵。十秒恩情期满,它转身又扑——留情买的不是永远,是十秒的喘息加三十点血。你要是不守约,留情期里反手一刀——柔光当场碎裂,"恩将仇报"砸下,它红眼五秒,爪爪二十。演示里试两笔账:留情的十秒回血加免战,和硬把它砍死的输出收益——杀是快刀,留是慢账,两笔账两种活法。留情纹教的是收刀:最强的姿态不是出刀,是收得住刀。
fx-mercywave
二、底层原理:一道留情门槛加一次记恩结算
模块的机关是一对搭档。留情门槛:血线三成以下才留得住——满血留情它不领情,血薄才知刀下恩,门槛就是这份情分的斤两。记恩结算:留情成立的那一拍起它进恩情期——十秒不攻不咬慢慢退,你的回血阵跟着恩情期走;背信判定盯着你的刀——恩情期里你敢出手,恩当仇报红眼反扑。和控场类机制的分野在"留情的和平是它认账的":眩晕是它不能动,留情是它不愿动——一只记得你刀下留人的怪,比一只被定住的怪多出一分人味。
门槛为什么钉在三成?满血留情的版本留情成了万能的免战牌,见怪就留情游戏变成过家家;三成的门槛把留情做成了"刀下超度"——它得先被你打到见红,你的恩情才有分量。
三、核心代码:完整模块(上·骨架)
-- @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
四、核心代码:完整模块(下·记恩结算与背信判定)
-- 留情门槛:血薄才留,留了进恩情期
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 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【语法算法】 上一版的炮台索敌逻辑有个隐蔽报错:炮台永远打同一个怪——即使那只怪已经死了,索敌的游标也不挪窝。追到底索敌的游…
【语法算法】 先抛一个坑:打不完的火系怪怎么办?火抗怪火打不动,换冰系技能要切装备要换面板——切完黄花菜都凉了。元素转换的答…
【语法算法】 上个月的事故复盘会上有个数字被念了三遍:四成——策划写的是"同伴陪疼四成",代码落下去成了"陪疼四十点",两只…
【语法算法】 单行代码拆解:弹射初速=-420——弹射的全部动力就这一行的负初速。负号朝上、四百二十是弹射的初速大小——踩上…
【语法算法】 上一版的减速类模块全按"乘以零点五"来写,帧率无关的版本照搬了这套写法——结果高帧率机上减速效果好,低帧率机上…
【语法算法】 先抛一个坑:怎么把散在四处的怪聚到一起打?逐个拉是笨办法,一个范围技又只能打一片——引力球的答案是一个会动的吸…