• 第四回・中身を見てみよう

今回は、CGIの中でどんな事を書いているのかを簡単に解説してみたいと思います。
サンプルは適度に短いダーク・ヴァルキリアさんの起動効果部分です。



elsif($use_cno==3674){#ダーク・ヴァルキリア
if($cont_flg!=1){
if*1{return;}
if($cpu[$s_a]!=1 && ($F{'options'} eq '' || $F{'options'} eq '0' && @select!=1)){
$tmp_syorip.="<>m-どちらの効果を使用する?<>o-破壊効果(対象も選択)::魔力を乗せる<>l-1";
$seast='991911';$jokenst='';&go_select_syori;return;
}
if($F{'options'}==1){
if($fld_koka[$use_f_no]=~/used<>/){return;}
}else{
if(&use_mcounter($use_f_no,1,1)){return;}
$res_s[0]=$select[0];
}
}else{$res_s[0]=$select[0];}
if(&used(4)){return;}
if($F{'options'}==1){
&on_mcounter2($use_f_no);
&add_msg($NULL,"$t_nmは魔力を集めた!");
$fld_koka[$use_f_no].='used<>';
}else{
if(&taisyo_chk($res_s[0],1) && &monster_koka_chk($res_s[0])){
&add_msg($NULL,"$t_nmは魔力を解き放った!");
&go_boti_arr(1,2);
}

これがダーク・ヴァルキリアの記述になります。
分解してはじめから解説してみます。



  • elsif($use_cno==3674){#ダーク・ヴァルキリア
$use_cnoは誰が使ったか?という事、この場合はカード番号3674のダルキュリアが使ったので、このif節以下の処理を始める事になります。


  • if($cont_flg!=1){
処理開始。まだ「効果発動」は行われていません。


  • if*2{return;}
永続効果150番がフィールドに存在しているか、またはこのカードが再召喚されている(デュアル効果を得ている)か。
150番は《超合魔獣 ラプテノス》。つまり、デュアル効果を発動できない状態だとreturn(失敗、何も起こさない)となります。


  • if($cpu[$s_a]!=1 && ($F{'options'} eq '' || $F{'options'} eq '0' && @select!=1)){
次以降のための布石です。この後の2つの効果のどちらを選択するか・したかをこの文で見極めていきます。


  • $tmp_syorip.="<>m-どちらの効果を使用する?<>o-破壊効果(対象も選択)::魔力を乗せる<>l-1";
  • $seast='991911';$jokenst='';&go_select_syori;return;
どちらの効果を使用するか選択。破壊効果を選んだら変数optionsに0を、魔力カウンター効果を選んだら1を代入します。
seastは対象を選ぶ場合にどこのゾーンから選べるようにするか、対象を取るか、除外か……といった決まりをこの数字群でまとめてやってしまいます。
jokenstはその選ぶカードの条件です。このカードの場合は特に条件がないので空欄です。
例えばここに&syu_st($res_si) eq "天使" などと入れると、天使族モンスターしか対象に出来ない効果となるわけです。


if($F{'options'}==1){
if($fld_koka[$use_f_no]=~/used<>/){return;}
}else{
if(&use_mcounter($use_f_no,1,1)){return;}
$res_s[0]=$select[0];
}
}else{$res_s[0]=$select[0];}

選択が終わったら、どちらを選択したかによってやる事が変わってきますね。
一行目にまず、optionsが1だったら……つまり魔力カウンターを載せる効果を選択した場合、このカードの効果から
「一度しか載せられない」→「すでに1度発動しているか否か?」を見なければいけません。
後に使用する、fld_koka/used/をこのカードが持っているならばすでに1度発動しているという事なので、returnします。

続いて先程のifに対するelse、つまりoptionsが0、破壊効果を選択した場合です。
こちらではヴァルキリアに載っている魔力カウンターを1つ取り除く必要があるのでそれのチェックです。
use_mcounterでuse_f_noから1つ取り除けない(載っていない)ならばreturnします。



  • if(&used(4)){return;}

ここから、効果発動の開始です。チェーン処理が終わった後ここから始まります。
(4)はモンスターの起動効果を表す発動番号です。色々種類があって、ここを間違えてしまうと
永続魔法なのにお触れに引っかかったりしてしまいます。

  • if($F{'options'}==1){
  • &on_mcounter2($use_f_no);
  • &add_msg($NULL,"$t_nmは魔力を集めた!");
  • $fld_koka[$use_f_no].='used<>';

options==1、魔力カウンターを載せる処理です。
まずon_mcounterで自分自身に魔力カウンターを載せ、何が起こったか分かるようにシステムメッセージを書き、最後に「1度この効果を発動した事があるよ」のfld_kokaを付加します。


}else{
if(&taisyo_chk($res_s[0],1) && &monster_koka_chk($res_s[0])){
&add_msg($NULL,"$t_nmは魔力を解き放った!");
&go_boti_arr(1,2);

else→options==0、破壊効果です。
res_s[0]は選んだ対象を示します。そのモンスターが対象として存在するか、モンスター効果を受けるかをチェックしてメッセージを表示して破壊します。
go_botiでは自動でメッセージを表示してくれるので、いちいち○○を破壊した!というメッセージを書く必要はありません。



以上でダーク・ヴァルキリアの起動効果部分を書き終えた事になります。お疲れ様でした!
これは効果としては簡単な部類に入りますが、例え単語一文字書き損じるだけでも全体がエラーとなってしまうので、ホントCGIは地獄と言えます。



  • 余談……表から見えないもの

%dhiformar_arr=(3838=>1,3836=>1,3835=>1,3834=>1,3713=>1,3714=>1,);

これが何を意味しているかというと、この一文でディフォーマーシリーズを定義しています。
「D・」と名のついたモンスター、という条件だとD・ナポレオンなども入ってしまうので、「D・」ではなく「これがディフォーマーシリーズ」とグローバルに定義してしまうわけです。
この定義は各サポートカードなどで、$jokenst='$dhiformar_arr{$cardno}==1' こんな感じで条件指定の際、ディフォーマーのみを一括で指定できるよう活躍します。


ではこのような群を作ってみると……?
%sky_arr=(XXXX=>1,XXXX=>1,XXXX=>1);

skyをさしずめ、空を飛んでいるモンスターとでも考えて定義してみましょう。ハーピー、巨大戦艦、エレファント、普通の魔法使い……。

他にも女性専用カード、魔法攻撃を行うモンスター、上級スペル……などなど、考えだせばいくらでも面白い定義を作れます。


この定義を行っておくと、例えばこんなカードが作れるようになるわけです。

地震 通常魔法カード
フィールドに表側表示で存在する、空を飛んでいるモンスター以外のモンスターを全滅させる。


もちろん、こんなカードは作られません。 プレイヤー側にそれを知る手段が無いからです。不親切極まりないしOCGのルールとは反してしまうでしょう。
(一応、効果テキストのhtmlにその定義を書いておく事も不可能ではないですが……)

この定義というのもあくまで一例で、「このカードには隠された効果がある!」とか「なぜ青眼が攻撃しない!」とか、
テキストに無い処理っていうのもCGIではいくらでも実現可能なわけです。
元々CGI以外では有り得ないため分かりづらいですが、特定のアイコン使用時に特別なメッセージが出る、これも立派な「隠された効果」なんですね。
初期のM&Wを彷彿させる、何が起こるかわからないびっくり箱のようなカード群とCGIもいつか作られたら、楽しそうだなあ。

  • 3の倍数相手だとアホになるモンスターが(ry -- 名無しさん (2008-10-02 23:13:08)
名前:
コメント:

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2008年10月02日 23:13

*1 !$kok[0][150] && $fld_koka[$use_f_no]!~/dual/

*2 !$kok[0][150] && $fld_koka[$use_f_no]!~/dual/