GS2 Blog

Game Server Services(https://gs2.io/) の最新情報をお届けします

GS2-StateMachine で利用する GSL にスクリプトを直値で指定できるようになりました

はじめに

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 なので、ステートマシンの終端を表すステートに遷移しステートマシンは起動直後に終了します。

(C) Game Server Services, Inc.