PSML (Peko Scenario Markup Language) は PVNS で実行されるシナリオを記述するためのマークアップ言語です。
PSML は XML アプリケーションであり、PSML 1.0 ではシーンデータを記述するためのタグセットとして PSML 1.0 Scene を定義しています。PSML 1.0 Scene の XML namespaces URI は次の通りです。
http://tsukuba-bunko.org/ns/psml-scene
PSML 1.0 Scene では、scene をルート要素として、head 要素、body 要素により大きく二つのブロックに分けられます。
以下に、典型的な PSML 1.0 Scene 文書の例を示します。
head タグに囲まれた部分は、この PSML 1.0 Scene 文書(シーンデータ) が表すシーンの情報を記述したヘッダブロックになります。ヘッダブロックには、シーンのタイトル、このシーンが終わった後で次に遷移するシーン、その他、キャンバスに対してシーン固有の設定を行うためのプロパティ設定が記述されます。
body タグで囲まれた部分は、シーンの本文になります。シーンの本文には、シーンを構成する文章要素、舞台要素、選択肢要素がシーンの流れに沿って順番に記述されます。各シーン要素の内容は、それぞれ PSML 1.0 Scene の text タグ、stage タグ、select タグによって囲まれた部分に記述されます。
以下に、PSML 1.0 Scene で定義される各タグについて、その解説を示します。
ここで「空白文字」と呼ぶのは次の 2 種類の文字です。
- 半角空白
(U+0020)
- ISO 制御文字
(U+0000〜U+001F, U+007F〜U+009F)
また、「空文字列」とは、長さが 0 である文字列のことを指します。
これら空白文字・空文字列の取り扱いについては、次のように定義します。
まず、属性値が空文字列だった場合、属性が省略されたものとして処理します。
空文字列ではない場合、属性値に含まれる全ての ISO 制御文字、および、属性値の先頭と最後の半角スペースを除去します。この結果、空文字列になった場合は「妥当性エラー」(警告)になります。
内容モデルが #PCDATA である要素は次の通りです。
これらの要素に含まれる文字列に対しては、文字列に含まれる全ての ISO 制御文字、および、文字列の先頭と最後の半角スペースを除去します。この結果、空文字列になった場合は「妥当性エラー」(警告)になります。
内容モデルが混合モデルである要素は次の通りです。
- p
- item *現在のバージョンでは #PCDATA です。
これらの要素に含まれる文字列に対しては、文字列に含まれる全ての ISO 制御文字を除去します。この結果、空文字列になった場合は、空文字列のまま処理します。
構造要素 |
|
|
|
ヘッダ情報 |
要素名 |
title |
親要素 |
head |
内容モデル |
#PCDATA |
説明 |
必須。このシーンのタイトルを定義する。シーンのタイトルは、PVNS のメインウィンドウのタイトルバーに表示される。
|
|
|
要素名 |
scene-ref |
親要素 |
flow-mapping |
内容モデル |
#PCDATA |
説明 |
シーン終了後に遷移するシーンへの参照を記述する。
|
属性 |
- if
- この scene-ref に記述されたシーンに遷移する場合のフラグ状態を表す、フラグ条件式。フラグ条件式の記述については、共通属性 test の項目を参照。省略された場合、デフォルト遷移先として扱う。
|
|
要素名 |
property |
親要素 |
head |
内容モデル |
Empty |
説明 |
このシーン固有のプロパティを設定する。設定可能なプロパティは、「5.6 シーン固有のカスタマイズ」を参照。設定を行うプロパティは次の二つの属性により指定する。
|
属性 |
- name
- シーン固有の設定を行うプロパティ名。
- value
- シーン固有の設定を行うプロパティの値。
- file
- プロパティ名と値のペアを記述した、プロパティファイル名。プロパティファイルはシーンデータと同じ場所に配置される。name 属性が定義されていた場合、この属性は無視される。
|
|
本文 |
要素名 |
text |
親要素 |
body |
内容モデル |
(p | np | wait)+ |
説明 |
シーン本文の文章要素の内容(台詞やナレーションなどの文章、ページ操作)を記述する。
|
属性 |
- test
- 共通属性 test の項目を参照。
|
|
|
要素名 |
select |
親要素 |
body |
内容モデル |
item+ |
説明 |
プレイヤーに提示する選択肢を記述する。
|
属性 |
- name
- 必須。シナリオ中で選択肢を一意に識別する名前を指定する。
- description
- この選択肢の説明。
- scope
- この選択肢により設定されるフラグのスコープを指定する。
scene , session , system のいずれかを選択して指定する。省略された場合、session が使用される。
- test
- 共通属性 test の項目を参照。
|
|
Actor |
要素名 |
enter |
親要素 |
stage, at-once |
内容モデル |
Empty |
説明 |
役者を舞台に登場させる。
|
属性 |
- name
- 必須。シナリオ中で役者を一意に識別する名前を指定する。
- looks
- 必須。役者の表情を表示するための画像(立ち絵)のファイル名を指定する。
- position
- 役者の舞台上の立ち位置を指定する。
left , center , right のいずれかを選択して指定するか、直接舞台左端から画像の中心線までの距離をピクセル単位で指定する。省略された場合、center が使用される。
- effect
- 登場時に使用する舞台効果名を指定する。省略された場合は、シーン固有のプロパティ、または、リソースで設定されたデフォルト値が使用される。
- test
- 共通属性 test の項目を参照。
|
|
要素名 |
action |
親要素 |
stage, at-once |
内容モデル |
Empty |
説明 |
舞台上の役者に対し、表情および立ち位置の変更を指示する。
|
属性 |
- name
- 必須。変更を指示する役者名を指定する。
- looks
- 役者の表情を表示するための画像(立ち絵)のファイル名を指定する。省略された場合、現在使用している画像がそのまま使用される。
- position
- 役者の舞台上の立ち位置を指定する。指定の方法は enter に従う。省略された場合は、現在の立ち位置がそのまま使用される。
- effect
- 変更時に使用する舞台効果名を指定する。省略された場合は、シーン固有のプロパティ、または、リソースで設定されたデフォルト値が使用される。
- test
- 共通属性 test の項目を参照。
|
|
要素名 |
exit |
親要素 |
stage, at-once |
内容モデル |
Empty |
説明 |
役者を舞台から退場させる。
|
属性 |
- name
- 必須。舞台から退場させる役者名を指定する。
- effect
- 退場時に使用する舞台効果名を指定する。省略された場合は、シーン固有のプロパティ、または、リソースで設定されたデフォルト値が使用される。
- test
- 共通属性 test の項目を参照。
|
|
背景・スライド |
要素名 |
background |
親要素 |
stage, at-once |
内容モデル |
Empty |
説明 |
舞台背景の変更を指示する。背景の内容は image 属性または color 属性を使用して指定する。
|
属性 |
- image
- 背景に使用する画像名を指定する。
- color
- 背景に使用する色を指定する。色は色名または「#RRGGBB」の形式で使用する。image が指定された場合はこの属性の設定は無視される。
- effect
- 背景変更時に使用する舞台効果名を指定する。省略された場合は、シーン固有のプロパティ、または、リソースで設定されたデフォルト値が使用される。
- test
- 共通属性 test の項目を参照。
|
|
要素名 |
show-slide |
親要素 |
stage, at-once |
内容モデル |
Empty |
説明 |
舞台を覆い隠すスクリーンを用意し、スライドをスクリーンに描画する。
|
属性 |
- image
- スライドとして表示する画像名を指定する。
- effect
- スライド描画時に使用する舞台効果名を指定する。省略された場合は、シーン固有のプロパティ、または、リソースで設定されたデフォルト値が使用される。
- test
- 共通属性 test の項目を参照。
|
|
要素名 |
hide-slide |
親要素 |
stage, at-once |
内容モデル |
Empty |
説明 |
スライドの投影を終了し、舞台を通常の状態に戻す。
|
属性 |
- effect
- 背景変更時に使用する舞台効果名を指定する。省略された場合は、シーン固有のプロパティ、または、リソースで設定されたデフォルト値が使用される。
- test
- 共通属性 test の項目を参照。
|
|
グルーピング |
|
サウンド効果 |
要素名 |
play-bgm |
親要素 |
stage |
内容モデル |
Empty |
説明 |
BGM を再生する。
|
属性 |
- id
- 必須。シナリオ中で、再生するBGMを一意に識別する ID を指定する。
- clip
- 必須。再生する音楽クリップ名を指定する。
- loop
- ループ再生するかどうかを
true または false から指定する。省略された場合は true を使用する。
- test
- 共通属性 test の項目を参照。
|
|
要素名 |
play-se |
親要素 |
stage |
内容モデル |
Empty |
説明 |
SE(Sound Effect) の再生を指示する。
|
属性 |
- id
- 必須。シナリオ中で、再生する SE を一意に識別する ID を指定する。
- clip
- 必須。再生する音楽クリップ名を指定する。
- loop
- ループ再生するかどうかを
true または false から指定する。省略された場合は false が指定されたものとして処理する。
- test
- 共通属性 test の項目を参照。
|
|
要素名 |
stop-bgm |
親要素 |
stage |
内容モデル |
Empty |
説明 |
BGM の再生を停止する。
|
属性 |
- id
- 必須。停止する BGM の ID を指定する。
- test
- 共通属性 test の項目を参照。
|
|
要素名 |
stop-se |
親要素 |
stage |
内容モデル |
Empty |
説明 |
SE の再生停止を指示する。
|
属性 |
- id
- 必須。停止する SE の ID を指定する。
- test
- 共通属性 test の項目を参照。
|
|
PSML 1.0 Scene の DTD を示します。PSML 1.0 DTD は次の識別子で識別されます。
<!--
Peko Scenario Markup Language 1.0 Scene DTD
All Rights Reserved.
Copyright (C) 1999-2003 by Tsukuba Bunko.
This DTD module is identified by the follwing PUBLIC and SYSTEM identifiers:
PUBLIC "-//Tsukuba Bunko//DTD PSML Scene 1.0//EN"
SYSTEM "http://softlab.tsukuba-bunko.org/dtd/psml10-scene.dtd"
$Id: psml.html,v 1.4 2003/12/15 16:15:11 ppoi Exp $
-->
<!--==================== Common Attributes =================================-->
<!ENTITY % attr.test "test CDATA #IMPLIED">
<!--==================== Utility Elements ==================================-->
<!ELEMENT wait EMPTY>
<!ATTLIST wait
%attr.test;
dur CDATA #IMPLIED
>
<!ELEMENT flag EMPTY>
<!ATTLIST flag
%attr.test;
id CDATA #REQUIRED
scope (session|system) "session"
action (declare|undeclare) "declare"
>
<!--==================== Text Section Contents =============================-->
<!ENTITY % elements.text "p | np">
<!ELEMENT text (%elements.text; | wait)+>
<!ATTLIST text
%attr.test;
>
<!ELEMENT p (#PCDATA | wait)*>
<!ATTLIST p
%attr.test;
flag CDATA #IMPLIED
>
<!ELEMENT np EMPTY>
<!ATTLIST np
%attr.test;
>
<!--==================== Stage Section Contents ============================-->
<!ENTITY % actor.elements "enter | action | exit">
<!ENTITY % background.elements "background | show-slide | hide-slide">
<!ENTITY % sound.elements "play-bgm | play-se | stop-bgm | stop-se">
<!ELEMENT stage (%actor.elements; | %background.elements; | %sound.elements; | at-once | wait)+>
<!ATTLIST stage
%attr.test;
>
<!ELEMENT enter EMPTY>
<!ATTLIST enter
%attr.test;
name CDATA #REQUIRED
looks CDATA #REQUIRED
position CDATA "center"
effect CDATA #IMPLIED
>
<!ELEMENT action EMPTY>
<!ATTLIST action
%attr.test;
name CDATA #REQUIRED
looks CDATA #IMPLIED
position CDATA #IMPLIED
effect CDATA #IMPLIED
>
<!ELEMENT exit EMPTY>
<!ATTLIST exit
%attr.test;
name CDATA #REQUIRED
effect CDATA #IMPLIED
>
<!ELEMENT background EMPTY>
<!ATTLIST background
%attr.test;
image CDATA #IMPLIED
color CDATA #IMPLIED
effect CDATA #IMPLIED
>
<!ELEMENT show-slide EMPTY>
<!ATTLIST show-slide
%attr.test;
image CDATA #REQUIRED
effect CDATA #IMPLIED
>
<!ELEMENT hide-slide EMPTY>
<!ATTLIST hide-slide
%attr.test;
effect CDATA #IMPLIED
>
<!ELEMENT at-once (%actor.elements; | %background.elements;)+>
<!ATTLIST at-once
%attr.test;
effect CDATA #IMPLIED
>
<!ELEMENT play-bgm EMPTY>
<!ATTLIST play-bgm
%attr.test;
id CDATA #REQUIRED
clip CDATA #REQUIRED
loop (true|false) "true"
>
<!ELEMENT play-se EMPTY>
<!ATTLIST play-se
%attr.test;
id CDATA #REQUIRED
clip CDATA #REQUIRED
loop (true|false) "false"
>
<!ELEMENT stop-bgm EMPTY>
<!ATTLIST stop-bgm
%attr.test;
id CDATA #REQUIRED
>
<!ELEMENT stop-se EMPTY>
<!ATTLIST stop-se
%attr.test;
id CDATA #REQUIRED
>
<!--==================== Select Section Contents ===========================-->
<!ELEMENT select (item)+>
<!ATTLIST select
%attr.test;
name CDATA #REQUIRED
description CDATA #IMPLIED
>
<!ELEMENT item (#PCDATA)>
<!ATTLIST item
%attr.test;
id CDATA #REQUIRED
next-scene CDATA #IMPLIED
immediate (true|false) "false"
>
<!--==================== Document Structure ================================-->
<!ELEMENT scene (head, body)>
<!ATTLIST scene
xmlns CDATA #IMPLIED
xml:lang CDATA #IMPLIED
>
<!ELEMENT head (title, next-scene?, property*)>
<!ELEMENT body (text | select | stage | flag)+>
<!ELEMENT title (#PCDATA)>
<!ELEMENT next-scene (#PCDATA)>
<!ELEMENT property EMPTY>
<!ATTLIST property
name CDATA #IMPLIED
value CDATA #IMPLIED
file CDATA #IMPLIED
>