0%

在服务器上搭建我的ONS游戏站

服务器搭好了,就不能让它闲着没有事做,我又想起了我高中时候的童年高中当然也能算童年,那时候我在学校用着树莓派玩ONS移植版的galgame的美好岁月,刚好22年的时候看见GitHub上有个叫onsyuri的项目(作者还是国人),把ons移植到了web端,这次我就用这个项目把ons游戏全部部署到网页上,在校园网下可以点这里去看看。

onsyuri简介

项目地址:onsyuri

WebAssembly

说到这个就不得不说一个很神奇的技术————WebAssembly。WebAssembly简称WASM,按照我的理解就是,将其他语言编写的程序编译成能够在web上调用的二进制程序,效率方面有些文章说编译过的二进制程序比解释型语言的运行效率高,也有文章说js在有了JIT(即时编译)之后运行效率比wasm高(据说是有些参数是在运行时确定的,在那些参数确定之后就把经常调用的函数编译了,也能接近原生的效率)。不过除了效率,wasm最重要的特性还是可移植性,这才是重点,onscripter最初是C语言+SDL(一个图形库)编写的,后面国人优化的能显示中文的版本onscripter-jh是C++和SDL2(可以在编译参数里面选版本)编写。

emscripten

emscripten是一个用于将C/C++代码编译为Wasm字节码的工具链,onsyuri也是通过这个工具链将onscripter移植到web端的。我最早知道emscripten还是在PainterEngine的教程里面,其实当时我就想过或许可以把onscripter移植到web,当时还是21年,我比onsyuri的作者还早一年有这个想法,但是我能力还是不足,我直接将onscripter-jh的代码通过emscripten编译,好像也是能运行,但是每次进游戏就要下几百MB的数据包,这是我很不能接受的,后面我也在想办法解决,然后知道了懒加载,然后去看emscripten实现懒加载,试图自己修改代码实现懒加载,然后就是神坑。但是onsyuri实现了懒加载,简直是太完美了。

onsyuri使用

不会配工具链的就直接去GitHub上下载作者编译好的,以前我配过EMSDK,还是挺麻烦的,既然有现成的最好不要自己折腾了。

  1. 下载一个ons移植版的游戏并解压
  2. 下载onsyuri_web并解压
  3. 将onsyuri_web里的文件全部复制到ons游戏目录内
  4. 运行python onsyuri_index.py
  5. 通过浏览器打开游戏目录下的html文件,就可以在浏览器玩galgame了

如果只是按照上面的步骤,那你一定会跟我以前一样,要在加载界面下个几百MB甚至上G的文件,非常影响体验,使用懒加载就麻烦一亿点,我们需要把资源拆包,然后在运行时懒加载。

  1. 去GitHub下载onscripter-jh
  2. 安装各种依赖
  3. 根据自己的平台选择Makefile文件,编译nsadec(用于拆nsa包)
  4. 将编译好的nsadec复制到游戏目录下
  5. 运行nsadec将所有.nsa拆包,这时候游戏目录下应该有很多资源文件,想提取CG和BGM的可以自行复制走。
  6. 删除解压过的nsa包和nsadec
  7. 运行python onsyuri_index.py --lazyload
  8. 通过浏览器运行,这时候已经加载速度快很多了,那就是使用了懒加载。

一些可能出现的问题,如果你运行的游戏名字带有大写字母(空格会不会有问题不清楚,因为Linux下处理空格很麻烦,我先把所有的空格都换成下划线了),有可能会在运行之后出现文件系统错误,解决办法有两种:

  1. 改游戏名,然后重新运行python onsyuri_index.py --lazyload
  2. 修改生成的onsyuri_index.json,将gamedirsavedir里面的大写都改成小写

过程

我拿出了我很多年前无意中找到的神奇种子,那里面有100多G的ons移植版galgame(不全是ons移植版,有些是ons再打包成了apk的,我不会处理就删了),以前我都不敢全部下载,这次我直接挂服务器上全下了!主打一个暴力。上面的步骤看起来很简单,但是即使删除部分APk的,也有150多个要处理,要是让我一个个处理,人会疯掉的,于是我又翻出我死去的bash记忆,先编写了批量解压脚本。为什么是先呢,因为这些东西的命名太他妈不规范了,到处都是空格还有各种英文标点如[]()!?*,这些东西bash脚本处理起来非常麻烦,我批量解压之后,先把连压缩包名都带着空格的手动解压了,然后看着150多个奇形怪状的目录陷入沉思,至少在我的认知里面,应该没有一种正则表达式能够正确的处理这堆目录了,最后我只能用vim一个个手动改名字(万物皆可vim),然后再编写bash脚本批量处理,然后丢着服务器自己处理就去睡觉了。然后早上中午起来检查才发现的上面说的大写字母的问题,然后又是脚本把onsyuri_index.json全改小写了,之后就是手动去重了一下,然后抽样检测了一下应该没有别的问题了。

最终

最后,我拿出了我丑丑的域名xsjj.eu.org,把它DNS指向了我服务器校园网IP,同时整了一下nginx,现在在校园网下可以通过我的域名访问我的博客和ons游戏站了。先声明,里面的游戏我也只玩过几个出名的,这个大合集包含但不限于“全年龄,小黄油,拔作,猎奇,神魔器”,点击需谨慎,以免受到无法承受的精神攻击。我玩完的几个觉得比较好的如下:

  1. CLANNAD(动画比较出名,但是游戏路线就,我不好说)
  2. Ever17(悬疑类,没有玩过这类型的应该是猜不到结局的)
  3. eden*(小短篇,故事还是很好的)
  4. G线上的魔王
  5. 秽翼的尤斯蒂娅
  6. 纯白交响曲
  7. 水仙1+2(超小短篇)
  8. 美少女万华镜1(拔作警告)
  9. 妹调(神魔器警告,拔作警告,我都不想说我玩过这个)
  10. 沙耶之歌(神魔器警告,画面会造成精神攻击,但是故事挺好)
  11. 美好的每一天(神魔器警告,我他妈吹爆)