【游戏功能】
先抛一个坑:你砍出去的最强一刀,去哪了?暴击三千的天胡刀,数字蹦完就散,下一刀又是从零起算——最强的那一击在战场上没有留下任何东西。存刀纹的回答是:存起来,八秒后再砍一遍。纹成的那一刻起,你打出的每一刀都跟存着的刀比一比,重的那一记留底;每八秒,存着的那一刀原样重演,从天而降再落一次。这篇把整套模块拆开:配置表、存刀账本、回放结算、跟刀演出、定时器、调试按钮,一段一段照抄能跑。
一、效果演示:最强一刀存起来,八秒后再砍一遍
演示场点「存刀!」:一圈金纹绕着怪转起来——十六秒的存刀期。你的每一刀都比账:十点的刀留不了底,一旦蹦出比存刀重的一记,头顶"存X"金字当场改写。攒够八秒,回放钟响——存着的那一刀凭空落下,"回放-X"的大金字砸在怪脸上,金光一闪屏幕一震。十六秒里能听两回钟,第二回的回放往往比第一回更重。演示里试两笔账:只出不存的十六秒和存了回放的十六秒——同样的刀数,回放的白嫖段白得多出一整刀。存刀纹教的是攒劲:每一刀都可能是底牌,账越滚越厚。
fx-replaycut
二、底层原理:一本存刀账加一次回放结算
模块的机关是一对搭档。存刀账:纹成期的每一刀进账房比大小——比存着的重就换底,轻就过,账本里永远只留最重的一记,这个"只记最大"的设计让账本的厚度有上限,玩家瞄一眼就知道自己的底牌有多硬。回放结算:每八秒的钟点上一拍,存着的刀原样落下——回放值就是账本里的那个数,不吃加成不打折,一刀是一刀。和暴击类机制的分野在"回放的刀是你自己挣的":暴击是随机眷顾,回放是战绩兑现——你打过最重的一刀,纹替你记住并且再还一次。
回放为什么不衰减?衰减的版本第二回回放只剩七成,玩家会觉得底牌越用越薄,攒劲的劲头就泄了;原样重演的版本回放值随你的成长一路上涨——你越强,纹还你的越多,存刀才有攒头。
三、核心代码:完整模块(上·骨架)
-- @file ReplayCut.lua
-- 存刀纹 —— 最强一刀存起来,八秒后再砍一遍
local ReplayCut = {}
local CONST = {
CREST_LIFE = 16.0,
CREST_CD = 4.0,
REPLAY_GAP = 8.0,
COLOR_CUT = "#c8a838",
COLOR_DEEP = "#584810",
COLOR_GHOST = "#f4e4a8",
ZORDER_CUT = 133,
ZORDER_FX = 135,
AUTOINC_BASE = 1090000,
}
local _crestT = 0
local _replayGap = 0
local _best = 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 "RPC",
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 ReplayCut.Best()
return _best
end
四、核心代码:完整模块(下·存刀比账与回放钟)
-- 存刀比账:每一刀都比一比,重的留底
SL:RegisterLUAEvent(LUA_EVENT_MELEE_DAMAGE, "RPC_Keep", function(dmg)
if _crestT <= 0 then return 0 end
if dmg > _best then
_best = dmg
SL:TipAbove(SL:GetValue("MARK_TARGET_ID"),
"存" .. _best)
end
return 0
end)
-- 回放钟:每八秒一响,存刀原样落下
local function StrikeReplay()
if _best <= 0 then
ShowTip("还没存到刀——先打出一记重的")
return
end
local tid = SL:GetValue("MARK_TARGET_ID")
if not tid then return end
SL:ActorHurt(tid, _best)
SL:TipAbove(tid, "回放-" .. _best)
SL:PlayReplayStrikeFx(tid)
ShowTip("那一刀又回来了——回放" .. _best .. "点")
end
function ReplayCut.Cast()
if _cdLeft > 0 or _crestT > 0 then return end
local tid = SL:GetValue("MARK_TARGET_ID")
if not tid then return end
_cdLeft = CONST.CREST_CD
_crestT = CONST.CREST_LIFE
_replayGap = CONST.REPLAY_GAP
_best = 0
SafeRemove(_crestFx)
_crestFx = GUI:Layout_Create(GUI:Attach_SceneF(),
GenID("Crest"), 0, 0, 0, 0, false)
GUI:setLocalZOrder(_crestFx, CONST.ZORDER_CUT)
SL:PlayCrestUpFx(tid)
ShowTip("存刀纹开了——最强一刀,八秒一回放")
end
-- 定时器:纹成倒计时与回放钟驱动
if not _scheduler then
_scheduler = SL:Schedule(function(dt)
_cdLeft = math.max(0, _cdLeft - dt)
if _crestT > 0 then
_crestT = _crestT - dt
_replayGap = _replayGap - dt
if _replayGap <= 0 then
_replayGap = CONST.REPLAY_GAP
StrikeReplay()
end
local tid = SL:GetValue("MARK_TARGET_ID")
local tp = tid and GetActorPos(tid)
if _crestFx and tp then
GUI:setPosition(_crestFx, tp.x, tp.y - 96)
end
if _crestT <= 0 then
SafeRemove(_crestFx)
ShowTip("纹收了——最强的刀存进了下一局")
end
end
end, 0.02)
end
SL:ScheduleOnce(function()
SL:BindDebugButton("存刀", function()
ReplayCut.Cast()
end)
ShowTip("技能已加载: 存刀纹 (调试按钮触发)")
end, 1.0)
function ReplayCut.Unload()
if _scheduler then SL:Unschedule(_scheduler) end
SL:UnregisterLUAEvent(LUA_EVENT_MELEE_DAMAGE, "RPC_Keep")
SafeRemove(_crestFx)
_crestT = 0
_best = 0
end
return ReplayCut
五、机制问答
问:回放的那一刀吃当时的暴击吗?
答:不吃——回放值是存账时的定格数,落刀那一刻不再掷骰,存多少回多少,童叟无欺。
问:目标换了回放打谁?
答:打当前目标——回放认的是战场上的现任目标,存刀的人可以换,刀不认旧主。
问:纹成期一刀没出怎么办?
答:回放空转——钟照响,账本空的那一拍只给一句提示,不补刀不延期。
问:回放的刀能暴击吗?
答:能——回放值进的是基础刀位,落刀那拍照常掷暴击,天胡存刀叠天胡暴击是这套纹的传说局。
问:存刀纹能和斩残纹同开吗?
答:能——一个存你的最重一刀,一个随它的残血加成,两本账互不干扰,同时开是滚账打法的高端局。
六、调参指南与商业服怎么用
第四笔是回放的钟点:八秒一响对十六秒窗口是"两回回放"的节奏——钟太密回放比平砍还忙,太疏一场仗只听一回钟。第三笔是比账的规则:只记最大不记累计是账本的天花板——记累计的版本账本无限滚,回放变成定期提款,只记最大才叫存刀。第二笔是存刀的门槛:任何一刀都能留底是零门槛——设最低门槛的版本前期留不住账,玩家开局最虚的那几刀没有盼头。第一笔是回放的演出:金光、大字、震屏三件套要给足——回放是这套纹的招牌动作,砸得越响玩家越愿意等那口钟。常见坑三个:比账读的是加成前的底伤导致存的全是裸刀;回放结算没判目标死亡对尸体落刀;纹环跟脚在目标死亡后还钉在原地。
商业服里存刀纹是"藏锋阁"的底蕴:别人比刀快,他比刀沉——商城里纹环的样式做成品级,铜纹、银纹、鎏金纹,那圈金灿灿的纹环和钟响时砸下的大字就是藏锋阁的牌匾。运营落地还有两笔:一段是攒劲教学——教一句"重的每一刀都是底牌,别急着收",流派第一课是攒;一段是存刀榜——按单次回放的最高值排名,存得最重的人有碑。变体做成双刀存:账本存最重的两刀,回放按刀序轮着落——从一记重刀到一套连招,藏锋阁的库房越攒越满。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。
写完留一句给做战绩系的同学:存刀纹卖的是"好刀不白挥"——那圈金纹和钟响时砸下的大字,是把每一次高光时刻变成可兑现资产的第一本存折。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
接手二开的兄弟几乎都撞过同一堵墙:玩家嫌走路"一格一格像机器人",老板拍板要"丝滑移动",改服务端速度?不对。改客户端动画帧…
【游戏功能】 先看一个熟场面:法师的火球特效挂在怪的脚后跟上,明明技能说明写着"焚烧其面",火星子却在地上打滚。群里有位策划…
【游戏功能】 上周有个开服的老板在群里发了一段录屏:他的战士明明刀刀都砍中了,观众却一片"这刀挥空了吧"。他原话是"判定日志…
【游戏功能】 先说结论放在开头:怪的皮一会儿绿一会儿红,不是美术换了几套贴图,是染色系统在怪身上盖了一层"色镜"。开服群里有…
前两天群里有个架设的朋友问了个需求:中毒的人要变绿、每两秒掉一次血、毒还能叠五层,问是不是要在服务端把整套状态机重写。我说你…
【游戏功能】 先抛一个坑:五口钟一模一样大,为什么一口比一口疼?先后次序动不得吗?倒过来敲会怎样?这篇把编钟纹整套写法拆开:…