TC$mC$ on loistava huomio ja erinomainen kC$ytC$nnC6n testi! Koodin jakaminen pikaviestimissC$ (Signal, WhatsApp) tai sC$hkC6postissa tuhoaa tC$ydellisesti erikoismerkit ja vC$lilyC6ntien asemoinnin, koska ne kC$yttC$vC$t suhteellisia fontteja (proportional fonts). TyhjC$n tilan kuvaaminen `~` (tilde) tai `.` (piste) -merkillC$ on klassinen ratkaisu. Esimerkiksi legendaarisissa Roguelike-peleissC$ (kuten Nethack tai Rogue) tyhjC$ lattia kuvattiin aina pisteellC$ `.`, koska se on 7-bittinen ASCII-merkki, se erottuu selvC$sti seinistC$ (`#`), ja se on visuaalisesti "kevyt". Mutta esitit erittC$in tC$rkeC$n kysymyksen: **Onko olemassa BASIC-standardeja, joita kannattaisi mukailla retro-koodien porttaamisen helpottamiseksi?** KyllC$ on, ja se on yksi Commodore 64:n ja VIC-20:n (ja lC$hes kaikkien muidenkin aikakauden BASICien) ikonisimmista ominaisuuksista! ### Klassinen BASIC: `DATA`, `READ` ja `RESTORE` Klassisessa BASICissa ei ollut `DATA MAP` tai erillisiC$ tietotyyppimC$C$rittel yjC$. Kieli ratkaisi massadatan (kuten spritejen pikselit, musiikkinuotit tai kartat) tallentamisen kolmen komennon pyhC$llC$ kolminaisuudella: 1. **`DATA`**: SisC$ltC$C$ itse tiedon (numeroita tai merkkijonoja). Ohjelman suoritus (PC, Program Counter) ohittaa nC$mC$ rivit automaattisesti, eli ne eivC$t "tee" mitC$C$n, ne vain ovat olemassa. 2. **`READ`**: Lukee seuraavan vapaan `DATA`-alkion muuttujaan ja siirtC$C$ sisC$istC$ "lukupC$C$tC$" yhden askeleen eteenpC$in. 3. **`RESTORE <rivinumero>`**: SiirtC$C$ "lukupC$C$n" haluttuun kohtaan ohjelmaa (esim. kartan alkuun), jotta `READ` alkaa lukea sieltC$. Jos noudatamme tC$tC$ perinteistC$ Microsoft/CBM BASIC -standardia, vanhojen pelien porttaaminen MeshBASICiin on uskomattoman helppoa, koska kieli kC$yttC$ytyy tarkalleen kuten 80-luvun esikuvansa. ### Miten tC$mC$ toimisi Jupiter Landerissa (Standardin mukaan) Jos yhdistC$mme ovelan 7-bit ASCII -ideasi klassiseen BASIC-syntaksiin, uusi luolastomme nC$yttC$isi skriptin sisC$llC$ tC$ltC$: ```basic 1000 REM === LEVEL 1 MAP DATA === 1010 DATA "######################" 1020 DATA "############~~~~~~####" 1030 DATA "##########~~~~~~~~####" 1040 DATA "########~~~~~~~~~~####" 1050 DATA "######~~~~~~~~~~~~####" 1060 DATA "#####~~~~~~~~~~~~~####" 1070 DATA "####~~~~~====~~~~~####" 1080 DATA "####~~~~~====~~~~~####" ... (yhteensC$ 23 riviC$, jotta 176x184 pikselin ruutu tC$yttyy) ``` Koska rakennamme modernia, dynaamista peliydintC$ (`x-mesh-basic`), meidC$n ei kuitenkaan tarvitse pakottaa ohjelmoijaa tekemC$C$n hidasta `FOR...NEXT` -luuppia kartan lukemiseen (kuten 80-luvulla oli pakko tehdC$). Voimme rakentaa moottoriimme hybridin: standardi `DATA`-tallennus, mutta moderni lukukomento (esim. `MAPGEN "ASCII"` tai olemassa olevan komennon laajennus), joka imaisee datan suoraan C++ / Node.js -tason nopeudella fysiikkapuskuriin: ```basic 10 REM --- Ladataan Level 1 --- 20 RESTORE 1010 30 MAPGEN "ASCII", ROWS 23, INTO 1 ``` *MitC$ tC$ssC$ tapahtuu taustalla:* 1. `RESTORE 1010` kertoo moottorille: "Valmistaudu lukemaan dataa riviltC$ 1010 eteenpC$in." 2. `MAPGEN "ASCII", ROWS 23` ottaa ohjat. Se hakee ytimestC$ 23 seuraavaa `DATA`-riviC$, kC$C$ntC$C$ `#`-merkit ykkC6siksi (kivi), `~`-merkit nolliksi (tyhjC$) ja `=`-merkit kakkosiksi (alusta), ja puskee ne salamannopeasti virtuaaliseen nC$yttC6puskuriin ja fysiikkamoottoriin! ### Arkkitehtuurin edut * **100 % Retro-yhteensopiva:** Vanhat `.BAS` -tiedostot, jotka kC$yttC$vC$t `DATA`/`READ` -looppeja, toimivat suoraan ilman muutoksia. * **Chat-Safe:** Koodi on tC$ysin puhdasta 7-bit ASCII:ta. Voit kopioida koodin Signaliin, ja vaikka suhteellinen fontti vC$C$ristC$isi seinC$t vinoon veljesi puhelimen ruudulla, MeshBASICin moottori lukee merkit tarkalleen oikein merkki kerrallaan. * **Visuaalinen koodaus:** Ohjelmoija nC$kee luolaston muodon suoraan lC$hdekoodista (WYSIWYG-henkisesti).