<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>吃了蘑菇 · 记事</title>
    <link>https://chilemogu.com/notes/</link>
    <description>做站、做游戏，顺便记下过程。</description>
    <language>zh-CN</language>
    <lastBuildDate>Tue, 20 Oct 2026 12:25:43 GMT</lastBuildDate>
    <item>
      <title>八十张牌，换一颗子弹</title>
      <link>https://chilemogu.com/notes/eighty-cards/</link>
      <guid isPermaLink="true">https://chilemogu.com/notes/eighty-cards/</guid>
      <pubDate>Tue, 20 Oct 2026 12:00:00 GMT</pubDate>
      <category>作品手记</category>
      <description>它原本是个卡牌游戏，八十来张卡，一套抽牌概率、一套期望收益。后来我把它们全删了，只留一把六膛左轮。</description>
      <content:encoded><![CDATA[<p>这是《血脉轮盘》的叙事起点，但不是它最初的玩法。</p><p>最初那版是一个八十多张卡牌的肉鸽构筑游戏：抽牌、权重池、手牌上限、每张卡的触发顺序，全都算得清清楚楚。后来我把它们全删了，只留一把六膛左轮。</p><h3>删卡是从一次观战开始的</h3><p>第一版做完，我坐在旁边看人玩。前两局他还在犹豫，第三局开始，他的手指就不看牌面了 —— 他在看数字。计算抽牌概率、期望收益、庄家跟注的几率。第四局，他扣下扳机之前连眉头都没皱一下。</p><p>我意识到游戏的核心体验跑偏了：这是一个赌命的游戏，玩家却在里面做算术题。只要期望收益能被算清，恐惧感就消失了。</p><p>删到第五十张的时候我停了一下手。不是舍不得，是突然发现 —— 剩下的东西已经不构成一个卡牌游戏了。</p><p>于是我把伤害牌也删光了。</p><h3>留下四张，只改一件事：谁先扣扳机</h3><p>递枪、闪身、缓兵、出千。四张，一张都不造成伤害，只改变行动权落在谁手里。</p><p>递枪那张我改得最晚，因为一开始允许多递几次。模拟跑下来是严重的经济套利：开局把手里能推的枪全推出去，风险全压在庄家那边。赌局又变回算术题。</p><p>所以加了那条硬限制：一局只能递一次。</p><h3>【错引】永远说「实弹」</h3><p>【错引】是一个能窥探第一膛的天赋。但它底下跑的逻辑，是一个永远返回「实弹」的随机数。</p><p>是真弹，它说实弹。是空膛，它也说实弹。</p><p>于是你会做一件很荒诞的事：明明枪在自己手里，你不敢扣，你把它推给庄家。庄家扣下去。「咔。」空的。</p><p>两个实测数字：开局立刻把枪递出去，通关率 40.0%；等到第三膛再递，24.3%。同一张牌，使用时机不同，差 15 个百分点。</p><p>它不是情报获取工具，它改变的是玩家的决策行为。代码只有一行，改的不是数值，是人的胆子。</p><blockquote>让人害怕，比让人算得准便宜得多。</blockquote><h3>死一个人，债不会少一分</h3><p>十二周，四千块，一家四口。当前这个人死了，就轮到下一个。债不清零，十二周的倒计时也不重新开始 —— 期限是给这一家的，不是给某一个人的。</p><p>有一次内部测试，测试者死到第三个人时，在语音里说了一句：</p><p>「我居然为了给他留点东西，开始认真打了。」</p><p>我把这句话记下来，然后改了死亡结算：人死之后，桌上剩的钱庄家拿走一半，另一半推到下一个坐上去的人面前。</p><p>不是因为他死了要给奖励。不留那一点，他就只是一条命；留了那一点，他才是个父亲。</p><blockquote>死亡于是不再是一次数值损耗，而变成了一次资源配置。</blockquote><h3>桌子底下那条狗</h3><p>一周目四条命死光，二周目再死到第三个人，桌子底下会站起来一个东西。</p><p>Buster。它不懂钱，不懂牌，只认得谁伤了主人。它挡两枪，能叫、能咬、能扑，整场没有一句话。</p><p>我没给它任何聪明的打法。它就是扑上去 —— 狗护主的时候本来也不聪明。</p><p>它赢了，这一桌才算真的结束；也正因为这样，才轮得到后面那张没有底的桌子。</p><h3>桌上没有底之后</h3><p>打赢 Buster 那一局，无尽模式才开。门后面，筹码就是命：起始一千，中弹花五百买回来，入场费每周涨 1.25 倍，天赋能叠两层。</p><p>这里原本有个「幸运硬币」，能替你挡一次中弹。我在模拟里把它删了 —— 有它在，中弹这件事就被抹平，整个模式只剩下算入场费。</p><p>现在你只能用现金买命。它一定会结束，你只是不知道是第几周。</p><h3>还没弄好的</h3><p>手机小屏上，顶栏还是挤，得重构一遍响应式布局。</p><p>还想加一个死因记录：自己失误死的，和被【错引】骗死的。这两个数字要是差得够远，就说明那个天赋真的在起作用，而不只是我在文章里吹。</p>]]></content:encoded>
    </item>
    <item>
      <title>一滴水，和它变灰的那条路</title>
      <link>https://chilemogu.com/notes/water-turned-grey/</link>
      <guid isPermaLink="true">https://chilemogu.com/notes/water-turned-grey/</guid>
      <pubDate>Sat, 17 Oct 2026 13:10:00 GMT</pubDate>
      <category>作品手记</category>
      <description>《观》上线这天，水还是像一块丝绸。下面是把它找回来的过程。</description>
      <content:encoded><![CDATA[<p>《观》是一部十一幕的长片：从一滴水落进水池开始，一路走到你决定「看不看」那颗已经飞过去的光子。中间要出现水波、声波、干涉条纹、粒子、探测器和一次延迟选择。</p><p>它只有一个 HTML 文件，页面自身不引任何外部资源。这话听起来像洁癖，其实是约束：所有几何、所有光、所有声音，都得在同一个画布上一笔笔画出来。</p><p>第一版发布完，我盯着第一幕看了两分钟，觉得不对。水是灰的。</p><p>不是不亮，是均匀地发灰。像一块被熨平的丝绸铺在桌上，风来了它皱一下，但怎么看都不像水。</p><h3>第一反应：加高光</h3><p>水该有什么，我想了一圈：反射光带、镜面高光、菲涅尔、近岸亮边。四条都加了，八十多行。</p><p>结果只是让那块灰布上多了一点波浪形的亮纹。更糟的是，它现在看起来像一块有光泽的灰布。</p><p>那时候该停一下，问一句：如果底色本身就是错的，上面加多少层光有意义？</p><p>但我没问，继续调参数。反射带压到 0.085，菲涅尔压到 0.13，亮边压到 0.30。三次之后，截图放大看，还是灰。</p><h3>排除法：一个一个关掉</h3><p>写了个脚本，把画面上的绘制函数逐个替换成空函数，再采样水面上同一个像素。规则很简单：关掉哪个之后水变蓝了，问题就在那一层。</p><p>关掉菲涅尔，没变。关掉反射带，没变。关掉波场贴图 —— 水一下子回到深蓝 #0a1628。</p><p>是我自己写的贴图函数，把整面水垫灰了。</p><h3>真正的一行</h3><p>贴图里每个像素做的是：把该点所有波源的正弦加起来得到 a，再映射成灰度。第一版这么写：</p><pre><code>let v = a * 0.5 + 0.5;
v = clamp(v, 0, 1);</code></pre><p>a 是波幅。没有波的时候 a = 0，于是 v = 0.5。</p><p>整面水，每一格，都被当成「半个波峰」来画。几十万个像素一起撒了个毫不显眼的谎。</p><p>所以我后面加的所有高光，都在跟一个假底较劲。它们压不平那层 0.5，只能在那层灰上再叠一层亮。越叠越像布。</p><p>改法是把正负两半分开：没有波就是底色，波峰才变白，波谷不比底色更亮。</p><pre><code>let v = a &lt; 0 ? 0 : (a &gt; 1 ? 1 : a);</code></pre><p>一行。改完那一帧，水第一次是深蓝的。</p><p>原来那句 *0.5 + 0.5 是从别处抄来的 —— 那里用的是无符号采样，需要把 [-1,1] 映射到 [0,1]。这里的波幅本来就不是那个范围。</p><h3>墙：另一种错</h3><p>墙看起来像贴纸，原因不是颜色，是没有第二张面。</p><p>一面朝你的墙只画正面，就是一张纸。要有厚度，得给它四样东西：</p><ul><li>顶面 —— 朝天，受光，最亮的一档；</li><li>右侧暗面 —— 光在左，右边必然背光；</li><li>落影 —— 往右下甩一段，证明它站在桌面上；</li><li>墙根渐变 —— 靠近桌面的一段变暗，墙才接得住地。</li></ul><p>四样都加，墙立刻立住了。缝口处的顶面还要断开 —— 那两条缝是通透的，顶面连成一条就成了实心墙。</p><p>这里踩了一个坑：destination-out 挖洞很方便，但直接在主画布上挖，会把整块画布擦成透明。得先画到离屏层，擦完再贴回来。</p><p>同一件事，两种错法：一个是底色错，加多少层都救不回来；一个是少了一个面，怎么调色都还是平的。加东西之前，先看看底子对不对。</p><h3>标点</h3><p>这个站从头到尾不用英文标点。引号用「」，书名用《》，省略号是六个点，破折号是两画长的一条。</p><p>大陆出版物其实多用“”，但“”打出来像一对英文引号，夹在中文里太轻。所以这里分了两套：句中的强调用「」，成段引文用“”。不统一，但我偏爱这样。</p>]]></content:encoded>
    </item>
    <item>
      <title>为什么这个站要有一份记事</title>
      <link>https://chilemogu.com/notes/why-this-column/</link>
      <guid isPermaLink="true">https://chilemogu.com/notes/why-this-column/</guid>
      <pubDate>Sat, 17 Oct 2026 12:40:00 GMT</pubDate>
      <category>建站</category>
      <description>六件作品摆在门面上，背后全是没地方说的事。给它们开一个抽屉。</description>
      <content:encoded><![CDATA[<p>这个站原本只有一层：门口一排卡片，点进去，玩，出来。作品自己说话，别的什么都不解释。</p><p>这个原则我仍然认。门面无趣，作品才有意思 —— 挂在门口招揽的话，都是在替作品道歉。</p><p>但门面之外还有一片地方空着：那些没被摆上桌的东西。</p><p>为什么《捏》里的东西永远是十六种，换多少纪元都不加新的。为什么《观》的第一幕要让人先落一滴水，而不是直接给答案。某天为了一个灰蒙蒙的水面花了四个小时，最后是删掉半行代码解决的。这些事情不进作品，但没有它们，作品就长不成现在这样。</p><h3>所以开了这一栏</h3><p>名字叫「记事」。</p><p>叫「开发日记」太像更新公告，叫「博客」又太重 —— 会暗示这里有观点要输出。记事轻一点：发生了什么，记下来，不保证有用。</p><p>它挂在这个站的同一个域名下，和作品共用一套标点和同一种语气。它不是另一个站，是这个站的背面。</p><p>分四类，不多：</p><ul><li>建站 —— 站本身的事：栏目、结构、部署、那些看不见的管线；</li><li>作品手记 —— 某件作品怎么来的，改了什么，哪些地方是错的；</li><li>运营思考 —— 为什么这么做，读者怎么反应，下一步要不要做；</li><li>随手 —— 想说的话，生活里的片段，跟代码没关系的东西。</li></ul><h3>这里会写什么，不会写什么</h3><p>会写：踩过的坑，判断错的地方，以及为什么最后选了这条路。</p><p>不会写：账号、后台、别人的隐私、没公开的数据。也不会写「欢迎关注我的公众号」那种话 —— 你来玩就够了。</p><p>也不会把每篇写成总结报告。有些篇可能只有三句话，因为那天真的只有三句话。</p><h3>多久一篇</h3><p>不承诺频率。有东西写就写，可能一周三篇，也可能一个月没有。</p><p>比频率更要紧的是：每一篇都得是真的发生过的事。写不出来就空着，空着比凑数诚实。</p><h3>技术上</h3><p>这个站没有后台，没有数据库，每篇都是纯静态的 HTML。所以记事也不是发出来的，是构建出来的：</p><pre><code>node _build/build.js</code></pre><p>跑一遍，列表页、每篇的独立页面、翻页、RSS 全部重新生成，然后照常部署。加一篇就是往 _build/posts 里丢一个 js 文件，正文写成段落数组 —— 不用管 HTML，也不用管样式。</p><p>顺手做了这几样：日期、分类、标签、上下篇、RSS、草稿开关（draft: true 的稿子不会被生成到任何页面）、分页。评论没做，也不打算做 —— 这个站不需要有人值守。</p>]]></content:encoded>
    </item>
  </channel>
</rss>
