【游戏功能】
毒系伤害的终极形态是什么?单体毒只是一道口子,蚀心偏要让口子开花——中毒的怪死了毒溅给旁边的小怪,小怪也烂、烂了再溅——连锁腐烂直到场上一只不剩。连锁腐烂直到场上一只不剩——一只传一只、一代传一代,连锁的尽头是满场紫雾。连锁腐烂直到场上一只不剩。蚀心和灼羽的溅燃也可以做交叉——灼羽的火星先点燃小怪、蚀心的毒从大怪尸体溅给小怪,双系叠加的怪身上既有火又有毒。这篇的核心代码照引擎技能脚本的全规格写:配置表、蚀心构件、死亡溅毒钩子、定时器、调试按钮。
一、效果演示:一毒烂两,连锁清场
演示场点「蚀心!」:大怪身上挂出六秒紫雾——一秒六地烂。大怪烂死的瞬间——一团紫毒从尸体上炸开溅向旁边的小怪,小怪头顶蹦"溅毒",也开始一秒四地烂。演示里看小怪烂完的瞬间——它也是毒死的但小怪的毒不再溅第三层——溅毒只传一代。两具尸体、一道紫毒、一条连锁——蚀心的全部账目就这三笔。蚀心的全部账目就这三笔账。蚀心的全部账目就这三笔——大怪的燃烧、小怪的溅燃、玩家自己的输出,三笔账各有各的出口。两具尸体、一道紫毒、一条连锁——蚀心的全部账目就这三笔。小怪的毒也可以再溅——如果场上有第三只怪的话,但"只传一代"的上限堵住了无限连锁的路。
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 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 蓄力技为什么总是单发?影炮偏要贯穿全屏:蓄一秒射一道暗影弹道穿全屏——线上所有目标各挨五十五,弹道从你脚下贯穿…
【游戏功能】 灼烧为什么总烧在皮肤上?灼心偏要烧进心里:心被灼了六秒——六秒里怪每出一招就自损八,出得越多损得越多。这篇的核…
【游戏功能】 魂卫为什么只有三盏就不能多了?魂蜂偏要做成可以积累的:杀掉小怪化一盏魂蜂跟着你走,至多三盏——三盏魂蜂各自两秒…
【游戏功能】 镜墙为什么只能反弹不能冰冻?霜镜偏要双管齐下:弹道撞上霜镜原路画回去——回程的弹道还带着冰冻效果,扎中怪怪也冻…
【游戏功能】 单体射击为什么打不动厚血怪?穿心刺给的答案是:箭伤八加穿心伤,穿心伤等于最大血量百分之六——血越厚的怪越疼。这…
【游戏功能】 影刺的全机制就一句话:化影绕到它身后,从背刺出的那一刀双倍二十四——正面十二、背后二十四,它一转身就变白板。这…