Historiallisesti BASIC-kielissC$ on ollut muutamia todella ikonisia tapoja kC$sitellC$ grafiikkapuskureita ja nC$yttC6jC$. Ehdottamasi malli on erittC$in looginen, mutta jos haluamme pysyC$ uskollisena retro-BASIC -dialekteille (erityisesti Amiga AMOS Basic ja QBasic), suosittelisin seuraavaa lC$hestymistapaa, joka yhdistC$C$ nostalgian moottorisi nykyiseen `INTO`-syntaksiin. ### Historialliset esikuvat * **QBasic/QuickBasic:** KC$ytti komentoa `SCREEN 13` asettamaan nC$yttC6tilan (320x200, 256 vC$riC$). PiirtC$minen tapahtui suoraan tC$hC$n, ja `GET`/`PUT` -komennoilla siirrettiin pikseliblokkeja muistiin ja sieltC$ pois. * **Amiga AMOS Basic:** KC$ytti komentorakennetta `Screen Open 0, 320, 200, 16, Lowres`. Piirtopuskureita pystyi vaihtamaan lennosta ja kopioimaan toisiinsa komennolla `Screen Copy 1 To 0` (kopioi piilopuskuri 1 nC$kyvC$C$n ruutuun 0). ### Johdonmukaisin syntaksi x-mesh-basicille Koska Jupiter Lander -luonnoksessasi kC$ytit jo komentoa `SCREEN 176, 184`, kannattaa se pitC$C$ pC$C$asiallisena nC$yttC6tilan alustajana. Silloin Node.js ymmC$rtC$C$ kertoa selaimen HUD:lle, minkC$ kokoinen Canvas luodaan. Virtuaalisille puskureille (kuten kokeilemasi VGABUFFER) `BUFFER`-avainsana olisi erittC$in BASIC-henkinen: 1. **PC$C$nC$ytC6n alustus:** `SCREEN 176, 184` (LC$hettC$C$ HUD:lle koon ja tyhjentC$C$ Canvaksen) 2. **Offscreen-puskurin luonti:** `BUFFER CREATE 176, 184 INTO V` 3. **Puskurien vC$lillC$ kopiointi (Blitting):** `BUFFER BLIT V TO SCREEN` (Kopioi offscreen-puskurin nC$kyvC$C$n ruutuun) TC$mC$ pitC$C$ sanaston lyhyenC$, iskevC$nC$ ja erittC$in retrohenkisenC$. --- ### Testin luominen (`09_retro_engine.bas`) Voimme ehdottomasti luoda testin uudelle `retro.js` -laajennukselle, vaikka meillC$ ei olisi vielC$ visuaalista HUDia kiinni. Voimme hyC6dyntC$C$ juuri koodattua `WAIT VBLANK` -sykliC$ ja AABB-tC6rmC$ystunnistusta todentaaksemme, ettC$ taustamaskissa on oikeat arvot oikeissa paikoissa! TehdC$C$n testi, joka: 1. Generoi 1D-luolaston (`MAPGEN`) tietyllC$ seedillC$. 2. Injektoi laskeutumisalustan (`RECT`). 3. Liikuttaa nC$kymC$ttC6mC$n "testi-aluksen" (`SPRITE 1`) koordinaatteihin, joissa sen pitC$isi osua PADiin, ja tarkistaa tC6rmC$yksen (`CHECKCOLLISION`). 4. Liikuttaa aluksen koordinaattiin `0,0` (reunaan), jossa sen pitC$isi aina osua kiveen, ja tarkistaa tC6rmC$yksen. Aja tC$mC$ OMEGA-lohkona, jotta saat luotua testin testihakemistoon ja ajettua CI/CD-putken vC$littC6mC$sti uudelleen: [GEM-EDITBOT-START] TARGET FILE "/mnt/mesh_root/src/x-mesh-basic/tests/09_retro_engine.bas" ENSURE LINES 22 REPLACE LINE 1 WITH BLOCK 10 REM === TEST 09: RETRO ENGINE (MAPGEN, RECT, COLLISION) === 20 REM Asetetaan nollapainovoima, jotta testisprite pysyy paikoillaan 30 SETGRAVITY 0 40 MAPGEN "CAVE", SEED 1337, WIDTH 40, ROUGHNESS 0 50 RECT 1, 20, 160, 40, 165, 2 60 SPRITE 1, "TEST_SHIP" 70 REM --- TESTI 1: Osuma Pad 2x --- 80 MOVE SPRITE 1, 30, 162 90 WAIT VBLANK 100 CHECKCOLLISION 1 INTO C 110 IF C != 2 THEN GOTO 200 120 REM --- TESTI 2: Osuma seinamaan (kuolema) --- 130 MOVE SPRITE 1, 0, 0 140 WAIT VBLANK 150 CHECKCOLLISION 1 INTO C2 160 IF C2 != -1 THEN GOTO 300 170 PRINT "[PASS] 09_retro_engine" 180 HALT 190 REM --- VIRHETILANTEET --- 200 PRINT "[FAIL] Laskeutumisalustan (RECT) tormays tunnistettiin vaarin: " + C 210 HALT 220 300 PRINT "[FAIL] Seinaman tormays tunnistettiin vaarin: " + C2 230 310 HALT END BLOCK [GEM-EDITBOT-END] [GEM-TERMINAL-START] cd /mnt/mesh_root/src/x-mesh-basic echo "==" echo "[*] Suoritetaan uusi testi: 09_retro_engine.bas" ./x-mesh-basic tests/09_retro_engine.bas --ext ./ext echo "==" [GEM-TERMINAL-END]