时间:2026-01-31 15:22
人气:
作者:admin
中文名:AA游戏脚本
英文名:AA Game Script
简 称:AA脚本(AAGS)
作 者:ygluu(码客)
WeChat: 48092788
AA脚本旨为:为游戏提供一种更加简单而又灵活的通用配置方式。
注:
1、命名无任何含义仅是标识符
2、本人在其他博文中提到的数据名,在本文中统称为变量名,两者等效
3、本文亦是本人过去博客知识点的系统化总结(相关参考见附录6)
4、本脚本为通用脚本,不局限于任何游戏类型
5、恕作者见识有限,如有雷同纯属巧合,请留言必删之
附图 条件系统原理:

系统支撑
AA脚本的系统支撑实现原理参考附录6《万物皆ID、万事皆事件、万人皆数据》。
AA脚本有两种平台解析方式可选:
1、用工具将配置表按接口规范预先翻译成lua脚本(参考附录6《data-e》的lua部分)。
2、用高级语言在游戏启动时解析成程序对象(参考附录6《data-e》的golang部分)。
注:AA脚本解决多数日常策划需求,少数复杂需求可由Lua脚本实现。
在游戏开发当中,多数策划配置需求不外乎:当什么条件满足时做什么事情,而游戏有他独有的数据形态从而造就了一种既定模式,所以本文将这种模式抽象为ON-DO模型。
ON-DO模型概念词汇:
ON:在某种条件达成的时候
DO:做什么事情
Cond:条件表达式,如:(A>10)&(B<0)
Act:动作表达式,如:A+11;B-10
ON表达式、Cond表达式、条件表达式三者概念等同。
DO表达式、Act表达式、动作表达式三者概念等同。
ON-DO模型三步骤:
1、定义变量
2、完善条件函数和编写条件表达式
3、完善动作函数和编写动作表达式
四则运算:+ - * /
如:玩家等级>10 & (今日杀怪 + 昨日杀怪) > 200
比较运算:> => = < <=
注:
1、事件判断:事件=进入地图,表示单一事件,多事件可调用事件函数:事件(进入地图,杀怪)
2、判断等于只需要一个等于号
逻辑运算:& | and or
优先级:( )
变量: 见附录变量表
函数: 见附录函数库
常量:abc 123 true ...
消耗动作(减号):-
注:减号表示能够扣减指定的物品(系统自动识别物品操作)或数据,如:玩家等级>=10 & 入场卷-10 & 金币-20,也可以使用消耗函数。
示例:
示例1:日期>=2023-01-01 & 时间>18:00:00 & 事件(进入地图) & 地图(名称,花山)
示例2:等级>=10 & 金币-10 & 上山卡-20
示例3:等级>=20 & (金币-30 | 上山卡-30)
示例4:当前地图=花山 & 杀恶犬>=100
四则运算:+ - * /
如:幸运值=(取属性(怪物,幸运值)+取属性(地图,幸运值)+取属性(物品,幸运值)+玩家幸运值) / 3 * 1.3
累计运算:+ - * / += -= *= /=
如:金币+10;金币+=10,均表示金币累加10
赋值(置位)(等于号或冒号均可):= :
分隔符(分号):;
优先级:( )
函数:见附录函数库,含触发事件函数:触发(XXX)
示例:
示例1:攻击+100;防御+20
示例2: 金币+20;灵芝+20
示例3:消耗(金币:100,银币:200);跳转(南天门,103,304) // 函数参数规范由函数定义
示例4:奖励(金币:100,银币:200);奖励(1001) // 奖励包里的配置ID
示例5: 充值=188;触发(充值) // 设置充值变量,触发充值事件
示例6: 地图=Map.Name;怪物=Mon.Name;怪物类型=红怪;触发(杀怪) // 设置杀怪数据,触发杀怪事件
注:
1、动作表达式包含了数据的操作、物品的奖励和事件触发等,如果有物品奖励系统会自动区分哪些是物品并结合背包空间来执行奖励。
2、触发事件是AA脚本的核心,他会触发关联条件的判断和动作执行。
流程控制是ON-DO表达式对组合的文本文件,如:ctrl.aa,默认逐对执行。ON-OR和DO-OR表达式对是或关系,两对或多对时表示任意一对满足即可,单对仍然还是“与”关系。
示例:活动表达式
Name:每日BOSSON: 时间>=18:25
DO:
创建地图(花山, 安全地图=1) // 地图设置为非战斗状态
刷怪(巨兽, x, y, z)
入口图标(花山); 跑马灯(巨兽出来捣乱了,快来击杀它吧!)
聊天(世界频道, 巨兽出来捣乱了,快来击杀它吧!)ON: 时间>=18:30
DO:
地图变量(花山, 安全地图=0) // 18:30开始战斗
跑马灯(巨兽出来捣乱了,快来击杀它吧!)
聊天(世界频道, 巨兽出来捣乱了,快来击杀它吧!)// 如果超时则
ON-OR: 时间>=19:00
DO-OR: GOTO(清场)// 如果死亡则
ON-OR: 死亡怪物=巨兽
DO-OR: 奖励(金币:100,药水1000);GOTO(清场)Label:清场
// label之后无条件的可以不写表达式, 也可以不写ON:
ON:
DO: 清场()
注:配置表泛指电子表格之类的文档
int : 64位有符号整形
bool : 布尔型
string : 字符串型
Cond : 条件表达式
Act : 动作表达式
Ctrl: 流程控制表达式
arr : 数组, 类型由第一个元素的基础字段类型决定,可自嵌套,如:{{1,3},{3,4}}
map : key-value键值对哈希表,key类型可为int和string,value类型位基本字段类型,可自嵌套和嵌套arr,如:{{a=1,b=2},{a=A,b=B},{a=3,b={1,2,3,4}}}
CfgId : int,配置ID,全局唯一,int64可规划好各表的ID分段范围,表内自增,不填则系统默认使用CfgName字段的crc64值,碰撞则提示改名
注:
1、如果需要分组设置的,每1万一个ID段,如2组ID:1000010000,3组ID:100001000010000, 即可根据分组信息获取配置内容
2、要规划号ID段分配才能保证全局唯一,或自行使用ieee_crc64算法计算。
3、模块化分表配置无法确保CfgID全局唯一的可以缺省不填,系统自动使用ieee_crc64算法来计算,配置的时候使用CfgName来配置即可。
CfgName : string,配置名,全局唯一,必填,字符串型
CfgType : int,配置类型,如:药材、货币、武器、服装、红怪、
CfgFlag :int,配置标志,即CfgType的细分
ShowName : string,显示名称,用于UI多国语言等,不填则默认使用CfgName,如果多国语言使用“/”分隔
如:货币/money/머니,可根据设定的语言索引号获取
Prop : map,该配置对象具有的自身属性
如地图表:{可穿人=false,可穿怪=false,魔性=20}
注:地图属性“魔性”是结合怪物和玩家死亡数量用公式计算得出的数值,魔性越大玩家行为会缓慢、技能命中率会降低等。
Attr : map,表示拥有者获得的属性加成等,如物品表:{防御+100,攻击+200}
Cond : Cond,条件表示式
Act : Act,动作表达式,条件达成均执行
表格第一格第一个字符是“/”、“#”、“;”之一的表示该行为注释
第1个非注释的行表示字段名
第2个非注释的行表示字段类型
第3个非注释的行表示该字段的归属,即是由客户服务端谁来支配使用的,c表示客户端,s表示服务端,cs表示客户服务端
从第4个非注释的行开始为数据部分
配置表示例:

