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

天平:两条血条平一平,谁高谁吃亏

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

【游戏功能】

均值 = (你 + 它) ÷ 2 —— 称平的那一下,两管血按比例拉到同一个数:谁的比例高谁掉,谁的比例低谁回。天平把"血量"从一条条独立的账本变成了一杆可以调的秤。这篇把整套模块拆开:配置表、天平表、称平结算、定时器、调试按钮,一段一段照抄能跑。

一、效果演示:两条血条平一平,谁高谁吃亏

演示场你的血三百满格,怪的血一千二满格——比例你百分百它九成二。点「称平!」:两管血向平均值靠拢——它掉四十八,你掉十二,秤完它九成六你也九成六。打掉它一半血你再称——它一半你九成,平均值七成五:它被拉掉一大截,你被拉掉一成半——这时候称平就是送。演示里教的是称前必算:它比例高的时候称是赚,你比例高的时候称是亏,天平不认血条厚薄只认比例。天平玩的是换算:称平的每一拍,都要先把两个百分比在心里过一遍秤。

demo
 fx-hpbalance

二、底层原理:一杆比例秤加一次均值结算

模块的机关是一对搭档。比例秤:称平认的是两管血的比例不是绝对值——千二的大怪和三百的你按各自的百分比一起拉向均值,秤面前血条厚薄只是刻度不同。均值结算:称平那一下两管血一起落到平均比例——比例高的掉、比例低的回,掉和回的绝对量各按各的血池换算。和汲取那类单向抽血的分野在"天平是双向的":汲取只从它身上往下抽,天平把两边一起往中间搬——你肥它瘦的时候称是亏,它肥你瘦的时候称是赚,一杆秤两种用法。

称平为什么拉比例不拉绝对值?拉绝对值的版本千二大怪一口被平掉几百,天平变成对大怪的专属大炮;拉比例的版本大怪小怪同一杆秤,秤的公平写在比例里。

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

lua
-- @file HpBalance.lua
-- 天平 —— 两条血条平一平,谁高谁吃亏

local HpBalance = {}

local CONST = {
    BALANCE_CD    = 6.0,
    FLOOR_PCT     = 0.04,

    COLOR_SCALE   = "#b89840",
    COLOR_DEEP    = "#504010",
    COLOR_GHOST   = "#f0e0a0",

    ZORDER_SCALE  = 134,
    ZORDER_FX     = 135,
    AUTOINC_BASE  = 1049000,
}

local _cdLeft    = 0
local _scaleFx   = nil
local _scheduler = nil
local _autoInc   = 0

