創作內容

3 GP

ygopro:卡片腳本製作(基礎篇)

作者:光化靜翔│2021-01-25 18:39:41│巴幣:1,004│人氣:1365
ygopro裡面每張持有效果的卡都是由script目錄的Lua腳本來描述遊戲中的效果,
以下是如何製作卡片腳本的一些基礎教學。
1.  Lua
ygopro的卡片腳本是用Lua撰寫,目前採用Lua5.3,會用到的特性大致上有:
(1) and的優先順序高於or
由於乘除的優先順序高於加減,實數的四則運算有「先乘除後加減」的規則。
例如:
2+5*4 = 2+20 = 22

Lua的and和or也有類似的特性,也就是說:
A or B and C
會先計算(B and C)再計算A or (B and C)。

(2) Short-circuit evaluation
邏輯運算時如果已經能夠算出結果,就不會繼續計算後半段的語句 。
例如:
A or B and C
如果A為true,or的性質是其中一邊為true就可以確定整句是true,因此計算到此結束,程式會直接跳過B和C寫的內容。
 
(3) Lua的真假值定義
Lua的真假值定義為:
假:false、nil
真:其餘語句都是真
和C/C++系列的語言最大的差異在於0為真,在邏輯運算時要特別注意。
 
(3) 常用的運算子以及關鍵字
+, -, *, /:四則運算
<, >, <=, >=:小於、大於、小於等於、大於等於
==, ~=:邏輯運算的等於、不等於
not, and, or:邏輯運算not、and、or
~, &, |:位元運算not、and、or
true, false:代表邏輯真假值的常數
nil:NULL,通常代表空值
=:指定運算子,和邏輯運算的==不同
--:註解,這列會被當作一般文字而非程式碼

2. 腳本結構
以下用「影依の巫女 エリアル」為例:
function c97518132.initial_effect(c)
    --flip
    local e1=Effect.CreateEffect(c)
    e1:SetDescription(aux.Stringid(97518132,0))
    e1:SetCategory(CATEGORY_SPECIAL_SUMMON)
    e1:SetType(EFFECT_TYPE_SINGLE+EFFECT_TYPE_FLIP+EFFECT_TYPE_TRIGGER_O)
    e1:SetProperty(EFFECT_FLAG_CARD_TARGET+EFFECT_FLAG_DELAY)
    e1:SetCountLimit(1,97518132)
    e1:SetTarget(c97518132.target)
    e1:SetOperation(c97518132.operation)
    c:RegisterEffect(e1)
    --remove
    local e2=Effect.CreateEffect(c)
    e2:SetDescription(aux.Stringid(97518132,1))
    e2:SetCategory(CATEGORY_REMOVE)
    e2:SetType(EFFECT_TYPE_SINGLE+EFFECT_TYPE_TRIGGER_O)
    e2:SetProperty(EFFECT_FLAG_CARD_TARGET+EFFECT_FLAG_DELAY)
    e2:SetCode(EVENT_TO_GRAVE)
    e2:SetCountLimit(1,97518132)
    e2:SetCondition(c97518132.rmcon)
    e2:SetTarget(c97518132.rmtg)
    e2:SetOperation(c97518132.rmop)
    c:RegisterEffect(e2)
end
function c97518132.initial_effect(c)
end
腳本開頭的函數,定義這張卡有哪些效果,c後面的數字為卡片的id。
實體卡的id都位於10000~99999999這個範圍,自創卡片請盡可能避開這個範圍以免混淆。
 
local e1=Effect.CreateEffect(c)
宣告第一個效果e1。
 
SetDescription(aux.Stringid(97518132,0))
設定e1的提示文字,用於效果發動時的選單。

aux.Stringid(97518132,0)
卡片資料庫中97518132的第一個字串(str1為序號0)。

e1:SetCategory(CATEGORY_SPECIAL_SUMMON)
標記這是「包含~的效果」。
完整定義請參考constant.lua的Category。
Ex.
灰流麗可以對應的效果:
CATEGORY_DECKDES, CATEGORY_DRAW, CATEGORY_SEARCH。
 
SetType()
設定效果類別,定義如下:
A. 怪獸效果
(1) 啟動效果
EFFECT_TYPE_IGNITION
SetCode():無。
SetRange():發動的位置。
 
(2) 反轉效果
反轉怪獸在反轉時發動的效果。
SetCode():無。
SetRange():無。
選發:
EFFECT_TYPE_SINGLE+EFFECT_TYPE_FLIP+EFFECT_TYPE_TRIGGER_O
必發:
EFFECT_TYPE_SINGLE+EFFECT_TYPE_FLIP+EFFECT_TYPE_TRIGGER_F
 
(3) 反轉效果以外的誘發效果
SetCode():觸發效果的事件,定義請參考constant.lua。
類別分成X+Y兩個部分:
X:EFFECT_TYPE_SINGLE、EFFECT_TYPE_FIELD
EFFECT_TYPE_SINGLE:
發動條件為「此卡~」 。
SetRange():無。

