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 (Double Viewport):** Spelet renderas genom två synkroniserade vyportar bredvid varandra, båda med en svart inramning:
   - **Vänster vy (Sido-vy):** Ritar upp z-lagren från -3 (inåt/dold) till +3 (utåt/framför) relativt till spelaren. Lager inåt och utåt styrs enbart av transparens (en sjunkande alpha) så objekten förblir klara men genomskinliga utan ett färgfilter. Objekt framför spelaren ritas korrekt upp OVANPÅ spelaren i vyporten.
   - **Höger vy (Ovanifrån):** Visar X- och Z-axeln. Ritar upp höjd-lagren (Y) från -3 (ovanför spelaren) till +3 (under mark). Desto djupare nivåer i marken eller ju ytligare/ovanför spelaren ett lager befinner sig, desto mer sänks dess transparens (alpha) utan något färgfilter.
3. **Kartstruktur:** Världen sparas i grunden som en tre-dimensionell array (`[][][]Entity`), exempelvis motsvarande en 10x10x10 map. Varje block motsvarar 32x32 pixlar i world-space som sedan representeras av specifika sprites ur `assets/images/1 Tiles`. Kartans botten består av solida jordblock som förhindrar spelaren från att falla igenom.
4. **Gemensamt Spelobjekt (Entity):** All logik byggs på ett generiskt `Entity`-interface som besvarar frågor som `IsBlocking()`, `IsMovable()`, `Move()`, `Damage()`, `Pickup()` och `GetHealth()`. Detta gör att karaktärer, pussel och fiender smidigt kan kalla varandras triggers och dela samma kollisionsmekanismer i 3D-kuben. Speciell kollisions-logik sköts vid klättring inuti ett solitt/klätringsbart block. Fallande aktiveras automatiskt om spelaren släpper knappen.
5. **Animation och Input:** Kontroller styrs av dynamiskt JSON-Sparad "Input Manager". Karaktärerna använder sprite-sheets där varje "frame" är 96x96 pixlar som bläddras igenom i en specifik timer. Vid in-game tryckande av ESC visas Inställnings-menyn för de anpassningsbara action-bindings (som sparas ner i `assets/settings.json`). Särskilda keybindings finns för de upp till 6 dimensionella klättringsledernas separata kommandon.

## Map Pipeline
* **Tiled JSON (`assets/maps/*.tmj`)**: Kartdata.
* **Entity Definitions (`assets/entity_defs.json`)**: JSON som mappar ID till top/sido sprites samt om den är solid eller har specifik logik.
  Exempel:
  - id 1: side tile_02, top tile_31 (Gräs)
  - id 2: side tile_12, top tile_12 (Jord)
  - id 3: portal (Grässtruktur som byter karta)
