はじめに

シェル(Shell)は,2000年に「偽春菜」の名前で開発が始まり 2006年現在「伺か」の名前で呼ばれるデスクトップマスコットのキャラクタの外観に関する仕様である。

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

概要

シェルは,ゴーストがマテリアライズする際の姿である。

(片仮名で)ゴーストと呼ばれるキャラクタは,人格のGhostと姿のShellに分けて定義されている。ShellはGhostと分離されているため,姿に関する項目のみを定義する

Ghostは,基本的に sakura (¥0) と kero (¥1) と呼ばれる 2 体のキャラクタにより構成されるため,Shellも基本的には 2 体分の画像データで構成する。

基本構成ファイル

基本となるファイルは以下の 3 つ。

descript.txt

シェル全体の定義ファイルとなる。必須。内容については後述

surface0.png

sakura の基本的な姿となるビットマップイメージ。詳細については後述

surface10.png

kero の基本的な姿となるビットマップイメージ。詳細については後述

その他構成ファイル

これらのファイルは全て省略可能。

surface(surface id).png

シェルの実体となるビットマップイメージで surface と呼ぶ。フォーマットは PNG。surface は現状,最大で 8192 枚 (surface8191 まで) 定義できる。

どの surface id にどういった表情を割り当てるかはマスタの自由だが,前述のとおり 0 および 10 は予約されていて,これらはそれぞれ sakura および kero の最も基本的な姿を設定しておく必要がある。

SAKURA Script から指定された id の surface(surface id).png が無い場合,id は 0 又は 10 へリダイレクトされる。そのため 0,10 の 2 枚さえ存在すれば,他に全くバリエーションがなくてもそれはシェルとして成立する。

surface(surface id).png は座標 (0,0) (左上) の色が透過色としてマスクされる。従って抜きたい箇所を座標 (0,0) と同じ色でマスクして作成する。画像のサイズ / 色数等に制限はない。

ファイル名の surface id は前方を 0 で埋める限り何桁でも正しく解釈される。例えば,surface0 のファイル名は surface0.png / surface000.png / surface0000.png のいずれでも良い。

以下に(伝統的に)最もポピュラーな surface id の割り振りを示す。

sakura - ¥0 / ¥p[0]
0
1照れ / エロ面
2驚き
3不安 / 胸を隠す
4落ち込み / はぅ~
5微笑み
6目閉じ
7怒り
8冷笑
9照れ怒り
20つくり看板 (退席中)
25
kero - ¥1 / ¥p[1]
10
11刮目
19
surfaces.txt

各 surface 固有の定義ファイルとなる。内容については後述

readme.txt

シェルの説明文を記したテキストファイルである。シェルがマスターシェルである場合はゴーストの配布元とシェルの配布元が一致するためこのファイルはほぼ必要無いが,サプリメントシェルの場合はそれらがバラバラであるため,このファイルを用いて配布元 URL 等をユーザに知らせた方がよい。

thumbnail.png

このシェルのサムネイルイメージを表す。サムネイルイメージはシェル選択時にガイドとして表示される。フォーマットは PNG もしくは JPEG。PNG を拡張子 pnr で配置すると座標 (0,0) の色が抜かれた透過 PNG になる。色数やサイズに制限はない。省略した場合は何も表示されない。

「伺か」のシェルエクスプローラなど,ガイドとして surface0.png を表示するものもある。

surfacetable.txt

各 surface の説明を記したテキストファイルである。SSP のサーフィステストで使用する。記述内容は SSP技術資料 - サーフィステストウィンドウへのコメント表示を参照。

SSP 拡張。

その他

その他のファイルは descript.txt 又は surfaces.txt で使用が定義されるファイルである。

descript.txt

descript.txt はシェル 1 つに対して 1 つ存在し,そのシェルが持つ固有のプロファイルを定義する。

エントリ名とエントリ値を , (カンマ) で区切り,1 行 1 エントリで任意の順番で記述する。

charset

このファイル (descript.txt) で使用されている文字符号化スキームを記述する。IANA に登録されているものを記述するのが妥当である。省略可能。省略時は Shift_JIS となる。

エントリは任意の順番で記述できるが,このエントリのみ最初の行へ記述することが推奨されている。

以下に代表例を挙げる。

ASCIIASCII
US-ASCIIASCII
ISO-8859-1Latin-1。西欧諸語
Shift_JISMS_Kanji。Windows で一般的に用いられているもの
EUC-JP日本語拡張 UNIX コード
ISO-2022-JPJIS コード。RFC-1468 (see also RFC-2237)
UTF-8Unicode をビットシフトエンコードしたもの (RFC-2279)

現在のところ Shift_JIS 以外をサポートする実行環境は少ない。