EFFECT_TYPE_FIELD:
發動條件為「任何卡~」 。
SetRange():發動的位置。

以e2為例:
e2:SetType(EFFECT_TYPE_SINGLE+EFFECT_TYPE_TRIGGER_O)
e2:SetCode(EVENT_TO_GRAVE)

EFFECT_TYPE_SINGLE, EVENT_TO_GRAVE
此卡送去墓地
EFFECT_TYPE_FIELD, EVENT_TO_GRAVE
任何卡送去墓地

Y: EFFECT_TYPE_TRIGGER_O、EFFECT_TYPE_TRIGGER_F
決定這是選發還是必發,前者為選發,後者為必發。
選發還可以再分成「時」、「場合」兩種。
時:預設為時。
場合:在SetProperty()加入EFFECT_FLAG_DELAY。

(4) 誘發即時效果
EFFECT_TYPE_QUICK_O、EFFECT_TYPE_QUICK_F
分別為選發以及必發的誘發即時效果。
SetCode():發動時機,任何時機都能發動為EVENT_FREE_CHAIN。
SetRange():發動的位置。
 
(5) 一般永續效果
通常是只有改變卡片的數值或狀態的效果。
SetCode():效果的內容。

類別依照作用範圍分成EFFECT_TYPE_SINGLE、EFFECT_TYPE_FIELD。
只影響自己:
EFFECT_TYPE_SINGLE,SetProperty()加入EFFECT_FLAG_SINGLE_RANGE。
SetRange():效果生效的位置。
SetTargetRange():無。

影響其他卡:
EFFECT_TYPE_FIELD
SetRange():效果生效的位置。
SetTargetRange(A, B):影響的區域,A為控制者,B為控制者的對手。
 
改變攻擊力、守備力的效果有更複雜的規則,請先參考規則專欄:計算攻擊力與守備力確認遊戲王計算攻守的完整規則再設定。
 
(6) 改變遊戲狀態的永續效果
X+EFFECT_TYPE_CONTINUOUS
某些永續效果會移動卡片或改變玩家狀態,類似不排連鎖直接適用的必發誘發效果。
X:EFFECT_TYPE_SINGLE、EFFECT_TYPE_FIELD
其餘定義與誘發效果相同。

B. 魔法、陷阱卡
(1) 卡片發動時的效果
EFFECT_TYPE_ACTIVATE
SetCode():發動時機,任何時機都能發動為EVENT_FREE_CHAIN。
SetRange():無。
 
(2) 任意時機在墓地發動的效果
魔法卡:
魔法卡(包含速攻魔法)在墓地發動的效果都是速度1,因此類別為EFFECT_TYPE_IGNITION。
SetCode():無。
SetRange():發動的位置。
 
陷阱卡:
陷阱卡在墓地發動的效果都是速度2,因此類別為EFFECT_TYPE_QUICK_O。
SetCode():EVENT_FREE_CHAIN。
SetRange():發動的位置。
 
(3) 特定事件觸發的效果
比照怪獸的誘發效果。
 
(4)  永續效果
比照怪獸的一般永續效果。
 
(5) 裝備卡的效果
裝備卡裝備時的效果,類別為EFFECT_TYPE_EQUIP。
SetCode():效果的內容。
SetRange():無。
SetTargetRange():無。
 
 
SetProperty()
設定效果的特性,完整定義請參考constant.lua。
常用特性:
EFFECT_FLAG_CARD_TARGET:指定對象的效果
EFFECT_FLAG_BOTH_SIDE:雙方都能發動的效果
EFFECT_FLAG_DAMAGE_STEP:可以在傷害步驟發動,要檢查aux.dscon()
EFFECT_FLAG_DAMAGE_CAL:可以在傷害計算時發動
EFFECT_FLAG_DELAY:場合型選發
EFFECT_FLAG_PLAYER_TARGET:以玩家為對象,精靈之鏡會用到
 
SetCondition()
指定Condition函數,判斷效果發動條件的函數。
 
SetCost()
指定Cost函數,效果支付代價時執行這個函數。

SetTarget()
指定Target函數,檢查以及選取效果的目標時執行這個函數。

SetOperation()
指定Operation函數,效果處理時執行這個函數。
 
SetValue()
指定Value函數,可以指定數值(固定)或是函數(隨時變化)。
這是永續型效果使用的數值。

c:RegisterEffect(e1)
e1定義完畢之後,讓卡片c裝上效果e1。

引用網址:https://home.gamer.com.tw/TrackBack.php?sn=5052568
Some rights reserved. 姓名標示-非商業性 2.5 台灣

相關創作

同標籤作品搜尋:遊戲王|ygopro

留言共 0 篇留言

我要留言提醒:您尚未登入,請先登入再留言

3喜歡★salix5 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:2020年的碎片... 後一篇:遊戲王Master Du...

追蹤私訊切換新版閱覽

作品資料夾

asld12347🔉🐷🤓😁
紅燒翅膀 我喜歡吃~看更多我要大聲說22分前


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】