Effectivement, les macros sont traitées de manières très aléatoire, d'ou mon post il y a quelques jours dans les suggestions.
Par exemple, une macro utilisant un truc du genre E#M pour EndMacro, comme tout le monde le fait, doit tenir sur une seule ligne, sinon le PB ne détecte pas le EndMacro.
Il y a d'autres problèmes plus subtils, liés aux procédures sur plusieurs lignes, et aux macros, et d'autres encore avec les structures.
En gros c'est le changement de ligne qui génère les problèmes. Je ne sais pas comment c'est codé, mais le traitement doit être fait ligne de code par ligne de code, au lieu de mot par mot.
Bon, il faut faire avec

...
Sinon, comme je l'avais dis à G-Rom, le plus gros ratio de crunch possible doit être au alentour de 1:10
Le code normal de Moonlander fait 475 lignes. Par normal j'entends lisible, commenté, et aéré.
Une autre astuce pour coder : Dès le début utilisez des noms de variables, de macro, de procedure, de structure, reconnaissables.
Du genre : _ma_variable_
Pour pouvoir ensuite les remplacer par une lettre ou 2 lettres, en fonction du nombre de leurs emplois.
@PureCruncher : je passe de 475 lignes à 94

, c'est pas mal !
[EDIT] Version linux de mon moonlander.
Avec l'ajout du compiler IF / ENDIF ca ne tenait plus dans 50 lignes (51 !), du coup je le met à part, pour ceux qui voudraient tester.
En plus de cela, la collision des sprites n'est pas effectuée avec spritepixelcollision() - qui ne fonctionne pas sur linux / mac - , mais avec spritecollision().
code linux / mac
Code : Tout sélectionner
Macro M:Macro:EndMacro:M E:End:End#M:M St:Structure:End#M:M Sp:Sprite:End#M:C.d;
M H:Element:E#M:M Q:#PB_Key_:E#M:M R:Window:E#M:M U:Random:E#M:M Ke:Keyboard:E#M
Init#Sp():M SM:x.d:y.d:a.d:u.d:v.d:m.d:l.d:b.d:E#St:E#M:UsePNGImageDecoder():T.d
St Mo:SM:St Ob:w.d:I.d:List f.Mo():SM:K.Ob:B.Ob:L.Ob:Open#R(0,0,0,800,600,"M",;#
#PB_#R#_ScreenCentered|#PB_#R#_SystemMenu):Open#R#edScreen(R#ID(0),0,0,800,600);
Load#Sp(0,"M.png"):M N:Next:E#M:Init#Ke():x.d:y.d:M CC(i,x,y,k,l,b=2):Copy#Sp(0,
i,4):Clip#Sp(i,x,y,k,l):Zoom#Sp(i,k*b,l*b):E#M:Clip#Sp(0,2,21,55,42):CC(1,61,38,
15,25,1):For i=0 To 9:CC(10+i,80,3+i*6,5,7):N:CC(9,80,9,13,7):CC(6,56,3,25,7);##
CC(7,60,9,21,7):CC(8,1,9,53,9,4):Create#Sp(4,10,10):F.d:Procedure DN(L,x,y):i=0+
Int(Log10(L)):p=Pow(10,i):For j=0 To i:r=Int(L/p):L-r*p:p/10:Display#Sp(10+r,x,;
y):x+8:N:E#Procedure:DB: :NewList S.Ob():Clear#St(L,Ob):Initialize#St(L,Ob):D.d;
L\x=400:L\b=50000000:L\y=300:L\m=1206:L\I=43172:#P=#PI/2:*d.Mo=Add#H(L\f()):CR=0
*g.Mo=Add#H(L\f()):*d\a=0.715743:*d\l=30.479501:*c.Mo=Add#H(L\f()):*d\b=-#P:CS=5
*g\a=2.425849:*g\l=30.4:*g\b=-#P:Initialize#St(K,Ob):*o.Mo=Add#H(K\f()):*c\b=-#P
M El:ElapsedMilliseconds():E#M:K\x=-10:K\y=300:*c\m=0:*c\a=#P:*o\m=50:Ke#Mode(1)
CB=50:*c\l=5:*o\a=0:*o\l=300:ti=El:Repeat:*d\m=0:*g\m=0:Z.d=(El-ti)/1000:*c\m=0;
Repeat:EV=R#Event():If EV=#PB_Event_Close#R:E:E#If:Until EV=0:Examine#Ke():ti=El
If Ke#Pushed(Q#Escape):E:E#If:If CR:Z=0:If Ke#Pushed(Q#Space):Goto DB:E#If:Else;
If Ke#Pushed(Q#Up):*d\m=10000:*g\m=10000:D=0:E#If:If Ke#Pushed(Q#Left):*d\m+5000
E#If:A.d=0:If Ke#Pushed(Q#Right):*g\m+5000:E#If:If Ke#Pushed(Q#Down):*c\m=50000;
E#If:E#If:C=0:CT+1:ForEach L\f():*m.Mo=L\f():L\b-*m\m:If L\b<0:L\b=0:Break:E#If;
T=L\a+*m\a:*m\x=*m\l*Cos(T):G.d:*m\y=*m\l*Sin(T):T=L\a+*m\b:*m\u=*m\m*Cos(T);###
*m\v=*m\m*Sin(T):D+*m\x**m\v-*m\u**m\y:A+*m\u:C+*m\v:N:A/L\m:C/L\m+10:D/L\I:L\u+
A*Z:L\v+C*Z:L\w+D*Z:L\a+L\w*Z:T=L\u*Z:B\x-T:K\x-T:T=L\v*Z:B\y-T:ClearScreen(0);#
K\y-T:Rotate#Sp(0,L\a*90/#P,0):DisplayTransparent#Sp(0,L\x-27,L\y-21):Grab#Sp(2,
L\x-34,L\y-34,68,68,4):ClearScreen($FFFFFF):Repeat:If F>=-200 And F<=1000 And;##
G>=-200 And G<=800:x1.d:*e.Mo=Add#H(K\f()):*e\a=*o\a+(U(20)-10)/#P/20:*e\l=*o\l+
U(20)-10:If *e\l<100:*e\l=100:E#If:If *e\l>400:*e\l=400:E#If:CB-1:CS-1:*e\m=0+;#
U(20)+40:*e=*o:E#If:F=K\x:G=K\y:ForEach K\f():T=K\f()\a+#P:x=F+K\f()\l*Cos(T)/2;
y=G+K\f()\l*Sin(T)/2:T=K\f()\a-#P:x1=F+K\f()\l*Cos(T)/2:F+K\f()\m*Cos(K\f()\a);#
y1.d=G+K\f()\l*Sin(T)/2:G+K\f()\m*Sin(K\f()\a):If ListIndex(K\f())>0;###########
Transform#Sp(4,x1,y,ox.d,y-oy1.d+y1,J.d,y-oy.d+y1,x.d,y1):E#If:Display#Sp(4,0,0)
ox=x:oy=y:J=x1:oy1=y1:N:If CB<0:CB=30:T=K\f()\l-60:T=(U(T)-T/2):B\x=F+T*Cos(#P+;
K\f()\a):B\y=G+T*Sin(K\f()\a+#P):B\l=1:E#If:If CS<0:CS=5:Last#H(S()):Add#H(S());
T=K\f()\l-60:T=(U(T)-T/2):S()\x=F+T*Cos(K\f()\a+#P):S()\y=G+T*Sin(K\f()\a+#P);##
S()\v=100*Abs(T)/(K\f()\l/2-50):S()\l=1:E#If:If ListSize(K\f())>40;#############
First#H(K\f()):K\x=K\x+K\f()\m*Cos(K\f()\a):K\y=K\y+K\f()\m*Sin(K\f()\a);#######
Delete#H(K\f()):*o=Last#H(K\f()):E#If:Until F<-200 Or F>1000 Or G<-200 Or G>800;
StartDrawing(ScreenOutput()):For i=0 To 15:T=i*2*#PI/15:If Point(400+22*Cos(T),;
300+22*Sin(T)):CR=1:E#If:Next:If Point(400+34*Cos(0.64+L\a),300+34*Sin(0.64+;###
L\a)) Or Point(400+34*Cos(2.5+L\a),300+34*Sin(2.5+L\a)):CR=1:E#If:If L\b:;######
ForEach L\f():For i=-5 To 5:T=L\a+L\f()\b+i/10:LineXY(L\x+L\f()\x,L\y+L\f()\y,;#
L\x+L\f()\x-L\f()\m*Cos(T)/500,L\y+L\f()\y-L\f()\m*Sin(T)/500,$88FF):N:N:E#If:;#
StopDrawing():DisplayTransparent#Sp(2,L\x-34,L\y-34):If B\l:If Sp#Collision(1,;#
B\x-7,B\y-12,2,L\x-34,L\y-34):L\b+25000000:B\l=0:E#If:DisplayTransparent#Sp(1,;#
B\x-7,B\y-12):E#If:ForEach S():S()\x-L\u*Z:S()\y-L\v*Z:If S()\l:;###############
If Sp#Collision(9,S()\x-6,S()\y-3,2,L\x-34,L\y-34):S()\l=0:L\l+S()\v:E#If;######
DN(S()\v,S()\x-6,S()\y-3):E#If:N:Display#Sp(6,352,5):DN(L\l,400,5);#############
Display#Sp(7,360,19):DN(L\b/5000,400,19):If CR And CT%50<30:Display#Sp(8,294,;##
282):E#If:FlipBuffers():ForEver;#PURE#PUNCH##AOUT#2014###MOONLANDER#BY#GRAPH100#