SSP 拡張。

name

このシェルの名前を表す。服装,もしくはサイズ (100%,80%等) 等を表すユニークな文字列をセットする。必須。

id

このシェルの ID を表す。ユニークな ASCII 文字列をセットする。(一応) 必須。

name は他のシェルと重複しても許されますが,(おそらく) id の重複は許されません。

元々は name エントリがシェルの ID を表していました。重複する恐れなどの理由により新たに id エントリが非公式ながら追加されましたが,関連する仕様の変更,追加の前に開発が停止したため,存在意義の薄いエントリです。

使用されている箇所としては,伺かのコンソールでシェルがロードされる際に表示。

type

ファイルセットの種別を表す。シェルの場合は識別子 shell をセットする。必須。

craftman / craftmanw

製作者名を表す。craftman は ASCII 文字のみで構成しなくてはならない。craftmanw はワイド文字 (例えば日本語等) も使用可能。craftman,craftmanw のいずれかが必須。両方記述しても良い。

craftmanurl

製作者の web サイトのアドレスを表す。省略可能。

readme

このシェルの説明文ファイルの名前を表す。省略可能。省略時は readme.txt となる。

「伺か」では Read Me! ボタンで表示される。

(character id).balloon.*

シェルと共に表示する吹き出しに関するエントリ。省略可能。

  • sakura.balloon.offsetx
  • sakura.balloon.offsety
  • sakura.balloon.alignment
  • kero.balloon.offsetx
  • kero.balloon.offsety
  • kero.balloon.alignment
  • char2.balloon.offsetx
  • char2.balloon.offsety
  • char2.balloon.alignment
  • char3.balloon.offsetx
  • ....

3 人目以降を示す char?SSP 拡張。

(character id).balloon.offsetx / (character id).balloon.offsety

吹き出しの位置オフセット情報を表す。本体 (不可視領域を含めたシェルの画像) に密着した位置から計算して,x はプラスの値が入っていれば本体側に近づき,マイナスの値が入っていれば本体から遠ざかる。y はプラスの値が入っていれば下へ,マイナスの値が入っていれば上に移動する。

(character id).balloon.alignment

吹き出しの位置情報を表す。

none自動調整,シェルの y 軸座標が画面中央より左なら右,右なら左に表示
left常に左
right常に右
menu.*

コンテキストメニュー (右クリックポップアップメニュー) に画像を表示する際に必要なエントリ。省略可能。

公式のメニュー仕様書を参照。

以下のエントリは SSP 拡張。(伺かでは .lcl ファイルで指定)

menu.font.name

メニューで使用するフォント名

menu.font.height

メニューで使用するフォントサイズ

makoto

このシステムは語尾変化,音声出力などをゴーストの「姿」としてシェルに与えるために存在する。(phase "unagi" 96.00 にて実装)

MAKOTO サブシステムとしてロードされる DLL の実ファイル名を表す。Ghost 側の Makoto を通過後に通過する。

makoto が複数存在する場合は,[ ] (スクエアブラケット) でくくり,, (カンマ) でセパレートして左から順に記述する。省略可能。省略した場合はロードされない。

seriko.alignmenttodesktop
  • seriko.alignmenttodesktop
  • sakura.seriko.alignmenttodesktop
  • kero.seriko.alignmenttodesktop
  • char2.seriko.alignmenttodesktop
  • ....

マウスのドラッグによりサーフィスの位置がデスクトップ下端から離れることの許可 / 不許可を指定する。許可する場合は free を指定する。省略可能。省略時はデスクトップ下端から離れない。

character id の無い seriko.alignmenttodesktop は全てのキャラクタへ適用される。

SSP 拡張。

(character id).seriko.defaultsurface
  • sakura.seriko.defaultsurface
  • kero.seriko.defaultsurface
  • char2.seriko.defaultsurface
  • ....

デフォルトサーフィスを指定する。sakura は 0,kero は 10 を上書きする。

SSP 拡張。

(character id).bindgroup(bindgroup id).*

MAYUNA (着せ替え) で必要となるエントリ。

非公式 SERIKO & element 仕様書を参照。

(character id).menuitem(menuitem id)

MAYUNA (着せ替え) で必要となるエントリ。

非公式 SERIKO & element 仕様書を参照。

以下に descript.txt の例を示す。

charset,Shift_JIS
name,冬服
id,Snow
type,shell
craftman,Araya Kawakami
craftmanw,川上新夜
craftmanurl,http://www.sakura.jp/

readme,profile.txt

sakura.balloon.offsetx,0
sakura.balloon.offsety,80
kero.balloon.offsetx,-20
kero.balloon.offsety,10
sakura.balloon.alignment,none
kero.balloon.alignment,none