local function GenID(prefix)
    _autoInc = _autoInc + 1
    return string.format("%s_%d", prefix or "HPB",
        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 GetPct(id)
    local hp = SL:GetValue("ACTOR_HP", id)
    local hpM = SL:GetValue("ACTOR_MAX_HP", id)
    if not hp or not hpM or hpM <= 0 then return nil end
    return hp / hpM
end

function HpBalance.Weigh()
    if _cdLeft > 0 then
        ShowTip("秤在动——" .. string.format("%.1f", _cdLeft) .. "秒")
        return
    end
    local myID = SL:GetValue("USER_ID")
    local tid = SL:GetValue("MARK_TARGET_ID")
    local pp = GetPct(myID)
    local mp = GetPct(tid)
    if not pp or not mp then return end
    _cdLeft = CONST.BALANCE_CD
    local avg = (pp + mp) / 2
    SL:SetActorHpPct(myID, math.max(avg, CONST.FLOOR_PCT))
    SL:SetActorHpPct(tid, math.max(avg, CONST.FLOOR_PCT))
    SL:PlayWeighFx(myID, tid)
    SL:TipAboveMe(pp > mp and "称亏" or "称赚")
    ShowTip("平完了——两管血一起落到"
        .. math.floor(avg * 100) .. "%")
end

四、核心代码:完整模块(下·定时器与秤面演出)

lua
-- 定时器:秤面演出与冷却推进
if not _scheduler then
    _scheduler = SL:Schedule(function(dt)
        _cdLeft = math.max(0, _cdLeft - dt)
        if _scaleFx then
            local myID = SL:GetValue("USER_ID")
            local mp = GetActorPos(myID)
            if _scaleFx and mp then
                GUI:setPosition(_scaleFx, mp.x, mp.y - 110)
            end
        end
    end, 0.02)
end

SL:ScheduleOnce(function()
    SL:BindDebugButton("称平", function()
        HpBalance.Weigh()
    end)
    ShowTip("技能已加载: 天平 (调试按钮触发)")
end, 1.0)

function HpBalance.Unload()
    if _scheduler then SL:Unschedule(_scheduler) end
    SafeRemove(_scaleFx)
    _scaleFx = nil
end

return HpBalance

五、机制问答

问:称平对满血的它划算吗?
答:不划算——它满血的比例一定不低于你,称平只会把它往你的数上拉,开局的第一秤几乎注定是亏的。

问:秤有保底吗?
答:有——比例百分之四是双方的底线,秤不会把任何一方压到归零,底线的存在让秤是凶器不是自杀器。

问:称平吃治疗加成吗?
答:不吃——称平是位置移动不是治疗,回血类的加成一概不认,账目干净才算得清。

问:它回血之后我再称呢?
答:重新算——它的比例回上去秤就重新偏向它,天平读的是当下不是历史。

问:称平的两边比例一样呢?
答:白称——均等时谁都不动,六秒冷却白交,称之前先看两个百分数差多少。

问:称平能对残血怪用吗?

答:能用但要算——它比例低你比例高,称平把你压下去把它抬上来,残血称平是白送。

问:称平和汲取能配合吗?

答:能——汲取先抽它的比例,天平再把两管血往中间拉,一抽一拉两套账一起算它的血就见了底。

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

第四笔是底线的深浅:百分之四是"压得狠但不压死"的底线——底线归零的版本天平变成同归的赌局,底线太高秤失去了翻盘的功能。第三笔是冷却的节拍:六秒冷却对一场四十秒的架是六次称平的机会——冷却太短天平变成换血器,太长一局只配称一回。第二笔是均值的算法:算术平均是"一眼能算"的秤——几何平均或加权平均的版本玩家按着计算器打架,算术平均才配进战斗。第一笔是百分数的明示:两边头顶各挂一个百分数——称平的判断全在两个数的大小里,数字不上头顶,秤就是黑箱。常见坑三个:称平把百分比拉到负数,血条倒扣成负值;称平触发反伤和吸血链,秤和战场互相打架;百分比四舍五入后不回写实际血量,显示与实账漂移。

商业服里天平是"秤师流派"的心算场:别人看血条长短,他看两个百分数的高低——商城里秤面的样式做成品级,铜秤、玉秤、星衡秤,称平那一下两管血同时跳动的数字就是秤师的心算成绩。运营落地还有两笔:一段是算术教学——教一句"称前先看两个百分比",流派第一课是小学数学;一段是神秤榜——按称平赚到的净血量排名,心算最快的秤师有碑。变体做成三秤:把第三只怪的百分比也拉上秤——从两管血的天平到多管血的均贫富,秤面越铺越大。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。

秤师的心法就一句:称前心算,称后不悔。

秤师还有半句压箱的:它满血你残血的秤千万别碰,那是送命题。

写完留一句给做数值系的同学:天平卖的是"血条是可以调的"——那两格一齐跳到同一刻度的百分比,是把生死账本改成天平游码的一场心算。

作者履历与出处

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

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

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

LATEST ARTICLES

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

进阶实战游戏功能

磁引:四秒磁点,它的箭全拐进这点碎掉

【游戏功能】 磁点一开,它的箭全拐——四秒里它射出的每一支箭都拐向同一个聚点,到了聚点整支碎掉,一支都够不着你。磁引把"躲箭…

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

钟摆:半场一摆,谁站线上谁挨砸

【游戏功能】 半场一摆两秒一趟的钟摆,砸中站线上的一切——包括被你引过去的怪。钟摆把"地形"变成了武器:它本身不认敌我,你引…

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

铰击:两键同按,铰它一下二十

【游戏功能】 两键同按零点一五秒内——铰击:两把刃铰在一起砸它二十,外加半秒的僵。单按一键只有十点白给。这篇把整套模块拆开:…

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

三环扣:三角链死一伤二,连环清场

【游戏功能】 三只怪三角连着链:死一只,另外两只各挨十五;链上再倒一只,最后那只又挨十五——三环扣把"清怪"变成了"连环",…

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

蓄盾爆:按住攒盾,盾值就是弹量

【游戏功能】 按住攒盾,盾值就是弹量,松手引爆贴脸的怪——蓄盾爆把"防御"改写成了"蓄弹药":盾攒得越厚炸得越疼,攒盾的两秒…

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

三键诀:劈刺扫按对了顺序,一记四十

【游戏功能】 按对 劈→刺→扫 三键,一记四十;按错一环,只值八点平砍。三键诀把连招的顺序做成了考卷:三枚键摆在你面前,顺序…

2026-10-01 16:31 996 技术组