språk: go typ: spel ## Bibliotek och Verktyg * **Ebitengine** (`github.com/hajimehoshi/ebiten/v2`): Kärnmotor. Hanterar 2D-rendering av sprites (top-down + side-view), fönster, tangentbord/mus/handkontroll samt plattformsoberoende ljuduppspelning. * **net** (Standardbiblioteket) / **kcp-go** (`github.com/xtaci/kcp-go`): Nätverk för multiplayer. `net` erbjuder standard TCP/UDP, medan `kcp-go` ger "Reliable UDP" för snabb realtidsuppdatering utan dataförlust. * **mathgl** (`github.com/go-gl/mathgl/mgl64`): Vektormatematik (3D-vektorer). Används för koordinatsystemet och spelets 3D-positioner, vilket är basen för egen handkodad fysik (gravitation) och projicering ner till 2D-skärmen. ## Kärnarkitektur Spelets arkitektur bygger på att helt separera 3D-spellogiken från 2D-rendering. 1. **3D Verklighet:** Varje spelfigur och block har en 3D-vektor (`X`, `Y`, `Z`) samt en storlek (`Width`, `Height`, `Depth`). Fysikmotorn (som bygger på euler-integrering och AABB-kollisioner) körs helt och hållet i denna 3D-värld. Tyngdkraft drar objekt neråt längs Y eller Z axeln. 2. **2D Rendering:** Spelet håller reda på aktuellt "ViewMode" (t.ex. TopDown eller SideView). I renderingen itererar motorn över 3D-objekten och översätter deras 3D-vektorer till `(X, Y)` på skärmen baserat på vald vy. Varje objekt har hänvisningar till olika 2D-sprites (t.ex. en bild fotograferad uppifrån, en från sidan) som sedan ritas med *Ebitengine*. 3. **Spelcykel (Game Loop):** Spelet styrs av en global `Game`-struct med en `Update()` (sköter 3D-fysik, input, state-förändringar) och en `Draw()` (översätter till 2D och ritar) funktion. 4. **States:** Koden är uppdelad i "Scenes" eller "States" (Huvudmeny, Gameplay-läge) för isolerad logik.