スキン > 実践例

「スキン/実践例」の編集履歴(バックアップ)一覧に戻る

スキン/実践例 - (2020/12/16 (水) 23:29:11) のソース

**実践例

このページは書きかけです。(追記歓迎)
XMLの編集実践例をいくつか書いていきます。

#contents(,fromhere=true)

**機能追加

***「仲間を外す」解散エリアに「宿帳」を追加する

 JUDGMENTでは「仲間を外す」(パーティ編成)の中にも「宿帳を開く」が追加されています。これによってキャラを外した空き空間にすぐに別キャラを加入させることができます。便利な機能なので、他のスキンでも使いたいところです。
 今回はClassicスキンに移植してみましょう。

#image(Sample_01_1.jpg)

&bold(){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から持ってきても良いです。中身は同じなので。
 慣れないうちはとりあえず「&bold(){<MenuCard>から</MenuCard>まで全部コピーする}」と覚えておくのがいいでしょう。


&bold(){2.ClassicスキンのResource\Xml\Yado「-3_PartyBreakup.xml」を開く}

 コピーした上記テキストを貼り付けます。
どこに貼り付けるべきかというと
メニューカードの配置を決める<MenuCards>の後ならどこでもいいのですが、
&bold(){変なところに貼り付けてしまうとスキンが開けなくなる}ので
ひとまずは安全のために「次の<MenuCard>の直前に置く」と覚えましょう。

15行目の <MenuCards spreadtype="Custom">の次、<LargeMenuCard command="DissolveParty">より前にに貼り付けて下さい。改行はあってもなくても関係ないです。読みやすい程度に入れましょう。

#image(Sample_01_3.jpg)



&bold(){3.確認してみる}

 それでは、実際にCWPyを起動して確認してみます。

#image(Sample_01_2.jpg)

見事追加することができました!
今回は運良く一発で成功できましたが、現実には変なところに文字を混入させてしまい、「&color(red){起動しなくなった!なんで!?}」ということは非常にありがちなので、いざという時のために編集前のものを丸ごとコピーして別の場所に退避しておくといいです。

解散メニューカードと同じ台紙にしたい時は、
 <MenuCard arg="PLAYERSELECT" command="ShowDialog">
 ↓
 <LargeMenuCard arg="PLAYERSELECT" command="ShowDialog">
とします。
要するにLargeをつけるとキャストカードと同じ大きさになります。



***宿に「BGM変更」機能を追加する
 色んなスキンに追加されていて、今一番需要が多いと思われる機能です。
BloodWirthでは背景に組みこまれていて自然なUIになっていますが、
エフェクトブースターでの背景くりぬき、レイヤ、scenariostartエリアについても
覚えなくてはならないので、とりあえずJUDGMENT型でやってみましょう。


&bold(){1.追加したいスキンのBGMフォルダに追加で再生する音楽ファイルを入れる}
 まずは指定する音楽を入れなければなりません。
JUDGMENTからBGM1~4をコピーしてきます。

JUDGMENTではBGM2~3はmidiになっていますが、&bold(){Pyは拡張子が違っていても再生できる}ので
これらを自前で用意したMP3などにすり替えても構いません。
Pyは&italic(){MIDI, WAV, MP3, OGG}をサポートしています。


&bold(){2.JUDGMENTのResource\Xml\Yado\「02_Yado2.xml」を開く}

 これは、&bold(){パーティを開いた状態}の宿エリアのデータが記録されたXMLです。

前回習得した「メニューカードを移植する方法」が応用できます。
50行目あたりから150行目あたりまでの「レコード」をコピーしましょう。


&bold(){3.追加したいスキンのResource\Xml\Yado\「02_Yado2.xml」を開き、ペースト}

 21行目、<MenuCards spreadtype="Auto">の次以降に貼り付けます。
spreadtypeはカードの並びを自動で中央に並べるか、カスタムで自由に配置するかの設定です。
レイアウトにこだわりたければ"custom"に変えてみましょう。

再生を変更するメニューカードを作るだけならこれにて完了です。
が、これだと宿に入ったタイミングではDefinnのままです。
これを任意に変更できるようにするにはシナリオと同じように「到着イベント」を作る必要があります。


&bold(){4.到着イベントを移植する}

 再度JUDGMENTのYado2.xmlを開いて、到着イベントがどこで設定されているのか探してみます。
「到着」でテキスト検索してみると、273行目にあるのがわかります。
※これはエディタでのデフォルト名なのですべてのスキンでそうなっているとは限りません。

実際にはメニューカードを置き終わったことを示す</MenuCards>の
次の<Events>からが到着イベントとなります。

<Events>から</Events>までを全コピーして、自前のスキンの到着イベントに貼り付けましょう。


&bold(){5.細かい修正}

 機能的にはこれで完成ですが、このままだとゴシップ設定を共有している状態になります。
自前の設定を持ちたければ、
たとえば&bold(){<Branch gossip="JUDGMENT/BGM0" type="Gossip">}となっている部分の
&bold(){"JUDGMENT/BGM0"}部分を自分の管理したい文字列に置き換える必要があります。




***宿やキャンプ画面に「ロード」機能を追加する(Py4以降)
 CardWirthでロードを行う(前回のセーブからやり直す)には、F9か冒険の中断を行い、宿を出る→スタートで拠点を再選択する必要があり、これは少々手間です。

 Pyではゲームオーバー時に実行できる「ロード」は、ポストコマンドコンテントとしていつでも呼び出すことができるようになっています。ただそれだけだとクリックした瞬間に確認なくロードされてしまうので、Py4以降は確認ダイアログ付きで「ロード」を行うポストコマンドが実装されました。


&bold(){1.「ロード」を追加したいXmlを開く}

 キャンプ画面(シナリオ中)に追加するなら、&bold(){Resource\Xml\Scenario\-4_Camp.xml}
 宿内(パーティを開いた状態)に追加するなら、&bold(){Resource\Xml\Yado\02_Yado2.xml}
 宿内(パーティ無し)に追加するなら、&bold(){Resource\Xml\Yado\01_Yado.xml}
 を、開いて下さい。

&bold(){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 arg="Load" command="ShowDialog">の部分は、単に<MenuCard command="Load">とすることもできます。こちらはゲームオーバー画面で使われている機能で、&bold(){警告なしで(ダイアログを開かず)ロードが実行されます。}警告など要らない、もしくはメッセージイベントの選択肢から実行する際はそちらを使っても良いでしょう。

 JUDGEMENTの2.2以降では、実践例としてパーティ情報ダイアログを開く前に選択肢を設けて、ロードや付属テキストを開く(F8)を実行できるようにしています。自由にコピペして下さい。




**システム変更
***血縁システムを師事システムに変更する

 CWのシステム上、二世代三世代と育ってくると、親子PCだらけになってしまうので、かつては「父:」「母:」のクーポン部分テキストを改造して、「師:」にする非公式パッチが提供されていました。
 これはPyではスキンのキーワードを書き換えるだけで達成できますが、BloodWirthでは、そこから更に踏み込み、男女関係なく親に指定することが出来るようになっています。
 これは簡単なフラグの変更によって実現しています。


&bold(){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>


**独自イベントの実装
到着イベントやカードイベントの構造がわかってくれば、
CWXEditorのWSN形式で独自のイベントを作り、スキンに持ってくることも容易になります。
その際の注意点やテクニックなど。


***PCに番号クーポンを配る

 CWでキャラクターを操作するには「選択メンバ」にすることが基本です。
シナリオ内で選択メンバを選ぶには_1~6までの番号クーポンを使う事が多いですが、シナリオ開始時に配布する物なので宿内では使用することが出来ません。
これでは不便だという場合は、以下のようにして疑似的に配布してしまいましょう。

CWXスクリプト(CWXEditorでそのまま貼り付け可能です)
 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

※基本的にイベント終了前に剥奪するのが安全です。時限称号なのでシナリオから帰ってくれば消えますが、パーティ構成が変わる可能性のある宿帳や、解散エリアに行く前に剥奪しないと順番が狂う可能性が出てきます。&s(){念のためStartScenarioでも剥奪した方が良いでしょう。}&bold(){Py4以降は、シナリオ開始時に自動で時限クーポンが消滅する仕様になりました。}

***背景イメージのレイヤ機能を使う
 従来のCardWirthでは「キャストカード」「メニューカード・エネミーカード」「背景セル」表示優先度は決まっており、背景セルをカードより前に表示することは絶対にできませんでした。しかし、PyのWSNシナリオでは背景セルのレイヤ値を101以上にすることで、カードより優先して背景セルを表示することができます。
 これをスキンに応用することで、自由度の高いインターフェースを作ることができますが、スキン(特にyado2)で使う際はひとつ注意点があります。
 
&bold(){「04_StartScenario.xml」でレイヤ値のない(0)フルサイズの背景イメージを設定する}

 これを行わない場合、シナリオの初期エリアの背景設定が「背景継承」になっている場合に&bold(){上位に表示していたテキストセルやカードに被せていたイメージだけが残る}など、表示が乱れてしまいます。
 この問題はCardWirthの背景変更の仕様として、&bold(){「フルサイズ(620x420)の背景画像をセットした背景変更コンテントもしくはエリア移動」}が行われないと古いイメージが取り除かれないために起こります。

&bold(){「04_StartScenario.xml」の意味と効果}
 「04_StartScenario.xml」は&u(){貼り紙を選択してから、実際にシナリオを開始する前に経由}するシステムエリアです。 たとえば宿から交易都市リューンに行くときは、Yado2→貼り紙を選ぶ→StartScenarioの到着イベント→交易都市リューンの開始エリアという順で推移・実行されていきます。

「04_StartScenario.xml」は「Resource\Xml\Yado」フォルダに格納されています。
元のスキンにない・よくわからない場合はJUDGEMENT2.0以降に入っているものをコピー・改変して使っても構いません。JUDGEMENTでは、到着イベントで&bold(){背景変更コンテントを実行し、「フルサイズの背景イメージを最初に置く」}ことで背景継承状況をリセットしています。背景削除コンテント等を使う方法もあります。

スキンに「04_StartScenario.xml」ファイルがない場合は、「skinbase」フォルダにあるものが実行されています。

 <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を見比べたり、コピペするのがいいでしょう。

「04_StartScenario.xml」から実際にシナリオに入るには、到着イベントの最後に「シナリオを開始する」システムコマンドの&bold(){<Post command="StartScenario" type="Event" />}が実行されなければなりません。これはCWXEditor側では設定できないので、他のスキンなどを見て、適切な位置にコピペして下さい。

----
スクリーンショットに表示されているリソースは、groupAskによって作成され、CardWirth愛護協会によって配布されている「CardWirth ver1.50 Fullpack」に入っているものです。ReadMe_1st_Full.txt内の「● 著作権/免責/転載に関して」節の内容に基づいてスクリーンショット内に使用しています。