【游戏功能】
上一版留了个数值组连夜加班的隐蔽报错:夯土的减伤没有上限——挨打垒基、垒基减伤的循环没有刹车,叠到第十层往上是第十一层,叠到二十层怪打出的刀刀刀一血。修完钉了十层的顶,又补了四秒松土的规矩:四秒不挨打,夯实的地基当场松掉,从零再夯。这篇把整改后的整套模块拆开:配置表、夯土累计、减伤封顶、松土回零、定时器、调试按钮,一段一段照抄能跑。
一、效果演示:挨一拳,脚下的地硬三分
演示场怪照常抡爪。点「夯土!」:一圈土黄色的基环套上玩家的脚下——十四秒夯土期。怪的每一拳砸在你身上,脚下的大地就沉一分——"夯+1"的土字从地里冒出来,基环一环环变厚变沉。挨到第十拳,地基夯到顶——它二十一点的拳砸下来只剩十一二点,你脚下的土环厚得像座矮坛。可你要是四秒没挨打,土环当场松塌——"地基松了",从头再夯。演示里试两笔账:挨满十拳的减伤总账和硬扛十拳的掉血账——它的刀在替你打地基。夯土纹教的是厚积:挨打不是白挨,每一拳都在给脚下垫土。
fx-ramsoil
二、底层原理:一次夯土累计加一道减伤封顶
模块的机关是一对搭档。夯土累计:纹成期里你挨的每一拳都往地基上垒一层——一层减三分,拳拳入土,地基的厚度就是你的减伤读数。减伤封顶:十层封底三成减伤——封顶之后的拳头照挨不误,地基一寸不再厚。和免伤类机制的分野在"夯土的减伤是它的拳换来的":护体是开出来的盾,夯土是挨出来的地——它的刀越密你的地基越厚,这份减伤的账本写在它的出手记录里,想拆你的地基它就得先停手。
松土为什么定四秒?不松土的版本地基一场常驻,挨满十层就进了保险箱;四秒的松土期把地基变成了"挨打中"的状态——你要维持硬地基就得一直站在它刀口上,厚积是有代价的厚积。
三、核心代码:完整模块(上·骨架)
-- @file RamSoil.lua
-- 夯土基纹 —— 挨一拳,脚下的地硬三分
local RamSoil = {}
local CONST = {
CREST_LIFE = 14.0,
CREST_CD = 4.0,
STAMP_CAP = 10,
RED_PER = 3,
DECAY_LIFE = 4.0,
COLOR_SOIL = "#a08048",
COLOR_DEEP = "#483818",
COLOR_GHOST = "#f0e0b8",
ZORDER_SOIL = 89,
ZORDER_FX = 135,
AUTOINC_BASE = 1117000,
}
local _crestT = 0
local _cdLeft = 0
local _stamps = 0
local _decayT = 0
local _soilFx = nil
local _scheduler = nil
local _autoInc = 0
local function GenID(prefix)
_autoInc = _autoInc + 1
return string.format("%s_%d", prefix or "RMS",
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
-- 减伤读数:层数乘单价,封顶三成
function RamSoil.Reduce()
local n = math.min(_stamps, CONST.STAMP_CAP)
return n * CONST.RED_PER
end
四、核心代码:完整模块(下·挨打垒基与松土回零)
-- 挨打垒基:每一拳入土一层,封顶十层
SL:RegisterLUAEvent(LUA_EVENT_HURT_TAKEN, "RMS_Stamp", function(dmg)
if _crestT <= 0 then return dmg end
if _stamps < CONST.STAMP_CAP then
_stamps = _stamps + 1
SL:TipAboveMe("夯+1")
end
_decayT = 0
local red = RamSoil.Reduce()
return math.max(1, math.floor(dmg * (100 - red) / 100))
end)
function RamSoil.Cast()
if _cdLeft > 0 or _crestT > 0 then return end
local myID = SL:GetValue("USER_ID")
_cdLeft = CONST.CREST_CD
_crestT = CONST.CREST_LIFE
_stamps = 0
_decayT = 0
SafeRemove(_soilFx)
_soilFx = GUI:Layout_Create(GUI:Attach_SceneF(),
GenID("Soil"), 0, 0, 0, 0, false)
GUI:setLocalZOrder(_soilFx, CONST.ZORDER_SOIL)
SL:PlaySoilUpFx(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
if _stamps > 0 then
_decayT = _decayT + dt
if _decayT >= CONST.DECAY_LIFE then
_stamps = 0
_decayT = 0
ShowTip("四秒没挨打——地基松了,从头夯")
end
end
if _crestT <= 0 then
SafeRemove(_soilFx)
ShowTip("纹收了——地基保留到下一场")
end
end
end, 0.02)
end
SL:ScheduleOnce(function()
SL:BindDebugButton("夯土", function()
RamSoil.Cast()
end)
ShowTip("技能已加载: 夯土纹 (调试按钮触发)")
end, 1.0)
function RamSoil.Unload()
if _scheduler then SL:Unschedule(_scheduler) end
SL:UnregisterLUAEvent(LUA_EVENT_HURT_TAKEN, "RMS_Stamp")
SafeRemove(_soilFx)
_crestT = 0
_stamps = 0
end
return RamSoil
五、机制问答
问:封顶之后挨打还垒层吗?
答:不垒——十层是地基的极限,封顶后的拳头照挨不误,"夯+1"的字也不再蹦。
问:四秒的松土期挨半拳算数吗?
答:算——计时认的是最近一拳的落点,挨一下松土表当场归零,哪怕那一拳被地基减得只剩一点。
问:换目标地基跟着变吗?
答:不变——地基长在你脚下不认怪,换谁打你都照垒照减,这是夯土比那些认敌加持厚道的地方。
问:自己开的伤害算夯土吗?
答:不算——血誓那类自伤不进夯土的账,地基只认敌人的拳头,自己砸自己不配夯地。
问:纹收了地基留到下一场吗?
答:留——纹期的地基不清零,下一场开了纹接着旧地基垒,这也是它叫"基"不叫"层"的讲究。
六、调参指南与商业服怎么用
第四笔是封顶的位置:十层三成是"厚积有顶"的分寸——不封顶的版本就是那场刀刀一血的事故原型,封顶太高免伤变常态,三成刚好是"站桩流有了底气但不是铁布衫"。第三笔是单层的价:一层减三分对十四点的拳是"十拳省四点二"的斜率——斜率太陡后期刀刀挠痒,太平十层白挨,三分一层是越夯越值钱的坡。第二笔是松土的时限:四秒不挨打就松是这套纹的心跳——没有松土的版本地基一场常驻成护甲挂件,太短两拳的间隙就清零,四秒刚好卡在怪的出手节拍里。第一笔是土环的厚薄:基环随层数变厚变沉——地基的视觉就是减伤的读数,环不动玩家的心也不动。常见坑三个:层数没有封顶的数值事故;松土计时在封顶后误启动导致地基白夯;土环的厚度渲染盖住了玩家的血条。
商业服里夯土纹是"夯土帮"的底气:别人练闪避,他练挨打——商城里基环的样式做成品级,土环、石环、铁夯环,那圈随层数变厚的土环就是夯土帮的门墩。运营落地还有两笔:一段是站桩教学——教一句"它的拳是给你夯地的,站着别动",流派第一课是稳如老狗;一段是夯王榜——按单场维持满层数的总时长排名,地基夯得最厚的人有碑。变体做成层层夯:满层之后每挨五拳多减一分——从封顶到缓涨,夯土帮的门墩越垒越高。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。
写完留一句给做承伤系的同学:夯土纹卖的是"它的拳是你的地基"——那圈一拳一拳厚起来的土环和越来越轻的落刀声,是把挨打的记录夯实成减伤的一座地基。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
接手二开的兄弟几乎都撞过同一堵墙:玩家嫌走路"一格一格像机器人",老板拍板要"丝滑移动",改服务端速度?不对。改客户端动画帧…
【游戏功能】 先看一个熟场面:法师的火球特效挂在怪的脚后跟上,明明技能说明写着"焚烧其面",火星子却在地上打滚。群里有位策划…
【游戏功能】 上周有个开服的老板在群里发了一段录屏:他的战士明明刀刀都砍中了,观众却一片"这刀挥空了吧"。他原话是"判定日志…
【游戏功能】 先说结论放在开头:怪的皮一会儿绿一会儿红,不是美术换了几套贴图,是染色系统在怪身上盖了一层"色镜"。开服群里有…
前两天群里有个架设的朋友问了个需求:中毒的人要变绿、每两秒掉一次血、毒还能叠五层,问是不是要在服务端把整套状态机重写。我说你…
【游戏功能】 先抛一个坑:五口钟一模一样大,为什么一口比一口疼?先后次序动不得吗?倒过来敲会怎样?这篇把编钟纹整套写法拆开:…