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。