; ; Hunter. Version 1.1. ; The game application for MeOS game compo 05.03.2005 - 12.03.2005 ; ; Author: Trans ; Date: 07.03.2005 - 08.03.2005 ; Modification: 08.05.2007 ; Compiler: FASM ; Target: MenuetOS game ; include '..\..\..\macros.inc' use32 org 0x0 db 'MENUET01' ; 8 byte id dd 0x01 ; header version dd START ; start of code dd I_END ; size of image dd end_memory ;0x180000 ; memory for app dd start_stack ; esp dd 0x0 , 0x0 ; I_Param , I_Icon START: ; start of execution mov eax,40 mov ebx,00100111b mcall mov eax,26 mov ebx,9 mcall mov [second_count],eax call init_object call draw_window still: ; mov eax,23 ; wait here for event ; mov ebx,10 ; mcall mov eax,05 mov ebx,5 mcall mov eax,11 mcall push eax mov eax,26 mov ebx,9 mcall mov ebx,eax sub eax,[second_count] cmp ax,100 jb still_continue_00 inc dword [time_count] mov [second_count],ebx xor edx,edx mov eax,ebx mov ebx,30 div ebx cmp dl,0 jnz still_loc_01 call change_objects_speed still_loc_01: xor eax,eax mov esi,forward_list mov ecx,4 still_loc_00: cmp eax,dword [esi] jnz still_continue_00 add esi,4 loop still_loc_00 ; call set_current_objects_list call init_object still_continue_00: pop eax call movie_objects cmp eax,1 ; redraw request ? je red cmp eax,2 ; key in buffer ? je key cmp eax,3 ; button in buffer ? je button cmp eax,6 ; mouse ? je mouse call draw_frame jmp still red: ; redraw call draw_window jmp still key: ; key mov eax,2 ; just read it and ignore mcall cmp al,0 jnz still cmp byte [menu_flag],0 jnz still cmp ah,' ' jnz key_loc_00 inc byte [pause_flag] call draw_frame call pause_game key_loc_00: jmp still button: ; button mov eax,17 ; get id mcall cmp ah,1 ; button id=1 ? jne noclose inc byte [game_over_flag] call game_over_draw mov eax,-1 ; close this program mcall noclose: jmp still mouse: ; mouse mov eax,37 ; get coordinate xor ebx,ebx inc ebx mcall cmp ax,20 jae mouse_loc_00 mov ax,20 mouse_loc_00: sub ax,20 shr ax,1 ror eax,16 shr ax,1 push ax ror eax,16 mov dword [mouse_coord],eax pop ax cmp ax,110 ja mouse_loc_03 mov byte [gun_angle],0 jmp mouse_loc_05 mouse_loc_03: cmp ax,210 ja mouse_loc_04 mov byte [gun_angle],1 jmp mouse_loc_05 mouse_loc_04: mov byte [gun_angle],2 mouse_loc_05: mov eax,37 xor ebx,ebx mov bl,2 mcall cmp ax,1 jnz not_left_button call left_button_down not_left_button: call draw_frame jmp still ; ********************************************* ; ******* WINDOW DEFINITIONS AND DRAW ******** ; ********************************************* draw_window: mov eax,12 ; function 12:tell os about windowdraw mov ebx,1 ; 1, start of draw mcall ; DRAW WINDOW mov eax,0 ; function 0 : define and draw window mov ebx,100*65536+640 ; [x start] *65536 + [x size] mov ecx,100*65536+420 ; [y start] *65536 + [y size] mov edx,0x13ffffff ; color of work area RRGGBB,8->color gl mov edi,title ; WINDOW LABEL mcall call draw_frame mov eax,12 ; function 12:tell os about windowdraw mov ebx,2 ; 2, end of draw mcall ret ;-------------Subprograms------------------------ ; ; In: ; Out: draw_frame: cmp byte [menu_flag],0 jz df_loc_00 call draw_menu retn df_loc_00: call draw_backside mov esi,buf_oblako mov eax,0*65536+0 call draw_pict mov eax,190*65536+23 call draw_pict_scale_div_2 mov esi,buf_sun mov eax,256*65536+0 call draw_pict mov esi,buf_rock mov eax,47*65536+83 call draw_pict_scale_div_2 mov eax,0*65536+70 call draw_pict call draw_objects mov esi,buf_kust02 mov eax,256*65536+127 call draw_pict mov esi,buf_kust01 mov eax,0*65536+127 call draw_pict mov esi,buf_time mov eax,5*65536+180 call draw_pict mov esi,buf_shots mov eax,200*65536+180 call draw_pict mov esi,buf_lives mov eax,5*65536+5 call draw_pict mov eax,56*65536+3 call draw_lives call draw_promakh ; call draw_hole cmp byte [gun_angle],0 jnz df_loc_01 mov esi,buf_gun02 mov eax,120*65536+151 call draw_pict cmp byte [fire_flag],0 jz df_loc_03 mov esi,buf_fire02 mov eax,108*65536+131 call draw_pict dec byte [fire_flag] jmp df_loc_03 df_loc_01: cmp byte [gun_angle],2 jnz df_loc_02 mov esi,buf_gun01 mov eax,140*65536+151 call draw_pict cmp byte [fire_flag],0 jz df_loc_03 mov esi,buf_fire01 mov eax,167*65536+128 call draw_pict dec byte [fire_flag] jmp df_loc_03 df_loc_02: mov esi,buf_gun00 mov eax,140*65536+144 call draw_pict cmp byte [fire_flag],0 jz df_loc_03 mov esi,buf_fire00 mov eax,135*65536+124 call draw_pict dec byte [fire_flag] df_loc_03: ; mov esi,buf_star ; mov eax,300*65536+180 ; call draw_pict mov esi,buf_score mov eax,120*65536+5 call draw_pict mov eax,260*65536+180 mov ebx,[shots_count] call number_print mov eax,175*65536+3 mov ebx,[score_count] call number_print mov eax,60*65536+180 mov ebx,[time_count] call number_print call draw_mushka cmp byte [pause_flag],0 jz df_loc_04 mov esi,buf_pause mov eax,90*65536+80 call draw_pict df_loc_04: cmp byte [game_over_flag],0 jz df_loc_05 mov esi,buf_gameover mov eax,[game_over_coord] call draw_pict df_loc_05: call buffer_scale_on_2 ; call smooth_filter mov eax,07 mov ebx,buffer02 mov ecx,640*65536+400 mov edx,0*65536+20 mcall retn ; ; In: ; Out: draw_menu: call clear_buffer mov esi,buf_start mov eax,60*65536+50 call draw_pict mov esi,buf_exit mov eax,86*65536+120 call draw_pict call draw_mushka call buffer_scale_on_2 mov eax,07 mov ebx,buffer02 mov ecx,640*65536+400 mov edx,0*65536+20 mcall retn ; ; In: ; Out: pause_game: mov eax,40 mov ebx,00000111b mcall pause_game_00: mov eax,10 ; wait here for event mcall cmp eax,1 ; redraw request ? je pg_red cmp eax,2 ; key in buffer ? je pg_key cmp eax,3 ; button in buffer ? je pg_button jmp pause_game_00 pg_red: ; redraw call draw_window jmp pause_game_00 pg_key: ; key mov eax,2 ; just read it and ignore mcall cmp al,0 jnz pause_game_00 cmp ah,' ' jnz pgk_loc_00 dec byte [pause_flag] call draw_frame mov eax,40 mov ebx,00100111b mcall retn pgk_loc_00: jmp pause_game_00 pg_button: ; button mov eax,17 ; get id mcall cmp ah,1 ; button id=1 ? jne pg_noclose mov eax,-1 ; close this program mcall pg_noclose: jmp pause_game retn ; ; In: ; Out: left_button_down: cmp byte [menu_flag],0 jz lbd_loc_00 call check_menu retn lbd_loc_00: inc dword [shots_count] inc byte [fire_flag] ; mov eax,[mouse_coord] ; mov [current_hole],eax call check_kill_object cmp byte [promakh_count],5 jnz lbd_loc_01 mov byte [promakh_count],0 dec byte [lives_count] jnz lbd_loc_01 call draw_frame mov byte [game_over_flag],1 call game_over_draw dec byte [game_over_flag] inc byte [menu_flag] lbd_loc_01: retn ; ; In: ; Out: check_menu: push eax mov eax,[mouse_coord] cmp ax,50 jb cm_loc_00 cmp ax,90 ja cm_loc_00 shr eax,16 cmp ax,60 jb cm_loc_00 cmp ax,260 ja cm_loc_00 dec byte [menu_flag] xor eax,eax mov [score_count],eax mov [shots_count],eax mov [time_count],eax mov [current_hole],eax mov [current_hole+4],eax mov [gun_angle],al mov [stars_count],al mov [promakh_count],al mov byte [lives_count],3 ; call set_current_objects_list call init_object pop eax retn cm_loc_00: mov eax,[mouse_coord] cmp ax,120 jb cm_loc_01 cmp ax,160 ja cm_loc_01 shr eax,16 cmp ax,86 jb cm_loc_01 cmp ax,234 ja cm_loc_01 mov eax,-1 mcall cm_loc_01: pop eax retn ; ; ; game_over_draw: pusha mov dword [game_over_coord],42*65536+0 mov ecx,15 god_loc_00: push ecx call draw_frame add word [game_over_coord],5 mov eax,05 mov ebx,3 mcall pop ecx loop god_loc_00 ; mov eax,7 mov edx,0*65536+20 mov ebx,buffer02 mov ecx,3 god_loc_01: push ecx mov eax,7 mov ecx,640*65536+400 mcall push ebx mov eax,05 mov ebx,5 mcall pop ebx sub ebx,640*3*5 pop ecx loop god_loc_01 mov ecx,4 god_loc_02: push ecx mov eax,7 mov ecx,640*65536+400 mcall push ebx mov eax,5 mov ebx,5 mcall pop ebx add ebx,640*3*5 pop ecx loop god_loc_02 mov eax,5 mov ebx,200 mcall popa retn include 'picture.inc' include 'math.inc' include 'object.inc' ;----------------Data---------------------------- mouse_coord dd 144*65536+84 pause_flag db 0 ; 0/1 - active/pause menu_flag db 1 ; 0/1 - game/menu lives_count db 3 stars_count db 0 ; 3 Stars = 1 Heart shots_count dd 0 time_count dd 0 score_count dd 0 second_count dd 0 game_over_coord dd 0 gun_angle db 0 ; 0/1/2 - left/vertical/right game_over_flag db 0 ; 0/1 - continuing/end game promakh_count db 0 fire_flag db 0 ; 0/1 - no fire/fire from gun current_hole dd 0,0,0,0,0,0 forward_list db 0,0,0,0,0,0,0,0 back_list db 0,0,0,0,0,0,0,0 present_objects_list: dd buf_glass, buf_net, buf_glaz, buf_plane00 dd buf_heart02, buf_plane01, buf_net, buf_glaz title db 'HUNTER 1.2 Trans, 2005',0 buf_start: include 'inc\start.inc' buf_exit: include 'inc\exit.inc' buf_gameover: include 'inc\gameover.inc' buf_pause: include 'inc\pause.inc' buf_gun00: include 'inc\gun00.inc' buf_gun01: include 'inc\gun01.inc' buf_gun02: include 'inc\gun02.inc' buf_heart: include 'inc\heart.inc' buf_star: include 'inc\star.inc' buf_lives: include 'inc\lives.inc' buf_score: include 'inc\score.inc' buf_shots: include 'inc\shots.inc' buf_time: include 'inc\time.inc' buf_numbers: ;include 'inc\numbers.inc' buf_num0: include 'inc\num0.inc' buf_num1: include 'inc\num1.inc' buf_num2: include 'inc\num2.inc' buf_num3: include 'inc\num3.inc' buf_num4: include 'inc\num4.inc' buf_num5: include 'inc\num5.inc' buf_num6: include 'inc\num6.inc' buf_num7: include 'inc\num7.inc' buf_num8: include 'inc\num8.inc' buf_num9: include 'inc\num9.inc' buf_plus: include 'inc\plus.inc' buf_minus: include 'inc\minus.inc' buf_sun: include 'inc\sun.inc' buf_oblako: include 'inc\oblako.inc' buf_mushka: include 'inc\mushka.inc' buf_kust01: include 'inc\kust01.inc' buf_kust02: include 'inc\kust02.inc' buf_glass: include 'inc\glass.inc' buf_glaz: include 'inc\glaz.inc' buf_net: include 'inc\net.inc' buf_plane00: include 'inc\plane00.inc' buf_plane01: include 'inc\plane01.inc' buf_heart02: include 'inc\heart02.inc' buf_rock: include 'inc\rock.inc' buf_fire00: include 'inc\fire00.inc' buf_fire01: include 'inc\fire01.inc' buf_fire02: include 'inc\fire02.inc' buf_hole: include 'inc\hole.inc' I_END: end_stack: org $+1000h start_stack: org $+64 ; For stack protect movieng_objects: ; For one object - 16 bytes structure: ; dd ; +00 Pointer to object OR 0 - if empty structure ; dd ; +04 Current object coordinate X*65536+Y ; db ; +08 Speed - Maximum 16 (???) ; db ; +09 Amplitude ; db ; +0A Direction 0/1 - right/left ; db ; +0B Object Cost ; dd ; +0C Reserve ; org $+16*16 buffer00: org $+320*201*3 buffer01: org $+100*201*3 buffer02: org $+640*401*3 org $+640*40*3 end_memory: