檔案下載區‎ > ‎

函式庫

為簡化以及達成一些較高難度同人任務中所使用到的運算技巧,所以我們建立了函式庫公開給大家使用。

※含有debug標籤之事件代表有多於拿來檢查是否有疏失之動作,請自行刪除。


VAR檔的使用方法:
    用URL讀檔,詳此文章
    函式的URL可通過右鍵相應的下載符號,按複製連結網址取得

TWF檔的使用方法:
    用「同人陣合體外掛」將函式內容搬至你的同人內,詳見此文章



目前函式:

TWIlibrary.twf:
    1.優先佇列 (Priority Queue)
    2.平方 (Square Root)
    3.兩點距離 (Distance between two points)
註:此檔歷史比較悠久,沒有用執行事件動作,因此運算會比較慢
另外,作者星龍的實力又比其他編輯成員高出許多,目前不會有更新版
目前FK終於搞懂Priority Queue是怎玩了,但沒有時間弄/_>\

sqrt()_*.var:
    平方 (square root 的變數存檔版)

trigo.var:
    三角函數 (sin cos tan asin acos atan 的純變數版)

char60.var:
    六十個字元的字元表 ( 60 character map)

factorial.twf:
    階乘 (nothing important)

環狀AI陣_26容量.twf:
    環狀AI陣基本檔

vector.min.twf:
    矢量(流動陣列)



TWIlibrary.twf介紹:

1.優先佇列 (複雜版:維基百科)

優先佇列可以將儲存一堆數字,預設可以儲存49個數字。
其特色為:數列中的第一個數字必為最大值。
舉例:
一個數列:{1,9,4,6,3}
依序放入優先佇列後會變為: {9,6,4,3,1}

我們可以利用這個性質進行排序: 每次取出最大值,直到最後一個被取出,佇列為空時,取出的順序必然是有順序的數列。

拿上面的例子開刀:
優先佇列:{9,6,4,1,3}
取出:{}
        ↓
優先佇列:{x,6,4,1,3} -> {3,6,4,1} -> {
6,3,4,1}
取出:{9,}
        ↓
優先佇列:{x,3,4,1} -> {1,3,4} -> {4,3,1}
取出:{9,6}
        ↓
優先佇列:{x,3,1} -> {1,3} -> {3,1}
取出:{9,6,4}
        ↓
優先佇列:{x,1} -> {1}(剩下一個,直接取出)
取出:{9,6,4,3} -> {9,6,4,3,1}
        ↓
優先佇列:{}
取出:{9,6,4,3,1}

看不懂沒關係~至少知道怎麼用



函數成員:

使用前必須檢查 : PRIOwait 等於 0 


prio.in = (參數) : 將參數置入佇列內

(參數) = prio.top : 參數變為目前目前佇列的最大值 (取得目前佇列最大值/頂端元素)

(參數) = prio.size : 取得目前佇列的數值量

prio.out = 1 : 排序並輸出佇列內容。輸出位置: out.{}

prio.pop = 1 : 移除頂端元素(最大的數值)

附註:由於光暈系統的關係,所以目前是最不穩定的函數。


2.平方根
(請使用官方數學式中的平方根)

就是開根號 不用解釋吧


由於光暈系統的關係,這裡支援最大開到4900,生成速率大約200~500個 / 分鐘

如要使用建議使用任務初始化讀取至少一分鐘以上

另外,在事件 [stop:sqrt]中,如5分鐘內沒有完成,則將會強迫終止繼續運算尚未算到的根號值。(可自行修改時間或刪除)

函數成員:

 

(參數) = sqrt.{ (參數) } : 取得參數=乘以100之後的平方根 (因為光暈沒小數)


範例:

設定變數 a = 10
設定變數 a = sqrt.{a}

最後結果: a = 316 


3.兩點距離
(請使用官方數學式中的平方根)
取得兩座標間乘以100後的絕對距離。

函數成員:

 

dis.pos = (地圖變數)  取得點一的位置

dis.pos2 = (地圖變數)  取得點二的位置

dis.call = 1 開始計算兩點間距離

(參數) = dis.return 取得上述之結果


範例:

檢查-
檢查人物位置 : enemy 在座標(0,0) 上 檢查相反效果 (儲存位置: dis.pos) // << 假設為 3,3
檢查人物位置 : player 在座標(0,0) 上 檢查相反效果 (儲存位置: dis.pos2) // << 假設為 18,23
比較數值 : (整數)1 等於 (整數)1 (儲存檢查結果:dis.call)
事件結束:dis.return
比較數值 dis.return 等於 dis.return (儲存檢查結果:distance) // << distance = 2500 

動作:distance = distance / 100 // << 變為25
動作:人物說話 [player] : 敵人目前距離大約%{distance}%格遠!

結果: 敵人目前距離大約25格遠!



下面為獨立函式:
(灰階為已有官方解決的函式,不再適合使用)


4.字元表 (VAR檔)

只是60個字元

 char. 0 1 2 3 4 5 6 7 8 9
 0 0123
 10e
 20
30  ,
 40 + - * / : .< > _
 50 { } [ ] = ! % &


函數成員:

 

(參數) = char.{ (參數) } : 取得字元表上對應的字元
(參數) = char.sum: 取得字元表的字元總數,即是60


範例:

設定變數 a = 10
設定變數 a = char.{a}

最後結果: a = "a"


5.階乘

其實這只是一個遞迴的範例,但弄得很差

函數成員:


factorial.parameter = (參數) 
執行事件動作:factorial,不做任何檢查  : 運算(factorial.parameter)!的結果

(參數) = factorial.return : 將(factorial.parameter)!的運算結果放入參數