注:地图表的Cond是进入地图的条件
变量表:var.xlsx

CfgId : 变量ID,如果不填则使用CfgName计算CRC64,碰撞则提示改名
CfgName : 变量名,用于配置描述,全局唯一
ShowName : 显示名,用于UI等,不填默认等于CfgName
如:货币/money/머니,可根据设定的语言索引号获取
Reset : int,重置周期,用于周期性变量复位为初始化,不填和0表示不重置,1:每日重置,2:每周重置,3:每月重置,4:每年重置
如变量:每日杀怪、周充值、月充值等
Valid : int,有效期,过期后系统不再存储这些变量,不填或0表示永久有效,最终表现形式是失效秒时间戳
如:“10月1~10月10日”表示每年国庆有效,10月10日后系统不再存储这些变量
Cond :条件表达式,非空则系统会依据条件执行Act动作表达式,用于变量自身的累计计算
Act : CfgName的赋值动作表达式
注:变量表的动作表达式一般只对CfgName的赋值操作,不应该做其它操作
如周充值变量:ON:事件=充值,DO:周充值+=当前充值
如周充值变量:ON:事件=充值,DO:月充值+=当前充值
如每日杀怪变量:ON:事件=杀怪,DO:每日杀怪+1
Init : 初始值,不填默认0,整形值有效
Min : 最小值,不填默认0,整形值有效
Max : 最大值,不填默认int64的最大值,整形值有效
注:
变量类型有string、int64、obj,无需定义设定,以最后一次赋值的类型为准。
事实上任务系统是比较复杂的养成线系统,养成线有一个特征是逐级升阶,且养成线一般有属性加成(上线重算)和物品奖励(一次性)。
用“模块名”+“等级”作为等级变量,每次升级则自增,如模块“赏金猎人”的模块等级变量是:赏金猎人等级
字段:Cond
字段:Act
如下表:

