CHUAN2 DEV ENGINE
996 正版授权研发中心 · 360 授权合作教学中心 · 抖音传奇直播合作授权 · 快手推广运营商授权
OFFICIAL LICENSED ACADEMY 查验官方授权证书 →
// 威海旷世互娱教学基地 · 技术文章
进阶实战游戏功能996引擎

破伤锥:一锥一个破口,破口越多进血越深

2026-10-01 06:59 作者:996 技术组 996引擎Lua教程传奇脚本进阶实战游戏功能996引擎

【游戏功能】

叠层伤害有两种记法:按比例记的蚀甲软的是甲,按口数记的破伤开的是肉——一锥一个破口、破口越多,之后每一刀都按口数固定加成,普攻也从十二涨到二十四。这篇的核心代码照引擎技能脚本的全规格写:配置表、破口构件、锥表状态机、定时器、调试按钮。

一、效果演示:六口破口,一条直线上去的刀

演示场点「破伤锥!」:一锥下去,怪身上多一个红色的小破口,头顶"破口一"亮起。锥满六口之后再打:每一刀都变成十二加口数乘二——六口时一刀二十四,灰色普攻涨成金色大字。演示里先锥满六口再停手看三秒:破口不掉、加成不掉,稳稳当当挂在怪身上;再继续打,每一刀的数字都站在二十四上一动不动——按口数的加成不吃任何衰减,它就是这么直。演示里先锥满六口再停手看三秒:破口不掉、加成不掉,稳稳当当挂在怪身上;再继续打,每一刀的数字都站在二十四上一动不动——按口数的加成不吃任何衰减,它就是这么直。红点挂得也讲究:六颗红点分两排锯齿状排开,锥一颗亮一颗,读口的账和读点一样快。两条线的对比是这道题的题眼:蚀甲软甲是百分比越叠越玄,破伤开口是固定数越叠越实。

demo
 fx-puncture

二、底层原理:一张锥表加一个全员加成出口

模块的账本是一张锥表。锥表只有两个动作:锥命中加一口、口满拒绝加——六口封顶写死在入口。加成侧不走锥表的循环:所有伤害的出口读一次锥表长度、乘二加上基础值——加成是"读数式"而不是"逐层结算式",锥表只是个计数器。和蚀甲的分野在结算的形状上:蚀甲是乘法削弱、每层百分比递减,叠满了减伤曲线越来越平;破伤是加法增强、每口固定两点的直线,六口就是恒定十二的加成——直线的好处是可预期,玩家心算六口就是二十四,一口不多一口不少。锥是永久的:一旦开口终身不闭合,这门机制的信任建立在"绝不收回"上。锥是永久的:一旦开口终身不闭合,这门机制的信任建立在"绝不收回"上。普攻的加成对技能同样生效——破口的承诺是"所有伤害",兑现了"所有",玩家的技能循环才敢往锥口上叠。

三、核心代码:完整模块(上·骨架)

lua
--------------------------------------------------------------------------------
-- @file        Puncture.lua
-- @brief       破伤锥 —— 一锥一个破口,破口越多进血越深
--              客户端表现模块:配置表 / 破口构件 / 锥表状态机 / 定时器
--------------------------------------------------------------------------------

local Puncture = {}

--------------------------------------------------------------------------------
-- 配置与常量
--------------------------------------------------------------------------------
local CONST = {
    HOLE_CAP     = 6,          -- 六口封顶
    HOLE_CD      = 2.0,        -- 下锥冷却
    BASE_DMG     = 12,         -- 基础普攻
    PER_HOLE     = 2,          -- 每口加二

    -- 颜色
    COLOR_HOLE   = "#c94f4f",  -- 破口红
    COLOR_DEEP   = "#6b1a1a",  -- 深红
    COLOR_GHOST  = "#f2d8d8",  -- 锥白

    ZORDER_GROUND = 118,
    ZORDER_HOLE   = 130,
    ZORDER_EFFECT = 135,

    AUTOINC_BASE  = 950000,
}

