はじめに

この仕様書で述べる仕様「SERIKO」,「element」は,2000年に「偽春菜」の名前で開発が始まり2006年現在「伺か」の名前で呼ばれるデスクトップマスコットのキャラクタの外観仕様「シェル」を拡張するための仕様です。

この仕様書は,伺か公式ページ内の旧仕様書,履歴,first のマスターシェル定義ファイルなどを元につくられた非公式仕様書であることに注意してください。

概要

基本的なシェル定義の範囲を超える各種アプローチが SERIKO, MAYUNA, element である。

基本的なシェル定義に関しては非公式シェル仕様書を参照。

SERIKO

シェルに動画ポテンシャルを与えるアプローチが SERIKO である。様々なメソッドの組み合わせにより,マバタキから全身移動まで負荷に見合った様々なアニメーションを行うことができる。

本来,着せ替え仕様「MAYUNA」も含むが,一般的にはアニメーションに関する仕様のみを指す。

MAYUNA

シェルの着せ替えを可能にするアプローチが MAYUNA である。

この仕様は,SERIKO の一部であり,SERIKO と同様の書式で記述する。

element

サーフィス定義のオーバーライドを行うのが element である。この仕様により複数の画像を合成してサーフィスを定義したり,独自のファイル名体系でシェルを管理したりすることが可能となる。

SERIKO/2.0

この文書では,公式には文書化されていない SERIKO の記法を SERIKO/2.0 として,その仕様を説明する。

SERIKO/1.x に関しては公式の SERIKO 仕様書を参照。

あらゆるアニメーションは surface の組み合わせで行われる。アニメーションに用いる surface も画像の作り方自体は普通の surface と変わらない。

アニメーションパターンは surfaces.txt で定義される。surfaces.txt の基本的なフォーマットについては非公式シェル仕様書を参照。

SERIKO/2.0 の SERIKO/1.x との違いは以下の通り。

descript スコープ

descript
{
version,1
}

SERIKO/2.0 によりアニメーションを行う場合は,descript スコープの version エントリに 1 を指定する。

surface スコープ

例示。

surface0
{
animation0.interval,never
animation0.pattern0,overlay,1001,50,118,78
animation0.pattern1,overlay,1000,50,118,78
animation0.pattern2,overlay,-1

animation1.interval,never
animation1.pattern0,overlay,1001,50,118,78
animation1.pattern1,overlay,1000,200,118,78
animation1.pattern2,overlay,-1

animation2.interval,sometimes
animation2.pattern0,alternativestart,(0,1)
}

surface20
{
animation1.interval,runonce
animation1.pattern0,overlay,2230,100,17,228
animation1.pattern1,overlay,-1,100
animation1.pattern2,overlay,2230,100,17,228
animation1.pattern3,overlay,-1,100
}

アニメーションパターンは各 surfaces スコープで定義します。

エントリ名 animation 後の数値はアニメーショングループ ID を表す。それぞれのグループは独立しており,非同期にアニメーションを発生させ,非同期に停止する。つまりアクションごとにグループを分けなくてはならない。

現行,1 つのベースサーフィスが持てるアニメーションパターンは最大で 128(animation127.* まで)。ID は 0 から順に使用する必要はない。

各アニメーションパターンは以下のエントリから構成されます。

interval エントリ

interval エントリはそのアニメーショングループが自動発生する間隔を表す。

sometimes時々(マバタキ程度,random,2 と等価)
rarelyさらに低率(random,4 と等価)
random,n1秒あたり 1/n の確率
always永久にループ
runonceそのベースサーフィスに切り替わった瞬間1回だけ
yen-eさくらスクリプトにおいて ¥e が出現した瞬間1回だけ
talk,nn 文字表示されるたびに(何か喋るたびに)
never自動では発動しない
bind着せ替え。内容については別項にて解説する。

option エントリ

option エントリはそのアニメーショングループの付加情報を表す。このエントリは省略できる。

exclusive排他的にアニメーションを行う
exclusive
animation0.interval,never
animation0.option,exclusive
animation0.pattern0,base,500,50
animation0.pattern1,base,501,50
animation0.pattern2,base,502,50

上記のような指定を行うと,アニメーショングループ 0 は必ず排他的にアニメーションを行うようになります。つまり,グループ 0 が発動した時点で他の全てのアニメーショングループが即座に停止し,またグループ 0 が停止するまで他のアニメーショングループは絶対に発動しなくなります。

pattern エントリ

pattern エントリで実際に 1コマずつアニメーションパターンを定義する。定義文は以下の引数リストを持つ。

