ClashClock 的工作原理
ClashClock 是一款部落冲突(Clash of Clans)升级追踪器和规划器,由一个人开发和运营。本指南解释从你粘贴村庄导出数据到看到计划之间发生了什么:用了哪些数字、它们如何核对,规划器每一步怎么决定,以及哪些部分是假设而不是事实。
本页内容
ClashClock 是什么,不是什么
ClashClock 把你的部落冲突升级计时器集中在一处,告诉你建筑工人什么时候空闲,并围绕你没法玩游戏的时间,规划你接下来的升级。它是一个在浏览器里运行的网页应用。它由我开发、由我运营,游戏数据也由我自己维护。
它没有连接到你的游戏。它从不接触你的 Supercell ID 或密码,也无法开始、取消或加速任何升级。它对你村庄的了解,全部来自你粘贴的文本、你输入的数字,或官方游戏 API 根据玩家标签返回的公开信息。每项升级都由你自己在游戏里开始。ClashClock 是一个非官方的粉丝项目,未获得 Supercell 的认可。
一个数字在显示到你的屏幕上之前,要经过四个部分:
- 游戏数据:每项升级的花费、时间、等级上限和前提条件,来自游戏自己的文件。
- 导入:把你的导出数据(以及可选的官方 API 数据)转换成应用能用来计算的村庄。
- 时间和花费规则:算上黄金令牌、帮手和药水之后,一项升级实际要花多少时间和资源。
- 规划器:哪项升级交给哪个工人,什么时候开始。
这四部分都是不含界面代码的纯 TypeScript,项目约1,600个自动化测试大多是针对它们的。
数字从哪里来
游戏自己的文件
每一项花费、建造时间、等级上限和前提条件,都来自游戏客户端自己从 Supercell 公开资源服务器下载的数据文件:一组组压缩表格,每个游戏版本一组,用一个叫作 fingerprint(指纹)的哈希值来定位。一个构建脚本把它们转换成随应用发布的一个 JSON 文件:约600个实体(建筑、陷阱、城墙、部队、法术、英雄、战宠、装备等)和约5,400行等级数据,每行都有花费、资源类型、时间和所需的大本营等级。
这些文件有一些约定,只有拿它们和游戏对照才能弄清楚。建筑的一行描述的是它建成的那个等级;部队、法术、英雄或战宠的一行,带的是下一级的花费和时间,前提条件却是本级的。英雄、战宠和装备的 ID 不在文件里,而是由所在行的位置推算出来的,这一点我用真实的导出数据核对过。应用五种语言里的名称来自游戏自己的本地化文件;图片来自 wiki。
数字如何核对
有四项检查守护着这些数据。计时器检查和固定数值测试还会在每次推送代码时作为自动化测试运行;data:validate 和 data:audit 是游戏更新上线时我手动运行的脚本,其中 audit 需要联网:
- data:validate 把每个等级和一个根据 wiki 整理的社区数据集对比。两者不一致时,以游戏文件为准。
- data:audit 把数字和一个社区项目从最新客户端提取的表格对比。只要缺少任何实体或等级,或者有任何我解释不了的花费或时间,它就会报错。
- data:timers 把应用可能显示的每一个计时器,和一份单独的参考数据对照;这份参考数据由当前客户端的文件(版本18.600)和独立的表格构建而成。2026年10月5日的审计覆盖了318个实体的3,906条计时记录。没有一项基础时长需要修改;它发现的错误都出在我的计算里(帮手的工作量、黄金令牌预览),这些我已经修好了。
- 固定数值测试记下了重新构建时绝不能丢失的数字,因为从数据本身读取预期值的测试,在数据过时的时候也照样通过。
人工修正,以及“更新后可能有偏差”是什么意思
我用来构建的那组文件是2026年4月的。此后 Supercell 多次修改了游戏,其中包括2026年5月26日、6月16日、8月31日和10月8日,而那些文件对此一无所知。这些差异改由一个叫 overrides.json 的文件承载:目前涉及38个实体,比如更高的英雄等级、新的超级充能等级和8级建筑工人小屋。每条人工修正都注明了来源;如果还有第二个来源,我会用它核对数字;两者不一致时,修正里会写明原因。没有来源的人工修正会在构建时被跳过;如果更新的文件组让某条修正变得多余,构建会发出警告。
所以“游戏刚更新后可能有偏差”指的是很具体的事:在我补上之前,新的等级、建筑或单位可能缺失;被更新改动过的花费也可能仍显示旧值。游戏自己也会露出端倪:官方 API 会报告每个单位的最高等级,所以当游戏里的等级比应用里多时,应用能告诉你。
你的村庄如何导入
导出数据
游戏可以把你的村庄导出为文本。你把它粘贴到 ClashClock,应用在你的设备上读取它;粘贴的文本本身从不上传。其中的玩家标签会被发送出去,用来查询联赛和部落;有账号时,由它生成的村庄会被同步。详情见下文“存储了什么、发送了什么、发往哪里”。如何导出。
{ "tag": "#…", "timestamp": 1788969427,
"buildings": [
{ "data": 1000008, "lvl": 9, "cnt": 4 }, 四门9级加农炮,空闲
{ "data": 1000021, "lvl": 12, "timer": 86400 }, 一座12级十字连弩,还剩86,400秒
…
],
"helpers": [ { "data": 93000000, "lvl": 8, "helper_cooldown": 49617 } ],
"buildings2": [ … ] 建筑大师基地
}- 带计时器(timer)却没有数量(cnt)的一行,代表正在升级的单独一个。它的完成时间是导出的时间戳加上计时器,ClashClock 保存的就是这个绝对时刻,所以倒计时会一直走下去。带数量的一行代表相应数量的空闲项目。城墙按等级计数;名称以2结尾的部分属于建筑大师基地。
- 游戏数据里没有的 ID,或比该等级已知建造时间还长的计时器,会被保留并报告,而不是丢弃。我就是靠这个发现自己的数据或我对导出数据的解读哪里出了错。
有两件事导出数据没有直接写明:
- 超级充能。建筑保持常规的最高等级,另有一个字段记录已完成的超级充能级数。第一级充能进行时,这个字段的值是0,所以这一行上的计时器属于下一级。
- 改装。带改装标记和计时器的防御设施行,表示建筑大师正在改装它。我的第一个版本把它当成了升级,显示一门加农炮正在从7级升到8级、计时两天,而那一级其实只要三小时。
哪些数据来自哪里
| 内容 | 导出数据 | 官方 API | 你告诉 ClashClock |
|---|---|---|---|
| 建筑、陷阱和城墙等级 | 有 | 无 | — |
| 进行中的升级计时器 | 有,截至导出时 | 无 | 修正后的剩余时间 |
| 英雄、部队、法术、攻城机器、战宠、大本营等级 | 有,截至导出时 | 有,实时(需账号) | — |
| 英雄装备 | 全部装备;未获得的看起来是1级 | 仅已拥有的装备 | — |
| 建筑工人数量 | 根据小屋、哨站和棚屋计算 | 无 | 建筑大师基地的博仔(如果是导出后才买的) |
| 帮手等级和冷却时间 | 有 | 无 | 你使用帮手的时候 |
| 玩家名字、联赛、部落 | 仅玩家标签 | 有 | — |
| 黄金令牌、药水、零食、书、锤 | 无 | 无 | 是 |
| 库存的资源和宝石 | 无 | 无 | 可选的“库存”和“刷资源”数据 |
| 离线时段、活动、目标 | 无 | 无 | 是 |
再次导出时会发生什么
再次导入时,应用会先列出有哪些变化,然后才应用任何改动。等级、数量和进行中的升级以导出数据为准,所以你手动设置、而导出数据里没有的计时器会被丢弃并报告。提醒开关、升级的初始时长、哥布林标记、你手动开启的帮手和你添加的建筑工人都会保留。你的计划也会保留:已完成或进行中的步骤会从中移除;如果导入后某座建筑的等级低于计划里的下一级,中间缺的等级会重新排到前面,因为8级永远不可能排在7级之前。
官方 API 补充了什么
API 知道每位英雄、每种部队、法术、战宠和已拥有的装备,大本营和建筑大师大本营的等级,以及你的名字、联赛和部落。它对建筑、城墙、帮手或进行中的计时器一无所知,所以无法取代导出数据;它的作用是在两次导出之间让等级保持最新。
- 它只返回英文名称,而游戏文件里有名字几乎相同的单位(“Dragon”和“Golden Dragon”),所以名称会先和你村庄里已有的单位匹配;只有恰好一个可升级的单位符合时,才会添加新单位。
- 升级进行时,API 仍显示旧等级,所以应用要等等级达到目标,才知道升级已经结束。对于空闲的单位,无论 API 的等级更高还是更低,都以 API 为准。
- 你还没获得的装备,在导出数据里写作1级,和你拥有的1级装备一样。只有列出已拥有装备的 API 能把两者区分开;而且只有当这次读取比导出晚至少30分钟时,应用才会据此处理,因为 API 比游戏有延迟。
有账号时,应用每天在打开时读取一次 API;没有账号时,它不获取任何等级。
一项升级要多久、花多少
一个步骤的基础时间和花费,就是它要升到的那个等级所在的那一行。其余一切都是叠加在上面的修正,在步骤开始时应用。
黄金令牌
建筑工人加成在两个村庄里按同样的百分比缩短建筑和英雄升级的时间、降低价格;研究加成对实验室和战宠小屋起同样的作用。游戏会对结果取整,ClashClock 照搬了这套规则:30分钟以内,新时间向上取整到秒;一天以内,向下取整到整10分钟;超过一天,向下取整到小时。价格向上取整。
| 黄金令牌加成 | 时间 | 金币 |
|---|---|---|
| 无 | 13天12小时 | 2600万 |
| 10% | 12天3小时 | 2340万 |
| 15% | 11天11小时 | 2210万 |
| 20% | 10天19小时 | 2080万 |
这些百分比不是赛季第一天就有的。它们是赛季奖励路线上的奖励,要靠积分解锁(wiki 上2026年4月的表格:建筑工人加成10%、15%和20%分别在80、640和1,060积分时解锁)。我读不到你的积分,所以计划假设30天内获得2,500积分,除非你填写游戏里显示的百分比,之后本赛季剩下的时间都以你的填写为准。在黄金令牌面板里,这个假设就是“正常进度”开关:开启时,计划按通常进度计算(一天内10%,约一周后15%,约两周后20%);关闭时,由你填写游戏里显示的等级。
帮手、药水和时光钟楼
- 帮手。建筑工人学徒和实验助手每次工作一小时;N级时,它们在这一小时里额外完成N小时的工作量,两者的工作周期都是23小时。8级的学徒被派去一项259小时的升级后,这项升级会在开始后251小时完成。
- 药水和零食。建筑工人药水让家乡的建筑工人以10倍速度工作一小时;研究药水或战宠药水让实验室或战宠小屋以24倍速度工作。同一类提速永远不会叠加(建筑工人药水生效期间,建筑工人大餐不起作用);不同类的提速则会叠加(研究浓汤可以叠加在研究药水上)。
- 时光钟楼。在建筑大师基地里,它让一切以10倍速度运行14到32分钟(视等级而定),每22小时一次。这个冷却时间是我没能确认的数字,代码里也注明了这一点。
ClashClock 保存每项进行中升级的真实完成时间,你记录一瓶药水或一次帮手时,它会相应调整。计划计算的是工作量,而不是钟表时间:一个十倍速的小时,无论落在哪里,都能减掉九小时的工作量。夯木节这样的活动不在我能读到的任何文件里,所以要由你填写日期和效果;应用从不假设日期,因为迄今为止每一届夯木节都不一样。根据玩家的反馈,活动和黄金令牌的效果相乘(50%和20%叠加后剩下40%的时间)。
规划器如何做决定
规划器反复回答同一个问题:有一个工人空闲了,接下来该让它开始什么?
工人、行和步骤
一个步骤就是某样东西的一个等级:加农炮从5级升到6级、英雄升一级、新建一座兵营。一行就是一个工人:每位建筑工人(你导出数据里的建筑工人小屋,以及小博入住后的小博木屋)、实验室和战宠小屋;在建筑大师基地里,则是建筑大师、奥仔哨站建成后的奥仔、用宝石购买的建筑工人博仔(在导出数据显示他的棚屋之前,你可以手动添加他),以及星空实验室。英雄升级占用建筑工人,城墙不占用建筑工人时间;同一座建筑的各个等级要一级接一级地升,即使有两位建筑工人空闲也一样。
循环
规划器是一个只向前推进的模拟。进行中的升级先占据各自的行;然后它反复选出最先空出来的那一行,看看那一刻有哪些步骤可以开始。一个步骤只有在以下条件都满足时才能开始:
- 它所需的大本营等级已经建成(仍在升级中的不算);
- 它所需的建筑(英雄殿堂、实验室、战宠小屋)达到了相应等级,而且已经完成,不只是刚开始升级;
- 同一座建筑的上一级已经完成;
- 你的储存建筑装得下它的价格:储存建筑装不下的升级,游戏不允许开始,所以规划器会等待腾出容量的那项储存建筑升级(从它完成时算起),或者把这样一项升级提前;
- 如果是家乡的英雄,当时没有部落对战联赛在进行;
- 你在线,因为步骤只会在在线时间里开始。
在满足条件的步骤里,由策略挑出一个,工人一直忙到它完成(算上提速),循环一直持续到规划满四年或6,000个步骤。基础调度器逐步选择升级。满级计划还会比较几个提前升级大本营的完整方案,先减少建筑工人空闲,再尽早完成遗留工作。这种有限搜索不保证全局最优;药水搜索和自定义计划也会比较其他方案。预测也会额外运行一些计划,比如宝石对比,以及大本营和满级的日期,但只是为了算出一个日期,或者某个选择会带来什么变化,并不用来挑选你的步骤。贪心是一种局限,但也正因为如此,每个决定都能解释清楚:调度器会记录它为什么选了每一步,步骤详情会写明一个推迟开始的步骤在等什么。它还是确定性的,没有随机性,也不读取当前时间;一个测试固定了整份计划的哈希值,所以输出的任何变化都必须是有意为之。计划每分钟以及每次编辑后都会在后台线程里重新计算。
你的离线时段,以及“空闲”是什么意思
你填写自己没法打开游戏的时间,可以是每天、每周或一次性的时段,按你所在的时区计算。规划器从不在这些时段里开始步骤,所以在1:00空出来的建筑工人,要等你回来。这段等待就是应用所说的“空闲”:因为你不在而损失的工人时间,仅此而已。等待前提条件的工人不算空闲;步骤详情会写明它在等什么。这个数字统计固定的七天,所以在每个村庄里含义都一样。它还会随计划开始的时刻而变化,因为这决定了各项升级相对于你的夜间在什么时候结束。在示例村庄里(一份真实的9本导出数据,四位建筑工人,23:00到6:00睡觉,工作日8:00到17:00上班,时区 Europe/Zurich),从导出那一刻开始的计划,在接下来一周的672个建筑工人小时里约有13小时空闲,冲本和满级都一样。在同一周的其他时刻开始,同样的计划会留下约5到55小时(冲本)和1到26小时(满级)的空闲。“计划”页上的空闲数字更高,因为它还算上了实验室和战宠小屋:同一时刻,冲本为15小时,满级为29小时。
步骤如何打分
重要度 = 权重[类别] × 关键建筑倍率[名称] × 等级价值 × 0.2(仅限超级充能等级)
优先级 = 重要度 ÷ √( (小时数 + 0.25) × (以百万计的花费 + 0.05) )
选择 = 优先级 × 时长 ÷ (时长 + 这一步会留下的空闲)权重来自策略。关键建筑倍率决定同一类别内各建筑的先后:在家乡的每种策略里,兵营、部落城堡、实验室和战宠小屋都是×3;地狱之塔、天鹰火炮、投石炮和擎天巨柱是×2;十字连弩、法术塔和另外几种建筑在1.3到1.8之间。你的离线时段在第三行起作用:一个会在2:00把建筑工人交还回来的步骤,要扣掉这段空闲时间,所以跨越整夜的长升级,胜过在半夜结束的短升级。
策略
| 策略 | 目标 | 大本营 | 谁来挑选步骤 |
|---|---|---|---|
| 策略冲本(默认) | 在游戏允许时尽早升到下一级大本营 | 最先,一旦游戏允许 | 规划器:先走大本营路线,再填补空档 |
| 满级 | 全部升满,最重要的先来 | 与最后几项升级并行,优先补齐遗留等级 | 规划器,按重要度档位 |
| 自定义计划 | 完全按你的步骤 | 只有你添加时才升 | 你 |
| 第6位建筑工人(建筑大师基地) | 通往小博的最短路线 | 只有你添加时才升 | 一份固定的条件清单 |
冲本给英雄的权重是3,部队、法术和军队建筑2.5,防御设施0.2;满级给英雄2.2,部队和法术1.8,军队建筑1.6,防御设施1。下表列出了主要类别的权重。冲本会调高关键防御设施的倍率,所以一座地狱之塔得分是0.2 × 4.5 = 0.9,而一座兵营是2.5 × 3 = 7.5。
| 类别 | 冲本 | 满级 | 自定义 |
|---|---|---|---|
| 英雄 | 3 | 2.2 | 2 |
| 部队 | 2.5 | 1.8 | 1.8 |
| 法术 | 2.5 | 1.8 | 1.8 |
| 攻城机器 | 2 | 1.5 | 1.4 |
| 军队建筑 | 2.5 | 1.6 | 1.5 |
| 战宠 | 1.5 | 1.5 | 1.2 |
| 防御设施 | 0.2 | 1 | 1 |
| 资源采集与存储建筑 | 1.2 | 1 | 1.1 |
| 陷阱 | 0.1 | 0.7 | 0.5 |
| 大本营 | 2 | 1 | 1.5 |
| 其他 | 0.3 | 0.6 | 0.5 |
家乡
- 兵营×3
- 部落城堡×3
- 实验室×3
- 战宠小屋×3
- 特斯拉电磁塔×1.6冲本 ×3.5
- 十字连弩×1.8冲本 ×4
- 地狱之塔×2冲本 ×4.5
- 天鹰火炮×2冲本 ×4.5
- 投石炮×2冲本 ×4.5
- 擎天巨柱×2冲本 ×4.5
- 法术塔×1.6
- 多人箭塔×1.6
- 跳弹加农炮×1.6
- 防空火箭×1.3
建筑大师基地
- 超级特斯拉电磁塔×2
- 巨型加农炮×2
- 熔岩发射器×2
- 时光钟楼×2
- 多管迫击炮×1.8
- 熔岩火炮×1.8
- 十字连弩×1.8
- 撼地巨石×1.6
- 特斯拉电磁塔×1.6
- 防空火炮×1.6
- 空中炸弹发射器×1.3
- 守卫岗哨×1.3
冲本按以下顺序选择,第一条给出答案的规则胜出:
- 你提前的步骤,或者英雄目标。
- 储存建筑升级,当某个步骤的价格超出储存建筑的容量时。
- 大本营,一旦游戏允许就立即升级。
- 先完成下一级大本营所需的项目。在建筑工人可用时间内能完成的工作中,为前三个优先项或避免研究空档所需的实验室与战宠小屋升级,优先于为更后面的大本营做准备。
- 填补空档的步骤:按权重最重要、且建筑工人能在大本营路线再次需要它之前完成的步骤,或者在当前大本营阶段内结束、同时有足够多其他建筑工人空闲的步骤。金矿、圣水收集器和暗黑重油钻井会在大本营开放建筑位时建好,但从不升级。
满级按重要度档位来选:
- 大本营开放的建筑位优先:每个建筑工人小时里,新建一座建筑带来的实力提升比任何升级都多。
- 否则最高的重要度档位胜出,档位就是把重要度按四分之一取整;同一档位内,由第三行决定。如果没有档位,加农炮从15级升16级会因为小数点后第三位的差别胜过加农炮从16级升17级,计划就会跟着这种噪声走,而不是先做更快的那项升级。
- 如果领先档位里最好的步骤会让它的建筑工人空闲超过一小时,就由不会造成这种空闲的最重要步骤取而代之。
升级大本营前游戏要求什么
大本营并不是一有建筑工人空闲就能升级。游戏要求当前大本营开放的一切先建好:它允许的每一个建筑位、达到新英雄所需等级的英雄殿堂,以及在较高等级大本营时的某些特定升级。所有这些都必须已经完成,而不只是已经开始。规划器在每种策略里都执行这条规则;对于你固定的大本营,它会补上缺少的项目。在示例村庄的冲本计划里,升10本的那次升级,正好在所需的英雄殿堂升级完成的那一分钟开始。建筑位和英雄殿堂等级来自游戏数据;文件里没写明的几条规则(升17本之前的21级防御塔和7级天鹰火炮,升18本之前的5级地狱火炮),是我根据社区表格手动输入的,游戏更新时我可能会在这里出错。
研究、战宠、英雄、帮手和药水
研究和战宠基本不走这个公式。在冲本和满级计划里,实验室和战宠小屋先按你自己的优先级列表,再按我为你所在大本营等级段写好的预设顺序;两者都没涵盖的,才回到公式。这份预设是编辑推荐,不是实测的使用率排名;我没有找到按大本营等级统计部队使用情况的可靠数据集。
你可以为英雄设定目标;开启“不间断连续升级”后,规划器会让一位建筑工人一直升这位英雄,直到达到目标。默认情况下,家乡英雄的升级不会排在部落对战联赛期间,因为正在升级的英雄无法出战。ClashClock 假设联赛在每月1日 UTC 时间8:00开始,持续11天。这个日历是我手动输入的规则,不在游戏文件里,所以如果 Supercell 在某个月调整了时间,这段时间就会放错位置。
每个工作类帮手每天被派出一次,派往那项缩短后能在在线时间里最早交还建筑工人的进行中升级。药水由你安排,或者由一个搜索来安排:它尝试几个时间点,分别规划之后的几天,保留平均每瓶药水造成空闲时间最少的那一个。
自定义计划
在自定义计划里,由你来选。你的步骤按你的顺序进行,你绑定了列表的建筑工人严格按顺序执行,而且不会添加任何东西:没有研究,没有战宠升级,不会擅自雇用哥布林,也不会为了等战利品而推迟任何步骤。唯一的例外是你添加的大本营之前游戏要求完成的项目。
拖放只在两种情况下会被拒绝:它会让一个步骤等待自己(7级排在6级之前,或者列表形成循环),或者你计划里的任何储存建筑升级都装不下它的价格。对于没有绑定建筑工人的步骤,规划器会运行两次:一次按你的顺序,一次把这些步骤按建筑分组、最长的在前,然后保留安排了更多你的步骤、留下更少建筑工人空闲时间的那一次。这只是比较两种启发式方法,而不是比较所有可能的计划,代码里也注明了这一点。
第6位建筑工人
建筑大师基地的小博控制室升满后,小博就会成为你家乡的第6位建筑工人。ClashClock 检查七项条件:家乡的加农炮、箭塔和迫击炮的改装;任意一种建筑大师基地部队达到18级;任意一种建筑大师基地防御设施达到9级;战争机器和战斗直升机合计45级;以及5级小博控制室。第6位建筑工人指南列出了这些条件、它们的花费和一套行得通的顺序;这里讲的是 ClashClock 如何处理它们。
- “任意”就是任意:你已有的、达到该等级的部队或防御设施就满足这项条件。否则部队由你挑选,默认是飞龙宝宝(这是我的选择,因为它从低到高一路都很能打),防御设施则选最快能达到该等级的那一种。
- 对于英雄,规划器会尝试把45级在战争机器和战斗直升机之间的每一种分配,选出升级时间最少的那一种,其次看花费最低;如果还没有战斗直升机的王座,就先建王座。
- 路线遵循那份指南里写明的固定顺序。在每个建筑大师基地步骤之前,需要时它会加上建筑大师大本营的升级或储存建筑;只有当某一级时光钟楼花掉的时间能在路线结束前赚回来时,才会加上这一级。
- 改装用家乡的金币支付,却由建筑大师完成,所以它占用一位建筑大师基地的建筑工人:分别需要2天、7天和14天,总共1000万金币。导出数据会显示进行中的改装,据我推断也会显示已完成的改装;如果两者都没显示,你可以手动勾选完成。小博控制室在游戏文件里没有建造时间,所以计划把它当成一道门槛,而不是一项工作。
存储了什么、发送了什么、发往哪里
在你的设备上。你的村庄、计划和设置保存在浏览器的 IndexedDB 里,另有少量小条目存放在 localStorage 和 sessionStorage 中(比如主题、语言、同步版本号、登录令牌,以及显示过哪条提醒)。Service Worker 会缓存应用和游戏图片,让它离线也能打开。ClashClock 本身不设置任何 Cookie;如果将来有变化,会在隐私政策里说明。网站是由 Cloudflare 托管的静态导出,规划器在你的浏览器里运行,所以你的村庄从不会被发送到服务器上去做规划。
账号是可选的。它用 Supabase 登录,并用一行数据库记录把你的全部应用状态作为一个文档保存,行级安全(row level security)保证这一行只有你自己的账号能访问。每次写入都带着它上次看到的版本号。如果另一台设备先保存了,云端副本保持不变,这台设备会采用那个更新的状态,并显示一条消息说明;你在此期间在这台设备上做的修改会丢失。在一台设备上首次登录时,如果两边都有村庄,应用会问你保留哪一边。之前同步过的设备会直接采用更新的云端状态,不会询问,所以在它退出登录期间所做的修改会被替换。
游戏 API。Supercell 的 API 只响应来自创建密钥时指定的 IP 地址的请求,而 Cloudflare 和 Supabase 都无法保证固定的 IP,所以请求要经过 RoyaleAPI 的代理。密钥保存在一个 Supabase 函数里;浏览器发送玩家标签和会话,取回一份精简过的文档,包含等级、名字、联赛和部落。无论谁来查询,每个玩家标签最多每十小时读取一次;调用会被记录(账号 ID、玩家标签、时间)并保留一周,用来执行限额。没有账号时,设备通过一项安全检查(Cloudflare Turnstile)后可以创建一个匿名访客会话,它最多可以查询五个玩家标签的联赛和部落,并且永远拿不到等级列表。
提醒。应用打开时,提醒由应用自己发出。应用关闭时则使用 Web Push:浏览器把接下来七天内到期的提醒写入一个队列,由一个函数在到期时发送。队列里的每条提醒都包含现成的文字,写明升级项目、等级和村庄(例如“加农炮已升至9级”),还有一个事件键、提醒类型和时间。提醒到期时,同样的文字会通过你浏览器厂商的推送服务发送到你的浏览器,并按 Web Push 的要求为你的浏览器加密。提醒会提前45秒发出,用来抵消函数每分钟一次的检查间隔和推送服务自身的延迟。没有账号时,开启推送会先在安全检查后创建一个匿名设备 ID。在 iPhone 和 iPad 上,推送需要先把应用安装到主屏幕。关闭推送会删除订阅以及所有未发送的提醒。
| 何时 | 离开你设备的内容 | 发往哪里 |
|---|---|---|
| 打开网站 | 普通的页面请求:IP 地址、时间、页面、浏览器 | Cloudflare,用于托管和不使用 Cookie 的访问统计 |
| 查询玩家:添加村庄、联赛和部落、每日刷新 | 你的玩家标签和会话;没有账号时,是安全检查后生成的匿名访客 ID | 一个 Supabase 函数、RoyaleAPI 的代理,然后是 Supercell |
| 登录和同步 | 你的邮箱和密码(Supabase 保存其哈希值)、你的应用状态文档 | Supabase |
| 开启推送 | 你浏览器的推送地址、密钥和标识,即将发出的提醒的文字(建筑、等级、村庄)和时间;没有账号时,还有安全检查后生成的匿名设备 ID | Supabase,然后是你浏览器厂商的推送服务 |
| 从“支持与反馈”页面发送消息 | 你的文字、主题、你填写的设备信息和你使用 ClashClock 的方式,以及你留下的邮箱地址(必填,这样我才能回复);应用版本、浏览器、系统、窗口大小和语言,仅在你保持勾选时发送 | 一个 Supabase 函数保存它30天(如果邮件无法投递则为90天),并由 Resend 用邮件发给我,在我删除之前一直保存在我这里。你的 IP 地址不会和它一起保存 |
| 做计划以及应用里的其他一切 | 无 | 留在你的设备上 |
准确性、已知局限,以及如何报告错误的数字
ClashClock 在照搬游戏的地方是准确的,在需要建模推算的地方是近似的。
| 方面 | 依据 | 可信度 | 可能出错的地方 |
|---|---|---|---|
| 花费、时间、等级上限 | 游戏文件加上注明来源的人工修正,并与另外两个来源对照审计 | 高 | 游戏更新后的几天 |
| 黄金令牌的取整和百分比 | wiki 和游戏的实际表现 | 取整方面高,进度方面是假设 | 你实际有多少赛季积分 |
| 帮手、药水、时光钟楼 | Supercell 的帮助页面和 wiki | 较高 | 时光钟楼的冷却时间;提速如何叠加 |
| 活动 | 往届活动和玩家反馈 | 公布前较低 | 每一届都不一样;由你填写 |
| 大本营的要求 | 游戏文件加上几行手动输入的数据 | 较高 | 游戏更新后的那几行 |
| 升级顺序、研究顺序 | 我选定的权重和预设顺序,按贪心方式应用 | 一种判断 | 你的进攻中重要、而我没有考虑进去的任何因素 |
| 刷资源和战利品(可选) | 估算:可掠夺资源的70%,每次进攻10分钟 | 低 | 全部;数字由你修改 |
我已知的局限
- 导出数据是一张快照。导出之后用的药水、帮手、书、锤,或用宝石立即完成的升级,在你记录或重新导入之前,ClashClock 都看不到。导出数据里自带的提速和帮手计时字段没有被解析,因为我无法确定在各种提速生效时原始计时器的含义,所以在提速期间导出的数据可能有误导;等提速结束后再导出就能避免这个问题。
- 账号专属的提速不在导出数据里。回归加速可以作为活动开启,依据的是玩家的反馈(14天内时间和花费减半,仅限家乡);登录奖励没有建模。
- 纯时间计划假设战利品总是够用。在示例村庄里,冲本计划在第176天开始升18本,四年的升级总共花费55亿金币:这是建筑工人在资源无限时能做到的,而不是预测。可选的“按资源排计划”模式会把步骤推迟到付得起为止,所用的刷资源数字是我的估算。
- 进度百分比统计的是等级,而不是时间。英雄的一级和加农炮的一级分量相同,城墙不计入。
- 新内容可能在任何公开来源给出数字之前就上线。Portal Pendant 曾以一个没人叫得出名字的 ID 出现在真实的导出数据里。我先按猜测的 ID 录入,两天后有一份导出数据显示了真正的 ID,我随即做了修正。
计时器和游戏不一致时
打开这项升级,使用“调整剩余时间”:填入游戏显示的时间,它还会替换掉设置错误的提速。如果某个计时器总是出现偏差,检查一下导出之后你用过什么(药水、零食、帮手、书),以及黄金令牌的百分比是否和游戏一致,然后等提速结束后重新导入。详情见“计时器看起来不对时”这一章。
要报告错误的数字,请使用支持与反馈页面上的联系表单,写明是哪个页面、你预期的结果以及实际发生了什么。如果是计时器,请发送升级项目的名称、当前等级和下一级、哪个村庄,以及当时生效的每一项提速:黄金令牌百分比、药水、帮手、回归加速。永远不要发送密码。
追踪器运行的就是这些代码。粘贴导出数据,带着这些了解去看你的计划。
打开追踪器在你自己的村庄上试试
粘贴你的村庄导出数据,本指南里的一切就会用在你自己的建筑工人、计时器和计划上。免费,无需账号,直接在浏览器里运行。