> ## 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.

# ティックと信号伝播

> ゲームティックの処理順序、同期回路モデル、信号遅延の計算方法

Stormworks のロジックは、決まった順序で毎ティック評価される同期回路として動作します。この仕組みを理解すると、回路のクロックや積分器を狙って作れるようになります。

## ゲームティックの構造

1 ゲームティックは 60Hz 固定（1/60 秒）で進み、次の順序で処理されます。

<Steps>
  <Step title="センサー評価">
    物理状態を読み取り、センサーの出力値を更新します。
  </Step>

  <Step title="ロジック評価">
    ロジックブロック・マイクロコントローラー内部回路・Lua スクリプトを評価し、次の出力値を確定します。同時にアクチュエータへの目標値も決定します。
  </Step>

  <Step title="物理更新">
    物理エンジンが更新されます。品質設定に応じて 1 ティックの中で複数回のサブステップに分割されます（低品質 = 1 回、標準 = 2 回、高品質 = 3 回）。アクチュエータの目標値はティック内で固定され、全サブステップに同じ値が適用されます。
  </Step>
</Steps>

ロジック・Lua の評価は **1 ゲームティックに1回だけ**です。物理のサブステップごとに再評価されることはありません。

<Note>
  処理が間に合わない場合、ゲームの進行速度そのものが遅くなります（タイムディレーション）。抜け落ちたティックを後から詰め込んで帳尻を合わせることはありません。
</Note>

## 同期回路モデル

**すべてのロジックブロックは、入力を読む際に前ティックの値を参照します。** これはマイクロコントローラー内部でも車両レベルの配線でも同じです。全ブロックが同時に評価され、あるブロックの出力は次のティックになって初めて下流のブロックから見えるようになります。

つまり、信号は **1ブロックを通過するごとに1ティック遅延**します。

| 要素                                | 1ティック遅延               |
| --------------------------------- | --------------------- |
| ロジックブロック（マイクロコントローラー内外を問わずすべての種類） | あり                    |
| 計器パネル・ボタンなどのブロック                  | あり                    |
| マイクロコントローラーの入出力ピン                 | なし（ピンの通過自体は遅延を発生させない） |
| ワイヤ（配線）                           | なし（配線の長さや経路は無関係）      |

信号の総遅延は、信号が通過する**直列ブロック数**で決まります。並列に分岐した経路は加算されません。

## 具体例

### NOT ゲートの自己帰還 → クロック

NOT ゲートの出力を自分自身の入力に接続すると、毎ティック出力が反転する 30Hz のクロック信号になります。

```text theme={null}
tick 0: input=false → output=true
tick 1: input=true (前tickの出力) → output=false
tick 2: input=false (前tickの出力) → output=true
```

### Add ゲートの自己帰還 → 積分器

Add ゲートの出力を入力 A へ接続し、入力 B に定数 1 を与えると、毎ティック 1 ずつ増加する積分器（累算器）になります。

```text theme={null}
tick 0: A=0 (初期値), B=1 → output=1
tick 1: A=1 (前tickの出力), B=1 → output=2
tick 2: A=2, B=1 → output=3
```

### マイクロコントローラー経由でも追加遅延はない

マイクロコントローラーの入出力ピンを通過すること自体は、遅延を発生させません。

```text theme={null}
[ボタン] → [MC入力ピン] → [内部NOTゲート] → [MC出力ピン] → [ライト]
遅延 = ボタン(1) + NOTゲート(1) = 2 ティック
```

マイクロコントローラーをまたいで信号が流れる場合も、通過する直列ゲート数だけで遅延が決まります。

```text theme={null}
[MC-A 内部: NOT→AND (2ゲート)] → [MC-B 内部: OR (1ゲート)]
遅延 = NOT(1) + AND(1) + OR(1) = 3 ティック
```

60 個のゲートを直列に通過する信号は、ちょうど 1 秒（60Hz × 1ティック/ゲート）で伝わります。


## Related topics

- [センサーとアクチュエータ](/stormworks/logic/sensors-actuators.md)
- [信号モデル](/stormworks/logic/signal-model.md)
- [Lua スクリプトブロック](/stormworks/logic/lua-api.md)
- [ステートフルブロック](/stormworks/logic/stateful-blocks.md)
- [ロジックブロック](/stormworks/logic/logic-blocks.md)
