// Pacman - Feb 03 - by Sylvain Huet // Metal var srcfile="pacmansrc.gif";; var digitfile="digit.bmp";; var srcbord="bord.bmp";; var highscorefile="score.txt";; var NBSCORE=8;; var highscore;; var TITLEDELAY=200;; var win;; var background;; var black;; var pacmansrc;; var pacmanbord;; var pacmansize=24;; var width=616;; var height=418;; var color=0;; var orientation;; var font;; var title=1;; var vies;; var tableau;; var score=0;; var laby;; var toeat;; var spacman;; var lastkey;; var dirwanted;; var clockcaneat;; var clockfruit;; var compte;; var tour;; var xp0;; var yp0;; var xm;; var ym;; var delta;; var statefin;; var count2;; var ytext=391;; type State= initGame | initTab | waitPlay | initPlay | doPlay | erasePlay |drawTitle|waitMainmenu |pausePlay|promptMenu|promptRefreshMenu;; var state;; // gestion des sprites type Sprite=[moveSprite typeSprite bmpSprite xSprite ySprite dirSprite stateSprite waitSprite enableSprite];; var lsprites;; var t_back;; var t_sprite;; var t_digit;; var t_titleback;; var t_titlefore;; var klight=1.;; var tbcolor={[1. 0.75 0. 0. 0. 0.] [0. 0. 1. 0. 1. 1.] [0. 1. 0. 0. 0. 0.] [0.8 0.8 0.8 0. 0. 0.] };; fun scoreToS s=strright strcat "00000000" itoa s 8;; fun _rank l i s= if i(_::score::_) in if s>atoi score then i else _rank tl l i+1 s;; fun rank s= if s then _rank highscore 0 s;; fun insertscore l pseudo s= if l==nil then (pseudo::(scoreToS s)::nil)::nil else let hd l->(_::score::_) in if s>atoi score then (pseudo::(scoreToS s)::nil)::l else (hd l)::insertscore tl l pseudo s;; fun updatetexture t bmp= bitmapGrayToAlpha bmp 0 0 bmp 0 0 bitmapW bmp bitmapH bmp; glBindTexture GL_TEXTURE_2D t ; glTexImage2D t GL_TEXTURE_2D 0 GL_RGBA 0 bmp; 0;; fun loadtexture bmp linear= let glGenTextures-> t in ( glBindTexture GL_TEXTURE_2D t ; glTexParameteri GL_TEXTURE_2D GL_TEXTURE_MAG_FILTER if linear then GL_LINEAR else GL_NEAREST; glTexParameteri GL_TEXTURE_2D GL_TEXTURE_MIN_FILTER GL_NEAREST; glTexParameteri GL_TEXTURE_2D GL_TEXTURE_WRAP_S GL_REPEAT; glTexParameteri GL_TEXTURE_2D GL_TEXTURE_WRAP_T GL_REPEAT; updatetexture t bmp; glEnable GL_TEXTURE_2D ; t );; var spriteVrt={0. 0. 24. 0. 0. 24. 24. 24.};; var spriteTxt;; var backVrt={ 0. 0. itof width 0. 0. itof height itof width itof height};; var backTxt={ 0. 0. (itof width)/.1024. 0. 0. (itof height)/.512. (itof width)/.1024. (itof height)/.512.};; var digitVrt={0. 0. 14. 0. 0. 16. 14. 16.};; var digitTxt;; var squareColors={ 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.};; var lback;; var tback;; var tborder;; fun initproj inv= let windowW win -> w in let windowH win -> h in ( glViewport 0 0 w h; glMatrixMode GL_PROJECTION; glLoadIdentity; glOrtho 0. itof w itof h 0. 0. 1.; glMatrixMode GL_MODELVIEW; glLoadIdentity; if width>w ||height>h then ( glTranslatef itof (w-width/2)/2 itof (h-height/2)/2 0.; glScalef 0.5 0.5 1. ) else glTranslatef itof (w-width)/2 itof (h-height)/2 0. );; fun _initsprite i= if i<27 then {0. (itof i*24)/.1024. 24./.32. (itof i*24)/.1024. 0. (itof (i+1)*24)/.1024. 24./.32. (itof (i+1)*24)/.1024. }::_initsprite i+1;; fun initsprite= set t_sprite=loadtexture bitmapFromFile srcfile 1; set spriteTxt= listtotab _initsprite 0;; fun _initdigit i= if i<11 then {(itof i*14)/.256. 0. (itof (i+1)*14)/.256. 0. (itof i*14)/.256. 1. (itof (i+1)*14)/.256. 1. }::_initdigit i+1;; fun initdigit= set t_digit=loadtexture bitmapFromFile digitfile 1; set digitTxt= listtotab _initdigit 0;; fun drawback= glVertexPointer 2 backVrt; glEnableClientState GL_VERTEX_ARRAY; glTexCoordPointer backTxt; glEnableClientState GL_TEXTURE_COORD_ARRAY; glDrawArrays GL_TRIANGLE_STRIP 0 4; glDisableClientState GL_VERTEX_ARRAY; glDisableClientState GL_TEXTURE_COORD_ARRAY;; fun eraseback x y= let x+8 -> x in let y+8 -> y in set lback=(itof x)::(itof y)::(itof x+8)::(itof y)::(itof x)::(itof y+8)::(itof x)::(itof y+8)::(itof x+8)::(itof y+8)::(itof x+8)::(itof y)::lback; set tback=listtotab lback;; fun eraseini= set tback=nil; set lback=nil; let itof width -> w in let 392. -> h in set tborder={(-24.) (-24.) (0.) (0.) (w+.24.) (-24.) (w) (0.) (w+.24.) (h+.24.) (w) (h) (-24.) (h+.24.) (0.) (h) (-24.) (-24.) (0.) (0.)};; fun erasedraw= glVertexPointer 2 tback; glEnableClientState GL_VERTEX_ARRAY; glDrawArrays GL_TRIANGLES 0 (tablen tback)/2; 0;; fun eraseborder= glVertexPointer 2 tborder; glEnableClientState GL_VERTEX_ARRAY; glDrawArrays GL_TRIANGLE_STRIP 0 (tablen tborder)/2; 0;; fun drawscreen w= initproj 0; if orientationGet!=orientation then ( set orientation=orientationGet; set color=orientation ); let tbcolor.color->[rf gf bf rb gb bb] in ( glClearColor rb gb bb 0.; glClear GL_COLOR_BUFFER_BIT; glEnable GL_BLEND ; glBlendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA ; glEnable GL_LIGHTING; glLightModelfv GL_LIGHT_MODEL_AMBIENT 1. 1. 1. 1.; glMaterialfv GL_FRONT_AND_BACK GL_AMBIENT rf*.klight+.(1.-.klight)*.rb gf*.klight+.(1.-.klight)*.gb bf*.klight+.(1.-.klight)*.bb 1.; glBindTexture GL_TEXTURE_2D t_back ; drawback; glDisable GL_LIGHTING; glDisable GL_TEXTURE_2D ; glColor4f rb gb bb 1.; erasedraw; glEnable GL_LIGHTING; glEnable GL_TEXTURE_2D ; if title then ( glLightModelfv GL_LIGHT_MODEL_AMBIENT 1. 1. 1. 1.; glMaterialfv GL_FRONT_AND_BACK GL_AMBIENT rb gb bb 1.; glBindTexture GL_TEXTURE_2D t_titleback ; drawback; glMaterialfv GL_FRONT_AND_BACK GL_AMBIENT rf gf bf 1.; glBindTexture GL_TEXTURE_2D t_titlefore ; drawback ); glBindTexture GL_TEXTURE_2D t_sprite ; for l=lsprites do let hd l -> x in if x.enableSprite then ( glPushMatrix; glTranslatef itof x.xSprite itof x.ySprite 0.; glVertexPointer 2 spriteVrt; glEnableClientState GL_VERTEX_ARRAY; glTexCoordPointer spriteTxt.(x.bmpSprite); glEnableClientState GL_TEXTURE_COORD_ARRAY; glDrawArrays GL_TRIANGLE_STRIP 0 4; glDisableClientState GL_VERTEX_ARRAY; glDisableClientState GL_TEXTURE_COORD_ARRAY; glPopMatrix ); glDisable GL_LIGHTING; glDisable GL_TEXTURE_2D ; glColor4f rb gb bb 1.; eraseborder; glEnable GL_LIGHTING; glEnable GL_TEXTURE_2D ; glBindTexture GL_TEXTURE_2D t_digit ; let scoreToS score -> s in for i=0;i<8 do let (strnthchar s i)-48 -> v in ( glPushMatrix; glTranslatef itof 120+i*14 itof ytext 0.; glVertexPointer 2 digitVrt; glEnableClientState GL_VERTEX_ARRAY; glTexCoordPointer digitTxt.(v); glEnableClientState GL_TEXTURE_COORD_ARRAY; glDrawArrays GL_TRIANGLE_STRIP 0 4; glDisableClientState GL_VERTEX_ARRAY; glDisableClientState GL_TEXTURE_COORD_ARRAY; glPopMatrix ); for i=0;i newsprite in ( set lsprites=newsprite::lsprites; newsprite );; // Initialisation du fond var nbtableau=4;; var decors= [ {0x2aaa 0xaeaa 0xaaaa 0xaaea 0xaaa8 0x682a 0x8142 0xaaaa 0x8412 0xa82c 0x52a8 0x4438 0x2aa8 0x2944 0x2a85 0x5442 0xd542 0xac6a 0x8457 0x8445 0x553c 0x157a 0x8112 0xad51 0x6955 0x53c5 0x2912 0xc6c6 0x8138 0x5695 0x5455 0x2aac 0x1391 0x6aa8 0x5545 0x5515 0x6ac1 0x2aa8 0x16ac 0x5155 0x53c1 0x1452 0xa82a 0x8541 0x1695 0x5452 0xa938 0x2aa8 0x293a 0x8545 0x5116 0xac6a 0xa82a 0xac6a 0xc115 0x3829 0x4112 0xaaaa 0x8114 0x3829 0x2aaa 0xbaaa 0xaaaa 0xaaab 0xaaa8} {9 0 9 11 1 6 17 6} [9*32+8 9*32+8 9*32+8 5*32+8] ]:: [ {0x6aaa 0xeaaa 0xac6a 0xaaae 0xaaac 0x56a8 0x12aa 0x8112 0xaa81 0x2ac5 0x516a 0x82ea 0x8442 0xae82 0xac15 0x52d2 0x8456 0xa93a 0xc542 0x8785 0x5416 0xa915 0x6aac 0x513a 0xc145 0x5141 0x2a81 0x16c1 0x12a8 0x1415 0x3838 0x2ae8 0x4394 0x2ea8 0x2929 0x682a 0xa854 0x3aa9 0x452a 0xa82c 0x542a 0xac13 0xaaaa 0x916a 0xa845 0x5544 0x412a 0xa82a 0xa814 0x4455 0x5515 0x3aa8 0x2aa8 0x2aa9 0x5155 0x5383 0x842a 0x8442 0xa842 0x9295 0x3aaa 0xabaa 0xa93a 0xaaba 0xaaa9} {0 0 18 0 0 11 18 11} [9*32+8 9*32+8 9*32+8 5*32+8] ]:: [ {0x6aaa 0xac6a 0xaaaa 0xac6a 0xaaac 0x56ac 0x4510 0x6aac 0x0154 0x6ac5 0x5141 0x5142 0x9443 0x8415 0x1415 0x5414 0x383a 0x8552 0xa929 0x4145 0x53a9 0x2ac4 0x693c 0x46a8 0x3a95 0x56a8 0x6815 0x16c1 0x512c 0x2ac5 0x552a 0x9429 0x4394 0x3843 0xa855 0x53ea 0x852a 0xb82b 0xa852 0xae95 0x5414 0x2928 0x2aa8 0x2838 0x4145 0x5783 0xaea8 0x682c 0x2aea 0x92d5 0x5528 0x4142 0x9283 0x8414 0x2855 0x5382 0x9452 0xa82a 0x8543 0x8295 0x3aaa 0xa93a 0xaaaa 0xa93a 0xaaa9} {1 1 17 1 1 10 17 10} [9*32+8 8*32+8 9*32+8 5*32+8] ]:: [ {0x6aaa 0xaaaa 0xc6aa 0xaaea 0xaaac 0x5684 0x42a8 0x5142 0xa852 0xc285 0x5529 0x3aa8 0x52d6 0xa854 0x3a85 0x512a 0x82ac 0x1415 0x6815 0x6a85 0x56a8 0x46c1 0x4141 0x52c1 0x56ad 0x512a 0xd394 0x12b8 0x1414 0x5145 0x7aac 0x12a9 0x4442 0xc785 0x1415 0x5283 0xa842 0x9538 0x5147 0x8385 0x3c6a 0x8294 0x2bc2 0xb851 0x2c29 0x4516 0xa82b 0xa812 0xe83a 0xc544 0x5141 0x6a84 0x2a84 0x16a8 0x1155 0x52b8 0x12a9 0x6a85 0x292a 0x8415 0x3aaa 0xaaaa 0x92ab 0xaaaa 0xaba9} {1 1 17 1 0 7 13 10} [10*32+8 6*32+8 5*32+8 4*32+8] ]::nil ;; fun inimurs = let newtab 19 nil -> t in ( for i=0;i<19 do set t.i=newtab 12 0; t );; fun drawdecors bmp d m0= let if m0!=nil then m0 else inimurs -> m in let d->[murs pastille position] in ( bitmapErase bmp 0; for i=0;i<13 do for j=0;j<5 do let murs.(i*5+j) -> p in for k=0;k<4 do let (j*4+k)*32 -> x in let i*32 -> y in let (j*4+k) -> xc in let i -> yc in let p>>((3-k)*4) -> q in ( bitmapToBitmap bmp x y pacmanbord 0 (q&15)*8 8 8 nil; if q&1 then ( if xc&&yc then set m.(xc-1).(yc-1)=m.(xc-1).(yc-1)|1 ); if q&2 then ( bitmapToBitmap bmp x+8 y pacmanbord 0 10*8 8 8 nil; bitmapToBitmap bmp x+16 y pacmanbord 0 10*8 8 8 nil; bitmapToBitmap bmp x+24 y pacmanbord 0 10*8 8 8 nil; if xc<19 && yc<12 then set m.(xc).(yc)=m.(xc).(yc)|8 ); if q&4 then ( bitmapToBitmap bmp x y+8 pacmanbord 0 5*8 8 8 nil; bitmapToBitmap bmp x y+16 pacmanbord 0 5*8 8 8 nil; bitmapToBitmap bmp x y+24 pacmanbord 0 5*8 8 8 nil; if xc<19 && yc<19 then set m.(xc).(yc)=m.(xc).(yc)|4 ); if q&8 then ( if xc&&yc then set m.(xc-1).(yc-1)=m.(xc-1).(yc-1)|2 ) ); for i=0;i<4 do let pastille.(i*2) -> x in let pastille.(i*2+1) -> y in if m0==nil || m.(x).(y)&32 then ( bitmapToBitmap bmp x*32+16 y*32+16 pacmanbord 0 18*8 8 8 nil; set m.(x).(y)=m.(x).(y)|32 ); for y=0;y<12 do for x=0;x<19 do if (m0==nil && !((m.(x).(y))&32)) || m.(x).(y)&16 then ( bitmapToBitmap bmp x*32+16 y*32+16 pacmanbord 0 17*8 8 8 nil; set m.(x).(y)=m.(x).(y)|16 ); let position ->[xp yp xm ym] in ( bitmapToBitmap bmp xm ym black 0 0 nil nil nil; set t_back=loadtexture bmp 1; [m xp yp xm ym] ) );; fun destroy win= exitandkill ; 0;; // gestion de l'automate fun addscore x= set score=score+x;; var pseudo="AB";; // fonction de menu fun drawprompt bmp carret= bitmapErase bmp 0; bitmapCircleF bmp width/2-250 70 500 270 0xffffff; bitmapBoxF bmp 0 0 nil nil 0; bitmapText bmp width/2 80 ALIGN_CENTER "HIGHSCORE !!!" font 0xffffff nil; bitmapText bmp width/2 120 ALIGN_CENTER strcat "score " scoreToS score font 0xffffff nil; bitmapText bmp width/2 140 ALIGN_CENTER strcat "Rank #" itoa 1+rank score font 0xffffff nil; let if carret then strcat pseudo "*" else pseudo -> pseudo in let if (strlen pseudo)<8 then strleft strcat pseudo "--------" 8 else pseudo -> pseudo in bitmapText bmp width/2-14*4 180 0 pseudo font 0xffffff nil; 0;; fun drawtitle1 bmp= bitmapErase bmp 0; bitmapCircleF bmp width/2-250 70 500 270 0xffffff; bitmapBoxF bmp 0 0 nil nil 0; bitmapText bmp width/2 100 ALIGN_CENTER "HIGHSCORES" font 0xffffff nil; for i=0;i(name::score::_) in let if name==nil then "--------" else name -> name in let if score==nil then "--------" else score -> score in let 140+i*20 -> y in ( bitmapText bmp width/2-160 y 0 strcat itoa i+1 "." font 0xffffff nil; bitmapText bmp width/2-98 y 0 name font 0xffffff nil; bitmapText bmp width/2+48 y 0 score font 0xffffff nil ); 0;; fun drawtitle0 bmp= bitmapErase bmp 0; bitmapCircleF bmp width/2-250 70 500 270 0xffffff; bitmapBoxF bmp 0 0 nil nil 0; bitmapCircleF bmp 98 140 60 60 0xffffff; bitmapBoxF bmp 98 140 30 60 0xffffff; bitmapFlatPoly bmp [188 140]::[218 199]::[158 199]::nil 0xffffff; bitmapCircleF bmp 218 140 60 60 0xffffff; bitmapBoxF bmp 218 140 30 60 0xffffff; bitmapBoxF bmp 288 165 20 10 0xffffff; bitmapFlatPoly bmp [338 140]::[338 199]::[360 199]::[368 150]::nil 0xffffff; bitmapFlatPoly bmp [376 199]::[398 199]::[398 140]::[368 150]::nil 0xffffff; bitmapFlatPoly bmp [360 196]::[368 199]::[376 196]::[368 150]::nil 0xffffff; bitmapFlatPoly bmp [428 140]::[458 199]::[398 199]::nil 0xffffff; bitmapFlatPoly bmp [458 140]::[458 199]::[480 199]::[496 144]::nil 0xffffff; bitmapFlatPoly bmp [480 196]::[518 199]::[518 140]::[496 140]::nil 0xffffff; bitmapCircleF bmp 116 165 16 12 0; bitmapCircleF bmp 180 179 16 12 0; bitmapCircleF bmp 236 165 16 12 0; bitmapCircleF bmp 420 179 16 12 0; bitmapText bmp width/2 210 ALIGN_CENTER "only for dads ?" font 0xffffff nil; if (!strcmp platform "ios")||(!strcmp platform "android") then ( bitmapText bmp width/2 260 ALIGN_CENTER "rotate to select color" font 0xffffff nil; bitmapText bmp width/2 280 ALIGN_CENTER "swipe to move" font 0xffffff nil ) else ( bitmapText bmp width/2 240 ALIGN_CENTER "Arrows/A/Q/S to move" font 0xffffff nil; bitmapText bmp width/2 260 ALIGN_CENTER "C to change color - P to pause" font 0xffffff nil; bitmapText bmp width/2 280 ALIGN_CENTER "press 'Space' to start" font 0xffffff nil ); 0;; fun drawtitle bmp= bitmapErase bmp 0; bitmapCircleF bmp width/2-250 70 500 270 0xffffff; set t_titleback=loadtexture bmp 1; drawtitle0 bmp; set t_titlefore=loadtexture bmp 1; 0;; // fonctions de déplacement fun getdirkey k= if k==27 then -1 else let 4*(k=='A')+4*(k=='Q')+4*(k==XK_Up)+3*(k==XK_Left)+2*(k=='S')+2*(k==XK_Down)+(k==XK_Right) +4*(k=='a')+4*(k=='q')+2*(k=='s') -> d in if d then d-1 else -1000;; fun possible x y k = if (laby.(x).(y))&(1< k in if s.stateSprite==0 then let (((s.xSprite-8)&31)>>3)+(((s.ySprite-8)&31)>>3) -> nn in (if nn==3 then 1 else nn)+k*3 else if s.stateSprite==1 then if clockcaneat&&(clockcaneat>200||clockcaneat&16) then 16+k else 12+k else if s.stateSprite==2 then 20+k else s.bmpSprite;; fun moveob s d= let s.dirSprite -> k in ( set s.xSprite=modulo s.xSprite+d*((k==0)-(k==2)) (-23) 640-d; set s.ySprite=modulo s.ySprite+d*((k==1)-(k==3)) (-23) 416-d; set s.bmpSprite=whichsprite s );; fun movepac s= let getdirkey lastkey -> k in ( if k==-1 then set statefin=-1; if k>=0 then set dirwanted=k; let s.xSprite -> x in let s.ySprite-> y in if x&31==8 && y&31==8 then let x>>5 ->xx in let y>>5->yy in let laby.(xx).(yy)-> case in ( set s.dirSprite= if dirwanted>=0 && possible xx yy dirwanted then dirwanted else if !possible xx yy s.dirSprite then -1 else s.dirSprite; if case&0x30 then ( if case&0x20 then ( addscore 2000; set clockcaneat=600 ) else ( addscore 100; set toeat=toeat-1; if !toeat then set statefin=-3; 0 ); eraseback x y; set laby.(xx).(yy)=case&0xffcf ) ) else if dirwanted==(2+s.dirSprite)&3 then set s.dirSprite=dirwanted ); if s.dirSprite!=-1 then moveob s 2; 0;; fun findbest l x y cangohome= let hd l ->[r _] in if (possible x>>5 y>>5 r) || (cangohome && (x+32*((r==0)-(r==2))==xm) &&(y+32*((r==1)-(r==3))==ym) ) then r else findbest tl l x y cangohome;; fun strategie s dx dy= if s.stateSprite==1 then if s.typeSprite==1 then [dx dy] else if s.typeSprite==2 then [dx<<3 dy] else if s.typeSprite==3 then [dx dy<<3] else if dx*dy>0 then [dy dx] else [-dy (-dx)] else [dx dy];; fun addsorted d val worse l= if l==nil then [d if d==worse then -10000 else val]::nil else let hd l ->[_ v] in if d!=worse && val>=v then [d val]::l else (hd l)::addsorted d val worse tl l;; fun iafant s dx dy = let strategie s dx dy ->[dx dy] in let ((2+s.dirSprite)&3) -> worse in let addsorted 0 dx worse addsorted 1 dy worse addsorted 2 (-dx) worse addsorted 3 (-dy) worse nil -> l in findbest l s.xSprite s.ySprite s.stateSprite>=2;; fun movefant s= let spacman.xSprite -> px in let spacman.ySprite-> py in let s.stateSprite -> r in if s.waitSprite then set s.waitSprite=s.waitSprite-1 else if (r==2) ||((r==1)&&(!clockcaneat)&&((s.typeSprite!=compte+1)||(s.typeSprite x in let s.ySprite-> y in ( if x&31==8 && y&31==8 &&(x!=xm||y!=ym) then set s.dirSprite= if s.stateSprite==1 then if clockcaneat then iafant s x-px y-py else iafant s px-x py-y else iafant s xm-x ym-y; moveob s 2; if (s.xSprite==xm)&&(s.ySprite==ym) then ( set s.stateSprite=1; set s.waitSprite=if clockcaneat then -1 else s.typeSprite*20 ) ); 0;; fun movefr s= if compte&1 then let s.xSprite -> x in let s.ySprite-> y in ( if x&31==8 && y&31==8 &&(x!=xm||y!=ym) then if s.waitSprite then let nil->k in ( while (set k=rand&3)==(s.dirSprite+2)&3 || ! possible x>>5 y>>5 k do nil; set s.waitSprite=s.waitSprite-1; set s.dirSprite=k ) else set s.dirSprite=iafant s xm-x ym-y; moveob s 1 /* ; if s.xSprite==xm && s.ySprite==ym then ( set lsprites=tl lsprites; set clockfruit=600 ) */ );; fun test= let spacman.xSprite -> x in let spacman.ySprite-> y in for l=lsprites;l!=nil;tl l do let hd l -> s in if s.typeSprite then let s.stateSprite -> k in if (k==1)||(k==3) then let s.xSprite-x -> fx in let s.ySprite-y-> fy in if fx<16&&fx>-16&&fy<16&&fy>-16 then if k==3 then ( addscore 10000; set lsprites=tl lsprites; set clockfruit=600; 0 ) else if clockcaneat then ( addscore if clockcaneat>200 then 5000 else 10000; set s.stateSprite=2 ) else set statefin=-2;; fun timer= set compte=(compte+1)&3; if clockcaneat then ( set clockcaneat=clockcaneat-1; if !clockcaneat then for l=lsprites;l!=nil;tl l do let hd l -> s in if s.waitSprite<0 then set s.waitSprite=s.typeSprite*20 ); if clockfruit then if set clockfruit=clockfruit-1 then nil else addSprite #movefr 5 xm ym 24+tableau&1 rand&3 3 15;; fun keydown win virt= match state with ( promptMenu -> Iecholn virt; if virt==8 then set pseudo=strleft pseudo (strlen pseudo)-1 else if virt>=32 && virt<256 && (strlen pseudo)<8 then set pseudo=strcat pseudo ctoa virt; if virt==13 ||virt==10 then ( if strlen pseudo then ( set highscore=insertscore highscore pseudo score; save wordbuild highscore strcat userdir highscorefile ); set title=TITLEDELAY; set state=waitMainmenu; keyboardHide; nil ) else ( set title=32; drawprompt background title&32; set state=promptRefreshMenu ); nil ) |(_ -> set lastkey=virt; if virt=='c' || virt=='C' then set color=(color+1)%tablen tbcolor; if virt=='P' || virt=='p' then match state with ( doPlay -> set state=pausePlay ) | ( pausePlay -> set state=doPlay ) ); 0;; fun keyup win virt= if virt==lastkey then set lastkey=0;; var pdx;; var pdy;; var pdir;; var pcount;; var pfant;; fun inipresent = set lsprites=nil; let rand&3 -> dir in let rand&1 -> stage in let if dir==0 then [(-24) (rand%12)*32+8 (-32) 0 2 0 width] else if dir==1 then [(rand%19)*32+8 (-24) 0 (-32) 0 2 height] else if dir==2 then [(width) (rand%12)*32+8 (32) 0 (-2) 0 width] else [(rand%19)*32+8 (height) 0 (32) 0 (-2) height] -> [x y offx offy dx dy count] in let if stage then 4 else 0 -> ipac in ( for i=0;i<5 do addSprite nil i!=ipac x+i*offx y+i*offy 12 0 0 0; for l=lsprites do let hd l-> p in set p.enableSprite=0; set pdx=dx; set pdy=dy; set pdir=dir; set pcount=count; set pfant=12+stage*4 ); 0;; fun runpresent = for l=lsprites do let hd l-> p in ( set p.xSprite=p.xSprite+pdx; set p.ySprite=p.ySprite+pdy; set p.bmpSprite=if p.typeSprite then pfant+pdir else let (((p.xSprite-8)&31)>>3)+(((p.ySprite-8)&31)>>3) -> nn in (if nn==3 then 1 else nn)+pdir*3; set p.enableSprite=(p.xSprite>-24)&&(p.xSprite-24)&&(p.ySprite<392); 0 ); set pcount=pcount-1; if !pcount then inipresent; 0;; fun paint ww hh refresh= if refresh then ( drawdecors background hd decors nil; drawtitle background; initsprite; initdigit; eraseini; ); set state=match state with ( initGame-> set vies=5;set tableau=0;set score=0;set tour=1;initTab ) | ( initTab-> set laby=nil; set toeat=223; initPlay ) | ( initPlay-> set lsprites=nil; set title=0; eraseini; let drawdecors background (listnth decors tableau) laby ->[m xp yp xf yf] in ( set laby=m; set xp0=xp; set yp0=yp; set xm=xf; set ym=yf; set clockcaneat=0; set compte=0; set spacman=addSprite #movepac 0 xp0 yp0 9 (-1) 0 0; addSprite #movefant 1 xm ym 12 0 1 30; addSprite #movefant 2 xm ym 12 0 1 60; addSprite #movefant 3 xm ym 12 0 1 90; addSprite #movefant 4 xm ym 12 0 1 120 ); set klight=1.; set clockfruit=300; set lastkey=0; waitPlay ) | ( waitPlay -> if lastkey then doPlay else state ) | ( doPlay -> set statefin=0; for l=lsprites;l!=nil;tl l do ( let hd l-> s in call s.moveSprite [s] ); test; timer; if statefin<0 then ( set count2=0; erasePlay ) else state ) | ( pausePlay -> state ) | ( erasePlay -> set klight=(itof 64-count2)/.64.; set count2=count2+1; if (count2==64) then ( set lastkey=0; if statefin==-1 then drawTitle else if statefin==-2 then ( set vies=vies-1; if vies then initPlay else drawTitle ) else if statefin==-3 then ( addscore 20000; set tableau=tableau+1; if tableau==nbtableau then ( set tableau=0; if tour<5 then set tour=tour+2 ); initTab ) else nil ) else state ) | ( drawTitle -> set lsprites=nil; set klight=1.; set title=1; inipresent; if nil!=rank score then ( set pseudo=""; set title=32; drawprompt background title&32; updatetexture t_titlefore background; keyboardShow; promptMenu ) else waitMainmenu ) | ( promptMenu -> runpresent; set title=title+1; if !(title&31) then ( drawprompt background title&32; updatetexture t_titlefore background ); promptMenu ) | ( promptRefreshMenu -> updatetexture t_titlefore background; promptMenu ) | ( waitMainmenu -> runpresent; if title==1 then ( drawtitle0 background; updatetexture t_titlefore background ) else if title==TITLEDELAY then ( drawtitle1 background; updatetexture t_titlefore background ); set title=title+1; if title>=TITLEDELAY*2 then set title=1; if lastkey==32 then ( set lastkey=0; initGame ) else state ); drawscreen win; 0;; fun play t= mglDrawFrame win #paint; 0;; var xor;; var yor;; fun click w x y b= set xor=x; set yor=y; match state with (waitMainmenu->set lastkey=32);; fun move w x y= if xor!=nil then ( let x-xor -> dx in let y-yor -> dy in if (max abs dx abs dy)>8 then ( set lastkey= if (abs dx)>(abs dy) then if dx>0 then XK_Right else XK_Left else if (dy>0) then 's' else 'a'; set xor=x; set yor=y ) ) ;; fun unclick w x y b= set xor=nil;; fun main= set highscore= wordextr load strcat userdir highscorefile; set font=fontFromData load "pacman.ft"; set win=windowCreate nil nil 640 480 (if !strcmp platform "ios" then WINDOW_FULLSCREEN|WINDOW_GL else WINDOW_RESIZE|WINDOW_GL) "Dad-Man"; windowCbKeydown win #keydown; windowCbKeyup win #keyup; windowCbDestroy win #destroy; windowCbClick win #click; windowCbUnclick win #unclick; windowCbMousemove win #move; set background=bitmapCreate 1024 512; bitmapErase background 0; set black=bitmapCreate 24 24; bitmapErase black 0; set pacmanbord=bitmapFromFile srcbord; set color=0; set state=drawTitle; set delta=newtab 4 0; timerStart 12 #play; 0;;