Rev 7458 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
31 | halyavin | 1 | ; by jj |
2 | ; (jacek jerzy malinowski) |
||
3 | ; |
||
4 | ; contact: 4nic8@casiocalc.org |
||
5 | ;---------------------------------------- |
||
6 | |||
7 | include 'lang.inc' |
||
2066 | dunkaist | 8 | include '../../../macros.inc' |
31 | halyavin | 9 | include 'ascl.inc' |
10 | include 'ascgl.inc' |
||
11 | include 'asjc.inc' |
||
12 | |||
13 | X_SIZE equ 400 |
||
14 | Y_SIZE equ 300 |
||
15 | |||
16 | MAX_LEVEL equ 5 |
||
17 | |||
18 | BACK_CL equ 0x00EFEF ; background color |
||
19 | |||
20 | ; THE MAIN PROGRAM: |
||
21 | use32 |
||
22 | |||
23 | org 0x0 |
||
24 | |||
25 | db 'MENUET01' ; 8 byte id |
||
26 | dd 0x01 ; header version |
||
27 | dd START ; start of code |
||
28 | dd I_END ; size of image |
||
29 | dd 0x200000 ; memory for app |
||
30 | dd 0x7fff0 ; esp |
||
31 | dd 0x0 , 0x0 ; I_Param , I_Icon |
||
32 | |||
33 | START: ; start of execution |
||
34 | |||
35 | bmptoimg bmp_file,img_bmp ; loading ... ;] |
||
36 | getimg img_bmp,0,0,10,10,img_ball |
||
37 | getimg img_bmp,20,0,20,10,img_bonus |
||
38 | getimg img_bmp,0,10,40,20,img_brick1 |
||
39 | getimg img_bmp,0,30,40,20,img_brick2 |
||
40 | getimg img_bmp,0,50,40,20,img_brick3 |
||
41 | getimg img_bmp,0,70,40,20,img_brick4 |
||
42 | |||
43 | call draw_window |
||
44 | |||
45 | still: |
||
2066 | dunkaist | 46 | cmp [is_rolled_up], 1 |
47 | jne @f |
||
48 | jmp .no_game |
||
49 | @@: |
||
50 | |||
31 | halyavin | 51 | if_e dword [level],0,.no_intro |
52 | call intro |
||
53 | jmp .no_game |
||
54 | .no_intro: |
||
55 | |||
56 | if_e dword [mode],2,.end_if1 |
||
57 | call level_info |
||
58 | jmp .no_game |
||
59 | .end_if1: |
||
60 | |||
61 | if_e dword [mode],4,.end_if2 |
||
62 | call game_over |
||
63 | jmp .no_game |
||
64 | .end_if2: |
||
65 | |||
66 | call fast_gfx ; <-- the main engine |
||
67 | .no_game: |
||
68 | |||
69 | mov eax,11 |
||
485 | heavyiron | 70 | mcall |
31 | halyavin | 71 | |
72 | cmp eax,1 ; redraw request ? |
||
73 | je red |
||
74 | cmp eax,2 ; key in buffer ? |
||
75 | je key |
||
76 | cmp eax,3 ; button in buffer ? |
||
77 | je button |
||
78 | |||
79 | jmp still |
||
80 | |||
81 | red: ; redraw |
||
2066 | dunkaist | 82 | mov [is_rolled_up], 0 |
83 | mcall 9,proc_info,-1 |
||
84 | test [proc_info+process_information.wnd_state], 0x04 |
||
85 | jz @f |
||
86 | mov [is_rolled_up], 1 |
||
87 | @@: |
||
31 | halyavin | 88 | call draw_window |
89 | jmp still |
||
90 | |||
91 | key: ; key |
||
92 | mov eax,2 ; just read it and ignore |
||
485 | heavyiron | 93 | mcall |
31 | halyavin | 94 | cmp ah,key_Esc ; if Esc ? |
95 | jne .no_q |
||
485 | heavyiron | 96 | or eax,-1 |
97 | mcall |
||
31 | halyavin | 98 | .no_q: |
99 | |||
100 | if_e dword [mode],4,.end_if6 |
||
101 | jmp still |
||
102 | .end_if6: |
||
103 | |||
104 | cmp ah,key_Space |
||
105 | jne .no_space |
||
106 | if_e dword [mode],2,.end_if1 |
||
107 | mov dword [mode],0 |
||
108 | jmp .no_space |
||
109 | .end_if1: |
||
110 | mov dword [mode],1 |
||
111 | call fast_gfx |
||
112 | .no_space: |
||
113 | xor ebx,ebx |
||
114 | mov bl,ah |
||
115 | if_e ebx,key_F1,.no_f1 |
||
116 | inc dword [del] |
||
117 | .no_f1: |
||
118 | if_e ebx,key_F2,.no_f2 |
||
119 | if_a dword [del],0,.end_if3 |
||
120 | dec dword [del] |
||
121 | .end_if3: |
||
122 | .no_f2: |
||
123 | |||
124 | |||
125 | jmp still |
||
126 | |||
127 | button: ; button |
||
128 | mov eax,17 ; get id |
||
485 | heavyiron | 129 | mcall |
31 | halyavin | 130 | |
131 | cmp ah,1 ; button id=1 ? |
||
132 | jne noclose |
||
133 | |||
134 | mov eax,-1 ; close this program |
||
485 | heavyiron | 135 | mcall |
31 | halyavin | 136 | noclose: |
137 | |||
138 | jmp still |
||
139 | |||
140 | ; ********************************************* |
||
141 | ; ******* VIRTUAL SCREEN FUNCTIONS ************ |
||
142 | ; ********************************************* |
||
143 | |||
144 | show_screen: ; flips the virtual screen to the window |
||
7458 | leency | 145 | push_abc |
146 | mcall 7, screen, |
||
31 | halyavin | 147 | pop_abc |
148 | ret |
||
149 | |||
150 | put_bmp_screen: ; eax - y , ebx - x, esi - bmp |
||
151 | cmp ebx,X_SIZE-5 |
||
152 | jb .ok1 |
||
153 | ret |
||
154 | .ok1: |
||
155 | cmp eax,Y_SIZE-5 |
||
156 | jb .ok2 |
||
157 | ret |
||
158 | .ok2: |
||
159 | |||
160 | push_abc |
||
161 | xor ecx,ecx |
||
162 | xor edx,edx |
||
163 | mov edi,screen |
||
164 | mov ecx,3 |
||
165 | mul ecx ; xx = 3*y*X_SIZE+3*x |
||
166 | mov ecx,X_SIZE |
||
167 | mul ecx |
||
168 | push eax ; #> 1 |
||
169 | mov eax,ebx |
||
170 | mov ecx,3 |
||
171 | mul ecx |
||
172 | mov ebx,eax |
||
173 | pop edx ; #< 1 |
||
174 | add edx,ebx |
||
175 | add edi,edx ; sets the pointer to x,y of the screen |
||
176 | |||
177 | mov cx,[si] ; loops 1 |
||
178 | xor ebx,ebx |
||
179 | mov ax,cx |
||
180 | mov dx,3 |
||
181 | mul dx |
||
182 | mov bx,ax |
||
183 | |||
184 | push ebx ;#>4 |
||
185 | |||
186 | add si,4 |
||
187 | mov ax,[si] ; loops 2 |
||
188 | mov cx,[si] |
||
189 | ;shr ax,2 |
||
190 | mov dx,3 ; dx = ax *3 |
||
191 | mul dx |
||
192 | mov bx,ax |
||
193 | add si,4 |
||
194 | |||
195 | |||
196 | pop ebx ;#<4 |
||
197 | .l_y: |
||
198 | mov ax,cx |
||
199 | cld |
||
200 | mov cx,bx |
||
201 | rep movs byte [edi],[esi] |
||
202 | add edi,X_SIZE |
||
203 | add edi,X_SIZE |
||
204 | add edi,X_SIZE |
||
205 | sub edi,ebx |
||
206 | mov cx,ax |
||
207 | loop .l_y |
||
208 | |||
209 | pop_abc |
||
210 | ret |
||
211 | |||
212 | rect_screen: ; eax - y , ebx - x, ecx - size x, edx - size y, si -color |
||
213 | mov edi,ebx |
||
214 | add ebx,ecx |
||
215 | cmp ebx,X_SIZE |
||
216 | jb .ok1 |
||
217 | ret |
||
218 | .ok1: |
||
219 | mov ebx,edi |
||
220 | |||
221 | mov edi,eax |
||
222 | add eax,edx |
||
223 | cmp eax,Y_SIZE |
||
224 | jb .ok2 |
||
225 | ret |
||
226 | .ok2: |
||
227 | mov eax,edi |
||
228 | push_abc |
||
229 | push ecx ;#>2 |
||
230 | push edx ;#>3 |
||
231 | |||
232 | xor ecx,ecx |
||
233 | xor edx,edx |
||
234 | mov edi,screen |
||
235 | mov ecx,3 |
||
236 | mul ecx ; xx = 3*y*X_SIZE+3*x |
||
237 | mov ecx,X_SIZE |
||
238 | mul ecx |
||
239 | push eax ; #> 1 |
||
240 | mov eax,ebx |
||
241 | mov ecx,3 |
||
242 | mul ecx |
||
243 | mov ebx,eax |
||
244 | pop edx ; #< 1 |
||
245 | add edx,ebx |
||
246 | |||
247 | add edi,edx ; sets the pointer to x,y of the screen |
||
248 | |||
249 | pop ecx ; #<3 |
||
250 | pop edx ; #<4 |
||
251 | mov eax,esi |
||
252 | .l_y: |
||
253 | ;mov ax,cx |
||
254 | push ecx |
||
255 | cld |
||
256 | mov ecx,edx |
||
257 | .l_x: |
||
258 | ;rep movs byte [edi],[esi] |
||
259 | mov word [edi],ax |
||
260 | push eax |
||
261 | shr eax,16 |
||
262 | mov byte [edi+2],al |
||
263 | add edi,3 |
||
264 | pop eax |
||
265 | loop .l_x |
||
266 | |||
267 | add edi,X_SIZE |
||
268 | add edi,X_SIZE |
||
269 | add edi,X_SIZE |
||
270 | sub edi,edx |
||
271 | sub edi,edx |
||
272 | sub edi,edx |
||
273 | ;mov cx,ax |
||
274 | pop ecx |
||
275 | loop .l_y |
||
276 | |||
277 | pop_abc |
||
278 | ret |
||
279 | |||
280 | grad_rect_screen: ; eax - y , ebx - x, ecx - size x, edx - size y, si -color, d |
||
281 | push edi ;#>0 |
||
282 | mov edi,ebx |
||
283 | add ebx,ecx |
||
284 | cmp ebx,X_SIZE |
||
285 | jb .ok1 |
||
286 | pop edi ;#<0 |
||
287 | ret |
||
288 | .ok1: |
||
289 | mov ebx,edi |
||
290 | |||
291 | mov edi,eax |
||
292 | add eax,edx |
||
293 | cmp eax,Y_SIZE |
||
294 | jb .ok2 |
||
295 | pop edi ;#<0 |
||
296 | ret |
||
297 | .ok2: |
||
298 | mov eax,edi |
||
299 | |||
300 | pop edi ;#<0 |
||
301 | push_abc |
||
302 | |||
303 | push edi ;#>5 |
||
304 | push ecx ;#>2 |
||
305 | push edx ;#>3 |
||
306 | |||
307 | xor ecx,ecx |
||
308 | xor edx,edx |
||
309 | mov edi,screen |
||
310 | mov ecx,3 |
||
311 | mul ecx ; xx = 3*y*X_SIZE+3*x |
||
312 | mov ecx,X_SIZE |
||
313 | mul ecx |
||
314 | push eax ; #> 1 |
||
315 | mov eax,ebx |
||
316 | mov ecx,3 |
||
317 | mul ecx |
||
318 | mov ebx,eax |
||
319 | pop edx ; #< 1 |
||
320 | add edx,ebx |
||
321 | |||
322 | add edi,edx ; sets the pointer to x,y of the screen |
||
323 | |||
324 | pop ecx ; #<3 |
||
325 | pop edx ; #<2 |
||
326 | mov eax,esi |
||
327 | pop esi ; #<5 |
||
328 | .l_y: |
||
329 | ;mov ax,cx |
||
330 | push ecx |
||
331 | cld |
||
332 | mov ecx,edx |
||
333 | .l_x: |
||
334 | ;rep movs byte [edi],[esi] |
||
335 | mov word [edi],ax |
||
336 | push eax |
||
337 | shr eax,16 |
||
338 | mov byte [edi+2],al |
||
339 | add edi,3 |
||
340 | pop eax |
||
341 | loop .l_x |
||
342 | |||
343 | add edi,X_SIZE |
||
344 | add edi,X_SIZE |
||
345 | add edi,X_SIZE |
||
346 | sub edi,edx |
||
347 | sub edi,edx |
||
348 | sub edi,edx |
||
349 | add eax,esi |
||
350 | ;mov cx,ax |
||
351 | pop ecx |
||
352 | loop .l_y |
||
353 | |||
354 | pop_abc |
||
355 | ret |
||
356 | |||
357 | |||
358 | fill_screen: ; eax - screen color ( 0x00RRGGBB ) |
||
359 | push_abc |
||
360 | mov edi,screen |
||
361 | cld |
||
362 | mov ecx,X_SIZE*Y_SIZE |
||
363 | .lab1: |
||
364 | mov [edi],eax |
||
365 | add edi,3 |
||
366 | loop .lab1 |
||
367 | pop_abc |
||
368 | ret |
||
369 | |||
370 | grad_fill_screen: ; eax - screen color ( 0x00RRGGBB ), ebx - mack |
||
371 | push_abc |
||
372 | mov edi,screen |
||
373 | cld |
||
374 | mov ecx,Y_SIZE |
||
375 | mov dl,0 |
||
376 | .lab1: |
||
377 | push ecx |
||
378 | mov ecx,X_SIZE |
||
379 | .lab2: |
||
380 | mov [edi],eax |
||
381 | add edi,3 |
||
382 | loop .lab2 |
||
383 | mov dh,1 ; dl = 1 - dl |
||
384 | sub dh,dl |
||
385 | mov dl,dh |
||
386 | cmp dl,0 |
||
387 | jne .no_ch ; if (dl==0) |
||
388 | add eax,ebx ; change gradient |
||
389 | .no_ch: |
||
390 | pop ecx |
||
391 | loop .lab1 |
||
7458 | leency | 392 | |
31 | halyavin | 393 | pop_abc |
394 | ret |
||
395 | |||
396 | |||
397 | bmp_fill_screen: ; esi - pointer to a backgroung bmp |
||
398 | push_abc |
||
399 | mov edi,screen |
||
400 | cld |
||
401 | mov ecx,X_SIZE*Y_SIZE |
||
402 | rep movs dword [edi],[esi] |
||
403 | pop_abc |
||
404 | ret |
||
405 | |||
406 | ;___________________ |
||
407 | intro: ; INTRO ; |
||
2066 | dunkaist | 408 | cmp [is_rolled_up], 1 |
409 | jne @f |
||
410 | ret |
||
411 | @@: |
||
7458 | leency | 412 | |
413 | mcall 4,<115,150>,0x82050505,VERSION |
||
414 | mcall ,<125,180>,0x80050505,AUTHOR |
||
415 | mcall ,<90,210>,0x81EE0800,PRESS_SPACE |
||
416 | mcall ,<50,235>,0x81FFA8FF,CHANGE_SPEED |
||
417 | |||
31 | halyavin | 418 | delay 10 |
419 | ret |
||
420 | |||
421 | ;___________________ |
||
422 | level_info: |
||
2066 | dunkaist | 423 | cmp [is_rolled_up], 1 |
424 | jne @f |
||
425 | ret |
||
426 | @@: |
||
7458 | leency | 427 | mcall 4,<179,210>,0x810000FF,LEVEL |
428 | mcall ,<100,250>,0x81DD0800,PRESS_SPACE |
||
429 | outcount [level],195,230,0x10000FF,2*65536 |
||
31 | halyavin | 430 | delay 10 |
431 | ret |
||
432 | |||
433 | ;_________________________ |
||
434 | game_over: ; GAME OVER ; |
||
435 | mov eax,0x00FF00 |
||
436 | mov ebx,0xFF01 |
||
437 | .g_ok: |
||
438 | call grad_fill_screen |
||
439 | call show_screen ; flips the screen |
||
7458 | leency | 440 | mcall 4,<100,110>,0x90050505,GAMEOVER |
441 | mcall ,<140,160>,0x80FFF800,THANKS_FOR_PLAYING |
||
442 | delay 20 |
||
31 | halyavin | 443 | ret |
444 | |||
445 | |||
446 | ;-----------------------------; |
||
447 | ; THE MAIN THE GAME'S ENGINE ; |
||
448 | ;-----------------------------; |
||
449 | fast_gfx: |
||
450 | ; the background gradient |
||
451 | if_e dword [level],0,.no_0 |
||
452 | mov eax,0xFF |
||
453 | mov ebx,0xFEFF |
||
454 | jmp .g_ok |
||
455 | .no_0: |
||
456 | if_e dword [level],1,.no_1 |
||
457 | mov eax,BACK_CL |
||
458 | mov ebx,0xFFFF |
||
459 | jmp .g_ok |
||
460 | .no_1: |
||
461 | if_e dword [level],2,.no_2 |
||
462 | mov eax,0xFF0000 |
||
463 | mov ebx,0xFF00FF |
||
464 | jmp .g_ok |
||
465 | .no_2: |
||
466 | |||
467 | mov eax,BACK_CL |
||
468 | mov ebx,0xFFFF |
||
469 | .g_ok: |
||
470 | call grad_fill_screen |
||
7458 | leency | 471 | |
472 | ;black_bg |
||
473 | ;mov eax,0 |
||
474 | ;mov ebx,0 |
||
475 | ;call fill_screen |
||
31 | halyavin | 476 | |
7458 | leency | 477 | |
31 | halyavin | 478 | mov eax,37 ; get mouse position |
479 | mov ebx,1 |
||
485 | heavyiron | 480 | mcall |
31 | halyavin | 481 | shr eax,16 |
482 | mov [x],eax |
||
483 | add eax,[s_x] |
||
484 | cmp eax,X_SIZE ; controls if the pad is in the screen |
||
485 | jb .ok |
||
486 | cmp eax,0x7FFF ; if < 0 |
||
487 | jb .upper |
||
488 | mov [x],0 |
||
489 | jmp .ok |
||
490 | .upper: ; if > X_SIZE - pad size |
||
491 | mov dword [x],X_SIZE-1 |
||
492 | mov eax,[s_x] |
||
493 | sub dword [x],eax |
||
494 | .ok: |
||
495 | mov ebx,[x] |
||
496 | mov eax,[y] |
||
497 | mov ecx,[s_x] |
||
498 | mov edx,15 |
||
499 | mov esi,0xFF0000 |
||
500 | mov edi,0xF0000F |
||
501 | call grad_rect_screen |
||
502 | |||
503 | call draw_level |
||
504 | |||
505 | cmp dword [mode],1 |
||
506 | jne .no_go ; is the game started ? |
||
507 | mov eax,[v_x] |
||
508 | add dword [b_x],eax |
||
509 | mov eax,[v_y] |
||
510 | add dword [b_y],eax |
||
511 | jmp .go |
||
512 | .no_go: |
||
513 | mov eax,[x] ; b_x = x + x_s/2 |
||
514 | mov ebx,[s_x] |
||
515 | shr ebx,1 |
||
516 | add eax,ebx |
||
517 | mov dword [b_x],eax |
||
518 | mov eax,[y] ; b_y = y - 10 |
||
519 | sub eax,10 |
||
520 | mov dword [b_y],eax |
||
521 | |||
522 | mov dword [v_x],1 |
||
523 | mov dword [v_y],-1 |
||
524 | .go: |
||
525 | ;TEST WHERE IS THE BALL: |
||
526 | cmp dword [b_x],0x7FFFFFFF |
||
527 | jb .b_ok2 ; if out of the screen (left) |
||
528 | mov dword [b_x],0 |
||
529 | mov eax,0 |
||
530 | sub eax,[v_x] |
||
531 | mov [v_x],eax |
||
532 | .b_ok2: |
||
533 | cmp dword [b_x],X_SIZE-10 |
||
534 | jb .b_ok1 ; if out of the screen (right) |
||
535 | mov dword [b_x],X_SIZE-11 |
||
536 | mov eax,0 |
||
537 | sub eax,[v_x] |
||
538 | mov [v_x],eax |
||
539 | .b_ok1: |
||
540 | cmp dword [b_y],0x7FFFFFFF |
||
541 | jb .b_ok3 ; if out of the screen (up) |
||
542 | mov dword [b_y],0 |
||
543 | mov eax,0 |
||
544 | sub eax,[v_y] |
||
545 | mov [v_y],eax |
||
546 | .b_ok3: |
||
547 | cmp dword [b_y],Y_SIZE-10 |
||
548 | jb .b_ok4 ; if out of the screen (down) |
||
549 | mov dword [mode],0 |
||
550 | if_e dword [lives],0,.end_if5 |
||
551 | mov dword [mode],4 ; GAME OVER |
||
552 | jmp still |
||
553 | .end_if5: |
||
554 | dec dword [lives] |
||
555 | .end_else4: |
||
556 | call draw_window |
||
557 | .b_ok4: |
||
558 | |||
559 | imgtoimg img_ball,dword [b_x],dword [b_y],screen_img |
||
560 | |||
561 | call show_screen ; flips the screen |
||
562 | delay dword [del] |
||
563 | |||
564 | call do_tests ; does all needed tests |
||
565 | ret |
||
566 | ;----------------------; |
||
567 | ; BALL & BRICKS EVENTS ; |
||
568 | ;----------------------; |
||
569 | MAX_SPEED equ 3 |
||
570 | do_tests: |
||
571 | ; BALL <-> PAD |
||
572 | mov eax,[b_x] |
||
573 | add eax,10 |
||
574 | cmp eax,[x] ; if (b_x+10)>[pad x] |
||
575 | jb .skip ; && |
||
576 | mov eax,[b_x] |
||
577 | mov ebx,[s_x] |
||
578 | add ebx,[x] |
||
579 | cmp eax,ebx ; if b_x < x + s_x |
||
580 | ja .skip ; && |
||
581 | mov eax,[b_y] |
||
582 | add eax,10 |
||
583 | cmp eax,[y] ; if (b_y+10) > y |
||
584 | jb .skip |
||
585 | sub eax,15 |
||
586 | cmp eax,[y] ; if b_y < y+15 |
||
587 | ja .skip |
||
588 | cmp dword [v_y],0x7FFFFF ; if v_y > 0 |
||
589 | ja .skip |
||
590 | cmp dword [v_y],MAX_SPEED; speedup: |
||
591 | ja .skip_s |
||
592 | inc dword [speed_t] |
||
593 | cmp dword [speed_t],5 |
||
594 | jb .skip_s |
||
595 | inc dword [v_y] |
||
596 | mov dword [speed_t],0 |
||
597 | .skip_s: |
||
598 | inc dword [speed_t] |
||
599 | mov eax,0 |
||
600 | sub eax,[v_y] |
||
601 | mov [v_y],eax |
||
602 | ;counting v_x:-------- |
||
603 | mov eax,[b_x] |
||
604 | sub eax,[x] |
||
605 | sub eax,5 |
||
606 | mov ecx,eax |
||
607 | if_a eax,100,.end_if3 |
||
608 | mov eax,0 |
||
609 | sub eax,[v_x] |
||
610 | mov [v_x],eax |
||
611 | jmp .skip |
||
612 | .end_if3: |
||
613 | if_a eax,20,.end_if2 |
||
614 | sub eax,20 |
||
615 | shr eax,2 |
||
616 | mov [v_x],eax |
||
617 | jmp .skip |
||
618 | .end_if2: |
||
619 | mov ebx,20 |
||
620 | sub ebx,ecx |
||
621 | shr ebx,2 |
||
622 | mov dword [v_x],0 |
||
623 | sub dword [v_x],ebx |
||
624 | .skip: |
||
625 | |||
626 | ; BALL <-> BRICK |
||
627 | mov dword [coliz],0 |
||
628 | call colision |
||
629 | if_e dword [coliz],1,.end_if6 |
||
630 | ;abs dword [v_y] |
||
631 | ;abs dword [v_x] |
||
632 | ret |
||
633 | .end_if6: |
||
634 | add dword [b_x],10 |
||
635 | call colision |
||
636 | sub dword [b_x],10 |
||
637 | if_e dword [coliz],1,.end_if7 |
||
638 | ;abs dword [v_y] |
||
639 | ;abs dword [v_x] |
||
640 | ch_sign dword [v_x] |
||
641 | ret |
||
642 | .end_if7: |
||
643 | add dword [b_y],10 |
||
644 | call colision |
||
645 | sub dword [b_y],10 |
||
646 | if_e dword [coliz],1,.end_if8 |
||
647 | ;abs dword [v_y] |
||
648 | ;abs dword [v_x] |
||
649 | ;ch_sign dword [v_y] |
||
650 | ret |
||
651 | .end_if8: |
||
652 | add dword [b_x],10 |
||
653 | add dword [b_y],10 |
||
654 | call colision |
||
655 | sub dword [b_x],10 |
||
656 | sub dword [b_y],10 |
||
657 | if_e dword [coliz],1,.end_if9 |
||
658 | ;abs dword [v_y] |
||
659 | ;abs dword [v_x] |
||
660 | ;ch_sign dword [v_x] |
||
661 | ;ch_sign dword [v_y] |
||
662 | |||
663 | ret |
||
664 | .end_if9: |
||
665 | |||
666 | |||
667 | ret |
||
668 | |||
669 | colision: |
||
670 | |||
671 | mov esi,levels |
||
672 | mov eax,[level] ; eax = levels*100 |
||
673 | mov bx,100 |
||
674 | mul bx |
||
675 | add esi,eax |
||
676 | ;-------------- |
||
677 | xor edx,edx |
||
678 | mov eax,[b_x] |
||
679 | mov ebx,40 |
||
680 | div ebx |
||
681 | mov ecx,eax |
||
682 | push edx ;#>1 |
||
683 | |||
684 | xor edx,edx |
||
685 | mov eax,[b_y] |
||
686 | mov ebx,20 |
||
687 | div ebx |
||
688 | push edx ;#>2 |
||
689 | cmp eax,9 ; out of the bricks board |
||
690 | ja .ok2 |
||
691 | mov ebx,10 |
||
692 | mul ebx |
||
693 | add eax,ecx |
||
694 | add esi,eax |
||
695 | |||
696 | cmp byte [esi],0 ; 0 - no brick |
||
697 | je .ok2 |
||
698 | if_ne byte [esi],4,.end_if1 |
||
699 | dec byte [esi] |
||
700 | .end_if1: |
||
701 | mov dword [coliz],1 |
||
702 | pop ebx ;#<2 |
||
703 | pop eax ;#<1 |
||
704 | cmp ecx,8 ; x < 5 || x >35 - x inv |
||
705 | jb .inv |
||
706 | cmp ecx,33 |
||
707 | ja .inv |
||
708 | jmp .no_inv |
||
709 | .inv: |
||
710 | mov eax,0 |
||
711 | sub eax,[v_x] |
||
712 | mov [v_x],eax |
||
713 | ;jmp .no_ok |
||
714 | .no_inv: |
||
715 | cmp ebx,6 ; if y < 5 || y>15 - y inv |
||
716 | jb .inv_y |
||
717 | cmp ebx,14 |
||
718 | ja .inv_y |
||
719 | jmp .no_ok |
||
720 | .inv_y: |
||
721 | mov eax,0 |
||
722 | sub eax,[v_y] |
||
723 | mov [v_y],eax |
||
724 | .no_ok: |
||
725 | jmp .ok |
||
726 | .ok2: |
||
727 | pop eax ;#<1 |
||
728 | pop eax ;#<2 |
||
729 | .ok: |
||
730 | |||
731 | |||
732 | ret |
||
733 | |||
734 | ;-----------------------------------; |
||
735 | ; DRAWS CURRENT LEVEL ON THE SCREEN ; |
||
736 | ;-----------------------------------; |
||
737 | draw_level: |
||
738 | mov esi,levels |
||
739 | mov eax,[level] ; eax = levels*100 |
||
740 | mov bx,100 |
||
741 | mul bx |
||
742 | add esi,eax |
||
743 | mov ecx,10 |
||
744 | mov eax,0 |
||
745 | mov dword [l_end],1 |
||
746 | .l_y: |
||
747 | push ecx ;#>1 |
||
748 | mov ebx,0 |
||
749 | mov ecx,10 |
||
750 | .l_x: |
||
751 | cmp byte [esi],1 ; if 1 ? |
||
752 | push esi;#>2 |
||
753 | jne .no_1 |
||
754 | mov esi,img_brick1 |
||
755 | call put_bmp_screen |
||
756 | mov dword [l_end],0 |
||
757 | .no_1: |
||
758 | cmp byte [esi],2 ; if 2 ? |
||
759 | jne .no_2 |
||
760 | mov esi,img_brick2 |
||
761 | call put_bmp_screen |
||
762 | mov dword [l_end],0 |
||
763 | .no_2: |
||
764 | cmp byte [esi],3 ; if 3 ? |
||
765 | jne .no_3 |
||
766 | mov esi,img_brick3 |
||
767 | call put_bmp_screen |
||
768 | mov dword [l_end],0 |
||
769 | .no_3: |
||
770 | cmp byte [esi],4 ; if 4 ? |
||
771 | jne .no_4 |
||
772 | mov esi,img_brick4 |
||
773 | call put_bmp_screen |
||
774 | .no_4: |
||
775 | |||
776 | add ebx,40 |
||
777 | pop esi ;#<2 |
||
778 | inc esi |
||
779 | loop .l_x |
||
780 | add eax,20 ;#<1 |
||
781 | pop ecx |
||
782 | loop .l_y |
||
783 | ;---------------- |
||
784 | ; NEXT LEVEL |
||
785 | if_e dword [l_end],1,.end_if ; all bricks are taken |
||
786 | if_e dword [mode],1,.end_if |
||
787 | add dword [level],1 |
||
788 | if_a dword [level],MAX_LEVEL,.end_if2 |
||
789 | mov dword [mode],4 ; game over |
||
790 | jmp still |
||
791 | .end_if2: |
||
792 | call fast_gfx |
||
793 | mov dword [mode],2 |
||
794 | .end_if: |
||
795 | ret |
||
796 | |||
797 | ; ********************************************* |
||
798 | ; ******* WINDOW DEFINITIONS AND DRAW ******** |
||
799 | ; ********************************************* |
||
800 | |||
801 | |||
802 | draw_window: |
||
803 | |||
2683 | leency | 804 | mcall 12,1 |
7458 | leency | 805 | mcall 48,4 |
806 | lea ecx, [100*65536+Y_SIZE+4+eax]; [y start] *65536 + [y size] + [skin_height] |
||
807 | mcall 0,<100,X_SIZE+9>,,0x74ffffff,,0 |
||
808 | |||
809 | mov eax, [lives] |
||
810 | add eax, '0' |
||
811 | mov esi, HEADER |
||
812 | add esi, 28 |
||
813 | mov [esi], eax |
||
814 | mcall 71,1,HEADER |
||
31 | halyavin | 815 | |
2066 | dunkaist | 816 | cmp [is_rolled_up], 1 |
817 | je @f |
||
31 | halyavin | 818 | call fast_gfx |
2066 | dunkaist | 819 | @@: |
31 | halyavin | 820 | |
2683 | leency | 821 | mcall 12,2 |
31 | halyavin | 822 | |
823 | ret |
||
824 | |||
825 | ;-----------;#################### |
||
826 | ; DATA AREA ;#################### |
||
827 | ;-----------;#################### |
||
828 | |||
7458 | leency | 829 | GAMEOVER db 'G A M E O V E R', 0 |
830 | HEADER db 'ARCANOID II LIVES: ? ', 0 |
||
831 | VERSION db 'ARCANOID II',0 |
||
832 | AUTHOR db 'by jj (jacek jerzy malinowski)',0 |
||
833 | CHANGE_SPEED db 'F2 dec speed F3 inc speed',0 |
||
2683 | leency | 834 | |
7458 | leency | 835 | if lang eq it |
836 | THANKS_FOR_PLAYING db 'Grazie per aver giocato', 0 |
||
837 | PRESS_SPACE db 'Premi spazio per iniziare',0 |
||
838 | LEVEL db 'LIVELLO',0 |
||
839 | else |
||
840 | THANKS_FOR_PLAYING db 'Thanks for playing', 0 |
||
841 | PRESS_SPACE db 'press SPACE to start',0 |
||
842 | LEVEL db 'LEVEL',0 |
||
843 | end if |
||
844 | |||
2066 | dunkaist | 845 | is_rolled_up dd 0 |
846 | |||
7491 | leency | 847 | lives dd 5 |
31 | halyavin | 848 | mode dd 0 |
849 | l_end dd 0 ; if 1 the level is over |
||
850 | ; PAD x: |
||
851 | x dd 20 |
||
852 | y dd Y_SIZE-20 |
||
853 | ; PAD length: |
||
854 | s_x dd 40 |
||
855 | |||
856 | ; the ball stuff ;-) |
||
857 | b_x dd 100 |
||
858 | b_y dd 250 |
||
859 | v_y dd 0 |
||
860 | v_x dd 3 |
||
861 | |||
862 | speed_t dd 0 ; 1/10 times speedup |
||
863 | del dd 1 ; delay |
||
864 | |||
865 | coliz dd 0 ; if 1 then colizion with a brick |
||
866 | |||
867 | ; LEVELS: |
||
868 | level dd 0 |
||
869 | levels: |
||
870 | ;LEVEL 0: |
||
871 | db 0,0,0,0,0,0,0,0,0,0 |
||
872 | db 0,4,0,0,4,4,0,0,0,4 |
||
873 | db 4,0,4,0,4,0,4,0,4,0 |
||
874 | db 4,0,4,0,4,0,4,0,4,0 |
||
875 | db 4,4,4,0,4,4,0,0,4,0 |
||
876 | db 4,0,4,0,4,0,4,0,4,0 |
||
877 | db 4,0,4,0,4,0,4,0,0,4 |
||
878 | db 0,0,0,0,0,0,0,0,0,0 |
||
879 | db 0,0,0,0,0,0,0,0,0,0 |
||
880 | db 0,0,0,0,0,0,0,0,0,0 |
||
881 | |||
882 | ;LEVEL 1: |
||
883 | db 1,1,1,1,1,1,1,1,1,1 |
||
884 | db 0,3,0,0,3,3,0,0,0,3 |
||
885 | db 3,0,3,0,3,0,3,0,3,0 |
||
886 | db 3,0,3,0,3,0,3,0,3,0 |
||
887 | db 3,3,3,0,3,3,0,0,3,0 |
||
888 | db 3,0,3,0,3,0,3,0,3,0 |
||
889 | db 3,0,3,0,3,0,3,0,0,3 |
||
890 | db 2,2,2,2,2,2,2,2,2,2 |
||
891 | db 1,1,1,1,1,1,1,1,1,1 |
||
892 | db 1,1,1,1,1,1,1,1,1,1 |
||
893 | ;LEVEL 2: |
||
894 | db 3,3,3,3,0,0,3,3,3,3 |
||
895 | db 3,1,1,1,0,0,1,1,1,3 |
||
896 | db 3,1,2,1,3,3,1,2,1,3 |
||
897 | db 0,1,0,1,3,3,1,0,1,0 |
||
898 | db 2,1,2,1,1,1,1,2,1,2 |
||
899 | db 0,1,0,1,2,2,1,0,1,0 |
||
900 | db 2,1,2,1,1,1,1,2,1,2 |
||
901 | db 0,1,0,1,1,1,1,0,1,0 |
||
902 | db 0,0,0,1,0,0,1,0,0,0 |
||
903 | db 0,0,0,1,0,0,1,0,0,0 |
||
904 | ;LEVEL 3: |
||
905 | db 1,2,3,1,2,3,1,3,2,1 |
||
906 | db 2,3,1,2,3,1,3,3,1,2 |
||
907 | db 3,1,2,3,1,2,3,1,2,3 |
||
908 | db 1,2,3,1,2,3,1,3,2,1 |
||
909 | db 2,3,1,2,3,1,3,3,1,2 |
||
910 | db 3,1,2,3,1,2,3,1,2,3 |
||
911 | db 1,2,1,2,1,2,1,2,1,2 |
||
912 | db 1,0,1,0,1,0,1,0,1,0 |
||
913 | db 0,0,3,0,0,0,0,3,0,0 |
||
914 | db 0,0,3,0,0,0,0,3,0,0 |
||
915 | ;LEVEL 4: |
||
916 | db 0,0,0,1,1,1,1,0,0,0 |
||
917 | db 0,0,1,2,2,2,2,1,0,0 |
||
918 | db 1,1,1,2,2,2,2,1,1,1 |
||
919 | db 1,0,1,0,2,2,0,1,0,1 |
||
920 | db 0,1,1,2,2,2,2,1,1,0 |
||
921 | db 0,0,1,2,2,2,2,1,0,0 |
||
922 | db 0,0,1,2,2,2,2,1,0,0 |
||
923 | db 0,0,1,2,3,3,2,1,0,0 |
||
924 | db 0,0,1,2,2,2,2,1,0,0 |
||
925 | db 0,0,0,1,1,1,1,0,0,0 |
||
926 | ;LEVEL 5: |
||
927 | db 1,1,1,1,1,1,1,1,1,1 |
||
928 | db 1,2,0,0,3,2,0,0,2,1 |
||
929 | db 1,2,0,0,2,3,0,0,2,1 |
||
930 | db 2,2,0,0,3,2,0,0,2,2 |
||
931 | db 0,0,0,0,2,3,0,0,0,0 |
||
932 | db 0,0,0,1,1,1,1,0,0,0 |
||
933 | db 0,0,1,1,0,0,1,1,0,0 |
||
934 | db 0,0,1,1,0,0,1,1,0,0 |
||
935 | db 2,1,2,1,2,1,2,1,2,1 |
||
936 | db 1,2,1,2,1,2,1,2,1,2 |
||
937 | |||
938 | |||
939 | ; BITMAPs and IMAGEs |
||
940 | bmp_file: |
||
941 | file 'arcanii.bmp' |
||
942 | |||
943 | img_bmp: |
||
944 | rb 40*90*3+8 |
||
945 | img_brick1: |
||
946 | rb 40*20*3+8 |
||
947 | img_brick2: |
||
948 | rb 40*20*3+8 |
||
949 | img_brick3: |
||
950 | rb 40*20*3+8 |
||
951 | img_brick4: |
||
952 | rb 40*20*3+8 |
||
953 | img_ball: |
||
954 | rb 10*10*3+8 |
||
955 | img_bonus: |
||
956 | rb 20*10*3+8 |
||
957 | |||
958 | |||
959 | screen_img: |
||
960 | dd X_SIZE |
||
961 | dd Y_SIZE |
||
962 | screen: |
||
963 | rb X_SIZE*Y_SIZE*3 |
||
2066 | dunkaist | 964 | proc_info: |
965 | rb 1024 |
||
31 | halyavin | 966 | I_END:100,X_SIZE+9>1 |