はじめに
GS2-Mission はゲーム内のミッション機能を実現するためのマイクロサービスです。
ミッションを表現するために、ミッションタスク と ミッションカウンター という2つのエンティティを持ち
クエストクリア時に ミッションカウンター を上昇させ、ミッションタスクにはミッションカウンターの値が一定以上であれば達成とみなして報酬を受け取れるようにする というような定義を行うことになります。
機能追加の背景
ミッションカウンターは1つのカウンターを複数の切り口で値を参照できるようになっています。
具体的には、デイリー・ウィークリー・マンスリー・トータル という4つの切り口が用意されており「クエストをクリアした回数のカウンター」であれば
クエストのクリア報酬では「1つのクエストをクリアしたカウンターを1上昇させる」という報酬を設定するだけで、
「今日クエストをクリアした回数」「今週クエストをクリアした回数」「今月クエストをクリアした回数」「ゲーム開始以降クエストをクリアした回数」といった値にアクセスが可能となり、これらをミッションタスクの条件に設定が可能です。
ここに「特定の条件を満たしてからのカウンター上昇量」という新しいオプションが追加されました。
具体的には「イベントが開催中か」という条件を設定して「イベント開催期間のクエストクリア回数」であったり、「メインクエスト10-10 をクリアしてからのクエストクリア回数」だったり、「クエストクリア回数10回達成」というミッションタスクの報酬を受け取ってからのクリア回数だったりを取得できるようになります。
機能追加の詳細
カウンターのマスターデータを定義する時にはどのようなスコープで値を記録するかを定義する必要があり CounterScopeModel で定義します。
CounterScopeModel は以下のフォーマットを持ちます。
CounterScopeModel
名前 | 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 |
scopeType | enum [resetTiming, verifyAction] | ✓ | “resetTiming” | ~ 128文字 | スコープの種類 | |
resetType | enum [notReset, daily, weekly, monthly] | {scopeType} == “resetTiming” | ✓ | ~ 128文字 | リセットタイミング | |
resetDayOfMonth | int | {resetType} == “monthly” | ✓ | 1 ~ 31 | リセットをする日にち(月の日数を超える場合は、最終日として扱われます) | |
resetDayOfWeek | enum [sunday, monday, tuesday, wednesday, thursday, friday, saturday] | {resetType} == “weekly” | ✓ | ~ 128文字 | リセットする曜日 | |
resetHour | int | {resetType} in [“monthly”, “weekly”, “daily”] | ✓ | ~ 23 | リセット時刻 | |
conditionName | string | {scopeType} == “verifyAction” | ✓ | ~ 128文字 | 条件名 | |
condition | VerifyAction | {scopeType} == “verifyAction” | ✓ | 条件 |
新しく追加されたフィールドは scopeType, conditionName, condition の3つのフィールドです。
scopeType に verifyAction を指定することで、新しい機能を利用することができるようになります。
conditionName には条件の名前を、condition にはカウントを開始する条件を定義します。
条件には各マイクロサービスが提供する VerifyAction が使用できます。
GS2-Mission トランザクションアクション | Game Server Services | Docs
たとえば、GS2-Mission の Gs2Mission:VerifyCompleteByUserId を使用すれば「特定のミッションタスクの報酬を受け取っているか」を検証することができますので、報酬を受け取ってからのカウント開始が可能となります。
続けて、ミッションタスクを定義する MissionTask モデル がもつ TargetCounterModel にも改修が加わっています。
TargetCounterModel
型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 | |
counterName | string | ✓ | ~ 128文字 | カウンター名 | ||
scopeType | enum [resetTiming, verifyAction] | ✓ | “resetTiming” | ~ 128文字 | スコープの種類 | |
resetType | enum [notReset, daily, weekly, monthly] | {scopeType} == “resetTiming” | ~ 128文字 | 目標リセットタイミング | ||
conditionName | string | {scopeType} == “verifyAction” | ✓ | ~ 128文字 | 条件名 | |
value | long | ✓ | 1 ~ 9223372036854775805 | 目標値 |
こちらに追加されたのは scopeType と conditionName です。
scopeType に verifyAction を使用することで、新しく追加された仕様のスコープを参照するタスクを定義できます。
conditionName に TargetCounterModel で定義したものと同じ条件名を指定することで、具体的なスコープを指定することができ、そのスコープでのカウンター値が目標値に達していれば達成とするミッションを作ることができます。