# The 6 Pluggable Physics & Simulation Solvers (0x61–0x66)

> Complete specification of Playna's 6 standalone simulation modules covering opcodes, data-plane tick CPU, transport hints, and client rendering patterns.

# The 6 Pluggable Physics & Simulation Solvers

Playna exposes **6 standalone game-agnostic simulation modules**. Studios select their solver inside the ECS schema without touching backend server code.

| Provider | Opcode | Tick / CPU Profile | Recommended Channel | Example Genres |
| :--- | :--- | :--- | :--- | :--- |
| **`swept_ccd`** | `0x61` / `0x20` | Solve on shot · 0 idle CPU | Stream (>1200B) / Datagram | Billiards, Carom, Air Hockey |
| **`ballistics`** | `0x62` | 30 Hz / Shot evaluation | Datagram / Stream | Archery, Artillery, Grenades |
| **`rigid_body`** | `0x63` | 60 Hz · 4x Sub-stepping | HTTP/3 WT Datagram / WSS | Vehicle Soccer, Brawlers |
| **`kinematic_ecs`** | `0x64` | 30 / 64 / 128 Hz | HTTP/3 WT / WSS / UDP | FPS, MOBA, Battle Royale |
| **`granular_particle`** | `0x65` | 30 Hz · Sparse diffs | Datagram / WSS | Falling Sand, Fluids, Voxels |
| **`turn_based`** | `0x66` | **0 Hz** (Strict per-move) | Reliable Ordered Stream | Chess, Checkers, Cards, Sudoku |

## Client Scene Rendering Rules

1. **`swept_ccd` (`0x61`):** Submit one impulse command; interpolate streamed collision keyframes and commit final positions strictly on shot completion.
2. **`ballistics` (`0x62`):** Render local projectile arcs from schema wind/gravity constants and reconcile authoritative impact/score frames.
3. **`rigid_body` (`0x63`):** Stream clamped 3D forces and smooth 60 Hz entity snapshots via a short interpolation buffer.
4. **`kinematic_ecs` (`0x64`):** Run responsive client locomotion prediction bounded by `max_speed_mps`, paired with server `T - RTT/2` hitscan checks.
5. **`granular_particle` (`0x65`):** Upload incoming sparse `(x, y, kind)` cells directly to an instanced mesh or GPU data texture.
6. **`turn_based` (`0x66`):** Zero tick traffic while waiting; unlock inputs strictly when `active_slot === mySlot` and enforce monotonic `turn_seq`.

---

# 6 Tak-Çalıştır Fizik & Simülasyon Çözücüsü (0x61–0x66)

# 6 Tak-Çalıştır Fizik & Simülasyon Çözücüsü

Playna veri düzlemi, oyun kurallarından tamamen bağımsız **6 adet ayrık çözücü modülü** sunar. Geliştirici yalnızca şema içinde `simulation` alanını seçer; sunucuya oyuna özel kod yazılmaz.

| Sağlayıcı | Opcode | Önerilen Tick / CPU | Taşıma Kanalı | Örnek Oyun Türleri |
| :--- | :--- | :--- | :--- | :--- |
| **`swept_ccd`** | `0x61` / `0x20` | Olay anında hesap · Boşta 0 CPU | Stream (>1200B) / Datagram | Bilardo, Air Hockey, Langırt |
| **`ballistics`** | `0x62` | 30 Hz / Atış bazlı | Datagram / Stream | Okçuluk, Topçu, El Bombası |
| **`rigid_body`** | `0x63` | 60 Hz · 4x Sub-step | HTTP/3 WT Datagram / WSS | Araçlı Futbol, Arena Brawler |
| **`kinematic_ecs`** | `0x64` | 30 / 64 / 128 Hz | HTTP/3 WT / WSS / UDP | FPS, MOBA, Top-Down, MMORPG |
| **`granular_particle`** | `0x65` | 30 Hz · Seyrek diff | Datagram / WSS | Kum, Sıvı, Yıkılabilir Grid |
| **`turn_based`** | `0x66` | **0 Hz** (Sadece hamlede) | Güvenilir Sıralı Akış | Satranç, Dama, Kart, Sudoku |

## İstemci Sahnesi Nasıl Render Edilir?

1. **`swept_ccd` (`0x61`):** İstemci tek atış komutu yollar. Sunucudan dönen anahtar kare eğrisi sahnede pürüzsüz enterpole edilir; son pozisyon ve sıra değişimi yalnızca bitiş olayından uygulanır.
2. **`ballistics` (`0x62`):** Çıkış noktası, yön vektörü ve güç gönderilir. İstemci rüzgar/yerçekimi sabitleriyle yayı çizer, isabet ve puan olayını sunucudan eşitler.
3. **`rigid_body` (`0x63`):** Kuvvet/impulse girdileri akarken 60 Hz transform paketleri kısa tamponla monitör yenileme hızında enterpole edilir.
4. **`kinematic_ecs` (`0x64`):** Yerel oyuncu anlık prediction kullanır; sunucu `max_speed_mps` ve tarih halkasında `verify_ray_hit` ile doğrular.
5. **`granular_particle` (`0x65`):** Yalnızca dolu/değişen `(x, y, kind)` hücreleri gelir; istemci bu diziyi instanced mesh veya GPU dokusuna yazar.
6. **`turn_based` (`0x66`):** Boşta sıfır tick paketi üretir. Yalnızca `active_slot === mySlot` iken hamle gönderilir ve `turn_seq` kontrolüyle tahta güncellenir.
