同人小技巧


玩壞圓型範圍

張貼者:2018年8月18日 清晨7:35人FK

其實這主要是回應 有辦法用 [圓形範圍] 做出一直線嗎?(人物特效) 此討論串
感謝樓主提供這個有趣的題目
不說那麼多,先給個效果圖
沒錯,都是用圓型範圍這個特效弄的

原理:
直接cartesian coordinate(x,y)換成polar coordinate(r,theta)就好啦
假如每點的座標是(x,y),而(0,0)就是你人的座標直接將這點換成polar就可:
1. 求半徑r:
2. 求偏角theta:

(註atan2大致與atan一樣,但避免了除零的情況,同時能回傳完整的角度範圍)
(atan 的range -pi<theta<pi, atan2 的range -2pi 至2pi)
(由於atan2回傳的是radian而角度要用degree,先轉做deg)

https://zh.wikipedia.org/wiki/Atan2


進階:自旋轉特效
要自旋轉也是很容易,設旋轉角為φ, 每點的座標以矢量表達
旋轉矩陣T:

原本沒有旋轉的矢量p:

旋轉後的矢量p'


再將x', y'換成polar coordinate 便可用在圓形範圍


玩壞:挑戰題
好吧,各位如果能夠搞懂上面,可以試試做這個挑戰題:
1.星型特效:一個圓型以五角星的軌跡圍繞主角公轉
2.太陽系:你是太陽,有個地球圍繞你公轉,又有個月球圍繞地球公轉
加油吧各位~
老實說第二題某FK未必弄到出來

路亞同人陣

張貼者:2017年2月2日 晚上9:47人FK   [ Ka Kit Lau 已於 2017年5月6日 凌晨12:03 更新]

引言
最近小哈開放了路亞模式的同人陣,換句話來說,我們現在可以用路亞來製作同人陣了

這可以帶來很多好處:
1.運算可以快一點點(但系統不能長期連續運算路亞,你要隔一段時間讓它運算同人陣和光暈系統)
2.可以用lua的函式庫(這就不需要用我們提供的VAR函式庫)
3.省容量(路亞好像沒有容量限制)
4.用真正的程式路言寫同人

當然,也有限制:
1.其中一名玩家不能手動遊玩,希望假醬的建議被通過
2.路亞程式跟同人程式的溝通只能靠人物說話或人物血量,API欠奉(API要自己寫哦,期待小哈加強同人陣和LUA的溝通)

本中心的路亞同人陣:
                                路亞闖關BETA:270136
                                路亞闖關2:270532

基本步驟
1.同人作者要求其中一名玩家用路亞模式來闖關
2.該玩家要用作者提供的程式碼作為他的路亞程式
3.最基本的路亞同人陣就可以玩了


給個例子吧,用下面這條路亞便能0容量玩猜數字了,讚吧

require "sys.game"game.logState("player id = ", me.info.id )--state nil : game init , state 0 : start game, state 1 : enter number, compare and print, state 2 : bingo back to state 1if state == nil then 	state = 0elseif state == 0 then	math.randomseed(os.time())	math.random(); math.random(); math.random()	a = 0	b = 100	ans = math.random(a,b)	game.log("answer : ".. ans)	state = 1elseif state == 1 then	me.triggerKeyboard("Enter")	for i,e in ipairs(game.events) do		if e.type == "talk" then			x = tonumber(string.match(e.text,"%d+"))			game.log("ans, a, b, x".. ans .. a .. b .. x)			if x > ans and x < b then				b = x			elseif x < ans and x > a then				a = x			elseif x == ans then				state = 2			end		end	end	me.talk("between "..a.." and "..b)elseif state ==2 then	me.talk("bingo")	state = 3	timedelay = game.now + 1000endif timedelay and state == 3 then	if timedelay < game.now then		state = 0	end end

不過,這條路亞在路亞修行仍能玩,還未能展現出用路亞寫同人的關鍵技術(玩的時間不多QAQ)
晚些再補充路亞可以怎樣跟同人陣溝通(目前只有人物說話比較易用,其他的不方便用),去真正實現路亞同人陣的真正威力

進階 - LUA同人溝通方法
進階範例: TWF檔 LUA檔

