程序员玛丽的星海方舟

使用AWS Amplify搭建一个Degrees of Lewdity(DOL)私服

前言

最近迷上了一款文字纯爱战斗冒险游戏(雾),我本人是用 iPhone 手机玩所以一直都是玩的 web 版本。一开始玩的是汉化组提供的 GitHub Pages 线上版,后来又玩了 DOL-Lyra 的美化封装版,也是有 GitHub Pages 线上版。玩了几个档以后开始尝试自己折腾模组,学会用北极星大佬提供的美化模组生成器,可以把一些旧时代的直接覆盖游戏图片的美化模组封装成 mod loader 版本。后来又想尝试一下北极星扩展,这回提供的是游戏本体 html 且没有直接提供的线上部署版,于是想着尝试自己弄一个静态 web 服务来托管这个游戏,并且看看能不能做一些不同的美化组合的快捷切换方式(mod loader 的模组顺序和启用切换还是太累,不是很好用)。最后算是弄出来了一个比较满意的成果,于是发个帖子分享一下我的操作路径。

托管服务的选择

首先作为个人自用的小站点,也没有安全性要求,优先选择便宜甚至免费的服务。目前 GitHub Pages 托管静态站点是免费无限制使用的;AWS Amplify 是前 12 个月免费,不使用 SSR 的话部署不到 1GB 的数据月费也很低,最多不到 1 刀吧。考虑了一下 AWS 我没用过,这个网站也没有公开的需求,干脆用它搭一个试试。(Github Pages 也很好的,推荐使用)

前期准备

现在主流的模组管理方法是通过 mod loader 来管理,网络上都可以直接下到内置 mod loader 的游戏本体。它们基本上只包含一个 html 文件,原版图片包和 i18n 等都需要通过 mod 的形式传入。

下载了游戏本体后,还需要下载所需预安装的相关 mod 文件。

单个游戏程序的部署代码

以最新汉化版游戏本体为例,游戏本体关键文件目录是这样的:

1
2
index.html
style.css

(注:release 包里有多个文件,只有 html 和 css 这两个是游戏本体)

如果需要在进入游戏程序时预加载模组,我们需要在 index.html 的同目录下新建一个 modList.json 文件,里面的内容是一个包含模组加载路径的数组。预加载的模组可以存放在服务器上,我们就直接在根目录下建一个 mods 文件夹,里面存放.mod.zip 文件,然后使用相对路径引用。

1
2
3
4
5
6
index.html
style.css
modList.json +
mods +
- GameOriginalImagePack-0.4.5.3.mod.zip +
- ModI18N-0.4.5.3-chs-alpha1.5.0.mod.zip +
modList.json
1
2
3
4
[
"mods/GameOriginalImagePack-0.4.5.3.mod.zip",
"mods/ModI18N-0.4.5.3-chs-alpha1.5.0.mod.zip"
]

如此这般,单个游戏程序的部署代码就完成了。你可以建一个 GitHub 仓库来管理它。

用 AWS Amplify 部署

在 AWS 控制台里可以找到这样的选项:“创建静态 web 服务”,进入配置页,连接到你的 GitHub 仓库并选择相应分支。可以允许 AWS 在 GitHub 提交更新时自动部署。配置项按照默认的来即可,等待 AWS 进行初次构建和部署,提示完成以后这个服务就创建好了。

服务器默认会以 index.html 作为根路径的重定向入口,所以部署成功后直接访问 AWS 提供的域名就会进到游戏里面,打开 mod loader 就可以看到你在 modList.json 中选择的 mod 已经加载。如果你有自己的域名,可以不使用 AWS 提供的随机域名,在应用程序设置-域管理中绑定自己的域名。

如果你不想让陌生人访问你的站点,可以在应用程序设置-访问控制中添加限制,访问站点时会要求输入用户名和密码。

在一个站点上实现不同模组组合的切换

如果你也像我一样需要经常调整 mod 组合,那么可以接着看下去。大致的思路是做多个子页面,每个子页面都有一个 index.html 和 modList.json,mod 文件则都放在一个文件夹里复用。文件目录大致如下:

1
2
3
4
5
6
7
8
9
10
mods
- mod1.mod.zip
- mod2.mod.zip
game1
- index.html
- modList.json
game2
- index.html
- modList.json
index.html

代码编写示例如下:

game1/modList.json
1
2
3
[
"../mods/mod1.mod.zip"
]
game2/modList.json
1
2
3
[
"../mods/mod2.mod.zip"
]
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!-- 一个简陋的选择页 -->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Degrees of Lewdity 游戏选择页</title>
</head>
<body>
<a href="/game1" target="_self"
>game1</a
>
<br />
<a href="/game2" target="_self"
>game2</a
>
</body>
</html>

我自己使用的部署代码可以参考:GitHub链接

总结

用这种方式实现的模组组合切换我还是比较满意的,首先是静态网站无需搭后端服务,总共的存储数据量也不是很大。因为是同一个站点,浏览器缓存是共通的,所以切换mod组合甚至本体也不需要导入导出存档(虽然本体切换有跳error的风险,但是保留成就点数还是需要导存档的啊)。日后如果有时间的话也可以研究研究有没有更省空间的方式来做这样的切换模组服务。