January 19
Tinted Lands 汉化简易教程
Tinted Lands 采用了一款极其冷门的视觉小说引擎,即 Visual Novel Maker,这还是个Steam上的付费引擎,所以网络上几乎找不到任何相关的翻译方案教程。不过好在这款引擎(或是这款游戏)采用 Electron 架构打包,极大方便了翻译工作,实际上与翻译一篇HTML无异。不过并没有接触过这款引擎,所以不确定以下翻译方案是否可行,但针对 Tinted Lands 是可行的。
通过翻文件目录可以找到TintedSands_PublicDemo_PC_VegaDay4_1.0\resources\app\data目录里存放有一堆以.json.js为后缀、文件名则毫无规律可言的文件,看上去似乎很像存放游戏文本的地方。使用文本文件方式打开发现全是乱码,排除编码问题后就是引擎或游戏的混淆或加密了。不过既然是单机游戏,那加密方式什么的一定就在文件中。
因为是 Electron,所以首先找到入口文件(位于游戏名\resources\app\data\main.js),尝试直接让游戏启动时带上控制台。
const { app, BrowserWindow } = require('electron')
const path = require("path")
const {ipcMain} = require('electron')
const createWindow = () => {
const win = new BrowserWindow({
width: 1920,
height: 1080,
useContentSize: true,
fullscreen: false,
fullscreenable: true,
autoHideMenuBar: true,
webPreferences: {
contextIsolation: false,
nodeIntegration: true,
nodeIntegrationInWorker: true,
enableRemoteModule: true,
additionalArguments: ["--ignore-gpu-blacklist", path.join(app.getPath("appData"), app.getName())]
}
});
win.on("enter-full-screen", (event) => {
win.webContents.send("fullscreen-entered")
})
win.on("leave-full-screen", (event) => {
win.webContents.send("fullscreen-left")
})
ipcMain.on("is-fullscreen", (event) => {
event.returnValue = win.isFullScreen();
})
// 在这里设置
win.webContents.openDevTools({ mode: 'detach' });
win.loadFile('index.html')
}
// ...于是再回到游戏根目录启动Game.exe,确实弹出了单独的一个控制台窗口。
然后我也没思路,ai说可以试试gs.Data,确实成功了,是一段极其长的代码。总之这段代码最后的意思是:
- 它首先生成了一个密钥数组:[42, 11, 22, 79, 43, 37, 14, 11, 24, 30]。
- 然后它遍历文件的每一个字节,将其与密钥数组进行异或:
e[i] = e[i] ^ s[i % s.length]。 - 这样就是解密以及加密的思路了。
于是便可以写个python很轻松地得到原来那一大堆异或后的json数据。我就不放了,反正可以很容易看出来哪些内容属于文本或是选项之类的,直接替换就好了。
还有一个小坑,这个引擎的渲染方式好像是按西文空格分行的,所以过长的中文整句需要隔多少个字手动设置一个\n,防止全堆在一整行里。替换好之后就是再异或回去成.json.js的那些文件。这些制作好的文件就可以直接当作补丁来用了,替换全部原先的文件直接就能使用。