[心得指南][討論] Bank檔案解讀與分析應用

Galaxy Map Editor

版主: crassorz, zilch

[心得指南][討論] Bank檔案解讀與分析應用

文章rexrainbow » 2010年08月01日 3:18 pm

簡介

galaxy提供一個稱做"記憶庫"("Bank")的資料型態,可以在遊戲中保存資訊,寫入至檔案中,很類似WE中的"緩存"。本文主要探討解讀bank存檔(以下稱作bank file),以及一個解讀後的分析應用例子。

文中首先會簡單說明產生bank file的方式與bank file的解讀。接著是使用python來分析bank file與一個分析的應用例子--分析galaxy的亂數產生序列。


產生bank file的方式與bank file的解讀

Bank file的產生方式:

1. 創造bank,CE中是在觸發--"記憶庫"中選擇
記憶庫 -為玩家x開啟記憶庫"ooo"

2. 寫值進入bank,這裡舉的例子是將整數寫入。
記憶庫 -將整數型(0)作為"section"區段的("key")儲存在(最後開啟的記憶庫)庫中

3. 儲存bank至檔案。
記憶庫 -儲存記憶庫(最後開啟的記憶庫)

從 1.創造bank 的方式可以得到,bank有一個自己的名稱。
從 2.寫值進入bank 的方式可以得到,數值(value)存在以按鍵(key)組成的雜湊表內,一組數值將會對應一組按鍵-- Hash(key)= value。而按鍵又以區段做分類,一個區段內含很多按鍵。
區段與按鍵都為字串型態,而儲存的數值可為整數,實數,字串等多種型態。於jass中的hash結構可將多種型態的數值儲存於同一個按鍵內,然而在galaxy的bank file似乎只保存了最後寫入的數值與型態。

當儲存bank至檔案成功後,可以在"我的文件"->"StartCraftII"->"Banks"內找到以bank名稱為檔名的bank file,副檔名為"SC2BANK"。Bank file將bank以xml的形式儲存成純文字檔,可用多數的文字編輯器開啟,例如notepad。

擷取部分bank file內容如下:
<?xml version="1.0" encoding="utf-8"?>
<Bank version="1">
<Section name="i">
<Key name="5970">
<Value int="5970"/>
</Key>
...
</Section>
</Bank>


"<Section name="i">",宣告了以下按鍵屬於區段名稱"i"。
"<Key name="5970">",宣告了以下數值屬於此按鍵名稱"5970"。
"<Value int="5970"/>",表示此數值型態為整數,值為5970。


由於本文重點在於bank file的解讀與分析。bank本身的限制,例如單人/多人遊戲時bank存入數值的數量上限,不在此討論。


Bank file分析

我使用的bank file分析工具是python script,它有現成的函數可以解析xml,並且python有數值分析以及工程繪圖函式庫,很適合製作輔助工具。

Bank file分析工具目的是將存於bank file內的xml,轉存成python的字典物件(雜湊表),再做數值分析運算。Bank file讀取函數我命名為 BankFileReader,函數介面為
回傳字典 retDict = BankFileReader(bankfile檔案路徑)
retDict內的結構為, value = retDict[section][key]

以前一段的
<Section name="i">
<Key name="5970">
<Value int="5970"/>
</Key>
...

為例:
執行BankFileReader後回傳retDict。value = retDict["i"]["5970"],即可取得Section = "i",Key = "5970"的數值,得到value = 5970。

關於python字典的操作函數,參考這裡

BankFileReader原始碼放於附檔內。


Bank file分析的應用

本結提出一個bank file分析的應用--分析galaxy的亂數序列的趨勢。

於 jass中的亂數序列似乎不被WEer所喜愛--"魔獸的random不夠random也是大家明白已久的事實" 。galaxy提供的亂數函數會不會也有相同的問題呢?

我將產生的10000個,0至100的隨機數儲存於bank file的一個區段中,以一個流水序號當按鍵。實際上bank file只儲存了前8969個數,這大概又是某個限制吧。接著再以上結的方式讀入bank file轉成python物件。

