Bicameral Engine
GPU-resident engine for a magic-research open-world game
Loading...
Searching...
No Matches
reaction_table_loader.h
Go to the documentation of this file.
1// reaction_table_loader.h — ランタイム(ゲーム本体・エディタ)とテストが、データのフォルダのパッケージから反応表を作る(T-0157・ADR-0033)。
2//
3// データの流れ: <exe の横>/data/packages(ビルドがリポジトリの data/packages を写す)→ ReadPackageRoot
4// → LoadPackages(走らせる前に data/types の型の定義で型検査〔T-0140〕→ 殻)
5// → ReadReactionTableDefinition → sim::BakeReactionTable(元素とエネルギーの検査)→ LoadedReactionTable → GPU へ上げる(呼び手)。
6// 失敗(フォルダが無い・ゲーム本体のパッケージが読めない・形の誤り・検査で落ちる)は全部 error で返す。呼び手は起動を止める
7// (半端な表で世界を動かさない。D-428)。ゲーム本体以外のパッケージ(Mod)が読めなかったときは、それを除いた表で続け、
8// 理由を rejected に残す(ADR-0031 の 3)。呼び手がログに出す。
9// ここは CPU だけ(原則 2: 表は CPU でベイクして GPU へ渡す。起動時に 1 回)。
10#pragma once
11
12#include <cstdint>
13#include <expected>
14#include <string>
15#include <string_view>
16#include <vector>
17
18#include "core/aliases.h"
19#include "script/luau_package.h"
20#include "sim/reaction_table.h"
21
22namespace bicameral::script {
23
24 // 今の仮の世界のゲーム本体のパッケージ(公開用の試験の表。ゲームの中身の表は T-0002 でユーザーが決める)
25 constexpr std::string_view DEFAULT_BASE_PACKAGE = "combustion_test";
26
28 fs::path packageRoot; // 直下のフォルダが 1 つずつパッケージ(空なら DefaultPackageRoot)
29 std::string basePackage{DEFAULT_BASE_PACKAGE}; // ゲーム本体。読めなければ失敗
30 MergeMode mergeMode = MergeMode::AddOnly; // 表の合わせ方(仮で案 C の既定。QUESTIONS Q8)
31 fs::path typeDefinitions; // 型検査に使う型の定義(T-0140。空なら DefaultTypeDefinitionsPath。読めなければ失敗)
32 };
33
35 sim::BakedReactionTable table; // GPU に上げる表と CPU だけの名前など(warnings は文献の反応熱との食い違い)
36 fs::path packageRoot; // 実際に読んだフォルダ
37 std::vector<std::string> loadOrder; // 読めたパッケージ(読んだ順)
38 std::vector<PackageRejection> rejected; // 読まなかった Mod と理由(ゲーム本体はここに来ない。来たら失敗)
39 std::vector<TableOverride> overrides; // 上書き(OverrideMarked・Override のとき)
40 bool modifiedWorld = false; // 「改造された世界」の印
41 uint64_t tableVersion = 0; // 合わせた表の版(TableVersion。同じ中身なら同じ値)
42 };
43
44 // 既定のパッケージのフォルダ: <exe のフォルダ>/data/packages
45 [[nodiscard]] fs::path DefaultPackageRoot();
46
47 // パッケージのフォルダから反応表を読んでベイクする。誤りには「どのフォルダ・どのパッケージ・どの欄か」を付ける
48 [[nodiscard]] std::expected<LoadedReactionTable, std::string> LoadReactionTable(const ReactionTableSource& source);
49
50} // namespace bicameral::script
constexpr std::string_view DEFAULT_BASE_PACKAGE
std::expected< LoadedReactionTable, std::string > LoadReactionTable(const ReactionTableSource &source)
std::vector< PackageRejection > rejected