10 REM === OMEGA V2: REACTIVE EVENT DEMO ===
20 PRINT ">>> 1. Alustetaan Noden HTTP-palvelin ja VFB..."
30 WEBSERVE PORT 9091 INTO HTTP_SERVER
40 WEBSERVE ADD "/" TO HTTP_SERVER FROM FS "/mnt/mesh_root/src/x-mesh-basic/vfb
_client.html"
50 WEBSERVE LINK VFB TO HTTP_SERVER ON "/stream"
60 WEBSERVE LINK OMEGA TO HTTP_SERVER ON "/input" INTO "ch_input"
70 PRINT ">>> 2. Alustetaan Noden Event Traps (Keskeytykset)..."
80 OMEGA SUBSCRIBE "ch_input" WITH GOSUB 1000
90 OMEGA SUBSCRIBE "ch_timer" WITH GOSUB 2000
100 PRINT ">>> 3. Alustetaan JS-Laatikkomoottori ja pelitila..."
110 SCREEN 176, 184
120 DIM BOXES AS ARRAY
130 LET SELECTED_INDEX = -1
135 JS DEFINE "math_random" "function() { return Math.random(); }"
140 PRINT ">>> 4. Kaynnistetaan Mesh-natiivi tausta-ajastin (BRANCH)..."
150 BRANCH "TickTimer" 9000 FINALIZE WITH 9100
180 PRINT ">>> VALMIS! Avaa http://localhost:9091 ja kokeile (B, N, W/A/S/D,
R, P) <<<"
200 REM --- PAAOHJELMA: DETACHED EVENT LOOP ---
210 REM Taalla piirretaan ruutu ja vaivutaan uneen!
220 FILLRECT 0, 0, 176, 184, 0
230 LET I = 0
240 FOREACH B IN BOXES
250 LET COLOR = 2
260 IF I == SELECTED_INDEX THEN LET COLOR = 3
270 FILLRECT B["x"], B["y"], 10, 10, COLOR
280 LET I = I + 1
290 NEXT B
300 BUFFER BLIT SCREEN
310 REM Irrotetaan Node.js Event Loop! (CPU -> 0%)
320 SUSPEND
330 GOTO 200
1000 REM ==========================================
1001 REM EVENT HANDLER: NCPPCIMISTC (ch_input)
1002 REM ==========================================
1010 OMEGA READ INTO PKT
1020 IF PKT == "" THEN RETURN
1030 JSON GET "data" FROM PKT INTO DATA
1040 JSON GET "action" FROM DATA INTO ACT
1050 IF ACT != "DOWN" THEN RETURN
1060 JSON GET "code" FROM DATA INTO KEY
1070 IF KEY == "B" THEN
1080 JSON INIT "DICT" NEW_BOX
1090 JSON SET "x" IN NEW_BOX TO 83
1100 JSON SET "y" IN NEW_BOX TO 87
1110 JSON SET "mode" IN NEW_BOX TO "idle"
1120 JSON PUSH NEW_BOX INTO BOXES
1130 LET SELECTED_INDEX = BOXES["length"] - 1
1140 PRINT "Uusi laatikko luotu. Index: " + SELECTED_INDEX
1150 END IF
1160 IF BOXES["length"] == 0 THEN RETURN
1170 IF KEY == "N" THEN
1180 LET SELECTED_INDEX = SELECTED_INDEX + 1
1190 IF SELECTED_INDEX >= BOXES["length"] THEN LET SELECTED_INDEX = 0
1200 PRINT "Valinta siirtyi indexiin: " + SELECTED_INDEX
1210 END IF
1220 LET CUR_BOX = BOXES[SELECTED_INDEX]
1230 IF KEY == "W" THEN SET CUR_BOX["y"] = CUR_BOX["y"] - 10
1240 IF KEY == "S" THEN SET CUR_BOX["y"] = CUR_BOX["y"] + 10
1250 IF KEY == "A" THEN SET CUR_BOX["x"] = CUR_BOX["x"] - 10
1260 IF KEY == "D" THEN SET CUR_BOX["x"] = CUR_BOX["x"] + 10
1270 IF KEY == "R" THEN
1280 SET CUR_BOX["mode"] = "random"
1290 PRINT "Laatikko " + SELECTED_INDEX + " asetettu random-tilaan."
1300 END IF
1310 IF KEY == "P" THEN
1320 SET CUR_BOX["mode"] = "idle"
1330 PRINT "Laatikko " + SELECTED_INDEX + " pysaytetty."
1340 END IF
1350 RETURN
2000 REM ==========================================
2001 REM EVENT HANDLER: TICK (Joka sekunti)
2002 REM ==========================================
2010 OMEGA READ INTO PKT
2020 IF PKT == "" THEN RETURN
2050 FOREACH B IN BOXES
2060 IF B["mode"] == "random" THEN
2070 JS CALL "math_random" INTO R
2080 IF R < 0.25 THEN SET B["y"] = B["y"] - 10
2090 IF R >= 0.25 AND R < 0.5 THEN SET B["y"] = B["y"] + 10
2100 IF R >= 0.5 AND R < 0.75 THEN SET B["x"] = B["x"] - 10
2110 IF R >= 0.75 THEN SET B["x"] = B["x"] + 10
2120 END IF
2130 NEXT B
2140 RETURN
9000 REM ==========================================
9001 REM NATIVE TIMER THREAD (BRANCH)
9002 REM ==========================================
9010 HOST_INJECT "{'channel': 'ch_timer', 'data': {'type': 'TICK'}}"
9020 SLEEP 1
9030 GOTO 9010
9100 EXITBRANCH