lua脚本#
神杀的接口并不会直接外露,特别是程序环境,神杀的大部分外露接口都在lua和lua绑定上。将lua与程序环境进行绑定的方法是使用swig,其代码位于根目录下swig文件中,其使得诸如Ai、Card、Skill、General、Player、Room等对象可以在lua中使用,从而使得扩展具有较强的功能性。而单纯的lua代码则是执行过的三个文件config.lua
、sanguosha.lua
和smart-ai.lua
,第一个用于配置界面与游戏无关,所以我们主要来研究后面两个。
sanguosha.lua#
无论是swig绑定还是脚本执行,所有的lua方法全都集中在sgs模块之中。在sanguosha.lua
的开始,脚本会依次执行utilities.lua
和sgs_ex.lua
,这两个脚本都是用来引入相关方法函数的,前者为列表表格之类的工具,后者为扩展使用的工具类,例如创建技能、创建卡牌等函数均在其中,当然这一层只是单纯的lua接口包装。例如sgs.CreateTriggerSkill
函数其内部调用的是sgs.LuaTriggerSkill
,这个函数又定义在swig/luaskills.i
用于与C++原生代码绑定,而最后的实现则是位于src/core/lua-wrapper.cpp
中,确实有点一波三折。
下一句添加翻译加载函数(翻译位于lang/zh_CN/
下)和扩展加载函数(扩展位于extensions/
下),然后执行代码,如果配置了允许lua就执行load_extensions
来加载lua扩展。接着添加了一些boss相关的函数,好像就那样,最后再告知程序环境,加载完毕。由此我们可以发现,这个脚本并不涉及游戏本体,只是用来添加扩展环境和给游戏添加扩展用的。至于怎么用lua写扩展,随便搜搜应该就有,各种API的知识也可以从中获得,所以就这样过了吧。
smart-ai.lua#
从名字就能看出来吧,这玩意肯定和ai相关了,实际上它会把lua/ai/
下的每一个文件都执行一遍,从而为每种卡片、角色和情景等提供ai。至于ai的基本原理,所有的三国杀系列基本都是相同的,即对于每一个事件,将本来由玩家做出选择的地方,通过机械化的代码来实现。因此ai的书写往往都不是直接以玩家为单位的,而是对于每一个能出现事件的地方,包括出牌、响应牌、使用技能、武将选择技能等各各方面。总之,就是这么一回事,不想说太多了。