【游戏功能】
先抛一个坑:预支的刀为什么后三刀变轻?当铺的规矩是先支后还:重刀四十现在拿走,账上记三笔,之后三刀每刀只值二,还清才能再当。预支不是白给的爆发,是拿未来的伤换现在的重——利钱算不清的人,当一次亏一次。这篇把当铺预支整套写法拆开:当票挂账、重刀到手、轻刀还账、还清再当,一段一段照抄能跑。
一、效果演示
演示场柜台旁挂着三格当票。点「预支!」:掌柜的一锤定音,下一刀直接四十的重价砸出去;与此同时当票三格亮起——之后的每一刀只值二,砍三刀还清三笔,当票熄灭恢复清白之身。清白的时候才能再当,两秒一当的冷却管着节奏。重刀来得痛快,轻刀还得诚实,这买卖值不值,看你在什么当口当。
flowchart TD
A[点预支] --> B{当票清白吗}
B -- 挂账 --> C[拦下 先还账]
B -- 清白 --> D[重刀四十到手]
D --> E[当票三格亮起]
E --> F[后三刀每刀只值二]
F --> G{三笔还清了吗}
G -- 没有 --> F
G -- 还清 --> H[清白之身 再当可期]
fx-crest-pawn
二、底层原理
预支系统的机关是"当票挂账"——重刀预支的代价明明白白挂在三格当票上:之后三刀每刀只值二,格还一笔熄一笔。预支与还账是同一笔账的两段:四十的重是借来的,二十二的还(二乘三)是利钱,借四十四还二十二的账面看着是赚,但轻刀的三拍里你可能挨两爪——利钱不在数字上,在轻刀窗口的风险里。
三格当票把账亮在明处:挂几笔、还几笔,玩家数着格子打——还账期什么时候结束、下一记重刀什么时候能当,全在格子上。两秒一当的冷却管的是频率,清白之身的门槛管的是资格:资格加频率双闸,预支才不会变成每刀必开的常态技。幂尔框架这边当票收在预支的口子里挂账,还账记在命中口里熄格,清白的判定读当票的格数,账面三格到底。
这套玩法的代码量不到七十行,难的不是当重刀而是利钱的诚实——借的账不挂在明面上,预支就成了无本的爆发。
再看还账为什么用"轻刀"而不是"停刀"——三刀停手的版本,还账期玩家只能干看,当铺的账还清了手感却断了;轻刀还账的版本,每一刀都还在打,只是分量给了账——节奏不断,账也在走。惩罚的接法要接在动作的流上:打断流的惩罚教会玩家恨机制,顺着流的惩罚教会玩家算机制。
三、核心代码:完整模块(上·骨架)
-- @file CrestPawn.lua
-- 当铺预支纹 —— 先支重刀后还账 三刀利息要算清
local CrestPawn = {}
local CONST = {
LOAN_DMG = 40,
REPAY_HITS = 3,
REPAY_DMG = 2,
SWING_CD = 2,
AUTOINC_BASE = 1203600,
}
local _debt = 0
local _loan = false
local _cd = 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 CrestPawn.Debt() return _debt end
function CrestPawn.Clean() return _debt == 0 end
-- 预支: 当票挂账
function CrestPawn.Pawn()
if _cd > 0 then
ShowTip("掌柜的合算盘——再等" .. math.ceil(_cd) .. "秒")
return false
end
if not CrestPawn.Clean() then
ShowTip("旧账未清——还剩" .. _debt .. "笔轻刀")
return false
end
_cd = CONST.SWING_CD
_loan = true
ShowTip("当出一记重刀——后三刀只值二")
return true
end
四、核心代码:完整模块(下·推进与卸载)
-- 命中结账: 重刀落 当票亮
function CrestPawn.Settle()
if _loan then
_loan = false
_debt = CONST.REPAY_HITS
ShowTip("预支到账——数着当票还")
return CONST.LOAN_DMG
end
if _debt > 0 then
_debt = _debt - 1
if _debt == 0 then
ShowTip("账还清了——清白之身")
else
ShowTip("还一笔——剩" .. _debt .. "笔")
end
return CONST.REPAY_DMG
end
return 14
end
if not _ticker then
_ticker = SL:Schedule(function(dt)
if _cd > 0 then _cd = _cd - dt end
end, 0.05)
end
SL:ScheduleOnce(function()
SL:BindDebugButton("预支!", function()
CrestPawn.Pawn()
end)
ShowTip("技能已加载: 当铺预支纹")
end, 1.0)
function CrestPawn.Unload()
if _ticker then SL:Unschedule(_ticker) end
_debt = 0
end
return CrestPawn
五、机制问答
问:预支的利钱藏在哪里?
答:轻刀三拍的风险里——借四十还二十二看着是赚,轻刀窗口挨的爪才是真利钱。
问:当票为什么亮三格?
答:账挂明处——挂几笔还几笔数着格子打,还账期什么时候结束一目了然。
问:还账为什么用轻刀不停刀?
答:接在动作的流上——停刀的版本账清了手感断了,轻刀还账节奏不断账也在走。
问:双闸管的是什么?
答:资格加频率——清白之身管资格,两秒冷却管频率,预支当不成常态技。
问:什么当口当最值?
答:怪的血线将断未断时——重刀收尾在借来的拍子里,轻刀的账留给下一只开张。
六、调参与实战怎么用
参数层面三个量——预支分量、还账笔数、轻刀价。借四十还二十二看着是赚,真账要在轻刀窗口的风险里算。当票的语气也得做足:挂账时格子亮、还清时格子熄,掌柜的一句"清白之身"比数值提示更像那么回事。实战里这套当票挂账的骨架能搬去透支拳、赊账咒、预付剑气,全是当票、重手、轻还一条线。常见坑两个:利钱藏在暗处,预支成无本爆发;还账停刀,账清了手感断。
补充一个设计层面的思考——战斗之外的空档也是玩法:怪倒之后的三秒、换场的间隙、回合之间的喘口,这些空档塞进不同的经营与选择,战斗的呼吸就完整了。空档里给的选择要短平快:三秒能看完、一点能买定,拖泥带水的空档玩法会让玩家跳过它,跳过等于白做。
补充一个维护层面的思考——概率展示类的状态(扣着的碗、没亮的碑、随机摆的货)要在每一局开始时重洗、结束时清点:上一局剩下什么这一局还摆什么,玩家很快就能摸出固定套路,随机的乐趣就成了背版。重洗的口子收在开局一处,清点写在卸载一行,谁也别留尾巴。
补充一个工程层面的思考——跨阶段的账(预支的债、记下的仇、买断的货)要在阶段切换的口子上自检一遍:换怪了、重开了、演出的半路了,凡是账还挂在已经不存在的对象上,就地作废。自检一行换来的是账本永远只认还活着的对象,幽灵账无处落脚。
写完留一句给做借贷系的同学:玩家当的是重刀也是未来三拍的分量——当票亮三格,利钱算得清,预支才敢用在刀刃上。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
接手二开的兄弟几乎都撞过同一堵墙:玩家嫌走路"一格一格像机器人",老板拍板要"丝滑移动",改服务端速度?不对。改客户端动画帧…
【游戏功能】 先看一个熟场面:法师的火球特效挂在怪的脚后跟上,明明技能说明写着"焚烧其面",火星子却在地上打滚。群里有位策划…
【游戏功能】 上周有个开服的老板在群里发了一段录屏:他的战士明明刀刀都砍中了,观众却一片"这刀挥空了吧"。他原话是"判定日志…
【游戏功能】 先说结论放在开头:怪的皮一会儿绿一会儿红,不是美术换了几套贴图,是染色系统在怪身上盖了一层"色镜"。开服群里有…
前两天群里有个架设的朋友问了个需求:中毒的人要变绿、每两秒掉一次血、毒还能叠五层,问是不是要在服务端把整套状态机重写。我说你…
【游戏功能】 先抛一个坑:五口钟一模一样大,为什么一口比一口疼?先后次序动不得吗?倒过来敲会怎样?这篇把编钟纹整套写法拆开:…