【游戏功能】
群里报过一个怪现象:同一位玩家打同一个怪,有时一刀十三有时一刀十,面板攻击力没变过——排查了半天才发现,十三的那几刀全落在一个看不见的六秒窗口里:有人先给怪挂了一层"破绽",破绽开着的时候谁的刀都加三成。这套机制就是破势令。这篇把整套模块拆开:配置表、破绽构件、增伤出口、定时器、调试按钮,一段一段照抄能跑。
一、效果演示:破绽开六秒,刀刀加三成
演示场点「破势!」:怪的胸口亮起一圈粉色的破绽环——头顶挂出"破绽 六秒"。窗口里的平砍数字从灰色的十变成粉色的十三,破绽环收拢消失的瞬间数字变回灰色的十。演示里注意看破绽环的呼吸——环在慢闪说明窗口还开着,环灭了加成也就没了。破势令的全部价值就是这六秒:自己开窗自己打是基本功,队友开窗全队打才是正确用法。
fx-breakmark
二、底层原理:一个全源读数加一个窗口判定
破势令的机关是一对搭档。全源读数:破绽挂的是目标不是来源——结算出口在扣血前查一次目标的破绽状态,开着就把所有来源的伤害乘一点三,平砍、技能、队友的刀、甚至反伤都吃这口加成,这才叫"谁打它都更疼"。窗口判定:破绽挂六秒倒计时,同目标重复挂只刷新时长不叠层——叠层的版本六个破势令轮着挂,加成乘出天际,只刷新时长的账才算得清。
和增伤乘区那些系统设计的分野在于落地位置:乘区是属性层的乘法,破势令是结算层的一次查表——加成不进面板、不进属性、只在出刀那一瞬问一句"它有破绽吗",问完就结。这种一次性的查表增伤在实现上最便宜,在设计上最干净,改起来也最安全:调三成只动一个系数,不碰任何属性管道。
三、核心代码:完整模块(上·骨架)
-- @file BreakMark.lua
-- 破势令 —— 挂一处破绽六秒,谁打它都更疼
local BreakMark = {}
local CONST = {
MARK_LIFE = 6.0,
MARK_CD = 6.0,
AMP_PCT = 0.3,
COLOR_MARK = "#c85a8a",
COLOR_DEEP = "#5e1a3a",
COLOR_GHOST = "#f0b8d0",
ZORDER_MARK = 131,
ZORDER_FX = 135,
AUTOINC_BASE = 987000,
}
local _markT = 0
local _markID = 0
local _cdLeft = 0
local _scheduler = nil
local _autoInc = 0
local function GenID(prefix)
_autoInc = _autoInc + 1
return string.format("%s_%d", prefix or "BKM",
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
local function CreateMarkFx(id)
local tp = GetActorPos(id)
if not tp then return nil end
local node = GUI:Layout_Create(GUI:Attach_SceneF(),
GenID("Mark"), tp.x, tp.y - 78, 0, 0, false)
GUI:setLocalZOrder(node, CONST.ZORDER_MARK)
GUI:DrawCircle_Create(node, "ring", 0, 0, 16,
CONST.COLOR_MARK, 2, 220)
return node
end
function BreakMark.Cast()
if _cdLeft > 0 or _markT > 0 then return end
local tid = SL:GetValue("MARK_TARGET_ID")
if not tid then return end
_cdLeft = CONST.MARK_CD
_markT = CONST.MARK_LIFE
_markID = tid
SafeRemove(_markFx)
_markFx = CreateMarkFx(tid)
SL:PlayMarkFx(tid)
SL:TipAbove(tid, "破绽!")
ShowTip("破绽挂上了——六秒里所有刀加三成")
end
四、核心代码:完整模块(下·定时器与全源增伤出口)
-- 全源增伤出口:扣血前查一次破绽
local function OnAnyDamage(tid, dmg)
if _markT > 0 and tid == _markID then
return math.floor(dmg * (1 + CONST.AMP_PCT))
end
return dmg
end
SL:RegisterLUAEvent(LUA_EVENT_BEFORE_HURT, "BKM_Amp", function(tid, dmg)
return OnAnyDamage(tid, dmg)
end)
-- 定时器:窗口倒计时与破绽守护
if not _scheduler then
_scheduler = SL:Schedule(function(dt)
_cdLeft = math.max(0, _cdLeft - dt)
if _markT > 0 then
_markT = _markT - dt
local tp = GetActorPos(_markID)
if _markFx and tp then
GUI:setPosition(_markFx, tp.x, tp.y - 78)
end
if _markT <= 0 or not tp
or SL:GetValue("ACTOR_DEAD", _markID) then
_markT = 0
SafeRemove(_markFx)
ShowTip("破绽合上了——下一张令跟上")
end
end
end, 0.02)
end
SL:ScheduleOnce(function()
SL:BindDebugButton("破势", function()
BreakMark.Cast()
end)
ShowTip("技能已加载: 破势令 (调试按钮触发)")
end, 1.0)
function BreakMark.Unload()
if _scheduler then SL:Unschedule(_scheduler) end
SL:UnregisterLUAEvent(LUA_EVENT_BEFORE_HURT, "BKM_Amp")
SafeRemove(_markFx)
end
return BreakMark
五、机制问答
问:破绽能挂两个怪吗?
答:不能——令只有一张,挂新目标旧破绽立即作废,一张令一个破绽的账最清楚,到处开花加成就乱套了。
问:破绽期反伤也加三成吗?
答:加——破绽挂的是目标不是方向,它身上冒出来的每一笔伤害都吃加成,连反伤都算,这也是破势令克制反伤怪的暗线。
问:加成和暴击怎么排序?
答:先破绽后暴击——破绽的三成乘进基础伤,暴击的倍率再乘上去,两层的乘法让破绽期的暴击刀刀见金,顺序反了玩家算不清账。
问:怪免疫控制的时候破绽还挂得上吗?
答:挂得上——破绽不是控制,免疫链挡的是眩晕定身这类动作干涉,破绽只是个记号,免疫怪照样吃满六秒。
六、调参指南与商业服怎么用
第四笔是窗口与冷却的差值:六秒窗口对六秒冷却是无缝常驻——无缝的版本破势令从"时机技"退化成"开关技",冷却改八秒留两秒真空,玩家才有"卡点开窗"的操作感。第三笔是加成的档位:三成是"感知明显、不掀桌子"的档位——五成以上的版本队友全围着破绽怪转,破势令成了团队唯一的正确答案,独尊就不是流派了。第二笔是破绽环的醒目度:环的呼吸频率要与倒计时同步——环闪三下就灭,玩家读环就能读出剩余时间,比头顶数字直观。第一笔是全源的边界:反伤吃加成要写进技能说明——说明栏不写,玩家永远以为是算法错了,工单就是这么来的。常见坑三个:破绽跟着怪的死亡没清,下一只怪出生就带着上一只的破绽;增伤出口写进属性层,破势令和增伤装备叠加乘出事故;窗口刷新上限没设,四个破势令轮挂把六秒续成永久。
商业服里破势令是"指挥流派"的第一块拼图:开窗的人指挥全队的火力节奏——商城里破绽环的颜色做成品级,绯环、金环、暗金环,开窗那一瞬间就是指挥的权杖。运营落地还有两笔:一段是团本破绽榜——按破绽期全队总伤排名,指挥玩家的价值第一次有数字可看;一段是新手教学的一句弹字——第一次挂破绽弹一句"六秒里大家都来打它",团队机制的一句话教学比一页说明管用。变体做成破绽连锁:破绽怪死亡时把破绽弹给五步内最近的怪,剩余时长减半——连锁的破绽让清怪路线有了讲究。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。
写完留一句给做增伤系的同学:破势令卖的是"它有破绽"——那圈粉色的呼吸环就是全队的集合号,环亮着,所有人的刀都该往那落。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 远程怪的箭为什么总是躲不开?因为它看得比你远——两百步外它就开弓,箭到面前你才听见风声。迷沙给的就是个土办法:…
【游戏功能】 为什么老猎人打怪总要留一手,血见三成了反而越打越小心?因为逆鳞要起了——血量压进三成线的怪会红眼:出手快一倍、…
【游戏功能】 排查一份战斗日志走到半夜:同一个怪的同一套普攻,有时十四点有时二十二点,装备、等级、面板全对不上。最后在它的状…
【游戏功能】 放风筝的怪有多气人?它永远比你快半步:你追它退,你退它射,血条磨了十分钟愣是没近过身。禁足给的就是那句解气的话…
【游戏功能】 守塔的那位老哥出过一单名场面:全队都在跑位,就他站在怪堆里一动不动——三秒后他一刀把满血怪劈掉了小半管。后来复…
【游戏功能】 明明攻击力一样,为什么有人三刀能顶别人五刀?血契的答案是:那三刀里掺着他自己的血——开契的一瞬扣六十点血,换接…