1. 写在前面#

所以说你最终通达了拓展制作之道,想要来做一些更酷的事情?这一部分就是为了让你对新月杀的了解更上一层楼而编写的哦。

这些文档的目的是带你对新月杀底层有进一步了解。当然了,不可能再像之前拓展教程讲的那么详细啦,咱们只挑关键的说明,更多细节就请自己在代码中寻找答案吧。

1.1. 新月杀架构略图#

在开始之前,让我们先对新月杀的架构有一个略微的了解吧。新月杀是一个C/S架构的程序,说明至少有两套架构(其实也差不多)。虽然代码仍然会更新,但是架构是基本不会变化的咯。

@startuml
!theme plain
skinparam lineType ortho
skinparam componentStyle rectangle
'left to right direction

component "Base" as base {
  [Lua核心(lua/core)] as Core
  [客户端] as Client
  [服务端] as Server
}
[C++底层] as cpp
() "fk_ex.lua" as API
[拓展包] as Extension

Core --> cpp
Client --> Core
Server --> Core
Client -[hidden]r- Server
base -u- API
Extension -- API

note left of cpp
  拓展包管理、网络连接与通信协议
  用户管理、房间管理与调度
  数据库、与Lua和QML交互的代码
end note

note as N1
  武将、技能、卡牌、游戏模式基类的定义
  Engine,保存所有已加载的上述内容
  游戏房间与UI逻辑的模拟
  以及调试器等其他实用组件、第三方库
end note

N1 .. Core

note as N2 
  界面代码,供QML调用的Lua函数等
  用于处理服务端信息并交由玩家进行交互的代码
  一个游戏房间,表示玩家(客户端)当前的房间
end note

N2 .. Client

note right of Server
  事件的结算规则,触发时机的触发,各类预定义的事件
  所有的游戏房间,游戏房间的调度规则
  与玩家进行交互,或者令机器人作出决策的代码
end note

note right of API
  仿照太阳神三国杀设计的用于拓展的API
end note

note right of Extension
  各类自定义的武将、技能、卡牌、模式,以及更多……
end note
@enduml

此外服务端的线程模型也值得注意,如图:

../_images/intro-thread.svg
  • 主线程:负责处理用户登录、发送房间列表等与游戏无关的事情。

  • Lua线程:负责所有的游戏逻辑。服务端有很多房间同时运行着,其中每个房间都对应一个Lua协程。

此外还有一个心跳包线程和服务端Shell线程,这俩因为不重要就不提了。

1.2. 参与到新月杀本体的贡献之中#

最开始拟定框架的时候就确定了“本体精简到只含标准包,其他拓展包作为单独仓库”。为了方便玩家下载,拓展包都直接放在Gitee中,不过本体本身一直在Github维护。 Qsgs-Fans/FreeKill

当然了,还是为了方便下载,Gitee上一样有一个本体的镜像仓库: https://gitee.com/notify-ctrl/FreeKill 但是这个仓库的master比Github要落后,只在发生版本更新的时候才会同步一次。

若想贡献本体的代码,需要走Fork+PR的流程。肯定是建议在github上发起PR,但是实在连不上Github的话,在Gitee发起PR也行。还是建议想办法连一下Github。