例:
[動作]factorial.parameter = 3
[動作]執行事件動作:factorial,不做任何檢查
[動作]FK說「%{factorial.return}%」

最終FK會說6


6.環狀AI陣
(請使用檢查 - 人物面向角度/人物 - 儲存人物面向角度)

用26容量於地圖四周快速建立環狀AI陣
用於與鼠標有關的控制

函數成員:


(請修改於事件 def_map中的變數)
map.width=地圖闊度
map.height=地圖高度

CAI* 為環狀AI陣內的人物代碼

測試時請將導演面版暫時關掉,待AI陣建立完成後才重開


7.插入排序(insertion sort)

超實用的排序演算法,如果原本的資料已有一部分已經排列好,這是最佳的排序演算法
(如果每次只需拿最小或最大的數據,priority queue會是個比較好的方法,因為運算會快很多,但本中心暫時沒有穩定版本)

基礎容量:10 (超帥
呼叫容量:4 

回傳由小至大排列的列表

函數成員:


sort.listPrefix = (字串):欲排序的列表的前輟
sort.listSuffix = (字串):欲排序的列表的後輟
sort.key = (整數):欲開始排列的位置
sort.length = (整數):欲排列的列表的總長度
sort.return = (字串):回傳列表的名稱

排列完畢後,函式會回傳一個陣列去對應的代碼
例:
這兒有一個完全隨機排列的列表:list.{n}.value,n由0-9,即長度是10
listPrefix就是「list.」,listSuffix就是「.value」
key我們這兒填上0,因為沒有任何元素已經排列 (如果你肯定首n個已經排列好,就可以填n,這樣可以加速排序
length明顯就是10啦
return我們填"rank."
然後呼叫insertionsort

如果
list.{n}.value = {1,10,1,2,1,4,4,8,10,4}
那我們運算得到的便會是
rank.{n} = {0,2,4,3,5,6,9,7,1,8

這是什麼意思呢?
}

不就是給幼稚園生玩的連連看嘛XD

如果list.{n}.players是一個人物列表,list.{n}.value是對應人物的分數
list.{rank.{n}}.players就是按人物的分數,由小至大排列好的人物列表
下面下載有應用例子,只有標籤insertionsort是核心功能


7.平方根 (VAR檔)
(請用官方提供的數學式)

就是開根號 不用解釋吧

請注意,VAR版本的平方根是沒有句點的!
是sqrt{參數}而不是sqrt.{參數}

下面有多個檔可以選擇,後面的數字表示平方的上限
sqrt()_10000.var只有運算至sqrt10000

函數成員:

 

(參數) = sqrt{ (參數) } : 取得參數=乘以100之後的平方根 (因為光暈沒小數)


範例:

設定變數 a = 10
設定變數 a = sqrt{a}

最後結果: a = 316 



8.三角函式 (VAR檔)
(請用官方提供的數學式)

就是sin cos tan 和 arcsin arccos arctan

函數成員:

 

{參數}= math.sin.{degree} 取得乘以100之後的sin的結果
{參數}= math.cos.{degree} 取得乘以100之後的cos的結果
{參數}= math.tan.{degree} 取得乘以100之後的tan的結果
{參數}= math.asin.{percent} 取得arcsin的結果
{參數}= math.acos.{percent} 取得arccos的結果
{參數}= math.atan.{percent} 取得arctan的結果

由於同人陣不支援小數,sin/cos/tan回傳的參數是乘大了100;asin/acos/atan輸入的參數也需要比平時乘大100,但回傳的角度是正常的

degree的值介乎0至360
percent的值介乎-100至100
不能完全弄出atan,否則VAR檔會超大
所以請善用三角函式的恒等式(X

例:
x=math.sin.30
y=math.cos.60
a=math.asin.50 //即sin-1(0.5)
b=math.acos.50 //即cos-1(0.5)
x或y的值會是50而不是0.5
a值是30,b值是60


7.矢量(vector)

矢量(vector)即是流動陣列,可以輕鬆進行「附加」、「插入」、「移除」的資料結構。進行上述動作後,矢量會自動更新其餘資料的位置。
因此你可以用矢量輕鬆模擬到堆疊(stack, first in last out)、隊列(queue, first in first out),配合指標(pointer,即是 { } 的一種用法)更可以造出物件矢量~

基礎容量:15 
呼叫容量:
    附加:1至3
    插入:1至3
    刪除:1至2

沒有回傳數值,效果直接反映於矢量上

函數成員:


vector.name = (字串):欲進行動作的矢量
vector.value = (參數):欲附加/插入於矢量的值
vector.index = (整數):欲進行動作的位置

執行事件:vector.push:附加物件(需要name及value)
執行事件:vector.insert:插入物件(需要name、index及value)
執行事件:vector.erase:刪除物件(需要name及index)


\其他敬請期待 或者有建議之函數要納入函式庫請聯絡我們/


人FK,
2016年10月30日 上午9:05
v.1
Compeador,
2015年10月14日 清晨7:47
v.2
人FK,
2016年10月30日 清晨5:05
v.1
人FK,
2016年10月30日 清晨5:10
v.1
人FK,
2017年5月25日 清晨6:49
v.1
人FK,
2017年5月25日 清晨5:37
v.3
人FK,
2017年5月25日 清晨5:37
v.3
人FK,
2017年5月25日 清晨5:37
v.3
人FK,
2017年5月25日 清晨5:37
v.3
人FK,
2016年12月10日 清晨7:44
v.1
人FK,
2017年9月19日 清晨6:24
v.1
人FK,
2016年12月25日 晚上11:33
v.2