我觉得原版玩的不爽我就自己DIY!系列说明上一篇讲了技术选型和一个核心架构决定这一篇讲数据。 具体说是讲我做第二个宠物包时怎么被三份参考资料轮流坑最后又是怎么爬出来的。全程没有美化翻车的地方也照写。 本系列第 1 篇 · 技术选型与引擎架构 边玩边读 Super Auto Pets · 单机版纯网页版点开就能玩——不用下载、不用注册、不用登录。一、为什么非要加第二个包第一篇里第一版只有 31 只宠物用的是官方的基础包俗称龟包61 只。做完之后我发现一个问题这个游戏的乐趣全在宠物之间的组合上而 61 只的组合空间是有限的。官方也是这么想的——他们后来出了第二个包叫Star Pack星包。所以我决定把星包也做进来。我打算按 tier 一轮一轮往里录计划是这样轮次内容第 1 轮Tier 19 只第 2 轮Tier 211 只 一个新道具第 3 轮Tier 311 只…………第 6 轮Tier 613 只六个 tier 全部录完这几轮加起来是 65 只而不是最终的 76—— 后面我还补录了好几轮。为什么会有这个差额正是这篇要讲的事。当时我以为这是个体力活照着资料抄数据抄完就完事。结果我错了而且错得很典型。我最想搞清楚、却怎么都搞不清楚的问题就一个星包到底有多少只这件事的答案我直到很久以后才真的拿到。二、三份参考资料三份都对不上我手上能查的资料来源有三个。它们互相矛盾。来源 Afandom 上的 wiki星包词条只列了61 项。61 —— 巧了正好和龟包的数量一样。更离谱的是它把剑龙重复列了两次。我当时就觉得不对劲但还是先照着录了。来源 B一个第三方宠物数据站数据量很大582 只看起来挺全。但它的所属包这一列大量是空的——582 只里只有 190 只有包名。来源 C我自己仓库里留的一份参考实现是一份 Rust 写的开源实现数据很规整。但它有个让我很困惑的地方// 看起来像是「名字和技能对不上」 PetName::Pillbug /* ... 商店升级时给身后 2 只 1 生命 ... */鼠妇Pillbug的技能怎么会是商店升级三个来源三个说法。我当时的第一反应是多查几个总能对上于是我开始了效率极低的逐个数据点查证——查一只、录一只、有疑问就再搜一遍。这个做法让我在坑里待了很久。三、踩得最深的一只宠物鼠妇鼠妇Pillbug是我被坑得最惨的一只。事情的经过是这样的我照着一份旧资料做出来的版本项目我当时写的所属包星包Tier1数值2 / 2技能商店升级时 → 身后最近的 2 只友方 1 生命官方真实的样子项目实际上所属包龟包Tier1数值2 /3技能出售 → 库存 N 个免费安眠药完全不搭边。那商店升级 → 身后 2 只 1 生命这个技能去哪了答案是它被给了一只全新的宠物——长臂猿Gibbon星包 Tier 1数值1/2。所以我不仅把鼠妇做错了还因为把旧技能安在旧名字上同时漏掉了一只新宠物、又给一只新宠物配错了数值。当时我的图鉴里长臂猿那张卡是这样的当时的图鉴星包 Tier 1 刚录完全包一共 70 只。注意「长臂猿」那张卡写着2/2技能是「商店升级时给身后最近的 2 只友方 1 生命」—— 这就是我照着旧资料做出来的错误版本。官方其实是1/2一只宠物错了会连带三处都错。这就是数据源不可靠的代价。四、我犯的第二个错把「缺数据」当成「数据」如果说上面的错是资料坑我那下面这个纯粹是我自己蠢。发现鼠妇对不上之后我去查来源 B那个第三方数据站想确认它到底属于哪个包。它的所属包那一列……是空的。我的处理是既然没标包那大概就是基础包吧—— 于是我把鼠妇从星包挪到了龟包。这个推理是错的。空值不是没有包空值是不确定。然后基于这个假信息改了一次代码。过了一轮我才发现真相又把它挪回去。这条教训我写进了自己的检查清单缺失值不是值。当一列数据大面积是空的这一列就不能参与任何判断 —— 它只能告诉你这个来源不可用不能告诉你任何关于世界的事实。五、转折点先找到分母真正让我爬出坑的不是又查了多少只宠物而是一次思路转变。我当时在维护一个进度数字星包做了多少只 / 一共多少只。但我一直不敢写这个分数因为分母定不下来来源 A 说 61 项还重复列了剑龙实际更少来源 B 包名不全没法统计我也不知道官方到底出没出过第三批于是我的进度记录一直是已实现 N 只这种没有分母的写法。后来我意识到这本身就是个信号。当你连分母都确定不了的时候说明你的数据源有问题而不是你的统计方法有问题。一个连总数都给不准的来源你凭什么相信它给的单条数据是对的所以我把方向从查更多宠物改成了先找一个能定下分母的来源。然后我找到了一份官方的数据转储364 只宠物每一只都带pack字段。Turtle Pack 61 Unicorn Pack 86 Golden Pack 63 Star Pack 76 ← 就是它 Puppy Pack 56 Weekly Pack 22Turtle 61 Star 76—— 和目标里的 76 完全吻合。而且注意一件事61 这个数字本身就是一次交叉验证。因为龟包我早就做完并且核对过了就是第一篇里那 61 只。现在一份全新的、独立的来源在同一份文件里同时也说龟包是 61—— 两个数据点互相印证这个来源的可信度一下就上来了。选包界面。注意底部那行小字「龟包 61 只 星包 67 只」—— 龟包的 61 是对的星包的67 是错的真相是 76。这张图正好留下了当时分母定不下来的样子六、根因是版本变更不是我抄错了有了权威来源我做的第一件事不是改数据而是问一句为什么为什么 fandom 会只列 61 项为什么旧资料里的鼠妇是那个技能答案很干脆官方重做过整个星包。在某个大版本更新里v0.34官方把 Star Pack 整个重做了一遍——删了一批、加了新的一批、还改了不少老宠物的技能归属。这一下所有矛盾全都解释通了之前的困惑真相fandom 只列 61 项那是重做前的名单鼠妇技能对不上那个技能被移交给长臂猿了参考实现里名字和技能错位它没写错它只是旧版本根因是版本不是错误。这个区别极其重要因为它决定了你该怎么做如果是数据错那就逐个核对、逐个修如果是版本旧那就换来源然后整批对齐我一开始在做的是前者。而我真正该做的是后者。顺手还找到了当前官方的 wiki——superautopets.wiki.gg2026 年还在更新。原来 fandom 那个是旧站我以为它是官方其实它不是。七、一次漂亮的交叉验证和一个差点误判的地方差点误判这是「错位」还是「旧版」回到来源 C那份 Rust 参考实现。PetName::Pillbug挂着长臂猿的技能——如果只看这一处它完全像是名字和技能错位的经典 bug。按常理我顺手帮它修一下是很自然的反应。但幸好我没修。因为在知道官方重做过星包之后这个现象有了完全不同的解释它不是在旧名字上挂了新技能。 它是在旧名字上挂着旧技能—— 那份实现记录的是重做之前的世界。这两者的区别是致命的如果我当时顺手修了我会把一个忠实的历史记录改成错的而且还会以为自己修了个 bug。教训看到对不上先别急着当成 bug。先问一句会不会我手上这份是旧版在数据类项目里修 bug和改错误的依据经常长得一模一样。那一次漂亮的验证确认鼠妇属于星包之后我把它从龟包改回星包。改完我顺手跑了一下计数——龟包正好回到了 61。这个验证非常漂亮因为它是独立的我不是在检查鼠妇对不对那正是我搞错的地方我是在检查改完之后另一个我确定无误的数字还对不对龟包 61这个数字来自一份独立来源而且和鼠妇这件事毫无关系。它同时对上了说明我的修正大概率是对的。这比再查一遍鼠妇有用得多——因为再查一遍我可能又查回那份旧资料。八、顺带查出来的一个真 bug两只「鸽子」、两只「老鼠」这轮查资料还有个意外收获。在逐个核对中文名的时候我发现出现了两组重名英文名中文名当时问题Pigeon龟包鸽子撞了Dove星包鸽子撞了Rat龟包老鼠撞了Mouse星包老鼠撞了游戏里同时存在两只叫鸽子和两只叫老鼠的宠物——玩的时候根本分不清哪个是哪个。这个 bug 不是数据错而是包与包之间没有做过一致性检查我做完龟包的中文名又做星包的中文名两次都很用心但从头到尾没人看它们放在一起是什么样。修法很简单Dove 改成斑鸠、Mouse 改成小鼠但我顺手加了一条专门查重名的测试。这条经验后来一直在用每加一个新包就自动检查和已有内容有没有冲突。跨模块的重名、重 ID、重复图标 —— 这类问题肉眼几乎发现不了但一条断言就能拦住。九、小结一套可复用的「查资料」方法这一轮下来我总结出了四条后来做别的东西也一直在用1. 数据源要分级别混着用可信度来源类型这次的具体情况✅官方原始数据364 只带pack字段的转储分母一下就定了✅当前的官方文档站wiki.gg注意不是所有挂着这个游戏名的站都是官方⚠️第三方整理站数据量大但缺列严重只能当参考❌不确认时效的旧 wiki只列 61 项、还重复列了一次2. 用总数当校验和61和76这两个数字帮我省了无数时间。一个来源如果在总数上就是错的它的单条数据不值得信。反过来如果一个来源能在总数上和一个独立来源对上它的可信度立刻就不一样了。3. 先找根因再改数据对不上有两种可能数据错或者版本旧。我一开始默认是前者于是陷入了逐个核对的泥潭。正确做法是先用一句话解释清楚为什么会不一样再决定怎么修。这次那句话是官方重做过整个星包——说出口的瞬间所有矛盾就都通了。4. 让数量对得上替你验证修完鼠妇之后龟包正好回到 61。这是一次和问题本身无关的独立验证比反复检查自己有没有改对可靠得多。一句话版本别在不可靠的来源上做精确的工作。我花在逐个核对上的时间本来应该花在找到那个能定下分母的来源上。下一篇写什么《同一个功能我写了三遍》这一篇讲的是重复实现这个坑——同一个 bug在三个模式里各存在一份同一张 emoji 对照表维护了两份同一个商品价格算了两遍。以及我是怎么发现它们、又是怎么防止它再发生的。⬅️ 上一篇第 1 篇 · 技术选型与引擎架构在线版还在持续迭代中——你点进去玩到的可能比我写这篇时又新了一些。如果发现哪里和文章对不上多半是我后来改了。