オプションonMin: RangeEventDef読み取り専用alertstagesのalertが述べている、値がどちらへ動くと悪いか。段を下から上へ見て、深刻さが単調に上がるなら
up(負荷など)、単調に下がるならdown(満腹度など)。上下どちらの端も悪い山なり・谷なりの並びは
mixedで、バーの向きを決められない(rangeを持つプロパティでは、ロード時にこれを拒む)。
alertが向きを何も述べていなければundefined——段が無い・全段が同じ域・値の並びを持たない
シンボル型(6.6節)。既定へ倒すのはここではなくworsensUpwardの仕事で、ここが「述べていない」と
「減ると悪い」を1つの値にすると、他の宣言と突き合わせる側がその2つを見分けられなくなる。
読み取り専用basebase(6.5節): 実効値の土台にする、他のプロパティへの参照。その実効値へ自分の値を加算する。 書かれていなければundefinedで、実効値は自分の値から始まる。土台を辿れなければ寄与0。
非公開 読み取り専用declared著者が書いたon_max(6.3節)。書かれていなければundefinedで、その場合は既定のクランプ (自分自身をrange.maxへset)が代わりに走る——どちらが走るかはonMaxが答える。
非公開 読み取り専用declared著者が書いたon_min(6.3節)。declaredOnMaxの下限側の鏡像。
非公開 読み取り専用fallbackstages中のフォールバック段(min:undefined・eq:undefined)。stagesは不変のため一度だけ求める。該当が無ければundefined。
読み取り専用gaugeカードのゲージとして見せる宣言(6.8節)。持たないプロパティはバーにならない——「出すかどうか」は この宣言の有無だけで決まり、UI側は名前を1つも知らない(docs/ui/CardView.md 8節)。
読み取り専用global読み取り専用hasいずれかの段がart(6.4節)を宣言しているか(art_by_stageの検証)。
非公開 読み取り専用initialvalue: {min, max} 記法による初期値のランダム範囲(6.2節、rollInitialValue参照)。無ければundefined。
読み取り専用initial抽選を経ない初期値(スカラー)。initialValueRangeを持つ場合は、RNGを使わない生成でのフォールバック(= range.min)。
読み取り専用is値が型(object_defsのグローバルID、6.9節。海区が名乗る隣)か。シンボルと同じく実行時の値は
数値なので、型の名前へ戻せるかどうかはこの宣言だけが知っている(DefNames.propertyValueToken)。
読み取り専用is値がシンボル(6.6節。天気のclear、季節のdry)か。実行時の値は数値なので、シンボル名へ
戻せるかどうかはこの宣言だけが知っている(DefNames.propertyValueTokenが使う)。
非公開last非公開last直前にstageAtが答えた値と、その答え。同じ値には必ず同じ段(stagesは不変)なので、続けて 同じ値を訊かれたら走査せずに返す。1件しか持たないのは、続けて訊く側——1つのプロパティの段で 縛られた寄与が並ぶゲート(8.2節)の判定——が、同じ値を続けて訊くから。
読み取り専用name非公開 読み取り専用onon_max(6.3節): 値がrange.maxに達したとき(超えたときを含む)にselfへ一度だけ適用するactive内容。
対象プロパティは自分自身(折り返し)でも他のプロパティ(繰り上げ先)でも構わない。著者が書かなかった
場合は「自分自身をrange.maxへsetする」既定のクランプ——著者はrangeを書くだけでクランプが得られ、
特別な挙動が要る場合だけon_maxを書けばよい。著者がconditionsを書いた場合は、満たさない回だけが
同じ既定のクランプへ倒れる(ConditionalEffect参照)。range自体が未定義の場合のみundefined。
非公開 読み取り専用onon_min(6.3節): on_maxの下限側の鏡像。値がrange.minに達したときにselfへ一度だけ適用する。
読み取り専用range取りうる値域(6.3節)。on_max/on_minを使う場合は必須。使わない場合はundefined。
非公開 読み取り専用rangeonMax/onMinを、適用できる形に並べたもの(適用するのはこのクラス自身だけ、applyRangeEventsAt)。
一度だけ組み立てて持つ。 中身は読み込み後に動かないのに、値が動くたびに読まれる (applyRangeEventsAt)ので、読むたびに組み直すと、端のイベントを1つも宣言していない プロパティまで毎回配列を作ることになる。
読み取り専用stages宣言されている段(6.4節)を宣言順に。1つも宣言していなければ空。
読み取り専用tagsこのプロパティに付いたタグのグローバルIDの一覧(6.7節)。object_defのタグ(4.1節)とは別の 名前空間で、UIがプロパティをカテゴリ別にまとめるために使う。
読み取り専用worsens値が増えるほど悪いか。向きは複数の宣言が述べうる(worsens・ゲージの両端・段のalert)が、
どれも同じ1つの事実を言うので、2つ以上が述べていれば同じ答えでなければならない
(食い違いはロード時に弾く、6.8節)。どれも述べていなければ既定の「減ると悪い」。
見せ方(帯の向き・増減の記号の色、StatusArea.md)のほかに、収支表がこれを見る
——増える側が悪い値は1日に賄う量に数えない(analysis/balanceTables.tsのdailyNeedsOf、
docs/diagnostics/BalanceStats.md「何を「1日に要る量」と数えるか」)。
著者がon_max(6.3節)を書いているか。rangeを書いただけのプロパティはfalse——上限で走るのは
値を丸める既定のクランプだけで、着いても何も起きない。
「進み切ると何かが起きる値か」を上端だけについて問う口。両端のどちらでもよい問い (hasDeclaredRangeEvent)とは別物で、下端のイベントしか無い値は、上限へ向かって進んでいても 着いた先に何も無い。
著者がon_max/on_minを書いているか(6.3節)。既定のクランプしか無いプロパティはfalse。
端のイベントは実体値で発火する(applyRangeEventsAt)ので、実効値が実体値と食い違いうる プロパティがこれを持つと、見えている値と起きることがずれる。世界全体でその組み合わせを 弾くのはWorldCodex(両方を持つのはそちらだけ)。
stagesを1つでも持つか(art_by_stageの検証、6.4節)。
初期値の宣言(6.2節)。抽選つきならその範囲、そうでなければ固定値。
実効値effectiveValueのとき、値がどの域にあるか(6.4節のalert)。該当する段が無い場合と、 該当した段がalertを宣言していない場合は安全域。
number(変更直後の実体値)が端へ達していれば、そのイベントをowner自身へ適用する。
適用はowner側のadd/setNumberを通って本メソッドを再帰的に呼ぶため、1回の呼び出しの中で 複数span分の溢れや繰り上げ先自身のさらなる溢れ(分→時→日の連鎖)が解決される。
stagesが宣言しているart接尾辞の一覧(重複なし、宣言順)。絵のファイル名検査(objectArt.test.ts)に使う。
非公開 静的derive値の並びの上に位置を持つ段を下から上へ並べ、alertの深刻さがどちらへ動くかを見る。単調に上がるなら up、単調に下がるならdown、どちらでもなければmixed。深刻さが動かない(段が無い・全段が同じ域・ 値の並びの上に位置を持たないシンボル型(6.6節))なら、alertは向きを何も述べていない(undefined)。
range系イベント(6.3節)に、matchesが真になる効果があるか(逆引きの絞り込み用)。 効果そのものを渡すので、何を尋ねるか(どのプロパティを書き換えるか・どの型を生むか)は 呼び出し側が決める。
非公開hasその値が、そのイベントの見ている端へ達しているか(rangeEventLabelsAtとapplyRangeEventsAtが同じ 判定をここから引く)。どちらの端を見るかに答えるのはrange自身(PropertyRange.hasReached)で、 ここが持つのはrangeを持たないプロパティは端を持たないので、どのイベントも起きないことだけ。
生成時のロール(6.2節)がその端に出た場合の初期値。両端を答えるのはここだけで、片方の端 だけを返して残りを振れ幅から足し戻させると、「返ってくるのはどちらの端か」を呼び出し側が 覚えていないと成立しなくなる。
下端の値はinitialValueWithoutRollと同じ数だが、問いが違う——あちらは「RNGを使わずに生成したら いくつになるか」で、こちらは「どちらの端に出た場合を読んでいるか」。定義だけから値を読む側 (src/analysis)は必ずこちらで端を名指しする。
実効値effectiveValueのとき、このプロパティが名前stageNameの段(6.4節)に該当しているか。
boundがor_aboveなら、その段より上の段に居ても真(14.1節)。
上下は段の下端の大小で決まる(stageAtと同じ見方で、宣言順ではない)。段は下端だけを書く 半開区間なので、名指した段の下端を跨いでいることが、そのままその段以上に居ることになる。 下端を持たない受け皿(6.4節)はいちばん下なので、名指せば常に真。
完全一致で決まる段(シンボル型、6.6節)は、値の並びの上に位置を持たないので偽。持ち主の型では なく段の形で見るので、位置を持たない段が他の型に増えてもここは変わらない。名指した段をこの型が 持たないときも偽——綴り違いはここまで来ない(どの型も宣言していない段名はロードで落ちる。 WorldCodexの名指し検査)が、同じプロパティでも段は型ごとなので、他の型の段を名指すことは在りうる。
名指した段が値の並びの上で始まる位置(PropertyStage.lowerBoundOnValueLine)。undefinedになるのは、 値の並びの上に位置を持たない段(完全一致、6.6節)と、宣言に無い名前。
名指した段の下端のうち、そこより下へ値が行けるもの=押し割って抜け出る先。抜け出る先が 無ければundefinedで、位置を持たない段・宣言に無い名前も同じ。
抜け出る先を持たないのは、下端が range の下限以下の段——下がどこまでも続く受け皿(6.4節)と、
下限そのものから始まる段。値が取れない位置は抜け出る先にならないという、
upperBoundOfStage が range の上限より上の段を落とすのと同じ見方を、下の端でしたもの。
非公開progress今いる段の中での進み(docs/engine/SkillSystem.md 5節)。区間が定まらない段ではundefined ——次の段が無い最上段と、下端を持たない受け皿(rangeも持たない場合、6.4節)、そして値の並びの 上に位置を持たないシンボル型(6.6節)。
その値が端へ達したことで起こるrange系イベント(6.3節)の名前。達していなければ空。
「どちらの端に達したか」を答えるのはここだけ。 実行時に適用する側(applyRangeEventsAt)と、 実行時のオブジェクトを持たずに読む側(analysis/rangeEvents)が、同じ判定をここから引く。
宣言されているrange系イベントとその名前(6.3節)。
rangeの中での値の位置(0〜1)。バー表示のための導出値で、rangeを持たないプロパティ(=上下限が 無く「満たされ具合」を定義できない)と幅0のrangeではundefinedを返す。
非公開 静的resolve「増えるほど悪いか」を述べている宣言を突き合わせて1つの答えにする(6.8節)。述べている宣言が 2つ以上あって食い違えばロード時に弾く——片方だけが正しく見えて、どちらを直すべきかが分からなく なる。どれも述べていなければ、満タンが良いという既定に合わせて「減ると悪い」。
mixed(両端が悪い並び)は向きを決められないので、何も述べていないものとして扱う。
生成時の初期値(6.2節)。initialValueRangeを持つプロパティは[min,max]の一様乱数を1回引き、 持たない場合は決定的なinitialValueWithoutRollになる。
非公開span段がrangeの中で占める区間(0〜1)。下端はその段の下端(下がどこまでも続く受け皿はrangeの 下限へ丸まる)、上端はそれより上で最も近い段の下端(無ければrangeの上限)で、段の宣言順では なく下端の大小だけで決まる(stageAtと同じ見方)。
完全一致(eq)で決まる段はシンボル型(6.6節)のもので、値の並びの上に幅を持たないためundefined。
非公開stage値の並びの上で、startのすぐ上に来る段とその下端。段の宣言順ではなく下端の大小だけで決まる (stageAtと同じ見方)。上に段が無ければundefined。
下端を段と一緒に返すのは、「今いる段の上端」と「次の段の下端」が同じ1つの値だから—— 区間(spanOf)と進み(progressAt)で別々に探すと、片方だけが段の選び方を変えたときに食い違う。
rangeの上限より上に下端を置いた段は、上に無いものとして数える。 そこは値が取れない位置なので 到達できず、区間の上端にも進みの分母にもなれない。頭打ちを呼ぶ側でやると、その2つが別の値になる。
その値が該当する段(6.4節)。「今どの段に居るか」を答えるのはここだけで、段の宣言から 引ける事柄(alert・art・名前)は、この段を読んで得る。
該当する段が複数あれば下端が最も高いものを採る(下限だけを書く半開区間なので、上の段ほど 狭い)。下端を持たない段(完全一致、6.6節)は重ならないので、この比較に加わらない。 どれにも該当しなければfallbackStage。段の判定はリスト中の位置に依存しない。
非公開stage段の境目(rangeの中での位置、昇順)。両端は含まない——rangeの上下限はバーの端そのもので、 刻む線を引く場所ではない。下がどこまでも続く受け皿(6.4節)の下端も、完全一致(eq)で決まる段も、 rangeの中に境目を持たない。
非公開stage実効値effectiveValueのときに該当する段を、バーへ刻んで見せるための読みにしたもの。 該当する段が無ければundefined。名前やalertだけが要るなら段そのものを読む(stageAt)—— こちらは段の区間と境目を毎回組み立てる。
名指した段の上端=値の並びの上でその段のすぐ上に来る段の下端(stageAbove)。上に段が無ければ undefinedで、位置を持たない段・宣言に無い名前も同じ。
段の並びを知っているのはここだけなので、段の上端が要る側はどれもここから引く。
1つの ObjectDef が持つ、1つのプロパティの定義(6節)。ObjectDef.propertyDefs の1要素として、 ローカルIDをそのままindexとする密配列に格納される。同名プロパティでも ObjectDef ごとに range/stages/デフォルト値が異なりうるため、定義はObjectDefごとに個別に持つ。 range系イベント(on_*)の発火判定・stages判定・初期値決定はこのPropertyDef自身の責務で、 PropertyValueは値の変更を通知するだけ。
宣言そのものは読み込み後に動かないが、直前に出した答えは持つ(stageAt)。同じ値には必ず同じ 答えになるので、持ち主が何体居ても答えは変わらない——1つの定義を全個体で共有したままでよい。