Shell設定 - surfaces.txt

surfaces.txt

概要

シェルの各種定義を行うためのファイル。基本的に全て省略可。必要なものだけ書く。
例えば各サーフェス(表情・パーツ・コマ・着せ替えパーツ)へのアニメーション、当り判定、画像の合成などの設定はここで行う。
またサーフェスIDに対して別名(エイリアス)を与えたい場合もここで設定できる。
SSPではその他にも、当り判定にカーソルを乗せ続けた時に表示されるツールチップや、カーソル表示の変更などの設定も行える。

一方で、シェル名、シェル作者名などのシェルの基本情報に関する設定や、着せ替えのオーナードローメニュー(右クリックメニュー)の表示設定などはここではなくdescript.txtで行うので注意。

基本の書式

基本的にほとんどの設定が省略可能であり、必要に応じて各設定を行えばよい。

設定は、書くとすれば必ず一行目に書く必要があるcharsetの他は、それぞれ「{」と「}」で囲まれた各ブレス内に記述する(各ブレスについてはこのページ内のそれぞれの項目参照)。

「{」および「}」はそれのみが書かれた行として存在する必要があり、例えば「surface1 {」のようにブレス名に続けて書く事はできない。

ブレス名
{
// 設定内容
}

ブレス名、{}、各設定として認識されない行はすべてコメント行として扱われる。慣例的には行頭を「//」から始める。

各行インデント可。

SSPのみ「surfaces***.txt(***は任意の文字列)」という名前のテキストファイルは全て読み込まれ、surfaces.txtと同様に扱われる。読み込み対象となるファイルが複数ある場合、読み込まれる順序はファイル名順となる。

なお、複数のsurfaces***.txtを用意した場合、descriptブレスの設定(およびcharset)はそれぞれのファイルに設定する必要がある(逆に言うとそれぞれのファイルで異なる設定が可能)。

記述例

charset,Shift_JIS

descript
{
version,1
}

surface0
{
animation0.interval,sometimes
animation0.pattern0,overlay,101,100,168,67
animation0.pattern1,overlay,100,100,168,67
animation0.pattern2,overlay,101,100,168,67
animation0.pattern3,overlay,-1,100,168,67
}

surface1
{
element0,overlay,body0.png,0,0
element1,overlay,face1.png,0,0
}

surface10
{
collision0,40,56,95,90,Head

sakura.balloon.offsetx,80
sakura.balloon.offsety,-100
kero.balloon.offsetx,-30
kero.balloon.offsety,20
}

// SSPのみで有効な記法 ←このようにコメント行は//から始める
surface.append0-9
{
collision0,188,25,252,63,Head
collision1,190,92,236,118,Face
collision2,180,191,220,222,Bust
collision3,154,311,248,362,Skirt
}

surfaces.txt または surfaces**.txt(SSPのみ)

charset,文字コード

表示する文字コード。Shift_JIS推奨。

SSPにおいて複数のsurfaces***.txtを用意した場合はそれぞれのファイルに設定する必要がある(逆に言うとそれぞれのファイルで異なる設定が可能)。

不明

  • SSP
  • CROW

descriptブレス

descriptブレス記述例

SSPで複数のsurfaces***.txtを用意した場合はそれぞれのファイルに設定する必要がある(逆に言うとそれぞれのファイルで異なる設定が可能)。

descript
{
version,1
collision-sort,ascend
animation-sort,ascend
}
version,*

使用するSERIKO定義の書式のバージョン指定。0でSERIKO/1.x系書式(旧定義)、1でSERIKO/2.0書式。

0

  • Materia
  • SSP
  • CROW
maxwidth,ピクセル

※SSPでは自動的に検出されるためこの情報は利用されない。
サーフェスの最大幅。単位はピクセル。重なり判定などで利用される。

定義なし/SSPでは実際のsurface定義における最大横幅

  • Materia
  • SSP
  • CROW
collision-sort,ソート順序

当たり判定の判定順ソート。手前から奥にどの順で表示するか。
ascendで昇順(1,2,3...) descendで降順(10,9,8...)

none(IDによらず先に書かれている方が手前)

  • SSP
animation-sort,ソート順序

アニメーションID表示順ソート。手前から奥にどの順で表示するか。
ascendで昇順(1,2,3...) descendで降順(10,9,8...)

descend

  • SSP

surfaceブレス

surfaceブレス記述例

surface1
{
element0,overlay,body0.png,0,0
element1,overlay,face0.png,0,0

collision0,188,25,252,63,Head
collision1,190,92,236,118,Face
collision2,180,191,220,222,Bust
collision3,154,311,248,362,Skirt

animation0.interval,sometimes
animation0.pattern0,overlay,101,100,168,67
animation0.pattern1,overlay,100,100,168,67
animation0.pattern2,overlay,101,100,168,67
animation0.pattern3,overlay,-1,100,168,67
}

SSPのみ追加指定(すでに定義済みのものに対してさらに定義を後付けする)用記法surace.appendがある。
詳細は後述

surface.append1-9,20-29
{
// 略(ふつうのsurfaceブレスと同様)
}

surface(.append)*の*部分に、サーフェスIDとなる数字を指定。複数指定、範囲指定が可能(後述)。

なおそれ以外の各行の数字部分については各定義の説明参照。

アニメーション(SERIKO)

概要

伺かのシェルはアニメーション機能を持つ。これは静止画像であるコマを連続的に描画することによって動画的表現を行うものである。

アニメーションは各サーフェスに対して設定される。そしてアニメーションの各コマとして用いる画像もまた別のサーフェスである。このときコマとして参照された側がまたさらにアニメーション定義を持っていたとしても、普通それは無視される(ただしSSPに限り、多重着せ替えと言う仕組みがある。着せ替えの節参照)。

各サーフェスへの設定では、アニメーション自体をいつ開始するか、各コマにどのサーフェスを使い、どのような方法・時間間隔で描画するかといった内容を定義する必要がある。

なお、surfaces.txtにおける一連のアニメーションに関する仕様にはSERIKOという名前が与えられている。

基本書式と記述例


surface0
{
// 瞬き
animation0.interval,rarely
animation0.pattern0,overlay,101,700,200,100
animation0.pattern1,overlay,102,700,200,100
animation0.pattern2,overlay,101,700,200,100
animation0.pattern3,overlay,-1,700,0,0

// トークに合わせて口を動かす
animation10.interval,talk,2
animation10.pattern0,overlay,200,700,200,120
animation10.pattern1,overlay,201,700,200,120
animation10.pattern2,overlay,202,700,200,120
animation10.pattern3,overlay,-1,700,0,0
}

surfaces.txtにおけるアニメーションの定義は、例えば以上のようになる。

上記では、surface0に対して「瞬き」「トークに合わせて口を動かす」の2つアニメーションを定義している。

全てのアニメーション定義はinterval定義とpattern定義を含んでいる。他にオプション定義や、SSPの場合はアニメーション専用の触り判定定義もあるが、それらが省略可能なのに対して、interval定義は省略不能であり、また一連のアニメーション定義の先頭に出現する必要がある。pattern定義も少なくとも一つは存在する必要がある。

interval定義はアニメーションがいつ再生されるかの設定である。上例では「rarely」「talk」「never」の三種類の指定が登場している。詳細はアニメーションインターバルの節を参照されたいが、大意として「瞬き」アニメーションはときどき再生され、「トークに合わせて口を動かす」アニメーションはキャラクターが2文字喋るごとに再生されるようになっている。

pattern定義はアニメーションの各「コマ」の設定である。そのコマの描画メソッド(描画メソッドの節参照)、表示するまでの待ち時間、そのコマを下のコマに対してどれだけ位置をずらして描画するかについて設定を行う。pattern定義はコマが必要なだけ用意すればよい。pattern*の*にある数字は、0から始まる連番である。

各アニメーションの関係

全てのアニメーションにはIDが与えられる(具体的な指定はanimation*.intervalの節参照)。

IDは単一のサーフェス内で重複が許されず、また異なるサーフェス間において同じIDをもつアニメーションは同じ意味を持つことが期待される。例えばキャラクターが正面を向いているsurface0と、横を向いているsurface1があったときに、その両方に「瞬き」のアニメーションを設定するとする。この時、キャラクターの姿勢の違いから実際に瞬きを表現するコマにあたる画像は違うものになるはずであるが、それにもかかわらず両方のサーフェスで同じアニメーションIDが与えられるべきである。特に後述の着せ替えにおいてはこのIDと意味との関連付けは必須となる。

全ての異なるアニメーションは基本的に独立しており、非同期的に開始・終了する。
例えば瞬きをするアニメーションと、トークに合わせて口元が動くアニメーションは、互いに他方が動いていようがいまいが気にせず開始・終了すべきであろうし、実際IDの異なるアニメーションとして定義されている限りはそのように動作する。

しかしその一方で、startやalternativestartなどの、他のアニメーションを実行するための特殊な描画メソッドによって、アニメーション自体を他のアニメーションを実行するトリガとする仕組みも用意されている。
また、exclusiveオプションの指定により、排他的なアニメーションを実行することも可能である。

着せ替え(MAYUNA)

概要

伺かのシェルは、着せ替えと呼ばれる仕組みを持つ。これは単一のシェル内で、複数の衣装などのパーツの表示・非表示や種類の切り替えを行うためのものである。

伺かのシェルにおける着せ替えは、アニメーションの一種として位置づけられる。
ただし他のアニメーションのようにコマ送りされず、アニメーションの開始時に即時全てのコマ(pattern)およびベースのサーフェスが合成されて、以後静止画として扱われる点が特徴である(従ってpattern定義のウェイトパラメータは無視される)。
この「描画があたかもベースサーフェスと一体化したかのように振舞う」という性質は、衣服のようなものを表現する目的に良く適う。

着せ替えのアニメーションとしての開始・終了は、主にオーナードローメニューの着せ替えメニューからスイッチする事で制御される。SSPの場合はそれに加えて、さくらスクリプトの\![bind]タグを用いたゴースト側からの制御が可能である。
オーナードローメニュー側の設定は、surfaces.txtではなくdescript.txtで行うので、そちらのページを参照。

なお、surfaces.txtにおける一連のアニメーションに関する仕様にはMAYUNAという名前が与えられている。

基本書式と記述例


surface0
{
// 服1の定義 アニメーションIDは0
animation0.interval,bind
animation0.pattern0,add,500,0,50,100

// 服2の定義 アニメーションIDは1
animation1.interval,bind
animation1.pattern0,add,501,0,50,100
}

//--- 以下着せ替えパーツ定義 ---
// 服1
surface500
{
element0,overlay,dress1.png,0,0
}

// 服2
surface501
{
element0,overlay,dress2.png,0,0
}

surfaces.txtにおける着せ替えの定義は、例えば以上のようになる。

上記では、surface0に対して「服1」と「服2」の二つの着せ替えを定義している。

通常のアニメーション定義同様、interval定義とpattern定義が必要である。interval定義にbindを指定する事で、そのアニメーションが着せ替えの定義である事を示す。

アニメーションの場合pattern定義はコマの数だけ行うが、着せ替えの場合は静止画仕様であるので、コマというよりはパーツを必要なだけ合成することになる。例のように着せ替えを構成するパーツが一つで済むならば、pattern行は1行のみになる。また着せ替えの場合各パーツは即時合成されるので、ウェイトパラメータは無視される。

pattern定義の描画メソッドについては後述。

利用可能な描画メソッド

MATERIA(本家伺か)においては、着せ替えのために用意された4つのメソッド、すなわち「bind」「add」「reduce」「insert」が利用可能であった。このうちbindは旧仕様で、addが上位互換にあたる。

SSPにおいては、普通のアニメーション描画メソッドとして用意されたものの一部が着せ替えでも利用可能である。

具体的に着せ替えで利用できる描画メソッドなどの詳細については描画メソッドの節参照。

インターバルの組み合わせ指定におけるbind

SSPにおいては、アニメーションインターバルの節で触れているように、インターバルの組み合わせ指定が可能である。

組み合わせ指定の中にbindを含めた場合のアニメーションは、bind単体であれば本来持っていた静止画仕様であるという性質は失う(pattern定義のウェイトパラメータが無視されなくなる)。しかしアニメーションの寿命は変わらないので、例えばbind+runonceのような組み合わせ指定の場合、すべてのpatternの描画が終わった時点の表示が、以後ベースサーフェスの変更または着せ替え状態の変化があるまで継続し続けることになる。

従って、bindを含むインターバル組み合わせ指定では、pattern定義の最終行においてアニメーションの終了を行わず、静止画として残したい描画を合成しておくべきである。

多重着せ替え定義(SSPのみ)

アニメーションのコマとして参照した先のsurfaceに、そのsurfaceのアニメーションが定義されていた場合、通常それらは無視される。

しかしSSPではintervalがbindのアニメーション(=着せ替え)のみ無視されず反映されるようになっている。

これによって、着せ替えの影響を受けるような構造のアニメーションについて、アニメーションのコマ側で着せ替えに応じた定義を行う事が可能である。

なお多重着せ替えを入れ子にする事も可能であるが、循環的な参照は無視される。

SERIKOの旧定義と新定義について

SERIKOの新定義と旧定義とは

本家伺か(MATERIA)の開発末期のバージョンで、surfaces.txtへのSERIKO(アニメーション)に関する設定書式に変更がありました。
これについて本家仕様書にあるSERIKO/1.x系の従来書式の事を旧定義、対する公式にドキュメント化されないままとなった新たな書式(SERIKO/2.0)のことを新定義と呼ぶ事があります。

なお、これとは全く別に、MATERIA開発終了後にSSPなどがsufraces.txtの書式について独自に追加した記法などがあります(例えばsurface.appendや、surface1-9といった範囲指定)。
これを含めて新定義と呼ぶ人や文献があるかもしれませんが、少なくともukadocで言う新旧定義はあくまでそのような用法ではなく、SERIKOの書式についての言葉である点に注意してください。

新定義と旧定義の違い

新定義における書式の変更点は以下の四つです。

  1. SERIKO関連の定義行を全て「animation」の語からはじめるように変更。
  2. pattern定義行のパラメータの順序が変更された(描画メソッド指定を先頭に移動)。
  3. pattern定義のウェイトパラメータの単位が、10ミリ秒から1ミリ秒に変更された。
  4. 描画メソッドのalternativestartで、ID指定の括弧が[]から()に変更された。

これに加え、descriptブレスを設けて「version,1」の定義を行うことが必要です。

以下は同じ定義内容の旧定義と新定義の例です。

// 旧定義
surface1
{
0interval,rarely
0pattern0,0,0,alternativestart,[1.2]

1interval,never
1pattern0,101,70,overlay,200,100
1pattern1,102,70,overlay,200,100
1pattern2,101,70,overlay,200,100
1pattern3,-1,70,overlay,0,0

2interval,never
2pattern0,101,70,overlay,200,100
2pattern1,102,70,overlay,200,100
2pattern2,101,70,overlay,200,100
2pattern3,-1,70,overlay,0,0
2pattern4,101,70,overlay,200,100
2pattern5,102,70,overlay,200,100
2pattern6,101,70,overlay,0,0
2pattern7,-1,70,overlay,0,0
}
// 新定義
surface1
{
animation0.interval,rarely
animation0.pattern0,alternativestart,(1.2)

animation1.interval,never
animation1.pattern0,overlay,101,700,200,100
animation1.pattern1,overlay,102,700,200,100
animation1.pattern2,overlay,101,700,200,100
animation1.pattern3,overlay,-1,700,0,0

animation2.interval,never
animation2.pattern0,overlay,101,700,200,100
animation2.pattern1,overlay,102,700,200,100
animation2.pattern2,overlay,101,700,200,100
animation2.pattern3,overlay,-1,700,0,0
animation2.pattern4,overlay,101,700,200,100
animation2.pattern5,overlay,102,700,200,100
animation2.pattern6,overlay,101,700,200,100
animation2.pattern7,overlay,-1,700,0,0
}
  • アニメーションID
  • パターンID
  • サーフェスID
  • 描画メソッド
  • ウェイト
  • x座標
  • y座標

先頭が「animation」から始まるようになった他、ウェイトの数値が10倍になっていること、描画メソッドの指定がパラメータの先頭に移動したことに注意してください。
またalternativestartは[]が()に変更されているほか、alternativestartの場合無視されるパラメータである「サーフェスID」「ウェイト」について、旧定義ではダミーの数値0を書いていたのに対し、新定義では描画メソッドが先頭に移動した関係から、「合成位置x,y」含めて丸ごと省略できていることもわかるかと思います。

新定義で記述する利点

  • SSPが独自に追加した設定(このページにある項目でMateriaの表示がなくSSPの表示のみがあるもの)については、旧定義で書かれる事が想定されていない場合があります。
    今後追加されるあらゆる設定にも同様の事がいえます。
    こうした設定を利用する場合は、新定義で記述することが望ましいでしょう(旧定義だと正常動作しない可能性がある)。
    その場合、新旧定義を混在させるとエラーとなるので、新定義に統一する必要があります。
  • ウェイトの単位が10msから1msに変更され、より細やかな設定が可能になります。
  • また上例で見た通り、描画メソッドがパラメータの先頭に移動した事で、startやalternativestartのような特殊な描画メソッドで無視されるパラメータが綺麗に省略されることも利点かもしれません。
  • 他に、「animation」の語句が明示される事で、SERIKOに関する定義のまとまりが強調され、よりその行の意味が解りやすくなる面もあるかもしれませんが、およそ見やすさというものは慣れや個人差によるところが大であり、旧定義の方が親しんでいるし見やすいというのも自然な感じ方です。

以上のような点にメリットを感じない場合、SSPのみでの対応を考えるなら必ずしも移行する意味はないかもしれません。

なお、UKADOCでは基本的にSERIKOに関しては新定義で記述を行っているため、旧定義の記述で書きたい場合は上記を参考に適宜読み替えてください。

surface*ブレスで可能なID指定

以下の各記法は併用可能。いずれもSSP専用。

列挙指定「,」
surface1,3,4,6,12
{
// 略
}
のように「,」区切りでIDを指定することで、複数のサーフェスに対して同じ内容で定義することが可能。
範囲指定「-」
surface1-12
{
// 略
}
のように「-」を用いてIDを指定する事で、番号が連続する範囲の(例の場合surface1から12まで)複数のサーフェスに対して同じ内容で定義することが可能。
範囲指定の除外指定「!」
surface1-30,!15,!20-25
{
// 略
}
のように、「!」に続けて単独または範囲指定したIDは、その定義の対象から除外される(例の場合結局surface1-14,16-19,26-30などとした場合と同義)。
なお、!による除外は記述の位置によらず他の指定よりも優先される(例えばsurface1-10,!2-4,3などと!の後に追記しても3は除外される)。

materia本来の仕様では、以下のようなsurface付での列挙指定のみ許される。

surface1,surface3,surface4
{
// 略
}

surface*ブレスとsurface.append*ブレス

surface.appendによる定義は、「既に(surfaceブレス、またはsuface*.pngの存在によって)ある定義」に対してのみ付け加えられる。

従って例えば、

surface1,3
{
collision0,188,25,252,63,Head
collision1,180,191,220,222,Bust
}

の後に、追加定義のつもりで

surface1-3
{
animation0.interval,sometimes
animation0.pattern0,overlay,101,100,168,67
animation0.pattern1,overlay,100,100,168,67
animation0.pattern2,overlay,101,100,168,67
animation0.pattern3,overlay,-1,100,168,67
}

などとすると、本来定義するつもりのない「surface2」が新設されて、定義が行われてしまう。

このため、appendを使わない範囲指定の追加定義は「覚えのない重複定義エラー」などの原因になり得る。しかし、

surface.append1-3
{
// 略
}

とした場合は、既に定義のある「surface1」および「surface3」のみにappendで追加した定義が加わり、予め存在しない「surface2」は内部的にも新設されない

なお、この関係から、surfaceブレスは定義ファイル(surfaces.txtなど)内でsurface.appendブレスより先に書く必要がある事に注意。

ベースサーフェス

ベースサーフェス

各surfaceの基本的状態となる、アニメーションが合成される前の画像をベースサーフェスと呼ぶ。

アニメーションは通常ベースサーフェスの上位(画面手前側)に描画されることとなる。

ベースサーフェスの実体

あるsurfaceのベースサーフェスは、IDに対応するsurface*.pngと、IDに対応するsurfaceブレスでのelement指定で定義される。

surface*.pngがあるサーフェスでは、その画像がsurface*のベースサーフェスとなる。ただし同時にelement0が定義されている場合、surface*.pngの内容は破棄されelement0の定義内容で置き換わる(これは互換性確保のための仕様である)。

element1以降の定義がある場合は、それらの上に積み重なる形で順次合成され、最終的な合成結果がベースサーフェスとして扱われる。

ベースサーフェスのサイズとアニメーション合成

アニメーション定義で、ベースサーフェスの透過部分を含めたサイズよりも大きな画像を合成しようとした場合の挙動は、現状ベースウェアの実装に委ねられている。

MATERIAではベースサーフェスからはみ出した部分は表示されない。

CROWではベースサーフェスからはみ出すような画像を合成しようとすると、正しく描画されなくなる。

SSPにおいてはベースサーフェスよりも大きな画像を合成することが許されており、ベースサーフェス側で不足したサイズ分の透過領域が補われた上で合成が行われるような挙動となる。animation-patternのX座標・Y座標値が0,0の場合、ベースサーフェスの本来の画像左上と、アニメーション側の画像左上が重なるように配置される。座標値は負値を設定することも可能である。

各要素の上下構造

上位と下位

以下画面手前側を上位、画面奥側を下位として表現する。

各パーツの上下構造

elementおよび着せ替え(インターバルがbindのアニメーション)では、それぞれelementID・patternIDが小さい方が下位、大きい方が上位となる。

ベースサーフェスと各アニメーションの上下構造

ベースサーフェスは基本的にすべての合成の最下位に置かれる画像だが、SSPのbackgroundオプションが指定されたアニメーションは、ベースサーフェスより下位に(裏に)合成される。

着せ替えを含む各アニメーション間の上下構造は、通常アニメーションIDの大きい方から降順で上位となる(番号が大きい方から画面手前側に配置される)。ただしSSPではdescriptブレスでanimation-sort定義を行えば、昇順にもできる。

当たり判定(collision)の上下構造

あるサーフェスの当たり判定は、基本的にsurfaces.txtにおいて先に登場したcollision定義が上位となる。ただしSSPではdescriptブレスでcollision-sort定義を行えば、collisionIDを基準として昇順・降順にも設定できる。

またSSPではanimation*.collisionの設定によって、特定のアニメーションが表示されている場合にのみ有効な当たり判定が設定できる。この場合はまず各アニメーションの上下構造が考慮された上で、それぞれアニメーション・ベースサーフェスの当たり判定が通常どおりの順序で評価される。

animation-sortの設定がdescendの場合を例としてまとめると、上位から下位へ順に

  1. IDがより大きい通常のアニメーションの、より上位の当たり判定
  2. IDがより大きい通常のアニメーションの、より下位の当たり判定
  3. IDがより小さい通常のアニメーションの、より上位の当たり判定
  4. IDがより小さい通常のアニメーションの、より下位の当たり判定
  5. ベースサーフェスの、より上位の当たり判定
  6. ベースサーフェスの、より下位の当たり判定
  7. IDがより大きいbackgroundオプション付アニメーションの、より上位の当たり判定
  8. IDがより大きいbackgroundオプション付アニメーションの、より下位の当たり判定
  9. IDがより小さいbackgroundオプション付アニメーションの、より上位の当たり判定
  10. IDがより小さいbackgroundオプション付アニメーションの、より下位の当たり判定

となる(ここでいうアニメーションには着せ替えも含む)。

サーフェスIDの割り振り

どんな表情・内容にどのサーフェスIDを割り振るかは、基本的に自由。

ただしsurface0,surface10はそれぞれデフォルトサーフェスとして必須とされ、たとえ相方側のないゴーストであってもsurface10として透明な画像などを用意する必要がある(SSPに限っては、必須とまではされない。またdescriptなどの設定でデフォルトサーフェスの変更も可能)。

また、一応の「事実上の標準」のようなIDの割り振りがあるので以下に示す。あくまで以下の割り振りは(0,10以外は)必須ではなく参考程度のもので、基本的には自由。

sakura側

  • 00 素
  • 01 照れ
  • 02 驚き
  • 03 不安
  • 04 落ち込み
  • 05 微笑み
  • 06 目閉じ
  • 07 怒り
  • 08 冷笑
  • 09 照れ怒り
  • 25 歌

kero側

  • 10 素
  • 11 刮目
  • 19 歌

なお、MATERIAではsurfaceIDにつかえる数字は0から8192までという制限がある。

element*,描画メソッド,ファイル名,X座標,Y座標

ベースサーフェスの合成。
複数の画像を合成し、その合成結果をベースサーフェスとして一枚の画像のように扱う仕組み。
サーフェスに対応するsurface*.pngという画像がある場合、element0が定義されていると元のsurface*.pngの内容が破棄されて、element0で置き換えられる
element1以降は、その上に順次合成されていく。
SSP2.3.53からは、element定義されたサーフェスをアニメーションパーツとして用いた場合も、一枚の画像のように振る舞う(以前は未定義)。
*の部分(elementID)は同じsurface内で一貫した、0から始まる通し番号。
描画メソッドは下記の描画メソッド参照。

挙動なし

  • Materia
  • SSP
  • CROW
animation*.interval,インターバル

アニメーションが開始するタイミング(周期)の定義。
インターバルは下記のアニメーションインターバル参照。SSPのみ+区切りで列挙する事で組み合わせ指定が可能。
*の部分(animationID)は任意の数字。そのスコープ内(\0、\1、...)の全surfaceで、共通して同じIDのアニメーションが同じ意味(例えば「瞬き」「口パク」「同じ服の着せ替え」など)を持つようにする。
interval定義はそのIDのアニメーション定義全体の始点を示し、一連のanimation定義の中で必ず最初に記述されなければならない。
アニメーションの重なり方とIDの順序の関係はanimation-sort参照。
旧定義:*interval,インターバル

挙動なし

  • Materia
  • SSP
  • CROW
animation*.pattern*,描画メソッド,サーフェスID,ウェイト,X座標,Y座標

アニメーションの各コマの定義。各コマは通常それ以前のコマをリセットして新たにベースサーフェスに合成される形で描画される(厳密には描画メソッドによる)。
animationに続く*の部分はanimationID(animation*.intervalの*と同一)。
patternに次ぐ*の部分(パターンID)は、一連のanimation*.pattern定義において0から始まる通し番号。materiaでは127が上限。番号の小さい方から積み重なる形で描画される。
描画メソッドは下記の描画メソッド参照。
ウェイトはそのコマを描画するまでの待ち時間。単位はミリ秒。SSPのみ「最小ウェイト-最大ウェイト」とマイナス文字で区切った書き方もでき、その場合は最小~最大間でランダムに選択される。
X座標、Y座標はそのコマをベース(そのコマまでの描画結果)に対してどれだけずらして表示するかの指定。
サーフェスIDに-1でそのアニメーションの停止、-2で現在実行中の他の全てのアニメーションを停止する事ができる。いずれの場合も描画メソッドやX座標、Y座標は無視される。
旧定義:*pattern*,サーフェスID,ウェイト,描画メソッド,X座標,Y座標

挙動なし

  • Materia
  • SSP
  • CROW
animation*.option,exclusive

アニメーションの排他的実行オプション。
即ちexclusiveオプションが指定されたアニメーションが実行された時点で、他のすべてのアニメーションが停止し、またexclusiveオプションのアニメーションの終了まで、他のいかなるアニメーションも新たに開始されない。
animationに続く*の部分はanimationID(animation*.intervalの*と同一)。
なおintervalがbindのアニメーションについてはこの指定は未定義である。
SSPのみ、animation*.option,exclusive,(1,3,5)のようにすると、指定IDのアニメーションに対してのみ限定的に排他制御することができる。
旧定義:*option,exclusive

挙動なし

  • Materia
  • SSP
  • CROW
animation*.option,background

アニメーションの背面実行オプション。
backgroundオプションが指定されたアニメーションはベースサーフェスの後ろ(画面奥側)で実行される。
animationに続く*の部分はanimationID(animation*.intervalの*と同一)。

挙動なし

  • SSP
animation*.option,オプション

exclusiveおよびbackgroundオプションの同時指定。
+区切りで複数オプション可。例:exclusive+background
animationに続く*の部分はanimationID(animation*.intervalの*と同一)。
animation*.option,exclusive+background,(1,3,5) のようにすると、exclusiveのみ影響を受ける。
なおintervalがbindのアニメーションについてはexclusive指定はそもそも未定義である。

挙動なし

  • SSP
animation*.collision*,当たり判定定義
animation*.collisionex*,当たり判定定義(ex)

通常のcollisioncollisionexのアニメーション動作中限定の定義。インターバルbindにも有効。
animationに続く*の部分はanimationID(animation*.intervalの*と同一)。
collisionに次ぐ*の部分は、一連のanimation*.collision定義内で重複しない番号。

挙動なし

  • SSP
collision*,始点X,始点Y,終点X,終点Y,ID

当たり判定。囲まれた範囲がIDの領域となる。
*の部分(collisionID)は、同じsurface内で重複しない通し番号。
当たり判定の重なり方とIDの順序の関係はcollision-sort参照。

挙動なし

  • Materia
  • SSP
  • CROW
collisionex*,ID,タイプ,座標1,座標2...

不定形当たり判定。
*の部分(collisionID)は、同じsurface内で重複しない通し番号。
タイプは以下の通り。

rect
長方形。座標は始点XYと終点XYの4つ。例:100,100,200,300
ellipse
楕円。座標は楕円を囲む長方形、始点XYと終点XYの4つ。例:100,100,200,300
circle
真円。中心点のXYの値、半径の順で記述する。例:100,200,20
polygon
多角形。座標は各頂点、交差可。例:100,100,200,300,50,200

挙動なし

  • SSP
sakura.balloon.offsetx,座標

そのサーフェスでのみの本体側バルーン位置X座標。

通常:バルーンの左右端と、サーフェスの右左端が揃う位置
align=top/bottom:サーフェスの中央

  • Materia
  • SSP
  • CROW
sakura.balloon.offsety,座標

そのサーフェスでのみの本体側バルーン位置Y座標。

通常:バルーンの上端と、サーフェスの上端が揃う位置
align=top/bottom:バルーンの上下端と、サーフェスの下上端が揃う位置

  • Materia
  • SSP
  • CROW
kero.balloon.offsetx,座標

そのサーフェスでのみの相方側バルーン位置X座標。

通常:バルーンの左右端と、サーフェスの右左端が揃う位置
align=top/bottom:サーフェスの中央

  • Materia
  • SSP
  • CROW
kero.balloon.offsety,座標

そのサーフェスでのみの相方側バルーン位置Y座標。

通常:バルーンの上端と、サーフェスの上端が揃う位置
align=top/bottom:バルーンの上下端と、サーフェスの下上端が揃う位置

  • Materia
  • SSP
  • CROW
balloon.offsetx,座標

そのサーフェスでのみのバルーン位置X座標(本体・相方問わず)。
offset.xとも記述可能。

通常:バルーンの左右端と、サーフェスの右左端が揃う位置
align=top/bottom:サーフェスの中央

  • SSP
balloon.offsety,座標

そのサーフェスでのみのバルーン位置Y座標(本体・相方問わず)。。
offset.xとも記述可能。

通常:バルーンの上端と、サーフェスの上端が揃う位置
align=top/bottom:バルーンの上下端と、サーフェスの下上端が揃う位置

  • SSP
point.centerx,座標

サーフェスの中心X座標。
通常は使用されないが、Sakura APIなど外部から取得可能。

サーフィスの中心(幅÷2)

  • Materia
  • SSP
  • CROW
point.centery,座標

サーフェスの中心Y座標。
通常は使用されないが、Sakura APIなど外部から取得可能。

サーフェスの中心(高さ÷2)

  • Materia
  • SSP
  • CROW
point.kinoko.centerx,座標

きのこの生えるX座標。

サーフェスの中心(幅÷2)

  • Materia
  • SSP
  • CROW
point.kinoko.centery,座標

きのこの生えるY座標。

サーフェスの上端+20ピクセル下(SSP)

  • Materia
  • SSP
  • CROW
point.basepos.x,座標

ウインドウを初期配置・位置保存する際の基準位置のX座標。
異なるサーフェスサイズの画像に切り替えた際の位置ずれなどを調整することができる。

サーフェスの中心(幅÷2)

  • SSP
point.basepos.y,座標

ウインドウを初期配置・位置保存する際の基準位置のY座標です。
異なるサーフェスサイズの画像に切り替えた際の位置ずれなどを調整することができる。

サーフェスの下端

  • SSP

アニメーションインターバル

アニメーションインターバル

概要

animation*.intervalにおいて指定される、アニメーションが動作する周期・タイミング(トリガー)の指定。

組み合わせ指定(SSP拡張機能)

SSPの場合、アニメーションインターバルは「+」区切りで列挙する事で複数の指定を組み合わせた指定をする事ができる。元来bindに対して指定する事が想定された仕様のため、bindなしでの指定については動いているとしても要注意。

以下に組み合わせの例を挙げる。

bind+always
その着せ替えがONの場合に、常に実行されるアニメーション。
bind+runonce
その着せ替えがONの場合に、その着せ替え定義のされているサーフェスに切り替わった時か、逆にそのサーフェス表示中にその着せ替え定義がONになった場合に一度だけ実行されるアニメーション。
bind+random,頻度
その着せ替えがONの場合に、毎秒(1/頻度)の確率で発生するアニメーション。
bind+periodic,間隔
その着せ替えがONの場合に、(間隔)秒毎に発生するアニメーション。
bind+runonce+random,5
その着せ替えがONの場合に、その着せ替え定義のされているサーフェスに切り替わった時か、逆にそのサーフェス表示中にその着せ替え定義がONになった場合に一度実行され、以後毎秒5分の1の確率で再生されるアニメーション。

bindに対して+区切りで他の指定をした場合、bindインターバルが本来持つ「pattern定義のウェイトパラメータが無視されて静止画としてベースサーフェスと一体化する」といった性質は失われる。

また、random・periodic・talkのようなパラメータが必要な指定では、パラメータは組み合わせ指定の場合も末尾に書く。

以下は誤り

animation0.interval,random,5+bind

以下は正しい

animation1.interval,bind+random,5

パラメータのあるインターバル指定同士を組み合わせるのは不可。

sometimes

そのサーフェスである間毎秒2分の1の確率で再生。

  • Materia
  • SSP
  • CROW
rarely

そのサーフェスである間毎秒4分の1の確率で再生。

  • Materia
  • SSP
  • CROW
random,数値

そのサーフェスである間毎秒数値分の1の確率で再生。

  • Materia
  • SSP
  • CROW
periodic,数値

そのサーフェスである間数値秒間隔で定期的に再生。

  • SSP
always

そのサーフェスである間ループ再生。

  • Materia
  • SSP
  • CROW
runonce

サーフェスに切り替わった瞬間に1回のみ再生。

  • Materia
  • SSP
  • CROW
never

自動では実行されない。他のアニメーションからのstartメソッドやalternativestartメソッドなどによる呼びだしか、さくらスクリプトの\i[*]などによる命令以外では再生しないアニメーションに対して指定する。

  • Materia
  • SSP
  • CROW
yen-e

そのサーフェスで\eが来た時に実行。

  • Materia
  • SSP
  • CROW
talk,数値

そのサーフェスでバルーン内にテキストが表示されていく時に実行。
数値分の文字がくるごとにアニメーションする。

  • Materia
  • SSP
  • CROW
bind

そのアニメーションをサーフェスの着せ替えとして定義する。

  • Materia
  • SSP
  • CROW

描画メソッド

描画メソッド

概要

animationパターン定義およびelement定義における、各コマ(パーツ)の合成・描画方法。

画像の合成ではなく、ベースサーフェスの置き換え(base)、ベースサーフェスの移動(move)や他のアニメーションの挿入・実行(insert、start、stop、alternativestart、alternativestop)といった様々な役割のメソッドが存在する。

着せ替えにおける描画メソッドの扱い

着せ替え定義中では、画像の合成でないメソッド(move、insert、start、stop、alternativestart、alternativestop)は無効である(overlayとして扱われる)。ただしbaseは一番最初のpatternに使用した場合のみ有効であり、その着せ替えがONになっている場合のみベースサーフェスを置き換えるような仕組みが実現できる。

着せ替え用のメソッドとして実装されているaddとbindは、実装上はoverlayと同義である。着せ替えにおいてこの三つはどれを指定しても結局同じ効果となる。

element定義における描画メソッドの扱い

element定義中では、画像の合成でないメソッド(base、move、insert、start、stop、alternativestart、alternativestop)は無効である(overlayとして扱われる)。

その他着せ替え用のメソッドadd、bindも無効である(が、SSPの現実装において無効な指定はoverlayと読み替えられるため、結果的に指定どおりの描画にはなる)。

自明ではあるが、最初のelement(element0、surface*.pngが存在しない場合のはそれ以降の場合もある)で指定された描画メソッドはほとんどのものがbaseと同義になる。ただしasisメソッドで透過色がそのまま表示される点は有効である。

なお、element合成されたサーフェスがアニメーションパーツとして用いられた場合、element合成の結果が一枚の画像のように扱われる。ただしこの実装はSSP2.3.53からのもので、それ以前は未定義であった事に注意。

合成系メソッドのelement・アニメーション・着せ替えでの相違点と共通点

合成系のメソッドの意味合いは、element・アニメーション・着せ替えのそれぞれで異なってくる。

element定義は、ベースサーフェスとなる一枚の静止画を得ることが目的である。element定義では、直前までの合成結果に対してさらに次の合成が繰り返されてゆき、最終的な合成結果として一枚の静止画を得る。

着せ替え定義もelement定義と同様に、静止画を得るための仕組みであるので、描画メソッドの解決の流れはelement定義とよく似ている。着せ替えのpattern定義では、最初のpatternがベースサーフェスに対して合成され、以後直前までの合成結果に対してさらに次の合成が繰り返されてゆき、最終的な合成結果として得られた一枚の静止画を得る。従って、着せ替えはベースサーフェスと一体化したように振る舞うことになる。

対して着せ替えでない通常のアニメーションは、動画的表現であるので、前二者とは流れが大きく異なる。アニメーションの各pattern定義は、あくまでもアニメーションを構成する各コマの定義であり、それぞれ独立している。各pattern定義はベースサーフェスと新規画像の二つを合成して新たなコマを作り出すので、前のpattern定義(前のコマ)での合成結果は次のコマには影響しない。そうして次々と新しいコマを描画することで、動画的な表現が実現される。

しかしながらいずれの場合も、合成系メソッドは「合成の対象となる元の画像」と「その行のpattern定義またはelement定義で指定された画像」の二つ画像を合成する機能を担う点は共通している。そこでukadocでは、便宜上描画メソッドの説明において、「合成の対象となる元の画像」ベースレイヤ、後者の「その行のpattern定義またはelement定義で指定された画像」新規レイヤと呼ぶことにする。

この二語を用いて言い換えると、アニメーションの各pattern定義は、ベースサーフェスをベースレイヤとして新規レイヤを合成することでコマを作り出すものである。対して着せ替え及びelement合成は、直前までの合成結果をベースレイヤとして新規レイヤを合成してゆく繰り返しの結果として、一枚の静止画を得るものである。

描画メソッドと透過色

画像の左上隅1ピクセルの色が透過色として扱われ、実際の表示上は同色の部分が透過されるのは、pattern定義に使われるsurfaceや、element定義に使われる画像についても同様である。

この時合成される各画像の透過色の実際の色は、特に一致する必要はない

またいくつかの描画メソッドは、透過色について特別な扱いをするものがある(overlayfast、asis、interpolate、reduceなど)。

base

ベースサーフェス新規レイヤで完全に置き換える。collisionもコマのサーフェスに定義されたものに更新される。
このメソッドのパターンを重ねると、サーフェス全面を描画し直すことによるアニメーション(いわばパラパラ漫画)が実現される。
この描画メソッドが指定されたpattern定義では、XY座標は無視される。
着せ替えおよびelementでは、baseメソッドは最初(element0、pattern0)にしか用いることができない。それ以外はoverlayに読み変えられる。

  • Materia
  • SSP
  • CROW
overlay

ベースレイヤ新規レイヤを単に重ねる。
着せ替え・elementでも使用できる(着せ替えの場合、addbindも同じ効果となる)。

  • Materia
  • SSP
  • CROW
overlayfast

ベースレイヤの不透明度に応じて、新規レイヤを重ねる。
ベースレイヤの半透明部分では、透明度が低い部分ほど濃く新規レイヤを合成し、不透明であれば完全に合成し、全透明であれば一切合成しない。
interpolateメソッドの対になるメソッド。
着せ替え・elementでも使用できる。

  • Materia
  • SSP
  • CROW
replace

ベースレイヤの一部を新規レイヤで置き換える。
透過色部分や、透明度情報があり半透明になっている部分についても、ベースレイヤの情報を残さずに上書きする。
着せ替え・elementでも使用できる。

  • SSP
interpolate

ベースレイヤの透明度に応じて新規レイヤを重ねる。
ベースレイヤの半透明部分では、透明度が高い部分ほど濃く新規レイヤを合成し、全透明であれば完全に合成し、不透明であれば一切合成しない。
overlayfastメソッドの対になるメソッド。
着せ替え・elementでも使用できる。

  • SSP
asis

overlayに近いが、新規レイヤの透過(透過色および、pna・またはseliko.use_self_alphaが設定されている場合は画像自体のアルファチャンネル)を無視して重ねる。
着せ替え・elementでも使用できる。
なおelement合成されたサーフェスを他のサーフェスのアニメーションパーツとしてasisメソッドで合成した場合の表示は未定義であるが、Windows上では普通、透過領域は画像本来の透過色に関係なく黒(#000000)で表示されるだろう。

  • SSP
move

ベースレイヤをXY座標指定分ずらす。
この描画メソッドが指定されたpattern定義では、サーフェスIDは無視される。
着せ替え・elementでは使用不可。

  • Materia
  • SSP
  • CROW
bind

新規レイヤを着せ替えパーツとする。
着せ替えパーツとして単純に一つのサーフェスを重ねることしか出来なかった頃の唯一のメソッドで、現在はaddが互換。
処理の内容はoverlayと同義。
着せ替えでないアニメーション・elementでの使用は未定義。

  • Materia
  • SSP
add

ベースレイヤ新規レイヤを着せ替えパーツとして重ねる。
処理の内容はoverlayと同義。
着せ替えでないアニメーション・elementでの使用は未定義。

  • Materia
  • SSP
reduce

ベースレイヤ新規レイヤの透過の合成。
ベースレイヤ新規レイヤ不透明度が乗算される(有効な透過色は不透明度0%の領域として扱われる)。
例えばベースレイヤが不透明度40%・新規レイヤが不透明度60%の領域は、合成後は不透明度24%=透明度76%の領域となる。
透明度以外の情報(RGB値)は単に無視される。
着せ替え用に用意されたメソッドだが、着せ替えでないアニメーション・elementでも使用可能。

  • Materia
  • SSP
insert,ID

指定したID(animation*の*の番号)の着せ替えグループ(intervalがbindのアニメーション)をその位置に挿入する。
例えばある着せ替えAが、他の着せ替えBよりも部分的に前・部分的に後ろといった位置関係の構造を持つ場合に、着せ替えAの後ろになる部分のコマと前になる部分のコマとの間に着せ替えBをinsertで挿入する事によって、自然な前後関係の表示が実現される。この時、着せ替えBの表示・非表示の状態に関わらず表示の完全性が維持される
insert先でのinsert(入れ子)も可能。
着せ替え用に用意されたメソッドで、着せ替えでないアニメーション・elementでの使用は未定義。

  • Materia
  • SSP
start,ID

指定したID(animation*の*の番号)のアニメーションを再生させる。
この描画メソッドが指定されたpattern定義では、サーフェスID、ウェイト、XY座標は無視される。
着せ替え・elementでの使用不可。

  • Materia
  • SSP
stop,ID

指定したID(animation*の*の数字)のアニメーションを停止させる。
この描画メソッドが指定されたpattern定義では、サーフェスID、ウェイト、XY座標は無視される。
着せ替え・elementでの使用不可。

  • SSP
alternativestart,(ID1.ID2...)

指定した複数のID(animation*の*の数字)の内どれかのアニメーションを再生させる。
この描画メソッドが指定されたpattern定義では、サーフェスID、ウェイト、XY座標は無視される。
SSPの場合括弧が[]、区切りが「.」でなく「,」でも読み込まれる。
着せ替え・elementでの使用不可。
旧定義:alternativestart,[ID1.ID2...]

  • Materia
  • SSP
alternativestop,(ID1.ID2...)

指定した複数のID(animation*の*の数字)の内どれかのアニメーションを停止させる。
この描画メソッドが指定されたpattern定義では、サーフェスID、ウェイト、XY座標は無視される。
SSPの場合括弧が[]、区切りが「.」でなく「,」でも読み込まれる。
着せ替え・elementでの使用不可。

  • SSP

surface.aliasブレス

surface.aliasブレス記述例

sakura.surface.alias
{
素,[0]
照れ,[1,101,201]
驚き,[2]
}

相方側の設定はkero.surface.alias、char*.surface.alias(char*はSSPのみ)と書き変える。

alias.txt

aliasブレスは、MATERIA period453まではsurfaces.txtでなくalias.txtという専用のファイルに記述される仕様であった。

現在では記述はsurfaces.txtに統合されているが、CROW・SSP共に互換性が保たれているため、別途alias.txtを用意する事も可能である。

*,[*]

サーフェスIDに対して任意のエイリアスIDを設定する。
例えば驚き,[2]とすれば、\s[驚き]で\s[2]と同じ意味となる。
また、1,[1,11,21]などとカンマ区切りで複数のサーフェスを指定することもでき、
この場合\s[1]で1,11,21からランダムで選ばれる。

挙動なし

  • Materia
  • SSP
  • CROW

cursorブレス

cursorブレス記述例

sakura.cursor
{
mouseup0,Head,system:hand
mousedown0,Head,system:finger

mouseup1,Bust,system:hand
mousedown1,Bust,system:grip
}

相方側の設定はkero.cursor、char*.cursor

mouseup*,当たり判定ID,ファイル名

当たり判定の上に乗った時表示するカーソルファイルを設定。
*部分は同じスコープのmouseup定義で重複しない番号。
当り判定名はcollision定義で設定した名前。
ファイル名にはカーソルファイル名(cur/ani)を指定。ファイル名の変わりに、後述のシステムカーソル指定が使用可能。

system:finger(当たり判定名がbustの場合のみsystem:hand)

  • SSP
mousedown*,当たり判定ID,ファイル名

当たり判定の上でマウスボタンを押した時に表示するカーソルファイルを設定。
*部分は同じスコープのmousedown定義で重複しない番号。
当り判定名はcollision定義で設定した名前。
ファイル名にはカーソルファイル名(cur/ani)を指定。ファイル名の変わりに、後述のシステムカーソル指定が使用可能。

system:finger(当たり判定名がbustの場合のみsystem:grip)

  • SSP
mousewheel*,当たり判定ID,ファイル名

当たり判定の上でマウスホイールを回した時に表示するカーソルファイルを設定。
*部分は同じスコープのmousewheel定義で重複しない番号。
当り判定名はcollision定義で設定した名前。
ファイル名にはカーソルファイル名(cur/ani)を指定。ファイル名の変わりに、後述のシステムカーソル指定が使用可能。

system:arrow

  • SSP
mousehover*,当たり判定ID,ファイル名

当たり判定の上でマウスをしばらく動かさない時に表示するカーソルファイルを設定。
*部分は同じスコープのmousehover定義で重複しない番号。
当り判定名はcollision定義で設定した名前。
ファイル名にはカーソルファイル名(cur/ani)を指定。ファイル名の変わりに、後述のシステムカーソル指定が使用可能。

system:arrow

  • SSP

システムカーソル

カーソルファイルの変わりに指定すると現在使われているカーソルの変形が表示ができます。

system:arrow

矢印

  • SSP
system:cross

十字

  • SSP
system:no

禁止

  • SSP
system:hand

  • SSP
system:grip

つかんだ手

  • SSP
system:finger

指差し

  • SSP
system:wait

時計

  • SSP
system:text

I

  • SSP
system:move

移動

  • SSP
system:help

  • SSP

tooltipブレス

tooltipブレス記述例

sakura.tooltips
{
Bust,怒ります。
Head,つつかれると痛いです。
Shoulder,つつくとコミュニケートボックスを表示します。
}

相方側の設定はkero.tooltips、char*.tooltips

当たり判定名,表示内容

当たり判定の上に来た時に表示するツールチップのテキストを設定。

挙動なし

  • SSP