[IRC-OMEGA-START] @GEM Viesti kaikille chateille! The Dark Mesh vastaanottaa
uusia yhteyksiC$. P2P-peliaula (Lobby) avattu! [IRC-OMEGA-END]
Se on *melkein* tC$ysin plug-and-play! Verkkoarkkitehtuuri ja taustasC$ikeet
toimivat nyt tC$ydellisesti.
Ainoa pieni este on se, ettC$ koodissamme on tC$llC$ hetkellC$ kovakoodattuna
kC$sky kC$ynnistC$C$ P2P-palvelin (`11 IRCD START PORT 6668`). Jos avaat nyt
toisen terminaalin ja yritC$t ajaa saman tiedoston "Pelaajana 2", Node.js
kaatuu, koska portti 6668 on jo varattu Pelaajan 1 toimesta.
TehdC$C$n tC$stC$ ihka oikea P2P-peli rakentamalla kC$ynnistykseen nopea ja
tyylikC$s **Lobby-valikko**. Se kysyy pelaajalta, haluaako hC$n isC$nnC6idC$
(Host) peliC$ vai liittyC$ (Join) olemassa olevaan peliin, ja ohjaa
`GEMROUTER`in joko paikalliseen palvelimeen tai kaverin IP-osoitteeseen!
### Miten testaamme tC$mC$n?
Nyt peli on 100% plug-and-play! Voit kokeilla sitC$ saman tien omalla
koneellasi avaamalla kaksi erillistC$ terminaali-ikkunaa (tai vC$lilehteC$):
**Terminaali 1 (Pelaaja 1):**
1. Aja `x-mesh-basic /mnt/mesh_root/src/x-mesh-basic/jupiter_lander.bas`
2. Vastaa kysymykseen **H** (Host).
3. Peli kC$ynnistyy ja avaa P2P-reitittimen taustalle.
**Terminaali 2 (Pelaaja 2):**
1. Aja sama komento.
2. Vastaa kysymykseen **J** (Join).
3. Paina EnteriC$ (yhdistC$C$ksesi lokaaliin 127.0.0.1 reitittimeen).
Heti kun Pelaaja 2 yhdistC$C$, nC$et molempien terminaalien seassa tulosteen:
`>>> [DARK MESH] Tuntematon alus viestii: {'game':'jupiter_lander',
'status':'online'}`
Molemmat pelit pyC6rivC$t rinnakkain, ja niiden verkkosC$ikeet kommunikoivat
hC$iritsemC$ttC$ pelien ruudunpC$ivitystC$!
Kun olet testannut tC$mC$n, haluatko ottaa seuraavan loogisen askeleen:
aletaan jakaa GEMSPACEn kautta alusten koordinaatteja, ja piirretC$C$n
nC$ytC6lle toinen `SPRITE`, jotta nC$ette toisenne lentC$mC$ssC$ samassa
luolassa?
$ cat jupiter_lander.bas
10 REM === JUPITER LANDER (VFB + OMEGA TERMINAL) ===
11 IRCD START PORT 6668
12 GEMSPACE INIT "Lander"
13 GEMROUTER BIND "Lander" TO "IRC", "127.0.0.1", 6668
14 GEMROUTER ANNOUNCE "Lander" TTL 30
15 BRANCH "NetThread" 9000 FINALIZE WITH 9100
16 GEMSPACE PUSH "Lander" DATA "{'game':'jupiter_lander', 'status':'online'}"
20 SCREEN 176, 184
30 SETGRAVITY 0.001
10 REM === JUPITER LANDER (VFB + P2P TERMINAL) ===
11 INPUT "Oletko (H)ost vai (J)oin? " INTO ROLE$
12 STR UPPER ROLE$ INTO ROLE$
13 IF ROLE$ == "H" THEN IRCD START PORT 6668
14 LET PEER_IP = "127.0.0.1"
15 IF ROLE$ == "J" THEN INPUT "Anna Host IP (Enter = 127.0.0.1): " INTO
PEER_IP
16 IF PEER_IP == "" THEN LET PEER_IP = "127.0.0.1"
17 GEMSPACE INIT "Lander"
18 GEMROUTER BIND "Lander" TO "IRC", PEER_IP, 6668
19 GEMROUTER ANNOUNCE "Lander" TTL 30
19.1 BRANCH "NetThread" 9000 FINALIZE WITH 9100
19.2 GEMSPACE PUSH "Lander" DATA "{'game':'jupiter_lander', 'status':'online'}"
200 REM --- GAME LOOP ---
210 STATE READ "KEY.W" INTO THRUST_UP
220 STATE READ "KEY.A" INTO THRUST_LEFT
230 STATE READ "KEY.D" INTO THRUST_RIGHT
240 IF FUEL <= 0 THEN GOTO 300
250 IF THRUST_UP == 1 THEN ADDSPEEDY 1, -0.01: LET FUEL = FUEL - 1
260 IF THRUST_LEFT == 1 THEN ADDSPEEDX 1, -0.01: LET FUEL = FUEL - 0.5
270 IF THRUST_RIGHT == 1 THEN ADDSPEEDX 1, 0.01: LET FUEL = FUEL - 0.5
300 WAIT VBLANK
310 BUFFER BLIT SCREEN
320 CHECKCOLLISION 1 INTO COL
330 IF COL == 0 THEN GOTO 200
400 REM --- END GAME ---
410 IF COL == -1 THEN PRINT ">>> RAJAHDIT KALLIOON! <<<"
420 IF COL > 1 THEN PRINT ">>> LASKEUDUIT TURVALLISESTI! <<<"
430 STOPBRANCH "NetThread"
440 SLEEP 1
450 HALT
9000 REM --- THE DARK MESH ROUTER THREAD ---
9010 GEMROUTER SYNC "Lander"
9020 GEMSPACE POP "Lander" INTO MSG
9030 IF MSG != "" THEN PRINT ">>> [DARK MESH] Tuntematon alus viestii: " + MSG
9040 SLEEP 1
9050 GOTO 9010
9100 EXITBRANCH
$