forked from KolibriOS/kolibrios
630234432f
git-svn-id: svn://kolibrios.org@109 a494cfbc-eb01-0410-851d-a64ba20cac60
562 lines
11 KiB
NASM
562 lines
11 KiB
NASM
;
|
|
; Arcanoid Gaem 4Ver Mini Sample by Pavlushin Evgeni for ASCL
|
|
; www.waptap@mail.ru www.cyberdeck.fatal.ru www.deck4.narod.ru
|
|
; Play again and exit button added
|
|
;
|
|
; 3Ver Play again, Exit button.
|
|
; 4Ver Next level function.
|
|
;
|
|
;******************************************************************************
|
|
use32
|
|
org 0x0
|
|
db 'MENUET01' ; 8 byte id
|
|
dd 0x01 ; header version
|
|
dd START ; start of code
|
|
dd IM_END ; size of image
|
|
dd 0x300000 ; memory for app
|
|
dd 0x300000 ; esp
|
|
dd 0x0 , 0x0 ; I_Param , I_Icon
|
|
|
|
;******************************************************************************
|
|
|
|
include 'lang.inc'
|
|
include 'ascl.inc'
|
|
include 'ascgl.inc'
|
|
include 'ascgml.inc'
|
|
|
|
|
|
START: ; start of execution
|
|
bmptoimg arc_file,pong
|
|
getimg pong,0,0,80,4,img
|
|
getimg pong,0,4,80,4,img2
|
|
getimg pong,5,38,15,15,img3
|
|
getimg pong,0,8,80,20,img5
|
|
fullimg img4 , 80 ,20 ,0x00000000 ;black for rocket
|
|
fullimg img6 , 15 ,15 ,0x00000000 ;black for ball
|
|
fullimg img7a , 60,20,0x0000cf00
|
|
fullimg img7b , 60,20,0x00af0000
|
|
fullimg img7c , 60,20,0x000000cf
|
|
fullimg img8 , 60,20,0x00000000
|
|
|
|
call draw_window
|
|
|
|
still:
|
|
|
|
scevent red,key,button
|
|
|
|
cmp [againbut],1
|
|
je stl2
|
|
|
|
outcount dword [scoreb],256,8,cl_Blue,5*65536
|
|
outcount dword [scorea],332,8,cl_Red,5*65536
|
|
outcount dword [level],368,8,cl_White,2*65536
|
|
|
|
del_images:
|
|
setimg dword [ply1x],dword [ply1y],img4
|
|
setimg dword [ballx],dword [bally],img6
|
|
setimg dword [gravx],dword [gravy],img4
|
|
|
|
del_blocks:
|
|
mov ecx,0
|
|
xxx:
|
|
pushad
|
|
mov esi,dword [mass+ecx]
|
|
mov edi,dword [mass+ecx+4]
|
|
mov ebp,dword [mass+ecx+8]
|
|
cmp ebp,0
|
|
jne notptx
|
|
setimg esi,edi,img8
|
|
notptx:
|
|
popad
|
|
add ecx,12
|
|
cmp ecx,[blocks_max]
|
|
jne xxx
|
|
|
|
|
|
|
|
move_ply1:
|
|
|
|
correct [ply1x],[ply1rx],2
|
|
correct [ply1y],[ply1ry],2
|
|
|
|
;automove ball
|
|
mov eax,dword [ballxv]
|
|
add dword [ballx],eax
|
|
mov eax,dword [ballyv]
|
|
add dword [bally],eax
|
|
|
|
;autoslow ball for rocket gravitation (Space key)
|
|
cmp dword [ballxv],0
|
|
jl ballb
|
|
balla:
|
|
cmp dword [ballxv],2
|
|
jng balln
|
|
dec dword [ballxv]
|
|
jmp balln
|
|
ballb:
|
|
cmp dword [ballxv],-2
|
|
jnl balln
|
|
inc dword [ballxv]
|
|
jmp balln
|
|
balln:
|
|
cmp dword [ballyv],2
|
|
jng by_n
|
|
dec dword [ballyv]
|
|
by_n:
|
|
|
|
;ball collusion of screen
|
|
cmp dword [ballx],400-12
|
|
jna xa_ok
|
|
neg dword [ballxv]
|
|
xa_ok:
|
|
cmp dword [ballx],6
|
|
jnb xb_ok
|
|
neg dword [ballxv]
|
|
xb_ok:
|
|
|
|
cmp dword [bally],30
|
|
jnb yb_ok
|
|
neg dword [ballyv]
|
|
yb_ok:
|
|
|
|
|
|
;if ball far out of screen come back
|
|
cmp dword [bally],466
|
|
jng yax_ok
|
|
call draw_window
|
|
dec dword [scoreb]
|
|
mov eax,[ply1ry]
|
|
sub eax,6
|
|
mov dword [bally],eax ;240
|
|
mov eax,[ply1rx]
|
|
add eax,30
|
|
mov dword [ballx],eax ;200
|
|
mov dword [ballyv],2
|
|
random 3,dword [ballxv]
|
|
sub dword [ballxv],1
|
|
yax_ok:
|
|
|
|
xorx:
|
|
cmp dword [ballxv],0
|
|
jne norx
|
|
random 3,dword [ballxv]
|
|
sub dword [ballxv],1
|
|
cmp dword [ballxv],0
|
|
je xorx
|
|
norx:
|
|
|
|
;test on collusion ply1 of ball
|
|
collusion_test:
|
|
collimg img,[ply1x],[ply1y],img3,[ballx],[bally],eax
|
|
cmp eax,1
|
|
jne not_coll
|
|
neg dword [ballyv]
|
|
sub dword [bally],4
|
|
; neg dword [ballxv]
|
|
not_coll:
|
|
|
|
;test on collusion gravity of ball
|
|
collusion_grav:
|
|
collimg img,[gravx],[gravy],img3,[ballx],[bally],eax
|
|
cmp eax,1
|
|
jne not_collg
|
|
sub dword [bally],30
|
|
neg dword [ballyv]
|
|
cmp dword [ballyv],0
|
|
jl ab
|
|
jg bf
|
|
jmp not_collgx
|
|
ab:
|
|
sub dword [ballyv],10
|
|
jmp not_collgx
|
|
bf:
|
|
add dword [ballyv],10
|
|
not_collgx:
|
|
cmp dword [ballxv],0
|
|
jl abx
|
|
jg bfx
|
|
jmp not_collg
|
|
abx:
|
|
sub dword [ballxv],0 ;8 ;15
|
|
jmp not_collg
|
|
bfx:
|
|
add dword [ballxv],0 ;8
|
|
|
|
|
|
; mov dword [ballyv],20
|
|
not_collg:
|
|
|
|
;ply contorl
|
|
control 12,316,[ply1rx]
|
|
control 380,470,[ply1ry]
|
|
|
|
;garvity
|
|
gravity:
|
|
cmp dword [gravtime],0
|
|
je no_dg
|
|
dec dword [gravtime]
|
|
no_dg:
|
|
|
|
draw_gravity:
|
|
cmp dword [gravtime],0
|
|
je nograv
|
|
mov eax,dword [ply1x]
|
|
mov ebx,dword [ply1y]
|
|
sub ebx,30
|
|
mov dword [gravx],eax
|
|
mov dword [gravy],ebx
|
|
jmp endgrav
|
|
nograv:
|
|
mov dword [gravx],1000
|
|
mov dword [gravy],1000
|
|
endgrav:
|
|
|
|
redraw_images:
|
|
setimg dword [ply1x],dword [ply1y],img2
|
|
setimg dword [ballx],dword [bally],img3
|
|
setimg dword [gravx],dword [gravy],img5
|
|
|
|
draw_blocks:
|
|
mov ecx,0
|
|
xxx2:
|
|
pushad
|
|
mov esi,dword [mass+ecx]
|
|
mov edi,dword [mass+ecx+4]
|
|
mov ebp,dword [mass+ecx+8]
|
|
cmp ebp,0
|
|
je notpt
|
|
cmp ebp,1
|
|
jne no_a
|
|
setimg esi,edi,img7a
|
|
jmp notpt
|
|
no_a:
|
|
cmp ebp,2
|
|
jne no_b
|
|
setimg esi,edi,img7b
|
|
jmp notpt
|
|
no_b:
|
|
cmp ebp,3
|
|
jne no_c
|
|
setimg esi,edi,img7c
|
|
jmp notpt
|
|
no_c:
|
|
|
|
notpt:
|
|
popad
|
|
add ecx,12
|
|
cmp ecx,[blocks_max]
|
|
jne xxx2
|
|
|
|
;collusion ball of blocks
|
|
coll_blocks:
|
|
mov [temp3],0
|
|
mov ecx,0
|
|
testloop:
|
|
pushad
|
|
mov ebp,dword [mass+ecx+8]
|
|
cmp ebp,0
|
|
jne testcol
|
|
jmp notest
|
|
testcol:
|
|
mov [temp3],1
|
|
mov esi,dword [mass+ecx]
|
|
mov edi,dword [mass+ecx+4]
|
|
mov [temp1],esi
|
|
mov [temp2],edi
|
|
push ecx
|
|
collimg img8,[temp1],[temp2],img3,[ballx],[bally],eax
|
|
pop ecx
|
|
cmp eax,1
|
|
jne notest
|
|
mov dword [mass+ecx+8],0
|
|
; neg [ballxv]
|
|
neg [ballyv]
|
|
add [scorea],30
|
|
call draw_window
|
|
jmp end_col
|
|
notest:
|
|
popad
|
|
add ecx,12
|
|
cmp ecx,[blocks_max]
|
|
jne testloop
|
|
end_col:
|
|
|
|
cmp [delay_cnt],0
|
|
jne no_delay
|
|
mov [delay_cnt],1
|
|
delay 1 ;don't generate delay for fast speed programm
|
|
no_delay:
|
|
dec [delay_cnt]
|
|
|
|
win_test:
|
|
cmp [temp3],1
|
|
je stl
|
|
; inc [level]
|
|
mov [nextlev],1
|
|
mov [againbut],1
|
|
call draw_window
|
|
; label 160,200,'You Win!',cl_Green+font_Big
|
|
; label 130,220,'Youre Score:',cl_Green+font_Big
|
|
; outcount dword [scorea],230,220,cl_Green,5*65536
|
|
; label 130,234,'Youre Lives:',cl_Green+font_Big
|
|
; outcount dword [scoreb],230,234,cl_Green,5*65536
|
|
; delay 600 ;wait 2sec
|
|
; close ;exit from program
|
|
stl:
|
|
|
|
lose_test:
|
|
cmp [scoreb],0
|
|
jne stl2
|
|
; call draw_window
|
|
; label 160,200,'You Lose!',cl_Red+font_Big
|
|
; label 130,220,'Youre Score:',cl_Red+font_Big
|
|
; outcount dword [scorea],230,220,cl_Red,5*65536
|
|
; delay 300 ;wait 2sec
|
|
; close ;exit from program
|
|
; mov ebx,10*65536+40
|
|
; mov ebx,10*65536+20
|
|
; mov edx,2
|
|
; mov esi,0x0000ff00
|
|
; mov eax,8
|
|
; int 0x40
|
|
mov [level],0
|
|
mov [nextlev],0
|
|
mov [againbut],1
|
|
call draw_window
|
|
|
|
stl2:
|
|
|
|
jmp still
|
|
|
|
red:
|
|
call draw_window
|
|
jmp still
|
|
|
|
key: ; key
|
|
mov eax,2
|
|
int 0x40
|
|
cmp ah,key_Left
|
|
jne no_l
|
|
sub dword [ply1rx],50 ;24 ;16
|
|
no_l:
|
|
cmp ah,key_Right
|
|
jne no_r
|
|
add dword [ply1rx],50 ;24 ;16
|
|
no_r:
|
|
cmp ah,key_Up
|
|
jne no_u
|
|
sub dword [ply1ry],20
|
|
no_u:
|
|
cmp ah,key_Down
|
|
jne no_d
|
|
add dword [ply1ry],20
|
|
no_d:
|
|
cmp ah,key_Space
|
|
jne no_sp
|
|
mov dword [gravtime],100
|
|
no_sp:
|
|
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:
|
|
cmp ah,2
|
|
jne noplayagain
|
|
mov [xt],100
|
|
mov [yt],100
|
|
mov [gravtime],10
|
|
mov [gravx],1000
|
|
mov [gravy],1000
|
|
mov [ply1rx],160
|
|
mov [ply1ry],460
|
|
mov [ply1x],160
|
|
mov [ply1y],400
|
|
mov [ballx],200
|
|
mov [bally],300
|
|
mov [ballyv],2
|
|
mov [ballxv],1
|
|
|
|
cmp [nextlev],1
|
|
je noch
|
|
mov [scorex],0
|
|
mov [scorea],0
|
|
mov [scoreb],3
|
|
jmp noch2
|
|
noch:
|
|
inc [scoreb]
|
|
inc [level]
|
|
mov eax,[maxlev]
|
|
cmp [level],eax
|
|
jna noch2
|
|
mov [level],eax
|
|
noch2:
|
|
|
|
mov eax,18*4*5
|
|
mul [level]
|
|
mov ebp,eax
|
|
add ebp,levels
|
|
mov ecx,18*4*5 ;bytes
|
|
loo:
|
|
mov eax,dword [ebp+ecx]
|
|
mov dword [mass+ecx],eax
|
|
sub ecx,4
|
|
jnz loo
|
|
|
|
mov [againbut],0
|
|
|
|
call draw_window
|
|
noplayagain:
|
|
jmp still
|
|
|
|
|
|
draw_window:
|
|
startwd
|
|
window 0,0,400+8,480+24,window_Skinned
|
|
label 12,8,'ARCANOID: USE ARROW KEYS LIVES SCORE',cl_White+font_Big
|
|
|
|
cmp [againbut],0
|
|
je no_againbut
|
|
|
|
cmp [nextlev],1
|
|
je nlev
|
|
label 160,200,'You Lose!',cl_Red+font_Big
|
|
label 130,220,'Youre Score:',cl_Red+font_Big
|
|
outcount dword [scorea],230,220,cl_Red,5*65536
|
|
mov ebx,150*65536+80
|
|
mov ecx,240*65536+12
|
|
mov edx,2
|
|
mov esi,0x0000aa00
|
|
mov eax,8
|
|
int 0x40
|
|
mov ecx,260*65536+12
|
|
mov edx,1
|
|
int 0x40
|
|
label 152,244,'Play again?',cl_Red+font_Big
|
|
jmp elev
|
|
nlev:
|
|
label 160,200,'You Win!',cl_Green+font_Big
|
|
label 130,220,'Youre Score:',cl_Green+font_Big
|
|
outcount dword [scorea],230,220,cl_Green,5*65536
|
|
mov ebx,150*65536+80
|
|
mov ecx,240*65536+12
|
|
mov edx,2
|
|
mov esi,0x0000aa00
|
|
mov eax,8
|
|
int 0x40
|
|
mov ecx,260*65536+12
|
|
mov edx,1
|
|
int 0x40
|
|
label 152,244,'Next level?',cl_Red+font_Big
|
|
elev:
|
|
|
|
label 178,264,'Exit?',cl_Red+font_Big
|
|
no_againbut:
|
|
|
|
endwd
|
|
ret
|
|
|
|
|
|
; DATA AREA
|
|
againbut dd 0
|
|
|
|
xt dd 100
|
|
yt dd 100
|
|
|
|
gravtime dd 10
|
|
gravx dd 1000
|
|
gravy dd 1000
|
|
|
|
ply1rx dd 160
|
|
ply1ry dd 460
|
|
|
|
ply1x dd 160
|
|
ply1y dd 400
|
|
|
|
ballx dd 200
|
|
bally dd 300
|
|
|
|
ballyv dd 2
|
|
ballxv dd 1
|
|
|
|
temp1 dd 0
|
|
temp2 dd 0
|
|
temp3 dd 0
|
|
|
|
scorex dd 0
|
|
scorea dd 0
|
|
scoreb dd 3
|
|
|
|
level dd 0
|
|
nextlev dd 0
|
|
maxlev dd 2
|
|
|
|
counter dd 0
|
|
tsoi dd 0
|
|
|
|
delay_cnt dd 0
|
|
|
|
blocks_max dd 6*5*12 ;size in bytes 5*3 dd
|
|
|
|
mass:
|
|
dd 30,200,0 ,90,200,0 ,150,200,0 ,210,200,0 ,270,200,0 ,330,200,0
|
|
dd 30,180,0 ,90,180,0 ,150,180,0 ,210,180,0 ,270,180,0 ,330,180,0
|
|
dd 30,160,0 ,90,160,0 ,150,160,0 ,210,160,0 ,270,160,0 ,330,160,0
|
|
dd 30,140,0 ,90,140,1 ,150,140,1 ,210,140,1 ,270,140,0 ,330,140,0
|
|
dd 30,120,0 ,90,120,0 ,150,120,0 ,210,120,0 ,270,120,0 ,330,120,0
|
|
|
|
levels:
|
|
dd 30,200,0 ,90,200,0 ,150,200,0 ,210,200,2 ,270,200,0 ,330,200,0
|
|
dd 30,180,2 ,90,180,1 ,150,180,1 ,210,180,2 ,270,180,2 ,330,180,0
|
|
dd 30,160,1 ,90,160,3 ,150,160,1 ,210,160,2 ,270,160,2 ,330,160,2
|
|
dd 30,140,2 ,90,140,1 ,150,140,1 ,210,140,2 ,270,140,2 ,330,140,0
|
|
dd 30,120,0 ,90,120,0 ,150,120,0 ,210,120,2 ,270,120,0 ,330,120,0
|
|
;level2
|
|
dd 30,200,0 ,90,200,3 ,150,200,0 ,210,200,2 ,270,200,2 ,330,200,2
|
|
dd 30,180,0 ,90,180,1 ,150,180,0 ,210,180,2 ,270,180,2 ,330,180,2
|
|
dd 30,160,0 ,90,160,3 ,150,160,0 ,210,160,2 ,270,160,2 ,330,160,2
|
|
dd 30,140,0 ,90,140,1 ,150,140,0 ,210,140,2 ,270,140,2 ,330,140,2
|
|
dd 30,120,0 ,90,120,3 ,150,120,0 ,210,120,2 ,270,120,2 ,330,120,2
|
|
;level3
|
|
dd 30,200,1 ,90,200,3 ,150,200,1 ,210,200,2 ,270,200,2 ,330,200,2
|
|
dd 30,180,2 ,90,180,1 ,150,180,1 ,210,180,2 ,270,180,2 ,330,180,2
|
|
dd 30,160,1 ,90,160,3 ,150,160,1 ,210,160,2 ,270,160,2 ,330,160,2
|
|
dd 30,140,2 ,90,140,1 ,150,140,1 ,210,140,2 ,270,140,2 ,330,140,2
|
|
dd 30,120,1 ,90,120,3 ,150,120,1 ,210,120,2 ,270,120,2 ,330,120,2
|
|
|
|
arc_file:
|
|
file 'arc.bmp'
|
|
|
|
rb 20000
|
|
|
|
IM_END:
|
|
|
|
pong:
|
|
rb 80*60*3+8
|
|
img:
|
|
rb 32*32*3+8
|
|
img2:
|
|
rb 32*32*3+8
|
|
img3:
|
|
rb 32*32*3+8
|
|
img4:
|
|
rb 80*20*3+8
|
|
img5:
|
|
rb 80*20*3+8
|
|
img6:
|
|
rb 15*15*3+8
|
|
img7a:
|
|
rb 60*20*3+8
|
|
img7b:
|
|
rb 60*20*3+8
|
|
img7c:
|
|
rb 60*20*3+8
|
|
img8:
|
|
rb 60*40*3+8
|
|
|
|
I_END:
|