【游戏功能】
再抛一个坑:刀刀天差地别,是本事还是抽签?掷点类的纹给过答案——方差就是乐趣。可总有玩家不这么想:上一刀二十八下一刀六,账面均着十五,心里坐的是过山车。稳刀纹是为这批人做的:近三刀上秤,抹平高低,刀刀一个价——掷出四、十七、九,秤上一平,接下来刀刀十。心电图拉成直线,账好算了,心也定了。这篇把整套模块拆开:配置表、掷点原料、滚动均账、拉平结算、定时器、调试按钮,一段一段照抄能跑。
一、效果演示:大起大落全抹平,刀刀一个价
演示场怪照常挨打。点「稳刀!」:一圈青蓝色的纹架在玩家身侧——十二秒稳刀期。这一拍起你的每一刀先掷原料:灰色的"掷4""掷17"小字照样蹦,可落刀的实数走的是秤——近三掷一平均,十点十点又十点,灰字的起落在头顶的"近三均X"里被抹成一条直线。纹收了秤撤走,刀回到大起大落的平常日子。演示里试两笔账:稳刀期的总账和平常期的总账几乎一样——秤不偷你的刀,它只是把过山车换成了传送带。稳刀纹教的是求稳:不图刀刀暴富,图的是刀刀有数。
fx-smoothcut
二、底层原理:一份掷点原料加一次滚动拉平
模块的机关是一对搭档。掷点原料:稳刀期的每一刀照旧掷点——四到二十的天意照掷不误,灰字里蹦的就是这份原料,没有原料的秤是空秤。滚动拉平:原料进秤,落刀的实数取近三掷的均值——高三十二被低四拉下来,低四被高二十托上去,三掷一滚,账面永远是那条平线。和固定伤害的分野在"稳刀的平是滚出来的":固定刀是掐死了不发牌,稳刀是照发牌但按三张的均价出账——天意还在,只是天意被摊薄了。
窗口为什么取近三掷不取全场?全场均值是死水——打了十刀拉平的数字几乎不动,秤成了摆设;三掷一滚的平线带着细微的起伏,每掷一刀秤都轻轻晃一下,"稳"里留着活气,账本不至于闷死,晃归晃,账还是那本账。
三、核心代码:完整模块(上·骨架)
-- @file SmoothCut.lua
-- 稳刀秤纹 —— 大起大落全抹平,刀刀一个价
local SmoothCut = {}
local CONST = {
CREST_LIFE = 12.0,
CREST_CD = 4.0,
ROLL_MIN = 4,
ROLL_MAX = 20,
WINDOW_N = 3,
COLOR_SMOOTH = "#6088a0",
COLOR_DEEP = "#1e3448",
COLOR_GHOST = "#b0d0e8",
ZORDER_SMOOTH = 133,
ZORDER_FX = 135,
AUTOINC_BASE = 1106000,
}
local _crestT = 0
local _cdLeft = 0
local _rolls = {}
local _crestFx = nil
local _scheduler = nil
local _autoInc = 0
local function GenID(prefix)
_autoInc = _autoInc + 1
return string.format("%s_%d", prefix or "SMC",
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 RollDice()
return math.random(CONST.ROLL_MIN, CONST.ROLL_MAX)
end
function SmoothCut.Average()
local sum, n = 0, 0
for _, v in ipairs(_rolls) do
sum = sum + v
n = n + 1
end
if n == 0 then return 0 end
return math.floor(sum / n)
end
四、核心代码:完整模块(下·入秤与拉平落刀)
-- 入秤与拉平:掷点进原料,落刀取均值
SL:RegisterLUAEvent(LUA_EVENT_MELEE_DAMAGE, "SMC_Flat", function()
if _crestT <= 0 then return 0 end
local roll = RollDice()
table.insert(_rolls, roll)
while #_rolls > CONST.WINDOW_N do
table.remove(_rolls, 1)
end
SL:TipAbove(SL:GetValue("MARK_TARGET_ID"),
"掷" .. roll)
return SmoothCut.Average() - roll
end)
function SmoothCut.Cast()
if _cdLeft > 0 or _crestT > 0 then return end
local myID = SL:GetValue("USER_ID")
_cdLeft = CONST.CREST_CD
_crestT = CONST.CREST_LIFE
_rolls = {}
SafeRemove(_crestFx)
_crestFx = GUI:Layout_Create(GUI:Attach_SceneF(),
GenID("Scale"), 0, 0, 0, 0, false)
GUI:setLocalZOrder(_crestFx, CONST.ZORDER_SMOOTH)
SL:PlayScaleUpFx(myID)
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 myID = SL:GetValue("USER_ID")
local mp = GetActorPos(myID)
if _crestFx and mp then
GUI:setPosition(_crestFx, mp.x, mp.y - 62)
end
if _crestT <= 0 then
SafeRemove(_crestFx)
ShowTip("纹收了——刀又回到大起大落")
end
end
end, 0.02)
end
SL:ScheduleOnce(function()
SL:BindDebugButton("稳刀", function()
SmoothCut.Cast()
end)
ShowTip("技能已加载: 稳刀秤纹 (调试按钮触发)")
end, 1.0)
function SmoothCut.Unload()
if _scheduler then SL:Unschedule(_scheduler) end
SL:UnregisterLUAEvent(LUA_EVENT_MELEE_DAMAGE, "SMC_Flat")
SafeRemove(_crestFx)
_crestT = 0
_rolls = {}
end
return SmoothCut
五、机制问答
问:秤会偷我的刀吗?
答:不偷——掷点的总账和秤后的总账一样,秤挪的是每刀的分布不是刀的总量,高一刀低一刀的差距被匀进了每刀里。
问:前三刀不满三掷怎么算?
答:有几掷均几掷——头一刀就按头一刀的原料出账,第二刀两掷均分,第三刀起才是满秤。
问:稳刀和醉纹是死对头吗?
答:正好相反——醉纹造方差,稳刀吃方差,先醉后稳等于把骰子的心跳拉成直线,两种口味自己挑。
问:掷点原料的区间能改吗?
答:能——原料区间走配置表,区间越宽秤越有意义,区间本来就近的刀上秤是白搭。
问:纹收了最后一秤还作数吗?
答:不作数——秤随纹走,纹收的下一刀回到裸掷,账本两清。
六、调参指南与商业服怎么用
第四笔是秤窗的格数:三掷一滚是秤的心跳——窗太大平线成了死水,太小两掷就平失去"滚"的味道,三掷刚好看得见秤在晃。第三笔是原料的区间:四到二十是五倍的落差——落差不足五成的刀上秤没意义,十倍的落差拉平得太爽变输出挂,五倍是"抹得平也疼得着"的原料。第二笔是账面的诚实:灰字掷点必须照蹦——藏起原料只报均值的秤是黑秤,玩家得看得见天意被怎么匀的,秤才立得住。第一笔是平线的活气:头顶的"近三均"要随着每一掷轻轻晃——晃是秤的呼吸,纹丝不动的数字和固定伤害没差别。常见坑三个:滚动窗口的移出逻辑写反导致均值越滚越大;灰字掷点和实数落刀混色分不清;秤环跟画在玩家疾跑后飘出了屏幕。
商业服里稳刀纹是"账秤行"的招牌:别人赌刀,他称刀——商城里秤环的样式做成品级,木秤纹、铜秤纹、官铸铁秤纹,那圈青蓝色的秤环就是账秤行的公平秤。运营落地还有两笔:一段是定心教学——教一句"不求刀刀暴富,但求刀刀有数",流派第一课是知足;一段是定秤榜——按稳刀期的账面波动最小值排名,心最定的人有碑。变体做成双秤:近三掷去掉最高最低再取均——从普通秤到去极值的名秤,账秤行的秤越挂越精。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。
写完留一句给做平滑系的同学:稳刀纹卖的是"天意也讲先来后到"——那行轻轻晃动的近三均和被抹成直线的落刀数,是把掷骰的心跳接上稳压器的一纸合同。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
接手二开的兄弟几乎都撞过同一堵墙:玩家嫌走路"一格一格像机器人",老板拍板要"丝滑移动",改服务端速度?不对。改客户端动画帧…
【游戏功能】 先看一个熟场面:法师的火球特效挂在怪的脚后跟上,明明技能说明写着"焚烧其面",火星子却在地上打滚。群里有位策划…
【游戏功能】 上周有个开服的老板在群里发了一段录屏:他的战士明明刀刀都砍中了,观众却一片"这刀挥空了吧"。他原话是"判定日志…
【游戏功能】 先说结论放在开头:怪的皮一会儿绿一会儿红,不是美术换了几套贴图,是染色系统在怪身上盖了一层"色镜"。开服群里有…
前两天群里有个架设的朋友问了个需求:中毒的人要变绿、每两秒掉一次血、毒还能叠五层,问是不是要在服务端把整套状态机重写。我说你…
【游戏功能】 先抛一个坑:五口钟一模一样大,为什么一口比一口疼?先后次序动不得吗?倒过来敲会怎样?这篇把编钟纹整套写法拆开:…