menu.background.bitmap.filename,resources¥menu_background.png
menu.foreground.bitmap.filename,resources¥menu_foreground.png
menu.sidebar.bitmap.filename,resources¥menu_sidebar.png

makoto,[makoto1.dll,makoto2.dll]

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

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

surfaces.txt

surfaces.txt では各 surface 固有の定義を行う。本ファイルの定義内容は全て省略可能。文字コードは Shift_JIS。

コメントを記述する場合は,行頭に // を記述してその後ろに書く。

かつてスクリプトリファレンス (sakurascript.html) に次のような記述がありました。

エントリでも本文でもない行は全てコメントとして扱われます。

そして,first の script.txt ではコメント行の行頭は // でした。このような経緯から,定義ファイルでコメントを記述する場合,一般的には // を使います。

もちろん,// である必要はなく,無効な行になってさえいればどのような方法でも良いと思われます。

surfaces.txt は複数のエントリからなるスコープと呼ばれる単位で構成される。

各スコープのエントリは { } (ブレス) で次のように適切に囲む必要がある。

scope name
{
entry
entry
....
..
}

各エントリは,descript.txt と同じく,エントリ名とエントリ値を , (カンマ) で区切り,1 行 1 エントリで任意の順番で記述する。

descript スコープ

maxwidth

最も幅の広い surface の幅を記述する。単位は pixel。省略可能であるが記述することが望ましい。

省略時は実行環境が全ての surface を調査して取得,又は surface0 の値を使用する。この値はキャラクタの初期立ち位置や見切れなどに使用される。

version

SERIKO アニメーションのバージョンを表す。SERIKO/1.x で記述するときは 0 を,SERIKO/2.0 (仮称) で記述するときは 1 を指定する。省略可能。省略時は 0 と見なされる。

surface.alias スコープ

3 人目以降を示す char?SSP 拡張。(SSP 1.09.10 で実装)

書式は alias name,[id,id,...]

surface id のエイリアスを定義する。数字による id だけでなく,例えば smile など状況依存性の低い (具体性の低い) 指定が可能となる。(period 453 で alias.txt から移動)

例えば,smile,[50] と記述すれば,SAKURA Script で ¥s[smile] と指定することで surface50 が表示される。

また,1 つのエイリアスに複数の surface id を assign することができる。この仕組みをマルチプルと呼ぶ。これは例えば「笑っている」surface を複数枚用意し,「笑え」という指示に対してそれらをランダムに表示させられることを意味している。

例えば,0,[0,100,200] と記述すれば,SAKURA Script で ¥s[0] と指定することで surface0,surface100,surface200 のいずれかがランダムで表示される。

surface スコープ

各 surface のエリアがブレスで分割され,その中に当該 surface のエントリが格納される。

スコープ名には , (カンマ) で区切ることで複数の surface を指定できる。

collision(collision id)

マウスイベント定義データを表す。

左から順に , (カンマ) 区切りで 左端 x 座標,上端 y 座標,右端 x 座標,下端 y 座標,当たり判定識別子を指定する。

定義された矩形内でマウスイベントが発生すると定義された識別子を伴って SHIORI にイベントが通知され,それによって SHIORI はシェルのどの部分でマウスイベントが発生したかを判別する。

当たり判定識別子にはワイド文字 (例えば日本語等) も使用可能。最大 256 まで (collisoin255 まで) 定義可能。(period 461: 32→256)

point.centerx / point.centery

他プロセスとの連携のためのキャラクタの中心座標データを表す。

centerx はキャラクタの中心 x 座標,centery は同じく y 座標を表す。

point.kinoko.centerx / point.kinoko.centery

他プロセスとの連携のための絶対きのこ領域中心点 (頭の中心) データを表す。

centerx は頭の中心 x 座標,centery は同じく y 座標を表す。

point.basepos.x / point.basepos.y

シェルの位置決め基準点データを表す。

これを中心として位置が保存されたり、サーフィスが切り替えられる。通常,y は省略する。省略時 x は surface の (マスク領域を含めた画像ファイルの) 中心,y は下端となる。

SSP 拡張。(SSP 1.05.03 で実装)

(character id).balloon.*
  • sakura.balloon.offsetx
  • sakura.balloon.offsety
  • kero.balloon.offsetx
  • kero.balloon.offsety
  • char2.balloon.offsetx
  • char2.balloon.offsety
  • char3.balloon.offsetx
  • ....

descript.txt で指定したバルーンオフセット値をオーバーライドする。

バルーンオフセット値の持つ意味については descript.txt の項を参照。

当該 surface を sakura で使用するときには sakura.balloon.* , kero で使用する時には kero.balloon,* の値が使用される。

