【游戏功能】
先抛一个坑:无伤通关的赏金,容错该给几爪?一爪不留的悬赏只有躲得开的人才配拿,躲不开的玩家看一眼就散了;爪爪容错的悬赏又没了含金量。悬赏的账要立在"够得着的完美"上——这篇把无伤悬赏整套写法拆开:一场一赏、容错一爪、双爪清零、层层叠价,一段一段照抄能跑。
一、效果演示
演示场左上挂着悬赏账:层数、本场挨爪数、眼下的刀重,一目了然。怪扑过来,你催刀快斩——一场里挨了一爪算容错,怪倒悬赏叠一层刀重添六;挨了两爪,赏金当场清零,飘字一点不留情面。下一只进场账目归位重新算:斩得越快挨得越少,悬赏叠得越高,刀就越重,滚雪球的节奏全在自己手上。
flowchart TD
A[开一场] --> B[挨爪计数]
B --> C[斩倒它]
C --> D{挨了几爪}
D -- 一爪以内 --> E[悬赏叠一层]
D -- 两爪往上 --> F[赏金清零]
E --> G[刀重添六]
F --> H[下一场稳着打]
G --> I[新怪 账目归位]
H --> I
I --> A
fx-crest-bounty
二、底层原理
悬赏系统的机关是"一场一审"——每只怪是一场独立的考试,考卷上只有一道题:这场挨了几爪。一爪以内算容错通过,悬赏叠一层;两爪往上当场清零。容错一爪是这套账的人情味:完全无伤的悬赏只属于躲得开的高手,容一爪的版本人人有奔头——挨一下不慌,第二下才是疼的。清零的罚要当场兑现:怪一倒账目当场宣判,飘字一点不留情面,拖到下一场再罚就没了痛感。
悬赏的层叠是长线的盼头:一层六刀,叠五层就是三十点的身价——身价越高,保住身价的动力越足,玩家会自发地打得又快又稳。这场挨的爪数实时挂在面板上,两爪的门槛看得见,玩家打的时候心里有谱。幂尔框架这边挨爪的计数收在受击口,宣判挂在击杀口,跨局的悬赏层和局内的挨爪数分两本账管,清场互不牵连。
这套玩法的代码量不到八十行,难的不是数爪子而是容错的分寸——够得着的完美才是悬赏,够不着的完美是劝退告示。
再看悬赏为什么叠层而不一次性给大赏——叠层的账是滚雪球的账:每一层都在抬高下一场的赌注,层越高玩家越输不起,紧张感自己往上爬。一次性大赏发完就完,情绪一泄到底。叠层还有一个隐性的好处:清零的罚也跟着层高走——五层清零比一层清零疼五倍,高手和新人各玩各的紧张,一套账两种心跳。
三、核心代码:完整模块(上·骨架)
-- @file CrestBounty.lua
-- 无伤悬赏纹 —— 一爪不挨 赏金叠一层
local CrestBounty = {}
local CONST = {
TOLERATE = 1,
PER_LAYER = 6,
DMG_BASE = 14,
AUTOINC_BASE = 1202100,
}
local _layer = 0
local _taken = 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 CrestBounty.Layer() return _layer end
function CrestBounty.Taken() return _taken end
function CrestBounty.Dmg()
return CONST.DMG_BASE + _layer * CONST.PER_LAYER
end
-- 受击口: 场内记账
function CrestBounty.OnHurt()
_taken = _taken + 1
end
四、核心代码:完整模块(下·推进与卸载)
-- 击杀宣判: 一场一审
function CrestBounty.OnKill()
if _taken <= CONST.TOLERATE then
_layer = _layer + 1
ShowTip("赏金入账!第" .. _layer .. "层——刀重"
.. CrestBounty.Dmg())
else
_layer = 0
ShowTip("挨了两爪——赏金清零,稳着打")
end
_taken = 0
end
SL:ScheduleOnce(function()
SL:BindDebugButton("催刀!", function()
ShowTip("催刀——悬赏不等人")
end)
ShowTip("技能已加载: 无伤悬赏纹")
end, 1.0)
function CrestBounty.Unload()
_layer = 0
_taken = 0
end
return CrestBounty
五、机制问答
问:容错为什么给一爪不是零爪?
答:够得着的完美才是悬赏——零爪的版本只属于躲得开的高手,容一爪人人有奔头。
问:清零的罚为什么要当场兑现?
答:拖到下一场再罚就没了痛感——怪一倒当场宣判,疼完才记得住。
问:悬赏为什么叠层不给大赏?
答:叠层是滚雪球——层越高越输不起,一套账两种心跳。
问:挨爪数为什么实时挂面板?
答:门槛看得见心里才有谱——暗账的悬赏是玄学,明账的悬赏是手艺。
问:跨局的悬赏层为什么和场内挨爪数分两本账?
答:跨局的活过换怪局内的死在换怪——混一本账清场不是多清就是漏清。
六、调参与实战怎么用
参数层面三个量——容错爪数、每层加成、基础刀重。容错一爪是门槛的黄金位:两爪起清零才有紧张,一爪以内人人有戏。实战里这套一场一审的骨架能搬去连保卫战、无伤挑战、赏金猎场,全是开卷、计数、当场宣判一条线。常见坑两个:零容错劝退;清零拖场,罚没了痛感。
补充一个设计层面的思考——战斗里的空间账和时间账要分开记:把怪推远是空间账,慑它半拍是时间账,两笔账一起给才叫"争取了喘息"。只推远不慑住,怪两步就贴回来,推等于白推;只慑住不推远,爪子还是落在脸上。设计者心里要有一张空间和时间的双栏账,玩家才摸得出真实的缓急。
补充一个维护层面的思考——跨局的状态(悬赏层、聚宝层、纪录)和局内的状态(计数、窗口、火候)要分两本账管:跨局的活过换怪,局内的死在换怪。两本账混在一个表里,清场的时候不是多清就是漏清——上一轮的火候串门、这一轮的悬赏误清,全是两本账没分家闹的。
补充一个工程层面的思考——反向结算(反震、反噬、回流)要走自己的口子,别借正向伤害的路:反震怪的时候怪的死活要自己判一遍,借正向的路子走,正向的守卫会把反向的账拦在门外。方向不同的账,口子也不同——一条道走到黑的结算管线,早晚在反向这一步撞墙。
写完留一句给做悬赏系的同学:玩家叠的是层数也是自己的身价——容错给一爪,宣判当当场,雪球滚起来的声音就是留存的声音。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
接手二开的兄弟几乎都撞过同一堵墙:玩家嫌走路"一格一格像机器人",老板拍板要"丝滑移动",改服务端速度?不对。改客户端动画帧…
【游戏功能】 先看一个熟场面:法师的火球特效挂在怪的脚后跟上,明明技能说明写着"焚烧其面",火星子却在地上打滚。群里有位策划…
【游戏功能】 上周有个开服的老板在群里发了一段录屏:他的战士明明刀刀都砍中了,观众却一片"这刀挥空了吧"。他原话是"判定日志…
【游戏功能】 先说结论放在开头:怪的皮一会儿绿一会儿红,不是美术换了几套贴图,是染色系统在怪身上盖了一层"色镜"。开服群里有…
前两天群里有个架设的朋友问了个需求:中毒的人要变绿、每两秒掉一次血、毒还能叠五层,问是不是要在服务端把整套状态机重写。我说你…
【游戏功能】 先抛一个坑:五口钟一模一样大,为什么一口比一口疼?先后次序动不得吗?倒过来敲会怎样?这篇把编钟纹整套写法拆开:…