【游戏功能】
上个月的事故复盘会上有个数字被念了三遍:四成——策划写的是"同伴陪疼四成",代码落下去成了"陪疼四十点",一只爪十四点的怪给同伴挂了四十点的陪葬账,两只小怪三爪互咬直接双双倒地。四成和四十点,一字之差就是一条命。修完把这个教训写进了内讧纹的骨头里:百分比永远换算完再入账,入账前先和它自己的血量上限打一遍照面。这篇把整改后的整套模块拆开:配置表、下蛊结算、陪疼换算、连坐判定、定时器、调试按钮,一段一段照抄能跑。
一、效果演示:它打我一爪,同伴陪疼四成
演示场两只怪一左一右。点「内讧!」:一道暗红的蛊线在两只怪之间连起来——十二秒蛊期。这一拍起,它们的爪照旧往你身上招呼,可每一爪落下,出手者的同伴身上同时蹦出"内-6"的暗红字——四成的陪疼账当场划走。左边的爪重十四,右边的陪六;右边的爪十二,左边的陪五。两只怪越打你的帮手越少——它们自己的爪在替你清场。演示里试两笔账:蛊期的两只掉血速度和蛊散后只挨单只的掉血速度——蛊线连着的那段时间,你的每一份挨打都翻成一又四成。内讧纹教的是下蛊:不挡它们的刀,让它们的刀互相记账。
fx-infight
二、底层原理:一道蛊线构件加一次陪疼换算
模块的机关是一对搭档。蛊线构件:开纹那一拍一道暗红的线连起两只怪——蛊线认的是"这一对",线在的每一拍,谁动手谁的同伴陪账。陪疼换算:每一爪落你身上的伤害按四成换算成同伴的陪疼——换算是这道纹的命根,四成是比率不是定值,爪重陪得重,爪轻陪得轻。和溅射类机制的分野在"内讧的账长在出手者的同伴身上":溅射是你一刀带边料,内讧是它们自己人互相记账——你一分力没多出,它们的每一次进攻都在给同伴挖坑。
陪疼为什么四成不是对半?对半的版本两只怪互咬一轮就接近同归于尽,蛊成了秒杀器的钥匙;四成刚好是"陪得疼但陪不死"的份例——清场的活还是你的刀来干,蛊线只负责让它们的爪子发抖。
三、核心代码:完整模块(上·骨架)
-- @file Infight.lua
-- 内讧蛊纹 —— 它打我一爪,同伴陪疼四成
local Infight = {}
local CONST = {
CREST_LIFE = 12.0,
CREST_CD = 4.0,
SHARE_RATE = 0.4,
COLOR_INFIGHT = "#a85848",
COLOR_DEEP = "#481818",
COLOR_GHOST = "#f0c0b0",
ZORDER_INFIGHT = 92,
ZORDER_FX = 135,
AUTOINC_BASE = 1125000,
}
local _crestT = 0
local _cdLeft = 0
local _linkA = 0
local _linkB = 0
local _crestFx = nil
local _scheduler = nil
local _autoInc = 0
local function GenID(prefix)
_autoInc = _autoInc + 1
return string.format("%s_%d", prefix or "INF",
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 Infight.Share(tid, dmg)
local share = math.floor(dmg * CONST.SHARE_RATE)
local hpM = SL:GetValue("ACTOR_HP_MAX", tid) or 0
return math.min(share, math.floor(hpM * 0.1))
end
四、核心代码:完整模块(下·蛊线判定与陪疼入账)
-- 蛊线判定:谁对玩家出爪,谁的同伴陪疼
SL:RegisterLUAEvent(LUA_EVENT_AFTER_HURT, "INF_Share", function(tid, dmg)
if _crestT <= 0 or not tid then return end
local other = Infight.PartnerOf(tid)
if not other then return end
local share = Infight.Share(other, dmg)
if share <= 0 then return end
SL:ActorHurt(other, share)
SL:TipAbove(other, "内-" .. share)
end)
function Infight.PartnerOf(tid)
if tid == _linkA then return _linkB end
if tid == _linkB then return _linkA end
return nil
end
function Infight.Cast()
if _cdLeft > 0 or _crestT > 0 then return end
local tid = SL:GetValue("MARK_TARGET_ID")
if not tid then return end
local other = SL:FindNearMonster(tid, 300)
if not other then
ShowTip("就一只怪——蛊下给谁")
return
end
_cdLeft = CONST.CREST_CD
_crestT = CONST.CREST_LIFE
_linkA = tid
_linkB = other
SafeRemove(_crestFx)
_crestFx = GUI:Layout_Create(GUI:Attach_Scene(),
GenID("Line"), 0, 0, 0, 0, false)
GUI:setLocalZOrder(_crestFx, CONST.ZORDER_INFIGHT)
SL:PlayCurseUpFx(tid, other)
ShowTip("蛊下了——它们谁打你,同伴陪疼四成")
end
-- 定时器:蛊期倒计时与蛊线跟画
if not _scheduler then
_scheduler = SL:Schedule(function(dt)
_cdLeft = math.max(0, _cdLeft - dt)
if _crestT > 0 then
_crestT = _crestT - dt
local a = GetActorPos(_linkA)
local b = GetActorPos(_linkB)
if _crestFx and a and b then
GUI:setPosition(_crestFx,
(a.x + b.x) / 2, (a.y + b.y) / 2 - 140)
end
if _crestT <= 0 then
SafeRemove(_crestFx)
ShowTip("蛊散了——各打各的了")
end
end
end, 0.02)
end
SL:ScheduleOnce(function()
SL:BindDebugButton("内讧", function()
Infight.Cast()
end)
ShowTip("技能已加载: 内讧纹 (调试按钮触发)")
end, 1.0)
function Infight.Unload()
if _scheduler then SL:Unschedule(_scheduler) end
SL:UnregisterLUAEvent(LUA_EVENT_AFTER_HURT, "INF_Share")
SafeRemove(_crestFx)
_crestT = 0
_linkA = 0
_linkB = 0
end
return Infight
五、机制问答
问:同伴被陪疼死了算谁的击杀?
答:算你的——蛊是你下的,陪疼的账记在你名下,掉落和经验一分不少。
问:它打空了也陪疼吗?
答:不陪——账认落你身上的实伤,劈空的那一爪没有基数,陪疼无从换算。
问:陪疼能把它自己陪死吗?
答:能——换算有血量上限的照面,可陪疼是真实扣血,同伴血薄照样被自家爪子拖死。
问:蛊期内第三只怪进场怎么办?
答:进不了蛊——线只连打桩那一刻的两只,编外的怪打你不安租,想全下蛊得重下一次。
问:陪疼的账吃你的增伤吗?
答:不吃——四成认的是它爪的实伤,你的攻击力和这个比率不相干,蛊账走它自己的通道。
六、调参指南与商业服怎么用
第四笔是换算的口径:四成是比率不是定值——那场"四十点"的事故就是口径写死闹的,换算完入账、入账前和血量上限照面,两道工序一道不能省。第三笔是陪疼的份例:四成对两爪互咬是"陪得疼陪不死"的份例——份例太高蛊成了互杀的钥匙,太低两只怪毫发无伤,四成刚好让它们的爪子开始发抖。第二笔是蛊线的口径:只连开蛊那刻的两只——编外的怪不进蛊,口径松了全场互咬变成清场技,紧了蛊线成了摆设,两只的口径刚刚好。第一笔是蛊线的戏:暗红的虚线要全程绷着——线在蛊在,玩家看线就知道这笔"四成"还有几秒,线断了账就散。常见坑三个:比率误写成定值的事故原型;单怪死亡后蛊线还连着尸体结算;陪疼的飘字盖过了主伤害的飘字。
商业服里内讧纹是"蛊降门"的阴手:别人挡刀他挑事——商城里蛊线的样式做成品级,红线、血蛊线、万蛊母线,那道连在两只怪之间的暗红蛊线就是蛊降门的引子。运营落地还有两笔:一段是下蛊教学——教一句"两只一起打你才下蛊,让它们的爪自己打架",流派第一课是挑事;一段是蛊降榜——按陪疼转移的总伤排名,蛊下得最损的人有碑。变体做成蛊火燎原:陪疼死一只,蛊线自动跳向下一只——从两只互咬到一窝互咬,蛊降门的引子越下越远。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。
写完留一句给做挑拨系的同学:内讧纹卖的是"它们的刀互相记账"——那道绷在两只怪之间的暗红蛊线和一爪一个的"内"字,是把敌方的攻势折成内耗的第一道蛊符。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【语法算法】 上一版的炮台索敌逻辑有个隐蔽报错:炮台永远打同一个怪——即使那只怪已经死了,索敌的游标也不挪窝。追到底索敌的游…
【语法算法】 先抛一个坑:打不完的火系怪怎么办?火抗怪火打不动,换冰系技能要切装备要换面板——切完黄花菜都凉了。元素转换的答…
【语法算法】 上个月的事故复盘会上有个数字被念了三遍:四成——策划写的是"同伴陪疼四成",代码落下去成了"陪疼四十点",两只…
【语法算法】 单行代码拆解:弹射初速=-420——弹射的全部动力就这一行的负初速。负号朝上、四百二十是弹射的初速大小——踩上…
【语法算法】 上一版的减速类模块全按"乘以零点五"来写,帧率无关的版本照搬了这套写法——结果高帧率机上减速效果好,低帧率机上…
【语法算法】 先抛一个坑:怎么把散在四处的怪聚到一起打?逐个拉是笨办法,一个范围技又只能打一片——引力球的答案是一个会动的吸…