mirror of
https://github.com/KolibriOS/kolibrios.git
synced 2024-12-23 23:26:49 +03:00
299 lines
5.5 KiB
NASM
299 lines
5.5 KiB
NASM
|
; 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<<cl, r3><r2, *r0=r3
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
if mouse.event='r'
|
||
|
check.numbers
|
||
|
go .draw
|
||
|
end
|
||
|
if mouse.event='c'
|
||
|
. r0=&close.i.x
|
||
|
if.select r0
|
||
|
exit
|
||
|
end
|
||
|
if scene<>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
|