【游戏功能】
隐蔽报错引入:一个很隐蔽的报错——怪都换了下一只了,仇账还挂在上一只的名下,新怪进门就吃了记在旧怪头上的重刀。仇账的清账时机少写了"怪灭"这一条,账随怪灭没跟着走。这篇把记仇账纹整套写法重写成篇:挨打记账、账滚刀重、连本带利、清账重记,一段一段照抄能跑。
一、效果演示
演示场侠客头顶挂着仇账。怪每拍你一爪,仇账记十二——账面滚着,你的下一刀也跟着涨:挨一爪,下一刀二十六;挨两爪,下一刀三十八。这一刀把仇账连本带利砸回去,砸完清账重记。怪的账随怪灭:换新怪,账本从头记,旧怨不迁怒。挨打越狠,回敬越重——受气包的账本,反过来就是爆发的账本。
flowchart TD
A[怪拍一爪] --> B[仇账记十二]
B --> C[下一刀分量上涨]
C --> D[连本带利砸回]
D --> E[账清重记]
E --> A
F[怪灭了] --> G[账随怪灭]
G --> A
fx-crest-grudge
二、底层原理
记仇系统的机关是"挨打转刀重"——怪的每一爪都记进仇账,你的下一刀把账面连本带利砸回去。转化的妙处在时机:仇账只在"挨打之后、回敬之前"这两拍之间滚,砸出去即清——挨打与报仇之间形成一个短闭环,每一次挨打都变成下一刀的燃料。那场迁怒事故的正解就是清账的时机表:怪灭清、砸出清,两条清账的规矩一条都不能少。
仇账滚多高是个胆量题:不急着砸,多挨两爪攒一笔大的,是自己选的;账滚着被连拍,挨的每一爪都是自己账上的本金——风险与回报在同一个数字上。仇账条挂在头顶,账面红着涨,玩家看得见自己的怒气值多少钱。幂尔框架这边记账收在受击口,清账挂在砸中的那一拍,换怪的清账单独一条,三条口子各管各的。
这套玩法的代码量不到六十行,难的不是记仇而是清账的时机表——砸出清、怪灭清,少一条规矩账就串门。
再看仇账为什么不设封顶——封顶的仇账会让"故意挨打攒大招"变成最优解,挨打的痛成了刷账的燃料;不封顶的仇账,贪账的每一分都要真金白银地挨——账越高,怪越不能留,风险自己会踩刹车。不设顶的胆量来自闭环的短:仇账最多滚两三拍就被砸出去,账没有时间膨胀成毒。闭环短的账敢不封顶,闭环长的账必须画格——这是账本设计里最实用的一条分寸。
三、核心代码:完整模块(上·骨架)
-- @file CrestGrudge.lua
-- 记仇账纹 —— 挨多重记多重 下一刀连本带利
local CrestGrudge = {}
local CONST = {
GRUDGE_PER = 12,
DMG_BASE = 14,
AUTOINC_BASE = 1203700,
}
local _grudge = 0
local _autoInc = 0
local function ShowTip(msg)
if msg and msg ~= "" then SL:ShowSystemTips(msg) end
end
local function GenID()
_autoInc = _autoInc + 1
return CONST.AUTOINC_BASE + _autoInc
end
function CrestGrudge.Value() return _grudge end
-- 受击口: 挨打记账
function CrestGrudge.OnHurt(taken)
_grudge = _grudge + (taken or CONST.GRUDGE_PER)
ShowTip("仇账+" .. (taken or CONST.GRUDGE_PER)
.. "——下一刀连本带利")
end
function CrestGrudge.Dmg()
return CONST.DMG_BASE + _grudge
end
四、核心代码:完整模块(下·推进与卸载)
-- 回敬口: 砸出即清账
function CrestGrudge.Settle()
if _grudge > 0 then
ShowTip("连本带利!仇账" .. _grudge .. "砸回去了")
_grudge = 0
return true
end
return false
end
-- 换怪口: 账随怪灭
function CrestGrudge.OnNewWave()
_grudge = 0
end
SL:ScheduleOnce(function()
SL:BindDebugButton("催刀!", function()
ShowTip(_grudge > 0
and "仇账" .. _grudge .. "——这一刀连本带利"
or "催刀——挨了打再砸更疼")
end)
ShowTip("技能已加载: 记仇账纹")
end, 1.0)
function CrestGrudge.Unload()
_grudge = 0
end
return CrestGrudge
五、机制问答
问:旧账迁怒新怪的事故少写了哪条规矩?
答:怪灭清账——砸出清、怪灭清,清账的时机表一条都不能少。
问:仇账为什么不设封顶?
答:闭环短敢不封顶——两三拍就砸出去的账没时间膨胀,贪账的每一分都要真挨。
问:挨打怎么变成燃料的?
答:挨打与回敬之间的短闭环——每一爪都是下一刀的本金,受气包的账本反着写就是爆发的账本。
问:仇账条为什么挂头顶?
答:怒气值多少钱看得见——账面红着涨,砸不砸、何时砸自己掂量。
问:不砸一直攒行不行?
答:行——账越滚挨的每爪越值钱也越疼,风险与回报在同一个数字上。
六、调参与实战怎么用
参数层面两个量——每爪记账量、基础刀重。十二对十四是"一爪半刀"的线:记少了没脾气,记多了两爪就能一刀半血。实战里这套挨打转刀重的骨架能搬去怒气反击、忍辱负重、以伤换伤,全是记账、滚账、砸账清账一条线。常见坑两个:清账时机缺项,旧怨迁新怪;账设封顶,挨打攒招成了最优解。
补充一个设计层面的思考——战斗之外的空档也是玩法:怪倒之后的三秒、换场的间隙、回合之间的喘口,这些空档塞进不同的经营与选择,战斗的呼吸就完整了。空档里给的选择要短平快:三秒能看完、一点能买定,拖泥带水的空档玩法会让玩家跳过它,跳过等于白做。
补充一个维护层面的思考——概率展示类的状态(扣着的碗、没亮的碑、随机摆的货)要在每一局开始时重洗、结束时清点:上一局剩下什么这一局还摆什么,玩家很快就能摸出固定套路,随机的乐趣就成了背版。重洗的口子收在开局一处,清点写在卸载一行,谁也别留尾巴。
补充一个工程层面的思考——跨阶段的账(预支的债、记下的仇、买断的货)要在阶段切换的口子上自检一遍:换怪了、重开了、演出的半路了,凡是账还挂在已经不存在的对象上,就地作废。自检一行换来的是账本永远只认还活着的对象,幽灵账无处落脚。
写完留一句给做记仇系的同学:玩家记的是仇也是下一刀的分量——砸出清、怪灭清,短闭环的账才敢不封顶。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
接手二开的兄弟几乎都撞过同一堵墙:玩家嫌走路"一格一格像机器人",老板拍板要"丝滑移动",改服务端速度?不对。改客户端动画帧…
【游戏功能】 先看一个熟场面:法师的火球特效挂在怪的脚后跟上,明明技能说明写着"焚烧其面",火星子却在地上打滚。群里有位策划…
【游戏功能】 上周有个开服的老板在群里发了一段录屏:他的战士明明刀刀都砍中了,观众却一片"这刀挥空了吧"。他原话是"判定日志…
【游戏功能】 先说结论放在开头:怪的皮一会儿绿一会儿红,不是美术换了几套贴图,是染色系统在怪身上盖了一层"色镜"。开服群里有…
前两天群里有个架设的朋友问了个需求:中毒的人要变绿、每两秒掉一次血、毒还能叠五层,问是不是要在服务端把整套状态机重写。我说你…
【游戏功能】 先抛一个坑:五口钟一模一样大,为什么一口比一口疼?先后次序动不得吗?倒过来敲会怎样?这篇把编钟纹整套写法拆开:…