; BINARY MASTER WINDOW.W=360 WINDOW.H=492 include 'a.inc' text t(256), title.t='Binary Master: %hh' text help.t=+\ 'Fun Game for Programmers.' RET\ 'Click BITs. Count in binary.' RET\ 'Match the decimal number' RET\ 'in the red box to make rows' RET\ 'disappear. Press any key.' RET\ 'r=Reset. p=Pause. Esc=exit' text pause.t=+\ 'Paused. Press p to continue' RET\ 'or r=Reset. Esc=exit' text game.over.t=+\ 'Game over. Score: %hh.' RET\ 'Press any key' align integer scene, score numeric SCENE.*, TITLE, PLAY,\ PAUSE, GAME.OVER numeric EASY=5000, NORMAL=4000, HARD=2000 BOX board, my.box integer my.n, red.n, magic.n=10101101b integer cbit.x, cbit.y, bits.h numeric BIT.*, W=32, H=48 text my.numbers(8+4), red.numbers(8+4) FONT main.font='font' IMAGE bits.i='bits', bit1.i='1',\ bit0.i='0', close.i='x' ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; function random.byte locals n .r: random 3 if r0<2 random 16 else.if r0=2 random 128 else.if r0=3 random 255 end . n=r0 text.find red.numbers, n if true, go .r, end . r0=n if false, r0++, end endf function reset.game locals n, p . score=0, bits.h=1 memory.zero my.numbers, 12 memory.zero red.numbers, 12 . n=8, p=red.numbers loop n random.byte . r1=p, *r1++=r0, p=r1 endl set.box board, 4, 70, BIT.W*8, BIT.H*8 . scene=SCENE.TITLE endf function on.create set.font main.font set.timer NORMAL reset.game endf function remove.byte, t, i locals n alias p=r0, q=r1, x=r2 if i=7, go .new, end . p=t, p+i, q=p, q++, x=7, x-i, n=x loop n, *p++=*q++, endl .new: . p=my.numbers, *(p+7)=0 random.byte . q=red.numbers, *(q+7)=r0 endf function remove.row, i remove.byte my.numbers, i remove.byte red.numbers, i . bits.h-- if bits.h<1, bits.h=1, end endf function check.numbers locals i . i=0 while i<8, r0=my.numbers, r0+i . r1=*r0, r0=red.numbers . r0+i, r2=*r0 if r1=r2, score+r1 remove.row i return 1 end . i++ endw endf 0 function draw.board locals i, n, x, y, w, h draw.image bits.i, 4, 35 draw.image bits.i, 4, 457 . x=0, y=0, w=32, h=48 while y<8, x=0 while x<8 . r0=x, r0*w, r0+board.x . r1=y, r1*h, r1+board.y set.box my.box, r0, r1, w, h draw.box my.box, BLACK, GRAY . x++ endw . r0=x, r0*w, r0+board.x . r1=y, r1*h, r1+board.y set.box my.box, r0, r1, 48, h draw.box.o my.box, WHITE . my.box.x+48 draw.box.o my.box, RED . r0=y, r1=8, r1-bits.h if r0>=r1 . r0=my.numbers, r1=y, r2=8 . r2-bits.h, r1-r2, r0+r1 . r1=*r0, my.n=r1 . r0=red.numbers, r1=y, r2=8 . r2-bits.h, r1-r2, r0+r1 . r1=*r0, red.n=r1 u2t my.n, t . my.box.x-40, my.box.y+11 draw.text t, my.box.x, my.box.y . my.box.x+44 u2t red.n, t draw.text t, my.box.x, my.box.y end . y++ endw endf function draw.bit, n, x, y if n draw.image bit1.i, x, y else draw.image bit0.i, x, y end endf function draw.byte, n, x, y locals i . i=8 loop i, r0=n, r1=i, r1--, r0>>cl, r0&1 draw.bit r0, x, y . x+BIT.W endl endf function draw.my.numbers locals i, n, y . i=bits.h, y=404 loop i, r0=my.numbers, r0+i, r0-- . r0=*r0, n=r0 draw.byte n, 4, y . y-BIT.H endl endf function draw.title.scene draw.text help.t, 16, 130 draw.byte magic.n, 50, 300 endf function draw.play.scene draw.board draw.my.numbers endf function draw.pause.scene draw.text pause.t, 16, 130 draw.byte magic.n, 50, 300 endf function draw.game.over print t, game.over.t, score draw.text t, 44, 170 draw.byte magic.n, 50, 300 endf function on.draw locals x, y, w, h clear.screen BLACK print t, title.t, score draw.text t, 4, 4 draw.image close.i, 324, 4 . r0=screen.w, r0-- . r1=screen.h, r1-- draw.outline 0, 0, r0, r1, GRAY if scene=SCENE.TITLE draw.title.scene else.if scene=SCENE.PLAY draw.play.scene else.if scene=SCENE.PAUSE draw.pause.scene else.if scene=SCENE.GAME.OVER draw.game.over end endf function on.key if key.event='c' if scene=SCENE.TITLE . scene=SCENE.PLAY go .draw end if scene=SCENE.GAME.OVER go .reset end if key='r' .reset: reset.game go .draw end if key='p' .pause: if scene=SCENE.PLAY . scene=SCENE.PAUSE else.if scene=SCENE.PAUSE . scene=SCENE.PLAY end go .draw end .draw: render end endf function on.mouse if.select board . r0=mouse.x, r0-WINDOW.X, r0-board.x . r1=BIT.W, r0/r1, cbit.x=r0 . r0=mouse.y, r0-WINDOW.Y, r0-board.y . r1=BIT.H, r0/r1, cbit.y=r0 if mouse.event='c' . r0=cbit.y, r1=8, r1-bits.h if r0>=r1, r0=my.numbers, r1=cbit.y . r2=8, r2-bits.h, r1-r2, r0+r1 . r3=*r0, r2=1, r1=7, r1-cbit.x . r2<SCENE.PLAY reset.game . scene=SCENE.PLAY end .draw: render end endf function on.timer if scene<>SCENE.PLAY return end if mouse.1, return, end if bits.h<8, bits.h++ else . scene=SCENE.GAME.OVER end render endf function on.exit ; ... endf