# コンセプト

Midorableのコンセプトは「チープで低機能だが、あらゆる環境に移植できる」ことです。

## ブラウザ以外の環境で動かすことの難しさ

一般的なJavaScript(TypeScript)のゲームエンジンは、ブラウザの高度なAPIを活用することで、ネイティブと比べても遜色ないクオリティのゲームを作ることを可能にしています。その一方で、ブラウザ以外の環境で動かしたくなったときに、コードそのままに移植することが難しいという問題があります。

デスクトップPC環境であれば、Electronなどを利用してブラウザを内蔵することで、コードの移植なしに動かすことができます。しかし、ターゲット環境によっては難しいこともあるでしょう。おそらく、ゲーム自体をUnityなどのクロスプラットフォームなゲームエンジンへの移植を試みたほうが早いことでしょう。

## Core層とPlatform層

Midorableは「ランタイム非依存のCore層」と「各環境ごとのPlatform層」に分かれています。ゲームを制作する際はCore層のAPIを使用することで、Platform層を切り替えるだけで、理論上はあらゆる環境に移植できるゲームを作ることができます。

`@rutan/midorable` はCore層の実装を提供します。
ブラウザ向けの `@rutan/midorable-platform-browser` と、テスト用ヘッドレス環境向けの `@rutan/midorable-platform-headless` がPlatform層の実装を提供しています。Platform層はインタフェースさえ満たしていれば、どのような実装でも構いません。

例えば、もしあなたがMidorableで作成したゲームをGoで動かしたい場合、[Ebitengine](https://ebitengine.org/)と[sobek](https://github.com/grafana/sobek)を利用したPlatform層を実装すれば、MidorableのゲームをGoで動かすことができます。

## チープだからこそ

MidorableのAPIは、あえてチープで低機能なものにしています。3D機能などはなく、描画は基本的なものしかありません。

代わりにMidorableのPlatformのインタフェースを満たす実装は、多くの環境で容易に作ることができます。昨今であれば、コーディングエージェントを利用して、遅くとも2～3日もあればブラウザ以外の環境で動くPlatform層の実装を作ることができるでしょう。

「ゲームが動く」ことを最優先にすることで、あらゆる環境で動かすことができるゲームエンジンを目指しています。

---

この思想は[AkashicEngine](https://akashic-games.github.io/)に強く影響を受けています。AkashicEngineはマルチプレイに強いゲームエンジンで、プラットフォーム依存層(PDI Layer)を切り替えることで、ブラウザやサーバサイドで同一のコードを実行可能にしています。

Midorableは、AkashicEngineのようなマルチプレイ機能は提供しませんが、この「各環境ごとのPlatform層を切り替える」という設計を踏襲しています。