animation(animation group id).*
  • animation(animation group id).interval
  • animation(animation group id).option
  • animation(animation group id).pattern?

シェルに SERIKO/2.0 (仮) によるアニメーションを行わせる際,又は着せ替えを可能とする際に必要なエントリ。

非公式 SERIKO & element 仕様書を参照。

element(element id).*

サーフィス定義のオーバーライドを行う。

surface のファイル名を指定したり,複数のファイルを合成して surface を定義したりする際に必要なエントリ。

非公式 SERIKO & element 仕様書を参照。

(animation group id)interval / (animation group id)option / (animation group id)pattern?

シェルに SERIKO/1.x によるアニメーションを行わせる際,又は着せ替えを可能とする際に必要なエントリ。

公式のSERIKO 仕様書を参照。

以下に surfaces.txt の例を示す。

descript
{
maxwidth,300
version,1
}

sakura.surface.alias
{
4,[40,41]
}

surface0
{
collision0,188,25,252,63,Head
collision1,190,92,236,118,Face
collision2,180,191,220,222,Bust
collision3,154,311,248,362,Skirt
point.centerx,212
point.centery,198
point.kinoko.centerx,214
point.kinoko.centery,34

animation0.interval,sometimes
animation0.pattern0,overlay,1001,50,118,78
animation0.pattern1,overlay,1000,50,118,78
animation0.pattern2,overlay,-1
}

surface40
{
collision0,124,81,200,141,Face
}

surface41
{
element0,overlay,surface0040.png,0,0
element1,overlay,surface0041_.png,114,64
collision0,124,81,200,141,Face
}

surface10,surface11
{
element0,overlay,kero.png,0,0
collision0,40,56,95,90,頭
point.centerx,70
point.centery,66
sakura.balloon.offsetx,80
sakura.balloon.offsety,-100
kero.balloon.offsetx,-30
kero.balloon.offsety,20
}

....
..
.

アルファブレンド

alpha channel 定義ファイルを用意することにより surface に alpha 値を付与することができる。alpha 値を与えられた surface はその alpha 値の大きさに従ってその背面の画素を透過して描画を行う。この構造によりいわゆる「半透明」効果を得ることができる。

alpha channel 定義ファイルの実体は当該 surface と全く同じサイズのグレースケール PNG ファイル surface(surface id).pna である。このビットマップの各ピクセルの輝度がそのまま当該 surface の alpha 値として設定される。即ち,完全な黒(輝度 0)で塗られた部分は完全に透明となり,完全な白(輝度 255)で塗られた部分は完全に不透明となる。

制限事項

アルファブレンドは Windows ではレイヤードウィンドウを使用する ULW 時のみ有効となる。従って win9x では使用できず,例え pna があったとしても surface は常に完全に不透明なものとして描画される。

補足

シェルと一般的な絵の最も大きな違いは外線のアンチエイリアスが許されないという点である。マスクで色を抜く関係上,外線とマスクの色が混じると,絵としては綺麗に見えても,マスクされた際に単に中途半端な色として抜けないまま残る。従って surface は背景とのアンチエイリアスなしで完全に「くり抜く」必要がある。

*.pna を使用し,アルファブレンドが可能な環境専用とする場合はこの限りではない。

サプリメントシェル

home
  +-ghost
      +-naru
         +-shell
            +-heta
              +-descript.txt
              +-surfaces.txt
              +-surface0.png
              ....
              ..
            +-master
         +-ghost

マスターシェルと同様にゴーストに合わせてデータを用意することで,ゴーストが異なる姿でマテリアライズするためのシェルを作成することができる。

シェルは INSTALL/1.4 (または INSTALL/1.3) に従ったアーカイブとして配布することで,稼働中のゴーストへ DnD するだけでインストールすることが可能になる。

shell_notinstalled

home
  +-ghost
      +-seriko
         +-shell
            +-master
            +-heta
              +-descript.txt
            +-verto
              +-descript.txt
            ....
            ..
         +-ghost

ゴーストマスタはアーカイブを配布する際に,特定のシェルをシェルエクスプローラで紹介することができる。シェルのインストール先フォルダを作成しそのフォルダに配置した descript.txt に以下のように記述する。

type,shell_notinstalled
name,せりこver.To
craftmanurl,http://www.abc.or.jp/sakura/index.html
craftman,Tomohiko
craftmanw,ともひこ

上記のように type,shell_notinstalled を記述することで,シェルエクスプローラで選択肢の一つとして表示され,選択決定すると web ブラウザにより craftmanurl で指定した URL が開かれるようになる。

ゴーストマスタはネットワーク更新時にこのファイルを上書きしないようにするべきである。