GS2-Stamina

スタミナ機能

スタミナはゲーム内の回数制限機能を実現するものです。 GS2-Limit は1日に3回 のように回数制限を表現しますが、GS2-Stamina は8時間で1ポイント回復するスタミナを使用して1日3回に回数制限を実現します。

スタミナの場合、消費するポイントに差をつけることで、Aという行動であれば1日3回、Bという行動であれば1日5回のような仕様を実現できます。 これは、スタミナ1あたりで得られる経験値やゲーム内通貨の指針を設けることで、ゲーム内のどのような行動をとっても、効率のいい行動というものを排除することができ、ゲームバランスを調整しやすくなります。

毎日ログインしてもらうように開発者は努力をするべきなので、あまりこのような仕様にはしませんが、 プレイヤーにとっては8時間で1ポイント回復し、最大15ポイントまで蓄積できる仕様であれば、毎日ログインしなくても5日に1回のログインでもポイントを無駄にすることなく使い切ることができます。

スタミナ

スタミナには「回復周期」「回復量」「最大値」を設定します。

オーバーフロー

スタミナは最大値を超えて回復させることができます。 最大値を超えた状態では時間経過による回復は発生しません。 また、最大値を超えた状態でもUIの都合などで、それ以上は加算させない「本当の最大値」を設定できます。

なぜオーバーフローさせるのですか?

この仕様はあまりスタミナを仕様に組み込んだゲームをプレイする機会のなかった開発者には奇妙に感じるかもしれません。

スタミナは一般的に回復するためのアイテムや、ゲーム内課金によって回復する手段が存在します。 そのアイテムを使用したり、スタミナを購入する際にプレイヤーのストレスを最小化しようとこのような仕様が生まれました。

具体的な例を示しましょう。

このゲームは5分で1ポイントスタミナが回復し、あなたのスタミナの最大値は50ポイントです。 あなたが次にプレイしたいクエストをプレイするにはスタミナが10ポイント必要です。 しかし、現在のあなたのスタミナ値は9ポイントしかなく、5分待たなければ次のクエストをプレイできません。 そこで、あなたはスタミナを購入しようと思いました。スタミナを購入するとスタミナが50ポイント回復します。 しかし、今すぐにスタミナを購入すると、50ポイント回復しても9ポイントは無駄になってしまいます。 そのため、あなたは5分待って1ポイント回復した後でクエストをプレイし、0ポイントにした後で、その次のクエストを遊ぶためにスタミナを購入しました。

これではプレイヤーがゲームを快適にプレイすることはできません。 そこで、最大値を超えてスタミナを回復できる仕様を導入するゲームが生まれました。

スタミナに最大値を超える仕様を加え、ユーザー体験がどのように変化するか見てみましょう。

現在のあなたのスタミナ値は9ポイントしかなく、5分待たなければ次のクエストをプレイできません。 そこで、あなたはスタミナを購入し、スタミナを50ポイント回復し、59ポイントしました。 この状態では時間経過によるスタミナの回復は行われなくなりますが、 あなたはすぐに次のクエストを開始し、スタミナを49ポイントにしました。

実装例

現在のスタミナ値を取得

    var item = await gs2.Stamina.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Stamina(
        staminaName: "stamina-0001"
    ).ModelAsync();
    const auto Domain = Gs2->Stamina->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        AccessToken
    )->Stamina(
        "stamina-0001" // staminaName
    );
    const auto item = Domain.Model();

スタミナを消費

このAPIでスタミナを消費する処理を行うことは推奨していません。

GS2-Quest といったサービスを通してスタミナを消費を行う代わりに 何らかの処理を実行することを推奨します。

    var result = await gs2.Stamina.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Stamina(
        staminaName: "stamina-0001"
    ).ConsumeAsync(
        consumeValue: 50
    );
    var item = await result.ModelAsync();
    const auto Domain = Gs2->Stamina->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        AccessToken
    )->Stamina(
        "stamina-0001" // staminaName
    );
    const auto Future = Domain->Consume(
        50
    );
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError()) return false;

詳細なリファレンス