スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ADSカードスクリプト作成講座 途中

いつかやろういつかやろうとは思っていたのですが、ADSのユーザーがけっこう増えてきたので
スクリプトの事を簡単に解説したいと思います。

オリカ作成者が増えることを祈って

まず準備するもの

・ADS本体(なるべく最新の物がいいです)
・lua等を編集できるソフト(ない場合は1を参考にダウンロードしてください。ある場合は2から読んでください)
・データベースをいじれるソフトと技術(これに関しては後日解説しますが、ADSWIKIの開発情報の項目をを見れば
だいたいわかると思います。
・やる気(プログラミングの知識があると幾分か楽ですが、ほとんどADS専用言語なので1から覚えるのも難しくないと思います)

以上




1、開発環境を整える。
本体は持っているものとして、luaをいじれるソフトが必要になります。
自分はGeanyというフリーソフトを使っています。ダウンロードなどの解説はこちらのブログがしていたのでここを参考にダウンロードしてください。


2、既存のカードの効果をいじった物を作ってみる。(簡単な効果で作る)
いきなり難解な処理を行う物を作ったりしては、最初から挫折する可能性が非常に高いので、
まずは簡単なカードから作ってみましょう。

わからなくなったら似た効果のカードを探して参考にしましょう。
基本的には他のカードから取ってきたカードのツギハギでできるということを頭に置いておくといいです。



今回の解説ではこのカードについて解説します。

<<バレンケの石棺>>
通常魔法
自分フィールド上に「先史遺産」と名のついたモンスターが存在する場合に発動できる。
デッキからカードを2枚ドローする。


このカードは自分が初めて作ったカードで、かなり簡単な効果となっています。
実は「強欲な壺」と「パルキオンのうろこ」のスクリプトを合体させて、ちょっといじっただけという。
最初はこういったカードを作って慣れていくといいと思います。

では、スクリプトを見てみましょう。


--バレンケの石棺
function c500000000.initial_effect(c)
--Activate
local e1=Effect.CreateEffect(c)
e1:SetCategory(CATEGORY_DRAW)
e1:SetType(EFFECT_TYPE_ACTIVATE)
e1:SetProperty(EFFECT_FLAG_PLAYER_TARGET)
e1:SetCode(EVENT_FREE_CHAIN)
e1:SetCondition(c500000000.condition)
e1:SetTarget(c500000000.target)
e1:SetOperation(c500000000.activate)
c:RegisterEffect(e1)
end
function c500000000.cfilter(c)
return c:IsFaceup() and c:IsSetCard(0x70)
end
function c500000000.condition(e,tp,eg,ep,ev,re,r,rp)
return Duel.IsExistingMatchingCard(c500000000.cfilter,tp,LOCATION_MZONE,0,1,nil)
end
function c500000000.target(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return Duel.IsPlayerCanDraw(tp,2) end
Duel.SetTargetPlayer(tp)
Duel.SetTargetParam(2)
Duel.SetOperationInfo(0,CATEGORY_DRAW,nil,0,tp,2)
end
function c500000000.activate(e,tp,eg,ep,ev,re,r,rp)
local p,d=Duel.GetChainInfo(0,CHAININFO_TARGET_PLAYER,CHAININFO_TARGET_PARAM)
Duel.Draw(p,d,REASON_EFFECT)
end

初めて見た人にはさっぱりかもしれませんが、簡単に解説していくので最後まで頑張ってくださいね。

まず、最初に理解してほしいのはADSのスクリプトの基本的な法則です。

最初の部分の

function c500000000.initial_effect(c)  --絶対必須ほとんど最初にあります。
--Activate
local e1=Effect.CreateEffect(c)  --1つ目の効果をe1番目に作ります。
e1:SetCategory(CATEGORY_DRAW)   --e1はドローする効果です。
e1:SetType(EFFECT_TYPE_ACTIVATE)  --e1は発動するタイプの効果です。
e1:SetProperty(EFFECT_FLAG_PLAYER_TARGET)  --プレイヤーをターゲットにとる効果です。
e1:SetCode(EVENT_FREE_CHAIN)      --チェーンを組み、いつでも発動できます。
e1:SetCondition(c500000000.condition) --()内の記述を満たしていないと発動できません。
e1:SetTarget(c500000000.target)    --()内の処理を行わないと発動できません。
e1:SetOperation(c500000000.activate)  --()内の処理を行います。
c:RegisterEffect(e1)          --以上e1の処理をこのカードの効果とします。
end --記述終了。これがないときちんど動作しません。
 

これはほぼすべてのカードに必須のコードです。
ここで基本的な処理の指示を出します。
上から順に解説していきます。


e1:SetCategory(CATEGORY_DRAW)
単体では意味を成しませんが、他のカードの処理に絡んできます。たとえばこの場合だと、「無効」の発動トリガーになったりとかします。

e1:SetType(EFFECT_TYPE_ACTIVATE) 
このカードの発動方法を指します。この場合は普通に手札、セットされている状態から場に出して発動を宣言するタイプです。普通の魔法・罠カードの発動処理ですね。

e1:SetProperty(EFFECT_FLAG_PLAYER_TARGET)  
プレイヤーをターゲットにとっているという記述です。精霊の鏡などが関係してきます。

e1:SetCode(EVENT_FREE_CHAIN)
フリーチェーン(いつでも発動できる)効果です。攻撃宣言時のみ、とかはここが変わります。

e1:SetCondition(c500000000.condition)
ここは少し他のに比べて複雑です。
ここは詳しい発動条件を指します。たとえば今回の場合は場に「先史遺産」がいる場合、なので
それをここに記述するわけです。
ただ、それを記述するにはここではなく、他の所に記述し、それを()内で参照する必要があります。

今回の場合はc500000000.conditionに記述した物を呼び出していますね。
では、そちらも見てみましょう。

function c500000000.condition(e,tp,eg,ep,ev,re,r,rp)

return Duel.IsExistingMatchingCard(c500000000.cfilter,tp,LOCATION_MZONE,0,1,nil)
end


retuenというのは、returnに続く文章を満たしていれば、処理を通す。という風に捉えていただいてかまいません。
なので今回の場合はreturnに続く文章
Duel.IsExistingMatchingCard(c500000000.cfilter,tp,LOCATION_MZONE,0,1,nil)

を満たしていれば発動条件を満たしているということになります。
Duel.IsExistingMatchingCardとは、「()内の条件を持ったカードがあるか」をチェックします。

この場合だと、左から順に、
c500000000.cfilter   c500000000.cfilterの条件を満たす、 
tp           自分から見て
LOCATION_MZONE     自分のモンスターカードゾーンにあり
0            相手のモンスターカードゾーンを除く、
1            1枚以上ある場合、
,nil          (処理なし)
繋げると

自分から見て自分モンスターカードゾーン上にc500000000.cfilterを満たすカードが1枚以上あれば通す。
といった処理になります。

この処理は順番をかえると正しく動作しないので、他のカードのこの部分をコピペした物を、必要カ所だけ直すのを
お勧めします。

c500000000.cfilterもconditionのように別の場所に記述します。

そこも見てみましょう。


function c500000000.cfilter(c)
return c:IsFaceup() and c:IsSetCard(0x70)
end


conditionの処理を理解できていれば難しくないはずです。
cは「このカード」を指します。

なので
returnに続く部分は
「このカードが表側表示で、カテゴリ番号「0x70」番」
といった処理になります。(カテゴリ番号についてはwiki参照。0xは16進数を指します。なのでデータベースに
書いた物を16進数にしたものになります。ちゃんと変換しましょう。)

この処理をconditionに戻すと

自分から見て自分モンスターカードゾーン上に表側表示で存在する「先史遺産」と名のついたカードが1枚以上あれば通す。

といった処理になります。

これでカードの処理と同じになりましたね。これでconditionは完成です。


次回はtargetの処理以降を書いていきます。
中途半端な所で終わって申し訳ないです。



スポンサーサイト

テーマ : 遊戯王OCG
ジャンル : ゲーム

コメントの投稿

非公開コメント

No title

ADSでちょっと困った事があるので質問します。
cards.cdb(またはcustom.cdb)に新カードをPupSQLiteで追加するとgframe が起動しなくなるのですが、
どう対処すれば良いのでしょうか?
調べても載って無いので困り果てております…。

No title

>>忍者丸さん
card.cdbではnillが使われているとADSが正常に読み込むことができず起動できなくなります。
なので、新カードの使わないところはすべてnillではなく空欄にしてください。

No title

こんな講座をずっと待っていました!
丁寧にひとつひとつ解説されていて、
非常にわかりやすかったです。
有難う御座いますm(__)m

あと、コメント見てnillでは無くnullなのでは?と^^;
PupSQLiteでcard.cdbのtextのほうにデータを追加する時には
ID、カード名、カードテキストだけ入れてそこから右の欄は全部
半角スペースひとつ、または - をひとつだけ入力して
埋めるという認識で良いですかね?

No title

>>まったりさん

nillではなくてnullでしたね。勘違いしてました。
テキストより右は全てフリースペースなので使わない場合は空欄にしておいてください。
その認識であってますよ

No title

講座、ためになりました
カテゴリとプロパティってそう言うことだったのか・・・
無くても動く?→じゃあ無駄に処理しても良いこと無いかな?
とか勝手に考えて消してたり引用した物そのまま放置してたりしてた・・・

オリカ全部見直ししないと^^;

No title

>>ぱたーさん
了解です。
ずっと困っていたので教えて頂き感謝致します。

質問したいのですが宜しいでしょうか?
カード実装の際、cards.cdbまたはcustom.cdbを弄る時、
datasの「ot」と言う項目は何を意味しているのでしょうか?
textsの「str1」~「str16」の役割も教えて欲しいです。
また、ぱたーさんはADS専用言語をどこでどの様な方法で覚えたのでしょうか?
特定の属性として扱う効果を持つカードはダーク・シムルグ等がありますが、
それを真似て特定の種族としても扱うカードを作ろうと思ったのですが、
e1:SetCode(EFFECT_ADD_RACE)
e1:SetValue(RACE_ZOMBIE)
と設定してもいかんせん上手く行かないのですが、どうすれば良いのでしょうか?
アドバンス召喚扱いとして特殊召喚させるにはどう処理を組めばいいのか…。
これも類似カードが無いので大変困っております。。
質問多くて申し訳ありませんが答えて頂けると幸いです。

追記
この講座のおかげでADSにオリカを早速数枚追加する事が出来ました。
ありがとうございます!(^^)

No title

これからもADSでカード実装の際、解らない事があればその都度質問したいのですが、
やはり厚かましいですよね…。
自分としてはこのブログをとても頼りにしているのですが…。
後16進数に変換する数字はどこにあるのか解らないです…orz
データベースと言ってもデータベースのどこの数字を参照してるのか、
またそのデータベースの数字は何を参照して書いてあるのか…さっぱり解らんです。
お願いします、助けて下さい。

No title

>>忍者丸さん
お返事が遅くなってしまい申し訳ありません。

データベースはカードの発売情報を表しています。
1は全国で発売している。
2はOCGで日本でのみ発売している。
3はTCGで海外でのみ発売している。
4はオリカ等でカードとしては販売されてません。

strは補助欄です。
たとえばカードの効果などで「はい」「いいえ」などの選択をする必要があるときに
説明文が必要なわけですが、その際にこのstrに記述します。
なので説明文がいらないカードは基本的に記入しなくていいです。
後はエアーマンなどの同じタイミングで2つの効果をどちらか選ぶ時などにつかわれます。

codeはADSに登録されているコードのみ使用できます。
なので「複数の種族を得る」という効果はOCGでは存在しないので
そのコード自体が存在しない可能性が高いです。

自分は作ったことないのですが、エクシーズ召喚等ならば以下の方法でできます。
召喚条件(裁きの龍)などの場合にアドバンス召喚扱いにしたい場合は
:e1:SetValue(SUMMON_TYPE_XYZ)
をつければエクシーズ召喚扱いにできます。
また、カードの効果処理でエクシーズ召喚等を行いたい場合は
Duel.SpecialSummon(tc,SUMMON_TYPE_XYZ,tp,tp,false,false,POS_FACEUP)
といった風に記述すれば大丈夫だと思います。
アドバンス召喚がこれに対応するかはわかりませんが…

ちなみに簡単な説明を
tc 特殊召喚するカード
SUMMON_TYPE_XYZ 特殊召喚の種類。特にないなら0
tp 特殊召喚するプレイヤー
tp そのプレイヤーの場に特殊召喚
false 召喚条件を無視するか(ここがfalseだと一部の特殊召喚モンスターは選べません)
false 正規の方法で召喚された扱いにするか(今回の場合はエクシーズ召喚されているのでここがfalseでも蘇生制限は満たします)
POS_FACEUP 表示形式

データベースに関してはhttp://www3.atwiki.jp/ads-wiki/pages/30.html
熟読すればわかると思います。

No title

>お返事が遅くなってしまい申し訳ありません。
いえいえー。答えて頂けるだけでも感謝もんです(^^)

成程…そういう風になっているのですね。
わざわざリンクまで用意して下さって、詳しい説明ありがとうございますm(_ _)m
既にあるカードの16進数をスクリプトの処理に設定するにはwiki見れば一目瞭然ですが、
例えばwikiに載って無い新規の16進数や10進数の~名のついたの設定を
するにはどうしたら良いかwiki見てもさっぱり解らなかったですorz
16進数や10進数に変換する答えの導き方が解りませぬ……。
そもそもwikiに0x1 1 A・O・Jとか載ってありますが、
何で定義してあるのでしょうか?
A・O・Jと名のつくカードなんて沢山ありますし……。
後、個人的に気になった事をちと質問します。
データベースに~名のついたの番号を設定しなければ、
そのカードのテキストに記述されている特定のカードの条件を満たさない、
と言った認識で宜しいでしょうか?
と言うかそもそも、データベース欄に~名のついたの番号設定をする事で
何が起きるか知りたいです…。
すみません、言い訳に聞えるかも知れませんが、当方要領が悪いもので…。
具体的に教えて頂きたいです。

>codeはADSに登録されているコードのみ使用できます。
>なので「複数の種族を得る」という効果はOCGでは存在しないので
>そのコード自体が存在しない可能性が高いです。
コードはconstant.luaファイルを参照したものを使ったので存在するのは間違い無い、と思います…。
でも上手く行かなかったんですよね…何故だろうか。

>召喚条件(裁きの龍)などの場合にアドバンス召喚扱いにしたい場合は
>:e1:SetValue(SUMMON_TYPE_XYZ)
>をつければエクシーズ召喚扱いにできます。
このサモンタイプをアドバンスでも使用可能かどうか
生贄の抱く爆弾を用い正常に処理するかどうか実践してみた所、
爆弾のトリガーにならず、発動不可でした。
この事から、多分アドバンス召喚扱いには出来ないんじゃないかと思いますが、
詳細は不明です。

Duel.SpecialSummonの括弧内にSUMMON_TYPE_ADVANCEを記入して
テストした所、
召喚自体は正常に処理されましたが、アドバンス召喚扱いにはなりませんでした。
エクシーズ召喚だと普通に成功したのですが……。
SUMMON_TYPE_NORMALにして、
ノーマルな召喚扱いにしようと試みてみましたが、失敗に終わりました。
私の勘だと恐らくは同じ特殊召喚としての召喚方法じゃないと、
その扱いには出来ないのかと。
全部が全部試してないので把握不可ですが。
何とかしてアドバンス召喚扱いにさせる方法は無いものか…。

以下質問です。
1.生還の宝札のファイルをコピーし、原作版の同じものを作る際、
相手の墓地からも蘇生を対応させる処理がどうも解りませんでした。。

2.ちょっと組んでみたスクリプトがあるので、
修正すべき点、抜けてる所、余計な記述がないかどうか等
ご指導願いたいのですが可能でしょうか?

3.e1:SetValue(EFFECT_BATTLE_DAMAGE_TO_EFFECT)として、
効果ダメージを与えるカードの処理を戦闘ダメージ扱いにする事は出来ますか?

No title

サーチ効果持ちのエクシーズモンスターを作ろうと、キングレムリンのスクリプトを参考にしようとしたのですが、どれがどのスクリプトかわかりません。こういうとき、簡単な探し方などありますか?それとも、1つ1つ確認していくしかないのでしょうか?

No title

講座続き期待してます!

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます
プロフィール

ぱたー

Author:ぱたー
遊戯王ADSにアニメカードを追加するファイルを作成してます。
また、ポケモン楽曲を中心にアレンジを公開中
http://www.nicovideo.jp/mylist/28116404

最新記事
最新コメント
カテゴリ
FC2カウンター
ブロとも一覧

Soldier G man (仮)

Yure Lab. ブログ支部

CrazyFactory

オリカ作るでぇ~♪

全力でオリカを作成するブログ(初)

オリカとか、えとせとら。

Camellia

イスルギブログ

JOKER of THE REVERSAL

恋黒狐

陽炎日記

まおぶろ。

ムッチムチなブログ~

オリカを作ってみた

Kのオリカ作成研究室

らーてぃすのリベラメンテ

Red Page

もみ~の「哨戒活動日記」

多趣味な人間の多趣味な日常

オンゲ+遊戯王廃日記

mule 通信

東方好きによるブログ

放課後日和

ウィニヴォののんきな日々

遊戯王のオリカっていいよね

ジークのオリカ製作工房
検索フォーム
RSSリンクの表示
リンク
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。