--------------------------------------------------------------------------------
-- 模块内部状态
--------------------------------------------------------------------------------
local _holes      = 0              -- 破口读数
local _cdLeft     = 0
local _scheduler  = nil
local _autoInc    = 0

local m_cos = math.cos
local m_sin = math.sin

--------------------------------------------------------------------------------
-- 辅助函数
--------------------------------------------------------------------------------
local function GenID(prefix)
    _autoInc = _autoInc + 1
    return string.format("%s_%d", prefix or "PNC", CONST.AUTOINC_BASE + _autoInc)
end

local function GetActorPos(actorID)
    if not actorID then return nil end
    local x = SL:GetValue("ACTOR_POSITION_X", actorID)
    local y = SL:GetValue("ACTOR_POSITION_Y", actorID)
    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 CreateHoleNode(idx)
    local node = GUI:Layout_Create(GUI:Attach_SceneF(), GenID("Hole"), 0, 0, 0, 0, false)
    GUI:setLocalZOrder(node, CONST.ZORDER_HOLE)
    GUI:DrawLine_Create(node, "dot", 0, 0, 5, 0, 0, 0, 0, CONST.COLOR_HOLE, 240)
    return node
end

骨架的三处立规。锥表是读数不是数组——破口只有"几个"没有"哪几个",数组存锥的版本迟早把锥的坐标当成伤害算。HOLE_CAP 六口封顶写在入口——满锥的锥请求直接拦下,满后再锥的动画都不该播。破口构件是单节点小红点,挂几颗、坐标算几份——破口的点位随读数摆,摆的样式固定成锯齿状,读数的账和视觉的点一一对应。

四、核心代码:完整模块(下·定时器与加成出口)

lua
--------------------------------------------------------------------------------
-- 下锥
--------------------------------------------------------------------------------
function Puncture.Cast()
    if _cdLeft > 0 then return end
    if _holes >= CONST.HOLE_CAP then return end
    _cdLeft = CONST.HOLE_CD
    _holes = _holes + 1
    SL:TipAbove(SL:GetValue("MARK_TARGET_ID"), "破口" .. _holes)
    ShowTip("破口" .. _holes .. "——之后每一刀多" .. (_holes * CONST.PER_HOLE) .. "点")
end

--------------------------------------------------------------------------------
-- 加成出口:所有伤害读一次锥表
--------------------------------------------------------------------------------
local function Puncture_Bonus()
    return _holes * CONST.PER_HOLE
end

--------------------------------------------------------------------------------
-- 普攻结算:基础值加锥表读数
--------------------------------------------------------------------------------
local function OnAttackTick()
    local tid = SL:GetValue("MARK_TARGET_ID")
    if not tid then return end
    local vd = CONST.BASE_DMG + Puncture_Bonus()
    SL:ActorHurt(tid, vd)
    SL:TipAbove(tid, "-" .. vd)
end

--------------------------------------------------------------------------------
-- 定时器与调试
--------------------------------------------------------------------------------
if not _scheduler then
    _scheduler = SL:Schedule(function(dt)
        _cdLeft = math.max(0, _cdLeft - dt)
        _atkT = (_atkT or 1.3) - dt
        if _atkT <= 0 then
            _atkT = 1.3
            OnAttackTick()
        end
    end, 0.02)
end

SL:ScheduleOnce(function()
    ShowTip("技能已加载: 破伤锥 (调试按钮触发)")
end, 1.0)

return Puncture

下半场的加成出口是全模块的一根独木桥:Puncture_Bonus 只读锥表长度、只做乘二加法——所有吃破伤的攻击必须从这里过桥,桥外自算加成的版本迟早算出两本账。普攻的结算把基础值和加成合成一笔数字落地——数字合并着飘,玩家的眼睛不用做加法;要展示明细就在破口挂上时飘一次"每刀加几",之后只飘总数。锥是永久的这件事不需要额外代码——没有到期字段、没有衰减字段,"不收回"三个字是靠什么都没写实现的。

