Bicameral Engine
GPU-resident engine for a magic-research open-world game
Loading...
Searching...
No Matches
reaction_package.h
Go to the documentation of this file.
1// reaction_package.h — Luau のパッケージで書いた反応表を、ベイクに渡す定義(sim::ReactionTableDefinition)に読む
2// (T-0021、02 §1〜2・13 §2・ADR-0031・ADR-0032)。
3//
4// データの流れ: パッケージのフォルダ → LoadPackages(合わせた「分類 → 鍵 → 値」)→ ReadReactionTableDefinition
5// → sim::BakeReactionTable(整数の表・元素とエネルギーの検査)→ GPU と CPU リファレンス。
6// 分類と書き方(1 つの鍵 = 1 つの元素・物質・規則。Mod は鍵を足して増やす。値は整数で、単位は欄の名前に書く):
7// elements = { C = { atomic_mass_mg_per_mol = 12011 } }
8// species = { oxygen = { composition = { O = 2 }, formation_enthalpy_j_per_mol = 0,
9// heat_capacity_mj_per_mol_k = 29378, thermal_conductivity_mw_per_m_k = 135000 } }
10// reactions = { carbon_combustion = {
11// reactants = { carbon = 1, oxygen = 1 }, products = { carbon_dioxide = 1 },
12// rate = { a = "3e8", activation_energy_j_per_mol = 160000 },
13// orders = { carbon = 1, oxygen = 1 }, -- 省けば反応物は全部次数 1。書いたら、書かない反応物は次数 0
14// reaction_enthalpy_j_per_mol = -393500 } } -- 省ける。文献の反応熱(食い違えばベイクが警告)
15// 数は整数だけ。Luau の数は倍精度なので、小数・±2^53 を超える値は誤り(丸めで機械ごとに値が変わる余地を作らない)。
16// A(頻度因子)は桁が大きいので 10 進の文字列("2.8e19")でも書ける(誤差なしで 仮数 × 10^指数 に読む)。
17// 知らない欄は誤り(綴りの誤りを黙って通さない)。この 3 つ以外の分類(UI の文字列など)は読まない。
18// 欄を変えたら、型の定義 data/types/bicameral.d.luau も変える(読む前の型検査が同じ形を見る。T-0140・ADR-0046)。
19// ここは CPU だけ(原則 2: オーサリングは CPU、ランタイムへはベイクした表で渡す)。
20#pragma once
21
22#include <cstdint>
23#include <expected>
24#include <string>
25#include <string_view>
26
27#include "script/luau_package.h"
28#include "sim/reaction_table.h"
29
30namespace bicameral::script {
31
32 // 反応表の分類の名前(パッケージの entry が返す表の鍵)
33 constexpr std::string_view REACTION_ELEMENTS_CATEGORY = "elements";
34 constexpr std::string_view REACTION_SPECIES_CATEGORY = "species";
35 constexpr std::string_view REACTION_RULES_CATEGORY = "reactions";
36
37 // 10 進の数(仮数 × 10^指数)。仮数の末尾の 0 は指数へ移してある("280e17" → 28, 18)
39 uint64_t mantissa = 0;
40 int32_t exponent10 = 0;
41 };
42
43 // "2.8e19"・"15e8"・"0.5"・"3" を誤差なしで読む(符号なし。有効数字 19 桁まで・指数 ±999 まで)
44 [[nodiscard]] std::expected<DecimalNumber, std::string> ParseDecimal(std::string_view text);
45
46 // 合わせた表から反応表の定義を作る。誤りには「どのパッケージの・どの欄か」を付ける。
47 // 元素の釣り合いなどの中身の検査はベイク(sim::BakeReactionTable)が行う
48 [[nodiscard]] std::expected<sim::ReactionTableDefinition, std::string> ReadReactionTableDefinition(
49 const PackageSetResult& packages);
50
51} // namespace bicameral::script
std::expected< ReactionTableDefinition, std::string > ReadReactionTableDefinition(const PackageSetResult &packages)
std::expected< DecimalNumber, std::string > ParseDecimal(std::string_view text)
constexpr std::string_view REACTION_ELEMENTS_CATEGORY
constexpr std::string_view REACTION_SPECIES_CATEGORY
constexpr std::string_view REACTION_RULES_CATEGORY