animation?.pattern?,(method),(surfaceid),(interval),(offsetx),(offsety)

method パラメータ

method は描画メソッドを表す。SERIKO/2.0 では以下のメソッドが使用できる。

overlay / overlayfast メソッド

オーバーレイによる部分動画。指定アニメーションサーフィスはベースサーフィスの上に合成される。surface 左上原点の色が透過色として使用される。

overlay はリージョンの更新が行われ,合成した結果,現状の可視領域を突破した場合シルエットも変化する。

overlayfast はリージョンの更新が行われないため,シルエットが変化しない場合にのみ使用可能。アニメーションによる負荷が小さくなる利点がある。

offsetx および offsety パラメータで合成する位置を設定する。省略不可。

一般的に最後のコマではサーフィス ID に -1 を指定し,アニメーション開始以前の状態に戻す。

合成する画像は,ベースサーフィスの (透過色を含むサイズの) 外へはみ出ないように指定してください。

Materia ではベースサーフィスの範囲内のみが表示されます。はみ出た部分は表示されません。CROW では外へはみ出る指定をした場合,合成できません。SSP は正常に表示できます。

base メソッド
animation0.interval,runonce
animation0.pattern0,base,1001,50
animation0.pattern1,base,1002,50
animation0.pattern2,base,1003,50
animation0.pattern3,base,-1,50

単純な全面切り替えによる全身動画。処理的には単に高速に立ち絵を切り替えているだけである。動作の性質上,base アニメーションは同時に 1つしか発動しない(2つ以上定義することは可能だが,それらが同時に動くことはない)。

一般的に最後のコマではサーフィス ID に -1 を指定し,アニメーション開始以前の状態に戻す。

offsetx および offsety パラメータは無視される。

move メソッド
animation0.interval,always
animation0.pattern0,move,0,150,0,-1
animation0.pattern1,move,0,150,0,-2
animation0.pattern2,move,0,150,0,-2
animation0.pattern3,move,0,150,0,-1
animation0.pattern4,move,0,150,0,0
animation0.pattern5,move,0,150,0,1
animation0.pattern6,move,0,150,0,2
animation0.pattern7,move,0,150,0,2
animation0.pattern8,move,0,150,0,1
animation0.pattern9,move,0,150,0,0

再描画を伴わない全体の移動。surface は変化せず座標だけが動く。

move は offsetx および offsety パラメータに従って座標を動かす。値は元位置からの相対座標として解釈される。例えば上記の例ではサーフィスはゆっくり上下に揺れることになる。

surfaceid パラメータは無視される。

move による移動はそのアニメーション中でのみ有効であり,ターミネートさせると元の位置に戻ります。

reduce メソッド
animation3.interval,never
animation3.pattern0,reduce,400,5,0,-200
animation3.pattern1,reduce,400,5,0,-180
animation3.pattern2,reduce,400,5,0,-160
animation3.pattern3,reduce,400,5,0,-140
animation3.pattern4,reduce,400,5,0,-120
animation3.pattern5,reduce,400,5,0,-120
animation3.pattern6,reduce,400,5,0,-100
animation3.pattern7,reduce,400,5,0,-80
animation3.pattern8,reduce,400,5,0,-60
animation3.pattern8,reduce,400,5,0,-40
animation3.pattern8,reduce,400,5,0,-20
animation3.pattern9,reduce,400,5,0,0

画像ファイルを切り抜く。フェードアウトを行う際などに使用する。

合成する画像ファイルに pna が存在する場合は,アルファチャンネル合成となり,ベースの透明部分は無視される。

SSP拡張。

start メソッド

animation?.pattern?,start,[animationid]

別のアニメーショングループの発動する。

animation0.pattern0,ovrelay,100,50,0,0
animation0.pattern1,ovrelay,101,50,0,0
animation0.pattern2,start,1
animation0.pattern3,ovrelay,-1,50

上記のスクリプトでは,アニメーショングループ 0 はターミネート直前にアニメーショングループ 1 を発動させます。

このとき個々のアニメーションパターンはブロックされないことに注意して下さい。SERIKO において個々のアニメーションパターンは独立したスレッドのような存在であり,start メソッドがコールされても呼び出し側・呼び出され側ともに一切停止しません。

alternativestart メソッド

alternativestart は複数の候補からランダムに start を行います。

surfaceid パラメータの欄にはサーフィス ID の替わりに複数のアニメーショングループ ID を ( ) で囲って記述します。

animation0.pattern2,alternativestart,(1,2)