五、调参指南与商业服怎么用

调参三笔账。每口加二对六口封顶是满锥十二的加成——满锥加成要压在普攻的一倍上下,超过一倍半玩家的操作就只剩"锥满然后挂机",机制的参与感崩了。下锥冷却两秒对六口是十二秒的锥满周期——周期比头目战的常规时长短一截,锥满之后仗才进入正题。锥永久这件事是整条链的锚——给锥加到期时间的版本,玩家的每一锥都要算保质期,直线的可预期就毁了。常见坑三个:加成只加了普攻漏了技能,破口的"所有伤害"名不副实;锥满后的下锥没有提示,玩家对着满锥的怪白按;破口的红点随怪走位不跟随,破口飘在半空。

商业服里破伤锥是"平砍流"的定海针:百分比削弱的版本里平砍流永远吃亏,按口数的固定加成让平砍流第一次有了不被稀释的加成——平砍装备的消费逻辑跟着成立。商业服里破伤锥是"平砍流"的定海针:百分比削弱的版本里平砍流永远吃亏,按口数的固定加成让平砍流第一次有了不被稀释的加成——平砍装备的消费逻辑跟着成立。锥的品级也可以做进下锥的手感里:铜锥木声、金锥钟声,下锥的那一声脆响就是锥手的段位。副本里它是团队收益的放大器:锥口吃的加成对全队生效,锥手在队伍里的位置是半个输出核心。变体做成破口连锁:带六口的怪死亡时把破口数溅给旁边的怪——叠锥的手艺可以在怪群间流转。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。

写完留一句给做叠层系的同学:破伤卖的是"直线的信任"——不玩百分比不搞衰减,六口就是十二,玩家心算完就敢押。

作者履历与出处

本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。

← 返回文章地图返回研学路径

幂尔框架 · 实战干货 · 接口调用

LATEST ARTICLES

全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →

进阶实战游戏功能

影炮:蓄一秒,暗影弹道贯穿全屏

【游戏功能】 蓄力技为什么总是单发?影炮偏要贯穿全屏:蓄一秒射一道暗影弹道穿全屏——线上所有目标各挨五十五,弹道从你脚下贯穿…

2026-10-01 10:48 996 技术组
进阶实战游戏功能

灼心:点燃它的心,出招即自损

【游戏功能】 灼烧为什么总烧在皮肤上?灼心偏要烧进心里:心被灼了六秒——六秒里怪每出一招就自损八,出得越多损得越多。这篇的核…

2026-10-01 10:48 996 技术组
进阶实战游戏功能

魂蜂:杀敌化蜂,至多三盏自动蜇击

【游戏功能】 魂卫为什么只有三盏就不能多了?魂蜂偏要做成可以积累的:杀掉小怪化一盏魂蜂跟着你走,至多三盏——三盏魂蜂各自两秒…

2026-10-01 10:48 996 技术组
进阶实战游戏功能

霜镜:架起霜镜,弹道冻着原路画回

【游戏功能】 镜墙为什么只能反弹不能冰冻?霜镜偏要双管齐下:弹道撞上霜镜原路画回去——回程的弹道还带着冰冻效果,扎中怪怪也冻…

2026-10-01 10:47 996 技术组
进阶实战游戏功能

穿心刺:一箭穿心,最大血量百分之六的穿透

【游戏功能】 单体射击为什么打不动厚血怪?穿心刺给的答案是:箭伤八加穿心伤,穿心伤等于最大血量百分之六——血越厚的怪越疼。这…

2026-10-01 10:47 996 技术组
进阶实战游戏功能

影刺:化影绕后,背刺一刀双倍

【游戏功能】 影刺的全机制就一句话:化影绕到它身后,从背刺出的那一刀双倍二十四——正面十二、背后二十四,它一转身就变白板。这…

2026-10-01 10:47 996 技术组