初期値は定義が決める(PropertyDef.rollInitialValue、6.2節)。抽選つきの宣言があるので乱数源が要る。
非公開_非公開 読み取り専用accumulate読み取り専用def非公開evented最後にrangeイベント(6.3節)を判定した実体値。まだ一度も判定していなければundefined。
on_max/on_minは、値が境界へ達した瞬間のもの(6.3節)で、境界に居る間ずっとではない。 判定は値を動かした側から呼ばれるが、tickは値が動かなくても回るので、同じ値のまま二度目を 走らせないための覚え書きが要る。
非公開iscomputeEffectiveValueの再入検出用。modifyのconditions(14節)が実効値を読むため、自分自身の実効値へ (直接・間接に)依存する循環参照が起こりうる。放置すると制御不能なスタックオーバーフローになるため、 再入検出時点で分かりやすいエラーを投げる。
非公開last直前に出した実効値と、それを出した読み取りの番号(EffectiveValueReading)。番号が今の読み取りと 一致する間だけ答えとして使える。読み取りを跨いだ番号は二度と一致しないので、tickで実体値が 動いた後に古い答えが出ることはない。
非公開last非公開 読み取り専用modifymodify効果(実効値へ寄与、getEffectiveValueが走査)と積分効果(YAMLではadd。tick毎に実体値へ加減算、tickが走査)
は消費されるタイミングが異なるため別リストで持つ。
読み取り専用ownerこのプロパティを持つ物。値1件を指すには「どの物のどの定義か」の組が要るので、defと並べて 公開する(WorldSession.recordTickMovement)。
今の値がどの域にあるか(6.4節のalert)。出すか・明滅させるかの判断はUI側(StatusArea.md 2節)。
今の実効値が該当する段(6.4節)が宣言しているart接尾辞(art_by_stage専用)。宣言が無ければundefined。
rangeの中での位置(0〜1)。rangeを持たないプロパティはundefinedで、バーではなく数値で見せる。
現在登録されている全寄与(modify/add両方)を、種別を落として1本にしたもの。何がこの値を押して
いるかは寄与のdeclarerが名乗る。
種別によらず全部が載ることを見られるのはここだけ——効き方の違う2本(実効値へ効くmodifyと、 tickごとに実体値へ足すadd)は、それぞれ別の口からしか観測できない。画面に出す口はまだ無い。
今いる段(6.4節)。段を宣言していない・どれにも該当しないならundefined。段から引ける事柄 (alert・art・名前)は、この1つを読んで得る。
生の値ではなく実効値で引く(modifyだけで決まる派生プロパティ自身のstagesも判定できるように するため)。
今いる段を、バーへ刻んで見せるための読み(6.4節)。段を宣言していないプロパティはundefined。
数値を加減算し(不可逆)、値が変わった直後にon_max・on_min(6.3節)の判定を自分で行う。 どこから呼ばれても判定は走るので、呼び出し側は変更後に何をすべきかを覚えなくてよい。
deltaが0の場合は何もしない。on_max等の既定の補正(rangeの境界へのset)が境界に着地した後の再setで、 add→applyRangeEventsAt→applyActiveEffect→setNumber→addが無限に連鎖するのを防ぐガード。
非公開applyrangeイベント(6.3節)を判定する。同じ値に二度は判定しない——境界へ達した瞬間のものなので、 上限に張り付いたまま動かない値に呼び直してはいけない。折り返しも自壊もしないon_max ——海区が見張りの成果として航路を湧かせる(voyage.yaml)のがそれ——は、呼び直されるたびに 同じ物を湧かせる。
transfer(9.5節)でこのプロパティから出せる量の上限。rangeがあればrange.minを下限とみなし、無ければ現在値そのまま。
非公開basebase(6.5節)が指す土台の実効値。baseを持たないか、土台を辿れなければ0。
非公開change今tickこの値へ入るaddの合計(8.4節)。0なら、この値は今のところ動かない。
tickが実際に足すのはこの値。 足す前に同じ数を読めることが、この場で結果を見に行かずに、 これから何が起きるかを言える唯一の手掛かりになる(値の出入り(WorldChange)には現れない)。
非公開 読み取り専用compute実効値を出して控えるところ(getEffectiveValue)。読み取りごとに作らず、1つを持ち回る ——実効値は1 tickに何度も引かれるので、そのたびに関数を作ると控えで浮いたぶんを食い潰す。
非公開computegetEffectiveValueの中身。conditions(14節)がこの実効値を読むため再入(循環参照)が起こりうる。 isComputingEffectiveValueで検出し、スタックオーバーフローになる前にエラーを投げる。
modifyとbase(土台にした値、6.5節)を加味した実効値(8.3節)。可逆な寄与であり、実体値そのものは書き換えない。
同じ読み取りの中でなら、前に出した答えをそのまま返す(EffectiveValueReading)——寄与のゲートが 揃って同じプロパティの段を見るので、1本の読み取りに同じプロパティが何度も現れる。
今まさに指定した名前のstage(6.4節)に該当しているか。boundがor_aboveなら、その段より上に
居ても真(PropertyDef.isInStage)。
オプションbound: StageBound積分効果(YAMLではadd)としての登録先(PropertyPassiveEffect.registerInto経由でのみ呼ばれる想定)。
modify効果としての登録先(PropertyPassiveEffect.registerInto経由でのみ呼ばれる想定)。
transfer(9.5節)でallow_overflow: falseの場合に受け取れる量の上限。rangeが無ければ上限なし。
絶対値代入(set)。差分をaddへ委譲するため、range判定はadd側に一本化される。
まだ世界のルールを走らせてはいけない時点で値を置く。登録済みの寄与(modify/add)は そのまま、値の中身だけを差し替え、rangeイベント(6.3節)もgainの記録(PropertyGain)も行わない。
途中の状態が世界から見えてはいけない場面のための入口:
出来上がったオブジェクトの値を動かすのには使わない。 そちらは add / setNumber で、 rangeイベントもgainも通常どおり働く。
passivesのaddを実体値へ加減算し(8.4節、不可逆)、rangeイベント(6.3節)を判定する。
1tickにつき1回、WorldObject.tick経由で呼ばれる想定。
このtickで動いた量を言うのは自分(PropertyGain)。稼ぎとして数えるかを決めるのは受け取る側
(WorldSession.recordTickMovement)で、こちらは動いた量を渡すだけ。渡すのは、この値へ入るaddを
まとめ(changePerTick)、端のクランプ(applyRangeEvents)まで済ませた後の正味。
今の進み方が続いたとき、あと何tickでrange.maxへ届く(on_maxが起きる、6.3節)か。 上端へ向かって進んでいない・rangeを持たない場合はundefined。
切り上げるのは、届くのがtickの回る瞬間だからで、表示のための丸めではない。 最低1を返すのも
同じ理由——既にmaxに居ても、溢れてon_maxが起きるのは次のtickなので、0tick後ではない。
何分後かへ直すのは、tickがいつ回るかを知っている側(World.minutesUntilTick)。
declarerが宣言したdefの登録を外す。外すのは1件ずつ——同じ宣言元が同じプロパティへ2件登録して いることがある(操作の役が宣言元自身へ解決したとき、11.5節)ので、宣言元だけで消すと巻き添えになる。
props の実行時の値。数値(値域は32bit整数の幅、6節)のみを扱う。PassiveEffectの影響先は「プロパティ」であるため、 登録済み効果の一覧・tick毎の反映・実効値の算出はWorldObjectではなくこの値自身が持つ。値の変更後のrangeイベント 判定(どのon_*をいつ発火するか)は自分のPropertyDef(applyRangeEventsAt)へ委譲し、値が変わったことは持ち主の WorldObjectへも伝える(抵抗の成立、7.13節)。いずれも呼び出し側は変更後に何を判定すべきかを知らなくてよい。
見せ方に関わる問い(ratio・alert・stage)は実効値(8.3節)で答える。画面に出るのは「今そう見えている値」 であり、実体値のまま出すと、包帯を当てても痛みが下がらないように見えるため。