DDLC 中的 meta 机制分析 [1]
1 简介
第一次接触这个游戏是在 2019 年,当时对 meta 的实现方式很感兴趣,但是当时并不会编程,而且写日记环节的各种生僻英文词也是给我劝退了。后来买了 plus 版一直在吃灰,直到昨天花费一整天时间拿下 plus 版全成就后,又想再来看看 meta 的实现机制,现在有了编程基础和豆姐的加持就很容易实现了。
2 预备知识
2.1 什么是 Ren’Py
Ren'Py (Renai + Python) 是基于 Python 和 Pygame 的制作视觉小说和恋爱模拟类游戏的开源游戏引擎,常见的文件格式有:
.rpy: 源代码.rpyc:.rpy文件会被Ren'Py编译成.rpyc格式的二进制文件.rpa:Ren'Py专用的压缩包格式,用于打包资源
2.2 文件结构与解包
未解包前的目录结构:
DDLC/├── DDLC.exe # 游戏主启动程序├── lib/ # 运行库├── renpy/ # Ren'Py 引擎核心└── game/ # 游戏核心资源文件夹 ├── scripts.rpa # 脚本包:rpyc编译脚本、poemword.txt诗歌词表、特效代码 ├── images.rpa # 所有立绘、CG、背景图、UI图片 ├── audio.rpa # BGM、音效 ├── fonts.rpa # 字体文件 ├── firstrun/ # 首次启动警告页面 └── characters/ # 四个角色的 .chr 文件进入游戏目录,通过 pip 安装 unrpa 后进入 game 目录下解压 scripts.rpa 和 images.rpa:
# 将当前目录下的 scripts.rpa 解压到上级目录下的 ddlc_out 中unrpa -mp ../ddlc_out ../scripts.rpa# 同理将图片解压到 ddlc_image_out 中unrpa -mp ../ddlc_image_out ../iamges.rpa此时解压出的源代码是编译后的 .rpyc 文件,需要通过 unrpyc 工具反编译:
# 下载 unrpyc 工具git clone https://github.com/CensoredUsername/unrpyc.git# 进入 unrpyc 目录cd unrpyc# 反编译python unrpyc.py path/to/your/.rpyc最终效果类似下图:

3 代码逻辑
meta 元素涉及到游戏启动动画,主菜单,立绘等,因此对整个流程进行分析,只基于目前周目下会触发的逻辑,而非整体全部的逻辑
3.1 启动动画
Ren'Py 启动后,会扫描并执行所有的 init 块,例如启动动画对应的脚本 splash.rpy 中定义了启动时显示的文字:
init python: menu_trans_time = 1 splash_message_default = "This game is not suitable for children\nor those who are easily disturbed."
splash_messages = [ "You are my sunshine,\nMy only sunshine", "I missed you.", ...]同时也会初始化 image, transform 等:
image tos = "bg/warning.png"image tos2 = "bg/warning2.png"当游戏启动后,会自动执行 label splashscreen 中的语句 (类似函数),第一次运行时会显示警告:

进入游戏,我们会看到厂商的 logo (对应 intro 动画) 和 “此游戏不适宜儿童 …” 的警告 (对应 splash_warning):


3.2 开始菜单
来到开始菜单,它的定义在 screen.rpy 中,人物立绘的定义在之前的 splash.rpy 中:
进入解包后的图片文件夹中可以看到三个 image 对应的图片:



navigation 用于插入开始游戏,设置等按钮,不是 main_menu 时表示是在游戏对话界面,此时插入保存,快进等按钮