移植冒险岛online,和小伙伴一起在局域网或私服怀旧吧
- 第零篇:进度表
- 第一篇:我要冒险岛的图片音乐资源
- 途中:后端移植C到全JS
这是一篇长期慢更的文章,以记录移植进度。
第零篇:进度表
代码先敬上:https://github.com/stallpool/maplestory
- MapleServer: 读取图片音乐资源
- MapleServer: 读取地图、活动、事件
- MapleClient: 读取图片音乐资源,绘制图片,播放音乐
- MapleClient: 绘制地图
- MapleClient: 绘制人物怪物NPC技能,动画
- MapleServer: player数据sync
- MapleServer, MapleClient: 整合,完成地图切换,爆物品等事件
- MapleClient: 登陆注册界面
- MapleServer, MapleClient: 测试,跨平台测试
- 后续完善
第一篇:我要冒险岛的图片音乐资源
盛大神话悄然落幕,乱世分久必合合久必分;如今有腾讯昂首一统半壁江山,外有各方虎踞龙盘。曾经那个冒险岛online,着实让人怀念。
其实,网上有很多搭建冒险岛私服的教程,试验下来,在如今的2020年几乎已经不太能使用了,最常见的问题就是过HackShield。怎的,想要我折寿三年,向看雪学院叩拜良久,然后破去冒险岛online原先的穿山甲壳,再逆向一下HackShield替换掉它原先的exe么。对于逆向,已经荒废许久,还是放下吧。何况网络上的maplestory world server都是java写的,再配合个mysql,有点重型。加上maplestory都是windows程序,放虚拟机里运行,还得想办法改虚拟机的配置,躲开它的虚机识别,这也太不便利。
不过有需要的同学请使用下面的链接自行搭建:
MapleStory server (额外:需要翻墙去Google Storage下载v083游戏资源文件,7、8GB吧)
MapleStory client (从0实现的client,没有hack shield,但是懒得去学习其配置了)
能不能开个网页就能玩呢?
在调研的时候,那个C#的 WzComparerR2 深得我心,可以随意导出任意资源。而且,下载了最新的冒险岛online客户端安装后,这个程序依旧可以dump。就是不在windows上的话,得弄个Mono…有点小失望。
于是就开始想用Golang将它移植一番。边写边开小差。偶然间,搜到了 wz 这个C写的项目。虽然编译的时候语法各种error(老代码和新编译器不兼容),但是好在编译了以后可以使用了。兴致一来,就加了个dump功能,可以把数据存出来了。但是wz是可以从官网拿到更新的,dump太费劲,弄个server读就好很多。
忽然想起 ttyd 的依赖 libwebsockets。把wz套上websocket不就可以从web端读了嘛。从libwebsockets里取出那个echo server,改成接到指令,输出数据就好了。
其实实现并不复杂,就是期间有一些小坑需要填填。最开始的版本,也不用那么考虑security,最多后面加个basic auth。而且目的是想着好友间一起玩,最好是局域网的,所以不用那么复杂,还防啥外挂… server有了,后面就是慢慢整web端了。先写了个简单的resource manager用来从server读数据。这样就可以读音乐播放,读图片拼接sprite了。要用cocos2d么?容我想想。
途中:后端移植C到全JS
终于算是有了点时间回来看看冒险岛的开发,换了电脑,重新部署,发现里面的东西一个坑接着一个坑,而且在Linux竟然原来在Windows和MacOS上跑没有问题的地方也都出现了或多或少的问题,用一个C编译的东西调试起来怎么都不太方便,各种printf
,因为libwz
的原因还不时segmentation fault。为了更好地维护这个项目,决定干掉这些c相关代码,本来想用go,但调试起来也很麻烦,全js吧。用emscripten可以很快把c转为js,但是不可编辑,所以开始读代码,重新把libwz
完全用js实现。花了一个周末的时间,2000多行的代码终于转化成js了,顺带删除了websocket,将api降解为restful的形式。也重新把web ui端的代码和新的api适配。搞定,休息一下,看看下面来整地图模型。