;
;   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: