mirror of
https://github.com/KolibriOS/kolibrios.git
synced 2024-12-27 16:59:41 +03:00
922 lines
18 KiB
NASM
922 lines
18 KiB
NASM
|
VERSION equ 'ARCANOID II v. 0.30'
|
||
|
; by jj
|
||
|
; (jacek jerzy malinowski)
|
||
|
;
|
||
|
; contact: 4nic8@casiocalc.org
|
||
|
;----------------------------------------
|
||
|
; Compile with FASM for Menuet
|
||
|
;----------------------------------------
|
||
|
|
||
|
include 'lang.inc'
|
||
|
include 'ascl.inc'
|
||
|
include 'ascgl.inc'
|
||
|
include 'asjc.inc'
|
||
|
|
||
|
X_SIZE equ 400
|
||
|
Y_SIZE equ 300
|
||
|
|
||
|
MAX_LEVEL equ 5
|
||
|
|
||
|
BACK_CL equ 0x00EFEF ; background color
|
||
|
|
||
|
; THE MAIN PROGRAM:
|
||
|
use32
|
||
|
|
||
|
org 0x0
|
||
|
|
||
|
db 'MENUET01' ; 8 byte id
|
||
|
dd 0x01 ; header version
|
||
|
dd START ; start of code
|
||
|
dd I_END ; size of image
|
||
|
dd 0x200000 ; memory for app
|
||
|
dd 0x7fff0 ; esp
|
||
|
dd 0x0 , 0x0 ; I_Param , I_Icon
|
||
|
|
||
|
START: ; start of execution
|
||
|
|
||
|
bmptoimg bmp_file,img_bmp ; loading ... ;]
|
||
|
getimg img_bmp,0,0,10,10,img_ball
|
||
|
getimg img_bmp,20,0,20,10,img_bonus
|
||
|
getimg img_bmp,0,10,40,20,img_brick1
|
||
|
getimg img_bmp,0,30,40,20,img_brick2
|
||
|
getimg img_bmp,0,50,40,20,img_brick3
|
||
|
getimg img_bmp,0,70,40,20,img_brick4
|
||
|
|
||
|
call draw_window
|
||
|
|
||
|
still:
|
||
|
if_e dword [level],0,.no_intro
|
||
|
call intro
|
||
|
jmp .no_game
|
||
|
.no_intro:
|
||
|
|
||
|
if_e dword [mode],2,.end_if1
|
||
|
call level_info
|
||
|
jmp .no_game
|
||
|
.end_if1:
|
||
|
|
||
|
if_e dword [mode],4,.end_if2
|
||
|
call game_over
|
||
|
jmp .no_game
|
||
|
.end_if2:
|
||
|
|
||
|
call fast_gfx ; <-- the main engine
|
||
|
.no_game:
|
||
|
|
||
|
mov eax,11
|
||
|
int 0x40
|
||
|
|
||
|
cmp eax,1 ; redraw request ?
|
||
|
je red
|
||
|
cmp eax,2 ; key in buffer ?
|
||
|
je key
|
||
|
cmp eax,3 ; button in buffer ?
|
||
|
je button
|
||
|
|
||
|
jmp still
|
||
|
|
||
|
red: ; redraw
|
||
|
call draw_window
|
||
|
jmp still
|
||
|
|
||
|
key: ; key
|
||
|
mov eax,2 ; just read it and ignore
|
||
|
int 0x40
|
||
|
cmp ah,key_Esc ; if Esc ?
|
||
|
jne .no_q
|
||
|
mov eax,-1
|
||
|
int 0x40
|
||
|
.no_q:
|
||
|
|
||
|
if_e dword [mode],4,.end_if6
|
||
|
jmp still
|
||
|
.end_if6:
|
||
|
|
||
|
cmp ah,key_Space
|
||
|
jne .no_space
|
||
|
if_e dword [mode],2,.end_if1
|
||
|
mov dword [mode],0
|
||
|
jmp .no_space
|
||
|
.end_if1:
|
||
|
mov dword [mode],1
|
||
|
call fast_gfx
|
||
|
.no_space:
|
||
|
xor ebx,ebx
|
||
|
mov bl,ah
|
||
|
if_e ebx,key_F1,.no_f1
|
||
|
inc dword [del]
|
||
|
.no_f1:
|
||
|
if_e ebx,key_F2,.no_f2
|
||
|
if_a dword [del],0,.end_if3
|
||
|
dec dword [del]
|
||
|
.end_if3:
|
||
|
.no_f2:
|
||
|
|
||
|
|
||
|
jmp still
|
||
|
|
||
|
button: ; button
|
||
|
mov eax,17 ; get id
|
||
|
int 0x40
|
||
|
|
||
|
cmp ah,1 ; button id=1 ?
|
||
|
jne noclose
|
||
|
|
||
|
mov eax,-1 ; close this program
|
||
|
int 0x40
|
||
|
noclose:
|
||
|
|
||
|
jmp still
|
||
|
|
||
|
; *********************************************
|
||
|
; ******* VIRTUAL SCREEN FUNCTIONS ************
|
||
|
; *********************************************
|
||
|
|
||
|
show_screen: ; flips the virtual screen to the window
|
||
|
push_abc
|
||
|
|
||
|
mov eax,7
|
||
|
mov ebx,screen
|
||
|
mov ecx,X_SIZE*65536+Y_SIZE
|
||
|
mov edx,4*65536+20
|
||
|
int 0x40
|
||
|
|
||
|
pop_abc
|
||
|
ret
|
||
|
|
||
|
put_bmp_screen: ; eax - y , ebx - x, esi - bmp
|
||
|
cmp ebx,X_SIZE-5
|
||
|
jb .ok1
|
||
|
ret
|
||
|
.ok1:
|
||
|
cmp eax,Y_SIZE-5
|
||
|
jb .ok2
|
||
|
ret
|
||
|
.ok2:
|
||
|
|
||
|
push_abc
|
||
|
xor ecx,ecx
|
||
|
xor edx,edx
|
||
|
mov edi,screen
|
||
|
mov ecx,3
|
||
|
mul ecx ; xx = 3*y*X_SIZE+3*x
|
||
|
mov ecx,X_SIZE
|
||
|
mul ecx
|
||
|
push eax ; #> 1
|
||
|
mov eax,ebx
|
||
|
mov ecx,3
|
||
|
mul ecx
|
||
|
mov ebx,eax
|
||
|
pop edx ; #< 1
|
||
|
add edx,ebx
|
||
|
add edi,edx ; sets the pointer to x,y of the screen
|
||
|
|
||
|
mov cx,[si] ; loops 1
|
||
|
xor ebx,ebx
|
||
|
mov ax,cx
|
||
|
mov dx,3
|
||
|
mul dx
|
||
|
mov bx,ax
|
||
|
|
||
|
push ebx ;#>4
|
||
|
|
||
|
add si,4
|
||
|
mov ax,[si] ; loops 2
|
||
|
mov cx,[si]
|
||
|
;shr ax,2
|
||
|
mov dx,3 ; dx = ax *3
|
||
|
mul dx
|
||
|
mov bx,ax
|
||
|
add si,4
|
||
|
|
||
|
|
||
|
pop ebx ;#<4
|
||
|
.l_y:
|
||
|
mov ax,cx
|
||
|
cld
|
||
|
mov cx,bx
|
||
|
rep movs byte [edi],[esi]
|
||
|
add edi,X_SIZE
|
||
|
add edi,X_SIZE
|
||
|
add edi,X_SIZE
|
||
|
sub edi,ebx
|
||
|
mov cx,ax
|
||
|
loop .l_y
|
||
|
|
||
|
pop_abc
|
||
|
ret
|
||
|
|
||
|
rect_screen: ; eax - y , ebx - x, ecx - size x, edx - size y, si -color
|
||
|
mov edi,ebx
|
||
|
add ebx,ecx
|
||
|
cmp ebx,X_SIZE
|
||
|
jb .ok1
|
||
|
ret
|
||
|
.ok1:
|
||
|
mov ebx,edi
|
||
|
|
||
|
mov edi,eax
|
||
|
add eax,edx
|
||
|
cmp eax,Y_SIZE
|
||
|
jb .ok2
|
||
|
ret
|
||
|
.ok2:
|
||
|
mov eax,edi
|
||
|
push_abc
|
||
|
push ecx ;#>2
|
||
|
push edx ;#>3
|
||
|
|
||
|
xor ecx,ecx
|
||
|
xor edx,edx
|
||
|
mov edi,screen
|
||
|
mov ecx,3
|
||
|
mul ecx ; xx = 3*y*X_SIZE+3*x
|
||
|
mov ecx,X_SIZE
|
||
|
mul ecx
|
||
|
push eax ; #> 1
|
||
|
mov eax,ebx
|
||
|
mov ecx,3
|
||
|
mul ecx
|
||
|
mov ebx,eax
|
||
|
pop edx ; #< 1
|
||
|
add edx,ebx
|
||
|
|
||
|
add edi,edx ; sets the pointer to x,y of the screen
|
||
|
|
||
|
pop ecx ; #<3
|
||
|
pop edx ; #<4
|
||
|
mov eax,esi
|
||
|
.l_y:
|
||
|
;mov ax,cx
|
||
|
push ecx
|
||
|
cld
|
||
|
mov ecx,edx
|
||
|
.l_x:
|
||
|
;rep movs byte [edi],[esi]
|
||
|
mov word [edi],ax
|
||
|
push eax
|
||
|
shr eax,16
|
||
|
mov byte [edi+2],al
|
||
|
add edi,3
|
||
|
pop eax
|
||
|
loop .l_x
|
||
|
|
||
|
add edi,X_SIZE
|
||
|
add edi,X_SIZE
|
||
|
add edi,X_SIZE
|
||
|
sub edi,edx
|
||
|
sub edi,edx
|
||
|
sub edi,edx
|
||
|
;mov cx,ax
|
||
|
pop ecx
|
||
|
loop .l_y
|
||
|
|
||
|
pop_abc
|
||
|
ret
|
||
|
|
||
|
grad_rect_screen: ; eax - y , ebx - x, ecx - size x, edx - size y, si -color, d
|
||
|
push edi ;#>0
|
||
|
mov edi,ebx
|
||
|
add ebx,ecx
|
||
|
cmp ebx,X_SIZE
|
||
|
jb .ok1
|
||
|
pop edi ;#<0
|
||
|
ret
|
||
|
.ok1:
|
||
|
mov ebx,edi
|
||
|
|
||
|
mov edi,eax
|
||
|
add eax,edx
|
||
|
cmp eax,Y_SIZE
|
||
|
jb .ok2
|
||
|
pop edi ;#<0
|
||
|
ret
|
||
|
.ok2:
|
||
|
mov eax,edi
|
||
|
|
||
|
pop edi ;#<0
|
||
|
push_abc
|
||
|
|
||
|
push edi ;#>5
|
||
|
push ecx ;#>2
|
||
|
push edx ;#>3
|
||
|
|
||
|
xor ecx,ecx
|
||
|
xor edx,edx
|
||
|
mov edi,screen
|
||
|
mov ecx,3
|
||
|
mul ecx ; xx = 3*y*X_SIZE+3*x
|
||
|
mov ecx,X_SIZE
|
||
|
mul ecx
|
||
|
push eax ; #> 1
|
||
|
mov eax,ebx
|
||
|
mov ecx,3
|
||
|
mul ecx
|
||
|
mov ebx,eax
|
||
|
pop edx ; #< 1
|
||
|
add edx,ebx
|
||
|
|
||
|
add edi,edx ; sets the pointer to x,y of the screen
|
||
|
|
||
|
pop ecx ; #<3
|
||
|
pop edx ; #<2
|
||
|
mov eax,esi
|
||
|
pop esi ; #<5
|
||
|
.l_y:
|
||
|
;mov ax,cx
|
||
|
push ecx
|
||
|
cld
|
||
|
mov ecx,edx
|
||
|
.l_x:
|
||
|
;rep movs byte [edi],[esi]
|
||
|
mov word [edi],ax
|
||
|
push eax
|
||
|
shr eax,16
|
||
|
mov byte [edi+2],al
|
||
|
add edi,3
|
||
|
pop eax
|
||
|
loop .l_x
|
||
|
|
||
|
add edi,X_SIZE
|
||
|
add edi,X_SIZE
|
||
|
add edi,X_SIZE
|
||
|
sub edi,edx
|
||
|
sub edi,edx
|
||
|
sub edi,edx
|
||
|
add eax,esi
|
||
|
;mov cx,ax
|
||
|
pop ecx
|
||
|
loop .l_y
|
||
|
|
||
|
pop_abc
|
||
|
ret
|
||
|
|
||
|
|
||
|
fill_screen: ; eax - screen color ( 0x00RRGGBB )
|
||
|
push_abc
|
||
|
mov edi,screen
|
||
|
cld
|
||
|
mov ecx,X_SIZE*Y_SIZE
|
||
|
.lab1:
|
||
|
mov [edi],eax
|
||
|
add edi,3
|
||
|
loop .lab1
|
||
|
pop_abc
|
||
|
ret
|
||
|
|
||
|
grad_fill_screen: ; eax - screen color ( 0x00RRGGBB ), ebx - mack
|
||
|
push_abc
|
||
|
mov edi,screen
|
||
|
cld
|
||
|
mov ecx,Y_SIZE
|
||
|
mov dl,0
|
||
|
.lab1:
|
||
|
push ecx
|
||
|
mov ecx,X_SIZE
|
||
|
.lab2:
|
||
|
mov [edi],eax
|
||
|
add edi,3
|
||
|
loop .lab2
|
||
|
mov dh,1 ; dl = 1 - dl
|
||
|
sub dh,dl
|
||
|
mov dl,dh
|
||
|
cmp dl,0
|
||
|
jne .no_ch ; if (dl==0)
|
||
|
add eax,ebx ; change gradient
|
||
|
.no_ch:
|
||
|
pop ecx
|
||
|
loop .lab1
|
||
|
pop_abc
|
||
|
ret
|
||
|
|
||
|
|
||
|
bmp_fill_screen: ; esi - pointer to a backgroung bmp
|
||
|
push_abc
|
||
|
mov edi,screen
|
||
|
cld
|
||
|
mov ecx,X_SIZE*Y_SIZE
|
||
|
rep movs dword [edi],[esi]
|
||
|
pop_abc
|
||
|
ret
|
||
|
|
||
|
;___________________
|
||
|
intro: ; INTRO ;
|
||
|
label 140,200,VERSION,0x100000FF
|
||
|
label 120,220,'by jj (jacek jerzy malinowski)',0x050505
|
||
|
label 100,240,'press SPACE to start a new game',0x10FF0800
|
||
|
label 15,240,'F1 + delay',0xFFA8FF
|
||
|
label 15,260,'F2 + delay',0xFFA8FF
|
||
|
delay 10
|
||
|
ret
|
||
|
|
||
|
;___________________
|
||
|
level_info:
|
||
|
label 170,230,'L E V E L',0x100000FF
|
||
|
outcount [level],195,250,0x100000FF,2*65536
|
||
|
label 100,270,'press SPACE to start the level',0x10FF0800
|
||
|
delay 10
|
||
|
ret
|
||
|
|
||
|
;_________________________
|
||
|
game_over: ; GAME OVER ;
|
||
|
mov eax,0x00FF00
|
||
|
mov ebx,0xFF01
|
||
|
.g_ok:
|
||
|
call grad_fill_screen
|
||
|
call show_screen ; flips the screen
|
||
|
label 120,150,'G A M E O V E R',0x10050505
|
||
|
label 140,200,'Thanks for playing',0x0FFF800
|
||
|
delay 20
|
||
|
ret
|
||
|
|
||
|
|
||
|
;-----------------------------;
|
||
|
; THE MAIN THE GAME'S ENGINE ;
|
||
|
;-----------------------------;
|
||
|
fast_gfx:
|
||
|
; the background gradient
|
||
|
if_e dword [level],0,.no_0
|
||
|
mov eax,0xFF
|
||
|
mov ebx,0xFEFF
|
||
|
jmp .g_ok
|
||
|
.no_0:
|
||
|
if_e dword [level],1,.no_1
|
||
|
mov eax,BACK_CL
|
||
|
mov ebx,0xFFFF
|
||
|
jmp .g_ok
|
||
|
.no_1:
|
||
|
if_e dword [level],2,.no_2
|
||
|
mov eax,0xFF0000
|
||
|
mov ebx,0xFF00FF
|
||
|
jmp .g_ok
|
||
|
.no_2:
|
||
|
|
||
|
mov eax,BACK_CL
|
||
|
mov ebx,0xFFFF
|
||
|
.g_ok:
|
||
|
call grad_fill_screen
|
||
|
|
||
|
mov eax,37 ; get mouse position
|
||
|
mov ebx,1
|
||
|
int 0x40
|
||
|
shr eax,16
|
||
|
mov [x],eax
|
||
|
add eax,[s_x]
|
||
|
cmp eax,X_SIZE ; controls if the pad is in the screen
|
||
|
jb .ok
|
||
|
cmp eax,0x7FFF ; if < 0
|
||
|
jb .upper
|
||
|
mov [x],0
|
||
|
jmp .ok
|
||
|
.upper: ; if > X_SIZE - pad size
|
||
|
mov dword [x],X_SIZE-1
|
||
|
mov eax,[s_x]
|
||
|
sub dword [x],eax
|
||
|
.ok:
|
||
|
mov ebx,[x]
|
||
|
mov eax,[y]
|
||
|
mov ecx,[s_x]
|
||
|
mov edx,15
|
||
|
mov esi,0xFF0000
|
||
|
mov edi,0xF0000F
|
||
|
call grad_rect_screen
|
||
|
|
||
|
call draw_level
|
||
|
|
||
|
cmp dword [mode],1
|
||
|
jne .no_go ; is the game started ?
|
||
|
mov eax,[v_x]
|
||
|
add dword [b_x],eax
|
||
|
mov eax,[v_y]
|
||
|
add dword [b_y],eax
|
||
|
jmp .go
|
||
|
.no_go:
|
||
|
mov eax,[x] ; b_x = x + x_s/2
|
||
|
mov ebx,[s_x]
|
||
|
shr ebx,1
|
||
|
add eax,ebx
|
||
|
mov dword [b_x],eax
|
||
|
mov eax,[y] ; b_y = y - 10
|
||
|
sub eax,10
|
||
|
mov dword [b_y],eax
|
||
|
|
||
|
mov dword [v_x],1
|
||
|
mov dword [v_y],-1
|
||
|
.go:
|
||
|
;TEST WHERE IS THE BALL:
|
||
|
cmp dword [b_x],0x7FFFFFFF
|
||
|
jb .b_ok2 ; if out of the screen (left)
|
||
|
mov dword [b_x],0
|
||
|
mov eax,0
|
||
|
sub eax,[v_x]
|
||
|
mov [v_x],eax
|
||
|
.b_ok2:
|
||
|
cmp dword [b_x],X_SIZE-10
|
||
|
jb .b_ok1 ; if out of the screen (right)
|
||
|
mov dword [b_x],X_SIZE-11
|
||
|
mov eax,0
|
||
|
sub eax,[v_x]
|
||
|
mov [v_x],eax
|
||
|
.b_ok1:
|
||
|
cmp dword [b_y],0x7FFFFFFF
|
||
|
jb .b_ok3 ; if out of the screen (up)
|
||
|
mov dword [b_y],0
|
||
|
mov eax,0
|
||
|
sub eax,[v_y]
|
||
|
mov [v_y],eax
|
||
|
.b_ok3:
|
||
|
cmp dword [b_y],Y_SIZE-10
|
||
|
jb .b_ok4 ; if out of the screen (down)
|
||
|
mov dword [mode],0
|
||
|
if_e dword [lives],0,.end_if5
|
||
|
mov dword [mode],4 ; GAME OVER
|
||
|
jmp still
|
||
|
.end_if5:
|
||
|
dec dword [lives]
|
||
|
.end_else4:
|
||
|
call draw_window
|
||
|
.b_ok4:
|
||
|
|
||
|
imgtoimg img_ball,dword [b_x],dword [b_y],screen_img
|
||
|
|
||
|
call show_screen ; flips the screen
|
||
|
delay dword [del]
|
||
|
|
||
|
call do_tests ; does all needed tests
|
||
|
ret
|
||
|
;----------------------;
|
||
|
; BALL & BRICKS EVENTS ;
|
||
|
;----------------------;
|
||
|
MAX_SPEED equ 3
|
||
|
do_tests:
|
||
|
; BALL <-> PAD
|
||
|
mov eax,[b_x]
|
||
|
add eax,10
|
||
|
cmp eax,[x] ; if (b_x+10)>[pad x]
|
||
|
jb .skip ; &&
|
||
|
mov eax,[b_x]
|
||
|
mov ebx,[s_x]
|
||
|
add ebx,[x]
|
||
|
cmp eax,ebx ; if b_x < x + s_x
|
||
|
ja .skip ; &&
|
||
|
mov eax,[b_y]
|
||
|
add eax,10
|
||
|
cmp eax,[y] ; if (b_y+10) > y
|
||
|
jb .skip
|
||
|
sub eax,15
|
||
|
cmp eax,[y] ; if b_y < y+15
|
||
|
ja .skip
|
||
|
cmp dword [v_y],0x7FFFFF ; if v_y > 0
|
||
|
ja .skip
|
||
|
cmp dword [v_y],MAX_SPEED; speedup:
|
||
|
ja .skip_s
|
||
|
inc dword [speed_t]
|
||
|
cmp dword [speed_t],5
|
||
|
jb .skip_s
|
||
|
inc dword [v_y]
|
||
|
mov dword [speed_t],0
|
||
|
.skip_s:
|
||
|
inc dword [speed_t]
|
||
|
mov eax,0
|
||
|
sub eax,[v_y]
|
||
|
mov [v_y],eax
|
||
|
;counting v_x:--------
|
||
|
mov eax,[b_x]
|
||
|
sub eax,[x]
|
||
|
sub eax,5
|
||
|
mov ecx,eax
|
||
|
if_a eax,100,.end_if3
|
||
|
mov eax,0
|
||
|
sub eax,[v_x]
|
||
|
mov [v_x],eax
|
||
|
jmp .skip
|
||
|
.end_if3:
|
||
|
if_a eax,20,.end_if2
|
||
|
sub eax,20
|
||
|
shr eax,2
|
||
|
mov [v_x],eax
|
||
|
jmp .skip
|
||
|
.end_if2:
|
||
|
mov ebx,20
|
||
|
sub ebx,ecx
|
||
|
shr ebx,2
|
||
|
mov dword [v_x],0
|
||
|
sub dword [v_x],ebx
|
||
|
.skip:
|
||
|
|
||
|
; BALL <-> BRICK
|
||
|
mov dword [coliz],0
|
||
|
call colision
|
||
|
if_e dword [coliz],1,.end_if6
|
||
|
;abs dword [v_y]
|
||
|
;abs dword [v_x]
|
||
|
ret
|
||
|
.end_if6:
|
||
|
add dword [b_x],10
|
||
|
call colision
|
||
|
sub dword [b_x],10
|
||
|
if_e dword [coliz],1,.end_if7
|
||
|
;abs dword [v_y]
|
||
|
;abs dword [v_x]
|
||
|
ch_sign dword [v_x]
|
||
|
ret
|
||
|
.end_if7:
|
||
|
add dword [b_y],10
|
||
|
call colision
|
||
|
sub dword [b_y],10
|
||
|
if_e dword [coliz],1,.end_if8
|
||
|
;abs dword [v_y]
|
||
|
;abs dword [v_x]
|
||
|
;ch_sign dword [v_y]
|
||
|
ret
|
||
|
.end_if8:
|
||
|
add dword [b_x],10
|
||
|
add dword [b_y],10
|
||
|
call colision
|
||
|
sub dword [b_x],10
|
||
|
sub dword [b_y],10
|
||
|
if_e dword [coliz],1,.end_if9
|
||
|
;abs dword [v_y]
|
||
|
;abs dword [v_x]
|
||
|
;ch_sign dword [v_x]
|
||
|
;ch_sign dword [v_y]
|
||
|
|
||
|
ret
|
||
|
.end_if9:
|
||
|
|
||
|
|
||
|
ret
|
||
|
|
||
|
colision:
|
||
|
|
||
|
mov esi,levels
|
||
|
mov eax,[level] ; eax = levels*100
|
||
|
mov bx,100
|
||
|
mul bx
|
||
|
add esi,eax
|
||
|
;--------------
|
||
|
xor edx,edx
|
||
|
mov eax,[b_x]
|
||
|
mov ebx,40
|
||
|
div ebx
|
||
|
mov ecx,eax
|
||
|
push edx ;#>1
|
||
|
|
||
|
xor edx,edx
|
||
|
mov eax,[b_y]
|
||
|
mov ebx,20
|
||
|
div ebx
|
||
|
push edx ;#>2
|
||
|
cmp eax,9 ; out of the bricks board
|
||
|
ja .ok2
|
||
|
mov ebx,10
|
||
|
mul ebx
|
||
|
add eax,ecx
|
||
|
add esi,eax
|
||
|
|
||
|
cmp byte [esi],0 ; 0 - no brick
|
||
|
je .ok2
|
||
|
if_ne byte [esi],4,.end_if1
|
||
|
dec byte [esi]
|
||
|
.end_if1:
|
||
|
mov dword [coliz],1
|
||
|
pop ebx ;#<2
|
||
|
pop eax ;#<1
|
||
|
cmp ecx,8 ; x < 5 || x >35 - x inv
|
||
|
jb .inv
|
||
|
cmp ecx,33
|
||
|
ja .inv
|
||
|
jmp .no_inv
|
||
|
.inv:
|
||
|
mov eax,0
|
||
|
sub eax,[v_x]
|
||
|
mov [v_x],eax
|
||
|
;jmp .no_ok
|
||
|
.no_inv:
|
||
|
cmp ebx,6 ; if y < 5 || y>15 - y inv
|
||
|
jb .inv_y
|
||
|
cmp ebx,14
|
||
|
ja .inv_y
|
||
|
jmp .no_ok
|
||
|
.inv_y:
|
||
|
mov eax,0
|
||
|
sub eax,[v_y]
|
||
|
mov [v_y],eax
|
||
|
.no_ok:
|
||
|
jmp .ok
|
||
|
.ok2:
|
||
|
pop eax ;#<1
|
||
|
pop eax ;#<2
|
||
|
.ok:
|
||
|
|
||
|
|
||
|
ret
|
||
|
|
||
|
;-----------------------------------;
|
||
|
; DRAWS CURRENT LEVEL ON THE SCREEN ;
|
||
|
;-----------------------------------;
|
||
|
draw_level:
|
||
|
mov esi,levels
|
||
|
mov eax,[level] ; eax = levels*100
|
||
|
mov bx,100
|
||
|
mul bx
|
||
|
add esi,eax
|
||
|
mov ecx,10
|
||
|
mov eax,0
|
||
|
mov dword [l_end],1
|
||
|
.l_y:
|
||
|
push ecx ;#>1
|
||
|
mov ebx,0
|
||
|
mov ecx,10
|
||
|
.l_x:
|
||
|
cmp byte [esi],1 ; if 1 ?
|
||
|
push esi;#>2
|
||
|
jne .no_1
|
||
|
mov esi,img_brick1
|
||
|
call put_bmp_screen
|
||
|
mov dword [l_end],0
|
||
|
.no_1:
|
||
|
cmp byte [esi],2 ; if 2 ?
|
||
|
jne .no_2
|
||
|
mov esi,img_brick2
|
||
|
call put_bmp_screen
|
||
|
mov dword [l_end],0
|
||
|
.no_2:
|
||
|
cmp byte [esi],3 ; if 3 ?
|
||
|
jne .no_3
|
||
|
mov esi,img_brick3
|
||
|
call put_bmp_screen
|
||
|
mov dword [l_end],0
|
||
|
.no_3:
|
||
|
cmp byte [esi],4 ; if 4 ?
|
||
|
jne .no_4
|
||
|
mov esi,img_brick4
|
||
|
call put_bmp_screen
|
||
|
.no_4:
|
||
|
|
||
|
add ebx,40
|
||
|
pop esi ;#<2
|
||
|
inc esi
|
||
|
loop .l_x
|
||
|
add eax,20 ;#<1
|
||
|
pop ecx
|
||
|
loop .l_y
|
||
|
;----------------
|
||
|
; NEXT LEVEL
|
||
|
if_e dword [l_end],1,.end_if ; all bricks are taken
|
||
|
if_e dword [mode],1,.end_if
|
||
|
add dword [level],1
|
||
|
if_a dword [level],MAX_LEVEL,.end_if2
|
||
|
mov dword [mode],4 ; game over
|
||
|
jmp still
|
||
|
.end_if2:
|
||
|
call fast_gfx
|
||
|
mov dword [mode],2
|
||
|
.end_if:
|
||
|
ret
|
||
|
|
||
|
; *********************************************
|
||
|
; ******* WINDOW DEFINITIONS AND DRAW ********
|
||
|
; *********************************************
|
||
|
|
||
|
|
||
|
draw_window:
|
||
|
|
||
|
startwd
|
||
|
|
||
|
window 100,100,X_SIZE+8,Y_SIZE+21,0x03ffffff
|
||
|
label 8,8,VERSION,cl_White+font_Big
|
||
|
label 200,8,'LIVES:',0x10ddeeff
|
||
|
outcount dword [lives],250,8,0x10ddeeff,65536
|
||
|
|
||
|
call fast_gfx
|
||
|
|
||
|
endwd
|
||
|
|
||
|
ret
|
||
|
|
||
|
;-----------;####################
|
||
|
; DATA AREA ;####################
|
||
|
;-----------;####################
|
||
|
|
||
|
lives dd 5
|
||
|
mode dd 0
|
||
|
l_end dd 0 ; if 1 the level is over
|
||
|
; PAD x:
|
||
|
x dd 20
|
||
|
y dd Y_SIZE-20
|
||
|
; PAD length:
|
||
|
s_x dd 40
|
||
|
|
||
|
; the ball stuff ;-)
|
||
|
b_x dd 100
|
||
|
b_y dd 250
|
||
|
v_y dd 0
|
||
|
v_x dd 3
|
||
|
|
||
|
speed_t dd 0 ; 1/10 times speedup
|
||
|
del dd 1 ; delay
|
||
|
|
||
|
coliz dd 0 ; if 1 then colizion with a brick
|
||
|
|
||
|
; LEVELS:
|
||
|
level dd 0
|
||
|
levels:
|
||
|
;LEVEL 0:
|
||
|
db 0,0,0,0,0,0,0,0,0,0
|
||
|
db 0,4,0,0,4,4,0,0,0,4
|
||
|
db 4,0,4,0,4,0,4,0,4,0
|
||
|
db 4,0,4,0,4,0,4,0,4,0
|
||
|
db 4,4,4,0,4,4,0,0,4,0
|
||
|
db 4,0,4,0,4,0,4,0,4,0
|
||
|
db 4,0,4,0,4,0,4,0,0,4
|
||
|
db 0,0,0,0,0,0,0,0,0,0
|
||
|
db 0,0,0,0,0,0,0,0,0,0
|
||
|
db 0,0,0,0,0,0,0,0,0,0
|
||
|
|
||
|
;LEVEL 1:
|
||
|
db 1,1,1,1,1,1,1,1,1,1
|
||
|
db 0,3,0,0,3,3,0,0,0,3
|
||
|
db 3,0,3,0,3,0,3,0,3,0
|
||
|
db 3,0,3,0,3,0,3,0,3,0
|
||
|
db 3,3,3,0,3,3,0,0,3,0
|
||
|
db 3,0,3,0,3,0,3,0,3,0
|
||
|
db 3,0,3,0,3,0,3,0,0,3
|
||
|
db 2,2,2,2,2,2,2,2,2,2
|
||
|
db 1,1,1,1,1,1,1,1,1,1
|
||
|
db 1,1,1,1,1,1,1,1,1,1
|
||
|
;LEVEL 2:
|
||
|
db 3,3,3,3,0,0,3,3,3,3
|
||
|
db 3,1,1,1,0,0,1,1,1,3
|
||
|
db 3,1,2,1,3,3,1,2,1,3
|
||
|
db 0,1,0,1,3,3,1,0,1,0
|
||
|
db 2,1,2,1,1,1,1,2,1,2
|
||
|
db 0,1,0,1,2,2,1,0,1,0
|
||
|
db 2,1,2,1,1,1,1,2,1,2
|
||
|
db 0,1,0,1,1,1,1,0,1,0
|
||
|
db 0,0,0,1,0,0,1,0,0,0
|
||
|
db 0,0,0,1,0,0,1,0,0,0
|
||
|
;LEVEL 3:
|
||
|
db 1,2,3,1,2,3,1,3,2,1
|
||
|
db 2,3,1,2,3,1,3,3,1,2
|
||
|
db 3,1,2,3,1,2,3,1,2,3
|
||
|
db 1,2,3,1,2,3,1,3,2,1
|
||
|
db 2,3,1,2,3,1,3,3,1,2
|
||
|
db 3,1,2,3,1,2,3,1,2,3
|
||
|
db 1,2,1,2,1,2,1,2,1,2
|
||
|
db 1,0,1,0,1,0,1,0,1,0
|
||
|
db 0,0,3,0,0,0,0,3,0,0
|
||
|
db 0,0,3,0,0,0,0,3,0,0
|
||
|
;LEVEL 4:
|
||
|
db 0,0,0,1,1,1,1,0,0,0
|
||
|
db 0,0,1,2,2,2,2,1,0,0
|
||
|
db 1,1,1,2,2,2,2,1,1,1
|
||
|
db 1,0,1,0,2,2,0,1,0,1
|
||
|
db 0,1,1,2,2,2,2,1,1,0
|
||
|
db 0,0,1,2,2,2,2,1,0,0
|
||
|
db 0,0,1,2,2,2,2,1,0,0
|
||
|
db 0,0,1,2,3,3,2,1,0,0
|
||
|
db 0,0,1,2,2,2,2,1,0,0
|
||
|
db 0,0,0,1,1,1,1,0,0,0
|
||
|
;LEVEL 5:
|
||
|
db 1,1,1,1,1,1,1,1,1,1
|
||
|
db 1,2,0,0,3,2,0,0,2,1
|
||
|
db 1,2,0,0,2,3,0,0,2,1
|
||
|
db 2,2,0,0,3,2,0,0,2,2
|
||
|
db 0,0,0,0,2,3,0,0,0,0
|
||
|
db 0,0,0,1,1,1,1,0,0,0
|
||
|
db 0,0,1,1,0,0,1,1,0,0
|
||
|
db 0,0,1,1,0,0,1,1,0,0
|
||
|
db 2,1,2,1,2,1,2,1,2,1
|
||
|
db 1,2,1,2,1,2,1,2,1,2
|
||
|
|
||
|
|
||
|
; BITMAPs and IMAGEs
|
||
|
bmp_file:
|
||
|
file 'arcanii.bmp'
|
||
|
|
||
|
img_bmp:
|
||
|
rb 40*90*3+8
|
||
|
img_brick1:
|
||
|
rb 40*20*3+8
|
||
|
img_brick2:
|
||
|
rb 40*20*3+8
|
||
|
img_brick3:
|
||
|
rb 40*20*3+8
|
||
|
img_brick4:
|
||
|
rb 40*20*3+8
|
||
|
img_ball:
|
||
|
rb 10*10*3+8
|
||
|
img_bonus:
|
||
|
rb 20*10*3+8
|
||
|
|
||
|
|
||
|
screen_img:
|
||
|
dd X_SIZE
|
||
|
dd Y_SIZE
|
||
|
screen:
|
||
|
rb X_SIZE*Y_SIZE*3
|
||
|
|
||
|
I_END:
|
||
|
|