【游戏功能】
毒系伤害的终极形态是什么?单体毒只是一道口子,蚀心偏要让口子开花——中毒的怪死了毒溅给旁边的小怪,小怪也烂、烂了再溅——连锁腐烂直到场上一只不剩。连锁腐烂直到场上一只不剩——一只传一只、一代传一代,连锁的尽头是满场紫雾。连锁腐烂直到场上一只不剩。蚀心和灼羽的溅燃也可以做交叉——灼羽的火星先点燃小怪、蚀心的毒从大怪尸体溅给小怪,双系叠加的怪身上既有火又有毒。这篇的核心代码照引擎技能脚本的全规格写:配置表、蚀心构件、死亡溅毒钩子、定时器、调试按钮。
一、效果演示:一毒烂两,连锁清场
演示场点「蚀心!」:大怪身上挂出六秒紫雾——一秒六地烂。大怪烂死的瞬间——一团紫毒从尸体上炸开溅向旁边的小怪,小怪头顶蹦"溅毒",也开始一秒四地烂。演示里看小怪烂完的瞬间——它也是毒死的但小怪的毒不再溅第三层——溅毒只传一代。两具尸体、一道紫毒、一条连锁——蚀心的全部账目就这三笔。蚀心的全部账目就这三笔账。蚀心的全部账目就这三笔——大怪的燃烧、小怪的溅燃、玩家自己的输出,三笔账各有各的出口。两具尸体、一道紫毒、一条连锁——蚀心的全部账目就这三笔。小怪的毒也可以再溅——如果场上有第三只怪的话,但"只传一代"的上限堵住了无限连锁的路。
fx-heartrot
二、底层原理:一份中毒表加一次死亡溅毒钩子
模块的机关是一对搭档。中毒表:大怪身上挂六秒的跳秒计时——一秒一跳六点,跳完自然消。死亡溅毒钩子:中毒的怪死亡时查旁边有没有可感染的小怪——有就给它挂一代短毒——溅毒只传一代不再传第二代。和灼羽的分野:灼羽的溅燃是"活着的怪往旁边溅",蚀心的溅毒是"死了的怪往旁边溅"——一个从活体传、一个从尸体传,触发条件完全不同。一个从活体传、一个从尸体传,触发条件完全不同。蚀心和灼羽的分野:灼羽的溅燃从活体传、蚀心的溅毒从尸体传——活传考的是引怪的走位、死传考的是击杀的顺序,两个溅燃机制教的是两种走位课。
三、核心代码:完整模块(上·骨架)
-- @file HeartRot.lua
-- 蚀心 —— 毒从死尸溅开,一只烂了旁边跟着烂
local HeartRot = {}
local CONST = {
POISON_LIFE = 6.0,
POISON_CD = 4.0,
POISON_DMG = 6,
SPLASH_LIFE = 4.0,
SPLASH_DMG = 4,
SPLASH_RANGE = 80,
COLOR_ROT = "#a371f7",
COLOR_DEEP = "#3a1a5e",
COLOR_GHOST = "#e8d8fa",
ZORDER_ROT = 129,
ZORDER_FX = 135,
AUTOINC_BASE = 973000,
}
local _mainRot = { t = 0, tick = 0 }
local _minionRot = { t = 0, tick = 0 }
local _cdLeft = 0
local _scheduler = nil
local _autoInc = 0
local function GenID(prefix)
_autoInc = _autoInc + 1
return string.format("%s_%d", prefix or "HRT",
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 HeartRot.Cast()
if _cdLeft > 0 then return end
if _mainRot.t > 0 then return end
_cdLeft = CONST.POISON_CD
_mainRot.t = CONST.POISON_LIFE
_mainRot.tick = 0
ShowTip("蚀心上了——六秒一秒六,死了溅给旁边")
end
-- 死亡溅毒钩子
SL:RegisterLUAEvent(LUA_EVENT_MONSTER_DEAD, "HRT_Dead", function(data)
if data and data.poisoned and _mainRot.t > 0 then
local dp = GetActorPos(SL:GetValue("MINION_ID"))
local mp = GetActorPos(SL:GetValue("MARK_TARGET_ID"))
if dp and mp then
local dist = math.abs(dp.x - mp.x)
if dist <= CONST.SPLASH_RANGE then
_minionRot.t = CONST.SPLASH_LIFE
_minionRot.tick = 0
SL:TipAbove(SL:GetValue("MINION_ID"), "溅毒!")
end
end
end
end)
if not _scheduler then
_scheduler = SL:Schedule(function(dt)
_cdLeft = math.max(0, _cdLeft - dt)
if _mainRot.t > 0 then
_mainRot.t = _mainRot.t - dt
_mainRot.tick = _mainRot.tick + dt
if _mainRot.tick >= 1.0 then
_mainRot.tick = _mainRot.tick - 1.0
SL:ActorHurt(SL:GetValue("MARK_TARGET_ID"),
CONST.POISON_DMG)
end
end
if _minionRot.t > 0 then
_minionRot.t = _minionRot.t - dt
_minionRot.tick = _minionRot.tick + dt
if _minionRot.tick >= 1.0 then
_minionRot.tick = _minionRot.tick - 1.0
SL:ActorHurt(SL:GetValue("MINION_ID"),
CONST.SPLASH_DMG)
end
end
end, 0.02)
end
SL:ScheduleOnce(function()
ShowTip("技能已加载: 蚀心 (调试按钮触发)")
end, 1.0)
return HeartRot
五、调参指南与商业服怎么用
调参三笔账。毒伤六对六秒是三十六的 跳表总产值——总产值要压在玩家同期输出的一半以内,毒系是磨不是砍。溅毒只传一代是连锁的天花板——不设天花板的版本毒会无限传染全场。溅毒范围八十步对怪的巡逻密度——范围太宽溅不到人,太窄连锁断了。常见坑三个:死亡钩子没查死因,被普攻打死的也算中毒死溅了毒;小怪的毒到期后没有清视觉,无毒之雾满地飘;蚀心的冷却从挂毒起算而不是从毒散起算,毒散后还要等冷却才能上第二道。
商业服里蚀心是"毒系流派"的核心课:连锁腐烂的教学写在第一场小怪关——会溅的玩家两只一起清,不会的玩家一只一只磨,教学的价值写在通关时间上。教学的价值写在通关时间上。蚀心和血契链的交叉也值得一提——血契链把两只怪的伤害连在一起,蚀心把两只怪的中毒连在一起,连伤加连毒就是双倍的连锁体验。商城里蚀心的颜色做成品级——紫毒、绿毒、血毒,连锁腐烂的每一层毒都有专属色。连锁腐烂的每一层毒都有专属色。蚀心的死亡溅毒也要有音效——尸体炸开的一声闷响配毒溅的嘶声,声画同步玩家才信毒真的会传染。连锁腐烂的每一层毒都有专属色。蚀心的跳秒也要和灼羽区分——灼羽一秒十二的痛、蚀心一秒六的烂,痛是火烧的急、烂是毒泡的慢,两种跳秒两种性格。变体做成蚀心风暴:场上有三只中毒的怪时毒的跳秒翻倍——数量驱动的伤害加成把连锁的概念推到了极致。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。
写完留一句给做毒系的同学:蚀心卖的是"死也伤人"——毒从尸体上溅开的那一瞬,死亡不再是终结而是下一段痛苦的起点。死亡不再是终结而是下一段痛苦的起点,蚀心的每一条命都是下一段痛苦的种子。毒从尸体上溅开的那一瞬,死亡不再是终结而是下一段痛苦的起点。蚀心的连锁上限也要在演示里体现——只传一代的规矩让玩家知道连锁有尽头,连锁有尽头的机制才有策略的深度。连锁有尽头的机制才有策略的深度——无限连锁的版本毒自己就会清场,玩家的操作沦为看戏。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 控制技能的镜像问题是:锁住了怪,自己是不是也闲着?影锁把这道两难摆上台面:影锁四秒,它动不了、你也动不了——它…
【游戏功能】 打断为什么只有"清读条"一种?震魂偏要反过来——不清招、不断势,打在它读条半途的那一劲顺着招震进腑——中劲十秒…
【游戏功能】 蜂群为什么总是一只一只出?蜂王偏要让它们进化:放一只蜂王出来,杀掉小怪喂它——喂三只升一阶,三阶蜂王的毒刺一秒…
【游戏功能】 技能为什么总是不扣自己的血?血刃偏要反着来:开着血刃的每一刀先扣自己二血、命中回三血——净赚一但要打得中,空刀…
【游戏功能】 bn.t = bn.t - dt ——一行旗面倒计时的代码,撑起了破军旗全部的紧迫感:旗立三秒、圈内加攻三成,…
【游戏功能】 淬毒为什么要一毒到底?淬毒刃偏要一层一层叠:一刀淬一层毒、毒层一秒六地烂,六层封顶之后一刀下去毒伤三十六——叠…