実践例
このページは書きかけです。(追記歓迎)
XMLの編集実践例をいくつか書いていきます。
このページ内のコード片は自由に改変して使用できます。
機能追加
「仲間を外す」解散エリアに「宿帳」を追加する
JUDGMENTでは「仲間を外す」(パーティ編成)の中にも「宿帳を開く」が追加されています。これによってキャラを外した空き空間にすぐに別キャラを加入させることができます。便利な機能なので、他の
スキンでも使いたいところです。
今回はClassic
スキンに移植してみましょう。
1.JUDGMENTのResource\Xml\Yado「-3_PartyBreakup.xml」を開く
これは、仲間を外す(解散)特殊エリアのデータが記録されたXMLです。
30行目あたりから以下の「宿帳を開く」カードの実体をコピーします。
<MenuCard arg="PLAYERSELECT" command="ShowDialog">
<Property>
<Name>宿帳を開く</Name>
<ImagePath>[[Resource]]/Image/Card/COMMAND2.bmp</ImagePath>
<Description>宿の待機メンバーを表示。</Description>
<Flag />
<Location left="121" top="75" />
<Size scale="100%" />
</Property>
<Events />
</MenuCard>
またはClassic
スキンのYado1 or 2から持ってきても良いです。中身は同じなので。
慣れないうちはとりあえず「
<MenuCard>から</MenuCard>まで全部コピーする」と覚えておくのがいいでしょう。
2.ClassicスキンのResource\Xml\Yado「-3_PartyBreakup.xml」を開く
コピーした上記テキストを貼り付けます。
どこに貼り付けるべきかというと
メニューカードの配置を決める<MenuCards>の後ならどこでもいいのですが、
変なところに貼り付けてしまうとスキンが開けなくなるので
ひとまずは安全のために「次の<MenuCard>の直前に置く」と覚えましょう。
15行目の <MenuCards spreadtype="Custom">の次、<LargeMenuCard command="DissolveParty">より前にに貼り付けて下さい。改行はあってもなくても関係ないです。読みやすい程度に入れましょう。
3.確認してみる
それでは、実際にCWPyを起動して確認してみます。
見事追加することができました!
今回は運良く一発で成功できましたが、現実には変なところに文字を混入させてしまい、「起動しなくなった!なんで!?」ということは非常にありがちなので、いざという時のために編集前のものを丸ごとコピーして別の場所に退避しておくといいです。
解散メニューカードと同じ台紙にしたい時は、
<MenuCard arg="PLAYERSELECT" command="ShowDialog">
↓
<LargeMenuCard arg="PLAYERSELECT" command="ShowDialog">
とします。
要するにLargeをつけるとキャストカードと同じ大きさになります。
宿に「BGM変更」機能を追加する
色んな
スキンに追加されていて、今一番需要が多いと思われる機能です。
「BloodWirth」
スキンでは背景に組みこまれていて自然なUIになっていますが、
エフェクトブースターでの背景くりぬき、レイヤの概念、scenariostartエリアについても覚えなくてはならないので、とりあえずシンプルなPy2~3に付属していた旧verのJUDGMENT型でやってみましょう。
※最新版はパッケージを利用しているので以下の解説とは行数等がズレています。
1.追加したいスキンのBGMフォルダに追加で再生する音楽ファイルを入れる
まずは指定する音楽を入れなければなりません。
「JUDGMENT」のフォルダからBGM1~4をコピーしてきます。
JUDGMENTではBGM2~3はmidiになっていますが、Pyは拡張子が違っていても再生できるので
これらを自前で用意したMP3などにすり替えてもそのまま使用できます。
Pyは MIDI, WAV, MP3, OGG をサポートしています。
2.JUDGMENTのResource\Xml\Yado\「02_Yado2.xml」を開く
これは、パーティを開いた状態の宿エリアのデータが記録されたXMLです。
前回習得した「メニューカードを移植する方法」が応用できます。
50行目あたりから150行目あたりまでの「レコード」をコピーしましょう。
3.追加したいスキンのResource\Xml\Yado\「02_Yado2.xml」を開き、ペースト
21行目、<MenuCards spreadtype="Auto">の次以降に貼り付けます。
spreadtypeはカードの並びを自動で中央に並べるか、カスタムで自由に配置するかの設定です。
レイアウトにこだわりたければ"custom"に変えてみましょう。
「BGM再生を変更するメニューカード」を作るだけならこれにて完了です。
が、これだと宿に入ったタイミングではDefinnのままです。
これを任意に変更できるようにするにはシナリオと同じように「到着イベント」を作る必要があります。
4.到着イベントを移植する
再度JUDGMENTのYado2.xmlを開いて、到着イベントがどこで設定されているのか探してみます。
「到着」でテキスト検索してみると、273行目にあるのがわかります。
※これはエディタでのデフォルト名なのですべての
スキンでそうなっているとは限りません。
実際にはメニューカードを置き終わったことを示す</MenuCards>の
次の<Events>からが到着イベントとなります。
<Events>から</Events>までを全コピーして、自前の
スキンの到着イベントに貼り付けましょう。
5.細かい修正
機能的にはこれで完成ですが、このままだとゴシップ設定を共有している状態になります。
自前の設定を持ちたければ、
たとえば<Branch gossip="JUDGMENT/BGM0" type="Gossip">となっている部分の
"JUDGMENT/BGM0"部分を自分の管理したい文字列に置き換える必要があります。
宿やキャンプ画面に「ロード」機能を追加する(Py4以降)
CardWirthでロードを行う(前回のセーブからやり直す)には、F9か冒険の中断を行い、宿を出る→スタートで拠点を再選択する必要があり、これは少々手間です。
Pyではゲームオーバー時に実行できる「ロード」は、ポストコマンドコンテントとしていつでも呼び出すことができるようになっています。但しそちらではクリックした瞬間に確認なくロードされてしまうので、Py4以降、確認ダイアログ付きで「ロード」を行うポストコマンドが実装されました。
1.「ロード」を追加したいXmlを開く
キャンプ画面(シナリオ中)に追加するなら、Resource\Xml\Scenario\-4_Camp.xml
宿内(パーティを開いた状態)に追加するなら、Resource\Xml\Yado\02_Yado2.xml
宿内(パーティ無し)に追加するなら、Resource\Xml\Yado\01_Yado.xml
を、開いて下さい。
2.「ロード」用のシステムメニューカードを追加する
以下のような感じでロード用メニューカードを作ります。
挿入位置は「宿帳を開く」の追加で覚えたように、
他のメニューカードの閉じタグ</MenuCard>の直後からペーストすると安全です。
メニューカードの位置は<Location>タグの数値をいじって調整して下さい。
警告ダイアログつき「ロード」実行カード
<MenuCard arg="LOAD" command="ShowDialog">
<Property>
<Name>ロード</Name>
<ImagePath>[[Resource]]/Image/Card/COMMAND11.bmp</ImagePath>
<Description>ロードを行います。</Description>
<Flag />
<Location left="150" top="75" />
<Size scale="100%" />
</Property>
<Events />
</MenuCard>
警告なし「ロード」実行カード
<MenuCard command="Load">
<Property>
<Name>ロード</Name>
<ImagePath>[[Resource]]/Image/Card/COMMAND11.bmp</ImagePath>
<Description>強制ロードを行います。</Description>
<Flag />
<Location left="150" top="75" />
<Size scale="100%" />
</Property>
<Events />
</MenuCard>
ポストコマンドのため、イベントツリー中でコンテントとして実行させることもできます。
<Post type="Event" arg="LOAD" command="ShowDialog"></Post>
複雑なイベントを作りたい時は、CWXEditorでイベントツリーを作りそれをそのままコピペするのが手っ取り早いですが、CWXEditorではポストコマンドは扱えないので、ツリーの最後に上記のポストコマンドを手動で付け加える必要があります。
JUDGEMENTの2.2以降では、実践例としてパーティ情報ダイアログを開く前に選択肢を設けて、ロードや付属テキストを開く(F8)を実行できるようにしています。こちらも自由にコピペして構いません。
システム変更
血縁システムを師事システムに変更する
CWのシステム上、二世代三世代と育ってくると、親子PCだらけになってしまうので、かつては「父:」「母:」のクーポン部分テキストを改造して、「師:」にする非公式パッチが提供されていました。
これはPyでは
スキンのキーワードを書き換えるだけで達成できますが、BloodWirthでは、そこから更に踏み込み、男女関係なく親に指定することが出来るようになっています。
これは簡単なフラグの変更によって実現しています。
1.Skin.xmlを開く
「親に指定可能な性別のフラグ」はSkin.xmlの<Sexs>タグで管理されています。
以下のfather= mother=の値を両方とも"True"にするだけでOKです。
<Sexes>
<Sex father="True" mother="False" subName="Male">
<Physical agl="0" dex="0" int="0" min="0" str="1" vit="0" />
<Mental aggressive="0.5" brave="0.0" cautious="0.0" cheerful="0.0" trickish="0.0" />
<Name>♂</Name>
</Sex>
<Sex father="False" mother="True" subName="Female">
<Physical agl="0" dex="1" int="0" min="0" str="0" vit="0" />
<Mental aggressive="0.0" brave="0.0" cautious="0.5" cheerful="0.0" trickish="0.0" />
<Name>♀</Name>
</Sex>
</Sexes>
血縁システム関連のキーワードもこのファイル内にあるので、ついでにこれらを書き換えるといいでしょう。デフォルトで入っている「%s」は、CWで言えば「#m」というか、実際に指定したPCの名前が入ります。
つまり、「%sさん」という風に名前の後ろに敬称を付けたりすることも可能です。
<Message key="relation_message">親となる条件を満たしている冒険者が宿にいます。</Message>
<Message key="father">Father</Message>
<Message key="mother">Mother</Message>
<Message key="father_coupon">父:%s</Message>
<Message key="mother_coupon">母:%s</Message>
アクションカードの名前・キーコードを変える
アクションカードの項に注意点を書いていますが、アクションカードの名前を変更する場合、既存のCardWirthシナリオにはアクションカードの名前で判定を行うものも存在するため、互換性を保ちたい場合は元のカード名をキーコードとして追記する必要があります。
JUDGEMENTのアクションカード「クリティカル」を例に取ります。これは単に「会心の一撃」を修正したカードです。
Resource\Xml\ActionCard\03_CriticalAttack.xmlを開く
これはアクションカード「会心の一撃」を定義するXMLです。
名前の変更は<Name>に記載されている名前を直接変更するだけで行えます。
キーコードは<KeyCodes>でひとまとめにセットします。
「攻撃」に加えて「会心の一撃」を追加する必要があるので 攻撃\n会心の一撃 と記述します。
「\n」は改行コードです。
たとえば「攻撃」「魔法による攻撃」を同時に付けたい場合は 攻撃\n魔法による攻撃 と記述します。
改行か改行コードを入れないと単一のキーコードとして処理される点に注意してください。
たとえば 攻撃 魔法による攻撃 と記述した場合は「攻撃 魔法による攻撃」というキーコードになります。
独自イベントの実装
到着イベントやカードイベントの構造がわかってくれば、
CWXEditorの
WSN形式で独自のイベントを作り、
スキンに持ってくることも容易になります。
その際の注意点やテクニックなど。
PCに番号クーポンを配る
CWでキャラクターを操作するには「選択メンバ」にすることが基本です。
シナリオ内で選択メンバを選ぶには_1~6までの番号クーポンを使う事が多いですが、シナリオ開始時に配布する物なので宿内では使用することが出来ません。
これでは不便だという場合は、以下のようにして疑似的に配布してしまいましょう。
start "手動番号クーポン配布"
getcoupon T, ":判定用", 0, false
brcoupon R, false, ":判定用", and, false
sif true
losecoupon M, ":判定用", false
getcoupon M, ":1", 0, false
brcoupon R, false, ":判定用", and, false
sif true
losecoupon M, ":判定用", false
getcoupon M, ":2", 0, false
brcoupon R, false, ":判定用", and, false
sif true
losecoupon M, ":判定用", false
getcoupon M, ":3", 0, false
brcoupon R, false, ":判定用", and, false
sif true
losecoupon M, ":判定用", false
getcoupon M, ":4", 0, false
brcoupon R, false, ":判定用", and, false
sif true
losecoupon M, ":判定用", false
getcoupon M, ":5", 0, false
brcoupon R, false, ":判定用", and, false
sif true
losecoupon M, ":判定用", false
getcoupon M, ":6", 0, false
※基本的にイベント終了前に剥奪するのが安全です。時限称号なのでシナリオから帰ってくれば消えますが、パーティ構成が変わる可能性のある宿帳や、解散エリアに行く前に剥奪しないと順番が狂う可能性が出てきます。念のためStartScenarioでも剥奪した方が良いでしょう。Py4以降は、シナリオ開始時に自動で時限クーポンが消滅する仕様になりました。
背景イメージのレイヤ機能を使う
従来のCardWirthでは「キャストカード」「メニューカード・エネミーカード」「背景セル」の表示優先度は決まっており、
背景セルをカードより前に表示することは絶対にできませんでした。
Py2以降のWSNシナリオでは背景セルのレイヤ値を101以上にすることで、
カードより優先して背景セルを表示することができるようになっています。
これを
スキンに応用することで、自由度の高いインターフェースを作ることができます。が、
スキン(特にyado2)で使う際はひとつ大きな注意点があります。
「04_StartScenario.xml」でレイヤ値のない(0)フルサイズの背景イメージを設定する
これを行わない場合、シナリオの初期エリアの背景設定が「背景継承」になっている場合に上位に表示していたテキストセルやカードに被せていたイメージだけが残るなど、表示が乱れてしまいます。
この問題はCardWirthの背景変更の仕様として、「フルサイズ(620x420)の背景画像をセットした背景変更コンテントもしくはエリア移動」が行われないと古いイメージが取り除かれないために起こります。
「04_StartScenario.xml」の意味と効果
「04_StartScenario.xml」は貼り紙を選択してから、実際にシナリオを開始する前に経由するシステムエリアです。 たとえば宿から交易都市リューンに行くときは、Yado2→貼り紙を選ぶ→StartScenarioの到着イベント→交易都市リューンの開始エリアという順で推移・実行されていきます。
「04_StartScenario.xml」は「
Resource\Xml\Yado」フォルダに格納されています。
スキンに「04_StartScenario.xml」ファイルがない場合は、「skinbase」フォルダにある同名ファイルが認識されています。デフォルトでは以下のように"StartScenario"コマンドを実行して終わるだけのエリアとなっています。
「skinbase」フォルダの「04_StartScenario.xml」の到着イベント
<Events>
<Event>
<Ignitions>
<Number>1</Number>
<KeyCodes />
</Ignitions>
<Contents>
<Start name="エリアイベント">
<Contents>
<Post type="Event" command="StartScenario">
<Contents />
</Post>
</Contents>
</Start>
</Contents>
</Event>
</Events>
これを書き換えて、シナリオに入る前に問題ない背景に変更する処理を加えます。
初めのうちはXMLだけ見てもよく分からないかと思うので、CWXEditorでWSNシナリオを新規作成し、「到着イベントで背景変更コンテントを設置」しただけのエリアを作り、そのXMLを見比べたり、コピペするのがいいでしょう。
JUDGMENT2.0以降に入っているものを改変して使っても構いません。JUDGMENTでは、到着イベントで背景変更コンテントを実行し、「フルサイズの背景イメージを最初に置く」ことで背景継承状況をリセットしています。背景削除コンテント等を使う方法もあります。
記述例。背景変更コンテントでフルサイズMapOfWirthとAdventurersInnを表示後、シナリオへ
<Events>
<Event>
<Ignitions>
<Number>1</Number>
<KeyCodes />
</Ignitions>
<Contents>
<ContentsLine>
<Start name="開始イベント" />
<Change type="BgImage" transition="None" transitionspeed="0">
<BgImages>
<BgImage mask="False">
<ImagePath>Table/MapOfWirth.bmp</ImagePath>
<Flag />
<Location left="0" top="0" />
<Size height="420" width="632" />
</BgImage>
<BgImage mask="False">
<ImagePath>Table/AdventurersInn.bmp</ImagePath>
<Flag />
<Location left="116" top="15" />
<Size height="260" width="400" />
</BgImage>
</BgImages>
</Change>
<Post command="StartScenario" type="Event" />
</ContentsLine>
</Contents>
</Event>
</Events>
「04_StartScenario.xml」から実際にシナリオに入るには、上記の<Post type="Event" command="StartScenario">が実行されなければなりません。これはCWXEditor側では設定できないので、他のスキンなどを見て、適切な位置にコピペして下さい。
XML記法に馴染みのない人は混乱するかもしれませんが、閉じタグを省略したり、パラメータの順序は好きにできます。たとえば以下のように。
<Post command="StartScenario" type="Event" />
スクリーンショットに表示されているリソースは、groupAskによって作成され、CardWirth愛護協会によって配布されている「CardWirth ver1.50 Fullpack」に入っているものです。ReadMe_1st_Full.txt内の「● 著作権/免責/転載に関して」節の内容に基づいてスクリーンショット内に使用しています。
最終更新:2024年06月17日 17:38