LUA至同人:
me.talk(command)
同人陣中需用「檢查玩家說話內容」的方式,自製API接收來自LUA的指令,並進行動作

同人至LUA:
(LUA偵測不到同人AI在說話,不能用人物說話的方式來傳,不知小哈會不會改)
1.設定人物血量(註意:只能傳1至9999的數字)
2.人物名字(註意:名字是靜態資料,你只能讀到人物生成時所用的人物名字,後面無論怎改LUA也讀不了
--下面程式碼示範如何讀取,從同人陣以人物血量的方式傳來的變數資料--用無陣營人物傳資料吧,無陣營都是朋友,取得的朋友列表存至friendsfriends = game.findVisibleFriends()--逐一檢視朋友列表中的朋友,存至friend中for _,friend in pairs(friends) do        --如果朋友的id是level,他的生命值資訊存至變數level	if friend.info.id == "level" then		level = friend.hp        --如果朋友的id是input1,他的生命值資訊存至變數a	elseif friend.info.id == "input1" then 		a = friend.hp        --如果朋友的id是input2,他的生命值資訊存至變數b	elseif friend.info.id == "input2" then 		b = friend.hp		endend
如果大家有更好的方法,歡迎提出~

同人陣熱門的計算方法

張貼者:2016年12月10日 晚上11:07人FK   [ Ka Kit Lau 已於 2017年5月6日 凌晨12:04 更新]

每週第一次遊玩該任 +1 熱門數,(即重玩不計)
之後一星期內重複遊玩並不計算,
每逢星期五、星期一熱門數除2,並重置上述設定(即是重玩也可以計算一次熱門數)

同人陣內踢人

張貼者:2016年8月7日 凌晨3:47人FK   [ 已更新 2016年8月7日 凌晨3:49]

感謝玩家寒光☆回憶於嘎姆復活後分享了同人陣內踢人的技術
這種方法真的很像死亡筆記本哦~

不過招還是不夠可靠,遇上名字相同(如FK人、FK人(分身))或者系統無法辨識的名字,就會出問題
就讓某FK來說說我的做法

1.定義p1,p2,p3,...,p8為八個玩家的儲存代碼
2.告訴玩家p1至p8分別為哪個玩家
3.告訴玩家說kick+數字踢走代碼為該數字的玩家,如說kick1就是踢p1
4.事件[kick]
    [檢查]任何玩家說 kick 儲存數字為n
    [動作]任務失敗 p{n}

這還可以弄投票系統,讓玩家投票踢走公認的雷隊友
效果可以參考247924

儲存玩家說話內容為字串

張貼者:2016年7月15日 上午8:38人FK   [ Ka Kit Lau 已於 2016年9月24日 下午4:00 更新]

這東西卡了足足三個月,看到有人發bug回報我才修好(哀

現在小哈已經推出相關功能(打FK臉),本頁可以用教學和相關用途



不須要再求小哈!輕鬆儲存玩家說話內容為字串~

只不過中文字跟各種符號實在太多,太耗容量
(其實重點是太耗時間,字元都可以存在VAR檔)
目前版本只能存數字、英文字、部分符號



運作原理:

當玩家說話時,系統就將字元0至9、a至z遂個跟玩家的說話內容作比對
若發現比對的內容跟玩家說話內容一致,便存至陣列(用作讀取資料)和字串(用作讀取存檔碼),下次比對之前會將字元附在這個字串上,以繼承之前的比對結果
整個過程就好像DNA的複製過程(由組合TAC開始比對,A對T,C對G;但此處由不知何處開始比對,0對0,1對1,如此類推)。例:


為方便解說,設玩家只會說數字

玩家說:314159265359
系統比對出來的字串(下稱系統串):null(空值)
系統從0-9遂個比對:
=>沒有在玩家說話內容中找到0
=>在玩家說話內容中找到1
儲存至字串:say="1"
玩家說:314159265359
系統串: 1          


再遂個比:

玩家說:314159265359
系統串:01              =>不對
系統串: 10             =>不對

玩家說:314159265359
系統串:11              =>不對
系統串: 11             =>不對

玩家說:314159265359
系統串:21              =>不對
系統串: 12             =>不對

玩家說:314159265359
系統串:31              =>對上了
儲存至字串:say="31"    
之後的比對會在31前或後再加數字

繼續找:
玩家說: 314159265359
系統串:031              =>不對
系統串: 310             =>不對

玩家說: 314159265359
系統串:131              =>不對
系統串: 311             =>不對

玩家說: 314159265359
系統串:231              =>不對
系統串: 312             =>不對

玩家說: 314159265359
系統串:331              =>不對
系統串: 313             =>不對

玩家說: 314159265359
系統串:431              =>不對
系統串: 314             =>對上了
儲存至字串:say="314"    
之後的比對會在314前或後再加數字

如此類推

再比對不出數字就表示所有數字已讀取完畢
那麼「變數/say」所儲存的就是玩家說話內容
只要做小小加工,其實這招的運算速度可以快一倍(用特定字串組合作起點),甚至可以做字串運算
不過每個字元需要1容量,或者弄一個VAR檔作資料庫,某FK就懶得弄啦,就請各位自行斟酌考慮要不要加中文或其他符號了

光暈人物重量速度轉換

張貼者:2016年4月6日 凌晨3:15人FK

用「重量」來量度人物移動速度真的太抽象
所以某FK在閒來無事下(其實是懶得温DSE),弄了這個兩個表和公式給大家參考


(圖一)

(圖二)


純粹參考~
圖一的公式比較可靠
圖二的公式應為 y = 1/(0.0031x+0.0695),不過看樣子也是挺準啦

希望能幫到大家

詳解同人更新 - 執行事件

張貼者:2016年3月24日 凌晨12:16人FK   [ Ka Kit Lau 已於 2017年6月5日 清晨7:01 更新]

基本認識

此動作的主要功能就是加速運算和自訂函式


温馨提示

1.不要開著導演面版玩無限loop這招,運算會變慢,而且會很LAG
2.如果你同時開著導演面版又連續使用「執行事件」,恭喜你,你的flash當死了
3.所有動作未執行完,系統是不會觸發另一個事件


運作原理

當是在事件0001中執行0002的事件,
這動作就是把事件0002的動作都搬來0001來運行,甚至0002未開始檢查也沒問題,亦不會損0002的重覆次數,但0002不能是「已結束並不在檢查狀態」

即是怎樣呢?

同人程式碼以「事件」作單位,以某個次序排列一起,然後系統會逐一且盲目地檢查各個事件,通過的話則執行,否則檢查下一個事件。就是因為這個原因,越多事件,運算就越慢。而這動作則可以透過減少盲目檢查,加速運算。

{
設有事件A、B、C:
運作次序:A->B->C

不使用執行事件:盲目找出A然後執行->盲目找出B然後執行->盲目找出C然後執行
使用執行事件:盲目找出A然後執行->直接執行B->直接執行C
}


回到最上文的例子,再解釋一下各個選項:

選項1:不看檢查,直接執行事件0002的動作

選項2:被指定的事件 (事件0002) 的檢查、動作都無條件執行一次
(即是方便某FK玩null變數宣告法(X),見圖一)

選項3:要檢查都通過了才執行事件0002的動作
(迷聲:如果都通過了,不用通過這個動作也會自行觸發事件0002啦)


不過要注意一下每項檢查和動作執行的順序(見圖一)



進階槪念 - for迴圈


然後某FK做了一個測試,用這招來玩for-loop,效果非常好~

運算目標:a不斷遞增,直至a=10

結果0.1秒就運算完畢,舊招是要用上1秒才搞定

上圖:使用新招的for loop^
圖三:使用舊招的for loop

這還可以在事件運行中for 迴圈,見下圖

1.s被設為1
    2.執行0002
    3.a遞增1
    4.若a<10,重複2.
5.s被設為2

輸出:
>任務變數: s=>1
>任務變數: a=>1
>任務變數: a=>2
>任務變數: a=>3
>任務變數: a=>4
>任務變數: a=>5
>任務變數: a=>6
>任務變數: a=>7
>任務變數: a=>8
>任務變數: a=>9
>任務變數: a=>10
>任務變數: s=>2
[00:00:18] 事件觸發:0001


進階槪念 - 擺脫連續執行上限

某FK又做了一次調試,就是自己指定執行自己,即在事件0001執行事件0001的動作(圖四)
本來以為flash會crash,結果沒有...
這是應該小哈猜到有人會這樣玩,所以當累積指定次數後(不管是在哪個事件指定),都會跳過那個事件。


例如圖四的例子
運算目標:a不斷遞增,直至a=20000,然後說出a的值

結果(圖五):
系統把那個事件直接刪掉
裡面的動作碰也沒碰過


經過測試,執行事件動作只能連續使用1000次

如果要運算到a會大於1000,會讓事件進入「已結束並不在檢查狀態」,即使剩餘重覆999999次數也一樣,

例如事件0001進入了「已結束並不在檢查狀態」,剩餘重覆999999次數,
如果事件0002包含"執行事件動作-0001",事件0002會處於"即使檢查通過,0002也不被執行"的狀態,
即是事件0002會卡在"檢查通過"的檢查狀態



(圖一)





























(圖二)


(圖三)


(圖四)




(圖五)

快速將兩個同人陣合體

張貼者:2016年3月14日 晚上11:15人FK

各位一定有試過把一個同人的內容不斷地複製到另一個同人上吧。
過程是不是很沉悶乏味、肌肉疲憊、浪費時間呢?
現在某FK弄了一個外掛教大家如何自動化以上工序~
不說廢話了,去片~

用中文命名變數

張貼者:2015年12月24日 清晨6:24人FK   [ Jamie Phan 已於 2016年4月13日 凌晨3:56 更新]

今日與一名朋友討論一些難題,小編便跑去做實驗,發現是可以用中文命名變數OAO

例(例子由『☞Shadow 影☜』提供):
abc=小哈片刻
{abc}=87

看導演面版你便能看見小哈片刻已經變成87了OAO


這招到底有尛用呢?
這招可以拿來用一些系統不容許作為變數名稱的一些字元,如「,」、「小哈片刻」,來命名一個變數
如果你想好像殭屍來襲那般,不讓玩家在同一點放置士兵,就這樣弄:

事件-call.放兵
玩家召喚士兵 玩家儲存為p
地圖位置變數 location=p

事件-check.放兵
{location}.put==0
tp 士兵 至 location
{location}.put=1

當然這只是一個簡化版,尚有漏洞需要你去補

這招還可以拿來弄反向變數存取


鼠標存取

張貼者:2015年12月22日 晚上7:03人FK   [ 已更新 2018年1月21日 凌晨3:22]

引言
同人世界中有多種不可能的東西,存取鼠標座標是其中之一。(正因為是比較不可能的任務,會比較難理解)
光暈同人陣與鼠標的惟一關係大槪就只有玩家的面向角度吧。沒錯,某FK就是用「人物屬性-面向角色」這個檢查做到的!



基本 - 環狀AI陣:取得人物面向
如要以變數形態儲存人物的面向角度(包括玩家),必須要在地圖的四條邊建立環狀AI陣,再以「人物屬性-面向角色」這個檢查存取。

例:
令玩家p走向鼠標方向

解:

事件{ 設環狀AI於四周,AI代號「RAI*」 }

事件一 重覆99999次 檢查間隔0秒
[檢查] 人物屬性-面向角色 檢查對象:任務/p 面向對象:RAI* 儲存為事件/q
[動作] 趨使走至定點 任務/p 走至 事件/q

整件事現在只需28容量,可參考檔案下載區鼠標控制玩家及環狀AI陣基本檔,但不要公開

應用例子:
1.全方位光印
2.放屁鱷毒劍(比較tricky,連用了兩次檢查面向角色):https://youtu.be/3nE6yrAaLZc




進階 - 偽.居合斬:取得人物面前的第N格
如要取得人物面前的第N格,以做出弄出居合斬之類的效果,就要先建立環狀AI陣,得出一條貫穿「人物(P)」、「鼠標」、「人物面向目標(Q)」的線,再配合section formula,便能得出人物面前的第N格(L),如下圖


現在給一個例題:玩家向前衝3格
在此之前,請確保你已掌握這些技巧:地圖變數、格網座標、section formula

Apply section formula,
L   = (xL,yL)
     = ((r*xq+s*xp)/(r+s),(r*yq+s*yp)/(r+s))


因為是衝3格,r=3。但要計到L,我們還要知道s。但s是多少呢?
'.'PL/LQ=r/s
.'.3/LQ=3/s
.'.s=LQ=PQ-PL=sqrt((xp+xq)^2+(yp+yq)^2)-3
所以我們這兒還需要sqrt()開方函式
誰會猜到開方會在此派上用場OAO
不用怕,你只需要在同人中用URL讀檔讀https://sites.google.com/site/twftechnique/file/library/sqrt%28%29_40000.var?attredirects=0&d=1
中心已經為大家準備好開方0至40000的答案~
只需要sqrt{number}便能回傳正確答案的放大100倍,如sqrt2回傳141、sqrt4回傳200
現在便可以計到L的座標了~任務完成~

應用例子 - 鼠標控制玩家跳躍 (261576) 檔案可在下載區找到



進階 - 鼠標座標化
有了基本槪念,現在來看看如何取得鼠標在地圖上的實際座標吧
在此之前,請確保你已掌握這些技巧:地圖變數、格網座標、二元一次方程( linear equation in 2 unknowns)

整個存取過程需要三個事件,主要是觸發並製作公式,以及解二元一次方程和動作
由於此技術比較難以掌握,所以某FK會透過純理論篩走沒有能力掌挃此技術的作家
設鼠標座標為R(x,y);下面的每個座標全部都要分開兩個變數存

事件一:
儲存玩家目前位置為(xP,yP) 
/*為了避免製作出平行的公式造成無解,不以玩家目前的位置開始。
**如要使用玩家目前位置同時避免平行公式,請分case*/
移動玩家(下稱P)至位置A(xA,yA)

事件二:
儲存目前P所面向的RAI*為q1、其位置為B(xB,yB)
.'.ARB連成一直線,得出公式一
L1:(yB-yA)/(xB-xA)=(y-yA)/(x-xA)                //two point form (中四程度的東西)
       (yB-yA)(x-xA)=(xB-xA)(y-yA)
        (yB-yA)x-(xB-xA)y=(yB-yA)xA-(xB-xA)yA...................(1)
移動P至位置C(xC,yC)

事件三:
儲存目前P所面向的RAI*為q2、其位置為D(xD,yD) 
.'.CRD連成另一直線得出公式二
L2:(yD-yC)/(xD-xC)=(y-yC)/(x-xC)
       (yD-yC)(x-xC)=(xD-xC)(y-yC)
       (yD-yC)x-(xD-xC)y= (yD-yC)xC-(xD-xC)yC.................(2)
只要解了(1)和(2),你便會得出鼠標的座標了~

解方程(1)(2)     //中六程度,去wiki Cramer's rule

最後把玩家放回(xP,yP)

(希望運算沒有出錯,不然我就GG


高階 - 線性回歸鼠標存取 (Linear Regression)

用上面的方法,多拿幾條函式,然後做線性回歸。越多條函式會有越準確的座標
(幹以前都不知道這招,這麼有用的技巧怎麼上到大學才教QAQ)

設你得到的第i條公式(用人物位置Pi、面向角色的位置Qi、鼠標位置R(x,y))為

(Qi.y-Pi.y)/(Qi.x-Pi.x)=(y-Pi.y)/(x-Pi.x)
(Qi.y-Pi.y)x-(Qi.x-Pi.x)y=(Qi.y-Pi.y)Pi.x-(Qi.x-Pi.x)Pi.y
a_i x + b_i y = c_i

在得出N條公式後,建立矩陣

A= ((a_1,b_1),(a_2,b_2),(a_3,b_3),...,(a_n,b_n)) 
R= (x,y)
C= (c_1,c_2,c_3,...,c_n)

然後進行線性回歸,找出最少誤差的點,那個點就是你的鼠標位置

AR = C
A^T AR = A^T C
A' R = C'

Apply 上面提過的Grammer's Rule,你便可以找到R



參考影片:https://youtu.be/wJmzt2oRUpg  (準繩度仍是甚差
應用例子 - 真.冰凝彈:https://youtu.be/-J9n59A3McM (其餘的自己想


環狀AI陣應用例子-放屁鱷毒劍

鼠標存取效果參考

鼠標存取應用例子 - 真.冰凝彈