This commit is contained in:
2025-12-11 11:34:23 +01:00
parent b46c5dca6b
commit 45529ab8a7
220 changed files with 17696 additions and 0 deletions

View File

@@ -0,0 +1,46 @@
# 🌍 Open World Strategy Plan
*Roadmap za prehod iz statične mape v neskončen odprt svet (za razliko od Stardew Valley con).*
## 1. Konceptualna Razlika
- **Stardew Valley:** Ima ločene "sobe" (Farm, Town, Beach). Ko greš čez rob, se naloži nova mapa (Loading Screen).
- **NovaFarma (Cilj):** **Seamless Open World**. Brez nalaganja. Igralec hodi v katerokoli smer in svet se generira sproti.
## 2. Tehnični Izziv: Chunk System (Koščki Sveta)
Ker računalnik ne more hraniti neskončne mape v spominu, moramo svet razdeliti na **Chunke** (npr. 16x16 ploščic).
### 📐 Arhitektura
1. **Chunk Manager (`WorldSystem.js`):**
- Spremlja pozicijo igralca (npr. Chunk X: 5, Y: 10).
- **Active Window:** Naloži samo 9 chunkov okoli igralca (Center + 8 sosedov).
- **Generation:** Če chunk še ne obstaja, ga generira s Perlin Noise funkcijo (deterministično - isti seed = isti svet).
- **Unloading:** Chunke, ki so daleč stran, odstrani iz spomina (vendar shrani spremembe!).
2. **Perzistenca (Shranjevanje):**
- Težava: Če posekam drevo v Chunku (100, 100) in grem stran, ter se vrnem, mora biti drevo še vedno podrto.
- Rešitev: `Delta Compression`. Ne shranjujemo celega chunka, ampak samo **razlike** (npr. `{ "100,100": { removedDecor: true } }`).
## 3. Generacija Sveta (Biomi)
Za razliko od trenutne 100x100 mape, mora Open World imeti strukturo na velikem nivoju.
### 🌡️ Biome Map (Noise Layer 2)
Uporabimo drugi Perlin Noise z zelo nizko frekvenco (velik zoom) za določanje biomov/temperature.
- **Noise < 0.3:** ❄️ Snow Biome (Zalejeno, Jelke)
- **Noise 0.3 - 0.7:** 🌲 Temperate (Trava, Hrast - trenutni stil)
- **Noise > 0.7:** 🌵 Desert (Pesek, Kaktusi)
## 4. Implementacijskih Koraki
### Faza 1: Refactor TerrainSystem na Chunke
- Namesto `this.tiles[100][100]`, uporabimo `this.chunks = Map<string, ChunkData>`.
- `getTile(x, y)` mora preračunati: `chunkX = floor(x/16)`, `localX = x % 16`.
### Faza 2: Dynamic Loading
- V `update()` zanki preverjamo ali je igralec prečkal mejo chunka.
- Če da → sproži nalaganje novih sosedov.
### Faza 3: "Infinite" Koordinatni Sistem
- Ker JS nima težav z velikimi števili do 9 kintilijonov, `Floating Origin` verjetno še ni nujen, dokler ne gremo ekstremno daleč.
---
**Zaključek:**
To je velik tehnični preskok. Trenutna `100x100` mapa je "en velik chunk". Prvi korak je razbitje te logike na manjše enote.