kolibrios/programs/games/codemaster/binary_master.asm
codemaster 13694b9ade Added 3 games for the New Year competition: Binary Master, Hang Programmer, Kolibri Puzzle
(Author: codemaster; initially sources are uploaded to SVN "as is" without modification)
### Redo r.5303 with correct letter case for auto-build machine ###

git-svn-id: svn://kolibrios.org@5305 a494cfbc-eb01-0410-851d-a64ba20cac60
2014-12-30 23:59:59 +00:00

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