非公開_エンジンが規約として直接読み書きする単語(EngineVocabulary)。世界を組み立てる前から要る ——中身の重さの伝播(containerPropagation)を型へ生やすのに、resolveの時点でIDが要るため。 どんなYAMLを載せても変わらないので、著者の宣言を1つも見ずに作れる。
非公開_非公開_非公開_非公開_非公開_非公開_非公開crafting製作の工程を進めるのに要る条件(crafting_conditions、13.3節)。全レシピ共通の1本。
非公開declaration別の宣言を名前で名指しした箇所(DeclarationReference)。指した先が在るかも、在っても指せる形かも、 相手の宣言を読み終えるまで分からないので、判定はWorldCodexへ渡してそちらで行う。
読み取り専用generationload系メソッドで蓄積した地形生成定義。parseGeneration.tsの関数群だけが読み書きする。
読み取り専用generation読み取り専用generation非公開 読み取り専用globalload系メソッドで蓄積した、パース済みだがtrait未解決のobject_defs/traits。
非公開 読み取り専用global非公開in製作中オブジェクトが完成品から引き継ぐタグ(in_progress_tags、RecipeSystem.md 5節)。 引き継ぐかどうかを問うだけなので、並び順は持たない。
非公開patches読み込んだpatch(3.4節)。当たる先が全部揃ってからでないと当てられないので、buildAndResetまで貯める。
非公開rawフィルターバーのボタン(card_filters、ScreenLayout.md 8.1.3節)。タグは名前のまま貯める ——型のtagsが解決されるのはbuildAndResetなので、綴りが実在するかはこの時点では見られない。
非公開recipeレシピ一覧の棚に使うタグ(recipe_categories、Windows.md 9節)。宣言順がそのまま優先順位。
非公開requiredタグが宣言を義務づけるプロパティ(required_props、4.2節)。タグID → プロパティIDの並び。
名前空間(object/property/slot/tag/property_tag/symbol)。型・プロパティ・スロットは引くだけの窓
(NameLookup)を配るので、ここから名前は作れない——この3つは「定義の場」(object_defs・props・
slotsのキー)を持つので、名前を作る口と名指しする口を分けてある(GameElementDefinition.md 3.6節)。
作るのはdefine…Name、名指しはreferTo…が受ける。
蓄積したobject_defs/traitsから不変のWorldCodexを組み立てて返す。呼び終わると このインスタンスの蓄積状態は初期化される。
非公開buildフィルターバーのボタン(ScreenLayout.md 8.1.3節)。綴りの誤りはここでは見ない——指すタグは ファイルをまたいで付く(食のタグはfoods.yaml、火のタグはfire.yaml)ので、どのファイルまで 読んだ時点で「実在しない」と言えるかが決まらない。recipe_categoriesと同じくinternし、綴りは 同梱の世界を丸ごと読む試験が見張る(tests/world-codex/cardFiltersYaml.test.ts)。
非公開defineプロパティの名前を作る(propsのキー、6節)。その宣言こそが名前の出どころなので、
綴りを照らし合わせる相手は無い。他所の宣言を名指しする側はreferToPropertyを通る。
テキストとして渡された1つのYAMLを読み込む(labelはエラーメッセージ用の出所表示)。
アセットパックのぶんは、どのパックのものかをfromで渡す(PackSource)。
オプションfrom: PackSourceパース済みの1つのYAMLを読み込む。渡したDocumentは書き換えないので、同じものを何度でも 渡してよい(loadWorldCodex)。patch(3.4節)が書き換える宣言のノードも、そこへ接ぎ木する値も、 読み込み元から切り離した複製の側にある(RawObjectDef.modifyDeclaration・RawPatch.value)。
書き換えれば tests/loader/bundledParseCache.test.ts が落ちる——同梱ぶんを丸ごと通して、渡した Documentの字面が動いていないかを見ている。型では塞げない(同テストの該当itを参照)。
オプションfrom: PackSource非公開load生成したobject_defsを読み込み、新しく現れた型だけを解決して生成型として登録する。
どの生成器も手順は同じ——違うのは何を生成するかと、型ごとの座標の出所だけなので、 生成器はYAMLと座標の組(GeneratedObjectDefs)で答え、ここは1本で足りる。生成が空ならしない。
型を値に持つプロパティ(6.9節)から行き先を引いた宣言を1件覚える(parseDestinationRefから)。
型を名前で名指しする(spawnのobject・matchesのobjectなど)。IDを配ると同時に、その型が
定義されているかの判定をWorldCodexへ持ち越す(referToPropertyと同じ理由)。
他所で宣言されたプロパティを名前で名指しする(条件のprop・deftnessのskillなど)。
IDを配ると同時に、綴りが実在するかの判定をWorldCodexへ持ち越す。
作る口と分けてあるのは、internが綴り違いをその場で新しい名前にしてしまうから——引く先の
無いプロパティは実行時にただ「持っていない」と読まれるので、宣言は落ちずに一度も効かない。
プロパティの段(6.4節)を名前で名指しした宣言を1件覚える(in_stage・from_stageなど)。
段はinternしない——段の名前空間は型ごとのPropertyDefの中にあり、世界で1つではないため
(ConditionNode)。プロパティ自身の名指しは呼び出し側がreferToPropertyで済ませている。
型の名前で行き先を指した宣言(to_object・into_object、型を値に持つプロパティのobject)を
名指しする。在るかに加えて、世界にただ1つ在る型かを判定へ持ち越す。
他所で宣言されたスロットを名前で名指しする(条件のslot・in_slot、amongのslot、
moveのto_slot)。判定の持ち越しはreferToPropertyと同じ。
非公開reset
YAMLファイル群からWorldCodexを組み立てるロード処理の入口(GameElementDefinition.md 3節)。
パース全般をこのクラスが担い、名前空間ごとのNameRegistryを保持する(objectNames以下のゲッター参照)。「trait解決込みでobject_defを 組み立てる」責務はRawObjectDef.resolveが担う。props/slots/interactionsはフィールド 単位のtrait上書きマージ対象のため、深い意味解釈とprop/slot名等のInternはload時点ではなく resolveまで遅延する。object_def自身のglobalIdのみtrait解決に依存しないため、RawObjectDefを 作る時点で確定する。
load系メソッドは何度でも呼べ、呼ぶたびにこのインスタンスへ追記する(thisを返すため
new WorldCodexYamlLoader().load(label, text).buildAndReset()と書ける)。object_defs/trait名の重複は、呼び出し元・ファイル・ディレクトリを問わず常にエラー(3.3節の 厳格モード)。「後勝ちで上書き」の規則は一切持たない(MODによる差し替えは専用のpatch文法で 表現する想定)。
buildAndResetは蓄積内容から不変のWorldCodexを組み立てて返し、このインスタンスの蓄積状態を初期化する。