## HAUKI-GEM OMEGA-WEB v1.0 API Specification
Kaikki kommunikaatio tapahtuu asynkronisesti OMEGA-vC$ylC$n yli
JSON-objekteina.
### OSASIO 1: IN (ServeriltC$ Thin Clientille)
NC$mC$ ovat komentoja, joita MeshBASIC-serveri lC$hettC$C$ selaimelle.
**1. NC$yttC6 ja Puskurit (Display & Buffers)**
// Alustaa moottorin ja luo taustapuskurit
{ "cmd": "INIT_SCREEN", "w": 640, "h": 480, "bpp": 32, "buffers": 2 }
// Vaihtaa aktiivisen piirtokohteen (0 = nC$kyvC$ canvas, 1+ = offscreen
bufferit)
{ "cmd": "SWITCH_BUFFER", "id": 1 }
// Kopioi taustapuskurin sellaisenaan nC$kyvC$lle ruudulle
{ "cmd": "FLIP", "src": 1, "dest": 0 }
// Puhdistaa aktiivisen puskurin valitulla varilla (hex tai rgba)
{ "cmd": "CLEAR", "color": "#000000" }
**2. Tasot ja Kamera (Layers & Camera)**
// Luo uuden tason. Z-indeksi maarittaa piirtojarjestyksen.
{
"cmd": "LAYER_CREATE",
"id": "world_layer",
"z": 10,
"flags": { "scrollable": true, "clickable": true }
}
// Asettaa kameran maailmankoordinaatit (liikuttaa kaikkia 'scrollable'
-tasoja)
{ "cmd": "SET_CAMERA", "x": 1500, "y": 2000 }
// Vaihtoehtoisesti: Lukitsee kameran seuraamaan tiettya Spritea pehmeasti
{ "cmd": "TARGET_CAMERA", "target_id": "player_ship", "smoothness": 0.1 }
**3. Spritet ja Objektit (Sprites & Scene Graph)**
// Luo uuden spriten ja sitoo sen tasoon
{
"cmd": "SPRITE_CREATE",
"id": "unit_42",
"layer_id": "world_layer",
"asset_id": "units_spritesheet",
"frame": 4, // Indeksi spritesheetissa
"x": 1500, "y": 2000,
"flags": { "selectable": true, "clickable": true },
"metadata": { "hp": 100, "type": "tank" } // Tallennettaan clientin muistiin
tapahtumia varten
}
// Client-side Tweening (Pehmea animaatio viiveella)
{
"cmd": "SPRITE_MOVE",
"id": "unit_42",
"to_x": 1600, "to_y": 2000,
"duration_ms": 500,
"easing": "ease-out" // linear, ease-in, ease-out, ease-in-out
}
// Asettaa focuksen tai valinnan suoraan serverilta kasin
{ "cmd": "SET_SELECTION", "ids": ["unit_42", "unit_43"] }
**4. Resurssit ja Lohkot (Assets & Chunks)**
// Lataa bittikartta muistiin (URL tai Base64)
{ "cmd": "ASSET_LOAD", "id": "units_spritesheet", "type": "BITMAP", "data":
"url/or/base64" }
// Lataa maastolohko ja piirtaa sen Hardware Layerille
{ "cmd": "CHUNK_LOAD", "layer_id": "bg_layer", "cx": 0, "cy": 1, "data": "..."
}
// Vapauttaa lohkon tai resurssin muistista
{ "cmd": "FREE_CHUNK", "cx": 0, "cy": -2 }
### OSASIO 2: OUT (Thin ClientiltC$ Serverille)
**1. Hiiritapahtumat (Point-and-Click / RTS Control)**
{
"event": "MOUSE_CLICK",
"button": "left",
"global_x": 320, // Ruutukoordinaatti (kankaan sisalla)
"global_y": 240,
// Thin clientin Raycaster etsi korkeimman Z-indeksin 'clickable' olion:
"hit_target": {
"id": "world_layer", // Osui maastoon (koska ei osunut keneenkaan
yksikkoon)
"local_x": 1820, // KAMERAN OFFSET ON JO LASKETTU MUKAAN!
"local_y": 2240 // Tama on suora maailmankoordinaatti!
},
// Mita kayttajalla on juuri nyt aktiivisena valintana:
"selection": [
{ "id": "unit_42", "metadata": { "hp": 100, "type": "tank" } }
],
// Onko koko ruudun input-focus sidottu johonkin (esim. ohjattavaan
alukseen)
"focus": null
}
**2. NC$ppC$imistC6tapahtumat (Action Control)**
{
"event": "KEY_DOWN",
"key": "W",
"modifiers": ["shift"], // ctrl, alt, shift
"focus": "player_ship", // Jos focus on asetettu, serveri tietaa kuka painoi
kaasua
"selection": []
}
**3. Clientin elinkaaritapahtumat (Lifecycle)**
// Kerrotaan serverille etta naytto on alustettu ja resurssit (kuten
aani/kuva) ovat ladattu
{ "event": "READY", "viewport": { "w": 640, "h": 480 } }
// Kerrotaan etta animaatio on paattynyt, serveri voi jatkaa logiikkaa
{ "event": "TWEEN_COMPLETE", "id": "unit_42", "x": 1600, "y": 2000 }
---
TC$llC$ mC$C$rittelyllC$ saavutamme tC$ydellisen vapauden. Voimme ajaa tC$llC$
`INIT_SCREEN` komennolla perinteisen tekstiseikkailun, VFB-pohjaisen Jupiter
Landerin tai monimutkaisen isometrisen RTS-pelin.
Landerin tai monimutkaisen isometrisen RTS-pelin.