【游戏功能】
后排追过一单怪事:同一个坦位的玩家,挨刀的掉血忽多忽少,最多的一次只掉了四点——装备没换、状态没变,唯一的区别是他挨刀的顺序。翻完日志才看懂:那是一套"越挨越硬"的打法,开甲之后每挨一刀添一层甲,一层一成的减伤往上叠,五层封顶的时候刀刀只掉零头。这套打法就是铜墙。这篇把整套模块拆开:配置表、甲层构件、挨打结算、定时器、调试按钮,一段一段照抄能跑。
一、效果演示:挨一刀添一层,五层封顶
演示场的怪出手勤快,一点六秒一拍。点「开甲!」:玩家脚下亮起一圈铁灰的甲环,头顶挂出"甲 零层"——开甲八秒,起手是白板。怪的刀一刀刀拍上来:第一刀十四点,甲添一层,刀变成十二点六;刀刀往上添,添到第五层,之后的每一刀只掉四点——灰字的刀全变成了铁灰的小字。八秒一到甲卸了,层数清零,下一轮再开。演示里盯两处:层数的圈一层套一层往外亮,刀的数字一层比一层小。铜墙教的不是格挡,是"把挨打变成存款"——先亏后赚,越亏越赚。
fx-stonewall
二、底层原理:一张甲层表加一份阶梯减伤
模块的机关是一对搭档。甲层表:开甲的八秒里每次被命中,层数加一、封顶五层——认的是"被命中"不是"被掉血",被盾挡掉的刀照样添层,甲层的账只进不出。阶梯减伤:每一层减伤一成,结算出口在扣血前把伤害乘上一减层数乘零点一——一层九折、三层七折、五层半价,阶梯是线性的,玩家的心算不用超过乘法口诀。和护盾那类先扣盾的分野在"甲不减存量":护盾是另外一条血,铜墙是给现有的血打折扣——甲卸了折扣就没了,一滴血都不多还你。
为什么封顶五层而不是无限叠?无限叠的版本高频怪把玩家喂成无敌铁桶,坦克的走路全变成挂机;五层的半价是"足够硬但不刀枪不入"的档位,高频怪的刀再密也得留下四点。
三、核心代码:完整模块(上·骨架)
-- @file StoneWall.lua
-- 铜墙 —— 挨一刀添一层甲,五层就是铜墙铁壁
local StoneWall = {}
local CONST = {
ARMOR_LIFE = 8.0,
ARMOR_CD = 8.0,
LAYER_CAP = 5,
CUT_PER_LAYER = 0.1,
COLOR_ARMOR = "#8a8a9a",
COLOR_DEEP = "#2e2e3e",
COLOR_GHOST = "#d8d8e8",
ZORDER_LAYER = 131,
ZORDER_FX = 135,
AUTOINC_BASE = 1004000,
}
local _armorT = 0
local _layers = 0
local _cdLeft = 0
local _armorFx = nil
local _scheduler = nil
local _autoInc = 0
local function GenID(prefix)
_autoInc = _autoInc + 1
return string.format("%s_%d", prefix or "STW",
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 AddLayer()
if _layers >= CONST.LAYER_CAP then return end
_layers = _layers + 1
SL:PlayLayerUpFx(SL:GetValue("USER_ID"), _layers)
if _layers >= CONST.LAYER_CAP then
ShowTip("五层铜墙——刀刀只掉四点,稳如老墙")
end
end
function StoneWall.Cast()
if _cdLeft > 0 or _armorT > 0 then return end
local myID = SL:GetValue("USER_ID")
if not myID then return end
_cdLeft = CONST.ARMOR_CD
_armorT = CONST.ARMOR_LIFE
_layers = 0
SafeRemove(_armorFx)
_armorFx = GUI:Layout_Create(GUI:Attach_SceneF(),
GenID("Armor"), 0, 0, 0, 0, false)
GUI:setLocalZOrder(_armorFx, CONST.ZORDER_LAYER)
SL:PlayArmorUpFx(myID)
SL:TipAboveMe("开甲!")
ShowTip("甲开了——八秒里挨一刀添一层,越挨越硬")
end
四、核心代码:完整模块(下·定时器与阶梯减伤出口)
-- 阶梯减伤出口:扣血前查层数
SL:RegisterLUAEvent(LUA_EVENT_BEFORE_HURT, "STW_Cut", function(tid, dmg)
if _armorT > 0 and tid == SL:GetValue("USER_ID") then
AddLayer()
local cut = 1 - _layers * CONST.CUT_PER_LAYER
local out = math.max(4, math.floor(dmg * cut))
SL:TipAboveMe("甲" .. _layers .. "层")
return out
end
return dmg
end)
-- 定时器:甲期倒计时与卸甲清理
if not _scheduler then
_scheduler = SL:Schedule(function(dt)
_cdLeft = math.max(0, _cdLeft - dt)
if _armorT > 0 then
_armorT = _armorT - dt
local myID = SL:GetValue("USER_ID")
local mp = GetActorPos(myID)
if _armorFx and mp then
GUI:setPosition(_armorFx, mp.x, mp.y - 40)
end
if _armorT <= 0 then
_armorT = 0
_layers = 0
SafeRemove(_armorFx)
ShowTip("甲卸了——层数清零,下轮再开")
end
end
end, 0.02)
end
SL:ScheduleOnce(function()
SL:BindDebugButton("开甲", function()
StoneWall.Cast()
end)
ShowTip("技能已加载: 铜墙 (调试按钮触发)")
end, 1.0)
function StoneWall.Unload()
if _scheduler then SL:Unschedule(_scheduler) end
SL:UnregisterLUAEvent(LUA_EVENT_BEFORE_HURT, "STW_Cut")
SafeRemove(_armorFx)
end
return StoneWall
五、机制问答
问:开甲的瞬间就挨一刀算几层?
答:算一层——甲环亮起的那一帧起账,开甲和挨打同一拍也不吃亏,起手刀就是九折。
问:甲层能带出八秒吗?
答:不能——甲卸层数清,存层的版本玩家会把五层攒到关键一刀,铜墙从常驻减伤变成定时无敌,路线就歪了。
问:毒和灼烧添层吗?
答:不添——甲层认直接命中,持续伤害绕过命中判定,铜墙挡拳头不挡烟熏,说明栏要写清。
问:五层后再挨刀还添吗?
答:不添只减——封顶后账照算,半价刀一直吃到甲卸,封顶是天花板不是闸门,减伤不断供。
问:怪换目标了甲还在吗?
答:在——甲认人不认怪,它去打队友你这八秒白开,开甲前看清楚它盯着谁,是坦克的第一课。
六、调参指南与商业服怎么用
第四笔是阶梯的斜率:每层一成五层半价是"线性好算"的档——斜率前陡后平的版本玩家算不清第五层值几钱,好算比厉害重要。第三笔是封顶的层数:五层对怪一点六秒的出手是八秒内打满的节奏——层数封顶太低甲还没热就到顶,太高打不满白设计。第二笔是甲期的长度:八秒对冷却八秒是开甲无缝的节奏——无缝版本铜墙是常驻基调,冷却拉长留真空,坦克才有"这波我硬"的时机感。第一笔是层数的圈纹:一圈甲纹一层往外亮——圈的层数就是减伤的读数,玩家数圈就知道这刀掉几成,视觉替数值站岗。常见坑三个:持续伤害添层,毒跳一次添一层的误判把甲层喂满;甲层的减伤写进防御面板,卸甲后防御不回落;盾挡的刀没添层,起手被盾吃满的玩家觉得甲是假的。
商业服里铜墙是"铁壁流派"的正装:不闪不避,站着把刀数完——商城里甲纹的样式做成品级,铁纹、铜纹、龙鳞纹,五层圈全亮的那一帧就是铁壁玩家的定妆照。运营落地还有两笔:一段是高频怪图鉴——哪种怪打铜墙最赚写进页脚,坦克玩家带着答案选图;一段是硬甲榜——按开甲期间吸收的总伤排名,站最久的人有碑。变体做成反弹甲:五层封顶后再挨的刀按半价弹回一半——铜墙从纯守长成守中带打。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。
墙的哲学就一句:刀来就得接着,接着接着,墙就成了。
写完留一句给做减伤系的同学:铜墙卖的是"挨打也是攒钱"——那一圈圈往外亮的甲纹,是把每一刀都存进墙里的利息,墙越挨越厚,人越站越稳。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 先消费后还款这事儿,战场上也行得通?赊账的答案是行得通,但有利息:点一下赊账,下一刀双倍——多出来的那十点伤害…
【游戏功能】 为什么棒球里全垒打最值钱?因为球在天上的那一秒,全场的眼睛都仰着头。全垒把这份仰头搬进了打架:一记挑空把小怪送…
【游戏功能】 后台埋点抓到一个怪数据:某位玩家的承伤记录里,被远程命中数是零——不是躲得快,是他挨的每一箭都"消失了"。翻录…
【游戏功能】 P.x, C.x = C.x, P.x —— 一行换位,借刀的全部机关就藏在这一笔里:玩家和小怪换个位置,怪的…
【游戏功能】 打群架的最高境界是什么?是一个人打,让对面自己人打自己人。搬兵把这句话演成了动作:抓住一只小怪举过头顶,抡圆了…
【游戏功能】 同样的装备,为什么老玩家打得越来越疼?新手第一刀十点,第一百刀还是十点;老玩家第一刀十点,第一百刀已经十四——…