314 lines
10 KiB
NASM
314 lines
10 KiB
NASM
;;===First_menu_mode===========================================================================================================
|
|
|
|
First_menu:
|
|
mov byte[window_title+5], 0
|
|
mcall 71,1,window_title
|
|
mcall 40,111b ; set events: standart
|
|
mcall 66,1,1 ; set scan codes mode for keyboard
|
|
mov [is_new_record], 0
|
|
mov [lives], START_LIVES
|
|
call Show_cursor
|
|
|
|
mov [score], 0
|
|
call Set_first_level_of_play_mode
|
|
|
|
mov ebx, [time_wait_limit_const]
|
|
mov [time_wait_limit], ebx
|
|
|
|
.redraw:
|
|
call Set_geometry
|
|
mcall 12,1
|
|
mcall 0, , ,[window_style], ,window_title
|
|
test [proc_info.wnd_state], 0x04 ; is rolled up?
|
|
jnz @f
|
|
|
|
call Draw_decorations
|
|
call Draw_first_menu_picture
|
|
call Draw_menu_strings
|
|
call Draw_buttons
|
|
@@:
|
|
mcall 12,2
|
|
.still:
|
|
mcall 10 ; wait for event
|
|
; ok, what an event?
|
|
dec al ; has the window been moved or resized?
|
|
jz .redraw ;
|
|
dec al ; was a key pressed?
|
|
jz .key ;
|
|
|
|
|
|
.button: ; a button was pressed
|
|
mcall 17 ; get button number
|
|
shr eax, 8 ; we should do it to get the real button code
|
|
|
|
cmp eax, 1 ; is it close button?
|
|
je Save_do_smth_else_and_exit ; if so, jump to quit...
|
|
cmp eax, 0xD0 ; 'play' button?
|
|
je Level_begin
|
|
cmp eax, 0xD1 ; 'exit' button?
|
|
je Save_do_smth_else_and_exit
|
|
cmp eax, 0xD2 ; change play mode button?
|
|
jne @f
|
|
call Change_play_mode
|
|
call Delete_buttons
|
|
call Draw_buttons
|
|
jmp .still ; jump to wait for another event
|
|
@@:
|
|
cmp eax, 0xD3 ; '+INC+' button?
|
|
jne @f
|
|
call Increase_geometry
|
|
jmp .redraw ; jump to wait for another event
|
|
@@:
|
|
cmp eax, 0xD4 ; '-dec-' button?
|
|
jne @f
|
|
call Decrease_geometry
|
|
jmp .redraw ; jump to wait for another event
|
|
@@:
|
|
|
|
jmp .still ; jump to wait for another event
|
|
|
|
|
|
.key: ; a key was pressed
|
|
mcall 2 ; get keycode
|
|
|
|
cmp ah, 0x01 ; Escape
|
|
je Save_do_smth_else_and_exit
|
|
cmp ah, 0x1C ; Enter
|
|
je Level_begin
|
|
cmp ah, 0x39 ; Space
|
|
jne @f
|
|
call Change_play_mode
|
|
call Delete_buttons
|
|
call Draw_buttons
|
|
jmp .still ; jump to wait for another event
|
|
@@:
|
|
cmp ah, [shortcut_increase]
|
|
jne @f
|
|
call Increase_geometry
|
|
jmp .redraw
|
|
@@:
|
|
cmp ah, [shortcut_decrease]
|
|
jne @f
|
|
call Decrease_geometry
|
|
jmp .redraw
|
|
@@:
|
|
jmp .still ; jump to wait for another event
|
|
|
|
;;---First_menu_mode-----------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
;;===Some_functions============================================================================================================
|
|
|
|
Draw_first_menu_picture:
|
|
;;===Draw_first_menu_picture================================================================================================
|
|
|
|
mov ax, 2*0x100+24
|
|
mov cx, 1*0x100+5
|
|
mov edx, [snake_picture_color]
|
|
mov esi, picture_first_menu_snake
|
|
call Draw_picture
|
|
|
|
mov ax, 3*0x100+11
|
|
mov cx, 8*0x100+5
|
|
mov edx, [version_picture_color]
|
|
mov esi, picture_first_menu_version
|
|
call Draw_picture
|
|
|
|
ret
|
|
|
|
;;---Draw_first_menu_picture------------------------------------------------------------------------------------------------
|
|
|
|
|
|
Draw_menu_strings:
|
|
;;===Make_menu_strings======================================================================================================
|
|
|
|
mov ebx, [window_width]
|
|
shr ebx, 1
|
|
sub ebx, press_to_start.size*3+6
|
|
shl ebx, 16
|
|
add ebx, dword[bottom_middle_strings]
|
|
mcall 4, ,[navigation_strings_color],press_to_start
|
|
mov ebx, [window_width]
|
|
shr ebx, 1
|
|
sub ebx, press_esc_to_exit.size*3+6
|
|
shl ebx, 16
|
|
add ebx, [top_strings]
|
|
mcall , ,[navigation_strings_color],press_esc_to_exit
|
|
; mcall ,406*65536+TOP_STRINGS,[navigation_strings_color],press_F2_to_options
|
|
|
|
ret
|
|
|
|
;;---Make_menu_strings------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
Draw_buttons:
|
|
;;===Draw_buttons===========================================================================================================
|
|
|
|
mov ebx, [button_x_left]
|
|
shl ebx, 16
|
|
mov bx, word[button_width_short]
|
|
mov ecx, [button_y_top]
|
|
shl ecx, 16
|
|
add cx, word[button_height]
|
|
mcall 8, , ,0x000000D0,[button_color] ; top left button
|
|
shr ecx, 16
|
|
mov bx, cx
|
|
mov edx, [button_height]
|
|
shr edx, 1
|
|
sub edx, 3 ; ~half of font height
|
|
add bx, dx
|
|
ror ebx, 16
|
|
mov edx, [button_width_short]
|
|
shr edx, 1
|
|
sub edx, string_button_play.size*3
|
|
add bx, dx
|
|
ror ebx, 16
|
|
mcall 4, ,[button_text_color],string_button_play
|
|
|
|
mov ebx, [button_x_right]
|
|
shl ebx, 16
|
|
mov bx, word[button_width_short]
|
|
mov ecx, [button_y_top]
|
|
shl ecx, 16
|
|
add cx, word[button_height]
|
|
mcall 8, , ,0x000000D1, ; top right button
|
|
shr ecx, 16
|
|
mov bx, cx
|
|
mov edx, [button_height]
|
|
shr edx, 1
|
|
sub edx, 3 ; ~half of font height
|
|
add bx, dx
|
|
ror ebx, 16
|
|
mov edx, [button_width_short]
|
|
shr edx, 1
|
|
sub edx, string_button_exit.size*3
|
|
add bx, dx
|
|
ror ebx, 16
|
|
mcall 4, ,[button_text_color],string_button_exit
|
|
|
|
mov ebx, [button_x_left]
|
|
shl ebx, 16
|
|
mov bx, word[button_width_long]
|
|
mov ecx, [button_y_middle]
|
|
shl ecx, 16
|
|
add cx, word[button_height]
|
|
mcall 8, , ,0x000000D2, ; middle button
|
|
shr ecx, 16
|
|
mov bx, cx
|
|
mov edi, [button_height]
|
|
shr edi, 1
|
|
sub edi, 3 ; ~half of font height
|
|
add bx, di
|
|
ror ebx, 16
|
|
mov edi, [button_width_long]
|
|
shr edi, 1
|
|
cmp [play_mode], 0
|
|
jne @f
|
|
sub edi, string_button_pm_classic.size*3
|
|
mov edx, string_button_pm_classic
|
|
jmp .skip
|
|
@@:
|
|
sub edi, string_button_pm_levels.size*3
|
|
mov edx, string_button_pm_levels
|
|
.skip:
|
|
add bx, di
|
|
ror ebx, 16
|
|
mcall 4, ,[button_text_color],
|
|
|
|
mov ebx, [button_x_left]
|
|
shl ebx, 16
|
|
mov bx, word[button_width_short]
|
|
mov ecx, [button_y_bottom]
|
|
shl ecx, 16
|
|
add cx, word[button_height]
|
|
mcall 8, , ,0x000000D3, ; bottom left button
|
|
shr ecx, 16
|
|
mov bx, cx
|
|
mov edx, [button_height]
|
|
shr edx, 1
|
|
sub edx, 3 ; ~half of font height
|
|
add bx, dx
|
|
ror ebx, 16
|
|
mov edx, [button_width_short]
|
|
shr edx, 1
|
|
sub edx, string_button_inc.size*3
|
|
add bx, dx
|
|
ror ebx, 16
|
|
mcall 4, ,[button_text_color],string_button_inc
|
|
|
|
mov ebx, [button_x_right]
|
|
shl ebx, 16
|
|
mov bx, word[button_width_short]
|
|
mov ecx, [button_y_bottom]
|
|
shl ecx, 16
|
|
add cx, word[button_height]
|
|
mcall 8, , ,0x000000D4,
|
|
shr ecx, 16
|
|
mov bx, cx
|
|
mov edx, [button_height]
|
|
shr edx, 1
|
|
sub edx, 3 ; ~half of font height
|
|
add bx, dx
|
|
ror ebx, 16
|
|
mov edx, [button_width_short]
|
|
shr edx, 1
|
|
sub edx, string_button_dec.size*3
|
|
add bx, dx
|
|
ror ebx, 16
|
|
mcall 4, ,[button_text_color],string_button_dec
|
|
|
|
ret
|
|
|
|
;;---Draw_buttons----------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
Delete_buttons:
|
|
;;===Delete_buttons========================================================================================================
|
|
|
|
mcall 8,,,0x800000D0
|
|
mcall ,,,0x800000D1
|
|
mcall ,,,0x800000D2
|
|
mcall ,,,0x800000D3
|
|
mcall ,,,0x800000D4
|
|
|
|
ret
|
|
|
|
;;---Delete_buttons--------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
Change_play_mode:
|
|
;;===Change_play_mode======================================================================================================
|
|
|
|
cmp [play_mode], LEVELS_MODE
|
|
jne @f
|
|
mov [play_mode], CLASSIC_MODE
|
|
mov [cur_level_number], 0
|
|
ret
|
|
@@:
|
|
inc [play_mode]
|
|
|
|
call Set_first_level_of_play_mode
|
|
|
|
ret
|
|
|
|
;;---Change_play_mode------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
Set_first_level_of_play_mode:
|
|
;;===Set_first_level_of_play_mode==========================================================================================
|
|
|
|
cmp [play_mode], CLASSIC_MODE
|
|
jne @f
|
|
mov [cur_level_number], CLASSIC_MODE_FIRST_LEVEL
|
|
@@:
|
|
cmp [play_mode], LEVELS_MODE
|
|
jne @f
|
|
mov [cur_level_number], LEVELS_MODE_FIRST_LEVEL
|
|
@@:
|
|
|
|
ret
|
|
|
|
;;---Set_first_level_of_play_mode-------------------------------------------------------------------------------------------
|
|
|
|
;;---Some_functions-------------------------------------------------------------------------------------------------------------
|