2021年1月24日

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

 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。


沒有留言:

張貼留言