# Changelog All notable changes to `dsh-pig`. Versions follow the plugin's own `package.json`; the DSH runtime it targets is noted where it matters. --- ## [Unreleased] ## [0.37.1-rc.2] — 2026-10-18 · 存档导入导出、动作时头顶不再被裁(预发布;外壳 0.6.7-rc.2) 感谢 [@WolalaQAQ](https://github.com/WolalaQAQ) 提供 PR #12/#13 和后续可靠性补丁,并协助完成 Windows、DSH 与 OpenCode 的独立复核;也感谢所有报告问题和参与测试的玩家。 - 设置新增「存档」:可以导出完整存档 ZIP,带到另一台设备或另一份安装里导入。导入前先预览小猪、备份时间和包含的内容,确认后自动备份当前存档再替换;支持本功能导出的 ZIP 和旧 `state.json`。它只做整档替换,不合并金币、奖励或两只猪,导入后两边也不会自动同步。 - 桌面版可以用系统「另存为」保存存档 ZIP;网页版在不支持保存选择器时走浏览器下载。导出会先结清正在写入的工作事件,避免生成混合时点的备份。 - 备份包含养成进度、已安装的官方扩展、自定义皮肤和工作去重记录,不包含日志、接入令牌、代理凭据、窗口位置或本机缩放。导入失败会恢复原存档;断电或异常退出后,下次启动先恢复未完成的导入。 - 新增两个上限:导入预览最多返回 50 条具体提示,超出部分合并成一条「另有 N 条提示」;自定义皮肤记录最多 128 个,导出和导入都会拒绝超限存档。 - 桌面版:修复 Linux 原生窗口在喂食、玩耍和摸头时把画面上沿裁掉的问题,戴帽子或发型较高的猪也能完整显示。魔法师皮肤的静态帽顶在原图里本来就是平切的,本轮没有换图,等新素材确认后再处理。 ### 验证与已知问题 - 主机全量 1231 项通过,构建和类型检查通过。 - 存档导入导出已在 DSH 正常界面、Linux 隔离桌面和 Windows 原生窗口完成导出、预览、取消、确认导入、自动备份和重启复验。Linux 默认 rootless 的 pixman 启动崩溃仍未解决,隔离显示的结果不能替代该环境验收。 - 动作形状修复补了自动化几何测试;Windows、macOS 的实际画面仍待对应环境复验。macOS 点击远处透明空白的问题尚未实机复现,本版不宣称已修复。 - 本版为 RC 预发布,npm 仍由维护者手动发布。 ## [0.37.1-rc.1] — 2026-10-16 · 桌面体验与第三方 agent 接入(预发布;外壳 0.6.7-rc.1) 感谢 [@Flappy-Boy](https://github.com/Flappy-Boy) 提供 #16/#17/#18 的问题反馈与复现步骤,也感谢反馈本体摸摸和高 DPI 气泡问题的玩家。 感谢 [@WolalaQAQ](https://github.com/WolalaQAQ) 提供 PR #12/#13 和后续可靠性补丁,并协助完成 Windows、DSH 与 OpenCode 的独立复核。 - 菜园扩展 4.0.9:购买和铲除确认框打开后接收键盘焦点,Tab / Shift+Tab 留在框内,关闭后回到原商品或地块;重绘保留数量输入的焦点和值,宿主轮询后仍保留已返回商品或地块的焦点。扩展包已同步 GitHub / Gitee。 - 桌面版:修复分数缩放下鼠标停住时反复设置同一窗口位置和尺寸的问题;新的逐像素拖动目标仍正常处理。 - Linux / Windows 桌面版:修复跳跃、打滚和治疗旋转中的图像裁切与点击缺口;提前预留固定绘制空间,动作期间按运动范围处理命中,待机透明区仍可穿透。 - 桌面版:Esc 可收起小面板;菜园先取消购买框、再收起弹层,最后关闭大窗口并返回面板。输入控件保留原有取消行为。 - 来自 PR #12 / #13(WolalaQAQ):可显式开启本机认证工作事件接口;增加事务恢复和关闭重试,外壳更新前保存失败会恢复操作。 - 来自 PR #12(WolalaQAQ):增加工作事件协议、持久去重和事务恢复;桌面游戏逻辑共用后台单写者。 - 来自 PR #12(WolalaQAQ):游戏运行时与 DSH 适配器拆分,网页和桌面复用同一挂载入口;现有玩法、存档、命令保持兼容。 - 发布准备:更新 README 和三张候选实拍图;修正 RC 更新清单的收集,并禁止 RC 发布时清理稳定版安装附件。 - 桌面本体摸摸:保留指针按压保护期间的一次性台词,避免带台词快照被后来的空快照覆盖;保护期内仍使用最新养成状态,不提前重建按压中的 DOM。 - 桌面气泡:固定窗口预留同时覆盖折叠态和面板打开后的左侧气泡,修复较大小猪的左边裁剪;开关面板不靠动态扩大窗口救气泡。 - 更新页(#16):DSH 与桌面详情按版本保留说明框滚动位置,宿主重绘后不自动跳回顶部。 - 菜园等扩展(#17):快速点击的扩展操作按顺序发送,前一个请求未结束时不再直接丢弃后续点击;卸载界面后不继续发送排队操作。 - 矿洞 3.0.1(#18):敲击仍有耐久的石块时,猪停在正在敲击的格子,不再退回洞口;此修复不改矿洞数值或规则。 ### 验证与已知问题 - 本轮主机全量 1154 项通过,构建和类型检查通过。Windows 11 系统 125% 加 Electron DPR 2 模拟,原版本体摸摸无气泡、修复版可见;实际系统 200% 尚未覆盖。此前 125% 隔离安装器的安装、保存恢复和卸载另有阶段验收;本轮 DSH 网页完成农场、矿洞、本体/面板摸摸及刷新/重启保存复验。 - Linux 私有 rootful 显示完成交互、焦点、保存恢复和拖动复核;共享 GNOME/rootless Xwayland 的 pixman 启动崩溃尚未解决,不能用隔离结果替代该环境验收。另一次私有显示退出点击仅收起面板,是否命中控件尚未确认。 - macOS 远处透明区域点击干扰问题尚未实机复现;本次不宣称已修复。慢/快拖动抽样未见白块或第二只猪,不代表绝对排除单帧残影。 - 本版为 RC 预发布;菜园 4.0.9 与矿洞 3.0.1 已同步两渠道附件和目录。外部桌宠模式仅确认方向,尚未实现。 - npm 包今晚不发布:下载指引中的默认 npm/DSH 包安装命令仍安装稳定版;DSH 用户若要提前测试本 RC,可从本标签源码安装,npm 另行同步。 ## [0.37.0] — 2026-10-15 · 菜园 4.0:QQ 农场玩法、帮工、离线自动照顾(外壳 0.6.6) ### 菜园 4.0(需要游戏 0.37.0) - 菜园照 QQ 农场的规矩重做:29 种作物、18 块地(开局 6 块,其余是荒地,每块 10000 菜币开垦),按真实时间长,关着也照长;长的时候会长草、生虫、干旱(雨天不旱),浇水、除草、杀虫免费还加经验;产量有浮动,收完留枯苗要铲掉才能再种;南瓜、橘子、柚子能收两季,石榴、椰子三季。 - 菜园有等级:升下一级要「等级 × 100」经验,种子按等级解锁;三种肥料分别多长 2 / 3.5 / 5 小时。一键收获 / 照料 / 铲除 / 播种要先在商店买收割镰、喷雾桶、平地耙、播种器。 - 两种界面、同一份数据:面板里是**小农场**(前 6 块地 + 一个主按钮做最该做的事,后面的地用一行字报情况);点「大农场」打开**大农场**——桌面版是一扇能拉大缩小的窗口,网页版铺满页面——横版场景、18 块地斜着排、底部工具栏,点地块用手里的工具,也能用 Q/W/E/R 快捷键。大、小农场换成动森风的暖羊皮纸、薄荷按钮和花叶木纹点缀,种子袋、肥料、仓库、商店和购买框也换成同一套样式;小农场的五个工具与底部操作在窄面板里也能完整使用。 - 帮工猪管 4 / 8 / 16 块地,赚到自己种同样地数的九成(原来七成),仍是六小时收一次仓、满级每小时最多 400;只补这块地原来指定的作物,缺那种种子就停在空地并报「缺××种子」,开荒地先清理再补种(清理不给经验、不吃体力)。 - 农具档(顺手 / 轻巧 / 高效)从商店下架:3.0.0 线上买过的按买到档位累计退 **1000 / 4000 / 13000** 菜币,只退一次。 - 老存档照旧:开过的地算数;地里的作物当作长完,按原来的产量收进仓库;旧洒水器、旧肥料和买过的农具档按原价退成菜币;大水壶换成喷雾桶。 - 扩展素材不再限制图片张数和总大小,可以装下画面更丰富的扩展;每张图片仍会检查大小和完整性。扩展也能打开自己的大窗口,菜园 4.0.8 需要游戏 0.37.0。 ### 小猪 - 普通猪每 8~16 秒眨一次眼;摸猪成功后它会害羞一小会儿,切换状态、隐藏或拖动时停下。 - 小猪新增眨眼与「摸猪害羞」两张动作图(沿用 0.36.2 起的平涂无描边画风)。 ### 离开时和系统时间不对的时候 - 离线自动照顾从「只吃东西」扩到三类:脏了用一份洗浴用品、闷了拿一个玩具,都优先刚好过线又最便宜的;回来会告诉你用了什么,也写进当天日记,设置里可关。 - 系统时间被改错或对表拨回去时,猪猪原地不动:不补算、也不重复算;等时间调回来、真实时间越过原来那一点,才接着只算新增的那一段。 - 离开太久、背包里的东西吃完之后还能撑 10 天;超过 10 天生命垂危(健康只剩 1 格、不能出门),累计满 30 天才撑不住离开(用还魂丹还能救回来)。生命垂危时也能带去看医生,看诊费按同一只猪看诊次数阶梯(第 1 次免费,之后 390 / 585,第 4 次起封顶 780)。 - 一次结算最多推算到「背包能撑的天数 + 10 天」(绝对不超过 400 天),离开再久也不会一下子长几百天,更不会把面板卡住;年龄只按实际推算过的那一段增长。 ### 面板、桌面版和扩展 - 面板刷新更跟手:画面没变就不重画,菜园的悬停卡不再被抹掉;真变了再重画时也会把悬停卡补回来;按住按钮、松开、点完这一套之前不会中途换掉按住的按钮。 - 打开大农场时保留原面板,关掉大窗口焦点回到面板(需要桌面外壳 0.6.6)。网页版大农场铺满页面时不再露出面板底色;面板很矮时弹层、遮罩和购买框都不会戳出面板底边;大农场的「开垦」牌不再被旁边地块压住,点得到。 - 下载扩展遇到坏包会指出真因:单张图片太大、图片名单写坏或文件校验不符都会明确报错,不会悄悄装一个没图的扩展。 - 桌面版:小猪置顶丢了会在 3 秒内抢回来;全屏时小猪显示成什么样可以在设置里选(见下节)。 ### 全屏时隐藏小猪(需要桌面外壳 0.6.5) - 设置新增「全屏时(玩游戏、看视频)」:**隐藏小猪**(默认)/ **照常显示**。隐藏时只看小猪所在的那块屏,有程序全屏就把猪和面板收起来,退出全屏再回来;照常显示时猪压在全屏画面上面(独占全屏的游戏系统不让任何窗口盖上去)。选择存在这台电脑上,不进存档。 - 全屏检测:Windows 用系统自带的 PowerShell 常驻一个小进程(每秒问一次前台窗口),不加新依赖;PowerShell 被禁用时设置里会说明,猪照常显示。Linux 用 xprop(Wayland 下只认得 X11 程序的全屏);macOS 全屏程序在单独的桌面空间,「照常显示」时猪跟进去。旧外壳不显示这一项。 ### 修好的问题 - 菜园扩展遇到被改坏的存档(经验值异常)不会再卡住整个菜园,等级照常算、菜照常种。 - 离开很久回来,猪猪的年龄不会再少算几天,日记也不会缺页。 - 生命垂危时原本只能干等:现在能带它去看医生,看一次就把生命值回满(第 1 次看诊免费)。 - 离开特别久(几百天)时回来快了大约 6 倍,不用再等面板卡一下。 ## [0.36.2] — 2026-10-14 · 热修:平涂小猪、离开时自动吃东西、右键更稳(外壳 0.6.5) ### 小猪 - 小猪立绘换回旧版平涂无描边,去掉「小猪画风」设置。 - 先撤回开心、照料、闲着与旅行时的反馈图(如三只猪叠在一起那张),照常显示立绘和动作图。 ### 离开时自动吃背包里的东西 - 离开(关机、离线、很久没打开)期间,饱食掉到饿了的线时,猪猪会自己从背包吃一份食物:优先刚好吃饱又最便宜的。不吃药、还魂丹、礼物等非食物。 - 回来时冒一句「你不在的时候,猪猪自己吃了 苹果×N」,也写进当天日记;背包空了会提示。设置里可关闭,旧存档默认开启。 ### 桌面版(外壳 0.6.5) - 启动时预先准备好面板:第一次右键马上打开;面板还在加载时再按右键不会把它关掉。 - 修复轮询刷新替换掉按下中的按钮,导致购买或设置开关偶发点了没反应。 ## [0.36.1] — 2026-10-12 · 扩展整包下载(外壳 0.6.4 不变) ### 扩展整包下载 - 在线安装扩展改成只下一个扩展包(`.piggyext`),不再把代码和几十张图片一个个下:请求少了,国内直连更不容易半路卡住。目录里每条多了整包的地址和校验值;0.36.0 及更早的游戏照旧逐个下载,不受影响。 ## [0.36.0] — 2026-10-11 · 动森风菜园矿洞、无描边画风(外壳 0.6.4 不变) ### 小猪画风 - 完成无黑色描边的 181 张小猪审图候选,保留原角色、耳型、动作和场景;透明 PNG 按基础、形态、皮肤、反馈、徽章分类,逐字提示词和对照总览同步。整套获用户确认后接入游戏;设置新增「无描边 / 黑色描边」,本机记住选择,桌面猪与面板同步切换。导入皮肤保持原图,两套立绘分别校准可见高度,保留原有玩法和状态优先级。 - 桌面边缘限制覆盖两套立绘的最大可见宽度,修复放大后胖猪电脑图被裁切的问题;换动作或画风仍保持位置和窗口尺寸。 ### 菜园、矿洞换成动森风画面 - 菜园、矿洞的界面换成手绘风素材:海边菜园、木框菜畦、16 种作物各 3 个生长阶段,木牌手账风的矿洞、矿石和化石都有自己的图。 - 菜园:顶上吊牌计分板放帮工,中间两列菜畦,玩家自己的猪站在旁边;底部木排四个工具一直摆着(不用再点开工具抽屉),下面是仓库、主按钮、商店。玩法和数值都没变。 - 矿洞:没挖开的格子一律是同样的岩块,矿和化石挖开才看得到;够不着的格子调暗;猪站在最后挖开的那格。 - 菜园、矿洞升 3.0.0,要游戏 0.36.0 以上。 ### 扩展可以带图片 - 扩展目录多了 `assets/`(manifest 里 `assets` 列出),在线下载、本地导入、官方校验都把图片算进去;面板里用 `app.asset(名字)` 取图,`app.pigArt()` 取玩家现在的猪图。规则见[写扩展](docs/guides/writing-extensions.md)。 ## [0.35.0] — 2026-10-10 · 经济体系、新立绘、扩展自动化(外壳 0.6.4) ### 新立绘 - 普通猪、形态、皮肤、职业、成长阶段、动作、睡姿、不同状态的小猪和成就徽章,全部换成统一的黑色描边透明 PNG,按类型收进 `assets/pigs/`。游戏包反而小了一点。 - 打工图改成猪趴在地上敲电脑;胖猪的宽图不再被裁掉。 - 各种立绘按「猪的可见高度」统一校准,换皮肤、换形态时看起来一样大。 - 自定义皮肤包改收 PNG,制作教程和示例包跟着换;以前做的 SVG 皮肤包照样能导入,已经装过的照常显示。 ### 经济 - **不再限制每天玩几次**:番茄钟每个都给奖励;在线礼包每在线 1 小时一个、不设上限;猪在打工、上学、旅行时也能手动钓鱼。 - 金币的进出都按来源记账,调试页「经济」能看钱从哪来、花到哪去([设计](docs/design/economy.md))。 - **扩展有自己的钱**:菜币、矿石币、资质凭证……按扩展定的汇率跟金币互换(换成金币不收费,用金币买多收 5%);删掉扩展时剩下的钱自动换成金币。背包里新增「钱包」页。 - 各玩法的时薪都按收入区间核过([J1](docs/numbers/J1-economy.md)、[J2](docs/numbers/J2-automation.md))。 ### 玩法 - **钓鱼 2.0**:40 种鱼、4 个钓点(小河、湖、海边、只在晚上开的夜潭)、4 把鱼竿;每种鱼游法不同、速度区间不同。等咬钩只要几秒(竹竿 3~8 秒),难度放在搏斗上,好竿让搏斗更容易;同种鱼越大越值钱。鲜虾鱼饵 15 → 6、夜光鱼饵 40 → 8。老存档送一把碳素竿。 - **自动钓鱼加长**:可以买鱼篓、2 / 4 小时的自动钓、鱼饵盒;原来的 30 / 60 分钟一点没变。 - **旅行 7 → 15 个地点**:公园、游乐场、动物园、海洋馆、竹林、雪山、沙漠、太空站(当过宇航员才能去),26 种新纪念品各有一句小故事。 - **商店新上 27 件**:食物 12、洗浴 6、玩具 9。 - **每个职业都能打 10 分钟短班**:时薪跟整班一样;短班不算完整一班,不会因为连打短班过劳生病。 ### 扩展(都要游戏 0.35.0) - **菜园 2.1.0**:16 种作物、8 块地;水壶、收割镰、播种器买了才能一键浇水 / 收获 / 种满;可以雇帮工猪替你收菜补种。界面换成插画版:天空、远山、木框田,主按钮自动做最该做的事。 - **矿洞 2.1.0**:去掉体力,20 层,5 级镐一级级开路,矿脉、宝箱、化石、炸弹、电梯;可以雇小矿工猪替你挖。界面换成插画版洞窟。 - **盲盒 3.0.0**:资质凭证放进钱包,1 张值 15 金币,能换成金币但不能用金币买;老存档的凭证打开盲盒时自动搬进钱包。 - **扭蛋 1.2.0**:三台机器加进商店新上的东西。 - 帮工、小矿工、自动钓鱼的仓都是攒满 6 小时就停,回来收一下接着干;满级每小时最多 400。 - **扩展可以从文件导入**:「设置 → 扩展 → 📦 从文件导入」,选发布页上的扩展包 `.piggyext`(或扩展的三个文件)。官方扩展断网也能装;不是官方的先提醒风险,确认后才装,标「本地导入」、不会被在线更新盖掉。 ### 桌面版(外壳 0.6.4) - 新增代理设置:跟随系统、直连、自定义 HTTP / SOCKS5;游戏更新、外壳更新和在线扩展共用。 - 小猪大小改成「− 百分比 +」,每次 10%,也能直接输入;换皮肤后照样能调,两个窗口马上同步。 - 面板开着时,签到 / 礼包小气泡挪到猪旁边,猪说的话也不再被面板挡住。 - 少问 GitHub:版本列表和在线扩展目录存在本机,一段时间内不重复请求,带 ETag 问「有没有变」,不再撞「每小时次数用完」。 - 修复两个窗口抢消息导致调试台词不显示。 ### 其他 - 网页版自带的 emoji 字体补上新玩法和扩展里用到的 40 多个表情。 ## [0.34.1] — 2026-10-09 · Gitee 的 Windows 安装包改成首次启动下载游戏(外壳 0.6.3) - **Gitee 的 Windows 安装包不再自带游戏**:安装包离 Gitee 单个附件 100MB 的上限只剩一点点,0.34.0 加了新图就放不下了。现在安装包只带外壳,第一次打开会弹个小窗口「正在下载小猪」,下好就进游戏(约 3.5MB);断网或下载失败会说明原因,可以重试、打开下载页或退出。以后更新照旧在主屏「🔄 更新」里。 GitHub 的安装包、Gitee 的 Linux 和 macOS 安装包不变,照旧自带游戏。 - 游戏包以后要是超过 95MB,会自动拆成几卷上传,外壳 0.6.3 起按顺序下载、逐卷校验再拼起来;老外壳看不到分卷的版本,会提示先更新外壳。 - 开发用:`PIGGY_BUNDLED_GAME`(模拟安装包不带游戏)、`PIGGY_GAME_PIN`(指定首次下载用的清单),见 HANDOFF 8.2。 ## [0.34.0] — 2026-10-09 · 一猪多图、生日蛋糕、打盹睡姿(建议更新桌面外壳到 0.6.2) **一猪多图** - 普通小猪按状态换成对应的图(图的灵感来自 [PigHub](https://pighub.top/),由 AI 重新画成本项目的样子,见 README「致谢与许可」): - 还没拆的纸盒是「猪递」;去世当天还是小猪的样子,满一天后是墓碑旁的幽灵;盲盒寻访页有寻访猪。 - 生病按病种和阶段:感冒流鼻涕、发烧(感冒第 2 期)、皮肤病起红疹、头晕晕乎乎;咳嗽、肠胃和病危保持原样加病色。 - 饿了、困了、孤单、脏了、开心;喂食、洗澡、玩耍、升级;上学、兴趣班(健身、听歌、画画)、钓鱼、旅行;部分职业打工(发传单、歌手、作曲、漫画家、运动员、教练、园丁、花店、CEO、明星)。 - 同一状态有几张图的按小时轮换。专属形态(猪猪王、恶魔猪等)、圆润/胖胖体型和导入的皮肤保留自己的立绘。 - 几张还没想好放哪的图(徽章、检疫合格、笼子等)先留着不用。 - **生日**:猪生日当天头顶冒 🎂,点一下开个小派对——猪换成生日派对图、冒彩带,15 秒后恢复;当天点过就不再冒。不发奖励(以后另定)。 - 图片离线处理成透明底 PNG、长边 256px,桌面版不再有白框;两张听歌图里耳机线、头箍围住的白底也去掉了。 **打盹和动作** - 打盹时按当前形态换成睡姿,头顶偶尔冒 Zzz;自定义皮肤可以在 ZIP 里加可选的 `sleep.svg`,制作教程和示例包已更新。 - 摸头轻压回弹,喂食短跳落地,玩耍左右两次小跳。 **桌面版(外壳 0.6.2)** - Windows 上从桌面直接移到猪身上右键,第一次就能打开菜单(以前常要点好几次)。 - 点面板里的照顾按钮时,猪的动作和气泡不再被面板盖住。 - 右键猪不再顺带摸一下;脏和生病时身边绕着苍蝇/病毒;外出时也能看出脏了(「脏」排在外出和饿前面);恢复桌面版的状态变色。以上来自贡献者 [@tetezi](https://github.com/tetezi) 的 [#8](https://github.com/CLICGGER-TYPES/dsh-piggy/pull/8),谢谢! **调试** - 调试页新增「立绘」:每张图一个按钮,写明用在哪,点一下猪就显示这张;能指定做哪个小动作(含打盹)、马上过生日;「成长生病」页加了「发烧」。桌面版也能用(以前桌面版的「小动作」按钮是灰的)。 **扩展** - 盲盒 2.2.2:寻访页加寻访猪图。 ## [0.33.1] — 2026-10-07 · 修:开着面板拖猪,面板越跑越远(要更新桌面外壳到 0.6.1) - **Windows 缩放 125%/150% 下开着面板拖猪,面板和猪越拉越远、松手后面板落在别处**(用户反馈录屏):根子在桌面外壳拖动时每一帧「读回窗口大小再设回去」,分数缩放下读回来的比设的大 1px,拖一次猪窗口能从 345 宽涨到 482,钉在窗口右下角的猪被越推越远,鼠标也越甩越远。现在拖动全程用请求的大小、不用读回值;面板每一帧都按猪现在在哪直接算位置,不再在上一帧的面板位置上累加。 - 拖动中面板和猪哪边对齐不再中途换边(以前拖到屏幕左边面板会横跳一个面板宽),放不下就停在屏幕边;松手后原来那边还放得下就保持。 - 在 Win11 虚拟机 125% 缩放下用真鼠标开着面板拖 3 次并录屏逐帧量:面板和猪的相对位置拖动全程 90% 的帧偏差 ≤2px、不随时间增长(修前最远偏 204px),猪跟鼠标的距离中位数从 97px 降到 1~5px;Linux GNOME 9 组真拖录屏回归通过。 - 游戏包会顺带把猪在窗口里的位置报给外壳(贴屏幕边时内容在窗口里挪过),面板按它贴猪;老外壳忽略这条,不影响。 - 开发用:`tools/drag-film.py --panel` 逐帧量面板和猪的相对位置。 ## [0.33.0] — 2026-10-07 · 桌面版猪和面板分开、扩展成就 ### 桌面版:猪和面板各一个窗口(要更新桌面外壳到 0.6.0) - 面板不再和猪挤在同一个窗口里,而是单独一个窗口贴在猪旁边:上方放得下就开在上面,否则开在下面,整块在屏幕里。开关面板、切 App、喂食、冒气泡,猪的窗口都一动不动——以前这些都要改猪那个窗口的大小,差一拍猪就跳一下。 - 拖猪时面板跟着走;拖到屏幕边上,猪一路跟着鼠标贴到边,松手不再瞬移。点到别处面板自动收起(「点外面自动收起」设置照旧)。 - 面板里做的事(喂食、签到……),猪那边马上有反应和气泡。 - 打开面板不再抢焦点,GNOME 不会因此弹「已就绪」提示。 - 这个版本的游戏包需要桌面外壳 0.6.0;旧外壳会继续用自带的游戏包,「设置 → 更新」里会提示先更新桌面程序。 - 开发用:`tools/desktop-geometry-check.mjs` 检查两个窗口的行为,GNOME 下用真鼠标拖动并录屏,`tools/drag-film.py` 逐帧看拖动中和松手后猪有没有跳。 ### 扩展成就与公共事件(贡献者 [@1nuoiscute](https://github.com/1nuoiscute),[#7](https://github.com/CLICGGER-TYPES/dsh-piggy/pull/7)) - 为菜园、矿洞、扭蛋和盲盒新增 12 项成就与小猪 SVG 徽章,累计、收藏与最高探索层数由公共进度事件记录;图鉴最多展示 28 项。 - 新增扩展 `api.emit` 与可选历史 `progress` 钩子;成功动作事务提交,拒绝和异常回滚,重复上报不重复计数。 - 旧扩展数据只补录可证明经历,日期未知不编造;更新保留基线,卸载/领养保留主成就进度,新安装可继续积累。旧扩展详情提示更新。 - 修复试玩页宿主按钮样式挤偏返回箭头。 - 四个扩展随本版发布:farm/mine/gacha 1.1.0、blindbox 2.2.0(在「设置 → 🧩 扩展」里更新即可拿到新成就)。 ### 「Emoji 样式」在网页版也能用 - 网页版也带一套瘦身 emoji 子集(0.9MB,覆盖游戏里用到的全部 emoji),「设置 → Emoji 样式」在网页版也能选,默认就是内置那套。桌面版仍用外壳提供的完整字体。 ### 其他 - 桌面版帧率跟显示器刷新率走,不再写死 30fps;拖动的采样频率也跟显示器同步。 - 存的猪位置改成「哪块显示器 + 相对偏移」,显示器拔掉会落到最近的屏;跨屏缝拖动不再被弹回。 ## [0.32.0] — 2026-10-06 · 小猪成就、日志导出与扩展下载修复 ### 小猪成就系统(贡献者 [@1nuoiscute](https://github.com/1nuoiscute),[#6](https://github.com/CLICGGER-TYPES/dsh-piggy/pull/6)) - 图鉴新增成就分类,十六枚以小猪为主图案的透明 SVG 徽章,展示目标、进度和获得记录。 - 成功照顾与实际完成学习、工作、旅行,以及钓鱼收藏和晋升记录驱动解锁;合并同时获得的徽章提示。 - 记录和累计次数跨领养保留;完整重置清空。旧档只补录可验证经历,未知完成日期明确标注,存档版本保持 v12。 - 增加隔离试玩入口与规则草案,首版只奖励徽章,不改属性或金币。 ### 设置里导出日志 - 「设置 → 日志 → 导出日志」一键把运行日志存到你自己选的位置:桌面版弹系统「另存为」,网页版用浏览器的另存为,都不支持时退回普通下载。 - 日志包含版本、渠道、存档版本、运行环境、每个动作的耗时与拒绝原因、扩展目录与下载的每次尝试、存档读写与迁移、浏览器里的未捕获错误和失败请求;桌面版还会带上窗口与更新的记录。 - 日志同时写在存档目录的 `logs/dsh-piggy.log`(满 1.5 MB 轮转),内存里始终留最近 800 条。网页版以前没有任何可取的现场,现在也能导出。 - 规则抛错后回滚、存档损坏留副本这类以前只有一行 console 的情况,现在都会出现在导出的日志里。 ### 扩展下载修复 - 每个扩展文件下载 12 秒超时、最多试 3 次,三个文件并行;失败时说明是哪个文件、连哪个主机、什么原因(超时 / 被中断 / 域名解析不了),不再只有一句 `fetch failed`。在线目录读取也加了超时和重试。 - 点「下载」立刻变成「下载中…」并挡住重复点击;失败的原因留在卡片上并给一个「重试」按钮,不再只闪 2.4 秒的气泡,也不再让面板看起来「点了没反应」。 ### 桌面外壳 0.5.0 - 新增 `piggyShell.logs.save`,导出日志时弹系统「另存为」。页面与外壳的约定版本 `DESKTOP_VERSION` 升到 3;老外壳没有这个方法,会自动退回浏览器下载,功能仍可用。 ## [0.31.0] — 2026-10-05 · 扭蛋、菜园、矿洞和盲盒寻访 只更新游戏,不用重装桌面程序(桌面外壳仍是 0.3.0)。三个新扩展和盲盒 2.1.0 在「设置 → 🧩 扩展 → 在线扩展」里下载。 ### 新扩展 - **扭蛋**:零食机、杂货机、药箱三台老式扭蛋机,扭出来的都是现有的食物、洗浴用品、玩具、药和鱼饵。白 80% / 蓝 17% / 金 3%,每天第一次免费,扭 1 次 60、扭 10 次 540 金币;幸运值攒满 20 下一次必出金色。旋钮转一圈、胶囊滚出来再掰开,十连依次掰开。 - **菜园**:前两块地免费,后面四块逐块开垦;八种作物,种子在商店「种子」货架买。每个阶段要浇一次水,按真实时间长(离线照算),成熟后放着不坏;收获可以卖,草莓、红薯、南瓜还能放进背包当食物。图鉴多了「作物」分区。 - **矿洞**:每层 6×8 格,只能挖挨着已挖开的格子;土、石头、硬岩要敲的次数不同,越深越容易出银、金、宝石;挖到梯子下一层,最深 10 层,每天 06:00 重新生成。体力 100,每 3 分钟回 1 点;铁镐、钻石镐和体力饮料在商店「矿工用品」货架。化石和宝石进图鉴「矿石」分区。 ### 盲盒 2.1.0 - 寻访页:常驻和限时两个卡池自动轮播(也能点圆点或左右划),寻访 1 次 / 10 次两个按钮并排,有券时下面多一条「用盲盒券寻访」。 - 开盒:木箱换成卡背,摇一摇透出星级颜色的光,再翻面成闪卡;十连两排依次翻开。 - 展示柜挪进「图鉴 → 摆件」(闪卡墙,点开看潜能和介绍),资质凭证商店挪进「商店 → 盲盒」货架。 ### 主菜单和扩展 - 主菜单分页,每页最多 9 个;点下面的圆点、鼠标滚轮、左键按住左右拖都能翻页,从 App 返回停在原来那页。 - 末尾固定是 设置 → 调试 → 退出,以后新加的 App 都排在设置前面。 - 「扩展」挪进设置(设置 → 🧩 扩展),有扩展可更新时设置图标冒红点;扩展默认都开着,你自己关掉的保持关。 - 下载的扩展可以往商店加货架、往图鉴加分区。 ### 修复 - 桌面版(Linux)面板收起时把猪从屏幕下方拖到上方(或反过来)拖不动、松手后面板朝向不对。 --- ## [0.30.0] — 2026-10-05 · 扩展中心、在线扩展与盲盒、对话与互动、钓鱼重做 从 v0.27.3 升上来的全部改动(测试版 0.28.0-rc.1~0.30.0-rc.3 的汇总)。只更新游戏,不用重装桌面程序(桌面外壳仍是 0.3.0)。 ### 扩展 - 新增「扩展」App:番茄钟、钓鱼可以单独开关;关掉后主菜单、商店里相关的商品、图鉴里相关的分区都不再出现,数据保留。 - **删除扩展**:连数据一起清掉(先在卡片里确认一次);删掉的内置扩展可以在「在线扩展」里重新安装。 - **在线扩展**:从本仓库的扩展目录读,只装我们自己发布的;下载的文件逐个核对校验值,游戏版本不够不装;有新版本时卡片上出现「更新到 x」,更新后数据保留。下载的扩展只能改自己的数据,出错只影响它自己。 - **盲盒**(第一个在线扩展,在「扩展 → 在线扩展」里下载):照明日方舟寻访的规矩。36 个摆件分 3★~6★(出率 40 / 50 / 8 / 2%);常驻 + 限时寻访,每 14 天轮换 UP;50 抽没出六星后每抽 +2%,第 99 抽必出;重复的加潜能、给资质凭证,凭证在商店换东西。补给箱透出星级颜色的光再打开,十连逐个翻开、可跳过,六星撒彩纸。装了盲盒后签到和在线礼包偶尔送盲盒券。 ### 对话与互动 - 台词翻倍,新增出门、买东西、钱不够、钓鱼结果、换皮肤、体型变化等场景;同一场景最近 3 句不重复;一次操作只说一句话。 - 按时间说话:早中晚、深夜、凌晨问候,在线满 90 分钟提醒喝水、满 2 小时提醒休息眼睛,节日(含农历)和猪的生日。 - 左键点猪会真的摸它,头、耳朵、鼻子、肚子、背、尾巴、脚反应不同;30 秒内摸太多会不耐烦。 - 猪闲着会自己打滚、打盹、追蝴蝶、挠痒、伸懒腰;桌面版可以在设置里打开「桌面散步」(默认关)。 - 日记改成写好的几百篇短日记,按当天经历挑,带一点黑色幽默。 ### 钓鱼 - 咬钩后随机是圆盘、竖条拉锯、拉力收线三种玩法之一;抛竿前和结果页重做(鱼饵卡片、星级、大个的)。 - 自动钓鱼不再限制每天次数,只看鱼饵够不够。 ### 界面和数值整理 - 状态页精简:等级条在最上面,体重一行小字,去掉陪伴和番茄钟行;喂食、洗澡、玩耍跳到背包对应货架,返回回到状态页。 - 背包货架里显示状态;用食物、洗浴、玩具和喂食一样(长体重、可能胀气、猪会说话);还魂丹放进药品。 - 居民卡:名字、叫你、口头禅、签名都是鼠标移上去出笔就地改;免打扰挪到设置。 - 更新入口收进设置(有新正式版时红点),更新面板按正式版分组、测试版折叠。 - 猪在外面时也能直接去打工、上课、旅行、自动钓鱼,会先问要不要结束现在这件。 - 签到改成 7 天一轮;照顾数值调整(吃东西不弄脏、只有吃撑了还硬喂才可能胀气、心情掉得慢一点)。 - 调试面板分页、每个按钮带说明;换肤 App 新增「怎么做皮肤」页,换肤教程每一步配图。 ### 修复 - 桌面版导入皮肤 ZIP 总是失败。 - 签到 / 礼包气泡点了变成摸猪。 - 自动钓鱼那一栏展开后自己缩回去。 - 其他排版问题:「怎么做皮肤」底部按钮贴边、次要按钮显示成主按钮、调试页签滚不到、居民卡输入框长短不一。 ## [0.30.0-rc.3] — 2026-10-05 · 扩展能在线更新;盲盒 2.0(测试版) 只更新游戏,不用重装桌面程序(桌面外壳仍是 0.3.0)。 ### Added - **扩展在线更新**:在线目录里有新版本时,「扩展」App 里那个扩展的卡片上出现「更新到 x」;更新是重新下载、核对、替换文件,存档里的数据保留。 - **盲盒 2.0**(在线扩展,装了 1.0 的在扩展 App 里点「更新到 2.0.0」):改成明日方舟寻访的规矩。 - 36 个摆件分 3★~6★,出率 40% / 50% / 8% / 2%。 - 常驻寻访 + 限时寻访,每 14 天轮换 UP;出六星时常驻 50%、限时 70% 是 UP 的。 - 50 抽没出六星后,每抽六星 +2%,第 99 抽必出;常驻和限时分开计数。 - 重复的加潜能(最多 6 潜)并给资质凭证;凭证商店换盲盒券、指定五星 / 六星、豪华大餐、百草丹。 - 开盒:补给箱落下,箱缝透出星级颜色的光再打开;十连两行小箱子逐个翻开,可以跳过;六星撒彩纸。 - 1.0 的收集自动换算:摆件保留为潜能,碎片 1 换 2 资质凭证。 - 数值单 `docs/numbers/X1-blindbox.md`。 ## [0.30.0-rc.2] — 2026-10-05 · 盲盒上线 + rc.1 反馈修复(测试版) 只更新游戏,不用重装桌面程序(桌面外壳仍是 0.3.0)。rc.1 的内容见 v0.30.0-rc.1 的说明。 ### Added - **盲盒**:第一个从「在线扩展」下载的扩展(扩展 App → 在线扩展 → 盲盒 → 下载)。只出摆件:🌾 农场好朋友、🏖 海边假日、🌙 深夜食堂三个系列,各 6 个普通款 + 1 个隐藏款。 - 抽 1 个 300 🪙,10 连 2700 🪙;隐藏款 3%,同一系列第 30 抽起每抽 +7%(最多 95%),第 50 抽必出。 - 重复的变碎片,10 碎片换一个没有的普通款,40 碎片换隐藏款。 - 开盒:盒子摇两下打开,摆件一个个弹出来,新的标 NEW;隐藏款带金光、撒彩纸。展示柜里每个系列一排小底座,没抽到的是剪影,点一下看介绍,集齐有 🏅。 - 装了盲盒以后,签到有 15%、在线礼包有 12% 的机会多送一张🎟 盲盒券,免费开 1 个。 - 数值单 `docs/numbers/X1-blindbox.md`,代码 `extensions/blindbox/`。 - 猪在外面时也能直接点打工、上课、旅行、自动钓鱼:先问「结束 xxx,改去 yyy 吗?」,确认后叫回来再出发(打工到一半没有这一班工钱,上学、旅行退钱,自动钓鱼退鱼饵)。 ### Changed - 自动钓鱼不再限制每天 2 次,只看鱼饵够不够。 - 扩展卡片:开关和删除并排放在卡片左下。 - 居民卡:叫你、口头禅、签名也是鼠标移上去才出笔。 ### Fixed - 签到 / 在线礼包的 📅🎁 点了变成摸猪、领不到。 - 自动钓鱼那一栏展开后过几秒自己缩回去。 - 「怎么做皮肤」底部两个按钮贴着上面的卡片。 ## [0.30.0-rc.1] — 2026-10-05 · 对话与互动、钓鱼重做、扩展删除与在线下载(测试版) 这一版合并了原计划的 v0.29 和 v0.30,并包含 0.28.0-rc.3 的全部内容(见那一版的说明)。只更新游戏,不用重装桌面程序(桌面外壳仍是 0.3.0)。 ### Added - **钓鱼三种搏斗玩法**:鱼咬钩后随机是圆盘、竖条拉锯、拉力收线之一(原型见 `docs/prototypes/fishing-fight.html`)。 - **台词翻倍**:原有 32 个场景每个翻倍,新增出门打工 / 上学 / 旅行、买东西、钱不够、钓到鱼 / 稀有鱼 / 鱼跑了、换皮肤、体型变化(审稿单 `docs/numbers/G4-lines.md`)。同一场景最近 3 句不重复。 - **按时间说话**:早上、中午、下午、傍晚、深夜、凌晨各问候一次;在线满 90 分钟提醒喝水、满 2 小时提醒休息眼睛;元旦、情人节、春节、元宵、清明、劳动节、儿童节、端午、七夕、中秋、国庆、圣诞和猪的生日(农历日期写到 2029 年);周末问候。 - **摸不同部位**:左键点猪会真的摸它,头、耳朵、鼻子、肚子、背、尾巴、脚各有反应和台词;30 秒内第 8 下开始不耐烦、不再加心情,停手 1 分钟消气。 - **猪自己找事做**:面板收着、猪在家时,每 3–8 分钟打滚、打盹、追蝴蝶、挠痒、伸懒腰、看屏幕或吹泡泡。 - **桌面散步**(设置里打开,默认关,只有桌面版):每 10–20 分钟沿屏幕底边走一段再走回原位。用的是桌面程序 0.3.0 已有的能力,不用升级桌面程序。 - **扩展删除**:卸载并清掉它的数据(先在卡片里确认一次);删掉的内置扩展可以在「在线扩展」里重新安装,从零开始。 - **在线扩展**:从本仓库的 `extensions/registry.json` 读扩展目录,只装我们自己发布的;下载的文件逐个核对 sha256,游戏版本不够不装。下载的扩展有自己的 App,只能改自己的数据,出错只影响它自己。设计见 `docs/design/extension-download.md`。 - 调试页新增「猪自己找事做」:马上做个小动作、散步一次、问一次按时间该说的话。 ### Changed - 钓鱼的抛竿前和结果页重做:鱼饵做成卡片,抛竿是主按钮,自动钓鱼收进下面并写明点不了的原因;结果页有星级和「大个的」。 - 一次操作只说一句话:照料、出门、买东西、用东西不再先冒一句客户端的固定话。 - 口头禅不再接在「(这是抗议)」这类括号说明后面。 ## [0.28.0-rc.3] — 2026-10-05 · 扩展中心与界面整理(测试版) 这一版只更新游戏,不用重装桌面程序(桌面外壳仍是 0.3.0)。下面包含 rc.1、rc.2 和按 rc.2 反馈改过的全部内容。 ### Added - **扩展中心**:主菜单新增「扩展」🧩 App。番茄钟、钓鱼成为可以单独开关的扩展:关掉后主菜单、商店里的相关商品(钓鱼的鱼饵)、图鉴里的相关分区(鱼类)、猪身上的番茄钟角标都不再出现,后台也不再结算;存档里的数据都保留,背包里已有的鱼和鱼饵照常能用,重新打开一切恢复。 - 进行中也能关:番茄钟正在专注会放弃这一个(不给奖励),猪正在外面自动钓鱼会被叫回来并退回鱼饵,卡片上会提前写明。 - 开关存在存档里(DSH 和桌面版各自设置);老存档默认全部打开,不升存档版本。以后的种菜、盲盒、小游戏都按同一套格式加成扩展,设计见 `docs/design/extension-center.md`。 - **签到改成 7 天一轮**:奖励由低到高,第 7 天是还魂丹 + 豪华大餐 ×2。原来 12 天里正在第 8~12 天的老存档,回到第 1 天并补发一份第 7 天礼包(只补一次)。 - **背包货架里显示状态**:打开食物、洗浴、玩具、药品时,顶上有饱食、心情、清洁、健康四条和体重,用东西时能看到变化(背包首页不显示)。 - **日记改成写好的日记本**:319 篇短日记,带一点黑色幽默。每天按最要紧的那件事选一组(没人来、日常、吃撑、被摸、洗澡、打工、上课、旅行、升级、长大、毕业、生病、吃错药、病好、陪主人干活),组里挑最近没写过的。已经写好的旧日记不动。 - **换肤 App 新增「怎么做皮肤」页**:10 张图各配一张缩略图,写明文件名、必须还是可选、什么时候出现,以及规格和 skin.json 写法;可以一键打开完整教程或下载示例皮肤包。 - **换肤教程重写**(`docs/guides/creating-skins.md`):每一步配图——10 个动作对照、画布与脚底对齐、ZIP 里应该长什么样、导入成功和失败的截图;补了各绘图软件的导出要点和完整的报错对照表。 - **调试面板分页**:形态皮肤 / 状态 / 成长生病 / 番茄钟 / 钓鱼 / 签到礼包 / 更新扩展 / 台词 / 时间面板 / 数值,顶部页签、左右箭头或左右滑切换;每个按钮右边一句说明点了会怎样。横着放不下的页签可以用鼠标滚轮左右滚。新增:设签到第几天、发在线礼包、模拟「有新版本」红点、开关扩展、让猪说任意场景的一句、查看当前全部数值。 ### Changed - **状态页精简**:等级条放到最上面;体重、体型合成一行小字(「1.5 kg · 正常」),体型叫法统一成「正常 / 圆润 / 胖胖」;去掉「陪伴」(居民卡里还有)和番茄钟那一行。 - **状态页的喂食、洗澡、玩耍改为跳到背包对应货架**,按返回回到状态页;摸摸仍在原地。背包里用食物、洗浴用品、玩具和喂食完全一样:会长体重、可能胀气、猪会说话、玩耍会减重。免费的小皮球出现在玩具货架里。货架空了有「去商店买一点」按钮。 - **改名和「猪怎么叫你」挪到居民卡**:名字旁边鼠标移上去出现蜡笔,点了就地改;称呼点铅笔修改。**免打扰挪到设置**。 - **还魂丹放进药品货架**(商店、背包、图鉴都一样),不再单独一个「复活」格子。 - 图鉴道具的筛选页签横着放不下时,可以用鼠标滚轮左右滚。 - **更新入口收进设置**:主菜单去掉「更新」格子;有新正式版时设置格子冒红点,设置页顶部「🔄 更新」带红点。更新面板按正式版分组,测试版收在对应正式版下面、默认折叠,标「手动安装」;红点和「更新到最新」只看正式版。 - **照顾数值调整**(确认单 `docs/numbers/G2-care-balance.md`):吃东西不再扣清洁;洗澡扣饱食、玩耍和玩具扣清洁都减半左右;只有饱食已经 100% 还硬喂才可能胀气,概率 15%;心情每小时掉 2.4(原 3.6),清洁每小时掉 3.6(原 4.2)。 ### Fixed - **桌面版导入皮肤 ZIP 总是失败**(提示「ZIP 目录损坏」或一串英文):桌面程序把上传的文件当文字读坏了。现在游戏改用文本方式上传,DSH 网页版和桌面版都能导入,不用更新桌面程序。ZIP 损坏时提示「ZIP 文件损坏,请重新压缩后再导入」。 - 次要的小按钮(更新面板的测试版折叠、调试页翻页箭头等)被显示成了醒目的主按钮。 - 换肤页「怎么做皮肤」按钮贴着面板底边,不好点。 ## [0.27.3] — 2026-10-05 · 桌面体验大修 这一版集中修了 Windows 桌面版的各种「跳、闪、卡」,并把桌面程序瘦了身。桌面程序升到 **0.3.0**:以后窗口相关的修复都跟着游戏包走,在「更新」里点一下就到,不用再重装桌面程序。 ### 桌面程序瘦身 - 量尺寸、钉位置、窗口摆在哪、哪里可点、Windows 鼠标穿透、桌面专用样式,都从桌面程序挪进了游戏包。桌面程序只保留窗口、托盘、更新、字体文件和几个基础动作。 - 回退到老游戏包时,桌面程序自动用原来的逻辑,照样能玩。 ### 不再跳、不再闪 - 开、关面板,摸猪冒气泡,切换 App,窗口都不再挪动或改大小(以前在 Windows 上会闪白、整块往上跳、猪下面出一只重影)。 - 拖动更跟手:按住猪的位置算,不会拖着拖着卡住或「瞬移」回原处;按住不动再拖也能接着走。 - 每次启动猪停在上次的位置,不再一点点漂走;启动时面板总是收起。 - Windows 上不再显示会画坏的系统小提示框;可点区域改用鼠标穿透,开关面板时不闪白屏。 ### 外观与操作 - 内置整套 Noto Color Emoji,三个平台图标一样,Windows 10 上的金币 🪙 等不再显示成方框;设置里可以切回「系统自带」。 - 设置页改版:每项一行分段按钮;新增「小猪大小」四档(小 / 标准 / 大 / 特大,标准与原来一样);去掉「主菜单图标」。 - 面板最高 520px,列表再长也在面板里滚动;开关面板有淡入淡出动画;面板朝下开时名牌和面板之间留出间距。 - 猪说话的气泡固定在猪头上方;签到、礼包的结果由猪说出来,其他通知改成面板顶部的一条横幅,不再盖住内容。 - 摸猪的光标换成 👋;番茄钟角标不再被帽子压住。 ### 更新页 - 加了「刷新」按钮;正在用预览版时不再提示「更新」到更旧的正式版。 - 普通玩家的版本列表不再显示预览版;桌面程序只在新版游戏需要时才醒目提示。 - 0.1.x 旧桌面程序会提示下载新安装包。 ### 修复 - Windows 上在更新页切换版本时弹出「A JavaScript error occurred in the main process」。 - 回退到老游戏包时窗口会被面板越撑越高。 ## [0.27.2] — 2026-10-04 · 体验修复与社区发现 ### Added - GitHub 仓库补充 `dsh-plugin` topic;[`dsh-plugin-piggy@0.27.1`](https://www.npmjs.com/package/dsh-plugin-piggy) 别名包已发布,供按包名前缀检索的第三方社区目录发现。别名包依赖原始 `dsh-piggy`,两者共用玩法与存档,每个 DSH profile 只需安装其中一个。 - 按社区规则向 dsh-plugin.org [提交收录申请](https://github.com/dshplugin/dsh-plugin-hub/issues/79),并向 awesome-dsh-plugin [提交作者自荐](https://github.com/bruc3van/awesome-dsh-plugin/pull/134);目录均由第三方维护,收录仍待对方审核。 ### Changed - README 的 DSH 安装说明改为可直接复制的 npm 包安装命令,GitHub 源码安装留作备选。 - 打开 App 和成功购买商品时增加短促反馈;系统启用“减少动态效果”时跳过这些动画,不影响操作与钓鱼判定。 - 长列表中的 App 标题与返回按钮保持可见;切换 App 时从新页面顶部开始。隔离预览补充图鉴、皮肤、钓鱼等当前玩法的示例数据。 - 打工选中的职位详情固定在面板底部,职位列表独立滚动;旅行页只显示目的地,纪念品仍可在背包和图鉴查看。 ### Fixed - 修复猪头气泡样式规则未闭合造成的圆角、背景与字号丢失;长台词最多显示两行,番茄钟和面板换边时仍贴着猪头。 - 六款角色外观共 54 张立绘恢复到默认小猪的身形与脚底位置;老存档已经穿戴的装扮可在背包「已穿戴」里脱下,购买和穿戴记录保留。 - 兴趣课显示完成所需的 30/60 分钟、完成后的属性奖励与上课剩余时间;课程结算时由小猪气泡提示获得的属性。面板收起时签到和开礼包也会在气泡里显示实际奖励。 - 图鉴皮肤详情的使用按钮增加上间距并居中。网页点击面板外、桌面窗口失焦时可自动收起面板;设置里可关闭,输入、拖动和钓鱼检定期间不收起。 - 发布标签不再运行缺少凭据的 npm 自动发布 job;npm 与别名包的本机手动发布顺序写入开发文档。 - 离线归来先按活动完成时刻结算并经过 06:00 日界,再写日记;跨日搬砖不会被记到重新打开面板的那天。 - 图鉴搜索和钓鱼技能检定在四秒状态轮询中保留正在操作的节点与焦点;钓鱼阶段真正变化时仍会刷新画面。 - 钓鱼页在饱食不足时直接说明原因并提供喂食入口;鱼饵与抛竿按钮拉开间距。修复 QTE 普通点击和键盘触发时事件对象未传递,导致判定偶尔不响应。 - 交互验收改用真实 DSH 的独立 3084 实例和独立存档,覆盖商店买饵、喂食、抛竿、提竿、QTE 和鱼入袋的完整流程。 ## [0.27.1] — 2026-10-03 · 桌面更新依赖安全修复 ### Fixed - 桌面版 `electron-updater` 使用的 `builder-util-runtime` 升至 9.7.0,修复跨来源重定向时可能转发认证请求头的问题(CVE-2026-54673)。感谢 [@anupamme 的 PR #5](https://github.com/CLICGGER-TYPES/dsh-piggy/pull/5) 报告并指出受影响的依赖。 - 桌面外壳升至 0.2.1;使用桌面版的玩家需更新外壳,仅更新游戏包不能替换旧外壳。Windows 安装版和 Linux AppImage 可通过「更新」App 下载并重启安装;Windows 便携版和未签名 macOS 版需从发布页手动替换。 ## [0.27.0] — 2026-10-03 · 角色外观、设置与桌面更新 ### Added - 接入六套共 54 张角色 SVG:厨师猪、宇航员猪完成对应工作一次后解锁;侦探、天使、海盗、巫师猪作为免费内置皮肤。职业外观可在换肤与图鉴中查看和切换,调试页有全部入口;钓鱼动作缺图时回退待机。解锁记录沿用图鉴字段,存档版本不变。 - 原胖猪 9 张待机/动作图移至圆润档;新的 9 张更胖立绘用于最胖档。商店新增草莓、烤红薯、海鲜饭、柚子浴、花瓣浴、飞盘、小鼓、蹦床、樱桃发夹、毛线背心。 - 主菜单新增「设置」App,可在系统 Emoji 和随包提供的 15 张 SVG App 图标之间切换;选择留在本机,不提升存档版本。加冕和签约后新增对应台词与口头禅小尾巴。 - 更新 App 分开显示游戏版本和桌面外壳版本;Windows 安装版与 Linux AppImage 可下载新版外壳,确认重启后安装。Windows 便携版与未签名 macOS 版显示对应的手动替换说明。 - 桌面外壳升至 0.2.0;发版流程将 `latest.yml` / `latest-linux.yml` 与安装包上传到相同的游戏版本 Release。旧版外壳需手动升级一次才能使用这一能力。游戏存档版本不变。 - 发布标签时同步将同版本插件发布到 npm(使用仓库的 `NPM_TOKEN` secret)。 ### Changed - 商店和背包暂时隐藏「装扮」,等待重新设计展示方式;已有装扮的购买和穿戴记录保留,已穿戴外观仍会显示。 - 钓鱼提竿窗口延长到 2 秒,QTE 放慢并扩大判定区,按下鼠标时立即判定和反馈。商店新增三档鱼饵,手动与自动钓鱼每次尝试都消耗鱼饵;自动收获进鱼篓,不再自动出售。 - 使用洗浴和玩具道具不再等待冷却;桌面版拖动改用跨显示器的虚拟桌面范围,修正移动窗口后的拖拽判定和位置上报。 ## [0.26.1] — 2026-10-02 · 更新提醒与文档整理 ### Added - 桌面版启动后会在后台检查游戏包和桌面外壳版本;有新版本时,小猪提示一次,主菜单“更新”显示红色感叹号。打开更新 App 即将该版本标为已读,即使暂不安装也不再持续提醒;以后发布更新版本会重新出现。 - DSH 插件也提供“更新”App,只负责提示 GitHub 新版本并打开发布页,不会自动改写本地插件文件。 - 游戏发布清单新增 `shellVersion`,桌面版可区分游戏热更新与需要替换安装包的外壳更新。 - 新增玩法、桌面安装、更新机制、开发与调试文档。 ### Changed - README 精简为项目介绍、安装、快速开始和文档入口;养成规则、调试模式、开发命令及更新原理移入文档中心。 - 桌面外壳升至 0.1.3,以支持外壳更新提醒。存档版本保持 v12。 ## Contributors - 本版继续包含 @1nuoiscute 在 PR [#3](https://github.com/CLICGGER-TYPES/dsh-piggy/pull/3) 与 [#4](https://github.com/CLICGGER-TYPES/dsh-piggy/pull/4) 提供的恶魔猪、体型与胖胖猪立绘成果,感谢其持续贡献。 ## [0.26.0] — 2026-10-02 · 图鉴、体型、钓鱼与换肤 ### Added - 新增「🎨 换肤」App:内置皮肤可直接切换,不进商店、不占背包;图鉴皮肤详情也能切换。显示顺序固定为晋升形态、当前皮肤、默认猪,形态结束后会恢复原皮肤。 - 支持导入玩家皮肤 ZIP。最少包含待机、吃、洗澡、玩耍、摸摸 5 张 SVG,可补齐放松、打工、学习、旅行、钓鱼共 10 张;导入前会检查清单、尺寸、外链、脚本、字体、位图、渐变和滤镜。新增制作教程、示例目录和可直接下载的示例 ZIP。 - 新增「🎣 钓鱼」App:单击抛竿、2–8 秒咬钩与 1 秒提竿窗口;提竿后进入圆盘技能检定,在绿色区域点击或按空格,黄色完美区一次推进两格。难度会缩窄区域、加快指针并把连续命中要求从 2 次提高到 4 次;点早或点晚不会立即失败,连续空三圈鱼才会跑,关闭面板仍会判失败。 - 加入 15 种按本地早/午/晚/夜出现的鱼。服务端在抛竿时用存档随机序列锁定鱼和尺寸,待处理记录保留 60 秒,刷新不能重复拿鱼;鱼可放进背包喂或卖,图鉴记录最大尺寸,调试页可给予每一种鱼并跳过等待。 - 自动钓鱼可选 30/60 分钟,每 3 分钟按难度判一次,最低成功率 20%,所得按 70% 自动出售,每天最多两次;钓鱼也会按实际时长减少超重部分。`ensureFishing` 给老存档补字段,存档版本仍为 v12。 - 主屏原「加冕」位置改为「📖 图鉴」,分为形态、皮肤、鱼类、道具、纪念品五页,并在分类入口显示收集进度。形态与皮肤使用三列小闪卡,只有已解锁卡面带轻量透视倾斜与流光;鱼和纪念品使用博物馆格,道具使用可搜索、按用途筛选的紧凑目录。条目详情独占内容区;未解锁形态只显示对应 SVG 的灰色剪影、锁章与谜面,解锁后显示原色立绘、简介和发现记录。动态效果尊重系统的减少动态效果设置。 - 新增不升存档版本的 `state.dex` 收藏记录,保存第一次获得时间与次数;购买、礼包、外出掉落、旅行纪念品、变身和调试给予都会点亮相应条目,老存档会从已有物品、形态与纪念品补齐。 - 图鉴分类提供 `registerDexSection`,供后续钓鱼与换肤直接接入。 - 新增正常 / 圆润 / 胖胖三档体型,分界为当前等级理想体重的 1.3 / 1.6 倍;状态页显示当前档位、理想体重和下一条分界,调试页提供三档入口。 - 普通形态的默认皮肤进入胖胖档后使用贡献者 1nuoiscute 在 PR #4 提供的待机与动作立绘;王、恶魔和其他皮肤保持原样。圆润档先沿用普通立绘,等待对应素材。 - 玩耍每次减少超重部分 3%(每日最多 10 次),打工每实际小时减少 3%,自然代谢每猪日减少 2%;只减超出理想体重的部分。新增的每日玩耍记录由 `ensureBodyWeight` 补齐,存档仍为 v12。 ## Contributors - 感谢 @1nuoiscute 在 PR [#4](https://github.com/CLICGGER-TYPES/dsh-piggy/pull/4) 提供肥猪体型与减重系统的原始实现,并补充胖胖猪待机及动作立绘;本版在此基础上整理规则、兼容存档并接入调试页。 ## [0.25.2] — 2026-10-01 · 桌面版不再拖卡浏览器,新增 macOS 包 > 桌面版安装包(外壳)升到 0.1.2:窗口的修复在外壳里,**Windows / Linux 用户请重新下载安装包**, > 主屏「🔄 更新」只换游戏、换不到这一层。 ### Added - **macOS 包**:发版时由 GitHub 的 macOS 构建机打 `dmg`(Apple 芯片 arm64 / Intel x64 各一个)。 没有签名,第一次打开要右键 →「打开」,或者执行 `xattr -dr com.apple.quarantine /Applications/dsh-piggy.app`。 macOS 不支持只让窗口一部分可点,猪和面板四周约 16px 的透明边会挡住下面的点击。 ### Fixed - **修复 Windows 上开着猪整机变卡**:桌面版窗口以前铺满整个工作区(透明 + 置顶),Windows 每帧都要 合成一整块全屏透明层;而且渲染层每 120ms 用 `getBoundingClientRect` 量一次框,呼吸动画让结果一直 在抖,`setShape`(Windows 上是 `SetWindowRgn`)每秒触发约 1.7 次。现在窗口只框住「猪 + 面板 + 气泡」 的外接矩形并四周留 16px(拖猪=拖窗口,夹在工作区内),量框改用不受动画影响的布局盒 + 4px 取整 (猪闲着时一次都不调),帧率降到 30fps,滤镜阴影也从会动的元素上挪到了立绘上。 - 桌面版面板中间那条「黑条」:可点区域按内容框原点换算再四舍五入到 4px,相邻两块之间漏出一道缝, 透出了窗口后面的东西;面板右边也被切掉几像素。现在可点区域直接用窗口坐标、向外取整。 - 桌面版猪在屏幕上半部、面板朝下开时,名字框被挤出窗口顶边:现在钉的是整块内容(离窗口边 16px), 不是只钉猪;面板朝右开时名字框和日历挪到猪右边,不再压在猪身上。 - 番茄钟倒计时一段一段跳(只在每 4 秒一次的轮询时更新):现在本地每秒走一格,以服务端为准对表, 到点马上结算。 ## [0.25.2] — 2026-10-01 · 番茄钟、王冠变成道具、恶魔猪、调试要解锁 ### Changed - 调试模式改成「解锁才开」:`Ctrl+Shift+D` 和 `dshPigDev.on/toggle` 都撤掉了,改成主屏版本号 **3 秒内连点 7 次**(第 4 次起提示还差几下)解锁。只在内存里记,刷新/重启就关;老版本存在 localStorage 里的「已开」在启动时会被写掉。控制台只保留 `dshPigDev.off()` 救急。 - 王冠只剩能加冕的那一种:以前买过「王冠」装扮的,读档时换成一顶王冠道具放进背包;已是猪猪王的存档保持原样,存档版本不变。 ### Added - **🍅 番茄钟 App**:挑 15/25/45 分钟(休息 5 分钟),猪在旁边陪着并自动进免打扰,头顶挂 番茄与剩余时间;完成 +8 🪙、心情 +6,每天前 8 个给奖励,之后只计数,中途放弃不给。 倒计时存在 `state.pomodoro`(`ensurePomodoro` 补默认值,存档版本不变),关面板/刷新/重启 都接着走,到点由下次请求结算;完成时发浏览器通知(没权限就用气泡),状态页显示今天做了几个。 - 新台词场景 `pomodoroStart` / `pomodoroDone` / `pomodoroAbandon`(各 3 句)。 - 调试页顶部「🔧 关闭调试」按钮。 - 调试页「番茄钟」组:一键完成当前番茄、把今天的完成数设成 8(测每天上限)。 - 可选恶魔猪形态:Lv40 起,武力、魅力各至少 20,本代完成玩耍至少 20 次后可变身;变身之后心情下降不会退化。 - 商店新增「✨ 晋升」货架:👑 王冠 3000 🪙、😈 恶魔契约 6666 🪙;背包分别点「加冕」「签约」,条件不齐会列出差额且不消耗。形态表统一由道具触发;`/pig crown` 也要先有王冠。 - 成功变身时有 1.5 秒内结束的全屏 👑✨ 或 😈🔥 特效,重复触发会替换上一个。 - 恶魔猪九种日常与互动立绘、额外飞行姿态以及独立动作预览页。 ### Fixed - 番茄钟角标原来挂在场景上(`bottom:calc(100% + 40px)`、`z-index:4`),面板打开时正好压在 「今天完成」那一行上。现在改成贴在猪立绘右上角的小角标:挂在猪身上跟着它走、离猪头不超过 20px、层级低于说话气泡;猪说话时角标让位,面板打开时不碰面板和 HUD。 - 「放弃」现在会先结算:已经到点但还没轮询到的番茄按**完成**处理(照常计数发奖、说完成台词), 不会再被当成放弃丢掉。 - 调试页新增「形态」组:一键变成猪猪王、一键恢复普通(不看等级和三维条件)——`applyDevPatch` 支持 `form` 字段(`null` 恢复普通)。以后每加一种形态/皮肤/鱼,调试页都会自动列出来。 - 形态按钮会顺手把等级拉到该形态所在阶段的起始等级(从 `data/life.js` 读,不写死数字), 否则换了形态立绘不动;等级够了就只改形态。纸盒或已去世时按钮置灰并写明「先孵化」/「先复活」。 ## Contributors - 感谢 @1nuoiscute 在 PR [#3](https://github.com/CLICGGER-TYPES/dsh-piggy/pull/3) 提供恶魔猪形态及完整动作立绘;其原作者提交在合入时保持不变。 ## [0.25.1] — 2026-10-01 · 桌面版退出与托盘 ### Fixed - 桌面版托盘图标没打进安装包,Windows 托盘是空的;现在安装包里带上了图标,单击托盘图标可以叫猪出来或藏起来。 - 桌面版主屏多了「👋 退出」,存好档再关(Linux 的 GNOME 默认不显示托盘,以前没地方退出)。 ## [0.25.0] — 2026-10-01 · — 桌面版 ### Added - `apps/desktop/`:Electron 桌面版,双击出猪。复用插件的存档、结算和路由,不开端口; 透明置顶窗口只在猪和面板处接收点击。托盘:藏起来 / 开机自启 / 从 DSH 导入猪 / 退出。 - 桌面版主屏的 🔄 更新 App:从 GitHub Release 一键更新、挑版本、回退;游戏包校验 sha256, 换版本前备份存档,读不了当前存档的旧版本置灰。 - 发版流程 `.github/workflows/release.yml`:推 `v*` 标签自动测试并出游戏包、AppImage、Windows 安装包。 ## [0.25.0] — 2026-10-01 · — 名字统一成 dsh-piggy ### Changed - 路由 `/dsh-pig/*` → `/dsh-piggy/*`,默认存档目录 `$DSH_HOME/dsh-pig/` → `$DSH_HOME/dsh-piggy/`, profile 层 id 也改成 `dsh-piggy`。 - 旧存档目录第一次启动时自动整个复制过去,旧目录改名为 `dsh-pig.moved-<时间>` 保留。 - 面板的本地设置(开合、位置、开发者模式)换了键名,仍会读旧键,不会重置。 ## [0.25.0] — 2026-10-01 · — 加冕(改编自 PR #2,作者 1nuoiscute) ### Added - 加冕:长成后(成年 Lv40 + 三维各 20 + 本代打工 10 次)可以在主屏新的「👑 加冕」App 里加冕成猪猪王, 也可以一直当普通猪。只换样子,不加收益。形态做成表,以后会加别的形态。 - 猪猪王的 9 张立绘(待机、闭眼享受、吃、洗、玩、摸、打工、上学、旅行),按动作自动切换。 - `/pig crown [形态]` 命令。 ### Changed - 存档 v12:新字段 `form`。 ## [0.25.0] — 2026-10-01 · — B9 主屏与居民卡 - 打开面板先是九宫格主屏(像动森手机):状态、居民卡、学习、打工、商店、旅行、背包各一格,点进去,左上角「‹」回来。底部图标栏不再显示。 - 新的「居民卡」:头像、名字、性别、等级称号、生日、星座、性格、口头禅、签名、收藏数。性格拆盒时随机,口头禅和签名可以改,猪说话时偶尔带上口头禅。 - 打工也改成方块:武力 / 魅力 / 智力 → 职业 → 点开看门槛和「出发」。 - 「在外面 / 生病 / 走了」的提示只在状态页显示,主屏的「状态」方块上挂小标签;和下面的内容拉开了间距。 - 修:猪出门时,面板下方的名字框会挤到猪身上。 ## [0.25.0] — 2026-10-01 · — B8 方块界面 - 学习、商店、背包改成动森手机那样的彩色方块:第一层是大类(学段 / 货架 / 背包分类),点进去里面也是方块,左上角「‹」返回。截图见 `docs/screenshots/b8-*.png`。 - 锁住的学段变灰但能点进去看;等级不够的装扮变灰;背包空的分类变灰。 - 面板展开时 📅 签到不再压在图标栏上,挪到猪旁边。 ## [0.25.0] — 2026-10-01 · — 界面体验修复 按用户 2026-10-01 的反馈修的 bug(**学习 / 商店 / 背包的排版保持原样**:用户先要过折叠、 再要过方块,看了都不满意,最后要求还原,两个版本都已撤掉): - **点猪不再横跳**:签到气泡的 `@keyframes` 和猪的待机动画重名,覆盖后猪被 `translateX(-50%)` 推走半个身位,一播反应动画就跳回去再跳回来。 - **面板钉住自己的基准字号**:打工详情这类没写字号的框会继承宿主页面的 16px,比周围大一倍。 - **学习页选中的学段不再被 4 秒轮询顶回小学**:自动归位只在用户还没自己选过时生效。 - **签到气泡挂在猪上方**:折叠时原来和猪重叠 24px。 - **面板里能改猪的名字了**:「✏️ 称呼」改主人、「✏️ 名字」改猪;昵称不再印在面板上。 - **删掉解释性废话**:纸盒的「不用敲命令」、生病与墓碑的长说明、空背包/空家当的劝告。 ## [0.25.0] — 2026-10-01 · — B6 台词 - 24 个场景、90 多句台词(文案见 `docs/numbers/B6-lines.md`):吃撑、打工回来/累了、上完课、毕业、旅行回来、长大、复活等都会说话。 - 闲着每 20–40 分钟冒一句,先说需要什么(饿/脏/孤单),不需要才闲聊;离开半小时以上再打开会打招呼。 - 状态页:「🙋 叫你「主人」 改」可以改称呼;「🔔 免打扰」开了不闲聊、不弹日常消息,生病和死亡照样提醒。 - 学习页:「🎯 兴趣」成了学段旁边的一个按钮。 - 调整:病得慢一点(饿、脏各 3%/h),三维报酬加成降到每点 1/150 且不再缩短工时。 ## [0.25.0] — 2026-10-01 · — B2 成长 · B3 疾病 · B4 学习→职业 数值全部照 `docs/numbers/` 里用户 2026-10-01 确认的单子。存档 8 → 11,每一级升级前都会原样备份。 ### B2 成长 - 成长值(存档里的 `xp`)按猪时间自己长:每小时 +100,乘照顾系数(心情、饿脏、健康)。 - 等级曲线 122 × L²,满级 60(约半年)。形态按等级:幼年 Lv1 / 青年 Lv10 / 成年 Lv40。 - **去掉老年阶段和老死**,猪只会因为意外(病到最后一期)死掉。 - 陪主人干活每天最多额外 +300 成长;打工/旅行每小时 +25,上课每节 +40。 - 拆纸盒时定性别(♂/♀)。 ### B3 疾病 - 五条链(感冒 / 咳嗽 / 肠胃 / 头晕 / 皮肤),每一期一味专用药(30/70/140/260),百草丹 500 包治百病,还魂丹 800。 - 发病改为按条件的每小时概率:饿 → 感冒,脏 → 咳嗽(很脏 → 皮肤),心情差或连续打工上课 → 头晕,吃撑 → 肠胃。 - 吃错药病情立刻加重一级;看医生按药价 × 1.5 直接治好。旧的四种通用药按新价退金币。 ### B4 学习 → 职业 - 九门课(语文 数学 政治 音乐 艺术 礼仪 体育 劳技 武术)各算各的课时;第 9 / 20 / 40 / 95 节毕业,必得 3 件礼物。 - 33 种职业(原版 18 + 新增 15),门槛是等级 + 课时(+ 兴趣证书);三维只影响报酬。 - 兴趣课上满 5 次拿证;打工、上课回来会随机带东西。 - 旧的 23 门课按对照表并进九门课的课时;正在打的旧工作按旧报酬结算。 ### Documentation - README 截图使用仓库相对路径;补充独立克隆、源码构建及 Windows PowerShell 入门。 - 开发目录说明适配 packages/pet-core,构建工具固定为已验证版本。 ### Verification(文档) - 本地链接、构建、类型检查及完整自动测试通过;客户端生成产物保持与上游一致。 ## [0.25.0] — 2026-10-01 · — 批次 0 框架 ### Changed(内部) - 领域层抽成 `packages/pet-core`(`@dsh-piggy/core`,零依赖),DSH 插件和以后的独立版共用;根目录 `core.js` / `data.js` 改为再导出,导入路径不变。 - 结算改为分段分步:一段空白切成「在外到活动结束」+「在家」,每 5 分钟一步推进。 - 随机数种子存进存档(`state.seed`),领域层不再调用 `Math.random()`。 - 存档逐级升级框架(`core/upgrades.js`),升级前原样备份为 `state.json.v<旧版本>-backup-<时间>`。存档版本 7 → 8。 ### Added - 台词框架:13 个场景、`[主人]` 称呼、气泡里的回复按钮(回复一次加一点心情)。喂食/洗澡/玩耍/摸摸会说话。文案是样例,待 B6 审定。 - 任务卡与数值确认单:`docs/tasks/`。 ### Fixed - 没拆的纸盒吃到经验后,重启会被当成已孵化的猪。 - 15 分钟零工 + 关机一整晚,整晚都按「在外」算:不掉到保底线以下、不会生病,工钱还盖着重开面板那一刻的时间。现在活动在结束那一刻结算。 - 同一时刻的多条消息(如「病情加重」+「走了」)只显示第一条。 ### Behaviour change - 关掉 DSH 期间没人照顾,猪会在中途真实地生病、病情继续发展(以前只在重开那一刻才开始算)。生病期间不再累积「得新病」的风险。 ## [0.24.0] — 2026-09-30 ### Added - **调试页显示构建版本**:「🔧 开发者模式 · 构建 v0.24.0 · Ctrl+Shift+D 关闭」。 DSH 是在**启动时**组装客户端 bundle 的,改完代码不重启就还是旧界面 —— 以后"我现在看的是哪一版"直接读这一行,不用猜。 ### Changed(对外) - **插件描述不再宣称"复刻"**:只保留"玩法参考经典电子宠物"的说法,元数据里 也去掉了第三方的品牌词。新增 [THIRD-PARTY.md](THIRD-PARTY.md),逐项列明参考 资料、运行时依赖、美术来源与许可,并保留商标声明。 ### Fixed - **存档损坏不再让猪静默消失**:以前 `load()` 是裸 `catch`,文件一坏就当作"没有猪", 下一次写入还会把坏文件覆盖掉。现在会保留一份 `state.json.corrupt-<时间>`、 日志说清原因,原文件不动。 ### Changed(内部,界面无变化) - 客户端源码移到 `src/client/`,`client.js` 改为 esbuild 产物;`npm run build` 生成, `test/bundle.test.js` 守住产物新鲜度。详见 [docs/archive/REFACTOR-PLAN.md](docs/archive/REFACTOR-PLAN.md)。 - 新增 [docs/CONVENTIONS.md](docs/CONVENTIONS.md)(项目版编码规范)。 - 分层拆分(均保留同名 barrel,导入路径零改动):`data.js` → `data/` 9 个模块、 `core.js` → `core/` 15 个模块、`index.js` → `snapshot/commands/routes`、 `store.js` → `store/{api,state-file}`。公开导出面逐项比对无变化。 - 领域层不再读系统时间(`nowMs` 一律作参数);代码注释去掉 emoji; 新增静态守卫(领域层时间、注释 emoji、文件 400 行上限、发布 files 覆盖)。 - 新增 `npm run typecheck`(`tsc --noEmit --checkJs`,不进构建、不加依赖)与 静态守卫;源码全部带 `// @ts-check`,当前**零类型错误**。 - 客户端源码按职责拆成 `styles/constants/values/normalize/storage/dom/scene/ effects/layout/panel/io` 与 `tabs/*`,由 esbuild 打包;界面渲染结果与拆分前 逐页签、逐交互(拖拽、开关、装扮)比对一致。 ### Verification - `node --test`:**175 / 175 通过**(新增:产物新鲜度、单文件契约、版本字段、 存档损坏保留现场 5 项、领域层时间 / 注释 emoji / 文件行数三条静态守卫)。 ## [0.23.0] — 2026-09-30 按你的四条反馈改。 ### Changed - **面板不再讲道理**:删掉「等级不会因为猪走了而清零 —— 领养新猪时会继承」 「再过 N 天就长成下一阶段了」「去「学习」上课就能涨这些属性」「不用解锁,想学就学」。 这些是设计说明,不该出现在界面里。 - **打工解锁只写需求**:「🔒 需要 💪 武力 16」,不再附「(你现在 9)」; 解锁后属性那行也从「✨ 魅力 0 · 去上课就能涨」缩成「✨ 魅力 0」。 - **时间倍率搬进「调试」页**:现在是调试页里的「时间」分组(×1 真实 / ×12 / ×30 / ×60), 状态页彻底没有它。 ### Added - **装扮真的穿在猪身上了**:猪有 6 个固定点位 —— 头 / 脸 / 脖子 / 身子 / 背后 / 脚, 每个点位同时只挂一件(戴王冠会自己把草帽摘掉)。位置全部写在 client.js 的 `.dp-slot[data-slot="…"]` 里,**以后换成真立绘只改那几行偏移,逻辑和存档都不用动**。 背包里每件写清点位(「脖子 · 脖子上暖乎乎的」)。 - **调试页「🎁 一键拿齐」**:消耗品各 20、全部装扮、金币 99999。新路由 `giveAll`。 ### Removed - 名字牌上重复显示装扮的那串 emoji(现在挂在猪身上了,没必要写两遍)。 ### Verification - `node --test`:**164 / 164 通过**。 - 浏览器复查:状态页没有讲解文字也没有时间倍率;调试页有「时间」和「一键拿齐」; 围巾出现在 `.dp-slot[data-slot="neck"]` 且落在猪的包围盒内;背包显示「脖子 · 脖子上暖乎乎的」。 ## [0.22.0] — 2026-09-30 按你的反馈砍回简版。 ### Removed - **体力 / 才艺 / 审美 / 头脑 这四条「技能」全部删掉。** 它们只是 武力 / 魅力 / 智力 换了个名字:状态页那一栏、技能等级、百分比、上限,以及"用技能抵扣打工门槛"的整套逻辑 全部回退。现在只有 🧠 智力 / ✨ 魅力 / 💪 武力 三条。 ### Changed - **时间倍率(×1 / ×12 / ×30 / ×60)挪进开发者模式**(Ctrl+Shift+D),普通用户看不到 —— 那是调试用的,不该让人为了"猪长得慢"去点它。 - **兴趣改成「学习」页里的一栏可学课程**:📷 摄影 / 💻 编程 / 💃 跳舞 / 🏋 健身。 不用解锁、可以反复学,学一次直接把 +2 加到对应的那一条属性上; 右上角直接写「30 分钟 · 40 🪙 · ✨魅力 +2」。 不再是状态页里一栏看不懂的被动技能条。 ### Verification - `node --test`:**160 / 160 通过**(删掉 6 个技能测试,新增 5 个兴趣/开发者模式测试)。 - 浏览器复查:状态页没有技能栏、没有时间倍率按钮;学习页「🎯 兴趣」四条正常;无文案截断。 ## [0.21.0] — 2026-09-30 批次 4 之二:**商店 21 → 45 件 + 装扮(家当)**。ROADMAP 的四批改造到此做完。 ### Added - **货架扩容到 45 件**:食物 6→10、洗浴 5→8、玩具 5→10,药品 4 件、复活 1 件不变。 - **12 件装扮(新货架「家当」)**:红围巾 Lv.1 → 翅膀 Lv.16,价格 80 → 8000。 | 等级 | 装扮 | |---|---| | Lv.1–3 | 红围巾 🧣 · 草帽 👒 · 墨镜 🕶 | | Lv.4–7 | 背带裤 👖 · 领结 🎀 · 雨靴 🥾 · 披风 🦸 | | Lv.8–13 | 花环 💐 · 礼帽 🎩 · 项链 📿 · 王冠 👑 | | Lv.16 | 翅膀 🪽 | - **穿上 / 脱下**:背包页新增「👕 家当 x/12 穿着中」,每件一行;穿着的装扮显示在 名字牌上(`猪猪 Lv.3 · 成年猪 · 🧣👑`)。新路由 `wear`。 ### Changed - 商店把**消耗品**和**家当**分开:消耗品照旧计数(×N)、买不起的淡掉; 家当不计数、不可重复购买、按等级解锁 —— 等级不够的格子写「🔒 Lv.13」, 已拥有的写「已拥有」(虚线框、按钮禁用)。 - 背包的物品计数不再包含装扮(它不是拿来用的),对装扮点「使用」会被诚实拒绝 (`not-consumable`)。 ### Migration / 数据 - 存档新增两个字段:`dress`(已拥有)与 `worn`(正在穿)。旧存档没有它们 → 空数组,不影响任何已有内容;手工改坏的存档(比如把药品塞进 `dress`)在读取时被丢掉, 而且**只有已拥有的才能穿上**。 - 这次没有升 `STATE_VERSION`(仍是 7):两个字段都是可选的,`migrate` 会补默认值。 ### Verification - `node --test`:**161 / 161 通过**(新增:45 件货架与六层分组、装扮按等级购买且只能买一次、 穿上/脱下、药品不能穿、损坏存档被清洗、`wear` 路由、商店/背包/名字牌三处渲染)。 - `tools/preview.html` 真实浏览器复查:装扮货架(已拥有的虚线框、🔒 Lv.4…Lv.16)、 背包「家当 1/12 穿着中」与穿上/脱下、名字牌上的 🧣、无文案截断。 ## [0.20.0] — 2026-09-30 批次 4 之一:**旅行目的地扩容 + 纪念品能打开**。 纪念品以前是字符串数组(`['贝壳']`),列出来就完了,点不了、卖不掉、没有出处。 现在每一件都是带稀有度和故事的物件。 ### Added - **旅行目的地 4 → 7**:郊游 / 名山大川 / 泡温泉 / 看海 / 古镇 / 出国 / 看极光。 目的地行直接写「可带回 🔵稀有」,远的地方一眼看出值不值。 - **25 件纪念品**,每件带 `key / emoji / 名字 / 稀有度 / 故事`: | 稀有度 | 卖价 | 例子 | |---|---|---| | ⚪ 普通 | 60 🪙 | 松果、海盐、温泉蛋 | | 🔵 稀有 | 320 🪙 | 一枚海螺(「贴在耳朵上能听见浪声」)、异国邮票、小灯笼 | | 🟡 传说 | 1600 🪙 | 漂流瓶(「瓶子里有张潮湿的纸条」)、极光照片、紫砂壶 | - **点开看故事**:旅行页点纪念品展开卡片 —— 名字、稀有度、来自哪里, 以及猪带回来时说的那句话(「在海边捡到一枚海螺,贴在耳朵上能听见浪声。」), 下面就是「卖掉 +320 🪙」。 - **卖纪念品**:新路由 `sell`,按稀有度结账;没有的东西诚实拒绝(`not-owned`),不会白给钱。 ### Changed - 纪念品的稀有度是**表的属性**,不是抽卡:远的目的地带回来的档次更高, 和「轮换是确定性的」这条老规矩一致,所以整条链路可测。 - 长行程的时长按小时显示(`720 分钟` → `12 小时`)——292px 的面板里这样才放得下稀有度提示。 ### Migration - 存档版本 **6 → 7**。旧存档里的字符串纪念品(`"贝壳"`)会包成普通纪念品: 照样列出来、照样能卖 60 金币,故事位置写明「旧版本带回来的」。 ### Verification - `node --test`:**156 / 156 通过**(新增:纪念品是对象且有故事、轮换可达每一件、 卖价按稀有度、旧字符串纪念品可卖、路由拒绝未拥有的、客户端故事卡与卖掉按钮)。 - `tools/preview.html` 真实浏览器复查:7 个目的地、稀有度提示、点开故事卡、 「卖掉 +320 🪙」、旧字符串纪念品走降级卡片、无文案截断、矮窗口下猪仍在屏幕内。 ## [0.19.0] — 2026-09-30 批次 3 之三:**兴趣技能**。批次 3 到此完整(工种门槛 + 七级学段 + 兴趣技能)。 ### Added - **四个兴趣技能**,全部从「课外」四门课长出来,**等级就是那门课上过几次** —— 没有单独的存档字段,重复上课就是升级: | 课外课 | 技能 | 效果 | |---|---|---| | ⚽ 足球 | 💪 体力 | 体力活(快递 / 搬砖 / 领班)时长 −5%/级,上限 −25% | | 🎹 钢琴 | 🎤 才艺 | 魅力类工作报酬 +5%/级(上限 +25%),并抵扣街头卖艺门槛 2 点/级 | | 🎨 画画 | 🖼 审美 | 旅行心情 +10%/级,上限 +50% | | ♟ 围棋 | ♟ 头脑 | 上课时长 −5%/级(上限 −25%),并抵扣家教门槛 2 点/级 | - **技能能开工作**:才艺 4 级正好顶平街头卖艺的「魅力 8」,头脑 5 级顶平家教的「智力 10」。 抵扣写在锁定行下面(「🎤 才艺 抵扣了 2 点门槛」)—— 不然变小的数字看起来像 bug。 - 状态页新增 **「🎯 本事」** 一栏:四个技能全列出来(0 级写「还没练」), 写清效果和「上哪门课升级」。 ### Changed - 结算分工明确:**体力只减免体力活,才艺只加魅力活的报酬**, 不会出现"练钢琴让搬砖更快"这种事;头脑缩短的是上课时长,不是工时。 ### Verification - `node --test`:**150 / 150 通过**(新增 6 个:等级来自课外课且效果有上限、体力只作用于体力活、 才艺只作用于魅力活、头脑缩短课堂、审美提升旅行心情、技能抵扣门槛后拒绝报的是折后数字)。 - `tools/preview.html` 真实浏览器复查:状态页「本事」四条正常(含 0 级的「还没练」)、 工作页显示抵扣行、街头卖艺从锁定变可出发、无文案截断。 ## [0.18.0] — 2026-09-30 批次 3 之二:**七级学段 + 按科目解锁**。 之前只有三个学段(小学 / 大学 / 研究生),而且解锁条件是「上一级上够 9 节课」—— 一个数字。现在一门课在哪一级上、上过几次,都有账。 ### Added - **七级学段**,从幼儿园一路到研究生: | 学段 | 科目数 | 单课时长 | 学费 | 属性 | 解锁条件 | |---|---|---|---|---|---| | 🧸 幼儿园 | 3 | 15 分 | 20 | +1 | 无 | | 🎨 课外 | 4 | 20 分 | 30 | +1 | 幼儿园 3 门各一次 | | 📚 小学 | 6 | 40 分 | 60 | +1 | 课外 4 门各一次 | | 🏫 中学 | 7 | 1 小时 | 140 | +2 | 小学 6 门各一次 | | 🎓 高中 | 8 | 2 小时 | 300 | +3 | 中学 7 门各一次 | | 🏛 大学 | 9 | 4 小时 | 700 | +4 | 高中 8 门各一次 | | 🔬 研究生 | 9 | 8 小时 | 1600 | +6 | 大学 9 门各一次 | 合计 **46 节课**(3+4+6+7+8+9+9)。 - **23 门科目**:唱歌 / 涂鸦 / 认字 / 足球 / 钢琴 / 画画 / 围棋 / 语文 / 数学 / 英语 / 科学 / 体育 / 美术 / 历史 / 地理 / 物理 / 化学 / 生物 / 政治 / 信息技术 / 哲学 / 经济 / 工程。高级学段重上低级科目时给得更多(语文:小学 +1、大学 +4)。 ### Changed - **解锁条件从「数够课」改成「念完每一门」**:新增 `coursesByStage[学段][科目]`。 七级学段共用科目名(语文在小学/中学/高中都教),所以"上过 9 节课"根本说明不了 小学的六门课上没上全。面板按选中学段只列这一级的课,并显示「本级上过 N 次」。 - **科目不属于该学段会被拒绝**(`wrong-stage`),而不是静默扣学费:幼儿园没有物理。 - 学段按钮不再把学费挤在标签里(七级排两行),学费挪到下面的说明行。 ### Migration - 存档版本 **5 → 6**。旧存档只记了「每级上过几节课」,科目无从还原, 所以按阶梯重建:**某级有课,说明它下面每一级都念过**;该级本身按旧的节数 从课表前面开始记。旧版「小学 9 节」= 新版小学 6 门全过,中学照常解锁 —— 已经念上去的猪不会被打回幼儿园。 ### Verification - `node --test`:**142 / 142 通过**(新增:七级阶梯门槛、跨学段科目拒绝、按科目记课、 旧存档重建、同一科目高级学段给得更多)。 - `tools/preview.html` 真实浏览器复查:7 个学段按钮排成 4+3 两行、切换学段时课程网格 跟着换(小学 6 门 / 高中 8 门)、锁定学段写明「🔒 要先念完中学 7 门课各上一次(3/7)」、 矮窗口(900×420)下内容可滚动且猪仍在屏幕内、科目文案无截断。 ## [0.17.0] — 2026-09-30 批次 3 之一:**打工门槛 + 十个工种**。 之前只有 3 份工作,而且**一个门槛都没有** —— 智力 0 和智力 40 能干的活完全一样, 「学习」这一页等于白做。这一版把学习和打工接上了。 ### Added - **每个工种有三条轴的属性门槛**(🧠 智力 / ✨ 魅力 / 💪 武力): | 工作 | 门槛 | 时长 | 报酬 | |---|---|---|---| | 🧹 打零工 | 无 | 15 分 | 30 | | 🍽 端盘子 | 魅力 2 · 武力 2 | 30 分 | 70 | | 🚚 送快递 | 武力 4 | 1 小时 | 150 | | 🧱 搬砖 | 武力 8 | 1.5 小时 | 260 | | 🏗 工地领班 | 魅力 4 · 武力 16 | 3 小时 | 700 | | 🎤 街头卖艺 | 魅力 8 | 1 小时 | 200 | | 📚 家教 | 智力 10 | 2 小时 | 480 | | 💼 上班 | 智力 14 · 魅力 6 | 4 小时 | 900 | | 🏢 部门主管 | 智力 22 · 魅力 10 | 6 小时 | 2200 | | 🔬 研究员 | 智力 32 | 8 小时 | 4000 | - **没资格时给的是缺口,不是灰按钮**:面板写「🔒 需要 🧠 智力 14(你现在 12)」, 多轴不够就把每一轴都列出来,下面再写一句「去「学习」上课就能涨这些属性」。 命令行拒绝同样说明差多少(`underqualified` → `missing[]`)。 ### Changed - 门槛**在猪出门前**判定:不够格不会扣饱食度、不会进入打工状态,拒绝是干净的。 - `trait` 从「这份工作靠什么属性」变成「这份工作的主属性」:门槛可以要两轴, 但报酬加成和时长减免仍然只由主属性算(魅力打工的猪不会因为武力低而少赚)。 ### Fixed - 老版宿主(没有 `qualified` 字段)在新客户端上**不会把所有工作锁死** —— 缺字段一律当作「有资格」。反向默认会在版本错配时把整个打工页变成 10 个「没资格」。 ### Verification - `node --test`:**140 / 140 通过**(新增 6 个:门槛拒绝、缺轴清单、双轴、门槛出门前判定、 客户端锁定行、老宿主不锁死)。 - `tools/preview.html` 真实浏览器复查:10 行工作、5 行带锁,矮窗口(900×420)下 内容可滚动且猪仍在屏幕内。 ## [0.16.0] — 2026-09-30 批次 2:**时间尺度 + 双轴**。这是地基,后面的内容都挂在它上面。 ### Changed - **年龄对齐现实:一生 8 个月。** 之前是 14 天,跟现实差得太远。 | 形态 | 之前 | 现在 | |---|---|---| | 小猪 | 0–1 天 | **0–1 个月** | | 青年猪 | 1–3 天 | **1–3 个月** | | 成年猪 | 3–7 天 | **3–6 个月** | | 老年猪 | 7–14 天 | **6–8 个月** | | 🪦 墓碑 | 第 14 天 | **第 8 个月** | | 👻 灵魂 | 死后 1 天 | 死后 1 天(不变) | - **年龄改成累计「猪时间」,不是墙上时钟。** `state.ageMs` 每小时累加 `经过时间 × 倍率`。这样**改倍率只影响以后**,不会让猪因为你调了倍率 就突然从幼崽跳到老年。 - **时间倍率可调**(状态页四个按钮): | 倍率 | 一生 | 小猪→青年 | |---|---|---| | **×1(默认)** | 8 个月 | 1 个月 | | ×12 | 20 天 | 2.5 天 | | ×30 | 8 天 | 1 天 | | ×60 | 4 天 | 12 小时 | ### Added - **第二条轴:等级。** 年龄是身体(会老会死),等级是经历(**永不清零**)。 曲线 `xpForLevel(n) = 20n(n−1)`,**无上限**: | 等级 | 所需 xp | 称号 | |---|---|---| | 1 | 0 | 🌱 新来的 | | 5 | 400 | 🙂 熟面孔 | | 10 | 1800 | 🤝 老伙计 | | 20 | 7600 | 🏠 镇宅之猪 | | 35 | 23800 | 📣 十里八乡有名 | | 50 | 49000 | 🌟 传说 | | 80 | 126400 | 👑 神话 | - **领养新猪会继承等级、学历、三维和收藏。** 这是双轴设计的关键: **身体会死,历史不会。** 老死不再是「进度清零」,而是换一只猪接着养。 ### Fixed - 调试补丁的 `ageDays` 只设了 `bornAt`,没设 `ageMs` —— 年龄改成累计之后, 这个按钮就失灵了。现在两个一起设。 --- ## [0.15.0] — 2026-09-30 改造计划的第一批(手感 + 商店)。完整计划见 [docs/archive/ROADMAP-2026-09-30.md](docs/archive/ROADMAP-2026-09-30.md)。 ### Added - **小猪大了一圈。** 40px 在面板里太小了,整套尺寸重排: | 形态 | 之前 | 现在 | |---|---|---| | 📦 纸盒 | 58 | 58 | | 小猪 | 40 | **54** | | 青年猪 | 48 | **60** | | 中年猪 | 62 | **68** | | 老年猪 | 56 | **62** | | 🪦 墓碑 | 52 | **56** | - **摸摸有 10 句台词了。** 之前只有「好舒服…」,点两下就腻。 现在每次随机抽一句(再摸摸~ / 嘿嘿 / 呼噜呼噜… / 这里这里! / (眯起眼睛) …)。 - **戳猪会「扁」一下。** `scale(1.16, .74)` 压扁再弹回来,420ms —— 短到连点也跟得上。 ### Fixed - **连点摸头只有第一下有反应。** `react()` 每次都把 `data-react` 设成同一个值, 而**重新赋同样的值不会重启动画** —— 所以动画只播一次。 现在先摘掉属性、`void pig.offsetWidth` 强制重排、再挂回去,**每一下都从头播**。 ### Changed - **商店从竖列表改成 3 列格子。** 292px 宽的竖列表一屏只能看 3 件,21 件要滚很久; 格子布局一屏 9 件,货架标题横跨整行。 ``` 🍎 食物 ┌────┬────┬────┐ │ 🍎 │ 🍞 │ 🍖 │ emoji / 名字 / 价格 │苹果│面包│骨头│ 持有数做成右上角角标 │ 6 │ 10 │ 15 │ └────┴────┴────┘ ``` - **买不起的格子不再禁用**,改成变灰但仍然可点 —— 点了会告诉你还差多少, 比「按下去毫无反应」好。 --- ## [0.14.2] — 2026-09-30 ### Fixed - **调试改过的年龄在面板上看不出来,所以会被当成「猪长太快」。** 实测有一只猪 `bornAt` 是 5.01 天前、stage 是中年 —— 正好等于调试页「中年」按钮的 `ageDays: 5`,但面板上没有任何迹象说明这是按出来的。 现在: | | | |---|---| | `applyDevPatch` 设了 `ageDays` | 记 `ageForced = true` | | 正常出生 / 开盒 / 重置 | 清掉这个标记 | | HUD 和状态页的年龄 | 带一个 🔧 | | 调试页顶部 | 明确写「年龄是调试改的」 | **自动长大本身是真实的**:`bornAt` 只有 `layEgg` / `hatch` / `hatchEgg` 写当前时间、`migrate` 保留原值、以及调试的 `ageDays` —— 没有别的地方会动它。 阈值也是真实天数:小猪 0 · 青年 1 · 中年 3 · 老年 7。 - 新增 **`ageFromNow`**(调试页「⏪ 年龄归零」):把 `bornAt` 拨回现在, 从此重新按真实时间计算。 --- ## [0.14.1] — 2026-09-30 ### Fixed - **纸盒点不动,点了只会说「好舒服…」。** 判断条件写错了: ```js if (view.pig === null) { pokeBox(); return } // ✗ 只判断「完全没有猪」 ``` 但 `reset` / `adopt` 写出来的存档是 **`hatched: false` 但存档存在** —— 这时候 `view.pig` 是个真实对象(stage 是 box),不是 null, 于是点击落到了「摸摸」上,猪回答「好舒服…」。 根因是**「有没有猪」和「拆没拆盒」被当成了同一件事**: | 位置 | 之前 | 现在 | |---|---|---| | 快照的 `hatched` | 硬编码 `true`(只要有存档) | **`state.hatched === true`** | | 客户端 normalize | `pig !== null` | `d.hatched === true`(旧宿主缺字段时回退到旧行为) | | 戳盒子的判断 | `view.pig === null` | **`view.hatched !== true`** | | 渲染纸盒的判断 | `view.pig === null` | **`view.hatched !== true`** | - **「拆开纸盒」按钮同样没反应。** `store.hatch()` 里写着 `if (state !== null) return false` —— 存档存在就直接拒绝, 于是 `reset` / `adopt` 出来的盒子**用按钮也打不开**。 改成:只有**已经拆开的**才拒绝,并新增 `core.hatch()` **原地开盒** —— 保留金币、背包、课时这些存档里已有的东西(`hatchEgg` 是造一只全新的猪)。 ### Added - 回归测试:**有存档但没拆的盒子,必须能戳开**,且点击**不能**被当成摸摸。 验证过它有效(把判断改回 `pig === null` → 那条立刻失败)。 --- ## [0.14.0] — 2026-09-30 ### Added - **开发者模式。** 按 **Ctrl+Shift+D** 开关(也可以 `window.dshPigDev.toggle()`), 开了之后图标栏多一个 **🔧 调试** 页,点几下就能把猪掰成任何状态 —— 开发时不用再等好几天才看得到「老猪」「肺炎」「墓碑」长什么样。 | 分组 | 能做什么 | |---|---| | 状态 | 😊满状态 · 🍎饿 · 🫧脏 · 🥺孤单 · 💤困 | | 生病 | 感冒一期 · ☠️肺炎 · 🫁肺结核 · 🤢胃癌 · 💚治好 | | 年龄 | 📦纸盒 · 小猪 · 青年 · 中年 · 老年 · 🪦老死 | | 资源 | 🪙+100 · 🪙9999 · 🧠+5✨+5💪+5 · 🎒全套药 | | 生死 | 💀弄死 · ✨复活 · 📦领养 · 🔄重置 | | 面板 | 展开/收起 · ⏩+1小时 · ⏩+1天 | 开关状态存在 `localStorage`,刷新还记得。 - **`reset` 动作。** 之前只有 `adopt`,而它只对**死猪**有效 —— 也就是说猪活着的时候没有任何办法重开,只能手动删存档文件。 更糟的是**运行中的 dsh 把状态缓存在内存里**,所以直接改文件也会被回写覆盖。 - `applyDevPatch()` 全程走和游戏一样的边界检查(`clamp100`、`sanitizeTraits`、 `sanitizeIllness`、`sanitizeInventory`),所以开发者模式**只能造出合法的猪, 造不出坏掉的存档**。实测:`satiety: 999 → 100`、`cleanliness: -50 → 0`、 `coins: -5 → 0`、`health: 99 → 5`。 --- ## [0.13.0] — 2026-09-30 ### Added - **新猪要戳三下才出来。** 领养之后是一个纸盒,戳一下它动一下,戳到第三下才「哇——!」 蹦出小猪。每一下都有反馈: | 戳第几下 | 反馈 | |---|---|---| | 1 | 盒子抖一下 ·「里面好像有东西…」 | | 2 | 抖得更凶 ·「动了!再戳一下!」 | | 3 | 星星粒子 + 「哇——!」→ 小猪蹦出来 | - **纸盒看起来能点。** 之前它就是个静静躺着的 📦,没有任可点的迹象。现在: - `dp-box-breathe` —— 2.4 秒一次的呼吸缩放,像里面真有东西在动 - 底下挂一个「👆 戳三下」的小胶囊提示(`dp-hint-bob` 上下浮动) - 光标变成 `pointer` ### Fixed - **纸盒尺寸客户端写死成 52px,数据里却是 58px。** 现在快照多带一个 `boxStage`(key/label/emoji/size),客户端照着用 —— 两边再也不会各说各话。 - 戳盒子的计数标记原先设在 `.dp-scene` 上,而 CSS 选择器找的是 `[data-dsh-pig][data-poke]`,动画根本不会触发。**这个 bug 是新加的那条 「从源码自动推导 hidden 元素」测试配套的严格断言抓出来的** —— 和 0.8.1 修掉的是同一类:写在 A 上、找的是 B。 --- ## [0.12.0] — 2026-09-30 ### Added - **学习和打工联动起来了。** 以前三维只是面板上的数字,上课和赚钱是两件不相干的事。 现在每份工作都吃一个主属性,而**每上完一节课就给对应属性 +1**: | 工作 | 主属性 | 哪些课涨它 | |---|---|---| | 🧹 打零工 | ✨ 魅力 | 美术 · 音乐 · 礼仪 | | 🧱 搬砖 | 💪 武力 | 体育 · 武术 · 劳动 | | 💼 上班 | 🧠 智力 | 语文 · 数学 · 政治 | 每 1 点属性:**报酬 +6.7%**、**用时 −4%**(最多省一半)。 报酬封顶 **3 倍**,不然后期没有形状了。 实测(上班): | 智力 | 用时 | 报酬 | |---|---|---| | 0 | 240 分钟 | 900 🪙 | | 5 | 192 分钟 | 1200 🪙 | | 10 | 144 分钟 | 1500 🪙 | | 15 | 120 分钟 | 1800 🪙 | **所以上学不再只是「加个数字」,而是直接把猪的时薪翻上去。** - 打工页把联动写出来了,不用猜: ``` 💼 上班 144 分钟 · 赚 1500 🪙 · 省 40% 时间 🧠智力 10 · 报酬 +67% 🧹 打零工 15 分钟 · 赚 30 🪙 ✨魅力 0 · 去上课就能涨 ``` ### Fixed - **猪死了却找不到「领养新猪」按钮。** 按钮被关在 `if (view.pig.soul)` 里面, 而灵魂要**死后一天**才出现 —— 也就是说猪刚死的时候,墓碑是个纯粹的 死胡同:既不能复活(没钱买还魂丹时),也不能重开。 现在**死亡当刻就能领养**,灵魂只是墓碑上的一个视觉效果。 --- ## [0.11.1] — 2026-09-30 ### Fixed - **墓碑上写着「今天刚出生」。** `formatAge()` 只判断了 `days < 1`,没判断死亡 —— 一只出生当天就死了的猪,墓碑上显示的是「今天刚出生」。现在死亡时改成报 **活了多久**,而且时钟停在死亡那一刻: | 情况 | 之前 | 现在 | |---|---|---| | 出生 18 小时后病死 | 今天刚出生 | **活了 18 小时** | | 活了 3 天 | 今天刚出生 | **活了 3 天** | | 活着的猪 | 今天刚出生 | 今天刚出生(不变) | - **每期病期时长改成「越重越久」。** 0.11.0 把每期都设成一天,但现实里 感冒来得快、肺炎拖得久。现在按病期给不同时长: | 病期 | 时长 | |---|---| | 感冒 | 1 天 | | 发烧 | 1.5 天 | | 重感冒 | 2 天 | | 肺炎 | 3 天 | | **不吃药合计** | **7.5 天** | 实测时间线:第 1 天转发烧 → 第 2.5 天转重感冒 → 第 4.5 天转肺炎 → 第 7.5 天死。 (0.11.0 之前的旧代码是每期 25 分钟,四期一共 100 分钟 —— 这就是上一只猪 从感冒到死只用了 102 分钟的原因。) - 阶段推进时**把超出的时间带到下一期**,不再丢弃。跨期的长间隔不会少算。 ### Changed - 测试里的 `advance()` 单位是分钟,之前有人(我)按毫秒传参,导致一次跳了 8600 万分钟、猪直接老死。补了 `stageMinutes()` 换算,避免再犯。 --- ## [0.11.0] — 2026-09-30 ### Changed - **生病改成以「天」为单位。** 原来每期只有 25 分钟,四期一共 100 分钟 —— 一顿饭的功夫猪就没了,健康掉得太快。现在**每期一天,四期共四天**, 够你发现问题、反应、去买药。 - **生病的猪赚钱少一半**(`SICK_PAY_MULTIPLIER = 0.5`)。带病打工仍然是 「穷 + 病」的出路(不会变成新的死锁),但有了代价: | | 搬砖 1 小时 | |---|---| | 健康 | 160 🪙 | | 生病 | **80 🪙** | - **外出会让病情推进得更快**(`SICK_AWAY_MULTIPLIER = 2`)—— 在外面一天等于病情的一天半…实际是**外面半天 = 病情一天**。 躺着养是最省的选择: | 同样过 12 小时 | 病情 | |---|---| | 在家躺着 | 还是第 1 期 | | 出去上班 | 已经第 2 期 | 实现上:病情不再看墙上时钟,而是累计「有效时长」—— 在家 1×、在外 `SICK_AWAY_MULTIPLIER`×。 ### Added - **感冒不管也有小概率自己好**(`SELF_HEAL_CHANCE`,按病期给概率): | 病期 | 自愈概率 | |---|---| | 第 1 期 | 25% | | 第 2 期 | 12% | | 第 3 期 | 5% | | 第 4 期 | **0%** —— 到这一步不吃药就是死 | 自愈时会恢复 1 点健康,并播报「自己好了 💚」。 --- ## [0.10.0] — 2026-09-30 ### Fixed - **生病会把自己饿死 —— 这是个死锁。** 原来 `awayBlockedReason()` 里写着 `if (state.illness !== null) return 'sick'`,于是: ``` 生病 → 不能打工 → 没金币 → 买不起药 → 病好不了 → 只能等死 ``` 现在**生病的猪照样能出门打工/上学/旅行**,只有健康掉到 **1(疾病最后一期, 再下一期就是死)** 才真的出不了门(新的拒绝原因 `weak`)。 猪既然还站得起来,就该能自己挣药钱。 实测:感冒 · 3 金币 → 打一次零工 +30 🪙 → 够买 12 🪙 的普通药。 - **界面把出路说清楚。** 生病横幅在「买不起药」时会多一行: 「钱不够也没关系 —— 生病照样能出门打工,先赚 12 🪙 买「普通药」」。 买得起时不显示。 ### Changed - **初始金币 60 → 500。** 60 块钱买完最便宜的药就没了,而生病又不能打工, 开局很容易卡死。500 够买任何一期的药,也够交学费。 老存档会**一次性补到 500**(`STATE_VERSION` 4 → 5,按版本号判断,只补一次)。 损坏数据(负数金币)不补,只归零。 ### Added - `awayBlockedReason()` 新增 `weak`;客户端多一条对应文案「太虚弱了,先养好再出门」。 --- ## [0.9.3] — 2026-09-30 ### Fixed - **补上 0.9.2 没修完的那一半:插件自己的运行时标识符。** 0.9.2 修好了 `cordis.patch.yml` 里的 `name`,但客户端模块还是按旧 id 注册的: | 位置 | 之前 | 现在 | |---|---|---| | `client.js` 的 `__ModuleLoader__.load({ id })` | `dsh-pig` | `dsh-piggy` | | `client.js` 的 `exports.name` | `dsh-pig` | `dsh-piggy` | | `index.js` 的 `export const name` | `dsh-pig` | `dsh-piggy` | 客户端的 bundle 清单是按 id 收的,id 和包名对不上,这个插件的 client 就不会被列进去, 组件永远不挂载。(感谢 pi 定位。) - **这些没改,也不该改**: | | 为什么 | |---|---| | HTTP 路由 `/dsh-pig/state`、`/act`、`/art` | 内部契约,改了没有好处 | | 存档目录 `$DSH_HOME/dsh-pig/state.json` | **改了会丢正在养的那只猪** | | CSS 选择器 `[data-dsh-pig]`、`localStorage` 的 `dsh-pig:open` / `:position` | 内部标识;改了会丢掉用户保存的面板位置 | --- ## [0.9.2] — 2026-09-30 ### Fixed - **改名后猪整个消失了。** 包从 `dsh-pig` 改名成 `dsh-piggy` 时,漏改了插件自带的 `cordis.patch.yml`: ```yaml - insert: - id: dsh-pig name: dsh-pig # ← 包已经不叫这个名字了 ``` 宿主那一半**看起来是好的** —— 路由 `/dsh-pig/state` 照常 200,快照也正常, 因为加载器靠 `node_modules` 里残留的旧符号链接仍然解析得到这个目录。 但**客户端那一半被静默丢掉了**:注册时按 `dsh-pig` 去读 `package.json`, 读出来的 `name` 是 `dsh-piggy`,对不上,于是这个插件的 client 根本没有进入 客户端的 bundle 清单 —— 组件永远不挂载,屏幕上就是没有猪。 验证方式是把 `/plugins/??...` 那两个实际发出的 bundle 请求抓下来, 清单里列了 `modlens` / `dshmarket` / `dsh-context` / `dsh-better-sidebar`, **唯独没有 `dsh-pig`**。 修:`name: dsh-piggy`,并清掉 `node_modules/dsh-pig` 那个残留链接。 ### Added - 一条回归测试:**`cordis.patch.yml` 里的 `name` 必须和 `package.json` 的 `name` 完全一致**。 已验证它有效(把名字改回 `dsh-pig` → 那条立刻失败)。 这和 0.8.1 修掉的「写死类名的测试」是同一类问题:**静默失效的引用**。 --- ## [0.9.1] — 2026-09-29 ### Fixed - **测试里的 `readCss()` 一直在读一份残缺的样式表。** 它只认「行首就是引号」的 字面量,而 CSS 数组里有跨行用 `+` 拼接的条目 —— 「摸摸的手」那个 data URI 就横跨七行。于是从它开始,后面所有规则在测试眼里都消失了: ``` 实测:拼出来的 CSS 花括号差 1 个(被截断的 url( 吞掉了后面的规则) ``` 浏览器拿到的是正确拼接的字符串,所以线上一直是好的 —— **但这个测试工具本身的 缺陷意味着它对后半张表的断言全是假的**。现在同时接受行首和 `+` 续行两种字面量。 - 新增一条自检:**拼出来的样式表必须花括号配平**,并且光标 data-URI 必须完整 (以 `` 结尾)。这类截断今后会直接报错,而不是让后面的断言静默失真。 --- ## [0.9.0] — 2026-09-29 ### Changed - **小猪和老年猪换成了照参考图重画的手绘形象。** 之前两版都画错了: 第一版是「暖棕描边 + 正面 Q 版」,第二版虽然改成了侧面平涂,风格仍然对不上。 这一版是直接按参考图拆的: | | 参考图 | |---|---| | 身体 | `#FFD1AF` 蜜桃色,平涂、**零描边** | | 耳朵 | `#E95892` 洋红**圆头弧线**(不是填充三角形) | | 鼻子 | `#FF8195` **有机形状**、微微倾斜,两个深色鼻孔 | | 眼睛 | `#373A32`,刻意画得不规则,不是正圆 | | 尾巴 | `#FFD1AF` 圆头线条卷成的圈 | | 老年猪 | 同一头猪褪色成 `#F1C09D`,耳朵 `#CF6C89`;眼睛变成**两道弧线**(眯着), 外加灰眉毛、皱纹、两撇白胡子和一撮白下巴 | 两张都缩放进 64×64 的正方形视框(原图内容 301×279 → 60×55.6), 这样和 emoji 阶段在同一套 `--pig-size` 下尺寸一致。 - 体型重新对齐:小猪 40px(手绘)、青年猪 48px、中年猪 62px(都是 🐖)、 老年猪 56px(手绘)。 --- ## [0.8.2] — 2026-09-29 ### Changed - **六个阶段全部用 🐖,暂时不画图。** 前面手绘的 `assets/piglet.svg`、 `assets/elder.svg` 虽然结构照抄了 emoji(侧面、无描边、洋红卷耳), 但风格终究对不上,先撤下来,等拿到参考图再重做。现在靠**体型**区分: | 阶段 | 图标 | 大小 | |---|---|---| | 纸盒 | 📦 | 58px | | 小猪 | 🐖 | 38px | | 青年猪 | 🐖 | 48px | | 中年猪 | 🐖 | 62px | | 老年猪 | 🐖 | 54px · **褪色**(`grayscale(.5)` + 透明度) | | 墓碑 | 🪦 | 52px | 老年猪没有画图可用了,改用一个 CSS 滤镜让毛色「淡下去」——`[data-faded="true"]`。 - SVG 文件和 `/dsh-pig/art/` 路由**保留不动**,只是阶段定义里不再有 `art` 字段。 参考图到位后,只要在 `data.js` 里给对应阶段加回 `art: 'xxx'` 就能接上, 客户端和路由已经写好而且有测试覆盖。 --- ## [0.8.1] — 2026-09-29 ### Fixed - **猪闲着的时候身边也挂着 💼 和进度条。** `.dp-work{display:flex}` 的优先级 (`[data-dsh-pig] .dp-work` = 0,2,0)压过 UA 表的 `[hidden]{display:none}`(0,1,0), 所以 `work.hidden = true` 只是个摆设 —— 元素照画不误。补上 `[data-dsh-pig] .dp-work[hidden]{display:none}`,顺手把同样会踩坑的 `.dp-soul` / `.dp-pig-img` / `.dp-pig-emoji` 一起补进那条规则。 - **而且守护这条规则的测试本身是坏的。** 它把类名写死成 `['dp-card','dp-bar','dp-content','dp-hud','dp-bubble']`,我后来加 `.dp-work` 等元素时没同步这个数组,所以**测试一直是绿的**。 现在改成从源码里自动推导:扫出所有 `X.hidden =` 的赋值,再把变量映射回 它创建的 class,逐个断言存在 `[hidden]` 规则。以后再加会隐藏的元素, 不补 CSS 就会立刻报红。 (验证过这条测试真的有效:把 `.dp-work[hidden]` 删掉 → 正好那一条失败; 加回来 → 全绿。) --- ## [0.8.0] — 2026-09-29 ### Changed - **等级换成了年龄。** 猪不再是一条要刷的经验条,而是一段**用天数计的生命**: | 阶段 | 图标 | 大小 | 何时 | |---|---|---|---| | 纸盒 | 📦 | 54px | 一开始 | | 小猪 | 🐖 手绘 | 40px | 拆开纸盒,蹦出来 | | 青年猪 | 🐖 | 50px | 第 1 天 | | 中年猪 | 🐖 | 62px | 第 3 天 | | 老年猪 | 🐖 手绘 | 56px | 第 7 天 | | 墓碑 | 🪦 | 54px | 第 14 天自然老去,或病死 | | 墓碑 + 灵魂 👻 | | | 死后 1 天仍未复活/领养 | **年龄按真实天数走**,所以关掉 DSH 期间猪照样在长大。所有阶段都用同一个 🐖 形象,靠**体型**区分成长 —— 小猪和老年猪另外有手绘的形象。 - **XP 不再决定形态,改喂体重。** 「吃你的真实工作长大」还在,但长的是分量, 不是等级。`经验` 那一行在面板里换成了 `🎂 年龄`。 - **死亡有了后续。** 墓碑立起来之后有两条路:**还魂丹**把它叫回来 (金币、收藏、上过的课都保留),或者**领养新猪**(保留回忆,重新从纸盒开始)。 两条都不选,一天之后墓碑上会多一个 👻。 - 原来的 7 级阶梯(猪蛋 → 野猪王)整体删除。存档里的 `xp` 原样保留, 你的猪按 `bornAt` 的真实年龄重新定位到对应阶段。 ### Added - `assets/piglet.svg` 和 `assets/elder.svg` —— 小猪和老年猪的手绘形象。 由插件自己的 `/dsh-pig/art/.svg` 路由伺服:**图片是仓库里真实的 .svg 文件**, 不是塞进客户端包里的一坨字符串。 - `/dsh-pig/art/` 路由对文件名做了白名单式校验(`^[a-z][a-z0-9-]{0,31}\.svg$`), 请求里的任何东西都不可能走出 `./assets`。 - `tools/` 之外新增的可见行为:`拍一拍` 的空状态文案改成「门口放着一个纸盒,里面窸窸窣窣 📦」, 按钮从「孵一只」改成「拆开纸盒」。 --- ## [0.7.1] — 2026-09-29 ### Fixed - **升级快得离谱。** 实际用量摆出来就很清楚 —— 4.6 小时里: ``` tools 744 次 × 3 = 2232 xp ← 94% 的 XP 全在这里 turns 17 次 × 5 = 85 messages 21 次 × 2 = 42 活动计数:打工 0 · 上课 0 · 旅行 0 ``` 一个下午光靠工具调用就从蛋喂到了「猪皇」,**而游戏内容一次都没用上**。 两个原因叠加:单次工具调用给 3 点太肥,等级表又太浅。 | | 之前 | 现在 | |---|---|---| | 工具调用 / 回合 / 消息 | 3 / 5 / 2 | **1 / 2 / 1** | | 被动 XP 每小时(实测用量) | 513 | **174** | | 猪皇 (Lv5) | 1200 xp | **2200** | | 野猪王 (Lv7) | 8000 xp | **15000** | | **从蛋到野猪王** | **15.6 小时** | **86 小时**(约 3 周日常使用) | - **活动 XP 同步上调,让「玩」成为快车道。** 之前一次 4 小时「上班」只给 320 xp, 还不到同样 4 小时挂机的零头 —— 派猪出门反而亏。现在: | 活动 | 之前 | 现在 | 相当于多少小时被动 | |---|---|---|---| | 打零工 15 分钟 | 12 | 40 | 0.2 | | 搬砖 1 小时 | 60 | 200 | 1.2 | | 上班 4 小时 | 320 | **900** | 5.2 | | 小学 30 分钟 | 20 | 60 | 0.3 | | 大学 2 小时 | 95 | 320 | 1.8 | | 研究生 6 小时 | 340 | **1100** | 6.3 | | 郊游 1 小时 | 22 | 80 | 0.5 | | 名山大川 3 小时 | 75 | 260 | 1.5 | | 看海 8 小时 | 210 | 700 | 4.0 | | 出国 1 天 | 620 | **2000** | 11.5 | 已有的存档不受影响:xp 数值原样保留,2443 在两张表里都落在「猪皇」。 --- ## [0.7.0] — 2026-09-29 ### Added - **外出时有动作了。** 之前猪出去打工/上学/旅行就只是原地站着,现在场景里会多出 它正在用的东西,猪也有各自的姿势: | 活动 | 猪的动画 | 场景里的道具 | |---|---|---| | 💼 打工 | `dp-typing` 打字的那种小幅抖动 | 工作 emoji(💻 上班 / 🧹 打零工 / 🧱 搬砖) | | 📚 学习 | `dp-reading` 慢速歪头,像在看书 | 科目的 emoji(📖 语文 / 🔢 数学 …) | | 🧳 旅行 | `dp-walking` 走路的弹跳 | 目的地的 emoji(🌊 看海 / 🏔 名山 …) | 道具和进度条都放在**猪的左边**并且场景向左扩,所以**猪自己一个像素都不动**。 进度条按快照里的 `activity.progress` 走。 ### Fixed - **吃饭不再让猪变脏。** `careEffects()` 里写的是 `cleanliness: item.cleanliness ?? spec.cleanliness` —— 苹果没有声明 `cleanliness`, 于是**回退到了「喂食」这个动作的基线 -6**。吃个苹果掉 6 点清洁,就是这么来的。 现在喂食的基线是 0,只有真正会弄脏的食物(奶油蛋糕 −8、大碗拉面 −6、肉骨头 −4) 才扣,而且幅度减半。 - **数值整体重新平衡。** 活动时长从分钟改成小时后,原来的数值是**双重扣减**: 既按 1.8× 的「在外消耗」走衰减,又扣一次为分钟时代写好的固定消耗 (「上班」原写着 饱食 −78、清洁 −90)。现在: | | 之前 | 现在 | |---|---|---| | 饱食/心情/清洁衰减 | 0.14 / 0.09 / 0.11 每分钟 | **0.08 / 0.06 / 0.07** | | 在外倍数 | 1.8× | **1.4×** | | 上班 4 小时净消耗 | 饱食 −138 · 清洁 −137(直接归零) | **饱食 −61 · 清洁 −50** | | 出国 1 天 | 三项全 0 **且生病** | **15 / 15 / 15,不生病** | 还有一条规则:**活动的消耗不能让任何一条归零**(下限 15)—— 猪从一日游回来应该是「饿惨了」,等着你喂它,而不是你还没反应过来它就躺平了。 - **在外不会生病。** 原来 `decay()` 先结算活动(`activity` 变 null)再做疾病判定, 所以「在外不生病」的判断根本没生效 —— 出去玩一天回来必定生病。 现在先捕获 away 标记再结算。 - 挂机 12 小时:饱食 42 · 清洁 50 · 心情 57,**不生病**。 --- ## [0.6.1] — 2026-09-29 ### Added - **商店从 12 件扩到 21 件**,并按货架分组(🍎食物 6 · 🧼洗浴 5 · 🪀玩具 5 · 💊药品 4 · ✨复活 1)。 平铺 21 件会变成一条长龙,所以每一档加了小标题。 - **缺货时猪会自己说话**,不再是一句含糊的「这个操作没成」: | 情况 | 猪说 | |---|---| | 没有食物 | 「没有吃的啦,快去买一点 🍎」 | | 没有洗浴用品 | 「没有洗浴用品了,去买点吧 🧼」 | | 没有玩具 | 「没有玩具了,去商店看看 🪀」 | ### Changed - **说话气泡浮在猪的头顶正上方**,尾巴朝下指着猪。之前为了躲开心形我把气泡放到了 猪的左侧 —— 那个取舍做反了:**该让心形避让气泡,不是把气泡赶到一边去**。 现在心形 `z-index:1` 从后面升起、气泡 `z-index:2` 在上面; 气泡靠右边缘对齐,再长的台词也不顶出窗口。 --- ## [0.6.0] — 2026-09-29 ### Changed - **喂食 / 洗澡 / 玩耍都要花道具了**,照 QQ 宠物原版的设计。它的 `StoreInventory` 把背包分成 **`food` / `commodity` / `medicine` / `background`** 四类, 而它自己的治病流程就是「在背包找对应的药 → 用掉 → 恢复健康」—— 喂食、洗澡、玩耍是同一套逻辑。现在: - 点「喂食 / 洗澡 / 玩耍」**弹出背包**,告诉你有什么、还剩几个、每样加多少 - 用了就消耗一个;点「算了」不消耗 - **自带一个免费小皮球**,所以玩具一件都没有时「玩耍」照样能用(且永不消耗) - 没有任何食物/洗浴用品时,动作会被明确拒绝(`no-item`),不是静默失败 - **商店按货架重组**:🍎食物(苹果/肉骨头/奶油蛋糕)· 🧼洗浴(香皂/沐浴露/泡泡浴) · 🪀玩具(悠悠球/布偶/旋转木马)· 💊药品四级 · ✨还魂丹。 - **工作/学习/旅行改成真正的时间投入**(原版就是按小时计的): | | 时长 | 代价 | |---|---|---| | 🧹 打零工 | 15 分钟 | → 30 🪙 | | 🧱 搬砖 | 1 小时 | → 160 🪙 | | 💼 上班 | 4 小时 | → 900 🪙 | | 📚 小学 | 30 分钟 | 学费 40 🪙 | | 📚 大学 | 2 小时 | 学费 220 🪙 | | 📚 研究生 | 6 小时 | 学费 900 🪙 | | 🏞 郊游 | 1 小时 | 60 🪙 | | 🏔 名山大川 | 3 小时 | 200 🪙 | | 🌊 看海 | 8 小时 | 620 🪙 | | 🌍 出国 | 1 天 | 2000 🪙 | - **学校是阶梯,不是菜单。** QQ 宠物所有宠物都从小学起步,所以 **大学要先把小学九门课各上一次**(9 节),**研究生要先念完大学九门课**。 锁住的学段按钮仍然**可以点**,点进去会告诉你还差多少(`🔒 要先念完小学九门课各上一次(3/9)`), 只是里面的课点不了。老存档的课时会算作小学课时,不会被锁在门外。 ### Fixed - **左键猪现在是「摸摸的手」光标**(内联 SVG,不用素材),不再是一个箭头。 - **心形飘在猪头顶正上方**:原来用的是场景的固定坐标,场景展开后有面板那么宽, 粒子就全飘到猪旁边去了。现在锚定到猪本身。 - **收起状态下也能看到说话气泡**:气泡其实一直显示着,但它和猪重叠、 而猪在 DOM 里排在后面把气泡盖住了。现在收起时气泡浮在猪的**头顶正上方**, 尾巴朝下指着猪(`z-index:2`),心形从后面升起(`z-index:1`)。 靠右边缘对齐,所以再长的台词也不会顶出窗口。 ### Added - `careView()` / `studyView()` —— 面板需要的「能用什么道具」「哪一学段解锁了」。 - 预览台补上道具货架、学段门槛和长时间活动。 --- ## [0.5.0] — 2026-09-29 ### Changed - **右键猪才出菜单,左键变成摸摸。** 原来左键切换面板,随手一点就会开关。 现在 `contextmenu` 负责开关(`preventDefault` 掉浏览器原生菜单),左键只让猪 做个被摸摸的反应。右键不好发现,所以给场景加了原生 tooltip: 「左键摸摸 · 右键打开面板 · 拖动可移动」。 - **面板不再把猪挤走,也不再超出页面。** 关键改动是让面板**脱离文档流** (`position:absolute`)—— 之前在流内时它会撑大外层容器,而外层一变宽,猪就跟着移。 现在外层容器的尺寸完全由猪决定,`fitPanel()` 负责把面板放到: - **空间更大的一侧**:上方不够就翻到猪的下方(猪被拖到窗口顶部时) - **水平方向**:面板比猪宽,靠左停放时会顶出左边,用负 `right` 平移回来 - **高度按可用空间算**,每个标签页渲染后重算一次 实测五个停靠位置(四角 + 正下):**猪移动量全部为 0**,猪 / HUD / 面板全部完整可见。 ### Fixed - **猪能放到对话框旁边了。** 之前有一段 `keepClearOfComposer()`:它会**强制**把猪顶到 输入框上方(`host.style.bottom = Math.max(userBottom, floor)`),所以你没法把它停在 输入框旁边。那段夹紧是当年为了绕开"猪盖住发送按钮吃掉点击"而加的 —— 但 `pointer-events` 已经正确解决了那个问题(只有猪实际绘制的像素接收点击), 于是它只剩下副作用。现在只保留"别跑出窗口"这一条。 - 猪的水平夹紧要算上场景的左右内边距(`PIG_PADDING_X`),否则它会以 2px 探出屏幕。 - **`top` 和 `bottom` 必须显式写 `auto`**:用 `''` 清除会回退到样式表里的那条, 两边同时生效,绝对定位的盒子被压成 **4px 高**。 - 垂直夹紧始终按**展开时**的场景高度预留,否则猪停得靠上时,一展开面板就会把 HUD 顶出屏幕。 - 展开时场景宽度等于面板宽度,HUD 和气泡才有地方待(外层变宽不影响猪,它靠右对齐)。 ### Added - 预览台新增 `pigStub.pet()` / `pigStub.dragBy(dx, dy)`,右键、点击、拖拽都能在 真实浏览器里复现。 - 假 DOM 补上 `getBoundingClientRect` 和窗口几何 —— 缺了几何时 `clampPig()` 会抛异常, 而 `apply()` 把它兜住,表现为"猪根本没挂上"。 --- ## [0.4.0] — 2026-09-29 ### Changed - **整套视觉换成动森风格**,依据 [guokaigdg/animal-island-ui](https://github.com/guokaigdg/animal-island-ui) 的 `docs/design-system`(`design-tokens.md` + 独立复刻用的 `css-variables.md`)。 设计 token 声明在组件根节点上而**不是 `:root`**:宿主的自定义属性既不该被污染, 也不该能覆盖这里。 | 从 | 到 | |---|---| | 深色导航蓝面板 `rgba(22,26,35,.95)` | **奶油羊皮纸** `#f8f8f0` + 2px 暖棕边框 `#e5dcc6` | | 白色文字 | **暖棕** `#794f27` / `#725d42` / `#9f927d`(规范禁止纯黑与冷灰) | | 15px 圆角 | **20px**(卡片),按钮与输入框一律 **50px 药丸** | | 青色 `#7ED0A0` 属性条 | 动森配色:饱食 `#f7cd67` · 心情 `#f8a6b2` · 清洁 `#82d5bb` · 健康 `#8ac68a`,轨道带内阴影 | | 通用按钮 | **次要按钮** = 奶油药丸 + 2px 边框 + 柔和浮起;**主按钮** = 青色药丸 + `0 3px 0` **游戏 3D 底边** | | 深色高亮 | 侧边栏 token `#b7c6e5` 做选中态、`#d6dff0` 做悬停 | | 系统字体 | **Nunito + Noto Sans SC**(按规范的独立复刻配方从 Google Fonts 加载,`display=swap`,失败则退回系统字体) | 还照规范的硬规则调整了:卡片**用边框而不是投影**表达层次、悬停 `translateY(-1px)`、 按下 `translateY(2px)`、过渡统一 `cubic-bezier(.4,0,.2,1)` 且时长 0.15–0.35s、 焦点环用青/黄而非蓝色、所有阴影都用暖色 `rgba(61,52,40,·)` 而不是冷黑。 ### Fixed - **重写 CSS 时弄丢了 `pointer-events:none`**,会让组件的透明区域挡住页面点击 —— 这个症状历史上表现为"发消息没反应",而整条链路其实是健康的。 **测试当场抓到了它。** - **面板限高补 10px 顶部余量**:内容长的标签页原来紧贴窗口上边缘。 ### Added - **测试里的 `readCss()`**:把 bundle 里拼接出来的样式表重新组装成浏览器实际拿到的 字符串再做静态断言。原来直接对源码跑正则,**跨字符串字面量的规则看起来就像不存在** —— 一条正确的 `pointer-events` 规则因此被误判为缺失,而注释里的撇号 ("the UA sheet**'**s")还会进一步骗过天真的引号扫描。 --- ## [0.3.2] — 2026-09-29 ### Fixed - **猪不再吞掉“发送消息”的点击。** 宿主把输入框和发送按钮也停在右下角,而猪在 `right:18px/bottom:18px`,两者重叠(实测视口 780×493:发送按钮 `x715-749 y421-455` 完全落在猪的盒子 `x686-756 y294-351` 的覆盖范围内)且 `z-index:2147483000`、 `pointer-events` 默认 —— `document.elementFromPoint(按钮中心)` 返回的是 `DIV.dp-pig`,点发送等于点猪:消息从未发到服务器,表面上却像“模型不回复”。 - 外层容器改为 `pointer-events:none`,只有猪本体和面板本身(`[data-dsh-pig]>*`) 接收点击,容器空白区域不再拦截下层 UI。 - 新增 `keepClearOfComposer()`:输入框贴底时把猪抬到输入框上方(`bottom` 取 `用户位置` 与 `视口高 − 输入框顶 + 10` 的较大值),空状态居中输入框时不动它; 挂载、`refresh()` 轮询与窗口 resize 都会重算。拖拽时仍可自由移动,松手后会 自动避让 —— **可以拖到输入框上,但不能停在那里**。 - 注释里记录这两个坑:`window.addEventListener?.()` 用可选调用,否则精简测试 环境的 `window` stub 会让整个挂载失败。 ### Tests - 新增回归测试 1 条(`the widget lets clicks through and keeps clear of the composer`), 静态校验上述 CSS 与避让逻辑;`node --test` 105/105 通过。 --- ## [0.3.1] — 2026-09-29 ### Changed - **猪不再被面板挤走,也不再被面板衬着。** 之前猪是面板里的第一个元素,展开时 它被顶到一张 452px 高卡片的顶端 —— 窗口不够高时直接飞出屏幕上边缘 (400px 窗口实测:`top: -24`,只剩两只脚)。现在猪是面板的**兄弟节点**而不是子节点: ``` host [ data-dsh-pig ] ← 固定在右下角 ├── .dp-card 面板:内容 + 六图标(收起时整体 hidden) └── .dp-scene 猪,永远在底部 ``` 面板只能向上生长,猪的像素位置在两种状态下**完全相同**(实测 400 / 720 / 320px 窗口下 `movedX = movedY = 0`),而且展开时猪也是全透明的 —— 不再是深色卡片上的一只猪。 - **猪的背景透明**。收起态原来的深色圆角胶囊(`background:rgba(22,26,35,.9)` + 边框 + 投影)全部去掉,只剩 emoji 本身加一层柔和投影。 - **HUD 改成浅色胶囊**。名字/金币/健康原来是为深色卡片配的浅灰字,猪搬到面板外之后 裸在页面背景上几乎看不见。 - **面板限高** `max-height: calc(100vh - 26px - var(--scene-open))`(26 = 18 底部内缩 + 8 间距), 内容区加 `flex:1 1 auto; min-height:0`,短窗口下面板和内容都不会被切。 - **尺寸参数化**。猪的大小、它脚下的留白、场景高度、面板限高原本是四组写死的数字, 现在统一由 `--pig-size` / `--pig-gap-below` / `--scene-open` 三个变量推导 —— 改一个数不会再让别处对不上。 - **猪放大到 56px**(原 38px,包围盒 47×38 → 70×56)。场景高度自动跟着变成 68/132。 - 形变动画去掉 `translateX(-50%)` 居中偏移(猪现在是普通 flex 子元素)。 ### Fixed - **收起状态依然显示图标栏和 HUD**。`hidden` 属性只对没有自有 `display` 的元素有效, 而 `.dp-bar{display:grid}` 和 `.dp-hud{display:flex}` 与 UA 样式表的 `[hidden]{display:none}` **同权重**(都是 0,1,0),我的样式表在后面 → 我的赢。 结果:JS 里 `bar.hidden = true` 是对的,浏览器里图标栏照画不误, 和收起状态的深色猪胶囊叠在一起。 加了显式的 `[data-dsh-pig] .dp-x[hidden]{display:none}` 规则。 **教训:`el.hidden === true` 的断言证明不了元素不可见** —— 103 个测试全绿, 而真实浏览器里它是坏的。已补一条静态守卫测试,并新增真实浏览器预览台。 - **web 路由永远不注册**。原代码在 `apply()` 时裸调 `ctx.get('webServer')`, 拿到 undefined 就被守卫静默跳过。profile 激活时该服务尚未挂上, 所以 `/dsh-pig/state` 和 `/dsh-pig/act` 一直 404 —— 而插件自己报告激活成功。 改用 `ctx.inject(['webServer'], …)` 等待服务就绪(DSH 的 `client/connection` 与 `client/modules` 就是这么做)。 ### Added - **`tools/preview.html`** —— 在真实浏览器里渲染客户端半边的预览台: 伪造 `__ModuleLoader__` 和 `fetch`,喂一份快照给 `client.js`, 不连真实 DSH 就能看收起/展开两种状态和全部六个页签。 这次的两个 UI bug 都是靠它才看见的。 --- ## [0.3.0] — 2026-09-29 ### Added - **六个图标的面板**,照 QQ 宠物原版布局重做:宠物在上,奶油色图标栏在下, 内容区在图标栏之下。点图标切换,点了就展开,不用敲命令。 - `状态` · `学习` · `打工` · `商店` · `旅行` · `背包` - **学习系统**(QQ 宠物 9 门课 × 3 学段):语文/数学/政治 → 智力, 美术/音乐/礼仪 → 魅力,体育/武术/劳动 → 武力。上课先交学费, 到点后涨属性、记课时。三学段:小学(2 分钟 / 10 金币 / +1)、 大学(6 分钟 / 45 / +2)、研究生(15 分钟 / 130 / +4)。 - **旅行系统**:郊游 / 名山大川 / 看海 / 出国,出发扣钱,回来 带回**纪念品**进收藏册(每趟目的地有 3 种纪念品,轮换发放以保证都能收集到)。 - **智魅武三维**(QQ 宠物 `PetInfo.intel/charm/strong`)。 - **纪念品收藏册**。 - **属性条带标签**(照原版「宠物档案」:饱食/心情/清洁/健康 各一条带名字的横条)。 - **`normalize()` 视图模型层**:客户端收到的任何字段缺失都填默认值, 不再可能显示 `undefined`。 - **版本错配提示**:宿主是旧版时,面板顶部明确写出"重启 dsh 之后才会出现", 而不是默默留空。 ### Changed - **`work` 记录统一为 `activity`**:打工 / 学习 / 旅行同构(`kind` + `key` + `endsAt`), "猪在不在家"从此只有一个判断来源,`decay()` 也只有一个结账点。 - 状态字段 `canWork` / `workBlocked` → `canGoOut` / `awayBlocked`。 - 拒绝原因 `working` → `away`(涵盖三种外出)。 - 开局金币 20 → **60**(够上一次小学课)。 - 存档版本 **3 → 4**,v3 的 `work` 记录会自动升格为 `activity`。 ### Fixed - **未孵蛋时面板崩溃**:`renderContent()` 在 `pig === null` 时仍然读了 `view.pig.illness`,抛 `TypeError`。所有告警块现在都以 `pig !== null` 守卫。 - **死亡时客户端不禁用按钮**:客户端原先只信宿主给的 `ready` 标志, 现在自己也检查 `view.dead`(纵深防御)。 - **还魂丹没有 `kind` 字段**,在背包里被显示成"食物/洗浴"。 - **去掉装饰性背景**:天空草地渐变、云、草全删了 —— 猪不需要背景。 --- ## [0.2.0] — 2026-09-29 ### Added - **打工系统**:打零工(1 分钟 / 12 金币)、搬砖(3 分钟 / 42)、 上班(10 分钟 / 150)。外出期间不能喂食洗澡(可以摸摸),消耗加倍, 可以召回但没钱。 - **疾病链**(照 QQ 宠物 v1.2.4 逆向):三条链各四期 - 感冒 → 发烧 → 重感冒 → 肺炎 - 咳嗽 → 支气管炎 → 哮喘 → 肺结核 - 肚子胀 → 胃炎 → 胃溃疡 → 胃癌 - **健康值 5 点**(原版尺度),每期疾病扣一点,归零即死亡。 - **对症下药**:四档药品,必须匹配当前病期,吃错无效也不消耗。 - **死亡与复活**:等级、经验、金币、收藏全部保留,还魂丹(150 金币)救回。 - **金币经济 + 商店 + 背包**(9 种商品)。 - **清洁度**:会随时间衰减,低于阈值触发"该洗澡了"。 - 心情新增 `sick` / `working` / `dead` 三态。 ### Changed - 存档版本 **2 → 3**;v1/v2 存档自动补上清洁度、健康、金币、背包。 - 被动事件与主动动作彻底分开:`feed()` 只吃被动事件,用户动作走新的 `act()`。 ### Fixed - **拒绝操作谎报成功**:`{ ...result, ...snapshot(store) }` 里 snapshot 的 `ok: true` 覆盖了操作结果的 `ok: false`,导致冷却中/打工中的操作返回成功。 改为快照在前、判定在后。 - **动作接口响应漏了 `actions` 字段**,点完按钮冷却状态不刷新(按钮不变灰)。 - **没孵蛋时按钮点了没反应** —— 面板里加了「🥚 孵一只」按钮, 从此从装到养一次键盘都不用碰。 - 按钮回调依赖 `this.getAttribute()`,改用闭包捕获(`this` 绑定被包装就废)。 --- ## [0.1.0] — 2026-09-29 ### Added - 第一版:`/pig` 斜杠命令 + 右下角悬浮猪。 - 照顾动作:喂食 / 洗澡 / 玩耍 / 摸摸(各自独立冷却)。 - 成长阶梯 7 级(猪蛋 → 野猪王),经验来自真实工作 (完成回合 +5 · 发消息 +2 · 工具调用 +3 · 报错也长肉)。 - 体重系统(1.2 kg 起步,吃一口涨一点)。 - 心情系统(饿 / 困 / 开心 / 孤单,按真实时间衰减)。 - 原子写存档 + 1.5 秒节流。 - 客户端动画与粒子特效;`apply()` 全程 try/catch,激活期绝不抛异常。 ### Fixed - **`/pig hatch` 之后仍是「猪蛋」** —— 蛋壳都裂开了还显示是蛋。 新增 `hatchEgg()`,孵出来直接是 Lv.2 小猪崽,并补了回归测试。 --- ## 版本对照:DSH 运行时 | dsh-pig | DSH 运行时 | 说明 | |---|---|---| | 0.3.0 | 0.2.0-rc.1 | 当前 | | 0.2.0 | 0.2.0-rc.1 | | | 0.1.0 | 0.2.0-rc.1 | | ## 存档版本 | 存档 | 引入版本 | 迁移 | |---|---|---| | v1 | 0.1.0 | 无清洁度 / 健康 / 金币 / 背包 | | v2 | 0.1.0 中期 | 加清洁度、冷却 | | v3 | 0.2.0 | 加健康、金币、背包、疾病 | | v4 | 0.3.0 | `work` → `activity`,加智魅武、课时、纪念品 | 每次迁移都有测试覆盖,不会丢数据(等级、经验、金币、收藏都保留)。