【游戏功能】
怪倒下的地方为什么值得多站一会儿?遗泽给了个温柔的说法:它倒下的那一片地会留下十二秒的泽环——站在环里满三秒,泽气上身,六秒里刀刀加两成五。急着走的白走,肯停的得实惠。这篇把整套模块拆开:配置表、泽环表、踏泽结算、定时器、调试按钮,一段一段照抄能跑。
一、效果演示:倒下的怪留一圈遗泽,站进去三秒加两成五
演示场两只小怪带一只头目。普攻撂倒一只小的:它倒下的位置亮起一圈青绿的泽环,环上挂着十二秒的存续。玩家就站在环边——站满三秒的瞬间"泽+25%"蹦出来,六秒里刀刀十二点。点「踏泽!」:不用等三秒,直接把最近一环的泽气一口吸干——加成立到,环当场消失。演示里算两种路线:站环等三秒白得,和踏泽即得但环没了——站环是细水,踏泽是急用,两种喝法各有各的场合。遗泽教的是战场的节奏:怪倒下的地方不是终点,是补给点。
fx-legacyring
二、底层原理:一张泽环表加一次踏泽结算
模块的机关是一对搭档。泽环表:小怪死亡的那一帧在尸位落环——环存续十二秒、半径六十步,站进环里累计满三秒触发泽气。踏泽结算:按钮把最近一环的存续一口吸干——不等三秒直接上身六秒加成,环随之消散,攒着的多环可以一口气连踏。和领域类常驻圈的分野在"环是消耗品不是阵地":领域圈着就有效,泽环站满即耗尽——每环一口,喝完就没,补给的经济感全在"耗"字上。
泽气为什么要求站满三秒?三秒的等待是"肯停"的门槛——零门槛的版本玩家根本不会为站位做取舍,三秒的停顿让"在哪里杀怪"变成了一个值得规划的问题。
三、核心代码:完整模块(上·骨架)
-- @file LegacyRing.lua
-- 遗泽 —— 倒下的怪留一圈遗泽,站进去三秒加两成五
local LegacyRing = {}
local CONST = {
RING_LIFE = 12.0,
RING_RADIUS = 60,
STAND_NEED = 3.0,
BUFF_LIFE = 6.0,
BUFF_AMP = 1.25,
COLOR_RING = "#5aa068",
COLOR_DEEP = "#1e4a28",
COLOR_GHOST = "#c0ecd0",
ZORDER_RING = 128,
ZORDER_FX = 135,
AUTOINC_BASE = 1030000,
}
local _rings = {}
local _standT = 0
local _buffT = 0
local _cdLeft = 0
local _scheduler = nil
local _autoInc = 0
local function GenID(prefix)
_autoInc = _autoInc + 1
return string.format("%s_%d", prefix or "LGR",
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 GrantBuff()
_buffT = CONST.BUFF_LIFE
_standT = 0
SL:PlayLegacyBuffFx(SL:GetValue("USER_ID"))
SL:TipAboveMe("泽+25%")
ShowTip("泽气上身——六秒里刀刀加两成五")
end
local function DropRing(x)
table.insert(_rings, { x = x, t = CONST.RING_LIFE })
ShowTip("小的倒下留了一圈泽——站进去或踏掉都行")
end
四、核心代码:完整模块(下·定时器与踏泽出口)
-- 死亡钩子:尸位落环
SL:RegisterLUAEvent(LUA_EVENT_ACTOR_DEATH, "LGR_Drop", function(tid)
if not SL:GetValue("ACTOR_IS_SMALL", tid) then return end
local tp = GetActorPos(tid)
if tp then DropRing(tp.x) end
end)
-- 踏泽出口:吸干最近一环
function LegacyRing.Step()
if _cdLeft > 0 then
ShowTip("泽在吸——" .. string.format("%.1f", _cdLeft) .. "秒")
return
end
local myID = SL:GetValue("USER_ID")
local mp = GetActorPos(myID)
if not mp then return end
local best, bd = nil, 999
for i, r in ipairs(_rings) do
local d = math.abs(r.x - mp.x)
if d < bd then bd = d; best = i end
end
if not best then
ShowTip("地上没泽环——先放倒一只小的")
return
end
_cdLeft = 6.0
table.remove(_rings, best)
GrantBuff()
end
-- 定时器:站环累计与泽环寿命
if not _scheduler then
_scheduler = SL:Schedule(function(dt)
_cdLeft = math.max(0, _cdLeft - dt)
if _buffT > 0 then
_buffT = _buffT - dt
if _buffT <= 0 then ShowTip("泽气散了——下一环再踏") end
end
local myID = SL:GetValue("USER_ID")
local mp = GetActorPos(myID)
local inRing = false
for i = #_rings, 1, -1 do
local r = _rings[i]
r.t = r.t - dt
if r.t <= 0 then table.remove(_rings, i)
elseif mp and math.abs(r.x - mp.x) <= CONST.RING_RADIUS then
inRing = true
end
end
if inRing and _buffT <= 0 then
_standT = _standT + dt
if _standT >= CONST.STAND_NEED then GrantBuff() end
else
_standT = math.max(0, _standT - dt)
end
end, 0.02)
end
SL:ScheduleOnce(function()
SL:BindDebugButton("踏泽", function()
LegacyRing.Step()
end)
ShowTip("技能已加载: 遗泽 (调试按钮触发)")
end, 1.0)
function LegacyRing.Unload()
if _scheduler then SL:Unschedule(_scheduler) end
SL:UnregisterLUAEvent(LUA_EVENT_ACTOR_DEATH, "LGR_Drop")
_rings = {}
end
return LegacyRing
五、机制问答
问:头目倒下也留环吗?
答:留大的——头目的泽环比小怪宽一圈、存续翻倍,终局的泽是全场最大的补给。
问:站在两环重叠处算两份吗?
答:不算——泽气一人一份,重叠站只按一份起算,贪多的站法浪费的是站位不是收益。
问:泽气期能续吗?
答:不能续只能重新起——泽气过了得再站三秒或再踏一环,两段泽气之间总有空档,空档就是节奏。
问:环里的队友能蹭我的三秒吗?
答:各站各的——泽气认站不认人,队友站满他自己的三秒得他自己的加成,环是公共的自助餐。
问:环被踏掉还能站吗?
答:不能——踏泽连环带泽一口吸干,环没了站的是空气,踏与站只能选一头。
问:泽气期被控会掉加成吗?
答:不会——泽气认时长不认状态,晕住的六秒照样算,泽气上身后谁也收不回去。
六、调参指南与商业服怎么用
第四笔是环的寿命:十二秒对一场四十秒的架是"前半场的环后半场过期"——寿命太长地上环越攒越多,太短玩家还没赶到就化。第三笔是站立的门槛:三秒对六十步的环径是"走两步就够得着"的宽度——门槛五秒站成罚站,一站即得没有取舍。第二笔是加成的斤两:两成五对十点平砍是十二点五的泽刀——加成太薄站环像上香,太厚环里环外两份职业。第一笔是环的呼吸:泽环的光随存续收窄——环越暗剩下的时间越少,读环就能读出"要不要赶这一趟"。常见坑三个:头目的尸环和尸爆的火圈叠在一起,圈套圈看不清;泽气期切换场景没清,带着加成跨图;站环判定只认横坐标,斜着站出环也算站。
商业服里遗泽是"守泽人流派"的家学:别人追着怪跑,他算着怪倒在哪——商城里泽环的样式做成品级,青环、玉环、祖泽环,倒下位置亮起的那一圈青光就是守泽人的田。运营落地还有两笔:一段是落点教学——教一句"把它引到你站位好的地方再杀",流派的第一课是让怪选地方死;一段是守泽榜——按泽气期的总伤排名,最会养泽的人有碑。变体做成祖泽:头目的泽环谁站谁得、不设人数——全队站进祖泽的场面就是守泽流派的高光。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。
守泽人的账本就一句话:让它死在我站的地方。
再补一笔守泽的细账:环要十二秒过期,泽气只要六秒——一环一口刚刚好,贪第二口就得指望第二只怪。
守泽还有半句压箱的:泽环十二秒,贪第三口的人先算算自己的血。
写完留一句给做区域系的同学:遗泽卖的是"倒下的地方值得停一停"——那一圈圈青光亮起的尸位,是把每场击杀都变成补给站的地契。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 火气 = 火气 + 1 —— 每撩一下涨一格的火,三格烧满它就上头:一头冲过来,收不住脚,穿过你的位置一头扎进…
【游戏功能】 它接招的那一秒,就是你的那一秒。抛砖把这句拳谚做成了机制:一块砖头砸过去,它本能抬手格挡——格挡的一秒二里,招…
【游戏功能】 为什么偷袭总被提前发现?因为它的瞭望灯亮着——二百二十步的警戒圈画在暗处,你一踏进去它就开始上弦。瞭望换个思路…
【游戏功能】 桶存活着 = 否 —— 一箭点掉一只桶,爆的却是怪的血条:油桶就摆在它脚边,三十点的爆炸不分敌我地溅——溅不溅…
【游戏功能】 交班计时 = 1.0 —— 交班的那一秒,两个岗哨都在行礼:手离开刀,眼离开敌,全身的门都开着。交班把这一秒做…
【游戏功能】 巡逻道 = { 左桩, 右桩 } —— 巡逻道就是这两根桩之间的一条线:桩在哪,道就在哪;道在哪,它就一辈子走…