ホーム > キャラクターを作ろう!! > 講座 - [キャラデリを使いこなす(仮)]

キャラデリに関する解説です。正式な解説文までのつなぎとして、開発掲示板に投稿した簡単な概念説明と記述例を掲載します。


■簡単なキャラデリのしくみ
キャラデリ(VisitTo関数)では,「訪問定義ファイル」(vstファイル)にファイル名を列挙したファイルを、キャラクターの起動に必須であるpsnファイルや,プロパティファイル(aya.prp,sys.prp)と共に通信相手に送信し,規定のフォルダ配置にセットしたあと,相手側で新規キャラクター(プロセス)として起動します.

vstファイルにパスを指定すれば、どんなファイルでも送信することができます.キャラクターの通常起動とは全く別に訪問専用のexaファイルを用意し,それを使って起動したほうが良いでしょう.また,音声や画像データは専用のものを用意しても良いし,共有しても良いです.

VisitTo関数は,キャラクターが返信されてくるとコールバック関数を呼び出します.このコールバック関数の中で「ただいまー!」的なふるまいを記述します.

注意すべきことは,VisitTo関数によってキャラクターの訪問が成功しても,Chararina・システムはそのキャラクターの動作を停止しないことです.(訪問の可否がわかった時点でVisitTo関数を抜け,基底状態に戻ります)訪問中はクリックされても反応しないとか,時報やタイマーを再生しないといった挙動は,制作者自ら綾織で条件分岐して記述していく必要があります.逆に言えば,訪問中でも他のキャラクターを表示して機能を継続するようなことが可能です.


■キャラデリを行うまでの作業(例)
1.訪問(先方に送る)専用のexaファイルを記述する.
2.exapack.lstで1で用意したexaファイルを除外する.
3.vst定義ファイルを記述する.
4.メッセージ送信ダイアログからのコールバックを受ける.
5.VisitTo関数を呼び出す.
6.返答を受ける.


[1.exaファイルの作成]

訪問させるexaファイルを,これまでの通常稼働用exa群と別に用意します.ここではファイル名をvisitor.ayaとします(コンパイルするとvisitor.exaになる).

このvisitor.exaは2点を除いて通常稼働用exaと同じ記述が可能です.その2点とはStartUp/ShutDown標準アクションで,訪問用exa(ここではvisitor.exa)ではこれらのかわりに,
void VisitorStartUp( string from, string message );
string VisitorShutDown( );

を使用します.訪問用exaがロードされるとVisitorStartUpが最初に呼び出されます.(関数詳細はリファレンス参照)マウスクリックへの反応などは,これまで通りaction MouseUpL@( false )等で記述できます.

訪問キャラクターを帰還させるには,送り先のユーザが「お休みする」の操作を行うか,訪問キャラクターが自分でExitPersona関数を呼び出します.するとVisitorShutDownが呼ばれたうえで終了(帰還)します.

[2.exapack.lstの準備]

訪問用exaにはMouseUpLなどを記述することになります.ところで,Chararinaは標準状態では,datフォルダ以下の*.exaファイルをすべてロードして実行しようとします.このままだと,MouseUpLの2重定義エラーになります.

そこで,通常起動時にvisitor.exaがロードされることのないよう,exapack.lstに,visitor.exaなど訪問でしか使用しないexaファイルを"除いた"exaファイルを列挙します.

[3.vst定義ファイルの準備]

.vstファイルには,先頭2行に、
VST
V1.00
と書いた後,送りたいファイルをdat/からの相対パスで列挙します. 例えばvisitor.exaとimage\body1.hp3の2つだけを送りたい場合,

VST
V1.00
visitor.exa
image\body1.hp3
となります.

hogehoge.vstというファイル名にしたとき,VisitTo関数の第2引数は"hogehoge"になることに注意してください.

[4.cIMMessageInputDialogコールバック関数の記述]

キャラデリを行う際,ほとんどの場合,メンバーリストからメンバーを右クリックするなどしてメッセージ作成ダイアログを開き,本文を書いて,「○○でキャラデリ」を選ぶことになります.cIMMessageInputDialog関数は,メッセージ作成ダイアログがクローズされると自動的に呼び出されます(コールバック).

この関数定義は以下の通りです.
void cIMMessageInputDialog( int result,string to,string message,string param )
このとき,result=1であれば,OKボタンが押されることによってクローズした(要するに,OKが押された)ということです.また,toには宛て先が,messageには本文が代入されています.

[5.VisitTo関数の呼び出し]

つまり,上記のcIMMessageInputDialogからパラメータを受けて,VisitTo関数に適切に代入するような記述を通常稼働用exaのどこかに記述しておけば,メッセージ作成ダイアログを操作することでキャラデリが行えます.
記述例は下記の通りです.
---------------

void cIMMessageInputDialog( int result,
    string to,string message,string param )
{
  if( result == 0 )//0はキャンセル
  return;
  
  VisitTo( to, "hogehoge", message, 1, VisitReturn, "meke" );
}

//さらに,コールバック関数VisitReturnの記述が必要.
//下記は記述例

void VisitReturn( string cid , string message , string param )
{
  Talk( "\eただいま戻りました。\wお返事は" + message + "です。" );
}
---------------

ここで,VisitTo関数の各引数の意味は以下の通りです.
to:送信崎のキャラリナIDを指定
"hogehoge":vstファイル名がhogehoge.vstのとき.
message:送信する本文(文字列).ここではIM作成ダイアログで記述したメッセージを代入します。
1:訪問からキャラクターが帰ってきたときに,次の引数で指定するコールバック関数を,「割り込みで呼び出す」指定を行います.
VisitReturn:帰還時に呼び出されるコールバック関数.通常稼働時exaのどこかにこの関数の実体を記述する必要がある.
"meke":このパラメータは,指定したものがそのままVisitReturnの第3引数に入って帰ってきます.複数のVisitToを同時平行的に行う場合に,それぞれの帰還がどの訪問に対するものなのか区別するために存在しています.

[6.コールバックで返答を受ける]

既に前項でVisitReturnという関数を定義して記述したので,上の通りです.この関数は名前はなんでも良いですが,型は
void &func( string pid , string msg , string param )

と決まっています.

VisitToの第4引数で0を指定した場合は,送信側のキャラクターが待機状態(メニューを開いている等の処理を行っていない状態)でのみこのVisitReturnが呼び出されます.