上記のスクリプトでは,グループ 1 もしくは 2 にそれぞれ 50% の確率でジャンプします。

切り替えながら移動
animation0.interval,yen-e
animation0.pattern0,base,1001,0
animation0.pattern1,move,0,150,2,0
animation0.pattern2,base,1002,0
animation0.pattern3,move,0,150,4,0
animation0.pattern4,base,1003,0
animation0.pattern5,move,0,150,6,0
animation0.pattern6,base,1004,0
animation0.pattern7,move,0,150,8,0

サーフィスを切り替えながら移動させるには base メソッドと move メソッドを交互に記述することで実現できる。上記の例ではサーフィスが切り替わった瞬間に移動させている。逆に移動した瞬間にサーフィスを切り替えることでも実現できる。

しかしながら,この方法は原理的にちらつきが生じます。あらかじめアニメーションが及ぶ範囲まで含めてサーフィスを作っておき,base で切り替えるのが無難です。

surfaceid パラメータ

surfaceid はそのコマで表示されるサーフィスの ID ,起動するアニメーショングループ,又はアニメーションの終端を表す。surfaceid は ファイル名ではなく ID で指定します。

サーフィス ID

指定された ID のサーフィスを表示します。

指定した ID の surface スコープが存在する場合,そのスコープで定義 (element による定義) されたサーフィスが表示されます。

指定した ID の surface スコープ に書かれた SERIKO / MAYUNA は無効になります。例外として SSP は MAYUNA (interval,bind) のみ有効となるようです。たぶん……

-1

サーフィス ID に -1 を指定すると,アニメーション開始以前の状態を表示する。

-1 は通常,ターミネートに使用するが,アニメーション途中に記述することも可能である。

-2

-1 は現アニメーショングループのターミネートを表しますが,-2 により全アニメーションのターミネート (全アニメーション即時停止) を指示できます。

animation0.pattern0,overlay,100,50,0,0
animation0.pattern1,overlay,101,50,0,0
animation0.pattern2,start,1

animation1.pattern0,overlay,150,100,0,0
animation1.pattern1,overlay,-2,50

グループ 0 はグループ 1 を発動させて終了しますが,ターミネートが行われていないためアニメーション終了後も surface 101 が生き続けます。しかしネストされたグループ 1 が -2 でターミネートを行っているためグループ1が終了すると同時に surface 101 も消滅します。

アニメーショングループ ID

method に start 又は alternativestart を指定した場合は,サーフィス ID の代わりに起動を指示するアニメーショングループ ID を指定します。

interval パラメータ

interval はコマ送りスピードを表す。単位は milli-second。指定した時間が経過した後,コマが表示される。目安として,一般的なマバタキのスピードは 50 (50 ms)。

ウェイトが画像が表示される前に実行されることに注意してください。

animation0.interval,sometimes
animation0.pattern0,base,301,50
animation0.pattern1,base,302,100
animation0.pattern2,base,-1,200

例えば,上記のようなアニメーションパターンの場合以下のように動作します。

  1. アニメーション開始
  2. 50 ms のウェイト
  3. surface301 を表示
  4. 100 ms のウェイト
  5. surface302 を表示
  6. 200 ms のウェイト
  7. ターミネート

offsetx / offsety パラメータ

method パラメータに overlay, overlayfast, move を指定した場合に記述します。詳細は各メソッドの項目を参照。

MAYUNA/1.x in SERIKO/2.0

着せ替えオブジェクト

MAYUNA/1.x は SERIKO のサブセットであり,着せ替えを行うオブジェクトは SERIKO と同様の書式で 各 surface スコープに記述するが,動画仕様ではなく静止画仕様であることに注意して下さい。

例示。

surface0
{
animation0.interval,bind
animation0.pattern0,add,100,0,0,0
animation0.pattern1,add,101,0,0,0
animation0.pattern2,reduce,102,0,0,0
animation0.pattern3,add,103,0,0,0

animation1.interval,bind
animation1.pattern0,insert,2
animation1.pattern1,add,150,0,10,10

animation2.interval,bind
animation2.pattern0,bind,151,0,10,10
}

同じ種類のグループに常に同じ ID を振る必要があることに注意して下さい。例えば, surface0 の animation2 で「夏服」を設定した場合,他の「夏服」を必要とする全ての surface においても animation2 で「夏服」を設定する必要があります。

ただし sakura と kero の着せ替えは別々に管理される (sakura で着せ替えの ON/OFF を実行しても kero 側に影響はない。逆も同様) ため,sakura / kero の間では,異なる種類のアイテムの ID が重なっても問題はない。

