はじめに
GS2-StateMachine はステートマシンをサーバーサイドで管理し、クライアントから届くメッセージを元に状態遷移することで
チート行為に対する耐性をたかめつつ、自由度の高いスクリプティングを実現する機能を提供しています。
機能追加の背景
GS2-StateMachine が管理するステートマシンは GS2 State Language(GSL) を使用して定義します。
新しいステートに遷移した際にスクリプトを実行して、ステートマシンが持つ状態変数を書き換えることができます。
従来はこのスクリプトの指定には GS2-Script が管理するスクリプトのIDを指定することで定義していました。
しかし、GSLとスクリプトの実体が分離してしまい、見通しが悪くなってしまう状況が発生していました。
機能追加の詳細
StateMachine MainStateMachine { Variables { } EntryPoint Task1; Task Task1(int initCounter) { Event StartLoop(); Event Error(string Reason); Payload { result = { event="Pass", params={}, updatedVariables=args.variables } } } PassTask Pass; ErrorTask Error(string reason); Transition Task1 handling Pass -> Pass; }
こちらの例のように Task 内の Payload セクションで直接 Lua スクリプトを記述できるようになりました。
例では Task1 に遷移した際に以下のスクリプトを実行します。
result = { event="Pass", params={}, updatedVariables=args.variables }
スクリプトを実行した結果、Pass というメッセージを自身のステートマシンへ発します。
Transition Task1 handling Pass -> Pass;
Task1 ステートにいる時に Pass というメッセージを受け取ると、Pass ステートに遷移します。
Pass ステートは PassTask なので、ステートマシンの終端を表すステートに遷移しステートマシンは起動直後に終了します。