动机
首先要说一点,FreeKill本质上是接着太阳神三国杀新版框架(参见GitHub上的QSanguosha-new-framework)继续开发而成的。在cpp源码的网络通信这块,以及绝大部分QML界面,都大量的借用了它的代码,这也是FK必须用GPL3协议的原因。
在下决心开发FK之前,我做过别的方向的探索,就是用QSanguosha-v2的核心代码,缝合上QML的UI界面,以期实现QSanguosha的Qt版本更新。这个探索最终以失败告终。
不过在探索QSanguosha重构UI的时候积累了QML,所以开始打算开坑。
底层通信
直接抄呗,大抄特抄。不过他们的代码仍然有Bug,在调试的时候令人想死
UI
最开始都是抄的,好在自己开始慢慢看得懂了,现在想怎么拓展怎么拓展
游戏逻辑
这块就完全没抄的了,最后决定是用Lua实现游戏逻辑。
最开始的时候,打算Client里面一个lua_State,Server里面一个lua_State,Server的lua_State同时多线程跑很多Room。
于是Server大炸特炸,故改为每个Room(一个Room就是一个线程)一个lua_State。看起来还不错
对于Lua代码的执行,从神杀照抄了DoLuaScript(基本上就是在指定的L里面执行dofile函数)。这也就是说,DoLuaScript可以视为Lua程序的入口。在双端都先执行freekill.lua,然后根据Client和Room,分别执行不同的Lua
初次执行Lua并不跑起来代码,只是算是初始化而已。自此,Client的Lua在大部分时间都在睡觉,偶尔处理一下服务端的消息;服务端则基本一直是忙碌的,从Room::start开始就没闲过。当主函数返回时,Room线程也随之返回,然后被销毁掉。
freekill.lua做了啥?
如同其注释,它是初始化整个游戏引擎用的,具体而言就是从文件中加载了一堆类之类的东西,最后实例化Engine到全局变量Fk中。Engine的构造函数中,loadPackages就加载了所有包。
loadPackages的内容大概就是去packages下面找各种init.lua,找到就读取。然后里面还写死了先加载两个标包。
freekill.lua在实例化Engine之前还先读取了fk_ex,lua。这个文件实际上就是对标神杀Lua的,纯属对神杀的情怀,实际上这个文件就算删了问题也不大,不过已经形成规范了就算了(我本来还指望靠这样多拉一点神杀luaer来,结果拉到了不少无名杀js作者,总有点感觉苦心白费了
读了fk_ex之后就能正常加载包了。包里面就是一堆武将卡牌之类的东西罢了
更多的详见dev/doc吧,摆了