From 2db69b1cffada7d281243ab9982dbae575820f25 Mon Sep 17 00:00:00 2001 From: bottlefish <781230111@qq.com> Date: Sat, 25 Jul 2026 17:28:54 +0800 Subject: [PATCH] =?UTF-8?q?docs(huoshan):=20=E5=90=8C=E6=AD=A5=E5=B1=8F?= =?UTF-8?q?=E5=B9=95stress=E4=B8=8Epulse=E5=91=BD=E4=BB=A4=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- Docs/HuoShan/LogReleaseYarnCommands.md | 70 +++++++++++++++++++------- 1 file changed, 53 insertions(+), 17 deletions(-) diff --git a/Docs/HuoShan/LogReleaseYarnCommands.md b/Docs/HuoShan/LogReleaseYarnCommands.md index 45056f070..9636b4c1e 100644 --- a/Docs/HuoShan/LogReleaseYarnCommands.md +++ b/Docs/HuoShan/LogReleaseYarnCommands.md @@ -87,7 +87,7 @@ hs: 我感觉自己……像个■■ **2026-07 改版。** 早先用 `expression_focus_interference "in"` 让真话的字逐个变成「帽问题/冇问题」并红色跳动,反馈是**出戏**——读起来是老虎机 / UI 故障,是机器在坏,不是火山在痛;`expression_face_error` 的红脸报错同样被判定为"很怪"。 +> **2026-07 改版。** 早先有一个 `expression_focus_interference` 命令,让真话的字逐个变成「帽问题/冇问题」并红色跳动,反馈是**出戏**——读起来是老虎机 / UI 故障,是机器在坏,不是火山在痛;`expression_face_error` 的红脸报错同样被判定为"很怪"。**该命令连同其实现已整体删除**(Yarn 注册、`ExpressionManager` / `LanguageParticleManager` 中的传播协程与私有辅助方法),不要再引用;`CandidateParticle` 上的 `focusInterference*` 字段被 focus 阶段与 LOG3 真话攻击共用,予以保留。 > > 现行方案:**失败感全部来自聚合进度曲线本身**。`BeginTruthGather` 原本是单条 `Ease.InOutSine`,平滑单调的曲线天然读作"顺利",所以挣扎只能靠外挂特效补。`expression_truth_strain` 改用带回抽的 Sequence,回抽幅度跨过 `UpdateTruthGatherLock` 的 0.08 解锁带,**字就会自己锁上又崩开、反复**;末拍 `expression_truth_collapse` 把进度一口气拽回 0。 > @@ -168,27 +168,56 @@ hs: 我?*帽*问题?冇问题!... // 笑话覆盖,接 | 命令 | 参数 | 行为 | |---|---|---| -| `expression_screen_glitch` | `level duration` | 把“屏幕”Sprite 的故障推到 `level`(`0–1`)并**保持住**,`duration` 是从当前档位过渡到该档位的时间。**不会自动回落**——收掉要再写一条 `<>`。作用在屏幕材质本身(`AibisDream/HuoshanScreenGlitch`),不是叠一层噪波。 | +| `expression_screen_stress` | `amount duration` | **蓄压**:往底压罐里加 `amount`(建议 `0.08–0.2`),只升不降,一直保持。这是"积蓄的情绪"。有软上限 `screenStressCap`(默认 0.85),堆不满,顶格留给 pulse。 | +| `expression_screen_pulse` | `strength decay` | **冲击**:瞬间顶到「底压 + `strength`」(建议 `0.3–0.8`),随后在 `decay` 内自动落回底压。一句狠话打一记。 | +| `expression_screen_release` | `duration` | **泄压**:底压和脉冲一起放掉归零。屏幕淡出时会自动调用,正常不用手写。 | +| `expression_screen_rage` | `level duration` | **转红**:荧光色从青绿推向愤怒红(`#FF304D`)。**武装期间每个 `expression_truth_attack` 会自动 punch 一下屏幕**,力度跟着该词的 `impact` 走——不要在 Yarn 里逐条手写 pulse,攻击列表一重调两边就脱节。`0` 收回。 | +| `expression_screen_glitch` | `level duration` | **绝对档位**(旧命令,保留):清掉脉冲并把底压直接设成 `level`。只在"我就是要现在正好这个档位"时用。 | ### 屏幕 Glitch 的用法 -档位式而不是脉冲式,是因为这段演出要表达的是「火山想说真心话、卡在喉咙里说不出来」——需要一段**能持续压着**的情绪,而不是闪一下就没。Shader 内部自带「憋气→用力→泄掉」的循环(`_SurgeRate`),所以保持在某个档位时屏幕仍在持续挣扎,不会变成一张静止花屏;档位越高,循环越急促、卡喉(冻帧)越频繁。 +情绪用**底压 + 冲击**两个量叠加,而不是每句手写一个绝对档位。手写绝对档位等于让编剧扮演积分器——既要记得上次是多少,又因为"开场想给一记狠的就必须把持续档位拉高"而在后面失去余量。 -典型三拍写法: +- **底压**(`stress`)只升不降,随剧情推进一口一口加。它是积蓄本身。 +- **冲击**(`pulse`)瞬时叠在底压上再自动衰回去。开场底压才 0.1,一记 `0.6` 的 pulse 照样打得很响,打完落回安静。 + +**Stage6 的实际写法是"谎话一开口就坏,一路坏到释放"**——谎话段落里不写任何回落,每被逼问一次就再加一口,最后配合 timeline 顶满再泄: ```yarn -<> // 顶上来 +<> // 谎话开口,屏幕开始坏 hs: 广告腔台词 -<> // 压低憋着,不散 +<> // 说完不回落,再坏一档 me: 火山!说出来! -<> // 泄掉 +<> // 被逼问,再坏 +hs: 我…… +<> +<> // 真话往上聚,屏幕最撑不住的时候 +<> +<> // 配合 timeline 顶满 +<> // 一口气释放 ``` -档位参考:`0.15–0.25` 底噪憋着;`0.45–0.6` 明显被顶开;`0.85+` 撕裂带里开始冒彩色雪花(永远不会全屏接管)。 +三段 LOG 的**起手**一段比一段重(`0.25 / 0.32 / 0.38`),段内各自累加到 `0.6~0.85`。段与段之间屏幕会淡出并自动泄压,所以递进靠起手值而不是跨段累计——唯一的例外是 LOG3:`LOG疏通全部完成` 从淡入到落幕全程不淡出,LOG3 爆发段积的底压会一路烧进"为什么"高潮,那里再加一口正好顶到上限。 + +底压参考:`0.15–0.25` 底噪憋着;`0.45–0.6` 明显被顶开;`0.7+` 开始掉台。`pulse` 只在两种场合用:配合 timeline 的释放(短衰减),和攻击词的 punch(由 `expression_screen_rage` 自动代劳)。 + +**升级感靠新症状解锁,不靠"同样的东西更多"**——shader 内部把强度分成三段:`0.15+` 撕裂带与划痕、`0.35+` 场滚动、`0.55+` 掉台(塌成雪花再闪回)。所以底压每爬一格,观众看到的是"电视又多了一种坏法"。 ### Shader 结构与调参 -屏幕贴图是一块近乎均匀的绿,**只位移贴图是看不见的**(早期版本踩过这个坑,撕裂拖抹全被绿色固有色吃掉)。所以 `HuoshanScreenGlitch` 的做法是:所有东西先汇成一条「信号」标量——亮度 + 副载波色带 + 逐行相位误差 + 颗粒 + 撕裂位移——再由**色散调色板**对信号取值上色(三通道相位错开,得到 深蓝→青→白→橙 的连续渐变)。纯 R/G/B 色块是卡通感的来源,所以调色板输出的是连续渐变;拟真感来自密集扫描线、满屏颗粒、光晕溢出和暗角。 +`HuoshanScreenGlitch` 是一台坏掉的电视,遵守三条原则: + +1. **屏幕是发光体,不是贴图。** 贴图的绿色固有色被抛弃——只取它的**亮度结构**,颜色由 `_PhosphorColor` 荧光色给出。哪怕 `_GlitchIntensity = 0`,屏幕也有荧光面、缓慢下移的刷新暗带、亮度微颤和待机扫描线,所以它平时就"通着电"而不是一张静态贴图。整体乘 `_Emissive` 抬过 1,超出部分交给场景 Bloom 发光。 +2. **坏掉丢的是「画面」,不是屏幕。** 信号越差,画面内容越暗淡(只在随机某几拍挣扎着闪回一下),顶上来的是电子枪自己画的东西:灰蓝雪花、消隐黑条、回扫亮痕。所以高损坏时屏幕**不再是绿色**——他想说的话正在丢失。 +3. **症状分段解锁**(见上文),而不是同一种坏法线性变多。 + +故障语汇全部来自真实电视:场同步失锁(整幅上滚 + 接缝黑条 + 条附近横向弯折)、行同步误差(逐行细抖 + 撕裂带,带内亮度错档、色相硬错)、色度不稳(YIQ 空间色相漂移 + 色度增益波动)、雪花、掉台。 + +> **踩过两次的坑**:偏色一旦改成从色轮 / HSV 取纯 R/G/B/C/M/Y,画面立刻变卡通。偏色只能来自"三个通道对不齐"(通道分离的彩色镶边)或 YIQ 上的连续漂移——这两种都是连续渐变,不会出现纯色块。 +> +> 曾经试过"纯黑屏 + 饱和彩条"的方向(贴图只提供激发量、黑电平以下归零),结论是**太卡通**,已回退。现行版本保留荧光着色 + 灰蓝雪花。 + +`_Rage` 由 `expression_screen_rage` 驱动,把荧光整块换成 `_RageColor`(愤怒红 `#FF304D`)。 **观感的唯一真相源是材质 `M_HuoshanScreenGlitch`**(已默认挂在屏幕 SpriteRenderer 上),选中屏幕物件所见即所得地调。代码只驱动 `_GlitchIntensity` 档位,ExpressionManager 上不再有任何观感字段。 @@ -198,16 +227,23 @@ me: 火山!说出来! | 旋钮 | 作用 | 默认 | |---|---|---| -| `_Scale` | **效果尺度**。屏幕物件小、觉得"全是细线"就调大它,彩带/扫描线/颗粒/损坏块一起变粗 | 1.6 | -| `_ColorAmount` | 颜色强度 | 1.35 | -| `_Warp` | 撕裂、拖抹、块位移的总位移量 | 1 | -| `_Chaos` | **错误感**:块级损坏的量与突发频率 | 0.6 | -| `_Grit` | 颗粒与扫描线(调到 0 立刻变卡通) | 1 | -| `_SurgeRate` | 情绪泵节奏,越大越焦躁 | 0.5 | +| `_Scale` | **效果尺度**。屏幕物件小、觉得"全是细线"就调大它,扫描线/雪花/撕裂带一起变粗 | 1.6 | +| `_ColorDamage` | 色彩损伤:色相漂移 + 色度增益不稳 + 彩色镶边。嫌偏色过头就减 | 1 | +| `_Warp` | 撕裂与滚屏的总位移量 | 1 | +| `_Chaos` | **掉台频率**:信号中断爆发的概率(仅高档解锁) | 0.5 | +| `_Grit` | 雪花与扫描线。嫌脏就减,调到 0 会失去"被拍下来"的质感 | 1 | +| `_SurgeRate` | 情绪节奏,越大越焦躁 | 0.5 | -外加四个基调:`_Dispersion`(三通道相位差,小=轻微色偏,接近 0.33=满彩虹)、`_PalPhase`(偏色)、`_Desaturate`(绿色固有色退场多少)、`_Vignette`。 +外加基调: -**块级损坏**是"错误感"的来源:在随机时隙里整块整块地错位、换色、旋转通道(`col.gbr`),而不是均匀连续地抖——均匀就是规律,规律就读作假。大块宽而扁(像整段数据行被搬走),小块负责细节啃咬。 +| 属性 | 作用 | 默认 | +|---|---|---| +| `_PhosphorColor` | **屏幕自身的荧光色**(替代贴图固有色) | 青绿白 | +| `_RageColor` | 愤怒红,由 `_Rage` 混入 | `#FF304D` | +| `_Emissive` | 发光增益,>1 的部分喂给 Bloom | 1.5 | +| `_Ghost` / `_BloomBoost` / `_Vignette` | 鬼影 / 掉台恢复过冲 / 暗角 | 0.35 / 0.6 / 0.28 | + +想换屏幕颜色直接改 `_PhosphorColor`,不用碰贴图——贴图只提供亮度结构。 > **`screenOverlayRenderer` 的材质绝不能置 null**——SpriteRenderer 的 material 为 null 会渲染成品红方块,表现为 `switch_fix_system_to Expression` 后闪一下粉色。需要换掉 Glitch 材质时走 `GetScreenFallbackMaterial()`(`Sprites/Default` 兜底)。