sessionは必須(value:{min,max}を持つプロパティの初期値ランダム化にsession.rngを使う)。
非公開_この物をagentとして張られている関係。同じ物が2つの操作のagentになることはない(11.5節の 不変条件)ので、これが埋まっている間に2つ目を張ろうとすれば止まる。参加しているだけの関係 (instrument・patient)は複数あってよいので、加わっている関係の積みとは別に持つ。
非公開_今の型。becomeType(9.9節)だけが差し替える——同じ個体のまま型だけが変わる。
非公開_自分を消した宣言が名乗った名前(destroyのreason、9.3節)。名前を書かないdestroyで消えた物と、
まだ消えていない物はundefined。
何が起きたのかは、起こした側がその場で名乗る。 残った値から推測すると、上限で消えた場合・ 段を通らない即死・致死でない消滅(動物の立ち去り)を同時に取りこぼす(VitalsSystem.md 6節)。
非公開_所属先の逆引きキャッシュ(SlotSystem.md 1節)。ルート(未格納)ならundefined。
非公開_今自分が入っている枠の逆引きキャッシュ(SlotSystem.md 1節)。どこにも入っていなければundefined。
親の中での位置を、親のローカルIDでは持たない。 ローカルIDはそのオブジェクトの中でしか意味を 持たない値で、他人の番号を控えると、控えた側が「誰の番号か」を覚えている必要がある。
読み取り専用instance非公開 読み取り専用participations今この物が加わっている操作の関係(11.5節)を、内側を末尾にして積んだもの。入れ子になる ——時間を要する操作が関係を張り続けている間に配られた手番は、時間を要さなければその場で起きる ので、同じ物が外側と内側の両方に加わりうる(同節)。
非公開properties読み取り専用sessionこのオブジェクトが生きるセッション。生成したセッションと、その後この物が居るセッションは同じ ——だからこの物へ何かを頼む側は、セッションを渡さない。配置の関門(attachToSlotOrRejection・destroy)も、 プロパティの値の変更(PropertyValue.add)も、ここから辿って自分で記録・判定する。
非公開slotsart_by_stage(6.4節)が指すプロパティの、今の段が宣言しているart接尾辞。art_by_stageを
持たない型、対象プロパティを持たないインスタンス、宣言の無い段では、いずれもundefined
(呼び出し側はその型自身の絵をそのまま使う)。
非公開engine自分の詰まり具合(fullestSlotFillRatio)が使う、規約で決まったプロパティのID。
非公開isこの物が土地か(location タグ)。土地だけが持ち主にならない親で、抵抗している物が居られる
のはそこだけ(HuntingSystem.md 4節)。
エンジンの他の規則と違い、ここは世界の側の語をそのまま読む——「持ち主ではない置き場」を型の宣言
から導く手掛かりが他に無いため(WorldRuleVocabulary)。
非公開is今この物が抵抗しているか(resists、7.13節)。宣言が無ければ常に偽。
読むのは実効値(ConditionNode)なので、外から与えられた寄与——罠のmodifyが警戒を打ち消すような
——もそのまま効く(docs/engine/TrapSystem.md 5節)。
非公開is気を失っているか(意識が unconscious の段に居る、VitalsSystem.md 6節)。意識を持たない物は
倒れようがないので常に偽——語彙のIDは誰も宣言していなくても引ける(WorldVocabulary)ので、
「持っているか」を分岐に使わずに済む。
「意識が無いと何もできない」は手番が回るかどうかの1つの判断で、操作ごとの条件ではない
(同節)。だから判定はここ1箇所に在り、trigger: tick を足すたびに書き足すものは無い。
今この物が役を解く操作の関係(11.5節)。加わっていなければundefined。役を指せるのは参加者から
だけなので、この物のprops(base・passives)が役を解くのもここから
(ReferenceContext.forParticipant)。入れ子なら最も内側が答える(同節)。
自分に続けてfollowers(同じ束の仲間)を同じスロットへ入れるとき、続けて受け取ってもらえる個数 (自分を含む。自分が入らなければ0)。
1つずつrejectionForMoveToを訊いても答えは出ない——2つ目が入るかは1つ目が入った後の空きで 決まるため(Slot.acceptedCount)。束をまとめて落とす操作が、落とす前に「何枚ついてくるか」を 決めるための問いで、ついてきた枚数はそのまま「これだけ入る」という約束になる。
自分が持つプロパティを、propsの宣言順で全部。絞る口(gaugeProperties・propertiesWithTag)で 足りない側は、定義(enumeratePropertyDefs)から引き直さずにこれを読む——1つずつ引き当てると、 持ち主なら知っている「型の宣言と1対1」を、引けなかった場合の分岐として書くことになる。
渡すのは並びの実体で、写しではない(居るPropertyValueもこの物のもので、値の変化はそのまま 見える)。ただし顔ぶれが変わるのは型の差し替え(becomeType、9.9節)だけで、そこでは並びごと 新しいものへ替わる——だから読んだ配列は、差し替えの前の顔ぶれと前の型のPropertyValueを持ち 続ける。 becomeを跨いで読む側は、自分で写し取るのではなくこの口を読み直す。
静的apply文脈のselfを起点に、渡された効果が持つ命令を実行する(9節。何が走るかはActiveEffectSequence)。 selfは文脈から引く——起点を別に受け取ると、文脈のselfと食い違う組を渡せてしまう。 rangeイベント(6節)とactions/combinations(11節・12節)の両方から呼ばれる。文脈は呼び出し側が 持っているものをそのまま渡す——操作からは張られている関係の文脈が、rangeイベントからは役の居ない 文脈(11.5節)が来る。対象が解決できない場合(例えばparentが無い、この実行文脈に居ない役を指している。 ReferenceContext参照)は、その対象への適用のみ無視する。
命令の順序はここでは入れ替えない——適用順はYAMLに書かれた順で、動詞ごとの優先順位は無い(9.7節)。 置き換えでdestroyがspawnより先に効くのは、著者がその順に書くから(9.3節)。
ここが「誰の仕業か」の境界でもある。この中で起きた物の出入りは、すべてselfを主体として記録される
(WorldChange.subject)。どのpickの候補が選ばれたかによらず1つに決まるので、観測する側は分岐を
知らずに「このオブジェクトが何をしたか」を読める。
非公開attachplaceは位置を指定する配置(moveToSlotOrRejectionのat・insertSameSlotOrRejection)専用。省略すると通常の追加 (Slot.addWithoutParentLink)になる。atはplaceが置く位置で、受け入れ判定はそこへ置けるかまで見る ——切り離した後で置けないと分かると、物はどこにも属さないまま戻るため。
配置を伴う変化の唯一の関門なので、ここが出入りを記録する(WorldChange)。移動前の居場所は 切り離す前に控える——切り離した後では、どこから来たのかを誰も知らない。
axisValuesで指した座標に居る型へ、同じ個体のまま変わる(9.9節)。行き先に型が居なければ何もしない。
非公開become同じ個体のまま型だけを差し替える(9.9節)。instanceIdも居場所も変わらず、変わるのは型と、そこから 決まるプロパティ・スロットの顔ぶれだけ。
登録済みの持続効果は、組み直す前にすべて解除して登録し直す——解除は宣言元の宣言を辿るので、先に 差し替えると外し先を見失う。宣言元は物のdefだけではない——今この物へ効いている操作が宣言した ぶん(11.7節)は、効いている間だけセッションが持っている (WorldSession.setInteractionPassivesRegistered)。
その座標に型が居るか。居なければ、becomeを宣言した操作そのものが成立しない(9.9節)。
非公開candidate相手として受け入れ、起きることが在る(become の行き先に型が居る、9.9節)ドラッグの宣言。
どちらの列挙もここから絞るので、成立するものと断るものは「その組み合わせに訊いた結果」だけで
分かれる。
問うのは組み合わせ自身。 候補ごとに関係を1つずつ張って外すので(11.5節)、呼び手が 「self・agent・instrumentがこの3つでないと壊れる」という一致の規約を覚える余地が無い。
非公開capturesame_slotの置き換えのために、selfが今占めている位置を捕捉する。「これから消えるか」の予測は織り込まず、置き換え位置の判断は配置時にSameSlotSpawnSite自身が行う。parentが無ければ位置が無いのでundefined。
今この物の中に入っている物すべて(スロットの区別なく、直下の1段だけ)。どのスロットに 入っているかを問わない見方なので、スロット名を知らない側——「中に何かこういう物があるか」 だけを見たい側——が使う。
非公開collectこの物のdefが宣言した持続効果の辺を書き出す(役の出どころはObjectPassiveEffects.collectInfluences)。
非公開collect非公開collectinstrumentを重ねたときに今成立する組み合わせ(12節、宣言順)。相手として受け入れるかだけでなく、
今そのまま実行してよいか(Combination.canExecute)まで見る——満杯の炉に薪をくべる組み合わせは、
候補にならない。
そこまで見るのは、実行できないものを黙って落とし先にしないため。 型だけで選ぶと、選んだ
先が実行できない場合に「落とせるのに何も起きない」になる。行き先の座標に型が居ない組み合わせ
(become、9.9節)も同じ理由で候補にならない。
掛かるのは「黙って」のほう。 断る理由を宣言していれば、実行できない落とし先として出してよい ——それを引くのが下のrefusedCombinationsWith(ActionSystem.md 1.1節)。
自分の中に入っている物すべて(自分自身は含まず、何段でも下まで)。
現在の親から切り離す(destroy、9.3節)。切り離された時点でworldツリーから到達不能になり、tickの対象からも 自然に外れる。既に親を持たない場合は何もしない(繰り返し実行しても安全、6.3節)。
消した側は名前を名乗れる(reason、9.3節)。名乗られた名前は消された側に残り、世界から出た あとでも「どう消されたか」を答える(destroyedReason)。名乗らない消滅——こぼれ落ちて行き場を 失う・立ち去る——は名前を持たないので、死因として読まれることもない。
中身は道連れにしない。 単独で在れる子(bound_to_ownerでない子、7.9節)は、消える自分ではなく 自分の親——子から見た祖父——へこぼれ出す。治った怪我に当てていた包帯が消えてしまわないように、 壊れた籠の中身が地面に散らばるように。
オプションreason: string非公開detach非公開evict新しい型が受け取れなかった中身を送り出す(becomeType参照)。行き先はdestroyのこぼし先と同じ 自分の親からで、単独で在れない子(7.9節)は移せる先が無いのでそこで失われる。
spawn(9.4節)を実行する。intoへの配置に失敗した場合は起点自身の親へこぼれ、そこも受け取らなければ さらに上へ遡る(place・spillTo参照)。どこにも入らなければ、生成したオブジェクトはそのまま消える。
自分の直接の親から遡り、指定したプロパティを定義している最初の祖先を探す(無ければundefined)。
ancestor起点の参照は、どこに書かれたものもReferenceContext.ownerOfPropertyを通ってここへ来る
(どの文法から来たかは、この時点で区別されていない)。
名指しのタグを持つ最も近い祖先。自分自身は見ない(findAncestorWithPropertyと同じ扱い)。
自分から親を遡った、所属ツリーの根(通常はworld。未配置なら自分自身)。
自分自身を含む子孫から、指定したinstanceIdを持つWorldObjectを探す(深さ優先、無ければundefined)。 「世界に存在する=worldツリーに繋がっている」という前提(7.1節)のもと、別途のインスタンス一覧を持たず ツリー走査だけで解決する。
NO_INSTANCEを渡すと必ずundefined——その値を持つ個体は存在しない。
自分自身を含む子孫から、その型のインスタンスを探す(深さ優先、無ければundefined)。
世界にただ1つ在る型(singleton、15節)を名前で指すmoveのto_object(9.6節)が使う。
同じ型が複数在れば最初に見つかったものを返す。
入れ物としての詰まり具合(0〜1)。入れ物として名乗っていない型(storage、7.12節)と、
上限(capacity)を持つスロットが1つも無い型ではundefined。
最も詰まっているスロットを返す。 バーが答えるのは「あとどれだけ入るか」なので、先に一杯に なる側を映す——合計で割ると、片方が満杯でも半分に見える。
Slot.fillRatioと表裏で、こちらは入れ物の側から自分の詰まり具合を見る。
ゲージとして見せると宣言している(6.8節)プロパティを、propsの宣言順で。1つも宣言していない オブジェクトでは空配列。
上下限(range)を持たないプロパティは宣言できない(ロード時に弾く)ので、返る値の
ratioは常に定義されている。並ぶ順と本数がそのままカードのバーになる(docs/ui/CardView.md 8節)。
tryGetPropertyと同じ引き方で、持っていないことを許さない版。その型が必ず持っているはずの プロパティ——生成が書き込む行き先ID、シナリオが名指しする値——を引くときに使う。名前の綴り違いが 黙って無視されず、書いた場所で分かる。
tryGetSlotと同じ引き方で、持っていないことを許さない版(getPropertyと同じ対)。名指しした枠が 必ずあるはずの場所——生成・シナリオ・ビューが自分の型の枠を引くとき——に使う。
same_slot専用。置き換えオブジェクトを、originが居たセルを基準に配置する(Slot.placeSameSlot参照)。 枠数の決まったスロットで空きが作れず配置できない場合はエラーを返す (=呼び出し側でfallbackへ委ねる)。
関係へ参加者として加わり、外し方を返す(11.5節)。張る/外すの段取りを持つのは
InteractionRelationだけで、ここは頼まれた側が自分の不変条件を見る。
claimingAgentは「この関係でこの物が実際に動く」(問い合わせではなく実行)。既に別の操作で
動いていれば例外で止める——動作主は一度に1つの動作しかできない。進行中の操作を中断して別の操作を
始めさせる仕組みはまだ無い(17節)。
返した外し方は、張った順の逆で呼ぶ(InteractionRelation.bound)。加わっている関係は積みなので、 順序が崩れると外側の関係が内側として残る。
targetの自動配置スロット(ObjectDef.placementSlotDefs)を宣言順に走査し、最初に受け入れられた スロットへ自分自身を移動する(著者がスロット名を知らなくてよい規約。spawnのintoとmoveが共用、 9.4節)。
札を重ねたドロップ(slotForPutIn)と同じ規約の、別の入口。 走査する枠の並びは1箇所が 答える(placementSlotDefs)。
スロット移動を行う唯一の汎用操作(SlotSystem.md 1節のmove_to_slot)。枠の要件・capacityの検証は対象Slot
自身(Slot.rejectionFor)に委ねる。
atを渡すと枠の中の位置まで指定する(SlotPosition参照)。指した位置に置けなければ失敗で、 位置を無視して入れることはしない——プレイヤーが示した場所と違う所へ入るくらいなら、入らないほうが 分かる。gapとcellの読み替えはSlot自身が行うので、呼び出し側はどちらのスロットかを知らなくてよい。
戻り値: 成功時はundefined、失敗時はその理由。
オプションat: SlotPosition非公開notgetProperty・getSlotが引けなかったときの文面。捕まえたいのはYAMLの書き間違いなので、 IDではなくその名前で言う('path' はプロパティ 'travel_minute' を持ちません)。
ここへ来るIDは必ず名前を持つ。 名前空間が配っていない番号はLocalIndexByGlobalIdが 手前で投げるので、「持っていない」と「そもそも配られていない」がこの文面で混ざることはない。
名前を引くのは呼ぶ側。 どの名前空間かはIDの型そのものが持っているので、ここでkindから
名前空間を選び直すと、選んだ先が両方を受けられる形(NameRegistry<number>)へ広がり、
別の名前空間のIDも素の数も通るようになる。
非公開participantsこの物と同じ関係に加わっている相手(同じ物は1回だけ)。外側の関係の相手もここに居る ——入れ子の内側へ入っても外側の関係から抜けたわけではないので、外側で押された寄与はこの物の プロパティに載ったままになる(11.5節)。
非公開placespawnした側は配置先のスロット名を書かない。same_slotなら捕捉しておいた位置へ配置する (SameSlotSpawnSite.placeReplacementへ委ねる)。childなら子を、個体を指す参照ならその相手のスロットを 宣言順に走査し、最初に配置できたスロットへ入れる。配置に失敗した場合は起点自身の親へこぼれ、 そこも受け取らなければさらに上へ(spillTo)。どこにも入らなければ、生まれた物はそのまま失われる。
指定したタグ(6.7節)が付いたプロパティを、propsの宣言順で。タグの付いたプロパティを 1つも持たないオブジェクトでは空配列。
名指しした1つのプロパティが、他と交わしている影響(docs/ui/Windows.md 8節)。
集めるのは自分・自分の祖先・自分の子孫が宣言する持続効果に加えて、今この物と同じ関係に 加わっている相手(11.5節。入れ子なら、外側の関係の相手も居る)が宣言するもの。木を辿る対象 (self・parent・child・ancestor)なら 宣言元は必ず前者に居り、操作の役(agent・instrument・patient)を対象に書いた効果なら必ず後者に 居る——横に並んだ物どうしは、木でも操作でも結ばれていない限り互いに届かない。
物のdefを辿るだけでは届かないぶんが1つある——今効いている操作が宣言した持続効果(11.7節)で、 宣言しているのは物ではなく操作なので、セッションから引く (WorldSession.collectRunningInteractionInfluences)。
instrumentを重ねても要件(14節)で成立しないが、断る理由を宣言している組み合わせ (14.6節のreason、宣言順)。薪の無い炉へ火種を落とす、暗い中で石を打ち割る、餌が満杯の罠へ餌を 重ねる、が該当する。
reason を書いた要件は、落ちたときプレイヤーへ理由が届くという約束(14.6節)。メニューの
操作は押せないボタンとして理由を出せるが、重ねる操作には候補から消えた先に理由を出す口が無い。
理由を宣言しているものだけをここから引けるようにして、その口を画面へ渡す
(CardInteraction.md 2.1節)。
理由を宣言していない要件は返さない——黙って断ると決めた宣言なので、言うことが無い。
成立するものとの順位はここでは決まらない。 「成立するものが1つでもあるなら、そちらが先」の
「1つでも」は両向きに跨る——重ねた相手の側が宣言している組み合わせも数えるので、片側だけを
知るこの物には答えられない。そこを決めるのは両向きを引く画面側
(cardOperations.combinationBetween)。ただし、この宣言順そのものは順位——落とされた側として
引かれた列の先頭は、どちらの向きにも成立するものが無ければ、そのままプレイヤーへ届く理由になる
(CardInteraction.md 2節)。
非公開rejection枠が受け入れるかを見るまでもなく成立しない移動の理由(移れるならundefined)。枠の空きではなく 所属ツリーの形の話なので、移れる個数を数えるときも1つずつこちらだけを見る。
このスロットへ移れない理由(移れるならundefined)。移動を提示してよいかを、実際に動かさずに 訊くための入口——画面はこれを使って、掴んだカードを落とせる場所を決める。
何が移せないかを画面側が場所ごとに覚えていると、ワールド側の宣言と食い違う(設置物のかごを 持ち歩けるようにしたのに、画面がそのレーンを読み取り専用のままにしている、など)。
atはmoveToSlotOrRejectionと同じ位置の指定で、渡せばその位置へ置けるかまで見る。
オプションat: SlotPosition今いるスロットの中での並び替え(Slot.moveStackTo参照)。どこにも属していない場合はfalse。
「どのスロットに居るか」を呼び出し側に持たせないための入口。moveToSlotOrRejectionで同じ枠を指すのとは 別物——付け替えはいったん抜いてから入れるので、抜いた時点でセルが詰まって指した位置の意味が ずれる。動かすのも1個ではなくスタック丸ごとで、理由はSlot側にある。
持続効果の対象(8.1節)を、影響の一覧のために解決する。childは今入っている子を全部返す ——相手が1つに定まらない唯一の対象で、寄与も子ごとに1件ずつ登録される(setChildRegistered)。 操作の役(11.5節)は、rolesがその役の相手を持っていなければ空になる。
rolesが答えるのは役だけで、起点は自分——役の出どころは宣言によって違う (PassiveEffect.collectInfluences)が、self・parent・ancestorを辿る先は常にこの物。
この物から下(すべてのスロットの中身)へ、時間が起こす操作(trigger: tick、11.1節)を
1手ずつ与える。値の積分(tick)を終えてから呼ぶ——動物が動くのは時間が経ったからで、
そのtickの値が出そろった後になる(WorldSession.runTick)。
配る前に集める。 手番は物を増減させ、逃げれば別の枝へ移るので、走査しながら配ると同じ個体へ 二度回りうる。集めてから配れば、1 tickに1手だけになる。
配られた手番をその場で起こすか、操作の切れ目まで待たせるかは手番自身が決める(Action.takeTurn)。
非公開set自分自身と、すべての子孫について、target=ancestorのpassivesを現在の祖先へ登録/解除する。親が変わると子孫 全員の祖先チェーンも変わるため、再帰で全員分を扱う。トポロジ変化前に解除・変化後に登録する順序を守ることで、 いずれの時点でも祖先はownerから辿れ、前回の登録先を憶える必要がない。
非公開set親子のエッジが形成/解消された契機を、双方の効果(modify/add、8節)へ伝える(register=trueで登録、 falseで解除)。親側だけ子thisを明示的に渡すのは、親からどの子かを一意に辿れないため。target=selfは コンストラクタで登録済みのため、ここでは扱わない。
非公開set今効いている、操作が宣言した持続効果(11.7節)のうち、この物へ登録が載りうるものをすべて 解除/登録する(becomeType用)。宣言を持っているのは物ではなく操作なので、辿れるのは セッションだけ(WorldSession.setInteractionPassivesRegistered)。
向きは役を対象にしたpassivesと同じ2つ(setRoleTargetsOfParticipantsRegistered)——自分が
宣言元のぶんはselfが自分を指し、相手が宣言元のぶんは役が自分を指す。相手の宣言も同じ関係の
中に居るので、参加者を辿れば全部が挙がる。
非公開set非公開setこの物のdefが宣言した、役を対象にしたpassivesのうちobjectへ載るぶんを解除/登録する。 役を解くのは最も内側の関係からだけ(participation)なので、そこでobjectが就いていない役は 登録先が別の物で、objectの型が変わっても動かない。
非公開set役を対象にした寄与のうちこの物を一方の端に持つ組を、すべて解除/登録する(becomeType用)。 この物が関わる向きは2つある——自分が相手へ張ったものと、相手が自分へ張ったもの。型が変われば どちらの相手も変わる(宣言は新しいdefのもの、登録先は新しいプロパティ)ので、片方だけでは旧型の 宣言が相手に残るか、相手の寄与が新しいプロパティに載らないかになる。
相手どうしの組(agent↔instrumentなど)は、この物の型が変わっても宣言も登録先も変わらないので 触らない。
非公開setこの物のdefが宣言した、役を対象にしたpassives(11.5節)の登録を、役を解く関係の相手へ登録/解除 する。関係へ加わっていなければ相手が居ないので何もしない——呼ぶ側が参加の有無を見なくてよい。
itemを自分の中へ入れるなら、どの枠か(GameElementDefinition.md 7.8節)。プレイヤーが手で入れられる
枠(placement: manual、7.7節)のうち、宣言順で最初に今itemを受け取れるもの。どこにも入らな
ければundefined。
型が合うかではなく今入るかで選ぶので、先の枠が埋まっていれば次の枠が答えになる。今itemが居る枠は 答えない——同じ枠へ入れ直すのは入れる操作ではない。
非公開spill消えるときに中身を送り出す(destroy参照)。単独で在れない子(怪我・液体・道)は送り出さず、 自分にぶら下がったまま道連れにする——ただしその子の中身については同じことを行う(怪我が治れば、 当てていた包帯は身体の親である土地へこぼれる)。
送り出した先が受け取れなければ、さらにその親へと落ちていく(spillTo)。どこにも入らなければ、 その子もそこで失われる。
抵抗しているのに持ち主の下に居るなら、その場で離れる(7.13節)。台車に積んだ動物の警戒が上がれば、 暴れて荷車から飛び出す。
こぼれ先を名指ししないのは、土地以外の親が受け取らなくなる(rejectionForLoopOrDetach)ため ——上へ遡るうちに、最も近い土地が最初の受け取り手になる。
値を変えた側は、この後何を確かめるべきかを覚えなくてよい(PropertyValue.add・tick・ 配置の関門が、それぞれ自分で呼ぶ)。
行き場を失った物を落ち着かせる(9.4節)。hostから始めて、受け入れてもらえなければその親、さらに その親…と遡り、どこにも入らなければ世界から消える。
枠が受け入れないものを押し込むことはしない。器に入らない物は器の外——手に持てなければ足元へ、 足元にも置けなければ失われる、という順で落ちていくだけで、どの段でも枠の宣言はそのまま効く。
消えるときも中身は道連れにしない(destroy参照)ので、中身はそこからまた同じように落ちていく。
全プロパティのtick処理(passivesのaddの反映とrangeイベント判定、PropertyValue.tick参照)を行った後、子 (すべてのスロットの中身)へ再帰する。すべてのオブジェクトはworldの下にぶら下がるため、worldへ1回呼ぶだけで ツリー全体が処理される。
rangeイベントが走らせる命令は、処理中に自分自身や兄弟をツリーから切り離しうる。辿っている最中の 出入りを気にしなくてよい根拠はSlot.contents。
プロパティは、今この物が持っているものを毎回引き直す。 rangeイベントからbecome(9.9節)が走ると プロパティは丸ごと作り直されるので、始めに掴んだ配列を回り続けると、作り直された後ろのぶんがその tickの積分を受け取れない。済んだかどうかを覚えるのがグローバルIDなのは、作り直された同じ名前の プロパティが値を引き継いでいるから——個体で覚えると、引き継いだ値へもう一度積むことになる。
印字のときに自分を名乗る形。世界の丸ごとを刷らせないために持つ。
物は親・枠・セッションを辿って世界の全部へ繋がっているので、素のまま深い比較へ渡されると、 差分を出す側がそのグラフを辿り続けて落ちたことが誰にも届かない(赤を出す前に戻ってこない)。 名乗るのは、どの個体かを見分けられるだけ——型の名前と個体の番号で、辿り先はここで尽きる。
非公開try自分の子を順に走査し、最初に受け取れた子のスロットへ入れる(into: child、9.4節)。子のどのスロットが 受け取るかは通常の走査に委ねるため、著者は「どの子か」も「どのスロットか」も書かない。
名指しした操作(宣言が無ければundefined)。土地のexplore・道のtravelが使う。
探すのは相手を伴わないきっかけだけ——重ねる操作は相手が決まらないと引けない。
非公開while加わっている関係の積みが動く間、この物のdefが宣言した役を対象にした登録を外しておく。役を解くのは 最も内側の関係だけ(participation)なので、積みが動けばこの物が張っている先も動く。
操作が宣言したぶん(11.7節)はここでは動かない——そちらの役は、宣言した操作の関係が答える (WorldSession.whileInteractionPassives)。
実行時のオブジェクト実体(ObjectDefのインスタンス)。
プロパティの現在値・スロットの中身は、Def側のローカルIDをそのままindexとする密配列として保持する。 プロパティへ登録された効果の一覧・tick毎の反映・実効値の算出・値を変えた後のrange判定はPropertyValueが 持ち、WorldObjectはローカルID解決とグローバルAPIの提供に専念する。move_to_slotによる所属先の差し替え (旧親からの離脱・新親への合流・weight伝播・passive effect edgeの登録)にも専念し、枠の要件・capacityの 検証は対象Slot自身へ委ねる。持続効果(modify/add)の登録・解除は、生成・エッジ形成/解消・トポロジ変化の 契機で、Defが宣言する効果一式(ObjectPassiveEffects)へ「登録/解除してほしい」と依頼するだけで、どのtargetが どこへ紐付くかは効果自身が知る。能動効果(9節の命令。actions/combinations・tickやrangeイベントから走る)は、 適用の入口(applyActiveEffect)と対象解決、same_slot spawnの位置捕捉(SameSlotSpawnSite)・配置(place)を持つが、 値の変更そのものは対象のPropertyValueへ、条件判定・抽選はDef側の効果へ委ねる。抵抗(
resists、7.13節)が 成立したときに持ち主から離れるのも自分で行う——値を変えた側は、その後に何を確かめるべきかを知らない。セッションは自分で持つ。 何かを頼む側がWorldSessionを渡すことはない(sessionフィールド参照)。