非公式 SERIKO 仕様書

はじめに

この仕様書で述べる仕様「SERIKO」は,2000年に「偽春菜」の名前で開発が始まり,2007年現在「伺か」の名前で呼ばれるデスクトップマスコットでアニメーションを行うための仕様である。

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

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

概要

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

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

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

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

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

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

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

  • エントリ名の初めに animation が付いた
  • pattern エントリのパラメータの順番が変更された
  • interval パラメータが 10ms 単位から 1ms 単位になった
  • alternativestart メソッドでの ID 指定の括弧が [ ] から ( ) に変更された

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 を指定し,アニメーション開始以前の状態に戻す。この場合,offsetx および offsety パラメータは無視される。省略可。

合成する画像は,(互換性のため) ベースサーフィスの (透過色を含むサイズの) 外へはみ出ないように指定する必要がある。

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つ以上定義することは可能だが,それらが同時に動くことはない)。

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

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

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

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

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 が存在する場合は,アルファチャンネル合成となり,png の透明部分は無視される。

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

SSP拡張。

replace メソッド

サーフィスを透明部分を含めて上書きする。

サーフィスの輪郭を変更するアニメーション(手を振る,など)を行う場合,まず最初にreduceした後にoverlayでアニメーションを行うか,全身をbaseでアニメーションする必要があったが,replaceを使うと楽に行うことが出来る。

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

SSP拡張。

start メソッド

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

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 メソッドがコールされても呼び出し側・呼び出され側ともに一切停止しない。

interval, offsetx および offsety パラメータは無視される。省略可。

alternativestart メソッド

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

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

animation0.pattern2,alternativestart,(1,2)

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

interval, offsetx および offsety パラメータは無視される。省略可。

切り替えながら移動
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 ,起動するアニメーショングループ,又はアニメーションの終端を表す。

サーフィス ID

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

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

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

-1

surfaceid に -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 パラメータ

詳細は各メソッドの項目を参照。