注:动作表达式包含了数据的操作和物品的奖励,系统会自动区分哪些是物品并结合背包空间来执行奖励。
如果一对ON-DO模式不能满足要求的则使用本模式。
字段:Cond1
字段:Act1
字段:Cond2
字段:Act2
条件Cond1满足了一次性执行动作Act1,条件Cond2满足了一次性执行动作Act2,两者以“或”关系执行(最大可能两者都满足)
第1对可以用于基础数据的计算,如:ON:事件=杀怪 & 地图=南天门,DO: 今日杀怪+1,
第2对则用第1对的数据作为条件,如:ON:今日杀怪>20,DO: 金币+20;药材+20
如下表:

注:动作表达式包含了数据的操作和物品的奖励,系统会自动区分哪些是物品并结合背包空间来执行奖励。
如果两对ON-DO模式不能满足要求的则使用本模式。
字段:Ctrl
注:动作表达式包含了数据的操作和物品的奖励,系统会自动区分哪些是物品并结合背包空间来执行奖励。
字段:Attr map
注:任务系统没有attr字段,玩家属性加成计算的时候可以根据模块等级获取其值。
养成线(成长线)升级一定要在最后一个Act表达式的最后一句调用触发函数来触发升级事件,如金刀手模块:xxx;xxx;触发(金刀手升级)
可根据需求选择选择上述3中模式之一实现配置。
函数名(参数1,参数2,..)
注意:
1、所有函数默认返回int64,0表示失败,等于布尔值的false
2、函数参数规范由各函数定义
每个类型的配置表都可以有同名子表或主表名作为前缀子表的分布在各个模块目录里,由系统自动合并加载,如下图所示:

可以采用以下两个方法之一来给ID编排:
1、各个子表规范好ID段然后自增
2、不填CfgId,让系统自动使用IEEE_CRC64计算
模块独立的变量应以模块名作为前缀,如赏金猎人模块:赏金_等级、赏金_杀怪、赏金_日杀怪...
•时间
•日期
•时间日期
•年
•月
•日
•天
•星期
•时
•分
•秒
•地图 // 当前所在地图
•X // 当前位置X坐标
•Y // 当前位置Y坐标
•Z // 当前位置Z坐标
•充值 // 当前充值变量,亦即最后一次充值
可自行补充完善
•跨年 // 时间信息改变
•跨月
•跨天
•跨周
•跨时
•跨分
•跨秒
•上线
•下线
•断线
•进入地图
•离开地图
•死亡 // 被对手杀死
•杀死 // 刚刚杀死一个对手
•复活
•走
•跑
•跳
•飞
•路过 // 从对方x距离走过
•碰、对话 // 碰到对方、对话
•踩、穿 // 踩到或穿过对方
可自行补充完善
公共函数库可以在条件表达式(Cond)和动作表达式(Act)中使用
•取属性(对象类型, 属性名) // 取当前操作的物品配置的Prop字段
如:取属性(地图, 属性名) // 取当前地图属性
如:取属性(对方, 属性名) // 取PK对方的属性
•消耗(A:100,B:200,...) // 消耗物品,返回0表示成功
可自行补充完善
条件函数只能在条件表达式(Cond)中使用
•事件(A,B,...) // 判断当前事件是否在所列的事件列表中
可自行补充完善
动作函数只能在动作表达式(Act)中使用
•触发(A,B,...) // 依次触发所列事件,触发流程:事件=A;调用监听回调;事件=0
•奖励(A:100,B:200,...)、奖励(10003) // 调用ID指定的奖励包设定实现
•刷怪(伏地魔,1,203,235)、刷怪(80001) // 调用ID指定的帅怪设定实现
•跳转(南天门,304,208)、跳转(南天门,304,208,10)// 指定范围随机
•复活(南天门,304,208)、复活() // 原地复活
•走(304,256) // 由原点到目标点
•跑(304,256)
•跳(304,256)
•飞(304,256,503) // 由原点到目标3D点
•公告(Txt) // Txt 支持富文本
•跑马灯(Txt)
•聊天(频道,Txt)
•显示入口图标(图标编号) // 在客户端显示入口图标,图标编号由入口图标表提供
可自行补充完善
《通用数据引擎(data-e)及其在模块化游戏开发中的应用构想图解》:
https://blog.csdn.net/guestcode/article/details/139897257
《万物皆ID、万事皆事件、万人皆数据》:
https://www.cnblogs.com/ygluu/p/19117836