【游戏功能】
数值群凌晨炸出一条报错:attempt to perform arithmetic on a boolean value,紧挨着它的战斗日志里,同一个怪身上飘出过两个不一样的受击数字——一样的刀、一样的怪,二十七和二十。追了半宿才发现是血印的存法出了内讧:一边把易伤存成布尔量"有印没印",另一边按层数去读,拿到 true 当乘数,当场翻车。修这口锅的时候,把血印咒这套易伤机制从头到脚捋了一遍。
一、烙印、加深、印消三段窗口
血印咒的循环三段。烙印:玩家掐诀甩出一枚紫红双色的印,咬在狼怪胸口烙成六角印纹——紫线勾边、红线贯穿,印纹随着剩余时间微微晃动,这是挂给全场看的"它现在脆"的告示。加深:印在的六秒里,狼怪吃到的每刀伤害放大三成五——二十点的劈砍飘成二十七,飘字染上紫色、尾巴坠着"易伤"两个字,数字和颜色同时改,玩家一眼读出"这一刀吃到了印"。印消:倒计时走完,印纹碎成紫屑散掉,飘字退回白色——窗口关闭的那一刀又变回二十点,落差本身就是最直白的教程。整套机制教会玩家的只有一件事:先印后砍,印里多塞几刀。而演示里反复烙印只刷新时长不叠加层数,二十七永远不会变成三十四——那次三十四的事故就是层数叠出来的,易伤按层数走,数值组的表立刻失控。
印纹的落点有个小讲究:烙在胸口不烙在脑门——脑门上是血条的地盘,胸口才是"这只怪身上贴的告示",印纹、破绽光点、铁罡字全在这一档高度排队,玩家低头扫一眼胸口,这只怪眼下什么状态一目了然。血印的出手还给了半拍前摇:掐诀到印出手 0.24 秒,这半拍是"咒"的仪式感,也是它的软肋——贴脸的狼怪一爪打断了诀,印就烙不上去,先手印还是顶着爪印,是玩家每一轮都要做的微决策。
完整演示在这——点「血印咒!」烙它一身,再连点「劈砍」看数字怎么涨:
fx-vuln
二、幂尔框架实现:乘区与刷新纪律
幂尔框架里易伤是伤害乘区里的一环,结算顺序有严格的座次:
local BloodMark = {}
local MARK_TIME, AMP = 6, 0.35
function BloodMark.Cast(target)
SL:PlayActorAct("player", "cast")
SL:ScheduleOnce(function()
if SL:HasMark(target, "blood_mark") then
SL:RefreshMark(target, "blood_mark", MARK_TIME) -- 只刷新不加层
SL:ShowTipAbove(target, "血印刷新")
else
SL:AddMark(target, "blood_mark", MARK_TIME)
SL:ShowTipAbove(target, "血印!")
end
SL:AttachSigil(target, "hex_purple_red", MARK_TIME)
SL:PlayBurst(target, "mark_burst", 12)
end, 0.24)
end
local function onCalcDamage(target, base)
local dmg = base
if SL:HasMark(target, "blood_mark") then
dmg = dmg * (1 + AMP) -- 易伤乘区: 座次固定
SL:PopMarkTag(target, "易伤")
end
return dmg
end
SL:On("calc_damage", onCalcDamage)
return BloodMark
那次两个数字的报错,答案是易伤的数据结构没人拍板:一边存布尔、一边按层数读,calc_damage 的乘区入口于是有两套理解——易伤只允许一个入口、一种存法,时长和增伤幅度两个字段写死在表里,不许各自发挥。
最终解法是把易伤做成一张小表:时长、幅度、来源三个字段缺一不可,HasMark 只答有与无、GetMarkAmp 只答乘多少——查询按用途拆开,就没有人能拿着布尔量去乘伤害。PopMarkTag 的"易伤"角标挂在飘字的尾巴上而不是旁边:飘字本身在往上走,角标跟着一起走,拆成两个独立元素一个动一个不动,玩家看两眼就花了。
三、增伤的锚与团队的分账
三成五这个数是易伤的定价锚。低了没存在感,印上印下数字不动,玩家懒得管;高了喧宾夺主,二十点变四十七,大招都显得多余,输出循环退化成"等印、全塞印里"。三成五的妙处在"值得追但不值得等":为了吃印调整出手顺序是技巧,停手等印转好是蠢——锚定了这个分寸,窗口六秒、冷却一秒二的配置才立得住。团队语境下易伤还有一层分账:多个玩家的增伤来源叠在同一个怪身上,乘算还是加算?规范写死加算封顶——血印三成五、战吼两成,叠出五成五就到顶,后到的增伤不吃灰但也不滚雪球,那一晚的三十四和二十七,一半的锅就在这里没写。印纹的可视是最后一道保险:六角印挂在胸口而不是头顶,头顶留给减益图标和血条,胸口才是"这张怪身上的告示栏";印纹的晃动幅度跟着剩余时间衰减,最后半秒几乎静止——心细的玩家看得出"印要碎了",先手换招,这层信息明面上没写,实际人人都在用。
易伤和破防是两兄弟,账本最容易混:破防削的是护甲,改的是"这一刀被吞多少";易伤放大的是吃伤,改的是"这一刀进来翻几倍"——一条减法通道、一条乘法通道,演示里只有乘法在动,连护甲条都没画,就是怕两个概念搅在一起。真要同场,规范也只有一句:护甲先算、易伤后乘、加算封顶,三句话的座次钉死在结算函数的注释里,谁改结算谁背锅。最后一件事是给数值组的:易伤的倒计时要不要给玩家看?演示里印纹旁边挂着秒数,是因为这套玩法的核心就是"抢窗口",不给倒计时,玩家只能干数拍子——数得出来的玩法才练得出来,藏起来的深度不是深度,是玄学。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 控制技能的镜像问题是:锁住了怪,自己是不是也闲着?影锁把这道两难摆上台面:影锁四秒,它动不了、你也动不了——它…
【游戏功能】 打断为什么只有"清读条"一种?震魂偏要反过来——不清招、不断势,打在它读条半途的那一劲顺着招震进腑——中劲十秒…
【游戏功能】 蜂群为什么总是一只一只出?蜂王偏要让它们进化:放一只蜂王出来,杀掉小怪喂它——喂三只升一阶,三阶蜂王的毒刺一秒…
【游戏功能】 技能为什么总是不扣自己的血?血刃偏要反着来:开着血刃的每一刀先扣自己二血、命中回三血——净赚一但要打得中,空刀…
【游戏功能】 bn.t = bn.t - dt ——一行旗面倒计时的代码,撑起了破军旗全部的紧迫感:旗立三秒、圈内加攻三成,…
【游戏功能】 淬毒为什么要一毒到底?淬毒刃偏要一层一层叠:一刀淬一层毒、毒层一秒六地烂,六层封顶之后一刀下去毒伤三十六——叠…