博客 / 詳情

返回

AA遊戲腳本規範(AA Game Script)

1 介紹

中文名:AA遊戲腳本
英文名:AA Game Script
簡 稱:AA腳本(AAGS)
作 者:ygluu(碼客)
WeChat: 48092788

AA腳本旨為:為遊戲提供一種更加簡單而又靈活的通用配置方式


1、命名無任何含義僅是標識符
2、本人在其他博文中提到的數據名,在本文中統稱為變量名,兩者等效
3、本文亦是本人過去博客知識點的系統化總結(相關參考見附錄3)
4、本腳本為通用腳本,不侷限於任何遊戲類型
5、恕作者見識有限,如有雷同純屬巧合,請留言必刪之

附圖 條件系統原理:
image

系統支撐
AA腳本的系統支撐實現原理參考附錄6《萬物皆ID、萬事皆事件、萬人皆數據》。
AA腳本有兩種平台解析方式可選:
1、用工具將配置表按接口規範預先翻譯成lua腳本(參考附錄5《data-e》的lua部分)。
2、用高級語言在遊戲啓動時解析成程序對象(參考附錄5《data-e》的golang部分)。
注:AA腳本解決多數日常策劃需求,少數複雜需求可由Lua腳本實現。

2 ON-DO模型

在遊戲開發當中,多數策劃配置需求不外乎:當什麼條件滿足時做什麼事情,而遊戲有他獨有的數據形態從而造就了一種既定模式,所以本文將這種模式抽象為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、完善動作函數和編寫動作表達式

3 條件表達式規範

四則運算:+ - * /
如:玩家等級>10 & (今日殺怪 + 昨日殺怪) > 200
比較運算:> => = < <=
注:事件判斷:事件=進入地圖,表示單一事件,多事件可調用事件函數:事件(進入地圖,殺怪)
邏輯運算:& | 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

4 動作表達式規範

四則運算:+ - * /
如:幸運值=(取屬性(怪物,幸運值)+取屬性(地圖,幸運值)+取屬性(物品,幸運值)+玩家幸運值) / 3 * 1.3
累計運算:+ - * / += -= *= /=
如:金幣+10;金幣+=10,均表示金幣累加10
賦值(等於號或冒號均可):= :
分隔符(分號):;
優先級:( )
函數:見附錄函數庫,含觸發事件函數:事件(XXX)

示例:

示例1:攻擊+100;防禦+20
示例2: 金幣+20;靈芝+20
示例3:消耗(金幣:100,銀幣:200);跳轉(南天門,103,304) // 函數參數規範由函數定義
示例4:獎勵(金幣:100,銀幣:200);獎勵(1001) // 獎勵包裏的配置ID
示例6: 充值=188;事件(充值) // 設置充值變量,觸發充值事件
示例6: 地圖=Map.Name;怪物=Mon.Name;怪物類型=紅怪;事件(殺怪) // 設置殺怪數據,觸發殺怪事件

注:
1、動作表達式包含了數據的操作、物品的獎勵和事件觸發等,如果有物品獎勵系統會自動區分哪些是物品並結合揹包空間來執行獎勵。
2、觸發事件是AA腳本的核心,他會觸發關聯條件的判斷和動作執行。

5 流程控制表達式規範(活動系統設計規範)

流程控制是ON-DO表達式對組合的文本文件,如:ctrl.aa,默認逐對執行。ON-OR和DO-OR表達式對是或關係,兩對或多對時表示任意一對滿足即可,單對仍然還是“與”關係。
示例:活動表達式

Name:每日BOSS

ON: 時間>=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: 清場()

6 配置表規範

注:配置表泛指電子表格之類的文檔

基礎字段類型:

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個非註釋的行開始為數據部分

配置表示例:
image
注:地圖表的Cond是進入地圖的條件

7 變量定義規範

變量表:var.xlsx
image

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,無需定義設定,以最後一次賦值的類型為準。

8 養成線系統設計規範

事實上任務系統是比較複雜的養成線系統,養成線有一個特徵是逐級升階,且養成線一般有屬性加成(上線重算)和物品獎勵(一次性),並觸發升級事件。

等級自增

用“模塊名”+“等級”作為等級變量,每次升級則自增,如模塊“賞金獵人”的模塊等級變量是:賞金獵人等級

一對ON-DO模式:

字段:Cond
字段:Act
如下表:
image

注:動作表達式包含了數據的操作和物品的獎勵,系統會自動區分哪些是物品並結合揹包空間來執行獎勵。

兩對ON-DO模式

如果一對ON-DO模式不能滿足要求的則使用本模式。
字段:Cond1
字段:Act1
字段:Cond2
字段:Act2
條件Cond1滿足了一次性執行動作Act1,條件Cond2滿足了一次性執行動作Act2,兩者以“或”關係執行(最大可能兩者都滿足)
第1對可以用於基礎數據的計算,如:ON:事件=殺怪 & 地圖=南天門,DO: 今日殺怪+1,
第2對則用第1對的數據作為條件,如:ON:今日殺怪>20,DO: 金幣+20;藥材+20
如下表:
image

注:動作表達式包含了數據的操作和物品的獎勵,系統會自動區分哪些是物品並結合揹包空間來執行獎勵。

流程控制類型模式(比較複雜的需求)

如果兩對ON-DO模式不能滿足要求的則使用本模式。
字段:Ctrl

注:動作表達式包含了數據的操作和物品的獎勵,系統會自動區分哪些是物品並結合揹包空間來執行獎勵。

屬性加成

字段:Attr map
注:任務系統沒有attr字段,玩家屬性加成計算的時候可以根據模塊等級獲取其值。

可根據需求選擇選擇上述3中模式之一實現配置。

9 函數定義規範

函數名(參數1,參數2,..)
注意
1、所有函數默認返回int64,0表示失敗,等於布爾值的false
2、函數參數規範由各函數定義

附錄1 變量庫

•時間
•日期
•時間日期
•年
•月
•日
•天
•星期
•時
•分
•秒
•地圖 // 當前所在地圖
•X // 當前位置X座標
•Y // 當前位置Y座標
•Z // 當前位置Z座標
•充值 // 當前充值變量,亦即最後一次充值

可自行補充完善

附錄2 事件庫

•年 // 時間信息改變
•月
•日
•天
•星期
•時
•分
•秒
•上線
•下線
•斷線
•進入地圖
•離開地圖
•死亡 // 被對手殺死
•殺死 // 剛剛殺死一個對手
•復活
•走
•跑
•跳
•飛
•路過 // 從對方x距離走過
•碰、對話 // 碰到對方、對話
•踩、穿 // 踩到或穿過對方

可自行補充完善

附錄3 公共函數庫

•取屬性(對象類型, 屬性名) // 取當前操作的物品配置的Prop字段
如:取屬性(地圖, 屬性名) // 取當前地圖屬性
如:取屬性(對方, 屬性名) // 取PK對方的屬性
•消耗(A:100,B:200,...) // 消耗物品,返回0表示成功

可自行補充完善

附錄4 條件函數庫

•事件(A,B,...) // 判斷事件是否包含所列值

可自行補充完善

附錄5 動作函數庫

•觸發(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點

可自行補充完善

附錄6 相關參考鏈接

《通用數據引擎(data-e)及其在模塊化遊戲開發中的應用構想圖解》:
https://blog.csdn.net/guestcode/article/details/139897257

《萬物皆ID、萬事皆事件、萬人皆數據》:
https://www.cnblogs.com/ygluu/p/19117836

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.