昨天完善创建角色的游戏服务端逻辑。创建角色失败时,服务端要告知客户端具体的错误原因——比如角色名不可用,或SQL语句错误等。代码中原有的思路是,向客户端发一个ID为CREATE_PLAYER_ERR的包(这个ID是应用层的协议),包内含有具体的错误码,客户端在CREATE_PLAYER_ERR包的处理函数中根据错误码向玩家显示具体的出错消息。
我们的服务端是由C++和lua编写,客户端则是用C#编写。包的ID写在一份lua文件中,叫msg.lua。项目构建时,会根据msg.lua生成相应的.h和.cs文件,这样C++代码和C#代码就可以直接在代码中书写CREATE_PLAYER_ERR这样的ID,而不用写ID数值这样的magic number。但是像错误码这样的二层协议却没有这样相应的自动生成机制。错误码的ID(如CREATE_PLAYER_NAME_INVALID)只在lua中可用,C++和C#里则只能使用ID的数值,比如 if (errcode == 2)这样。
我在编码时是很难容忍magic number的,然而又不想大动干戈地为错误码添加自动生成机制。因此就对报错逻辑进行了改动,利用msg.lua,将不同的错误原因编码成不同的包ID,不再采用错误码。这样创建角色的过程中,遇到不同错误时,就发不同的包。