NarraLeaf

Persistent\<T extends PersistentContent\>

名前付きで保存されるストーリー状態を扱う `Persistent` クラス。比較、条件、動的な単語、値の設定を扱う

これまでは、Storable の状態を Script を通じてしか変更できませんでしたが、Persistent はフローを簡単に制御するための便利なメソッド群を提供します。

Persistent には、名前空間の名前初期状態が必要です。同じ名前の Persistent は同じ状態を共有します。

名前空間は、既存の組み込み名前空間にはできません(組み込みの名前空間には「game」が含まれます)

type PersisData = {
    flag: boolean;
    coin: number;
    name: string;
    // ...
};
const persis = new Persistent<PersisData>("persis", {
    flag: false,
    coin: 0,
    name: "John Smith",
    // ...
});

注: 保存する内容はシリアライズ可能でなければなりません。NarraLeaf-React がサポートするシリアライズ可能な値は次の通りです:

  • string
  • number
  • boolean
  • object: キーは string、値は上記のシリアライズ可能な値のいずれか
  • array: 要素が上記のシリアライズ可能な値のいずれか
  • undefined
  • null
  • Date: 標準の JavaScript の Date オブジェクト

スクリプトの内容に Persistent が含まれる場合は、Story に登録する必要があります。

story.registerPersistent(persis);

ホストからこれらの値を監視する

以下のメソッドはアクションを構築するものなので、シーンの中に置く必要があります。ストーリーの外側にある React コード — HUD、実績の監視、エディターパネルなど — は、Storable を通じて同じ値を読み書きでき、それらを購読することもできます:

game.getLiveGame().getStorable()
    .onChange("persistent:persis", "coin", ({previous, next}) => {...});

名前空間のキーに注意してください: "persis" という名前の Persistent"persistent:persis" として登録されます。Namespace ではなく Storable 側で購読し、読み込まれたセーブを取りこぼさないように onChangeonRestore を組み合わせてください — 詳細は保存された値を監視するを参照してください。

公開メソッド

constructor

  • namespace: string - 名前空間の名前
  • defaultContent: T - 初期状態

equals<K extends StringKeyOf<T>>

値が等しいかどうかを判定します。Condition の中で使用できます

  • key: K - 状態のキー
  • value: T[K] | Lambda<T[K]> | LambdaHandler<T[K]> - 比較する値、ラムダ関数、またはラムダハンドラー
  • 戻り値: Lambda<boolean>
scene.action([
    Condition
        .If(persis.equals("id", persis.get("player_id")), [
            character1.say("ID matches!")
        ])
]);

// またはラムダハンドラーを使う場合
scene.action([
    Condition
        .If(persis.equals("id", (ctx) => ctx.$("player").get("player_id")), [
            character1.say("Player ID matches!")
        ])
]);

notEquals<K extends StringKeyOf<T>>

値が等しくないかどうかを判定します。Condition の中で使用できます

  • key: K - 状態のキー
  • value: T[K] | Lambda<T[K]> | LambdaHandler<T[K]> - 比較する値、ラムダ関数、またはラムダハンドラー
  • 戻り値: Lambda<boolean>
scene.action([
    Condition
        .If(persis.notEquals("id", persis.get("player_id")), [
            character1.say("ID doesn't match!")
        ])
]);

// またはラムダハンドラーを使う場合
scene.action([
    Condition
        .If(persis.notEquals("id", (ctx) => ctx.$("player").get("player_id")), [
            character1.say("Player ID doesn't match!")
        ])
]);

isTrue<K extends Extract<keyof T, BooleanValueKeyOf<T>>>

値が true かどうかを判定します。Condition の中で使用できます

  • key: K - 状態のキー
  • 戻り値: Lambda<boolean>
scene.action([
    Condition
        .If(persis.isTrue("flag"), [
            character1.say("Flag is true")
        ])
]);

isFalse<K extends Extract<keyof T, BooleanValueKeyOf<T>>>

値が false かどうかを判定します。Condition の中で使用できます

  • key: K - 状態のキー
  • 戻り値: Lambda<boolean>

isNotNull<K extends StringKeyOf<T>>

値が null でも undefined でもないかどうかを判定します。Condition の中で使用できます

  • key: K - 状態のキー
  • 戻り値: Lambda<boolean>

toWord<K extends StringKeyOf<T>>

動的な単語に変換します

  • key: K - 状態のキー
  • 戻り値: Word<DynamicWord>
character.say(["You have ", persis.toWord("gold"), " gold"]);

// or

character.say`You have ${persis.toWord("gold")} gold`;

get<K extends StringKeyOf<T>>

toWord のエイリアスです

  • key: K - 状態のキー
  • 戻り値: Word<DynamicWord>
character.say`You have ${persis.get("coin")} coins`;

conditional

条件付きの単語を作成します

  • condition: Lambda<boolean> | LambdaHandler<boolean> - チェックする条件
  • ifTrue: DynamicWordResult - 条件が真の場合に返す単語
  • ifFalse: DynamicWordResult - 条件が偽の場合に返す単語
  • 戻り値: Word
character.say([
  "Your flag is ",
  persis.conditional(
    persis.isTrue("flag"),
    "on",
    "off"
  )
]);

evaluate<K extends StringKeyOf<T>>

JavaScript 関数を評価し、その結果が true かどうかを判定します

  • key: K - 状態のキー
  • fn: (value: T[K]) => boolean - 状態を評価する JavaScript 関数
  • 戻り値: Lambda<boolean>
scene.action([
    Condition
        .If(persis.evaluate("coin", (coin) => coin < 10), [
            character1.say`You don't have enough coins!`
        ])
]);

チェーン可能なメソッド

set<K extends StringKeyOf<T>>

指定したキーの値を永続ストレージに設定するアクションを作成します

オーバーロード 1/2

  • key: K - 値を設定するキー
  • value: T[K] - 設定する値
  • 戻り値: Proxied<Persistent<T>, Chained<LogicAction.Actions>>
scene.action([
    persis.set("coin", 10)
]);

オーバーロード 2/2

  • key: K - 値を設定するキー
  • handler: (value: T[K]) => T[K] - 値を変更するハンドラー
  • 戻り値: Proxied<Persistent<T>, Chained<LogicAction.Actions>>
scene.action([
    persis.set("coin", (coin) => coin + 10) // コインは 10 増える
]);

assign

永続ストレージに値を割り当てるアクションを作成します

  • value: Partial<T> | ((value: T) => Partial<T>) - 状態に割り当てる値
  • 戻り値: Proxied<Persistent<T>, Chained<LogicAction.Actions>>
scene.action([
    persis.assign({ coin: 10 })
]);

// または関数を使う場合
scene.action([
    persis.assign((state) => ({ coin: state.coin + 10 }))
]);

このページの目次