【游戏功能】
先抛一个坑:砍出去的刀,能收回来吗?刀光落了地、数字蹦出来、血条掉了——按理说木已成舟。可玩家心里都有过那一拍懊悔:"这刀要是再重一点就好了。"悔刀纹把这拍懊悔做成了机制:纹成期里,你砍出去的最后一刀可以撤回——血条退回去,然后一点五倍的力重新砍一遍。这篇把整套模块拆开:配置表、撤回结算、重砍通道、冷却封口、定时器、调试按钮,一段一段照抄能跑。
一、效果演示:这一刀悔了,重砍更重
演示场点「悔刀!」——不对,这纹常驻着:一圈紫纹绕上玩家,十四秒的悔刀期。你平平地砍了一刀十二点,数字刚落——点「悔刀!」:十二点当场退还,怪的血条弹回去一截,半拍之后紫光一闪,"悔-18"的大字落下——一点五倍的力原刀奉还。六秒的冷却一过,又能悔下一刀。演示里试两笔账:一刀悔着砍是十二加十八的三十点总账,不悔就是十二——多出来的十八点,买的是那一拍"重来"的权利。悔刀纹教的是反悔:人生没有后悔药,纹里有。
fx-regretcut
二、底层原理:一次撤回结算加一次重砍通道
模块的机关是一对搭档。撤回结算:悔刀那一拍把最后一刀的伤害原额退还——血条弹回、数字翻成灰色、账面上那一刀等于没砍过,撤回认的是最近一刀,隔了刀的旧账不认。重砍通道:撤回的半拍之后,同额的一点五倍重新落刀——重砍是独立的一刀,走完整的命中和受伤结算,落多少算多少。和增伤类机制的分野在"悔刀的时间在刀后":增伤要在出手前挂好,悔刀是砍完之后才行使的权利——已经落地的刀还能翻案,这是整套纹的卖点也是它的全部风险。
重砍为什么定一点五倍而不是原额重来?原额重来的版本悔刀是纯重掷,砍小了就悔,机制退化成刷数字的按钮;一点五倍的版本悔一次多付五成的力——懊悔有价格,重来的每一刀都比上一刀更舍得。
三、核心代码:完整模块(上·骨架)
-- @file RegretCut.lua
-- 悔刀纹 —— 这一刀悔了,重砍更重
local RegretCut = {}
local CONST = {
CREST_LIFE = 14.0,
CREST_CD = 3.0,
REGRET_CD = 6.0,
REDO_MUL = 1.5,
REDO_DELAY = 0.35,
COLOR_REGRET = "#8878b8",
COLOR_DEEP = "#342850",
COLOR_GHOST = "#d0c8f0",
ZORDER_REGRET = 133,
ZORDER_FX = 135,
AUTOINC_BASE = 1098000,
}
local _crestT = 0
local _regretCd = 0
local _lastDmg = 0
local _cdLeft = 0
local _crestFx = nil
local _scheduler = nil
local _autoInc = 0
local function GenID(prefix)
_autoInc = _autoInc + 1
return string.format("%s_%d", prefix or "RGC",
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 RegretCut.LastDmg()
return _lastDmg
end
四、核心代码:完整模块(下·撤回与重砍)
-- 记刀:纹成期里每一刀都留底,供悔刀翻账
SL:RegisterLUAEvent(LUA_EVENT_MELEE_DAMAGE, "RGC_Keep", function(dmg)
if _crestT <= 0 then return 0 end
_lastDmg = dmg
return 0
end)
function RegretCut.Regret()
if _regretCd > 0 then
ShowTip("刀还没稳——" ..
string.format("%.1f", _regretCd) .. "秒")
return
end
if _lastDmg <= 0 then
ShowTip("还没有刀可悔——先砍一刀")
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 0
SL:SetValue("ACTOR_HP", tid,
math.min(hpM, hp + _lastDmg))
SL:TipAbove(tid, "+" .. _lastDmg .. " 撤")
_regretCd = CONST.REGRET_CD
local redo = math.floor(_lastDmg * CONST.REDO_MUL)
SL:ScheduleOnce(function()
local hp2 = SL:GetValue("ACTOR_HP", tid) or 0
SL:SetValue("ACTOR_HP", tid, math.max(0, hp2 - redo))
SL:TipAbove(tid, "悔-" .. redo)
SL:PlayRegretFx(tid)
ShowTip("悔刀重砍——" .. redo .. "点入账")
end, CONST.REDO_DELAY)
end
function RegretCut.Cast()
if _cdLeft > 0 or _crestT > 0 then return end
local myID = SL:GetValue("USER_ID")
_cdLeft = CONST.CREST_CD
_crestT = CONST.CREST_LIFE
_lastDmg = 0
SafeRemove(_crestFx)
_crestFx = GUI:Layout_Create(GUI:Attach_SceneF(),
GenID("Crest"), 0, 0, 0, 0, false)
GUI:setLocalZOrder(_crestFx, CONST.ZORDER_REGRET)
SL:PlayRegretUpFx(myID)
ShowTip("悔刀纹开了——最后一刀可撤回,重砍一点五倍")
end
-- 定时器:双冷却与纹环跟画
if not _scheduler then
_scheduler = SL:Schedule(function(dt)
_cdLeft = math.max(0, _cdLeft - dt)
_regretCd = math.max(0, _regretCd - dt)
if _crestT > 0 then
_crestT = _crestT - dt
local myID = SL:GetValue("USER_ID")
local mp = GetActorPos(myID)
if _crestFx and mp then
GUI:setPosition(_crestFx, mp.x, mp.y - 62)
end
if _crestT <= 0 then
SafeRemove(_crestFx)
ShowTip("纹收了——砍出去的刀悔不了了")
end
end
end, 0.02)
end
SL:ScheduleOnce(function()
SL:BindDebugButton("悔刀", function()
RegretCut.Regret()
end)
ShowTip("技能已加载: 悔刀纹 (调试按钮触发)")
end, 1.0)
function RegretCut.Unload()
if _scheduler then SL:Unschedule(_scheduler) end
SL:UnregisterLUAEvent(LUA_EVENT_MELEE_DAMAGE, "RGC_Keep")
SafeRemove(_crestFx)
_crestT = 0
_lastDmg = 0
end
return RegretCut
五、机制问答
问:撤回的血能把怪奶回满吗?
答:退到上限封口——撤回认的是最后一刀的额度,退回的血最多把血条填满,多出的部分就地蒸发。
问:连着悔两刀行吗?
答:行——六秒冷却一过就能悔下一刀,但悔刀只认最近一刀,上一刀没悔就砍了下一刀,旧账自动作废。
问:重砍那一刀能暴击吗?
答:能——重砍走完整的出手结算,暴击照掷,悔一刀出个暴击是这套纹的还魂时刻。
问:悔刀能救快死的怪吗?
答:能但不值——撤回把怪奶回一口,重砍一点五倍又打回去,一来一回净赚五成力,救怪只是顺带。
问:纹收了还能悔纹期内最后一刀吗?
答:不能——纹收账清,悔刀的权利跟着纹走,纹期外的刀纹管不着。
六、调参指南与商业服怎么用
第四笔是重砍的倍率:一点五倍是懊悔的定价——原额重来的版本悔刀变成重掷骰子,两倍的版本一刀拆两刀输出翻倍,一点五倍刚好是"舍得再付一成半力"的心理位。第三笔是冷却的节奏:六秒对一点四秒一刀是"四五刀悔一回"的频率——冷却太短每一刀都悔输出账乱套,太长一局悔不了一回,机制存在感归零。第二笔是撤回的边界:只认最近一刀是账本的铁律——能翻旧账的版本三刀前的老账都翻出来,撤回就成了回血挂。第一笔是两段演出的节奏:退血灰字和重砍紫光之间留半拍——半拍的呼吸感让"撤回"和"重砍"读起来是两个动作,一气呵成的版本玩家分不清悔没悔。常见坑三个:撤回的退血把怪退过了上限上限账溢出;重砍结算没判目标死亡对尸体补刀;冷却和纹成的双计时器互相顶了账。
商业服里悔刀纹是"回头崖"的门风:别人的刀出去就收不回,他的刀带保修——商城里纹环的样式做成品级,青布纹、紫檀纹、回魂纹,那圈紫纹和重砍时的大字就是回头崖的界碑。运营落地还有两笔:一段是惜刀教学——教一句"小刀别悔,留给大刀",流派第一课是识货;一段是还魂榜——按单次悔刀重砍的最高伤害排名,悔得最值的人有碑。变体做成连环悔:重砍的刀还能再悔一次——从一悔到连悔,回头崖的路越走越远。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。
写完留一句给做撤销系的同学:悔刀纹卖的是"这一刀还能重来"——那半拍的退血和一点五倍的紫光大字,是把落地的伤害从定局改成草稿的第一块橡皮。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
接手二开的兄弟几乎都撞过同一堵墙:玩家嫌走路"一格一格像机器人",老板拍板要"丝滑移动",改服务端速度?不对。改客户端动画帧…
【游戏功能】 先看一个熟场面:法师的火球特效挂在怪的脚后跟上,明明技能说明写着"焚烧其面",火星子却在地上打滚。群里有位策划…
【游戏功能】 上周有个开服的老板在群里发了一段录屏:他的战士明明刀刀都砍中了,观众却一片"这刀挥空了吧"。他原话是"判定日志…
【游戏功能】 先说结论放在开头:怪的皮一会儿绿一会儿红,不是美术换了几套贴图,是染色系统在怪身上盖了一层"色镜"。开服群里有…
前两天群里有个架设的朋友问了个需求:中毒的人要变绿、每两秒掉一次血、毒还能叠五层,问是不是要在服务端把整套状态机重写。我说你…
【游戏功能】 先抛一个坑:五口钟一模一样大,为什么一口比一口疼?先后次序动不得吗?倒过来敲会怎样?这篇把编钟纹整套写法拆开:…