; ; Pong Gaem 3Ver Mini Sample by Pavlushin Evgeni for ASCL ; www.waptap@mail.ru ; ; Not use bmpfile! ;****************************************************************************** format binary as "" 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_Path ;****************************************************************************** include '..\..\..\macros.inc' include 'ascl.inc' include 'ascgl.inc' include 'ascgml.inc' AREA_W = 640 AREA_H = 480 START: ; start of execution convbmp pongfile, tsoi bmptoimg pongfile, tsoi,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, 10, 80, 20, img5 fullimg imgbr, 80, 4, 0x00000000 ;black for rocket fullimg imgbg, 80, 20, 0x00000000 ;black for grav fullimg imgbb, 12, 12, 0x00000000 ;black for ball still: scevent red,key,button ;mcall 48, 4 ;get skin height ;sub [skin_h], 16 ;div eax, 2 ;mov [skin_h], eax remember_old_coordinates: m2m [ply1x_old], [ply1x] m2m [ply1y_old], [ply1y] m2m [ply2x_old], [ply2x] m2m [ply2y_old], [ply2y] m2m [gravx_old], [gravx] m2m [gravy_old], [gravy] m2m [ballx_old], [ballx] m2m [bally_old], [bally] move_ply1: correct [ply1x], [ply1rx], 4 correct [ply1y], [ply1ry], 2 ; automove ball mov eax, [ballxv] add [ballx], eax mov eax, [ballyv] add [bally], eax ;autoslow ball cmp [ballxv], 0 jl ballb balla: cmp [ballxv], 2 jng balln dec [ballxv] jmp balln ballb: cmp [ballxv], -2 jnl balln inc [ballxv] jmp balln balln: cmp [ballyv], 2 jng by_n dec [ballyv] by_n: ;ball collusion of screen cmp [ballx], AREA_W-12 jna xa_ok neg [ballxv] xa_ok: cmp [ballx], 6 jnb xb_ok neg [ballxv] xb_ok: ;if ball far out of screen come back ; is not work already cmp [bally], AREA_H-30 ;check RED fails jng yax_ok inc [scoreb] call draw_score mov [bally], 240 mov [ballx], 310 mov [ballyv], 2 random 5, [ballxv] sub [ballxv], 2 yax_ok: cmp [bally], 0 ;check BLUE fails jnl yax_ok2 inc [scorea] call draw_score mov [bally], 240 mov [ballx], 310 mov [ballyv], 2 random 5, [ballxv] sub [ballxv], 2 yax_ok2: xorx: cmp [ballxv], 0 jne norx random 5, [ballxv] sub [ballxv], 2 cmp [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 [ballyv] add [bally], 4 ; neg [ballxv] not_coll: ;test on collusion com of ball collusion_com: collimg img, [ply2x], [ply2y], img3, [ballx], [bally], eax cmp eax, 1 jne not_collcom neg [ballyv] sub [bally], 4 ; neg dword [ballxv] not_collcom: ;test on collusion gravity of ball collusion_grav: collimg img, [gravx], [gravy], img3, [ballx], [bally], eax cmp eax, 1 jne not_collg neg [ballyv] ; mov [ballxv], -20 cmp [ballyv], 0 jl ab jg bf jmp not_collgx ab: sub [ballyv], 25 jmp not_collgx bf: add [ballyv], 25 not_collgx: cmp [ballxv], 0 jl abx jg bfx jmp not_collg abx: sub [ballxv], 8 ;15 jmp not_collg bfx: add [ballxv], 8 ; mov [ballyv], 20 not_collg: ;ply contorl cmp [ply1rx], 560 jna plyok cmp [ply1rx], 12000 jna paa mov [ply1rx], 4 jmp plyok paa: mov [ply1rx], 560 plyok: ;com contorl cmp [ply2x], 560 jna cplyok cmp [ply2x], 12000 jna cpaa mov [ply2x], 4 jmp cplyok cpaa: mov [ply2x], 560 cplyok: ;com move cx_move: cmp [bally], 160 jna cno_m mov eax, [ballx] sub eax, 30 cmp [ply2x], eax je cno_m cmp [ply2x], eax ja cm_m cm_p: add [ply2x], 3 jmp cno_m cm_m: sub [ply2x], 3 cno_m: ;garvity gravity: cmp [gravtime], 0 je no_dg dec [gravtime] no_dg: draw_gravity: cmp [gravtime], 0 je nograv mov eax, [ply1x] mov ebx, [ply1y] add ebx, 10 mov [gravx], eax mov [gravy], ebx jmp endgrav nograv: mov [gravx], 1000 mov [gravy], 1000 endgrav: ;next code checks were coordinates of player1 and player2 ;changed or not ; if yes => fill old ; if no => do not fill old redraw_images: ;player1 ;if (ply1x!=ply1x_old) || (ply1y!=ply1y_old) fill1 mov eax, [ply1x] cmp [ply1x_old], eax jne fill1 mov eax, [ply1y] cmp [ply1y_old],eax jne fill1 jmp no_fill1 fill1: setimg [ply1x_old], [ply1y_old], imgbr no_fill1: setimg [ply1x], [ply1y], img ;player2 ;if (ply2x!=ply2x_old) || (ply2y!=ply2y_old) fill2 mov eax, [ply2x] cmp [ply2x_old], eax jne fill2 mov eax, [ply2y] cmp [ply2y_old],eax jne fill2 jmp no_fill2 fill2: setimg [ply2x_old], [ply2y_old], imgbr no_fill2: setimg [ply2x], [ply2y], img2 ;ball setimg [ballx_old], [bally_old], imgbb setimg [ballx], [bally], img3 ;grav setimg [gravx_old], [gravy_old], imgbg setimg [gravx], [gravy], img5 delay 1 ;don't generate delay for fast speed programm jmp still red: call draw_window jmp still key: ; key mov eax, 2 mcall cmp ah, key_Left jne no_l sub [ply1rx], 32 ;16 no_l: cmp ah, key_Right jne no_r add [ply1rx], 32 ;16 no_r: cmp ah, key_Up jne no_u sub [ply1ry], 16 cmp [ply1ry], 0 jb no_u mov [ply1ry], 0 no_u: cmp ah, key_Down jne no_d add [ply1ry], 16 cmp [ply1ry], AREA_H-50 jl no_d mov [ply1ry], AREA_H-50 no_d: cmp ah, key_Space jne no_sp mov [gravtime], 100 no_sp: jmp still button: mcall 17 ; get id cmp ah, 1 ; button id=1 ? jne noclose mcall -1 ; close this program noclose: jmp still draw_window: mcall 12,1 ;start window redraw mcall 0, <10, AREA_W+5+9>, <10, 480+35>, 0x34000000,, wtitle mcall 12,2 ;end window redraw draw_score: mcall 13, <10, 100>, , 0 outcount [scoreb], 10, AREA_H-17, 0x01000000 + cl_Blue, 3 shl 16 outcount [scorea], 50, AREA_H-17, 0x01000000 + cl_Red, 3 shl 16 ret ; DATA AREA wtitle db 'PONG: use Arrow Keys and Space',0 ;skin_h dd 25 ply1x_old dd ? ply1y_old dd ? ply2x_old dd ? ply2y_old dd ? gravx_old dd ? gravy_old dd ? ballx_old dd ? bally_old dd ? xt dd 100 yt dd 100 gravtime dd 10 gravx dd 1000 gravy dd 1000 ply1rx dd 200 ply1ry dd 40 ply1x dd 200 ply1y dd 40 ply2x dd 200 ply2y dd 400 ballx dd 200 bally dd 200 ballyv dd 3 ballxv dd 3 scorea dd 0 scoreb dd 0 counter dd 0 tsoi dd 0 pongfile file 'pong.bmp' IM_END: temp rb 20000 ;real images pong rb 80*60*3+8 img rb 32*32*3+8 img2 rb 32*32*3+8 img3 rb 32*32*3+8 img5 rb 32*32*3+8 ;black to clean old images imgbr rb 80*4 *3+8 imgbg rb 80*20*3+8 imgbb rb 12*12*3+8 I_END: