【游戏功能】
SL:SpawnWeather("sandstorm", 6.0) -- 黄沙罩场六秒
沙暴的全部机制就这一行:一场覆盖全场的天气。它不减防、不掉血、不禁技能,只干一件事——往狼怪眼里灌沙子,让它的爪子十挥七空。今天拆沙暴,看"命中率"这个最看不见的数值怎么演成看得见的黄沙。
一、起风、迷眼、风停三段
沙暴的循环三段。起风段:法师一挥袖,黄沙从画面一侧横着灌进来,半屏蒙上一层土黄的薄纱——沙暴的入场是"天气级别"的:它不改怪,改的是整个画面的空气。迷眼段:狼怪的每次扑击有三成概率挥空,挥空时爪前冒一道土黄的空挥弧,头上飘"迷眼"二字——迷眼不改伤害量,只偷命中机会:挨着的照旧全额,挨不着的一分没有。风停段:六秒后沙粒渐稀、薄纱退去,狼怪眨眨眼恢复常态——风停要有过程:沙的密度半秒内衰减归零,"天气过去了"比"效果消失了"多一层体面。三段的核心是"概率可视化":三成的落空率本是一行隐性的数值,演示把它演成十爪七空的画面,玩家看两轮就能心算出这条概率。
完整演示在这,默认自动循环:
fx-sandstorm
二、幂尔框架实现:命中改写与天气层
沙暴分两层:天气层管画面,命中钩管概率:
local SandStorm = {}
local LIFE, MISS = 6.0, 0.7 -- 七成落空
local storm = 0
function SL:CastSandstorm(caster)
SL:PlayActorAct(caster, "cast")
storm = LIFE
SL:SpawnWeather("sandstorm", LIFE) -- 天气层: 沙粒+薄纱
SL:ShowBuffBar(caster, "沙暴", LIFE)
end
function SandStorm.OnAttackRoll(attacker, baseChance)
if storm <= 0 or attacker ~= "wolf" then return baseChance end
local rolled = math.random()
if rolled <= MISS then
SL:ShowTipAbove(attacker, "挥空", "#d4a373")
SL:ShowTipAbove("player", "迷眼", "#d4a373")
SL:PlayWhiffFx(attacker)
return 0 -- 这一爪落空
end
return baseChance
end
function SandStorm.Tick(dt)
if storm > 0 then
storm = storm - dt
if storm <= 0 then
SL:ClearWeather()
SL:ShowSystemTips("风停沙落 — 眼清了")
end
end
end
return SandStorm
落空的判定挂在攻击的掷骰钩上——返回零就是这一爪没打出去,伤害管线后段根本不启动。沙粒与薄纱走天气层而非buff特效层:天气是"场"的属性,谁在场谁呼吸沙子。
三、沙的画法与落空的戏
沙粒走横风:全部从同一侧以不同速度掠过、长短粗细随机、近大远小两层——横着的沙才叫风,竖着下的是沙尘雨。薄纱用一层极低透明度的土黄罩底,透明度随剩余寿命衰减——纱是"空气变浑了"的体感,比重度滤镜高级得多。落空的三件戏要演足:狼怪爪前的空挥弧、灰黄的"挥空"字、它自己重心前倾的小踉跄——每一次落空都在替玩家翻译"沙子进眼睛了"。被迷眼的狼怪扑击频率还会隐隐加快(急躁的演出)——打不着就更想打,这个细节让怪物读起来是活的。风停的半秒衰减不能省:沙粒密度、薄纱透明度、命中概率三者同步回落——天气的退场要像来的时候一样成体系。
四、概率系技能的边界
命中率类效果有三条铁律。其一,只改概率不改结算——命中的那一爪伤害全额,沙暴不做任何减伤,"闪避系"与"减伤系"的账本不能混;其二,概率有保底——落空率封顶七成,永远留三成必中,百分之百闪避的战斗会变成双方互相看戏;其三,不吃自身反馈——法师在沙暴里出手不受影响,迷眼只迷对面,不然天气就成了无差别武器。跟隐身术对照一下边界更清楚:隐身是"你看不见我",沙暴是"我看不准你"——一个屏蔽信息,一个污染准头,两条技能线在仇恨规则上分道扬镳。沙暴的定位由此清楚:它是续航型角色的"节奏技"——不能靠它杀人,但六秒里对方的输出期望被砍掉七成,这六秒够道士喝两口药、战士绕半个身位。起风成体系、掷骰有钩、落空有戏、三条铁律——沙暴把一行概率数值演成了满屏黄沙。
五、天气层的复用:一场沙的多种读法
天气层建好之后,它是整个技能组共用的地基,不专属沙暴一个技能。沙粒密度本身就是信息:满密度是刚起风、半密度是刮到一半、稀稀拉拉是快停了——玩家盯一眼屏幕就能读出"还剩几秒",不需要任何倒计时UI。这套密度语言可以直接复用:雪天的雪粒密度、雨夜的雨丝密度、火场的火星密度,全走同一个天气层接口,换贴图换颜色就是新天气——沙暴的工程价值一半在于它顺手把天气系统立了起来。读法上还有一个值得单说的细节:沙暴期间的音画同步——风声的音量跟着密度走,密度归零风声收尾,耳朵也在替眼睛读倒计时。对怪物的行为侧,天气还可以长出性格:被沙迷眼的狼怪扑空后会原地甩头两下——甩头是"试图把沙子甩出去"的拟人演出,不占判定、纯气氛,但就是这两下让概率有了体温。最后回到玩家的战术本:沙暴最值钱的六秒不是狼怪挥空的六秒,是法师自己确定安全的六秒——七成落空意味着期望伤害砍到三成,掐着这个期望喝药、绕位、召唤,天气技的深度全在这本期望账里。
这轮写下来还有一句想留的话:这类技能最容易在迭代里走形——改一次数值、调一次粒子,最初的那个"为什么好看"就慢慢丢了。把每个技能最核心的那一句话钉在模块头部注释里,往后任何一次改动,先问一句还符不符合那句话,再动手。表现层的所有分歧,最后都要回到那句话上对表。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 它的爪子明明挥向了你,怎么落在自己脸上?夺舍的答案邪门到家:道士的魂钻进了狼怪的身子——占据三秒,这三秒里它每…
【游戏功能】 墙又不追人,怪为什么次次撞?水墙的定位写在物理里:它立在路中央六秒,是一块"会推人的地形"——狼怪巡逻的弧线扫…
【游戏功能】 左手五刀右手五刀,怎么就数得清是双刀?双刀交叉斩的答案在弧线上:左刀的弧向右扫,右刀的弧向左扫,两把刀的弧线在…
【游戏功能】 隔着半个屏幕扎草人,狼怪为什么跟着一抽一抽?咒怨娃娃的逻辑古老而瘆人:草人与目标结咒之后,草人就是它——针扎草…
【游戏功能】 雷云的全部机制就这一行:一朵乌云升到目标头顶,慢半拍地跟着挪,每一点二秒掉一道小雷。云不追人——它认的是"头顶…
【游戏功能】 跑赢了的怪,怎么反倒挨了烧?火焰冲刺的账目反直觉就在这:冲刺是位移,火径是遗产——人冲过去了,路留在原地烧三秒…