/ TC$mC$ on standardi, jonka kaikkien moottoreiden ON TOTEUTETTAVA.
export interface SimulationEngine {
// 1. LATAAMINEN & ALUSTUS
// Lataa pelisC$C$nnC6t (fysiikka, kosmos), kentC$n koon ja alustavat
resurssit.
loadRules(config: SimulationConfig): void;
// Lataa tietty pelikenttC$ ja siihen kuuluvat organismit (Petrimalja)
loadState(state: SimulationState): void;
// 2. SUORITUS
// Ajaa N kappaletta tickejC$. Palauttaa tiedon, kuinka kauan (ms)
laskennassa kesti.
tick(steps?: number): EngineMetrics;
// 3. LUKU JA KIRJOITUS
// Palauttaa ruudukon nykytilan (esim. 1D TypedArray muodossa nopeaa
renderC6intiC$ varten)
getState(): EngineStateView;
// Injektoi kesken ajon uuden organismin tai mutaation kentC$lle (pelaajan
vuorovaikutus)
injectPattern(x: number, y: number, pattern: Pattern): boolean;
}
```
### 2. Standardoidut Tiedostomuodot (Resurssit ja Laajennukset)
Jotta kehittC$jC$t ja pelaajat voivat jakaa luomuksiaan (organismien
anatomioita, kenttiC$ ja laajennuksia), tarvitsemme ihmisluettavat, mutta
koneluettavaksi helposti kC$C$ntyvC$t standardit. YAML on tC$hC$n
tC$ydellinen.
Ehdotan kolmijakoista resurssimallia:
#### 2.1. `rules.yaml` (Fysiikka ja Laajennukset)
TC$mC$ tiedosto mC$C$rittelee **maailman lait**. SitC$ muokkaamalla voidaan
pelata tC$ysin erilaisia simulaatioita samalla moottorilla (esim. poistaa
lC$mpC6 kokonaan tai muuttaa sC$teilyn sC$C$ntC6jC$).
```yaml
version: "1.0"
namespace: "core.physics"
cosmos:
star_mode: orbiting
base_heat_input: 10
entropy_loss: 1%
materials:
- id: M # Moottori
opacity: 0.8
conductivity: 0.8
capacity: 255
code: "ENG:PUSH+" # Oletus ohjelma, jos ei ylikirjoiteta
- id: H # Happo
opacity: 0.5
conductivity: 0.2
capacity: 100
code: "SEN:!:KILL"
```
#### 2.2. `genome.yaml` (Organismit ja Kuviot)
TC$mC$ on pelin "Pokedex". TC$nne ladataan pelaajien ja tekoC$lyn
suunnittelemat lajit. Ne voivat ylikirjoittaa `rules.yaml`:n oletuskoodit
(mutta eivC$t materiaalien fysiikkaa, jotta huijaaminen estetC$C$n).
```yaml
version: "1.0"
species: "Puskutraktori"
author: "blizuke"
pattern:
width: 3
height: 3
layout: |
.H.
mMM
.H.
# Ylikirjoitetaan 'm' (kuolleen moottorin) kC$yttC$ytyminen suojakilveksi
overrides:
m:
code: "NOP" # No operation, toimii vain puskurina
```
#### 2.3. `petri.yaml` (PelikentC$t ja Skenaariot)
TC$mC$ tiedosto kokoaa sC$C$nnC6t ja lajit yhteen tietylle 2D-kartalle. TC$mC$
on "Level" tai "Match", jonka moottori lopulta ajaa.
```yaml
version: "1.0"
scenario: "Battle of the Bulldozers"
size: [128, 128]
imports:
rules: "standard_physics.yaml"
genomes:
- "puskutraktori.yaml"
- "happomato.yaml"
# KentC$n pohjakartta (biomassa ja geologia)
map_seed: "perlin_42"
# Injektoidaan organismit aloituspaikoilleen
spawns:
- species: "Puskutraktori"
position: [10, 15]
facing: "EAST"
- species: "Happomato"
position: [110, 100]
facing: "WEST"
```
### 3. Arkkitehtuurin latausvuoro (Boot Sequence)
Kun standardit on lyC6ty lukkoon, moottorin (esim. C$sken tekemC$mme
JS-testimoottorin) latausvuoro toimisi aina samalla, ennustettavalla tavalla:
1. **Core Loader:** JC$rjestelmC$ kC$ynnistyy ja valitsee kC$ytettC$vC$n
moottorin (esim. kC$yttC$jC$ valitsee valikosta "WASM Engine").
2. **Resource Parsing:** JC$rjestelmC$ lukee `.yaml` -tiedostot (SC$C$nnC6t
$\rightarrow$ Genomit $\rightarrow$ Skenaario) ja kC$C$ntC$C$ ne moottorin
ymmC$rtC$mC$C$n 1D-binC$C$rimuotoon.
3. **Bootstrapping:** JC$rjestelmC$ kutsuu moottorin `loadRules()` ja
`loadState()` -metodeita ja injektoi binC$C$ridatan suoraan moottorin Typed
Array -muisteihin.
4. **Runtime:** JC$rjestelmC$ alkaa kutsua moottorin `tick()` -metodia ja
piirtC$C$ `getState()` -metodin palauttaman 1D-taulukon ruudulle (ASCII,
Canvas tai WebGL).