【游戏功能】
下一封战书是什么概念?是你和它同时签下"六秒内往死里打"的字据:你加三,它加四——它的刀更疼,你的刀也不再客气。下战书把这种古老的双刃礼节做成了机制:战期六秒,两边的刀一起开锋;息战两秒,各回各的账。这篇把整套模块拆开:配置表、战书构件、战期结算、定时器、调试按钮,一段一段照抄能跑。
一、效果演示:下一封战书,两边都往死里打
演示场点「下战书!」:一圈虚线战环把玩家和怪圈在同一个场里——"应战"两个字在两边头顶同时蹦出。战期六秒:你的刀从灰十变红十三,它的爪从十四变十八——红字对红字,两边都往死里打。六秒战罢,战环散掉:"息战两秒"——双方刀口一起回落,谁也不欠谁。演示里算两笔账:战期的净差是你加三它加四——净亏一点;但六秒里你打出的总伤比平时多出小二十,赌的是自己手比它快。下战书玩的是对赌:把胜负压缩进六秒,让快刀的人占便宜。
fx-duelring
二、底层原理:一条战期双开加一段息战真空
模块的机关是一对搭档。战期双开:战书落定挂六秒——这段时间里玩家的出刀加三、怪的出爪加四,两份加成同开同关,战环里没有单方面的便宜。息战真空:战罢强制两秒回落——两边的刀口一起回档,谁也别想趁着战期的尾劲偷袭。和增伤类单方面增益的分野在"加成是对赌的":寻常增伤白给,战书的加成连着对方的加成一起发——要三点的甜头,就得咽四点的苦,净亏的那一点就是战书的胆量税。
为什么它的加成要比你多一点?多的这一点是战书的诚意——单方面占优的双开是陷阱不是礼节,明知道净亏还下的战书,才配叫战书。
三、核心代码:完整模块(上·骨架)
-- @file DuelRing.lua
-- 下战书 —— 战期六秒,两边都往死里打
local DuelRing = {}
local CONST = {
DUEL_LIFE = 6.0,
REST_TIME = 2.0,
MY_AMP = 3,
FOE_AMP = 4,
BOOK_CD = 8.0,
COLOR_DUEL = "#c04848",
COLOR_DEEP = "#481414",
COLOR_GHOST = "#f0b8b0",
ZORDER_RING = 129,
ZORDER_FX = 135,
AUTOINC_BASE = 1026000,
}
local _duelT = 0
local _restT = 0
local _duelID = 0
local _cdLeft = 0
local _ringFx = nil
local _scheduler = nil
local _autoInc = 0
local function GenID(prefix)
_autoInc = _autoInc + 1
return string.format("%s_%d", prefix or "DLR",
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 DuelRing.Book()
if _cdLeft > 0 then
ShowTip("战书在手——" .. string.format("%.1f", _cdLeft) .. "秒")
return
end
if _duelT > 0 then
ShowTip("战正酣——还剩" .. string.format("%.1f", _duelT) .. "秒")
return
end
if _restT > 0 then
ShowTip("息战期——它不接战书")
return
end
local tid = SL:GetValue("MARK_TARGET_ID")
if not tid then return end
_cdLeft = CONST.BOOK_CD
_duelT = CONST.DUEL_LIFE
_duelID = tid
SL:PlayBookAcceptedFx(tid)
SL:TipAboveMe("应战!")
SL:TipAbove(tid, "应战!")
ShowTip("战书下了——六秒里你加三它加四,往死里打")
end
四、核心代码:完整模块(下·定时器与战期结算)
-- 战期结算:两边的刀一起开锋
SL:RegisterLUAEvent(LUA_EVENT_MELEE_HIT, "DLR_My", function(tid)
if _duelT > 0 and tid == _duelID then
return CONST.MY_AMP
end
return 0
end)
SL:RegisterLUAEvent(LUA_EVENT_MONSTER_STRIKE, "DLR_Foe", function(tid, dmg)
if _duelT > 0 and tid == _duelID then
return dmg + CONST.FOE_AMP
end
return dmg
end)
-- 定时器:战环跟场与息战回落
if not _scheduler then
_scheduler = SL:Schedule(function(dt)
_cdLeft = math.max(0, _cdLeft - dt)
if _duelT > 0 then
_duelT = _duelT - dt
local tp = GetActorPos(_duelID)
if not tp or SL:GetValue("ACTOR_DEAD", _duelID) then
_duelT = 0
SafeRemove(_ringFx)
_ringFx = nil
return
end
if _duelT <= 0 then
_duelT = 0
_restT = CONST.REST_TIME
SafeRemove(_ringFx)
_ringFx = nil
ShowTip("战罢——息战两秒,各回各的账")
end
end
end, 0.02)
end
SL:ScheduleOnce(function()
SL:BindDebugButton("下战书", function()
DuelRing.Book()
end)
ShowTip("技能已加载: 下战书 (调试按钮触发)")
end, 1.0)
function DuelRing.Unload()
if _scheduler then SL:Unschedule(_scheduler) end
SL:UnregisterLUAEvent(LUA_EVENT_MELEE_HIT, "DLR_My")
SL:UnregisterLUAEvent(LUA_EVENT_MONSTER_STRIKE, "DLR_Foe")
SafeRemove(_ringFx)
_duelT = 0
end
return DuelRing
五、机制问答
问:战期里能跑出战环吗?
答:跑得出但不体面——战环只是圈地不是牢笼,跑出去战期照走,加成照吃,只是这封战书赢得毫无颜色。
问:战期里第三者插手算吗?
答:战书只圈两个人——别人的刀不进这个环,插手的伤害按平常算,战期是你们俩的私人恩怨。
问:息战期谁先动手谁占便宜吗?
答:都不占——息战期两边的刀口都在档上,先动的刀也不加成,两秒是给双方整理账目的礼数。
问:战期被控了白过吗?
答:白过——战表认时不认人,被晕的两秒战期照样烧,下战书之前先掂量自己站得稳不稳。
问:能连下两封战书吗?
答:不能——一封战书一场恩怨,息战期没过它不接新战书,连着下的版本战期成了常驻模式。
问:战期和摘珠能叠加吗?
答:能——战期加的是结算层的刀口,摘珠断的是它的奶源,两套机制互不搭线,一起开就是双管齐下。
六、调参指南与商业服怎么用
第四笔是双开的差价:你加三它加四是"净亏一点买六秒"的定价——差价拉到加二对加五,战书变成真心换命;抹平差价,战书变成白嫖的加速器,一点净亏是这机制的魂。第三笔是战期的长度:六秒对普攻周期一点四秒是四刀的窗口——战期太短一刀没砍完就散场,太长单方面挨打的时间也跟着长。第二笔是息战的礼数:两秒息战是"战罢不追"的体面——没有息战的版本战书连发,六秒一封变成永动机。第一笔是战环的仪式感:虚线战环、双边"应战"的对字——战书的一半在数值一半在排场,排场不足的战书没有签字画押的分量。常见坑三个:战期里第三方的伤害也被加成,私斗变成群殴;息战期只回玩家的刀不回怪的,单方面解约;战书对象死亡战环不散,下一只怪替它应战。
商业服里下战书是"剑客流派"的礼数:赢要赢得明码标价——商城里战环的样式做成品级,红环、金环、生死环,那圈把两个人圈在一处的虚线就是剑客的字据。运营落地还有两笔:一段是战书教学——教一句"它的加成比你多,战期拼的是手",流派第一课是认清赌桌;一段是应战榜——按战期净胜伤排名,六秒里赢得最漂亮的人有碑。变体做成生死状:战书加成翻倍、息战拉长到五秒——从切磋到搏命,赌桌加高一层。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。
战书的落款也是一句老话:环里无戏言。
写完留一句给做对赌系的同学:下战书卖的是"把胜负压缩进六秒"——那圈虚线环和两声应战,是把自己的刀和它的刀一起开锋的签字画押。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 新刷出来的怪身上为什么有金印?胎记给的答案是:每一只新生的怪都带着一枚三秒的金印胎记——三秒里打它,刀刀二十;…
【游戏功能】 prayT = 2.0 —— 念经的两秒,就是超度的全部门槛:对着一具尸体念满两秒,灰烬升起,血回二十,下一刀…
【游戏功能】 认领 = true —— 就这一行,把"打谁"变成了"认谁":第一刀落在谁身上,一封朱印就贴在谁的头顶——认过…
【游戏功能】 怪倒下的地方为什么值得多站一会儿?遗泽给了个温柔的说法:它倒下的那一片地会留下十二秒的泽环——站在环里满三秒,…
【游戏功能】 打死它为什么它又站起来了?截魂揭开底牌:这怪死后魂不散——一缕魂从尸体里飘出来,两秒半飞回右侧的石像,魂到石像…
【游戏功能】 新刷出来的怪为什么头三刀不掉血?蜕壳给了答案:它出生时带着三页硬壳,壳页一页页替它挨刀——三刀破壳,壳破的那一…