【游戏功能】
数值组出过一次结算事故:斩残纹上线首日,满血的怪挨了最重的刀——按设计它该是最轻的那一刀。排查下来是加成算错了基数:加成该按"已损失的血"算,代码里取成了"剩下的血",血满刀重、血残刀轻,整条曲线装反了。修完这一行,斩残纹才立起来:它血越少,你刀越重。这篇把整套模块拆开:配置表、残血侦测、加成曲线、重刀结算、定时器、调试按钮,一段一段照抄能跑。
一、效果演示:它血越少,你刀越重
演示场怪血条厚实。点「纹成!」:一圈血红的纹套在它身上——十二秒的纹成期。满血时你的刀平平无奇十点;打到半血,刀变二十;它血条见红的那一段,你的刀一下比一下沉,二十八点的重刀连着蹦,头顶"增+18"的加成数随它的血量实时滚动。演示里试两笔账:全程平砍和先磨后斩的两段打法——同样的刀数,会配血线的人总账多出一截。斩残纹教的是配血:不是刀快就赢,是知道什么时候下重手。
fx-cutlow
二、底层原理:一道残血侦测加一条加成曲线
模块的机关是一对搭档。残血侦测:每一刀出手前先读怪的血量账——已损失比例算到小数点后,这一读就是那场事故里装反的基数,正确答案永远是"一减剩下比例"。加成曲线:加成等于已损失比例乘二十——满血加零、半血加十、空血加二十,刀重随它的血条一路走高,曲线是线性的,账是明牌的。和固定增伤的分野在"斩残纹的刀重是它给的":固定增伤是你的底子,斩残纹的重刀是它的破绽——它的血掉得越狠,你借到的力越猛,两个人共用同一根血条。
曲线为什么线性不设陡坡?陡坡的版本会出现"某个血线以下刀重跳水"的临界点,玩家会掐着血线等跳水、卡着不杀——线性曲线没有等待的价值,每一刀都比上一刀重一点点,节奏不断,配血的刀一路沉下去,没有一拍是白等的。
三、核心代码:完整模块(上·骨架)
-- @file CutLow.lua
-- 斩残纹 —— 它血越少,你刀越重
local CutLow = {}
local CONST = {
CREST_LIFE = 12.0,
CREST_CD = 5.0,
BASE_HIT = 10,
AMP_MAX = 20,
COLOR_CUT = "#c04848",
COLOR_DEEP = "#481414",
COLOR_GHOST = "#f0b8b8",
ZORDER_CUT = 133,
ZORDER_FX = 135,
AUTOINC_BASE = 1089000,
}
local _crestT = 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 "CTL",
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 MissRatio(tid)
local hp = SL:GetValue("ACTOR_HP", tid) or 0
local hpM = SL:GetValue("ACTOR_HP_MAX", tid) or 1
return 1 - hp / hpM
end
四、核心代码:完整模块(下·加成曲线与重刀结算)
-- 加成曲线:已损失比例乘上限,线性走满
function CutLow.Bonus(tid)
if _crestT <= 0 then return 0 end
return math.floor(MissRatio(tid) * CONST.AMP_MAX)
end
-- 重刀结算:每一刀出手前先读它的血
SL:RegisterLUAEvent(LUA_EVENT_MELEE_DAMAGE, "CTL_Amp", function(tid)
return CutLow.Bonus(tid)
end)
function CutLow.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
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)
SL:TipAbove(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
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()
CutLow.Cast()
end)
ShowTip("技能已加载: 斩残纹 (调试按钮触发)")
end, 1.0)
function CutLow.Unload()
if _scheduler then SL:Unschedule(_scheduler) end
SL:UnregisterLUAEvent(LUA_EVENT_MELEE_DAMAGE, "CTL_Amp")
SafeRemove(_crestFx)
_crestT = 0
end
return CutLow
五、机制问答
问:加成按谁的血量上限算?
答:按目标自己的——每只怪的账各算各的,换目标的一拍曲线跟着换,没有全场的公共血线。
问:满血目标开纹是白开吗?
答:是——满血加成为零,纹成期的前几刀和平常一样,这纹是"后手纹",先磨血再开纹才是正解。
问:纹成期内换目标加成清零吗?
答:曲线跟着人走——新目标的加成按新目标的已损失比例现算,旧目标的账不带过去。
问:斩残的重刀吃暴击吗?
答:吃——加成进的是基础刀,暴击在基础刀上照常乘,残血加暴击的双倍重刀是这套纹的终点。
问:怪回血了加成会缩吗?
答:会——加成认实时血账,它的奶妈奶一口,你的刀当场轻一截,先杀奶再斩残是这条曲线的镜像课。
六、调参指南与商业服怎么用
第四笔是曲线的上限:二十点对十点的底刀是"翻三倍"的顶——上限太低残血不够爽,太高变成"半血前白打"的赌局,三倍顶是配血打法值得练的线。第三笔是曲线的形状:线性不设坡是节奏的保票——带跳变的曲线会造出卡血线等跳水的邪道,线性的每刀递增没有等待价值。第二笔是侦测的基数:已损失比例是唯一的正解——那场"血满刀重"的事故就是基数取反了,这一行写错整套纹就装反。第一笔是加成的可见:头顶的"增+X"要随它的血条实时滚——玩家看着加成数字配刀,比看血条配刀直观十倍。常见坑三个:侦测读了旧帧的血量导致加成慢一拍;换目标后纹环跟脚还钉在旧目标头顶;怪死亡那一拍加成判定还在读尸体的血量报了空账。
商业服里斩残纹是"猎首盟"的刀谱:别人练刀快他练刀准——商城里纹环的样式做成品级,赤纹、血珀纹、修罗纹,那圈套在怪身上的血红纹环就是猎首盟的准星。运营落地还有两笔:一段是配血教学——教一句"半血开纹,见红下重手",流派第一课是配血线;一段是猎首榜——按纹成期最后一刀的伤害排名,收官最重的人有碑。变体做成斩残共振:加成超十五的那几刀带小范围溅射——从单体配血到配血清场,猎首盟的刀越磨越阔。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。
写完留一句给做增伤系的同学:斩残纹卖的是"它的破绽就是你的刀"——那圈随血条越套越紧的红纹和实时滚动的加成数,是把敌人的血条读成自己攻击力的一张曲线图。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
接手二开的兄弟几乎都撞过同一堵墙:玩家嫌走路"一格一格像机器人",老板拍板要"丝滑移动",改服务端速度?不对。改客户端动画帧…
【游戏功能】 先看一个熟场面:法师的火球特效挂在怪的脚后跟上,明明技能说明写着"焚烧其面",火星子却在地上打滚。群里有位策划…
【游戏功能】 上周有个开服的老板在群里发了一段录屏:他的战士明明刀刀都砍中了,观众却一片"这刀挥空了吧"。他原话是"判定日志…
【游戏功能】 先说结论放在开头:怪的皮一会儿绿一会儿红,不是美术换了几套贴图,是染色系统在怪身上盖了一层"色镜"。开服群里有…
前两天群里有个架设的朋友问了个需求:中毒的人要变绿、每两秒掉一次血、毒还能叠五层,问是不是要在服务端把整套状态机重写。我说你…
【游戏功能】 先抛一个坑:五口钟一模一样大,为什么一口比一口疼?先后次序动不得吗?倒过来敲会怎样?这篇把编钟纹整套写法拆开:…