;
;   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 '..\..\..\macros.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
;    mcall
    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
    mcall
    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
    mcall
    cmp  ah,1                   ; button id=1 ?
    jne  noclose
    mov  eax,-1                 ; close this program
    mcall
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
    mcall
    mov ecx,260*65536+12
    mov edx,1
    mcall
    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
    mcall
    mov ecx,260*65536+12
    mov edx,1
    mcall
    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:
