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

连招谱:三招按谱出,谱尾一击翻倍

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

【游戏功能】

出招的顺序算不算伤害?大多数战斗里不算——三招乱按和按谱出,账面一个样。连招谱把顺序变成了伤害本身:「劈→撩→刺」收破军尾刀四十翻倍,「撩→劈→刺」收回风气回三十,出脱了谱三招白出。这篇的核心代码照引擎技能脚本的全规格写:配置表、谱面构件、招式链状态机、定时器、调试按钮。

一、效果演示:三颗按钮,两套谱

演示场有三颗招式按钮——劈、撩、刺。任意乱按,每招十二点灰字,三秒不出下一招谱就断。可按谱走就是另一个世界:劈→撩→刺三连,第三招收"破军"——四十大字、宽弧、震屏全套伺候;撩→劈→刺三连,收"回风"——头顶绿字回三十血。谱面进度条在玩家脚下三秒倒走,出招一个字亮一格,三格亮满算成谱。演示里先乱按一轮看脱谱的灰字,再按谱走一轮看尾刀——同一套按钮,两种账面。演示里先乱按一轮看脱谱的灰字,再按谱走一轮看尾刀——同一套按钮,两种账面。三格进度条在脚下倒走的时候最紧张:亮两格停半秒,第三招就得到位。

demo
 fx-comboroute

二、底层原理:一条招式链加一张谱表

模块的账本是一条链配一张谱。招式链是三格的滑动记录:每次出招把招式名压进链尾、超三格挤掉链头——链里存的是顺序,不是计数。谱表是两张三行的核对单:每行是一个招序和它的奖励——链满三格的那一刻,拿链和谱表逐行比对,对上哪行发哪份奖励,都对不上发"脱谱"。三秒的续招窗口是链的寿命:窗口每帧递减、出招即重置,归零链清空——窗口的紧迫感就是这套机制的拍子。奖励发放全部在链满的那一帧结算,尾刀伤害和回血量各自走各自的出口,两份奖励永不串账。

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

lua
--------------------------------------------------------------------------------
-- @file        ComboRoute.lua
-- @brief       连招谱 —— 三招按谱出,谱尾一击翻倍
--              客户端表现模块:配置表 / 谱表 / 招式链状态机 / 定时器
--------------------------------------------------------------------------------

local ComboRoute = {}

--------------------------------------------------------------------------------
-- 配置与常量
--------------------------------------------------------------------------------
local CONST = {
    CHAIN_WINDOW  = 3.0,        -- 续招窗口三秒
    CHAIN_LEN     = 3,          -- 三招成谱
    MOVE_DMG      = 12,         -- 单招十二
    ROUTE_CRUSH   = "劈撩刺",   -- 破军谱
    ROUTE_CRUSH_X = 40,         -- 破军尾刀四十
    ROUTE_WIND    = "撩劈刺",   -- 回风谱
    ROUTE_WIND_HP = 30,         -- 回风回三十

    -- 颜色
    COLOR_PAGE    = "#d97742",  -- 谱朱
    COLOR_DEEP    = "#7a3212",  -- 深朱
    COLOR_GHOST   = "#ffc9a8",  -- 谱白

    ZORDER_GROUND = 118,
    ZORDER_PAGE   = 132,
    ZORDER_EFFECT = 135,

    AUTOINC_BASE  = 944000,
}

--------------------------------------------------------------------------------
-- 谱表:招序与奖励的核对单
--------------------------------------------------------------------------------
local ROUTES = {
    [CONST.ROUTE_CRUSH] = { kind = "dmg",  v = CONST.ROUTE_CRUSH_X, name = "破军" },
    [CONST.ROUTE_WIND]  = { kind = "heal", v = CONST.ROUTE_WIND_HP, name = "回风" },
}

--------------------------------------------------------------------------------
-- 模块内部状态
--------------------------------------------------------------------------------
local _chain      = {}            -- 招式链
local _chainT     = 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 "CBR", 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 CreatePageNode()
    local mp = GetActorPos(SL:GetValue("USER_ID"))
    if not mp then return end
    local node = GUI:Layout_Create(GUI:Attach_SceneF(), GenID("Page"),
        mp.x - 46, mp.y + 4, 0, 0, false)
    GUI:setLocalZOrder(node, CONST.ZORDER_PAGE)
    for g = 0, 2 do
        GUI:DrawLine_Create(node, "slot_" .. g, 0, 0, 14, g * 32, 0, g * 32 + 24, 0,
            CONST.COLOR_DEEP, 200)
    end
    return node
end

骨架的三处立规。谱表用招序字符串当键——ROUTES["劈撩刺"] 一行查表,比对不需要逐位循环,字符串相等就是成谱。招式链存汉字名不存按钮编号——链转成字符串就是谱键,两层结构之间零换算。谱面构件三格横排——格子的亮灭就是链的长度,玩家低头一眼数格。

四、核心代码:完整模块(下·定时器与谱面结算)

lua
--------------------------------------------------------------------------------
-- 出招入链与成谱
--------------------------------------------------------------------------------
local function Chain_Push(move)
    if #_chain >= CONST.CHAIN_LEN then
        table.remove(_chain, 1)
    end
    table.insert(_chain, move)
    _chainT = CONST.CHAIN_WINDOW
    if #_chain == CONST.CHAIN_LEN then
        local seq = table.concat(_chain)
        local route = ROUTES[seq]
        if route then
            if route.kind == "dmg" then
                SL:ActorHurt(SL:GetValue("MARK_TARGET_ID"), route.v)
                SL:TipAbove(SL:GetValue("MARK_TARGET_ID"), "-" .. route.v)
                SL:ScreenShake(5, 0.30)
            else
                SL:HealMe(route.v)
                SL:TipAboveMe("+" .. route.v)
            end
            ShowTip(route.name .. "收尾")
        else
            ShowTip("出脱谱了——三招白出,重数")
        end
        _chain = {}
        _chainT = 0
    end
