[心得] RMX1的防盗机制: 人心终究是要回到公路的

楼主: Append (<( ̄︶ ̄)>)   2024-08-12 23:56:44
本文极长,极生硬,强烈推荐读好读版:
https://hackmd.io/@Append/ByM82wnKA
## 开始之前
总之这篇的故事有很大部分跟 RMMH 的近期影片有关。
【电玩说书】你已成为正版的受害者 谈洛克人X1离谱的防盗机制
https://www.youtube.com/watch?v=oL8X4Tb2Mb0
这篇是我在这影片背后的研究过程中的一些心得,
以及对于我们想验证的许多逻辑的补完。
如果还没有看过的话,强烈推荐先至少看过一次。
## 缘起
之前写过一篇“RockmanX 1.0 公路诅咒的机制与回避”,
里面提到了当年 RockmanX 初版卡带的一个奇妙的防盗机制,
让无数的玩家莫名其妙的被送回公路。
我自己从2014年左右开始关注这个现象,
后来经过 ProwainK 和 Ds83171 以及 F6BFB5 的协力研究,
完成了上述这篇文章,
对这个现象的背景、成因以及应对方式有了初步的理解,
至少我们知道了“只要不要冲豆就不会出事了”。
我当时在那篇文章底下写了一段“下集预告”,提到预计会写
The Cutting Room Floor (TCRF) 与 near.sh
对于防盗机制以及跳线修正的相关记载。
然后...就过了三年。
我隔了这么久都没有把续集写下来。
理由非常简单,就是,
就是我看不懂RRRRRRR ◢▆▅▄▃崩╰(〒皿〒)╯溃▃▄▅▇◣
其他机制那边我真的没什么好办法,
毕竟我没有想到怎么触发那些机制的手段,他其实也没有写下来。
我当时能想到的大概是...
去买很多不同的磁盘机说不定有办法撞到几个?
但这有点太过乱枪打鸟了,
实在是没有信心能办到。
至于跳线修正到底做到了什么...
这我当时就有看到有人在讨论那些电路,
有画出详细的电路图,
但...我看不懂,真没办法,
我一个读化学系的真的没看过这些,臣妾办不到阿。
于是到了前阵子 XGOD 做了一片
【电玩说书】洛克人X2卡匣为什么当年非常稀有/没有盗版?
其中有拍到 X1 的卡带中的跳线,
那时有讨论了一下有没有办法把这段讲成一个比较容易听懂的故事...
不是,讲故事之前,我得先看懂RRR ◢▆▅▄▃崩╰(〒皿〒)╯溃▃▄▅▇◣
于是就开始了漫长的奋斗。
我有种回到大学期中考前的感觉,
大概就是那种,老师上课的笔记,同学们每个都说没有看懂,
我们开个读书会大家一起努力一下...好像看懂了,
然后跟同学解释,赫然发现这不对,我没有搞懂,
只好继续看一下...
然后花了两小时发现我前面少写一步,
或者发现这边老师笔记写错了一个字,
改掉之后整篇就没有矛盾了。
这些日子大概就这样的感觉,
XGOD 常常很准确的挑出我的逻辑中的矛盾之处,
于是我就摸摸鼻子继续想办法弄清楚...
到了现在,新的这片影片总算是完成了
"【电玩说书】你已成为正版的受害者 谈洛克人X1离谱的防盗机制"
这里面有针对 TCRF 提过的每个防盗机制尽,
每个都尽可能地找出触发的方式,拍下实际的情况;
也有简短的介绍了 near.sh 提到的跳线修正的机制,
并且最后透过理解之后,剪掉跳线上二极管的部分,
成功的在实机上还原了公路的诅咒这个防盗机制。
但...作为一个影片,篇幅有限,
实在无法把所有的过程都写上来,
就算是目前这个篇幅,30分钟的YT影片已经非常漫长了。
实际上内容也确实偏难,
底下的留言几乎也都是“虽然我看不懂,但看起来好厉害”。
不过还是有很多朋友很有勇气,
比较想看到实际上中间我们怎么验证这些的过程,
所以在这边另外再写一篇,
纪录一下我们说服自己的过程。
这篇文章接下来会讨论以下几件事情:
- 先回顾一下我们在这过程中找到的既有讨论。
实际上我们有非常多的判断都是直接从前人的叙述中得知的,
然后我们设法去重现这些。
- 这之中大部分的机制都牵涉到内存映射,
所以我们需要描述超任主机怎么样透过内存位址读取到ROM中的内容。
- 实际上 7400LS 这张芯片到底做了什么,
以及跳线怎么修正他。
- 这里面实际上有那些防盗机制,
我能够用模拟器的环境有系统地重现吗?
- 如果我触发了这些的防盗机制,
这游戏有办法有系统的破关吗?
## 文献回顾
在写上一篇的时候,当时我们就已经知道:
- TCRF 除了我们遇到的“爆炸计数器”以外,有提到更多的防盗机制,
例如“落下计数器”和“受伤计数器”。
每个都只各用一句带过,很可惜没有办法看到实际上的效果。
- near.sh 有在文章中写出 Capcom 在制品版中透过跳线修正了卡带,
这很可能是因为开发版的内存映射方式和制品版不同,
因此模拟器需要手动修正映射才能避免这些机制的触发。
### TCRF 记载的防盗机制
首先先翻译一下 [TCRF 的叙述]:
https://tcrf.net/Mega_Man_X#Copy_Protection
- 在128次爆炸后,
能反弹子弹的敌人可能会在反弹时杀死你。
强化道具会迅速消失,
并且在冲刺时射击会导致你需要重复初始关卡。
- 这其实就是我们已经知道的公路诅咒。
豆炮反弹会离开关卡,冲刺豆炮会立旗导致离开关卡后回到公路。
- 在掉落128次后,
你接下来的127次跳跃会在正常跳跃和小跳之间交替。
你还会在爬墙时受伤,并且无法使用骑乘装甲。
开火会将你传送回关卡起点。
- 虽然上一篇没有提到,但这个我之前是有注意到的。
当然我并不清楚规则,但我有在Sigma Stage 4的墙上,
用 Joytokey 设定“连发→”来让下滑变得更慢,
赫然发现我的HP会被扣下去。
- 当你第128次受到伤害时,游戏会开始添加随机输入,
并且你的蓄力X炮射击会被锁定。
- 你可能会在开始关卡时失去所有升级(包括E罐)。
- 这个也是很有名的,很老的模拟器 ZSNES 1.2 会友这个现象,
不管什么装备都留不下来。
- 你在捡起强化道具或穿过Boss门时可能会被传送回关卡起点。
- 当敌人掉落1up时,你可能需要重复初始关卡。
- 虽然这个也满有名的,
但我有点难想像为什么大家能判定出来是1up造成的...
TCRF记录的这些现象,我们写上一篇的时候就有注意到。
14年之后我很长时间都有在玩1.0J,
应该满早就有看到TCRF写下来的这些,
但当时只知道第一条爆炸计数器,
除此之外我都没有弄懂,
但偶尔还是会听到有人聊天的时候提到,
当年曾经遇到过类似的状况。
很可惜大家都是遥远的模糊记忆,
没有人能记得细节,
所以也不知道如何考据。
不过直到最近我突然注意到,
TCRF 其实是有写下 Citation 的。
- Source: HHS, TASVideos
https://tasvideos.org/Forum/Topics/558?CurrentPage=15&Highlight=384683
- Source: Original TCRF research
https://jul.rustedlogic.net/thread.php?pid=433506
TASVideo 的 HHS 写的超详细,
把所有牵涉到的内存位址都有明确的写下来。
我想这多半是有直接看懂程式码,
才能写得这么准确;
实际上也因为有这些位址,
我们才有手段去直接切入这些问题,
设法重现每一个效果。
另一篇更早一点的 TCRF 的研究中有写下来一些现象,
而且还有发现这些现象的程式码中有额外的自我检查,
如果想把这些程式码移除掉,
仍然会触发同样的防盗机制。
### near.sh 描述的跳线修正
当时我还在研究的时候,
有看到 Near (更多人可能更熟悉 byuu)
有在他的个人网站 near.sh 里面写下来一些模拟器开发的文章,
其中有提到 X1 卡带中的跳线。
在 Near 过世之后,
目前这些文章有被备份到BSNES的网站 https://bsnes.org/articles
其中提到了:
- 洛克人X的卡带中没有存盘用的SRAM,
但大部分的盗版装置 or 磁盘机都会有;
程式码中会对SRAM区块进行写入检查,
很可能就能判断出这是不是盗版,
并且施加防盗机制作为惩罚。
- 这段写入检查的程式码有些问题,
在制品版中遇到了不对的“内存映射”,
导致正版卡带也会被误判成盗版,
因而触发防盗机制。
- 洛克人X的1.0版踩用 SHVC-2A0N-01 的电路板,
但他透过一条跳线更改了“内存映射”,
导致他的内存映射和其他同样电路板的行为很不一样。
- 一般模拟器在这种情况难以应对,
但BSNES在数据库中纪录了这件事,
每次遇到这个ROM的时候就针对性的作出正确的映射。
这里提到的“内存映射”会需要更多一点点的基本介绍,
我们后面会对此做比较详细的讨论。
### 其他相关文献
接下来附上几张照片。
这来自于 Reddit 上的一个讨论,
https://www.reddit.com/r/snes/comments/b3bsmp/bought_this_import_rockman_what_are_these_wires/eiztnu6/
他拍摄了电路板的照片,
同时标示了电路相连的部分,
以及将他们整理成电路图,
分析上面外加的跳线与二极管的部份的实际效果。
我会在这之后的过程,
照着这个思路走过一次,
描述“74LS00实际上会做出什么样的内存映射”,
以及加上这个跳线修正之后的结果。
https://i.imgur.com/E64ie1g.png
https://i.imgur.com/XMIILq2.png
https://i.imgur.com/KKbwiwJ.png
除此之外,
日文杂志“バックアップ活用テクニック”中有一页提到了这个电路,
同样的提出了解释。
内容的接法稍微有点不同,
后面我们会一并去理解这中间的差异。
https://hackmd.io/_uploads/rkCGHQL5A.png
## 超任的“内存位址”与“映射”(Mapping)
超任的CPU要跟其他元件进行互动的时候,
会使用24位元的整数来形成一组“位址”;
前面提到的“内存映射”指的就是“把位址对应到特定的元件”的规则。
为了弄清楚这点,先介绍一下超任的位址格式。
超任使用的24位元位址,通常我们会用16进位来表示他。
这样可以把他表示成 000000 ~ FFFFFF 之间的某个整数。
在大家的习惯中,我们把这六位数的最前面两位的
$00 ~ $FF 叫做 Bank (习惯上会标记$表示Bank),
后面的四位 0000 ~ FFFF 叫做 Page (分页)。
理论上,这每个位址都可以对应到一个 Byte 的资料;
所以 000000 ~ FFFFFF 这么多组位址
实际上可以对应到 16,777,216 个字节,
也就是 16MB 的资料。
但这里面有很大部分要分给不同元件,
而且超任卡带内容通常不怎么大,
目前最大的应该是 6MB 的时空幻境 (Tales of Phantasia)
与星海游侠 (Star Ocean)。
洛克人X比起来不大,只有1.5MB,
总位址量远远超过这个大小,
要指向所有的内容其实并不需要完整的24个位元 -
如果是要涵盖这个大小,其实只需要 21 个位元就能达成。
从卡带的角度来考虑,
实际上卡带的针脚的定义我这边引用
The SNES Cartridge, Briefly Explained
一文的图片以及介绍:
https://mousebitelabs.com/2019/05/18/custom-pcb-explanation/
https://hackmd.io/_uploads/BJMVh4TKC.png
从照片中可以看到,
连接主机的针脚上其实是有编号的;
电路板背面(主机正面)的针脚编号是5~27,
电路板正面(主机背面)的编号是36-58,
两面各有23个针脚,表格中有标示出每个针脚的功能,
中间的编号我就不太清楚会跑去哪,
但似乎还有另外一种电路板会有更多针脚。
考虑到每个针脚都能够对应到 0 与 1 (也就是电位低与高),
他们表示的就是位元,
所以多个针脚就能表示出一个更大的整数。
- VCC, GND: 供电用
- VCC提供高电位,
原则上电路直接连上 VCC 的部份,
电位会是 +5V
- GND提供低电位,
原则上电路直接连上 GND 的部份,
电位会是 0V
- A0-A15, BA0-BA7: 内存位址,共24根
- A0-A15 这十六个针脚对应到的就是上面提到的分页,
总共可以对应 0000-FFFF。
- 如果你偷看一下后面 X1 卡带的照片,
他的40什么都没接上!
- BA0-BA7 这八个针脚对应到的就是上面提到的 Bank,
总共可以对应 00-FF。
- 同样的如果你偷看一下后面 X1 卡带的照片,
他的47/48什么都没接上!
- X1卡带上总共只有 21 个针脚有接上电路
- 21位元能够表示的位址数量的理论上限是2MB,
比 X1 ROM 的 1.5MB 大一些
- D0-D7: 资料读取/写入用针脚,共八根 (1 byte)
- /CART: Off (也就是电位为Low)时才能够读取卡带内容
- /RD: 读取开关
- /WR: 写入开关
除此之外另外附上两个只有ROM芯片的针脚才会标注的:
- /CE是 Chip Enable,启用这个ROM芯片
- /OE是 Output Enable,接受这个芯片输出的资料
- 实际上接下来我们遇到的都会是 /OE(overbar),
表示**低电位时才启用**
接下来看一下电路板的芯片部分,
可以看到这张 SHVC-2A0N-01 的电路板上有两个 ROM 芯片,
分别是 KM23C4001B (上) 与 KM23C8001B (下) ;
前者可以容纳 512KB,后者可以容纳 1MB。
这两张芯片都是由 Samsung Electronics 制造的,
现在直接搜寻编号仍然能够找到他们的 Datasheet,
上面有列出每个针脚的用途。
先偷偷计算一下,512KB = $2^{19}$ Bytes,
也就是说要描述 512KB 的资料需要 19 个针脚;
相对的,1MB 需要多用到一个位元,
所以可以用 20 个针脚完成。
在针脚的示意图中,
1MB 的 KM23C8001B 的内存位址针脚编号从 A0 -> A19,总共20根;
相对的,512KB 的 KM23C4001B 少了 A19 这根针脚,
因此只用到 19 根。
这边需要特别注意的是,
芯片的针脚命名,与电路板的针脚命名并不需要保证相同;
所以之后我们会在需要的时候特别标记,
这个命名是芯片的针脚、还是电路板的针脚。
https://hackmd.io/_uploads/BJ0C6gUcC.png
但从卡带电路板的针脚来看,
电路板针脚 40 (A15) 其实什么都没有接上;
1MB 的 KM23C8001B 需要的 20 个针脚,
对应到电路板上应该会是 A0-A14 (15根) + BA0-BA4 (5根)。
很可惜我没有办法看到芯片底下的电路怎么经过,
这部分他们怎么连接我没有证据,
但根据超任的 Memory Map 规则,
A0-A14这15个针脚对应到的应该会是位址的后面四位,
也就是“分页”;
分页能够对应到的位址是 0x0000 - 0xFFFF,
这需要16个位元才能表示;
如果只有15个针脚,
实际上是不能对应到全部的。
实际上超任的 LoROM 模式也因此不会用到这之中全部的位址,
每个分页都只对应到 0x8000 - 0xFFFF;
这相当于在这16个位元中的第一个位元固定都是1,
后面15个位元由针脚决定。
相对的,
Bank 的部份对应到的位址应该是 $00 - $FF,需要八个位元来表示;
芯片上的与此有关的针脚是 A15-A19,
这五根对应到电路板中的 BA0-BA4 这 5 根针脚。
但很明显的,5 根针脚只能对应到 $00 - $1F 这 32 种可能,
考虑前面分页是32768个位址,这样刚好能够表示1MB;
剩余还没有用到的三个针脚中,
电路板上我们能够看到 47(BA6) / 48(BA7)这两个针脚并没有接上芯片,
最后剩下的 BA5 在这里决定要控制这两张芯片的哪一张,
因此这样就能对应到 $00 - $3F 这些可能。
但实际上 KM23C4001B 在 Bank 的部份只有用到 BA0-BA3 个针脚,
BA4 原本就没有接上他。
也因此总对应其实应该是 $00 - $3F;
其中 $00 - $1F 对应到 1MB 的 KM23C8001B,
$20 - $2F 对应到 512KB 的 KM23C4001B。
好,那么现在就有个奇妙的问题 -
BA6 与 BA7 没有接上,如果我们给他不同的位元,
会影响其他位元的运作吗?
如果他真的没有接上其他元件,
那不管他是哪个位元应该都不会影响。
也因此,
$00 (00000000)、$40 (01000000)、
$80 (10000000) 与 $C0 (11000000)
应该都对应到一样的 Bank。
这件事情就是“内存镜像”(Memory Mirroring),
因为 BA6 与 BA7 在这边没有接上元件,
自然的让这四组位址对应到了同样的区块。
以下附上超任的 LoROM 模式的内存映射示意图。
https://hackmd.io/_uploads/B12-7GL90.png
> 这里其实有个还没看懂的问题:
> - 根据上面这个逻辑,
> 电路板上同样没接上的 A15 应该会有同样的效果,
> 让所有分页的部分 0x8000-0xFFFF 也镜射到 0x0000-0x7FFF?
> - 前面引用的文章中有提到 A15 会接上一个 decoder,
> 最后应该要对应到 我无法在电路板上看出这件事情
> - 实际上 bsnes 最后给我 SHVC-2A0N-01 的内存映射里面,
> $40-$7F 的部份对应到的分页 0x8000-0xFFFF
> 也是有镜射到 0x0000-0x7FFF
> - 也就是说,这个问题很可能应该要改问
> “SFC如何决定一些位址不要映射到 ROM 的资料,
> 而是对应到其他元件”?
> - 这会同时回答为何超任能够将 Bank $7E-$7F 对应到 RAM,
> 而不是 ROM 的镜像。
## 内存控制芯片: 74LS00
SHVC-2A0N-01 上面使用的内存控制芯片是 74LS00。
这也能够直接 Google 查到 Datasheet,
实际上他很单纯,就是四个 NAND 闸。
他有十四个针脚,其中 VCC 和 GND 分别对应到 +5V 与 0V,
其他12根分别对应到这四个 NAND 闸,
每个闸各两有两个输入与一个输出。
https://hackmd.io/_uploads/BJY7GmUqC.png
在 SHVC-2A0N-01 这张电路板上,
我无法判断出这些针脚之间在芯片底下有什么样的连接,
但根据 Reddit 上面的讨论中,
有在上面这些照片上加上线路的连接方式。
看着下面这张照片,
可以注意到醒目的黑色的导线,
他一端接上了 KM23C4001B 的 31 号针脚(/OE),
另一端通过一个电阻之后接上了74LS00 的 3 号针脚。
但如果仔细看这个 3 号针脚,
在电路板上其实本来就有一条电路
直接走向 KM23C4001B 的 31 号针脚 -
但是在中间有个被切断的痕迹。
为了避免看不清楚,
这边附上另一张不同出处的照片,
并且用黄圈表示被切断的位置。
假设跳线、电阻与二极管都是后来追加的部分,
那么推测原本应该没有这些,
也没有那个切断的痕迹 - 也就是说那边应该要能形成通路。
https://i.imgur.com/XMIILq2.png
https://i.imgur.com/glUbH1M.png
在这个情况下,
我们能够透过线上模拟工具重建这个情况。
前面有提到 /CART 为 Low 的时候才能读取卡带内容,
在这个情况下,
BA5 为 Low 的时候,
会让 ROM0 的 /OE 为 Low (注意 /OE 是在 Low 启用),
ROM1 的 /OE 为 High;
这个时候超任会读取到的就是 ROM0 的内容。
相对的,如果 BA5 是 High,
ROM0 的/OE 为 High,ROM1 的/OE 为 Low,
读取到的就是 ROM1 的内容。
但在这个时候,
由于 ROM1 只有 512KB,
BA4 实际上并没有接上他,
所以不管 BA4 实质上是 Low 还是 High,
他都只会认得 BA0-BA3 指向的 Bank;
从内存映射的角度来看,
他做到的就是把 $20 - $2F 镜射到 $30 - $3F
(以及考虑其他mapping后,
$60 - $6F 镜射到 $70 - $7F,
$A0 - $AF 镜射到 $B0 - $BF,
$E0 - $EF 镜射到 $F0 - $FF)。
这样看的话,
74LS00 默认的这个接法,
就会让512KB 的 ROM1 重复表现两次,
实质上表现得像是 1MB;
原本超过 1.5MB 到 2MB 之间的 512KB 位址,
实际上却对应到了后面 512KB 的资料。
对于一个1.5MB的游戏来说,
如果两张 ROM 分别是 1MB 和 512KB,
那“镜射后面的512KB”
就是 SHVC-2A0N-01 这张电路板上的 74LS00 默认的行为。
https://hackmd.io/_uploads/rkWDVSI5R.png
## 跳线修正:为什么要外接一条丑丑的电线?
前面提到这张卡带背面的跳线修正。
以前面这张照片为例,这有一个黑色导线,
一端接上了 KM23C4001B 的 31 号针脚(/OE),
另一端通过一个电阻之后接上了 74LS00 的 3 号针脚;
另外有一个二极管,
阴极的一端(有个黄色环标记)接上了 31 号针脚,
而阳极接上 30 号针脚
(BA4,但对 ROM1 来说原本应该是 NC,也就是"没有作用")。
除此之外,有一个原本线路切断的痕迹。
https://i.imgur.com/XMIILq2.png
考虑有可能的各种情况,
我们能够重新制作出电路的模拟。
以下直接列出 BA5 与 BA4 分别为 Low 或是 High 的所有可能,
列出实际上他各自会读取哪个 ROM;
|
作者: tv1239 (路过的)   2024-08-13 00:02:00
推详细记录
作者: aegius1r (SC)   2024-08-13 00:03:00
作者: TohmaMiyuki (塔马美由纪)   2024-08-13 00:04:00
push
作者: hirokifuyu (宏樹ふゆ)   2024-08-13 00:05:00
推 鸦片辛苦了
作者: ninnyshadow (Lonely Liquid)   2024-08-13 00:06:00
推一下 根本是论文等级了
作者: pbkfss (joker)   2024-08-13 00:11:00
推,光看这篇文就辛苦了
作者: dogluckyno1   2024-08-13 00:12:00
推论文
作者: fuhu66 (⊙)(⊙)   2024-08-13 00:13:00
作者: cactus44 (钢弹仔)   2024-08-13 00:15:00
化学系弄这个太痛苦了的吧w
作者: OSDim (I'm So Sorry)   2024-08-13 00:17:00
interesting...
作者: f78507851 (小羊)   2024-08-13 00:19:00
上ptt 看这让我头好疼
作者: inte629l   2024-08-13 00:19:00
作者: XFarter (劈哩啪啦碰碰碰)   2024-08-13 00:22:00
大推 整个Teardown 还把所有过程留下来真的是勇者
作者: gully (沟鼠)   2024-08-13 00:22:00
好耶
作者: Darkmatt   2024-08-13 00:26:00
作者: LADKUO56 (KYOUALL)   2024-08-13 00:26:00
前一阵子就有看到RMMH的文了 这边再推一下
作者: forsakesheep (家裡蹲魯廢肥宅)   2024-08-13 00:26:00
推,馆长的影片我还看得懂,这篇真的不行
作者: KRSmp (鸫)   2024-08-13 00:29:00
这个真的是论文等级的,只能跪了,感谢诸位辛苦研究的大大
作者: vsmk3 (Σ.ドッペルゲンガー)   2024-08-13 00:31:00
研究到这么透彻真的是让人佩服 只能推
作者: Fino5566 (星星芝我心)   2024-08-13 00:34:00
长期受您照顾了,以前玩洛克人最爱看馆里的研究文轶事传闻小故事也很有趣 比从游戏本身得到的乐趣还多
作者: RoaringWolf (滚狼)   2024-08-13 00:38:00
这是在写论文吧
作者: cleverjung   2024-08-13 00:52:00
先推
作者: eva05s (◎)   2024-08-13 00:55:00
哇这验证太猛了
作者: chshsnail (工程师蜗牛)   2024-08-13 00:57:00
我只知道以前电脑大补帖里面的X1打到公路关被霸法就会直接卡住
作者: eva05s (◎)   2024-08-13 00:58:00
补推
作者: jeff666   2024-08-13 01:04:00
太神啦
作者: RandyAAA (AAA)   2024-08-13 01:14:00
不知道老卡当年的STAFF看到两位的研究会有什么感想
作者: aaaaagw (暱称可以吃吗)   2024-08-13 01:17:00
超强!推一下玩弄机制!
作者: avans (阿纬)   2024-08-13 01:30:00
看不完,不过先推了
作者: sakabato (海胆)   2024-08-13 01:31:00
推,21年看过一次,想不到你后面做的更精采,连mapping都翻出来了
作者: llabc1000 (野生的攻城獅)   2024-08-13 01:36:00
哇喔
作者: sword10723 (Bear)   2024-08-13 01:37:00
论文级的研究,真的很有爱,大推
作者: JMLee (鸡米粒)   2024-08-13 01:57:00
专业推
作者: silveryiris (= =)   2024-08-13 02:59:00
先推再说
作者: lunaX19 (Lazy&)   2024-08-13 03:00:00
推 但看不懂
作者: jasonchangki (阿特拉斯耸耸肩)   2024-08-13 03:03:00
预防性朝圣,原来小时候遇到的情况是防盗
作者: danny10173   2024-08-13 03:36:00
太长了,我没看完。用心推
作者: devilhades (菲特)   2024-08-13 04:37:00
作者: kyle6506   2024-08-13 05:15:00
没看完但给认真推
作者: moma8 (墨满)   2024-08-13 06:19:00
很酷的设计
作者: kuff220 (库夫)   2024-08-13 06:30:00
强…
作者: WindSucker (抽风者)   2024-08-13 06:38:00
top player
作者: wahaha2005 (我是谁2005)   2024-08-13 06:55:00
未看先推
作者: lee27827272 (岚空)   2024-08-13 07:02:00
推鸦片大
作者: your025 (your025)   2024-08-13 07:10:00
作者: v86861062 (数字人:3)   2024-08-13 07:11:00
酷酷的知识增加了
作者: emulators (Ωmegamind)   2024-08-13 07:17:00
我是不是该说一声生日快乐?啊今天13了不是12,所以是迟到的生日快乐
作者: howtotell (工作的日子)   2024-08-13 07:42:00
完全看不懂但真心佩服你的研究精神
作者: janfat (O.o")   2024-08-13 07:53:00
完全看不懂但还是要推…
作者: Issarc0721 (萧瑟风月)   2024-08-13 08:32:00
感觉内容很硬,先推,有空再来啃
作者: henry46277 (Henry小昌)   2024-08-13 08:52:00
作者: Catwaterfall (猫屿瀑布)   2024-08-13 08:54:00
作者: SangoGO (隐世的外来人Lv.1)   2024-08-13 09:07:00
作者: Deparic (碱性石方)   2024-08-13 09:15:00
我还以为我错板
作者: g020488854 (阿豪)   2024-08-13 09:16:00
论文推
作者: hayate1143 (永远のA仔)   2024-08-13 09:17:00
推,完全看完了
作者: dzes916603 (露米扣)   2024-08-13 09:48:00
作者: jaspergod (神游)   2024-08-13 10:03:00
好猛 推
作者: nisioisin (nemurubaka)   2024-08-13 10:19:00
太长 纯推不看
作者: FeiYue (绯月)   2024-08-13 10:49:00
推论文 没想到过了那么多年1.0J还能玩出新东西

Links booklink

Contact Us: admin [ a t ] ucptt.com