UnmappedIsland ソースリファレンス - v0.1.0
    検索インデックスを準備しています...

    クラス PropertyValue

    props の実行時の値。数値(値域は32bit整数の幅、6節)のみを扱う。PassiveEffectの影響先は「プロパティ」であるため、 登録済み効果の一覧・tick毎の反映・実効値の算出はWorldObjectではなくこの値自身が持つ。値の変更後のrangeイベント 判定(どのon_*をいつ発火するか)は自分のPropertyDef(applyRangeEventsAt)へ委譲し、値が変わったことは持ち主の WorldObjectへも伝える(抵抗の成立、7.13節)。いずれも呼び出し側は変更後に何を判定すべきかを知らなくてよい。

    見せ方に関わる問い(ratio・alert・stage)は実効値(8.3節)で答える。画面に出るのは「今そう見えている値」 であり、実体値のまま出すと、包帯を当てても痛みが下がらないように見えるため。

    インデックス
    _number: number
    accumulateEffects: RegisteredPassiveEffect[] = []
    eventedNumber: number | undefined

    最後にrangeイベント(6.3節)を判定した実体値。まだ一度も判定していなければundefined。

    on_max/on_minは、値が境界へ達した瞬間のもの(6.3節)で、境界に居る間ずっとではない。 判定は値を動かした側から呼ばれるが、tickは値が動かなくても回るので、同じ値のまま二度目を 走らせないための覚え書きが要る。

    isComputingEffectiveValue: boolean = false

    computeEffectiveValueの再入検出用。modifyのconditions(14節)が実効値を読むため、自分自身の実効値へ (直接・間接に)依存する循環参照が起こりうる。放置すると制御不能なスタックオーバーフローになるため、 再入検出時点で分かりやすいエラーを投げる。

    lastEffectiveValue: number = 0

    直前に出した実効値と、それを出した読み取りの番号(EffectiveValueReading)。番号が今の読み取りと 一致する間だけ答えとして使える。読み取りを跨いだ番号は二度と一致しないので、tickで実体値が 動いた後に古い答えが出ることはない。

    lastEffectiveValueReading: number = -1
    modifyEffects: RegisteredPassiveEffect[] = []

    modify効果(実効値へ寄与、getEffectiveValueが走査)と積分効果(YAMLではadd。tick毎に実体値へ加減算、tickが走査) は消費されるタイミングが異なるため別リストで持つ。

    このプロパティを持つ物。値1件を指すには「どの物のどの定義か」の組が要るので、defと並べて 公開する(WorldSession.recordTickMovement)。

    • get artSuffix(): string | undefined

      今の実効値が該当する段(6.4節)が宣言しているart接尾辞(art_by_stage専用)。宣言が無ければundefined。

      戻り値 string | undefined

    • get ratio(): number | undefined

      rangeの中での位置(0〜1)。rangeを持たないプロパティはundefinedで、バーではなく数値で見せる。

      戻り値 number | undefined

    • get registeredContributions(): readonly RegisteredPassiveEffect[]

      現在登録されている全寄与(modify/add両方)を、種別を落として1本にしたもの。何がこの値を押して いるかは寄与のdeclarerが名乗る。

      種別によらず全部が載ることを見られるのはここだけ——効き方の違う2本(実効値へ効くmodifyと、 tickごとに実体値へ足すadd)は、それぞれ別の口からしか観測できない。画面に出す口はまだ無い。

      戻り値 readonly RegisteredPassiveEffect[]

    • get stage(): PropertyStage | undefined

      今いる段(6.4節)。段を宣言していない・どれにも該当しないならundefined。段から引ける事柄 (alert・art・名前)は、この1つを読んで得る。

      生の値ではなく実効値で引く(modifyだけで決まる派生プロパティ自身のstagesも判定できるように するため)。

      戻り値 PropertyStage | undefined

    • 数値を加減算し(不可逆)、値が変わった直後にon_max・on_min(6.3節)の判定を自分で行う。 どこから呼ばれても判定は走るので、呼び出し側は変更後に何をすべきかを覚えなくてよい。

      deltaが0の場合は何もしない。on_max等の既定の補正(rangeの境界へのset)が境界に着地した後の再setで、 add→applyRangeEventsAt→applyActiveEffect→setNumber→addが無限に連鎖するのを防ぐガード。

      パラメータ

      • delta: number

      戻り値 void

    • rangeイベント(6.3節)を判定する。同じ値に二度は判定しない——境界へ達した瞬間のものなので、 上限に張り付いたまま動かない値に呼び直してはいけない。折り返しも自壊もしないon_max ——海区が見張りの成果として航路を湧かせる(voyage.yaml)のがそれ——は、呼び直されるたびに 同じ物を湧かせる。

      戻り値 void

    • transfer(9.5節)でこのプロパティから出せる量の上限。rangeがあればrange.minを下限とみなし、無ければ現在値そのまま。

      戻り値 number

    • base(6.5節)が指す土台の実効値。baseを持たないか、土台を辿れなければ0。

      戻り値 number

    • 今tickこの値へ入るaddの合計(8.4節)。0なら、この値は今のところ動かない。

      tickが実際に足すのはこの値。 足す前に同じ数を読めることが、この場で結果を見に行かずに、 これから何が起きるかを言える唯一の手掛かりになる(値の出入り(WorldChange)には現れない)。

      戻り値 number

    • 実効値を出して控えるところ(getEffectiveValue)。読み取りごとに作らず、1つを持ち回る ——実効値は1 tickに何度も引かれるので、そのたびに関数を作ると控えで浮いたぶんを食い潰す。

      戻り値 number

    • getEffectiveValueの中身。conditions(14節)がこの実効値を読むため再入(循環参照)が起こりうる。 isComputingEffectiveValueで検出し、スタックオーバーフローになる前にエラーを投げる。

      戻り値 number

    • modifyとbase(土台にした値、6.5節)を加味した実効値(8.3節)。可逆な寄与であり、実体値そのものは書き換えない。

      同じ読み取りの中でなら、前に出した答えをそのまま返す(EffectiveValueReading)——寄与のゲートが 揃って同じプロパティの段を見るので、1本の読み取りに同じプロパティが何度も現れる。

      戻り値 number

    • 今まさに指定した名前のstage(6.4節)に該当しているか。boundがor_aboveなら、その段より上に 居ても真(PropertyDef.isInStage)。

      パラメータ

      • stageName: string
      • オプションbound: StageBound

      戻り値 boolean

    • transfer(9.5節)でallow_overflow: falseの場合に受け取れる量の上限。rangeが無ければ上限なし。

      戻り値 number

    • 絶対値代入(set)。差分をaddへ委譲するため、range判定はadd側に一本化される。

      パラメータ

      • value: number

      戻り値 void

    • まだ世界のルールを走らせてはいけない時点で値を置く。登録済みの寄与(modify/add)は そのまま、値の中身だけを差し替え、rangeイベント(6.3節)もgainの記録(PropertyGain)も行わない。

      途中の状態が世界から見えてはいけない場面のための入口:

      • 型が変わったときの値の引き継ぎ(becomeType、9.9節)。passiveの登録もスタックの再判定も まだ済んでおらず、ここで起きた効果は組み立て途中のオブジェクトを見ることになる。 引き継ぎをaddへ寄せられない理由はもう1つあって、becomeは操作の効果の中から走るため、 引き継いだ値がそのままプレイヤーの稼ぎとして記録されてしまう。
      • 生成が書き込む行き先ID(IslandSpawner)。両端の道が互いを指し終えるまで、片側だけを 指した状態は世界として成立していない。
      • シナリオが用意する開始値。水を置く前に水分を0にした瞬間に渇きで死ぬ、という順序依存を 持ち込まない。

      出来上がったオブジェクトの値を動かすのには使わない。 そちらは add / setNumber で、 rangeイベントもgainも通常どおり働く。

      パラメータ

      • number: number

      戻り値 void

    • passivesのaddを実体値へ加減算し(8.4節、不可逆)、rangeイベント(6.3節)を判定する。 1tickにつき1回、WorldObject.tick経由で呼ばれる想定。

      このtickで動いた量を言うのは自分(PropertyGain)。稼ぎとして数えるかを決めるのは受け取る側 (WorldSession.recordTickMovement)で、こちらは動いた量を渡すだけ。渡すのは、この値へ入るaddを まとめ(changePerTick)、端のクランプ(applyRangeEvents)まで済ませた後の正味。

      戻り値 void

    • 今の進み方が続いたとき、あと何tickでrange.maxへ届く(on_maxが起きる、6.3節)か。 上端へ向かって進んでいない・rangeを持たない場合はundefined。

      切り上げるのは、届くのがtickの回る瞬間だからで、表示のための丸めではない。 最低1を返すのも 同じ理由——既にmaxに居ても、溢れてon_maxが起きるのは次のtickなので、0tick後ではない。 何分後かへ直すのは、tickがいつ回るかを知っている側(World.minutesUntilTick)。

      戻り値 number | undefined

    • declarerが宣言したdefの登録を外す。外すのは1件ずつ——同じ宣言元が同じプロパティへ2件登録して いることがある(操作の役が宣言元自身へ解決したとき、11.5節)ので、宣言元だけで消すと巻き添えになる。

      パラメータ

      戻り値 void