end

--------------------------------------------------------------------------------
-- 三颗招式按钮
--------------------------------------------------------------------------------
function ComboRoute.Move(name)
    Chain_Push(name)
end

--------------------------------------------------------------------------------
-- 定时器:窗口递减
--------------------------------------------------------------------------------
if not _scheduler then
    _scheduler = SL:Schedule(function(dt)
        if _chainT > 0 then
            _chainT = _chainT - dt
            if _chainT <= 0 and #_chain > 0 then
                _chain = {}
                ShowTip("谱断了——三秒没续上,重数")
            end
        end
    end, 0.02)
end

SL:RegisterLUAEvent(LUA_EVENT_SCENE_CLEAR, "CBR_Clear", function()
    _chain, _chainT = {}, 0
end)

SL:ScheduleOnce(function()
    ShowTip("技能已加载: 连招谱 (调试按钮触发)")
end, 1.0)

return ComboRoute

下半场的成谱结算是全模块的门面:链满三格的那一帧,table.concat 把链拼成招序串、查表、发奖、清链——四步一口气做完,中间不留任何可插队的空帧。窗口的清空写在定时器的独立分支里——窗口归零的断谱和成谱的清链是两条路,互不覆盖;断谱的提示也要响——无声的清链会让玩家以为下一招还在续。窗口归零的断谱和成谱的清链是两条路,互不覆盖;断谱的提示也要响——无声的清链会让玩家以为下一招还在续。出招的结算也要即时——每一招落手就跳十二,谱的奖励是额外的一笔,不是把三招的账攒到尾刀一起算。奖励的两种出口分开走:破军走怪的血、回风走自己的血,各自调各自的接口,奖励表里类别字段一改就是一个新谱。

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

调参三笔账。窗口三秒对单招零点八秒的出手是四招的容量——三招成谱留一招余量,手慢的玩家掉一格还能救;窗口压到两秒就是连招纯度考试。尾刀四十对单招十二是三点三的谱尾杠杆——杠杆过五倍玩家只为了尾刀出招,前两招沦为按键;杠杆过两倍谱尾不够甜,没人背谱。两套谱的奖励要错位——一个给伤害一个给回血,背一张谱保命、背两张谱杀人,谱表越厚玩法越厚。两套谱的奖励要错位——一个给伤害一个给回血,背一张谱保命、背两张谱杀人,谱表越厚玩法越厚。招与招之间也要有性格:劈是重、撩是快、刺是准,三招的手感立住了,背谱才不是背口诀。常见坑三个:链满后不回收,第四招挤掉第一招变成滚动窗口的乱谱;窗口在成谱瞬间没清零,残窗口接着算下一张谱;脱谱没有提示,玩家乱按三轮不知错在哪。

商业服里连招谱是"武学流派"的载体:每张谱是一门武学——破军谱刚猛、回风谱绵柔,谱的书页做成商城的武学残卷,收集残卷解锁新谱,武学的深度直接长在谱表上。比武场里它是操作的身份证:会背谱的玩家和乱按的玩家,同样的装备打出入两种战绩,操作的价值写进胜负里。变体做成双人合谱:甲出前两招、乙补第三招收尾——连招谱从个人手速变成团队暗号。这一篇的演示和整套模块照抄能跑,改的就是 CONST 和谱表那两处。

写完留一句给做连招系的同学:连招谱卖的是"顺序的尊重"——同一套按钮,尊重顺序的人打出的就是另一门武学。

作者履历与出处

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

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

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

LATEST ARTICLES

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

进阶实战游戏功能

迷魂香:一炉香点着,圈里的怪掉头打转

【游戏功能】 怪的仇恨为什么永远追着你?因为它看得见你。迷魂香把"看得见"这三个字没收了:一炉香落在它脚下,烟圈六秒——圈里…

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

气势:连击涨势 挨打掉势 提气回血五十

【游戏功能】 连击值攒着有什么用?多数战斗的答案是攒个伤害加成——气势给了第二个答案:攒的是一支军队的士气。每一刀涨十二点、…

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

崩血:伤口一动就崩,跑得越快掉血越凶

【游戏功能】 一道割裂挂上去,一秒一跳——它站着跳四,追你的时候崩成八:伤口一动就崩,跑得越快掉得越凶。崩血把"放风筝"从走…

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

燕回式:突进穿它一遭,原路飞回起手点

【游戏功能】 突进出去了,回不回得来?多数突进的答案是"不回"——人留在怪堆里听天由命。燕回式给突进装了归途:穿身而过去时一…

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

破招式:它抡重刀你抢半拍,招克招

【游戏功能】 读条变红的那一秒,全世界都在等一个决定。破招式把这一秒做成整场战斗的心跳:怪交替出红劈和蓝刺,红劈读条时按下破…

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

连招谱:三招按谱出,谱尾一击翻倍

【游戏功能】 出招的顺序算不算伤害?大多数战斗里不算——三招乱按和按谱出,账面一个样。连招谱把顺序变成了伤害本身:「劈→撩→…

2026-10-01 06:32 996 技术组