首先,取得這8969個隨機數的整體平均 = 49.7343070576。這看起來很正常。
接著是以時間來看的區域性平均值。從某個數之後的99個連續數(共100個數)的平均值的序列--
[ (0至99)/100, (1至100)/100, (2至101)/100, .... ,(8868至8967)/100, (8869至8968)/100 ]
以時間為x軸,平均值為y軸繪圖如下:
圖檔
可以看出區域的平均值不總是接近50,有的超過55,有的低於45。

再縮小區域範圍,連續10個數的平均值趨勢圖如下:
圖檔

與100個連續數值的平均相比,10個連續數值的平均的變化更大,有超過60甚至大於70,也有低於40甚至到30以下。表示某些10個連續產生的隨機數列都相當大或相當小。
如果取的區域更小,可以想像平均值的變化會更大。而這是否表示不夠"亂"呢?

我以相同的條件,在python上產生亂數並繪圖來比較。
連續100個數的平均值趨勢圖:
圖檔

連續10個數的平均值趨勢圖:
圖檔

python產生的隨機數列同樣也有過大或過小的區域平均值。

如果想避免過大或過小的區域平均值特性,得對產生的亂數再做些修改。理論上,以過去的數值修正之後產生的數符合賭徒謬誤--
隨機序列中一個事件發生的機會率與之前發生的事件有關,即其發生的機會率會隨着之前沒有發生該事件的次數而上升

,反而是不夠"隨機"了。


結論

Bank可將遊戲運行中產生的數值存成檔案,可以很容易的解讀,配合其他分析工具將能獲得更多資訊。
Let's Do Something Interesting

圖檔
頭像
rexrainbow
冰霜翼龍
冰霜翼龍
 
文章: 1696
註冊時間: 2008年10月02日 3:33 pm
來自: Taipei, Taiwan

Re: [討論] Bank檔案解讀與分析應用

文章crassorz » 2010年08月01日 3:57 pm

基本上加工隨機是拿來做平衡的
並不是什麼隨機的謬誤喔
有意義上的差別
圖檔
我決定不再對伸手牌起反應
除非很有趣
頭像
crassorz
死亡騎士
死亡騎士
 
文章: 2338
註冊時間: 2008年04月06日 5:40 pm
來自: 什麼都有的雜物間

Re: [討論] Bank檔案解讀與分析應用

文章rexrainbow » 2010年08月03日 7:12 am

這篇文章討論機率的概念, 在回應中提到了遊戲設計上會使用的技巧--洗牌
如果事件發生的機率不是很低的話我都習慣用shuffle(洗牌)的方法代替random(亂數), 然後按照順序一張張抽牌
但是第一個sample的位置一定要random否則使用者可以推測剩下的sample的值

並且
Shuffle 與一般的 Random 方法都各有利弊之處


想要平衡(公平), 即是讓數值均勻分布, 而越均勻的數列離理論上的隨機數列就越遠.
Let's Do Something Interesting

圖檔
頭像
rexrainbow
冰霜翼龍
冰霜翼龍
 
文章: 1696
註冊時間: 2008年10月02日 3:33 pm
來自: Taipei, Taiwan

Re: [心得指南][討論] Bank檔案解讀與分析應用

文章rexrainbow » 2010年08月20日 2:10 pm

將訊息傾印至檔案的一套工具


作者: crassorz (galaxy), rexrainbow (python)


簡介

bank file可在遊戲中儲存資訊至檔案內,可做為程式除錯之用。但一個bank file有大小限制[1]。因此我們可以切割儲存資訊,如每超過1000筆資料就重新開一個新的bank file繼續儲存,並於外部程式將分割的檔案們串回來。
本文首先說明bank file的檔案分割協定,接著是一個galaxy函數[2]實作寫入訊息後的檔案分割與儲存,最後提供一個解讀工具重組分割後的bank file並提取訊息另存。


附檔內容

\1. SC2 - galaxy (sc2地圖與galaxy函數)
BankTest.SC2Map (sc2地圖)
MessageDumper_Bank.SC2Lib (galaxy函式庫)
\sample(函數的執行結果示例)
\2. gui tool - MessageDumper.exe (解讀工具)
\MessageDumper.exe (執行檔)
\src (原始碼)

附檔包含兩個資料夾,"1. SC2 - galaxy"資料夾內含訊息寫入bank file的galaxy函式庫,可直接匯入CE編輯器,與另一個sc2地圖作為函數使用範例與執行結果。
資料夾"2. gui tool - MessageDumper.exe"為外部解讀工具,在"MessageDumper.exe"點兩下即可開啟。可利用上述範例的執行結果來測試此工具。
檔案分割協定