グループ 0 から順番に処理されます。例えば,グループ 0,1,3 が ON の時,0 番の上に 1 番が、1 番の上に 3 番が描画されます。

SERIKO と同様に以下のエントリから構成されます。

interval エントリ

interval エントリに bind を指定することで着せ替えを行う。

option エントリ

無し。

pattern エントリ

animation?.pattern?,(method),(surfaceid),(interval),(offsetx),(offsety)

アニメーションパターン 0 から順番に処理されます。0 番の上に 1 番が,1 番の上に 2 番が描画されます。従って,例えばパターン 3 がキャラクタに穴を開けたとしても,それがパターン 4 で再び塞がれれば表示上は穴は開かないことになります。

method パラメータ

method は描画メソッドを表す。以下のメソッドが使用できる。

bind メソッド
animation2.interval,bind
animation2.pattern0,bind,151,0,0,0

bind は単純な着せ替えを行う。着せ替えとして重ね合わせることができる surface は 1 枚 (pattern0 で指定した serface のみ) であり,pattern1 以降は無視される。

offsetx および offsety パラメータで合成する位置を設定する。省略不可。

bind は古い仕様であり add で置き換えることが可能である。

例えば,上記の着せ替えは次の記述で置き換えても等価である。

animation2.interval,bind
animation2.pattern0,add,151,0,0,0
add メソッド

add は bind を拡張し,複数の surface を重ね合わせることを可能にしたものである。

offsetx および offsety パラメータで合成する位置を設定する。省略不可。

reduce メソッド

reduce は現在の可視状態から特定の領域を明示的に削除します。現在の透過領域に加えて,指定した surface の透過色 (左上の色) の部分が透過領域となる。

offsetx および offsety パラメータで合成する位置を設定する。省略不可。

insert メソッド

insert は他のバインドグループの挿入を行う。surfaceid パラメータに挿入するアニメーショングループ ID を指定する。

//A
animation1.interval,bind
animation1.pattern0,add,301,0,10,10
animation1.pattern1,add,302,0,15,15

//A + B
animation2.interval,bind
animation2.pattern0,add,301,0,10,10
animation2.pattern0,add,302,0,15,15
animation2.pattern1,add,303,0,50,50

上記の着せ替えは insert により次のように記述することが可能となる。

//A
animation1.interval,bind
animation1.pattern0,add,301,0,10,10
animation1.pattern1,add,302,0,15,15

//(A +) B
animation2.interval,bind
animation2.pattern0,insert,1
animation2.pattern1,add,303,0,50,50

この仕組みによりシェル制作者は着せ替えをアイテム/パーツごとに分けて管理することが可能となる。

(「帽子」と「リボン付き帽子」をつくり「リボン付き帽子」では「リボン」に「帽子」を insert するとか。)

surfaceid パラメータ

surfaceid は合成するサーフィスの ID を表す。surfaceid は ファイル名ではなく ID で指定します。

指定した ID の surface スコープが存在する場合,そのスコープで定義 (element による定義) されたサーフィスが表示されます。

指定した ID の surface スコープ に書かれた SERIKO / MAYUNA は無効になります。例外として SSP は MAYUNA (interval,bind) のみ有効となるようです。たぶん……

interval パラメータ

MAYUNA は静止画仕様であるので interval パラメータは無視されます。

アニメーションのグループと区別するため,0 を指定することが多いようです。

offsetx / offsety パラメータ

method パラメータに bind, add, reduce を指定した場合に記述。詳細は各メソッドの項目を参照。

着せ替えメニュー

home
  +-ghost
      +-seriko
        +-shell
          +-master
            +-descript.txt
            ....
            ..
            +-thumbnail
              +-apron.png
              +-black.png
              +-ribbonblack.png
              ....
              ..
        +-ghost

服を着せたり脱がせたりするためには descript.txt を適切に編集する必要があります。

sakura.bindgroup0.name,服,エプロンドレス,apron
sakura.bindgroup1.name,リボン,白リボン,ribbonwhite
sakura.bindgroup2.name,服,黒服,black
sakura.bindgroup3.name,リボン,黒リボン,ribbonblack

sakura.bindgroup0.default,1
sakura.bindgroup1.default,1

kero.bindgroup0.name,ネクタイ,ネクタイ
kero.bindgroup1.name,腕章,黒腕章
kero.bindgroup2.name,腕,ドリル

kero.bindgroup0.default,1
kero.bindgroup1.default,1

sakura.menuitem0,2
sakura.menuitem1,3
sakura.menuitem2,-
sakura.menuitem3,0
sakura.menuitem4,1

