【游戏功能】
策划群里炸过一口锅:新副本的 Boss 有个狂化变身,设计上是无解强化,结果开荒队里一个带净化诀的玩家一符把它净回了原形,全服首杀比预期早了三天。复盘的结论写进了规范:驱散必须分类,不是头顶带图标的都归净化管。借这个事故,把净化诀整套拆开聊。
一、中毒、积毒、净化三段拉扯
净化诀的对手是时间。狼怪隔着三秒喷一口毒火,玩家中招的瞬间身上挂上两个槽位:一个红色火字图标,五秒灼烧,每秒掉五滴血,绿点毒雾从身上一缕缕往上飘;一个蓝色缓字图标,走路慢半拍。血条以肉眼可见的速度往下爬——毒必须让玩家"疼得看见",图标亮起、倒计时标着、血线在掉,三样齐了玩家才会想找解药。净化诀就是那个解药:按下的一瞬一道紫环从脚下荡开,身上的图标碎成光屑,毒雾散尽,飘字"净化!"——清得越狠,爽感越足。但真正让这套玩法立起来的是净化之后那一秒:紫环还在身上转,狼怪的毒火再次喷到身上,只飘一个灰字"抵抗",图标不上身。这一秒的护体是净化的牙齿,没有它,毒火三秒一喷、净化两秒一转,玩家永远在还债;有了它,节奏变成"中招—净化—一秒安全窗—再中招",玩家开始算拍子。
槽位图标是这套玩法的语言,画法上要守三条:图标带倒计时,数字贴在图标上沿,毒还剩几秒一目了然;按挂上的顺序排,新毒排右边,玩家扫一眼就知道身上的账;图标要小而糙不要大而精,十六像素见方,挤在血条边上不抢视线——它是状态,不是海报。毒雾往上飘的粒子同样要克制,每秒几缕、淡淡的红色,密度刚好让玩家用余光确认"还在掉血",密了就成了烟花,稀了就读不出状态——粒子是状态的呼吸,不是特效的堆料。
完整演示在这——先吃它一口毒火,图标亮起时点「净化!」:
fx-cleanse
二、幂尔框架实现:槽位遍历与驱散过滤
幂尔框架里玩家身上挂着一个减益槽位数组,净化做的就是一个带过滤的遍历:
local Cleanse = {}
local IMMUNE = 1
function Cleanse.Cast()
SL:PlayActorAct("player", "cast")
SL:ScheduleOnce(function()
local slots = SL:GetDebuffs("player") -- 槽位数组: 图标的源头
local cleared = 0
for i = #slots, 1, -1 do
local d = slots[i]
if d.dispellable then -- 可驱散标记: 事故的答案
SL:RemoveDebuff(d.id)
SL:ShatterSlotIcon(d.id) -- 图标碎裂: 清除的反馈
cleared = cleared + 1
end
end
SL:AddModifier("player", "debuff_immune", IMMUNE)
SL:RingWave("player", 40, "purple_ring")
if cleared > 0 then
SL:ShowTipAbove("player", "净化! x" .. cleared)
else
SL:ShowTipAbove("player", "身上本就干净")
end
end, 0.26)
end
local function onDebuffApply(target, debuff)
if SL:HasModifier(target, "debuff_immune") then
SL:ShowTipAbove(target, "抵抗") -- 免疫窗: 抵抗不上身
return false
end
return true
end
SL:On("debuff_apply", onDebuffApply)
SL:RegClick("cleanse", Cleanse.Cast)
return Cleanse
Boss 狂化被净掉的事故,答案就在 dispellable 这个字段:狂化、变身这类"阶段转换"压根不该进减益槽位,或者进去也要把标记关掉——净化遍历时一行过滤就把设计意图守住了。
槽位遍历倒着走是删表的老规矩:边遍历边删除,正着走会跳项,倒着走不会。RemoveDebuff 只删数据和图标,毒雾粒子由灼烧自己的 Tick 发现毒没了自动停——净化只管摘牌,不管收摊,各模块清各模块的尾巴。debuff_apply 事件返回假值拦下上身的写法,把"抵抗"做在了挂载的门口:免疫窗内毒火照喷、粒子照飞,只是图标不上、账不记——抵抗是没上车,不是下了车,这两种表现差着一整个反馈层级,混了玩家就会在免疫窗里白白再按一次净化。
三、免疫窗与净化的代价
净化后的一秒免疫不是白送的仁慈,它是整个玩法的节拍器:毒火三秒一喷、净化冷却两秒、免疫一秒,三个数咬合出"最多连清、不能躺赢"的节奏。免疫窗的反馈要做足:紫环在身上转的这一秒,抵抗灰字每飘一次都在告诉玩家"护体还管用",环散的瞬间毒火再上身,玩家立刻明白窗口关了。槽位图标的账也要清白:图标上带倒计时、按挂上顺序排列,净化的"x2"飘字告诉玩家一符扫了几个——扫得越多越爽,这份爽反过来教玩家"攒一波再净"是亏的,毒是按秒扣血的。还有一条容易被漏掉的边界:净化本身是招,要进公共冷却、要被沉默打断——按下净化后 0.26 秒的施法延迟就是这段招式的前摇,狼怪的毒火恰好在净化的半途喷到,毒照样上身,玩家才明白净化也要挑时机。驱散类技能的设计高度,全看它把"哪些能驱、哪些不能"这条线画得多清楚:线画清了,玩家学的是判断;线糊了,玩家学的是举报。
把可驱散的边界再划细一点:减益类——灼烧、减速、破防、迷眼,一律可驱,这是净化的本职;增益偷取类——怪给玩家挂的"易伤"标记,可驱,但驱掉时飘的字是"驱散"不是"净化",账分开记;阶段转换类——狂化、变身、无敌帧,绝不可驱,要么压根不进槽位、要么进去也把标记关死,那口三天早首杀的锅就背在这里;环境类——地上的火圈毒圈,不进槽位,净化扫不到地面,该走位还得走位。清单立好还有一层收益:玩家看到图标就知道这一符管不管用,净化的价值感来自"管得准"而不是"管得宽"——一个什么都扫的净化,最后会被策划逼着加内载,被玩家逼着加说明,两头不讨好。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 控制技能的镜像问题是:锁住了怪,自己是不是也闲着?影锁把这道两难摆上台面:影锁四秒,它动不了、你也动不了——它…
【游戏功能】 打断为什么只有"清读条"一种?震魂偏要反过来——不清招、不断势,打在它读条半途的那一劲顺着招震进腑——中劲十秒…
【游戏功能】 蜂群为什么总是一只一只出?蜂王偏要让它们进化:放一只蜂王出来,杀掉小怪喂它——喂三只升一阶,三阶蜂王的毒刺一秒…
【游戏功能】 技能为什么总是不扣自己的血?血刃偏要反着来:开着血刃的每一刀先扣自己二血、命中回三血——净赚一但要打得中,空刀…
【游戏功能】 bn.t = bn.t - dt ——一行旗面倒计时的代码,撑起了破军旗全部的紧迫感:旗立三秒、圈内加攻三成,…
【游戏功能】 淬毒为什么要一毒到底?淬毒刃偏要一层一层叠:一刀淬一层毒、毒层一秒六地烂,六层封顶之后一刀下去毒伤三十六——叠…