我們以一個簡單的協定定義分割bank file的方式:
定義bank file名稱為一個前贅字 + "x" + 序號。假設前贅字為"PRINTOUT",則分割的bank file名稱為"PRINTOUTx0","PRINTOUTx1","PRINTOUTx2","PRINTOUTx3"...。在每個bank file內,儲存最多1000個key,key名稱為流水號表示寫入順序。每存1000個key則自動將此bank file存至檔案並開啟新的bank file。


Galaxy函數

將上述協定實作成galaxy函數。
1. Bank分析器初始化函數:在地圖初始化事件時執行。
2. Bank分析器寫入訊息函數:呼叫此函數執行寫入訊息。

特別注意,由於解讀工具可能無法處理中文,因此寫入訊息字串請盡量避免使用中文。

Bank分析器初始化:初始化"遊戲名稱"的Bank分析器,啟動/不啟動 時間記錄,並且使用 個別/全體/全體並記錄玩者 記錄模式,設定自動儲存功能為N筆資料自動儲存。
galaxy0.jpg


Bank分析器寫入資料:於BankTool為玩者新增資料『資料』。
galaxy1.jpg



解讀工具

解讀工具遵循上述協定,將bank file串起來。這裡提供一個簡易的gui介面工具,來完成bank file序列選取,與將訊息合併後依序寫至另一個文字檔。
執行檔名稱為MessageDumper.exe。於Menu上選取"File"->"Open",選擇要合併的bank file。
message dumper gui 0.JPG


gui介面會找出在同一個資料夾中,同一序列的bank file(遵循上述協定,有相同的前贅字),並進行bank file解讀,從xml中提取訊息。最後依序將訊息合併並輸出至檔名為"前贅字.txt"的文字檔內。執行過程會顯示在下方的欄位。
message dumper gui 1.JPG


解讀工具製做使用python 2.6,wxPython 2.8.10.1,py2exe 0.6.9。


備註

bank file仍有許多限制,經測試後得到[3],單次遊戲中最多只能開啟35個bank file。在每個bank存1000筆資料的條件下,可儲存35000筆,在一場一小時(3600秒)的遊戲中,平均每秒可寫入9.722次。


[1] 經crassorz測試,發現每個bank file最極限可儲存約9000筆資料,會因使用方式發生誤差,建議值在2000以下
[2] 感謝crassorz提供Galaxy函數
[3] 感謝crassorz測試
Let's Do Something Interesting

圖檔
頭像
rexrainbow
冰霜翼龍
冰霜翼龍
 
文章: 1696
註冊時間: 2008年10月02日 3:33 pm
來自: Taipei, Taiwan

Re: [心得指南][討論] Bank檔案解讀與分析應用

文章crassorz » 2010年08月20日 4:41 pm

基本上個人覺得這個版本還沒辦法真的拿來做什麼
只是一個示意範本
持續更新中~
圖檔
我決定不再對伸手牌起反應
除非很有趣
頭像
crassorz
死亡騎士
死亡騎士
 
文章: 2338
註冊時間: 2008年04月06日 5:40 pm
來自: 什麼都有的雜物間

Re: [心得指南][討論] Bank檔案解讀與分析應用

文章rexrainbow » 2010年08月23日 1:54 pm

csv是一種以逗號","分隔的純文本格式, 如下列文字內容:

a,b,c
0,0,0
1,2,3
2,4,6


若以副檔名"csv"儲存則可在excel被開啟.
csv show.JPG


若在上述工具(MessageDumper)的galaxy訊息寫入函數輸入時, 將寫入的字串排成csv格式. 之後經過解讀工具輸出純文字檔案, 再將副檔名由".txt"改成".csv", 就可在excel開啟.
接下來, 就可以用excel做些繪圖或是數值計算了.
Let's Do Something Interesting

圖檔
頭像
rexrainbow
冰霜翼龍
冰霜翼龍
 
文章: 1696
註冊時間: 2008年10月02日 3:33 pm
來自: Taipei, Taiwan


回到 地圖製作主題討論版

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 1 位訪客

cron