> ## Documentation Index
> Fetch the complete documentation index at: https://docs.makkii.jp/llms.txt
> Use this file to discover all available pages before exploring further.

# フィールドの定義

> 数値/真偽値フィールドの追加、範囲・精度・丸め方式・範囲外処理の設定

フィールドは、パケットに詰め込む値 1 つぶんの定義です。それぞれ「送信側 MC のどのチャンネルから読むか」と「どんな値を取り得るか」を持ちます。

## チャンネルスロットとフィールドの関係

中央カラムには Bool (1〜32) と Number (1〜32) それぞれ 32 個のチャンネルスロットグリッドがあります。

* 空きスロットをクリックすると、そのスロットにフィールドを新規作成します。
* 設定済みのスロットをクリックすると、右側のフィールド設定パネルで編集できます。
* スロット同士はドラッグ&ドロップで入れ替えたり、別のチャンネルに移動したりできます。

ここでのスロット番号は、そのフィールドの `sourceChannel` (送信側 MC 上でのソースチャンネル) です。`input.getNumber(sourceChannel)` / `input.getBool(sourceChannel)` で読み出す元のチャンネルであり、パッキング後に実際にデータが流れる送信/受信チャンネル (パケット設定の `送信CH` / `受信CH`) とは別の値です。

<Note>
  名前欄を空にして確定すると、そのスロットのフィールド設定は解除されます (トースト「名前が空のためスロットの設定を解除しました」)。
</Note>

## フィールド設定パネル

フィールドを選択すると、以下を編集できます。

* **変数名**: 生成される Lua コードで `<受信テーブル変数名>.<変数名>` として使われる識別子です。Lua の識別子として不正な文字は、コード生成時に自動的にサニタイズされます。
* **⧉ 設定パラメータをコピー / 📋 ペースト**: 範囲・精度パラメータ (min/max/step/rounding/threshold/rangeMode) を他のフィールドに使い回せます。Bool 型のフィールドには数値設定をペーストできません。
* **✕ 削除 (無設定にする)**: フィールドの設定を解除します。

数値フィールド (`kind: "number"`) では、さらに以下を設定します。

* **Min / Max / Step**: 値の取り得る範囲と刻み幅です。`(Max - Min)` が `Step` の整数倍になっている必要があります。
* **端数処理 (rounding)**: 刻み幅の間の値をどちらの段階に丸めるかです。四捨五入 (Nearest) / 切り捨て (Floor) / 切り上げ (Ceil) / 指定閾値 (Threshold) から選べます。指定閾値を選ぶと、0〜1 の閾値を追加で指定できます (例: 0.3 なら端数が 0.3 未満で切り捨て、以上で切り上げ)。
* **範囲外処理 (rangeMode)**: 実際の入力値が Min/Max の範囲外だった場合の扱いです。

| 選択肢              | 挙動                                                                                     |
| ---------------- | -------------------------------------------------------------------------------------- |
| 範囲内前提 (Assume)   | 入力値は常に範囲内という前提でそのまま量子化します。範囲チェックは生成されません。                                              |
| クランプ保護 (Clamp)   | 送信側で `math.max(min, math.min(max, x))` により範囲内に丸め込んでから量子化します。                           |
| 範囲外検知 (Overflow) | 範囲外を検知できる 2 つの特殊値を追加で予約します。範囲外の値は受信側で `-math.huge` / `math.huge` として `rx.<変数名>` に入ります。 |

Bool 型のフィールド (`kind: "bool"`) では Min/Max/Step/端数処理/範囲外処理は使われません。

<Warning>
  範囲外検知 (Overflow) を使うフィールドは、受信側の Lua で `rx.<変数名>` が `-math.huge` / `math.huge` になり得ることを前提にコードを書く必要があります。バグではなく仕様です。
</Warning>

## パッキングへの影響

各フィールドは、範囲と刻み幅から「取り得る状態数」に変換されます。数値フィールドなら `floor((Max - Min) / Step) + 1` 通り (Overflow の場合はさらに 2 通り追加)、Bool フィールドなら 2 通りです。パケット全体の状態数はこの積になり、パッキング先のチャンネル数や方式を左右します。仕組みの詳細は [パッキング方式](/codec-compiler/reference/packing-modes) を参照してください。


## Related topics

- [Number Codec Compiler](/codec-compiler/index.md)
- [最初の一歩](/codec-compiler/quickstart.md)
- [フィールド設定リファレンス](/codec-compiler/reference/field-settings.md)
- [パッキング方式](/codec-compiler/reference/packing-modes.md)
- [生成コードの組み込み](/codec-compiler/guides/lua-integration.md)
