[ Atari / Punchs / Source : laby3d.lst ]

[ << ]

 Code source 

01DIM x%(3),y%(3),scr%(8064)
02x$="0A192E31585EDAE9312E5E58535E2D3158630A532D2D636395A0312D6358A0E92D2D636353A02D2D63634553282D63710A4528287171A0AE2D287163AEE928
28717145AE2828717129451F28718D0A291F1F8D8DAECA281F8D71CAE91F1F8D8D29CA1F1F8D8D0A29141F8DACCAE91F14AC8D"
03FOR i%=0*XBIOS(7,0,0)*XBIOS(7,15,&H226)*XBIOS(7,1,&H555)*XBIOS(7,2,&H444)*XBIOS(7,4,&H333)*XBIOS(7,6,&H222)*XBIOS(7,3,&H112)*XBIOS(7,5,2)*XBIOS(7,7,&H770) TO 1023
04  DRAW "MA",245+2*MOD(i%,32),68+2*SHR(i%,5),"CO",-7*(i%<32 OR i%>991 OR MOD(i%+1,32)<2 OR (ODD(MOD(i%,32)*SHR(i%,5)) AND RND>0.25) OR (ODD(MOD(i%,32)+SHR(i%,5)) AND RND>0.5)),"TT90FD1RT90FD1RT90FD1"
05  p$=p$+MKL$(VAL("&"+MID$("0AE91414ACAC0AE931315858"+x$,(6*SHR(i%,3)+VAL(MID$("01102345",1+MOD(i%,8),1)))*2+1,2)))
06NEXT i%
07FILL 277,100
08BMOVE XBIOS(2)+FRE(0)*0*XBIOS(5,L:SHL(SHR(V:scr%(0)+256,8),8),L:-1,W:-1),XBIOS(3),32000
09FOR i%=0 TO 99999
10  p%=CARD(p%)+32*(BYTE(k%)=1 AND @e(9,0))-(BYTE(k%)=2 AND @e(12,0))-32*(BYTE(k%)=3 AND @e(9,2))+(BYTE(k%)=4 AND @e(11,0))+SHL(MOD(SHR(p%,16)-3*(BYTE(k%)=5)-(BYTE(k%)=6),4),16)-528*(p%=0)
11  DRAW "MA",245+2*MOD(SHR(k%,18),32),68+2*SHR(k%,23),"CO",7+6*(i%>1),"TT90FD1RT90FD1RT90FD1MA",245+2*MOD(CARD(p%),32),68+2*SHR(CARD(p%),5),"CO8TT90FD1RT90FD1RT90FD1"
12  FOR j%=0 TO 20
13    BMOVE V:p$+32*j%,V:x%(0),16
14    BMOVE V:p$+32*j%+16,V:y%(0),16
15    DEFFILL VAL(MID$("605554544434333232222",j%+1,1))
16    POLYFILL -4*(j%<2 OR NOT @e(VAL("&"+MID$("0004113325577688AA9BC",j%+1,1)),SHR(p%,16))),x%(),y%()
17  NEXT j%
18  k%=AND(SHL(k%,10),&HFFC0000)+SHL(CARD(p%),8)+VAL(MID$("0123456023415603412560412356",SHR(p%,16)*7+VAL(MID$("17211513114161",MIN(14,MAX(1,INP(2+0*XBIOS(5,L:XBIOS(2),L:XBIOS(3),W:-1))-197)),1)),1))
19NEXT i%
20DEFFN e(n%,d%)=(POINT(245+2*(MOD(CARD(p%),32)+VAL(MID$("1234523423424666665554443354321432432420000011122233",1+d%*13+n%,1))-3),68+2*(SHR(CARD(p%),5)+VAL(MID$("0000011122233123452342342466666555444335432143243242",1+d%*13+n%,1))-3))<>7)


 Quelques explications 

[ Lignes 1 à 8 : phase d'initialisation ]
Ligne 1 : les tableaux x%() et y%() serviront à dessiner les polygones (avec l'instruction 'Polyfill') ; le tableau scr%() permet simplement de réserver l'espace mémoire nécessaire à la gestion d'un 2ème écran logique
Ligne 2 : la chaîne x$ contient les coordonnées des polygones en héxa ; chaque polygone est codé sur 6 octets, au format x1 x2 y1 y2 y3 y4
Lignes 3 à 6 : on dessine le plan avec un 'Draw', et on recode les coordonnées des polygones dans la chaîne p$, sous une forme exploitable
Ligne 7 : un 'Fill' pour faire apparaître les cases accessibles
Ligne 8 : allocation et initialisation du 2ème écran

[ Lignes 9 à 19 : boucle principale ]
Ligne 10 : mise à jour de la variable p%, qui contient la position et la direction courantes
Ligne 11 : affichage de la position sur le plan (précédé de l'effacement de la position antérieure)
Lignes 12 à 17 : boucle d'affichage des polygones ; les tableaux x%() et y%() sont remplis à partir de la chaîne p$ calculée plus haut
Ligne 18 : mise à jour de la variable k%, qui contient la touche frappée et une sauvegarde des deux dernières positions (pour la mise à jour du plan) ; au passage, on permute les écrans pour provoquer l'affichage

[ Ligne 20 : fonction e(n%,d%) ]
cette fonction permet de savoir si une case est vide en testant sa couleur sur le plan (n% = numéro du mur et d% = direction)