kero.menuitem0,0
kero.menuitem1,1
kero.menuitem2,-
kero.menuitem3,2

name エントリ

*.bindgroup?.name,(category),(part),(thumbnail)

surfaces.txt の animation? で設定した着せ替えアイテムを着せ替えメニューに関連付けます。

bindgroup ID は surfaces.txt のアニメーショングループ ID と同じものを指定します。上記の例では surfaces.txt の sakura が使用する全ての surface スコープで animation0 がエプロンドレスを指定していなければなりません。

category パラメータ

同一カテゴリのアイテムは同時に 1 つしか着ることができません。上記の例では sakura はエプロンドレスと黒服,白リボンと黒リボンを同時に着ることはできません。

上記の例では,sakura は次のような着せ替えが可能となります。

  • (無し)
  • エプロンドレス
  • 黒服
  • 白リボン
  • 黒リボン
  • エプロンドレス + 白リボン
  • エプロンドレス + 黒リボン
  • 黒服 + 白リボン
  • 黒服 + 黒リボン
part パラメータ

着せ替えアイテムの名前を設定します。設定した名前が着せ替えメニューに項目として表示されます。

thumbnail パラメータ

着せ替えメニューで使用するサムネイルファイルを指定します。サムネイルファイルは thumbnail ディレクトリに格納したものを拡張子を省略して記述します。省略可。省略時は何も表示されません。

(ここで指定するサムネイルは実装されていない (指定しても実際には表示されない) ようです。)

default エントリ

*.bindgroup?.default,?

このシェルのデフォルトの姿を設定します。ここでの設定がこのシェルの初回起動時の姿となります。デフォルトで ON のアイテムに 1 を指定します。0 を指定もしくは省略すると OFF となります。

menuitem エントリ

*.menuitem?,?

menuitem はメニュー項目の構造を表しています。メニューの表示順に bindgroupid を指定します。- (ハイフン) を指定するとセパレータとなります。上記の例だと sakura の着せ替えアイテムは上から順に黒服,黒リボン,(セパレータ),エプロンドレス,白リボンとなります。

element

通常 surface は次のように id とファイル名の関係が定義されています。

surface[id] = surface[id].png (+ surface[id].pna)

element は,この surface 定義のオーバーライドを行います。surface に独自のファイル名を割り当てたり,複数の画像を合成して surface を定義することができます。

element?,(method),(filename),(offsetx),(offsety)

この仕様は SERIKO (MAYUNA を含む) と違い,ユーザの目には映りません。この仕様はシェルマスタがシェルを制作・管理する際の選択肢の 1 つです。

初めに思いつく使い方は,surface0 (素) とそのまばたきアニメーションで使用する目閉じ画像とで surface6 (目閉じ) を定義することです。これにより,目閉じの画像ファイルを用意する必要が無くなり,アーカイブのサイズが小さくなります。また,稼動時のメモリ消費量が減少するプラットフォームもあります。

method パラメータ

method は描画メソッドを表す。ベースサーフィスとなる element0 のメソッドは無視されます。element では以下のメソッドが使用できる。

overlay メソッド

オーバーレイにより重ね合わせを行う。指定サーフィスは element0 で指定したサーフィスの上に合成される。surface 左上原点の色が透過色として使用される。合成した結果現状の可視領域を突破した場合シルエットも変化する。

offsetx および offsety パラメータで合成する位置を設定する。省略不可。

合成する画像は,ベースサーフィスの (透過色を含むサイズの) 外へはみ出ないように指定してください。

Materia ではベースサーフィスの範囲内のみが表示されます。はみ出た部分は表示されません。CROW では外へはみ出る指定をした場合,合成できません。SSP は正常に表示できます。

surface21
{
element0,overlay,surface0020.png,0,0
element1,overlay,surface0021_.png,114,64
}

上記のように記述することで surface21 を surface0020.png の上に surface0021_.png を重ね合わせた画像で定義することができます。

filename パラメータ

filename はファイル名を指定する。 SERIKO のように ID で指定しない。

ファイルネームエイリアス

surface0
{
element0,overlay,sakura_normal.png,0,0
}

上記のように element0 のみを指定することで surface0 を sakura_normal.png で定義することができます。

surface0,surface10 に対しては element を用いない方が無難です。 Materia のゴースト / シェルエクスプローラなど,サムネイル表示を行うアプリケーションの多くは element を解析しません。そのため surface0,surface10 に対し element を用いていた場合,シェルマスタの意図する画像が表示されません。