;;===HEADER====================================================================================================================

use32
    org 0x0
    db  'MENUET01'
    dd  0x01,start,i_end,d_end,stacktop,0x0,cur_dir_path

;;---HEADER--------------------------------------------------------------------------------------------------------------------

include '../../../proc32.inc'
include '../../../macros.inc'
include '../../../dll.inc'
include '../../../develop/libraries/box_lib/trunk/box_lib.mac'
;include '../../../system/board/trunk/debug.inc'

;;===Define_chapter============================================================================================================

WINDOW_MODE_WINDOWED        equ     0
WINDOW_MODE_FULLSCREEN      equ     1

GRID_WIDTH                  equ     28
GRID_HEIGHT                 equ     14

MIN_SQUARE_SIDE_LENGTH      equ     9

SCORE_EAT                   equ     100

LEFT                        equ     0
DOWN                        equ     1
UP                          equ     2
RIGHT                       equ     3

struct  LEVEL
    field                   db      4*GRID_HEIGHT  dup (?)
    snake_dots              db      6   dup (?)
    snake_direction         dd      ?
    snake_direction_next    dd      ?
    number_of_stones        dd      ?
    name                    dd      ?
ends

CLASSIC_MODE                equ     0
LEVELS_MODE                 equ     1

CLASSIC_MODE_FIRST_LEVEL    equ     0
LEVELS_MODE_FIRST_LEVEL     equ     1

EAT_TO_END_LEVEL            equ     7
PAUSE_BETWEEN_LEVELS        equ     200
PAUSE_WHILE_DRAWING_SPLASH  equ     3

CHAMPION_NAME_LENGTH        equ     15
LAST_LEVEL_NUMBER           equ     36

START_LIVES                 equ     3

;;---Define_chapter------------------------------------------------------------------------------------------------------------

start:

stdcall dll.Load,@IMPORT
    or   eax, eax
    jnz  Exit
    
align 4

    mov  edi, cur_dir_path
    mov  al,  0
    mov  ecx, 4096
    repne scasb
    mov  dword[edi-1],    '.ini'

      invoke  ini.get_int, cur_dir_path, aPreferences, aSpeed, 80
    neg  eax
    add  [time_wait_limit],    eax
    mov  ebx, [time_wait_limit]
    mov  [time_wait_limit_const],  ebx
    sub  ebx, 4
    mov  eax, 200
    div  bl
    mov  byte[speed_up_counter],    al
    mov  byte[speed_up_counter+1],  al
      invoke  ini.get_str, cur_dir_path, aPreferences, aTheme, aTheme_name, 31, aTheme_name
      invoke  ini.get_int, cur_dir_path, aPreferences, aSmart_reverse, 0
    mov  [smart_reverse],   eax
      invoke  ini.get_int, cur_dir_path, aPreferences, aShow_lives_style, 2
    mov  [show_lives_style],    eax
      invoke  ini.get_int, cur_dir_path, aPreferences, aDraw_level_name_in_window_title, 1
    mov  [draw_level_name_in_window_title], eax
      invoke  ini.get_str, cur_dir_path, aPreferences, aSeparating_symbol, separating_symbol, 3, default_separating_symbol

      invoke  ini.get_shortcut, cur_dir_path, aShortcuts, aMove_left, 0x23, 0
    mov  [shortcut_move_left],  al
      invoke  ini.get_shortcut, cur_dir_path, aShortcuts, aMove_down, 0x24, 0
    mov  [shortcut_move_down],  al
      invoke  ini.get_shortcut, cur_dir_path, aShortcuts, aMove_up, 0x25, 0
    mov  [shortcut_move_up],    al
      invoke  ini.get_shortcut, cur_dir_path, aShortcuts, aMove_right, 0x26, 0
    mov  [shortcut_move_right], al
      invoke  ini.get_shortcut, cur_dir_path, aShortcuts, aReverse, 0x0F, 0
    mov  [shortcut_reverse], al
      invoke  ini.get_shortcut, cur_dir_path, aShortcuts, aIncrease, 0x16, 0
    mov  [shortcut_increase],   al
      invoke  ini.get_shortcut, cur_dir_path, aShortcuts, aDecrease, 0x17, 0
    mov  [shortcut_decrease],   al

      invoke  ini.get_int, cur_dir_path, aTheme_name, aDecorations, 3
    mov  [decorations], eax
      invoke  ini.get_color, cur_dir_path, aTheme_name, aBackground_color, 0x000000
    or   [background_color],    eax
    or   [window_style_windowed],   eax
      invoke  ini.get_color, cur_dir_path, aTheme_name, aDecorations_color, 0x232300
    or   [decorations_color],  eax
      invoke  ini.get_color, cur_dir_path, aTheme_name, aSnake_color, 0x1111ff
    or   [snake_color], eax
      invoke  ini.get_color, cur_dir_path, aTheme_name, aSnake_head_color, 0x6B6Bff
    or   [snake_head_color], eax
      invoke  ini.get_color, cur_dir_path, aTheme_name, aLives_in_head_number_color, 0xff8800
    or   [lives_in_head_number_color],  eax
      invoke  ini.get_color, cur_dir_path, aTheme_name, aSnake_picture_color, 0x4488ff
    or   [snake_picture_color], eax
      invoke  ini.get_color, cur_dir_path, aTheme_name, aVersion_picture_color, 0x55ff55
    or   [version_picture_color],   eax
      invoke  ini.get_color, cur_dir_path, aTheme_name, aPause_picture_color, 0x11ff11
    or   [pause_picture_color], eax
      invoke  ini.get_color, cur_dir_path, aTheme_name, aGame_over_picture_color, 0xff1111
    or   [game_over_picture_color], eax
      invoke  ini.get_color, cur_dir_path, aTheme_name, aYou_win_picture_color, 0xffff11
    or   [you_win_picture_color],   eax
      invoke  ini.get_color, cur_dir_path, aTheme_name, aEat_color, 0xffff11
    or   [eat_color],   eax
      invoke  ini.get_color, cur_dir_path, aTheme_name, aNavigation_strings_color, 0x80ff7777
    or   [navigation_strings_color], eax
      invoke  ini.get_color, cur_dir_path, aTheme_name, aGame_over_strings_color, 0x80ff9900
    or   [game_over_strings_color],  eax
      invoke  ini.get_color, cur_dir_path, aTheme_name, aScore_string_color, 0x80ffffff
    or   [score_string_color],   eax
      invoke  ini.get_color, cur_dir_path, aTheme_name, aLevel_string_color, 0xffffff
    or   [level_string_color],  eax
      invoke  ini.get_color, cur_dir_path, aTheme_name, aHiscore_string_color, 0x80ffffff
    or   [hiscore_string_color],   eax
      invoke  ini.get_color, cur_dir_path, aTheme_name, aChampion_string_color, 0x80ffffff
    or   [champion_string_color],   eax
      invoke  ini.get_color, cur_dir_path, aTheme_name, aGame_over_hiscore_color, 0x80ffdd44
    or   [game_over_hiscore_color], eax
      invoke  ini.get_color, cur_dir_path, aTheme_name, aScore_number_color, 0xffffff
    or   [score_number_color],   eax
      invoke  ini.get_color, cur_dir_path, aTheme_name, aLevel_number_color, 0xffffff
    or   [level_number_color],  eax
      invoke  ini.get_color, cur_dir_path, aTheme_name, aHiscore_number_color, 0x00ffffff
    or   [hiscore_number_color],   eax
      invoke  ini.get_color, cur_dir_path, aTheme_name, aChampion_name_color, 0x80ffffff
    or   [champion_name_color],   eax
      invoke  ini.get_color, cur_dir_path, aTheme_name, aEdit_box_selection_color, 0x00aa00
    or   [edit1.shift_color],   eax
      invoke  ini.get_color, cur_dir_path, aTheme_name, aButton_color, 0xDDDDDD
    or   [button_color],    eax
      invoke  ini.get_color, cur_dir_path, aTheme_name, aButton_text_color, 0x000000
    or   [button_text_color],   eax
      invoke  ini.get_color, cur_dir_path, aTheme_name, aStone_color, 0x5f8700
    or   [stone_color], eax
      invoke  ini.get_color, cur_dir_path, aTheme_name, aSplash_background_color, 0xAAAA00
    or   [splash_background_color],    eax
      invoke  ini.get_color, cur_dir_path, aTheme_name, aSplash_level_number_color, 0x000000
    or   [splash_level_number_color],   eax
      invoke  ini.get_color, cur_dir_path, aTheme_name, aSplash_level_string_color, 0x000000
    or   [splash_level_string_color],   eax

      invoke  ini.get_int, cur_dir_path, aReserved, aSquare_side_length, 19
    mov  [square_side_length],  eax
      invoke  ini.get_str, cur_dir_path, aReserved, aChampion_name_classic, champion_name_classic, CHAMPION_NAME_LENGTH, champion_name_classic
      invoke  ini.get_int, cur_dir_path, aReserved, aHiscore_classic, 777
    or   [hi_score_classic],    eax
      invoke  ini.get_str, cur_dir_path, aReserved, aChampion_name_levels, champion_name_levels, CHAMPION_NAME_LENGTH, champion_name_levels
      invoke  ini.get_int, cur_dir_path, aReserved, aHiscore_levels, 777
    or   [hi_score_levels], eax

    mov  eax, [background_color]
    mov  [edit1.color], eax
    mov  [edit1.focus_border_color],    eax
    mov  [edit1.blur_border_color], eax
    mov  eax, [game_over_hiscore_color]
    mov  [edit1.text_color],    eax

      mcall     37,4,cursor_data,2                  ; load empty cursor (for "hiding" cursor while level_mode)
    mov  [cursor_handle],   eax

    mov  eax, WINDOW_MODE_WINDOWED
      call      Set_window_mode
      mcall     0,0,0,[window_style_windowed]       ; create empty window. Set_geometry will set all parameters
      call      Set_geometry.by_hotkey
      mcall     71,1,window_title

include 'first_menu.asm'            ; First menu body and functions
include 'level.asm'                 ; Level body and functions (game process)
include 'pause.asm'                 ; Pause body and functions
include 'game_over.asm'             ; Game_over body and functions

;;===Some_functions============================================================================================================


Save_do_smth_else_and_exit:
    ;;===Save_do_smth_else_and_exit============================================================================================

      mcall     37,6,[cursor_handle]                ; delete cursor

      invoke    ini.set_int, cur_dir_path, aReserved, aSquare_side_length, [square_side_length]

    mov  edi, champion_name_classic
    xor  al,  al
    mov  ecx, CHAMPION_NAME_LENGTH+1
    cld
    repne scasb
    neg  ecx
    add  ecx, CHAMPION_NAME_LENGTH
      invoke    ini.set_str, cur_dir_path, aReserved, aChampion_name_classic, champion_name_classic, ecx
      invoke    ini.set_int, cur_dir_path, aReserved, aHiscore_classic, [hi_score_classic]

    mov  edi, champion_name_levels
    xor  al,  al
    mov  ecx, CHAMPION_NAME_LENGTH+1
    cld
    repne scasb
    neg  ecx
    add  ecx, CHAMPION_NAME_LENGTH
      invoke    ini.set_str, cur_dir_path, aReserved, aChampion_name_levels, champion_name_levels, ecx
      invoke    ini.set_int, cur_dir_path, aReserved, aHiscore_levels, [hi_score_levels]

    ;;---Save_do_smth_else_and_exit--------------------------------------------------------------------------------------------


Exit:
    ;;===Exit==================================================================================================================

    or  eax,    -1
    int 0x40
    
    ;;---Exit------------------------------------------------------------------------------------------------------------------


Set_geometry:
    ;;===Set_geometry==========================================================================================================

    cmp  [resized_by_hotkey],   1
     je  .by_hotkey

    test [proc_info.wnd_state], 0x01
     jnz .by_hotkey

      mcall     9,proc_info,-1
    test [proc_info.wnd_state], 0x04		; is rolled up?
     jz  @f
    mov  eax, [proc_info.box.width]
    mov  [window_width], eax
    mov  eax, [proc_info.box.height]
    mov  [window_height], eax
     jmp .quit
  @@:
    mov  eax, [proc_info.box.width]
    cmp  eax, [window_width]
     jne @f
    mov  eax, [proc_info.box.height]
    cmp  eax, [window_height]
     jne @f
     jmp .quit
  @@:
    mov  eax, [proc_info.box.width]
    mov  [window_width],    eax
    mov  eax, [proc_info.box.height]
    mov  [window_height],   eax

  .by_mouse:                                    ; or any other kind of resizing. for example, double click on window title

    test [proc_info.wnd_state], 0x01
     jnz .by_hotkey
    

    cmp  [window_width],    250
     jnl @f
    mov  [window_width],    250
  @@:
    cmp  [window_height],   150
     jnl @f
    mov  [window_height],   150
  @@:

      mcall     48,4
    mov  ecx, [window_height]
    sub  ecx, eax
    sub  ecx, 5
    sub  ecx, [g_e]
    sub  ecx, [g_e]
    sub  ecx, 25+30
    mov  esi, ecx

    mov  eax, [window_width]
    sub  eax, 5+5
    sub  eax, [g_e]
    sub  eax, [g_e]
    sub  eax, [g_s]
    sub  eax, [g_s]
    mov  edi, eax

    mov  dx,  0
    div  cx
    cmp  ax,  2
     jl  .fit_to_width

  .fit_to_height:
    mov  eax, esi
    mov  ebx, GRID_HEIGHT
    div  bl
    cmp  al,  MIN_SQUARE_SIDE_LENGTH
     jnl @f
    mov  al,  MIN_SQUARE_SIDE_LENGTH
  @@:
    dec al
    mov byte[square_side_length],   al
     jmp .by_hotkey

  .fit_to_width:
    mov  eax, edi
    mov  ebx, GRID_WIDTH
    div  bl
    cmp  al,  MIN_SQUARE_SIDE_LENGTH
     jnl @f
    mov  al,  MIN_SQUARE_SIDE_LENGTH
  @@:
    dec al
    mov byte[square_side_length],   al
     jmp .by_hotkey

;     jmp .done

  .by_hotkey:
      mcall     9,proc_info,-1
    mov  [resized_by_hotkey],   0
    test [proc_info.wnd_state], 0x04		; is rolled up?
     jz  @f
    mov  eax, [proc_info.box.width]
    mov  [window_width], eax
    mov  eax, [proc_info.box.height]
    mov  [window_height], eax
     jmp .quit
  @@:
    mov  eax, [square_side_length]
    inc  eax                                            ; space between squares
    mov  [g_s],   eax

    mov  eax, [g_s]
    shr  eax, 1
    mov  ebx, eax
    shr  ebx, 1
    add  eax, ebx
    mov  [g_e], eax

    mov  edx, GRID_WIDTH
    mov  eax, [g_s]
    mul  dx
    mov  [gw_mul_gs],   eax

    mov  edx, GRID_HEIGHT
    mov  eax, [g_s]
    mul  dx
    mov  [gh_mul_gs],   eax

    mov  eax, [gw_mul_gs]
    add  eax, [g_s]
    add  eax, [g_s]
    add  eax, [g_e]
    add  eax, [g_e]
    add  eax, 5*2                                   ; skin width
    mov  esi, eax
    test [proc_info.wnd_state], 0x01
     jz  @f
    mov  eax, [proc_info.box.width]
  @@:
    mov  [window_width],    eax

    sub  eax, [gw_mul_gs]
    sub  eax, 5*2
    shr  eax, 1
    mov  [gbxm1],   eax

      mcall     48,4                                ; get skin header height
    mov  ebx, eax
    add  eax, [gh_mul_gs]
    add  eax, [g_e]
    add  eax, 25
    add  eax, [g_e]
    add  eax, 30
    add  eax, 5                                      ; skin height (bottom part)
    mov  edi, eax
    test [proc_info.wnd_state], 0x01
     jz	 @f
    mov  eax, [proc_info.box.height]
  @@:
    mov  [window_height],   eax

    sub  eax, [gh_mul_gs]
    sub  eax, ebx
    sub  eax, 5
    sub  eax, 5
    
    shr  eax, 1
    mov  [gbym1],   eax

    mov  eax, [g_s]
    shl  eax, 16
    add  eax, [g_s]
    mov  [gs_shl16_gs], eax

    mov  eax, [gbxm1]
    shl  eax, 16
    add  eax, [gbxm1]
    mov  [gbxm1_shl16_gbxm1],   eax

    mov  eax, [gbym1]
    shl  eax, 16
    add  eax, [gbym1]
    mov  [gbym1_shl16_gbym1],   eax

    mov  eax, [gbxm1]
    add  eax, [gw_mul_gs]
    mov  [gbxm1_plus_gw_mul_gs],    eax

    mov  eax, [gbym1]
    add  eax, [gh_mul_gs]
    mov  [gbym1_plus_gh_mul_gs],    eax

      mcall     48, 5
    mov  dx,  ax
    shr  eax, 16
    sub  dx,  ax
    cmp  dx,  si                                    ; does window fit to work area width?
     jnl @f
    dec  [square_side_length]
     jmp Set_geometry.by_hotkey
  @@:

    mov  cx,  bx
    shr  ebx, 16
    sub  cx,  bx
    cmp  cx,  di                                    ; does window fit to work area height?
     jnl @f
    dec  [square_side_length]
     jmp Set_geometry.by_hotkey
  @@:

    sub  dx,  si
    shr  dx,  1
    mov  word[wp_x],    dx
    sub  cx,  word[window_height]
    shr  cx,  1
    mov  dx,  cx
    shr  cx,  1
    add  cx,  dx
    mov  word[wp_y],    cx

    mov  [top_strings], 8
    mov  eax, [window_height]
    sub  eax, 50
    mov  [bottom_top_strings],  eax
    add  eax, 6
    mov  [bottom_middle_strings],  eax
    add  eax, 6
    mov  [bottom_bottom_strings],  eax

    sub  eax, 4
    mov  [edit1.top],   eax


    mov  eax, [g_s]
    shl  eax, 2
    sub  eax, 2
    mov  [button_width_short],  eax
    mov  eax, [g_s]
    shl  eax, 3
    add  eax, [g_s]
    sub  eax, 2
    mov  [button_width_long],   eax
    mov  eax, [g_s]
    sub  eax, 2
    mov  [button_height],   eax

    mov  bl,  0x10
    mov  cl,  0x08

    mov  al,  byte[g_s]
    mul  bl
    mov  bx,  ax
    add  bx,  word[gbxm1]
    inc  bx

    mov  al,  byte[g_s]
    mul  cl
    mov  cx,  ax
    add  cx,  word[gbym1]
    inc  cx
    
    mov  [button_x_left],   ebx
    mov  [button_y_top],    ecx
    
    add  ebx, [g_s]
    add  ebx, [g_s]
    add  ebx, [g_s]
    add  ebx, [g_s]
    add  ebx, [g_s]
    
    mov  [button_x_right],  ebx
    
    add  ecx,  [g_s]
    add  ecx,  [g_s]
    
    mov  [button_y_middle], ecx
    
    add  ecx,  [g_s]
    add  ecx,  [g_s]
    
    mov  [button_y_bottom], ecx

  .done:
      mcall     67,[wp_x],[wp_y],[window_width],[window_height]

  .quit:
    ret

    ;;---Set_geometry------------------------------------------------------------------------------------------------------


Increase_geometry:
    ;;===Increase_geometry=================================================================================================

    inc  [square_side_length]
    mov  [resized_by_hotkey],   1

    ret

    ;;---Increase_geometry-------------------------------------------------------------------------------------------------


Decrease_geometry:
    ;;===Decrease_geometry=================================================================================================

    cmp  [square_side_length],  MIN_SQUARE_SIDE_LENGTH
     je  @f
    dec  [square_side_length]
    mov  [resized_by_hotkey],   1

  @@:
    ret

    ;;---Decrease_geometry-------------------------------------------------------------------------------------------------


Draw_decorations:
    ;;===Draw_decorations==================================================================================================

    mov  al, byte[decorations]
    dec  al
     jz  grid_lines
    dec  al
     jz  grid_lines_with_ends
    dec  al
     jz  grid_lines_with_corners
    dec  al
     jz  grid_dots
    dec  al
     jz  borders_lines
    dec  al
     jz  borders_lines_with_corners
    dec  al
     jz  borders_dots
    dec  al
     jz  corners_dots
    dec  al
     jz  corners_inner
    dec  al
     jz  corners_outer
    dec  al
     jz  corners_crosses
    ret


  grid_lines:

    mov  eax, 38
;mov  ebx, (GRID_BEGIN_X-1)*65536+(GRID_BEGIN_X-1)
    mov  ebx, [gbxm1_shl16_gbxm1]
;mov  ecx, (GRID_BEGIN_Y-1)*65536+(GRID_BEGIN_Y-1+GRID_HEIGHT*GRID_STEP)
    mov  ecx, [gbym1_shl16_gbym1]
    add  ecx, [gh_mul_gs]
    mov  edx, [decorations_color]
    mov  esi, GRID_WIDTH
    add  esi, 1

  @@:
      mcall
    add  ebx, [gs_shl16_gs]
    dec  esi
     jnz @b

;mov  ebx, (GRID_BEGIN_X-1)*65536+(GRID_BEGIN_X-1+GRID_WIDTH*GRID_STEP)
    mov  ebx, [gbxm1_shl16_gbxm1]
    add  ebx, [gw_mul_gs]
    mov  ecx, [gbym1_shl16_gbym1]
    mov  esi, GRID_HEIGHT
    add  esi, 1
    
  @@:
      mcall
    add  ecx, [gs_shl16_gs]
    dec  esi
     jnz @b

    ret


  grid_lines_with_ends:

    mov  eax, 38
    mov  ebx, [gbxm1_shl16_gbxm1]
    mov  ecx, [gbym1]
    sub  ecx, [g_e]
    shl  ecx, 16
    add  ecx, [gbym1_plus_gh_mul_gs]
    add  ecx, [g_e]
    mov  edx, [decorations_color]
    mov  esi, GRID_WIDTH
    add  esi, 1

  @@:
      mcall
    add  ebx, [gs_shl16_gs]
    dec  esi
     jnz @b

    mov  ebx, [gbxm1]
    sub  ebx, [g_e]
    shl  ebx, 16
    add  ebx, [gbxm1_plus_gw_mul_gs]
    add  ebx, [g_e]
    mov  ecx, [gbym1_shl16_gbym1]
    mov  esi, GRID_HEIGHT
    add  esi, 1
    
  @@:
      mcall
    add  ecx, [gs_shl16_gs]
    dec  esi
     jnz @b

    ret


  grid_lines_with_corners:

      call      grid_lines
      call      corners_outer

    ret


  grid_dots:

    mov  eax, 1
    mov  ebx, [gbxm1]
    mov  ecx, [gbym1]
    mov  edx, [decorations_color]

  @@:
      mcall
    add  ebx, [g_s]
    cmp  ebx, [gbxm1_plus_gw_mul_gs]
     jng @b
    add  ecx, [g_s]
    cmp  ecx, [gbym1_plus_gh_mul_gs]
     jg  @f
    mov  ebx, [gbxm1]
     jmp @b

  @@:
    ret


  borders_lines:

    mov  eax, 38
    mov  ebx, [gbxm1_shl16_gbxm1]
    mov  ecx, [gbym1_shl16_gbym1]
    add  ecx, [gh_mul_gs]
    mov  edx, [decorations_color]
      mcall

    mov  ebx, [gbxm1_plus_gw_mul_gs]
    shl  ebx, 16
    add  ebx, [gbxm1_plus_gw_mul_gs]
      mcall

    mov  ebx, [gbxm1_shl16_gbxm1]
    add  ebx, [gw_mul_gs]
    mov  ecx, [gbym1_shl16_gbym1]
      mcall

    mov  ecx, [gbym1_plus_gh_mul_gs]
    shl  ecx, 16
    add  ecx, [gbym1_plus_gh_mul_gs]
      mcall

    ret


  borders_lines_with_corners:

      call      borders_lines
      call      corners_outer

    ret


  borders_dots:

    mov  eax, 1
    mov  ebx, [gbxm1]
    mov  ecx, [gbym1]
    mov  edx, [decorations_color]
  @@:
      mcall
    add  ebx, [g_s]
    cmp  ebx, [gbxm1_plus_gw_mul_gs]
     jng @b

    mov  ebx, [gbxm1]
    mov  ecx, [gbym1_plus_gh_mul_gs]
  @@:
      mcall
    add  ebx, [g_s]
    cmp  ebx, [gbxm1_plus_gw_mul_gs]
     jng @b

    mov  ebx, [gbxm1]
    mov  ecx, [gbym1]
  @@:
      mcall
    add  ecx, [g_s]
    cmp  ecx, [gbym1_plus_gh_mul_gs]
     jng @b

    mov  ebx, [gbxm1_plus_gw_mul_gs]
    mov  ecx, [gbym1]
  @@:
      mcall
    add  ecx, [g_s]
    cmp  ecx, [gbym1_plus_gh_mul_gs]
     jng @b

    ret


  corners_dots:

    mov  eax, 13
    mov  ebx, [gbxm1]
    dec  ebx
    shl  ebx, 16
    add  ebx, 2
    mov  ecx, [gbym1]
    dec  ecx
    shl  ecx, 16
    add  ecx, 2
    mov  edx, [decorations_color]
      mcall

    mov  ebx, [gbxm1_plus_gw_mul_gs]
    shl  ebx, 16
    add  ebx, 2
      mcall

    mov  ebx, [gbxm1]
    dec  ebx
    shl  ebx, 16
    add  ebx, 2
    mov  ecx, [gbym1_plus_gh_mul_gs]
    shl  ecx, 16
    add  ecx, 2
      mcall

    mov  ebx, [gbxm1_plus_gw_mul_gs]
    shl  ebx, 16
    add  ebx, 2
      mcall

    ret


  corners_inner:

    mov  eax, 38
    mov  ebx, [gbxm1_shl16_gbxm1]
    add  ebx, [g_e]
    mov  ecx, [gbym1_shl16_gbym1]
    mov  edx, [decorations_color]
      mcall

    mov  ecx, [gbym1_plus_gh_mul_gs]
    shl  ecx, 16
    add  ecx, [gbym1_plus_gh_mul_gs]
      mcall

    mov  ebx, [gbxm1_plus_gw_mul_gs]
    sub  ebx, [g_e]
    shl  ebx, 16
    add  ebx, [gbxm1_plus_gw_mul_gs]
      mcall

    mov  ecx, [gbym1_shl16_gbym1]
      mcall

    mov  ebx, [gbxm1_shl16_gbxm1]
    mov  ecx, [gbym1_shl16_gbym1]
    add  ecx, [g_e]
      mcall

    mov  ebx, [gbxm1_plus_gw_mul_gs]
    shl  ebx, 16
    add  ebx, [gbxm1_plus_gw_mul_gs]
      mcall

    mov  ecx, [gbym1_plus_gh_mul_gs]
    sub  ecx, [g_e]
    shl  ecx, 16
    add  ecx, [gbym1_plus_gh_mul_gs]
      mcall

    mov  ebx, [gbxm1_shl16_gbxm1]
      mcall

    ret


  corners_outer:

    mov  eax, 38
    mov  ebx, [gbxm1_shl16_gbxm1]
    sub  ebx, [g_e]
    mov  ecx, [gbym1_shl16_gbym1]
    mov  edx, [decorations_color]
      mcall

    mov  ecx, [gbym1_plus_gh_mul_gs]
    shl  ecx, 16
    add  ecx, [gbym1_plus_gh_mul_gs]
      mcall

    mov  ebx, [gbxm1_plus_gw_mul_gs]
    shl  ebx, 16
    add  ebx, [gbxm1_plus_gw_mul_gs]
    add  ebx, [g_e]
      mcall

    mov  ecx, [gbym1_shl16_gbym1]
      mcall

    mov  ebx, [gbxm1_shl16_gbxm1]
    mov  ecx, [gbym1_shl16_gbym1]
    sub  ecx, [g_e]
      mcall

    mov  ebx, [gbxm1_plus_gw_mul_gs]
    shl  ebx, 16
    add  ebx, [gbxm1_plus_gw_mul_gs]
      mcall

    mov  ecx, [gbym1_plus_gh_mul_gs]
    shl  ecx, 16
    add  ecx, [gbym1_plus_gh_mul_gs]
    add  ecx, [g_e]
      mcall

    mov  ebx, [gbxm1_shl16_gbxm1]
      mcall

    ret


  corners_crosses:

      call      corners_inner
      call      corners_outer

    ret


    ;;---Draw_decorations--------------------------------------------------------------------------------------------------


Draw_square:
    ;;===Draw_square=======================================================================================================
    ;; bl   -   x_coord
    ;; bh   -   y_coord
    ;; edx  -   color

    push eax ebx ecx edx

    mov  cl,  bh

    mov  al,  byte[g_s]
    mul  bl
    mov  bx,  ax
    add  bx,  word[gbxm1]
    inc  bx
    shl  ebx, 16
    add  ebx, [g_s]
    dec  ebx

    mov  al,  byte[g_s]
    mul  cl
    mov  cx,  ax
    add  cx,  word[gbym1]
    inc  cx
    shl  ecx, 16
    add  ecx, [g_s]
    dec  ecx

      mcall     13

    pop  edx ecx ebx eax

    ret

    ;;---Draw_square-------------------------------------------------------------------------------------------------------
    
    
Draw_menu_esc:
    ;;===Draw_menu_esc=====================================================================================================

    mov  ebx, [window_width]
    shr  ebx, 1
    sub  ebx, string_menu_esc.size*3+6
    shl  ebx, 16
    add  ebx, dword[top_strings]
      mcall     4, ,[navigation_strings_color],string_menu_esc
    
    ret
    
    ;;---Draw_menu_esc-----------------------------------------------------------------------------------------------------


Draw_score_string:
    ;;===Draw_score_string=================================================================================================

    mov  ebx, [window_width]
    shr  ebx, 3
    sub  ebx, 5
    shl  ebx, 16
    add  ebx, dword[bottom_top_strings]
      mcall     4, ,[score_string_color],string_score

    ret

    ;;---Draw_score_string-------------------------------------------------------------------------------------------------
    
    
Draw_score_number:
    ;;===Draw_score_number================================================================================================= 

    mov  edx, [window_width]
    shr  edx, 3
    sub  edx, 5+1
    add  edx, string_score.size*6
    shl  edx, 16
    add  edx, dword[bottom_top_strings]
      mcall     47,0x00070000,[score], ,[score_number_color],[background_color]

    ret

    ;;---Draw_score_number-------------------------------------------------------------------------------------------------


Draw_hiscore_string:
    ;;===Draw_hiscore_string===============================================================================================

    mov  ebx, [window_width]
    shr  ebx, 3
    neg  ebx
    add  ebx, [window_width]
    sub  ebx, string_hi_score.size*6+7*6+5
    shl  ebx, 16
    add  ebx, dword[bottom_top_strings]
      mcall     4, ,[hiscore_string_color],string_hi_score
    
    ret
    
    ;;---Draw_hiscore_string-----------------------------------------------------------------------------------------------


Draw_hiscore_number:
    ;;===Draw_hiscore_number===================================================================================================

    mov  edx, [window_width]
    shr  edx, 3
    neg  edx
    add  edx, [window_width]
    sub  edx, 7*6+6
    shl  edx, 16
    add  edx, dword[bottom_top_strings]
    
    cmp  [play_mode],   CLASSIC_MODE
     jne @f
    mov  ecx, [hi_score_classic]
     jmp .done
  @@:
    mov  ecx, [hi_score_levels]

  .done:
      mcall     47,0x00070000, , ,[hiscore_number_color]
    
    ret
    
    ;;---Draw_hiscore_number---------------------------------------------------------------------------------------------------


Draw_champion_string:
    ;;===Draw_champion_string==================================================================================================

    mov  ebx, [window_width]
    shr  ebx, 3
    neg  ebx
    add  ebx, [window_width]
    sub  ebx, string_champion.size*6+7*6+5
    shl  ebx, 16
    add  ebx, dword[bottom_bottom_strings]
      mcall     4, ,[champion_string_color],string_champion

    ret

    ;;---Draw_champion_string----------------------------------------------------------------------------------------------


Draw_champion_name:
    ;;===Draw_champion_name================================================================================================

    mov  ebx, [window_width]
    shr  ebx, 3
    neg  ebx
    add  ebx, [window_width]
    sub  ebx, CHAMPION_NAME_LENGTH/2*6+7*6+6                ; there is no difference between length of champion names for other play_modes
    add  ebx, CHAMPION_NAME_LENGTH/2*6
    shl  ebx, 16
    add  ebx, dword[bottom_bottom_strings]

    cmp  [play_mode],   CLASSIC_MODE
     jne @f
    mov  edx, champion_name_classic
     jmp .done
  @@:
    mov  edx, champion_name_levels

  .done:
      mcall     4, ,[champion_name_color],

    ret

    ;;---Draw_champion_name------------------------------------------------------------------------------------------------


Draw_picture:
    ;;===Draw_picture======================================================================================================
    ;;  in  :
    ;;           ax =   number of left square *0x100+ picture width (in squares)
    ;;           cx =   number of top square *0x100+ picture height (in squares)
    ;;          edx =   picture color
    ;;          esi =   pointer to picture data
    ;;

    add  al,  ah
    add  cl,  ch
    mov  bh,  ch

  .draw:
    mov  bl,  ah
    mov  di,  7
    
  .loop:
    bt  word[esi],  di
     jnc @f
    push eax ebx ecx esi edi
      call      Draw_square
    pop  edi esi ecx ebx eax
    
  @@:
    dec  di
     jns @f
    mov  di,  7
    inc  esi
  @@:
    inc  bl
    cmp  bl,  al
     jne .loop
    
    inc  bh
    cmp  di,  7
     jz  @f
    inc  esi
  @@:
    cmp  bh,  cl
     jne .draw

    ret

    ;;---Draw_picture------------------------------------------------------------------------------------------------------


Draw_on_map:
    ;;===Draw_on_map=======================================================================================================
    ;;  in  :
    ;;           al =   x coord
    ;;           ah =   y coord
    ;;           cl =   value to draw
    ;;

    and  eax, 0x0000ffff
    xor  bx,  bx
    mov  bl,  al
    shr  ax,  8
    mov  dx,  GRID_WIDTH
    mul  dx
    add  ax,  bx
    mov  edi, field_map
    add  edi, eax
    mov  [edi], cl

    ret

    ;;---Draw_on_map-------------------------------------------------------------------------------------------------------


Get_from_map:
    ;;===Get_from_map======================================================================================================
    ;;  in  :
    ;;           al =   x coord
    ;;           ah =   y coord
    ;;  out :
    ;;           bl =   value on map
    ;;

    push eax
    
    and  eax, 0x0000ffff
    xor  bx,  bx
    mov  bl,  al
    shr  ax,  8
    mov  dx,  GRID_WIDTH
    mul  dx
    add  ax,  bx
    mov  edi, field_map
    add  edi, eax
    mov  bl,  [edi]

    pop  eax

    ret

    ;;---Get_from_map-----------------------------------------------------------------------------------------------------------


Load_level:
    ;;===Load_level=============================================================================================================
    ;;  in  :
    ;;          cur_level_number    =   level number to load
    ;;

    mov  eax, [cur_level_number]
    mov  edx, stage_00
  @@:
    test al,  al
     jz  @f
    add  edx, stage_01-stage_00
    dec  al
     jmp @b
  @@:

    mov  esi, window_title_with_lives
    mov  edi, window_title+5

  .lives_in_title:
    cmp  [play_mode],   LEVELS_MODE
     jne .level_name_in_title
    test [show_lives_style],    1
     jz  .level_name_in_title
    mov  [edi], byte ' '
    mov  al,  byte[separating_symbol]
    mov  [edi+1], byte al
    mov  [edi+2], byte ' '
    add  edi, 3
    mov  eax, [lives]
    add  al,  0x30
    mov  [window_title_with_lives],   al
    mov  ecx, 10
    rep  movsb
    dec  edi

  .level_name_in_title:
    cmp  [draw_level_name_in_window_title], 1
     jne @f
    mov  [edi], byte ' '
    mov  al,  byte[separating_symbol]
    mov  [edi+1], byte al
    mov  [edi+2], byte ' '
    add  edi, 3
    mov  esi, edx
    add  esi, LEVEL.name
    mov  esi, [esi]
    mov  ecx, 16
    rep  movsd

  @@:
      mcall     71,1,window_title

    mov  [cur_level],   edx

    mov  esi, edx
    add  esi, LEVEL.field
    mov  edi, field_map
    mov  ecx, 2
    mov  ah,  GRID_HEIGHT
  .begin:
    mov  ebx, 7
    mov  al,  GRID_WIDTH
  .loop:
    bt   [esi], ebx
     jnc @f
    mov  byte[edi], cl
     jmp .skip
  @@:
    mov  byte[edi], 0
  .skip:
    dec  ebx
     jns @f
    mov  ebx, 7
    inc  esi
  @@:
    inc  edi
    dec  al
     jnz .loop
    inc  esi
    dec  ah
     jnz .begin


    mov  esi, edx
    add  esi, LEVEL.snake_dots
    mov  edi, snake_dots
    mov  ecx, 3
    rep  movsw
    
    mov  esi, edx
    add  esi, LEVEL.snake_direction
    mov  eax, [esi]
    mov  [snake_direction], eax
    
    mov  esi, edx
    add  esi, LEVEL.snake_direction_next
    mov  eax, [esi]
    mov  [snake_direction_next],    eax

    mov  esi, edx
    add  esi, LEVEL.number_of_stones
    mov  eax, [esi]
    mov  [number_of_free_dots], GRID_WIDTH*GRID_HEIGHT-3
    sub  [number_of_free_dots], eax
    
    mov  ax,  word[snake_dots]
    mov  cl,  1
      call      Draw_on_map
    mov  ax,  word[snake_dots+2]
    mov  cl,  1
      call      Draw_on_map
    mov  ax,  word[snake_dots+4]
    mov  cl,  1
      call      Draw_on_map

    mov  [action],  0
    mov  [snake_length_x2], 6

    ret

    ;;---Load_level-------------------------------------------------------------------------------------------------------------


Draw_stones:
    ;;===Draw_stones============================================================================================================

    mov  ax,  0*0x100+GRID_WIDTH
    mov  cx,  0*0x100+GRID_HEIGHT
    mov  edx, [stone_color]
    mov  esi, [cur_level]
    add  esi, LEVEL.field
      call      Draw_picture

    ret

    ;;---Draw_stones------------------------------------------------------------------------------------------------------------


Hide_cursor:
    ;;===Hide_cursor===========================================================================================================

      mcall     37,5,[cursor_handle]

    ret

    ;;---Show_cursor-----------------------------------------------------------------------------------------------------------


Show_cursor:
    ;;===Hide_cursor===========================================================================================================

      mcall     37,5,0

    ret

    ;;---Show_cursor-----------------------------------------------------------------------------------------------------------


Set_window_mode:
    ;;===Set_window_mode=======================================================================================================

    test al,  al
     jnz .fullscreen
    mov  eax, [window_style_windowed]
     jmp .quit

  .fullscreen:
    mov  eax, [window_style_fullscreen]

  .quit:
    mov [window_style], eax
    ret

;;---Some_functions------------------------------------------------------------------------------------------------------------


Reverse_snake:
    ;;===Reverse_snake=========================================================================================================

    cmp  [snake_direction], LEFT
     jne @f
    mov  [snake_direction_next],    RIGHT
     jmp .quit
  @@:
    cmp  [snake_direction], RIGHT
     jne @f
    mov  [snake_direction_next],    LEFT
     jmp .quit
  @@:
    cmp  [snake_direction], UP
     jne @f
    mov  [snake_direction_next],    DOWN
     jmp .quit
  @@:
   cmp  [snake_direction], DOWN
     jne @f
    mov  [snake_direction_next],    UP
;     jmp .quit
  @@:

  .quit:
    ret

    ;;---Reverse_snake---------------------------------------------------------------------------------------------------------


;;===Variables==================================================================================================================

window_title                db      'Snake',64+15 dup (0)
window_title_with_lives     db      '_ live(s)',0
default_separating_symbol   db      '|',0
window_style_windowed       dd      0x33000000              ; scalable skinned window
window_style_fullscreen     dd      0x00000000
time_before_waiting         dd      0x0
time_to_wait                dd      0x0
time_wait_limit             dd      101
time_wait_limit_const       dd      0x0

play_mode                   dd      0x0
lives                       dd      START_LIVES
acceleration_mask           dd      0x0

resized_by_hotkey           dd      0x0
fullscreen                  dd      0x0

szZ string_score            ,'SCORE : '
szZ string_hi_score         ,'HI-SCORE : '
szZ string_champion         ,'CHAMPION : '
szZ string_level            ,'LEVEL : '
szZ string_pause_space      ,'PAUSE - ',0x27,'SPACE',0x27
szZ string_resume_space     ,'RESUME - ',0x27,'SPACE',0x27
szZ string_menu_esc         ,'MENU - ',0x27,'ESC',0x27
szZ string_apply_name_enter ,'APPLY NAME - ',0x27,'ENTER',0x27
szZ press_to_start          ,'PRESS ',0x27,'ENTER',0x27,' TO START'
szZ press_esc_to_exit       ,'PRESS ',0x27,'ESC',0x27,' TO EXIT'
;press_F2_to_options         db      'PRESS ',0x27,'F2',0x27,' TO OPTIONS',0

szZ string_congratulations  ,'   Congratulations!!! New hi-score is : '
szZ string_enter_your_name  ,'You are the champion! Enter your name : '

szZ string_button_play      ,'PLAY'
szZ string_button_exit      ,'EXIT'
szZ string_button_inc       ,'+INC+'
szZ string_button_dec       ,'-dec-'
szZ string_button_pm_classic,'CLASSIC mode'
szZ string_button_pm_levels ,'LEVELS mode'

is_new_record               dd      0

action                      dd      0

picture_first_menu_snake    db      0xf4,0x99,0x2f,\
                                    0x86,0xa5,0x49,\
                                    0xf5,0xa5,0x8f,\
                                    0x15,0xbd,0x48,\
                                    0xf4,0xa5,0x2f

picture_first_menu_version  db      0xf1,0xe0,\
                                    0x90,0x20,\
                                    0x90,0x20,\
                                    0x90,0x20,\
                                    0xf4,0x20

picture_pause               db      11100011b,00100101b,11101111b,\
                                    10010100b,10100101b,00001000b,\
                                    10010100b,10100101b,00001000b,\
                                    11100111b,10100101b,11101111b,\
                                    10000100b,10100100b,00101000b,\
                                    10000100b,10011001b,11101111b

picture_game_over           db      00110000b,00000000b,00000000b,00000000b,\
                                    01001001b,11001000b,10111100b,00000000b,\
                                    10000010b,00101101b,10100000b,00000000b,\
                                    10011010b,00101010b,10111000b,00000000b,\
                                    10001011b,11101000b,10100000b,00000000b,\
                                    01110010b,00101000b,10111100b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000111b,00000000b,00000000b,00000000b,\
                                    00001000b,10100010b,11110111b,10000000b,\
                                    00001000b,10100010b,10000100b,01000000b,\
                                    00001000b,10100010b,11100100b,01000000b,\
                                    00001000b,10010100b,10000111b,10000000b,\
                                    00000111b,00001000b,11110100b,01000000b

;picture_you_win             db      10001001b,11001000b,10000000b,\
;                                    10001010b,00101000b,10000000b,\
;                                    01010010b,00101000b,10000000b,\
;                                    00100010b,00101000b,10000000b,\
;                                    00100001b,11000111b,00000000b,\
;                                    00000000b,00000000b,00000000b,\
;                                    00000000b,00000000b,00000000b,\
;                                    01000100b,10010001b,00000000b,\
;                                    01010100b,10011001b,00000000b,\
;                                    01010100b,10010101b,00000000b,\
;                                    01010100b,10010011b,00000000b,\
;                                    00101000b,10010001b,00000000b

picture_you_win             db      01000100b,01000011b,10001000b,10000000b,\
                                    01000100b,01000100b,01001000b,10000000b,\
                                    01000100b,01000100b,00001000b,10000000b,\
                                    01111100b,01000100b,11001111b,10000000b,\
                                    01000100b,01000100b,01001000b,10000000b,\
                                    01000100b,01000011b,10001000b,10000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    11110011b,10011100b,11110011b,11000000b,\
                                    10000100b,00100010b,10001010b,00000000b,\
                                    11110100b,00100010b,10001011b,10000000b,\
                                    00010100b,00100010b,11110010b,00000000b,\
                                    11110011b,10011100b,10001011b,11000000b

picture_level               db      10000111b,10100101b,11101000b,\
                                    10000100b,00100101b,00001000b,\
                                    10000111b,00100101b,11001000b,\
                                    10000100b,00101001b,00001000b,\
                                    11110111b,10110001b,11101111b

digits_font                 db      0xf0,0x90,0x90,0x90,0xf0,\
                                    0x20,0x60,0x20,0x20,0x20,\
                                    0xf0,0x10,0xf0,0x80,0xf0,\
                                    0xf0,0x10,0x70,0x10,0xf0,\
                                    0x90,0x90,0xf0,0x10,0x10,\
                                    0xf0,0x80,0xf0,0x10,0xf0,\
                                    0xf0,0x80,0xf0,0x90,0xf0,\
                                    0xf0,0x10,0x10,0x10,0x10,\
                                    0xf0,0x90,0xf0,0x90,0xf0,\
                                    0xf0,0x90,0xf0,0x10,0xf0

stage_00:
.field                      db      00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b

.snake_dots                 db      3,3, 4,3, 5,3
.snake_direction            dd      RIGHT
.snake_direction_next       dd      RIGHT
.number_of_stones           dd      0
.name                       dd      stage_00_name

stage_01:
.field                      db      11111000b,00000000b,00000001b,11110000b,\
                                    10000000b,00000000b,00000000b,00010000b,\
                                    10000000b,00000000b,00000000b,00010000b,\
                                    10000000b,00000000b,00000000b,00010000b,\
                                    10000000b,00000000b,00000000b,00010000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    10000000b,00000000b,00000000b,00010000b,\
                                    10000000b,00000000b,00000000b,00010000b,\
                                    10000000b,00000000b,00000000b,00010000b,\
                                    10000000b,00000000b,00000000b,00010000b,\
                                    11111000b,00000000b,00000001b,11110000b

.snake_dots                 db      3,3, 4,3, 5,3
.snake_direction            dd      RIGHT
.snake_direction_next       dd      RIGHT
.number_of_stones           dd      36
.name                       dd      stage_01_name

stage_02:
.field                      db      00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00011111b,11000000b,00111111b,10000000b,\
                                    00010000b,00000000b,00000000b,10000000b,\
                                    00010000b,00000000b,00000000b,10000000b,\
                                    00010000b,00000000b,00000000b,10000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00010000b,00000000b,00000000b,10000000b,\
                                    00010000b,00000000b,00000000b,10000000b,\
                                    00010000b,00000000b,00000000b,10000000b,\
                                    00011111b,11000000b,00111111b,10000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b

.snake_dots                 db      7,5, 8,5, 9,5
.snake_direction            dd      RIGHT
.snake_direction_next       dd      RIGHT
.number_of_stones           dd      40
.name                       dd      stage_02_name

stage_03:
.field                      db      00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00001001b,00000000b,00000000b,\
                                    00000000b,00001001b,00000000b,00000000b,\
                                    00000000b,00001001b,00000000b,00000000b,\
                                    00001111b,11111001b,11111111b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00001111b,11111001b,11111111b,00000000b,\
                                    00000000b,00001001b,00000000b,00000000b,\
                                    00000000b,00001001b,00000000b,00000000b,\
                                    00000000b,00001001b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b

.snake_dots                 db      23,0, 22,0, 21,0
.snake_direction            dd      LEFT
.snake_direction_next       dd      LEFT
.number_of_stones           dd      48
.name                       dd      stage_03_name

stage_04:
.field                      db      00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00100000b,01000000b,00000000b,\
                                    00000010b,00100000b,01000100b,00000000b,\
                                    00000010b,00000000b,00000100b,00000000b,\
                                    00010000b,00100000b,01000000b,10000000b,\
                                    00000010b,00100000b,01000100b,00000000b,\
                                    00010010b,00000000b,00000100b,10000000b,\
                                    00010010b,00000000b,00000100b,10000000b,\
                                    00000010b,00100000b,01000000b,00000000b,\
                                    00010000b,00100000b,01000000b,10000000b,\
                                    00000010b,00000000b,00000100b,00000000b,\
                                    00000010b,00100000b,01000100b,00000000b,\
                                    00000000b,00100000b,01000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b

.snake_dots                 db      19,6, 19,7, 19,8
.snake_napravlenie          dd      DOWN
.snake_napravlenie_next     dd      DOWN
.number_of_stones           dd      39
.name                       dd      stage_04_name

stage_05:
.field                      db      00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000001b,11111111b,11111000b,00000000b,\
                                    00000001b,11111111b,11111000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000111b,11111111b,11111110b,00000000b,\
                                    00000111b,11111111b,11111110b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00111111b,11111111b,11111111b,11000000b,\
                                    00111111b,11111111b,11111111b,11000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b

.snake_dots                 db      0,0, 0,1, 1,1
.snake_direction            dd      RIGHT
.snake_direction_next       dd      RIGHT
.number_of_stones           dd      112
.name                       dd      stage_05_name

stage_06:
.field                      db      00000001b,10000000b,00000000b,00000000b,\
                                    00000001b,11111111b,11111000b,00000000b,\
                                    00000001b,11111111b,11111000b,00000000b,\
                                    00000000b,00000000b,00011000b,00000000b,\
                                    00000000b,00000000b,00011000b,00000000b,\
                                    00011111b,11111111b,11111000b,00000000b,\
                                    00011111b,11111111b,11111000b,00000000b,\
                                    00011000b,00000000b,00000000b,00000000b,\
                                    00011000b,00000000b,00000000b,00000000b,\
                                    00011111b,11111111b,11111111b,11100000b,\
                                    00011111b,11111111b,11111111b,11100000b,\
                                    00000000b,00000000b,00000000b,01100000b,\
                                    00000000b,00000000b,00000000b,01100000b,\
                                    00000000b,00000000b,00000000b,01100000b

.snake_dots                 db      0,0, 0,1, 1,1
.snake_direction            dd      RIGHT
.snake_direction_next       dd      RIGHT
.number_of_stones           dd      128
.name                       dd      stage_06_name

stage_07:
.field                      db      00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000011b,11111111b,11111100b,00000000b,\
                                    00000000b,00000000b,00000100b,00000000b,\
                                    00000011b,11111111b,11110100b,00000000b,\
                                    00000010b,00000000b,00010100b,00000000b,\
                                    00000010b,11111111b,11010100b,00000000b,\
                                    00000010b,00000000b,00010100b,00000000b,\
                                    00000010b,11111111b,11110100b,00000000b,\
                                    00000010b,00000000b,00000100b,00000000b,\
                                    00000011b,11111111b,11111100b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b

.snake_dots                 db      8,1, 9,1, 10,1
.snake_direction            dd      RIGHT
.snake_direction_next       dd      RIGHT
.number_of_stones           dd      83
.name                       dd      stage_07_name

stage_08:
.field                      db      00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00010000b,00000000b,\
                                    00001001b,00000001b,00000000b,00000000b,\
                                    00000001b,01001001b,00000101b,00000000b,\
                                    00000000b,01000000b,00000100b,00000000b,\
                                    00001111b,00000000b,11100000b,00000000b,\
                                    00000000b,00000000b,00001000b,10000000b,\
                                    00000111b,00100000b,10000010b,10000000b,\
                                    00010000b,00000000b,00000010b,00000000b,\
                                    00010000b,11000000b,01110010b,00000000b,\
                                    00010010b,00000000b,00000010b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b

.snake_dots                 db      0,0, 1,0, 2,0
.snake_direction            dd      RIGHT
.snake_direction_next       dd      RIGHT
.number_of_stones           dd      40
.name                       dd      stage_08_name

stage_09:
.field                      db      00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00111101b,00100110b,01001011b,11000000b,\
                                    00100001b,10101001b,01010010b,00000000b,\
                                    00111101b,01100001b,01100011b,10000000b,\
                                    00000101b,01100111b,01010010b,00000000b,\
                                    00111101b,00100001b,01001011b,11000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b

.snake_dots                 db      12,6, 12,7, 12,8
.snake_direction            dd      DOWN
.snake_direction_next       dd      DOWN
.number_of_stones           dd      59
.name                       dd      stage_09_name

stage_10:
.field                      db      11101110b,11101110b,11101110b,11100000b,\
                                    11101110b,11101110b,11101110b,11100000b,\
                                    11101110b,11101110b,11101110b,11100000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    11101110b,11101110b,11101110b,11100000b,\
                                    11101110b,11101110b,11101110b,11100000b,\
                                    11101110b,11101110b,11101110b,11100000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    11101110b,11101110b,11101110b,11100000b,\
                                    11101110b,11101110b,11101110b,11100000b,\
                                    11101110b,11101110b,11101110b,11100000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    11101110b,11101110b,11101110b,11100000b,\
                                    11101110b,11101110b,11101110b,11100000b

.snake_dots                 db      3,2, 3,3, 4,3
.snake_direction            dd      RIGHT
.snake_direction_next       dd      RIGHT
.number_of_stones           dd      231
.name                       dd      stage_10_name

stage_11:
.field                      db      00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000111b,00000111b,00000111b,00000000b,\
                                    00001101b,10001101b,10001101b,10000000b,\
                                    00011000b,11011000b,11011000b,11000000b,\
                                    00000000b,01000000b,01000000b,01000000b,\
                                    00011000b,11011000b,11011000b,11000000b,\
                                    00001101b,10001101b,10001101b,10000000b,\
                                    00000111b,00000111b,00000111b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b

.snake_dots                 db      3,12, 4,12, 5,12
.snake_direction            dd      RIGHT
.snake_direction_next       dd      RIGHT
.number_of_stones           dd      69
.name                       dd      stage_11_name

stage_12:
.field                      db      00000000b,00011000b,00001110b,00000000b,\
                                    01101110b,00010000b,00001010b,01010000b,\
                                    01001011b,11011001b,11000000b,01110000b,\
                                    01100001b,01000001b,01000000b,00000000b,\
                                    00000000b,00000000b,00000011b,10000000b,\
                                    00000000b,00000000b,00000010b,10000000b,\
                                    01010011b,00001100b,10100110b,00110000b,\
                                    01110010b,00001000b,11100100b,00010000b,\
                                    00000011b,00001100b,00000110b,00110000b,\
                                    00000000b,11100000b,00000000b,00000000b,\
                                    00010100b,10100000b,00000110b,00000000b,\
                                    11011100b,00000110b,10100100b,00000000b,\
                                    01000011b,10000010b,11100110b,10100000b,\
                                    11000010b,10000110b,00000000b,11100000b

.snake_dots                 db      27,0, 26,0, 25,0
.snake_direction            dd      LEFT
.snake_direction_next       dd      LEFT
.number_of_stones           dd      110
.name                       dd      stage_12_name

stage_13:
.field                      db      00111000b,00100000b,00000000b,00000000b,\
                                    01111100b,11110011b,11000011b,10000000b,\
                                    11111100b,01110011b,10000001b,11000000b,\
                                    11110000b,00000011b,11000000b,00000000b,\
                                    00000000b,00000010b,00000000b,00000000b,\
                                    00000000b,00000010b,00000001b,00000000b,\
                                    00011110b,00000111b,00000111b,00000000b,\
                                    00000111b,10001111b,11111110b,00000000b,\
                                    00000011b,11111111b,11111100b,00000000b,\
                                    00110001b,11111111b,11111001b,01100000b,\
                                    00001110b,11101011b,00100111b,10000000b,\
                                    01111000b,10000011b,10000010b,00000000b,\
                                    00000011b,11100110b,00011010b,11000000b,\
                                    00000000b,00000000b,00000000b,00000000b

.snake_dots                 db      0,5, 0,6, 0,7
.snake_direction            dd      DOWN
.snake_direction_next       dd      DOWN
.number_of_stones           dd      141
.name                       dd      stage_13_name

stage_14:
.field                      db      00000110b,00000000b,00000000b,00000000b,\
                                    00001000b,00000000b,00011000b,00000000b,\
                                    00010000b,00000000b,00000100b,00000000b,\
                                    00100001b,10000000b,11000010b,00000000b,\
                                    01000010b,01000001b,00100001b,00000000b,\
                                    10000100b,00000010b,00010000b,10000000b,\
                                    10001000b,00000100b,00001000b,01000000b,\
                                    10010000b,00001000b,00000100b,01000000b,\
                                    01001000b,00010000b,00001000b,10000000b,\
                                    00100100b,00100000b,00010001b,00000000b,\
                                    00010010b,01000001b,00100010b,00000000b,\
                                    00001001b,10000000b,11000100b,00000000b,\
                                    00000100b,00000000b,00001000b,00000000b,\
                                    00000000b,00000000b,00110000b,00000000b

.snake_dots                 db      8,0, 9,0, 10,0
.snake_direction            dd      RIGHT
.snake_direction_next       dd      RIGHT
.number_of_stones           dd      60
.name                       dd      stage_14_name

stage_15:
.field                      db      00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,01110000b,00110000b,00000000b,\
                                    00000000b,10000000b,00001010b,00000000b,\
                                    00100001b,00000000b,00110010b,00000000b,\
                                    00010001b,00111111b,10011100b,00000000b,\
                                    00001001b,00100000b,11000000b,00000000b,\
                                    00010000b,00000010b,01000000b,00000000b,\
                                    00100000b,00000010b,00100001b,10000000b,\
                                    00010000b,00000010b,00110010b,01000000b,\
                                    00001000b,01000100b,00011100b,01000000b,\
                                    00010000b,00111000b,00010000b,01000000b,\
                                    00100000b,00000000b,00010000b,01000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b

.snake_dots                 db      13,3, 13,2, 14,2
.snake_direction            dd      RIGHT
.snake_direction_next       dd      RIGHT
.number_of_stones           dd      60
.name                       dd      stage_15_name

stage_16:
.field                      db      00000000b,10000010b,00000000b,00000000b,\
                                    00000000b,01001010b,10000010b,10100000b,\
                                    01111111b,11100111b,00000001b,11000000b,\
                                    00000000b,01000010b,00000000b,10000000b,\
                                    00000100b,10000000b,01000000b,00000001b,\
                                    00000100b,00100000b,10000000b,00000010b,\
                                    11000100b,00010001b,11111000b,00000111b,\
                                    00010101b,00001000b,10000000b,00000010b,\
                                    00001110b,00010000b,01000000b,00000001b,\
                                    00000100b,00100010b,00000000b,10000000b,\
                                    00000000b,00000010b,00000000b,01000000b,\
                                    00111111b,11111111b,11111111b,11100000b,\
                                    00000000b,00000010b,00000000b,01000000b,\
                                    00000000b,00000010b,00000000b,10000000b

.snake_dots                 db      11,7, 10,7, 9,7
.snake_direction            dd      LEFT
.snake_direction_next       dd      LEFT
.number_of_stones           dd      96
.name                       dd      stage_16_name

stage_17:
.field                      db      00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000111b,10000001b,11100000b,00000000b,\
                                    00001000b,01000010b,00010000b,00000000b,\
                                    00010001b,00100100b,01001000b,00000000b,\
                                    00010001b,00000000b,01001000b,00000000b,\
                                    00001000b,01000010b,00010000b,00000000b,\
                                    00000111b,10000001b,11100000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,01000000b,00000000b,00000000b,\
                                    00000000b,00111110b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b

.snake_dots                 db      11,7, 11,8, 12,8
.snake_direction            dd      RIGHT
.snake_direction_next       dd      RIGHT
.number_of_stones           dd      40
.name                       dd      stage_17_name

stage_18:
.field                      db      00000000b,00000000b,00000000b,00000000b,\
                                    01000100b,01000100b,01000100b,01000000b,\
                                    00101010b,10101010b,10101010b,10100000b,\
                                    00010001b,00010001b,00010001b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    01000100b,01000100b,01000100b,01000000b,\
                                    00101010b,10101010b,10101010b,10100000b,\
                                    00010001b,00010001b,00010001b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    01000100b,01000100b,01000100b,01000000b,\
                                    00101010b,10101010b,10101010b,10100000b,\
                                    00010001b,00010001b,00010001b,00000000b

.snake_dots                 db      2,5, 3,5, 4,5
.snake_direction            dd      RIGHT
.snake_direction_next       dd      RIGHT
.number_of_stones           dd      78
.name                       dd      stage_18_name

stage_19:
.field                      db      01000010b,00100100b,10000101b,00000000b,\
                                    00010000b,00010000b,00100000b,10000000b,\
                                    00111001b,00000010b,00010000b,00100000b,\
                                    01000100b,00001000b,00000010b,00000000b,\
                                    01010101b,01000000b,01000000b,01000000b,\
                                    01010100b,00010000b,00001000b,11100000b,\
                                    00000100b,10001001b,00100001b,00000000b,\
                                    01111100b,00100000b,00000001b,01010000b,\
                                    00111001b,00000100b,00010001b,01010000b,\
                                    00010000b,00000000b,10000001b,00010000b,\
                                    11010111b,11100000b,00011101b,11110000b,\
                                    00010000b,01000000b,00100000b,11100000b,\
                                    00010000b,10000000b,00100000b,01000000b,\
                                    00000001b,00000000b,00010000b,01000000b

.snake_dots                 db      27,6, 0,6, 1,6
.snake_direction            dd      RIGHT
.snake_direction_next       dd      RIGHT
.number_of_stones           dd      95
.name                       dd      stage_19_name

stage_20:
.field                      db      00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,10001000b,00000000b,\
                                    00000000b,00011100b,10000100b,00000000b,\
                                    00000000b,01100100b,10000010b,00000000b,\
                                    00000011b,10000100b,10000100b,00000000b,\
                                    00000010b,00000100b,10001000b,00000000b,\
                                    00000010b,00000100b,10000100b,00000000b,\
                                    00000010b,00000100b,10000010b,00000000b,\
                                    00000010b,00111100b,10010010b,00000000b,\
                                    00011110b,00111100b,10010100b,00000000b,\
                                    00011110b,00111100b,10001000b,00000000b,\
                                    00011110b,00000000b,10000000b,00000000b,\
                                    00000000b,00000000b,10000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b

.snake_dots                 db      17,2, 17,3, 17,4
.snake_direction            dd      DOWN
.snake_direction_next       dd      DOWN
.number_of_stones           dd      65
.name                       dd      stage_20_name

stage_21:
.field                      db      00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000011b,11111111b,11111110b,00000000b,\
                                    00000001b,01000100b,01000100b,00000000b,\
                                    00000010b,01000100b,01000100b,00000000b,\
                                    00001100b,01000100b,01000100b,00000000b,\
                                    01110000b,01000100b,01000100b,00000000b,\
                                    01110000b,01000100b,01000100b,00000000b,\
                                    01110000b,11101110b,11101110b,00000000b,\
                                    00000000b,11101110b,11101110b,00000000b,\
                                    00000000b,11101110b,11101110b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b

.snake_dots                 db      10,1, 11,1, 12,1
.snake_direction            dd      RIGHT
.snake_direction_next       dd      RIGHT
.number_of_stones           dd      86
.name                       dd      stage_21_name

stage_22:
.field                      db      00000000b,00000000b,00000000b,00000000b,\
                                    00000011b,10000000b,00000000b,00000000b,\
                                    00000111b,11100000b,00000000b,00000000b,\
                                    00001111b,11110000b,00000000b,00000000b,\
                                    00011111b,11100000b,00000000b,00000000b,\
                                    00011111b,11000011b,00001100b,00110000b,\
                                    00011111b,10000111b,10011110b,01110000b,\
                                    00011111b,11000111b,10011110b,01110000b,\
                                    00011111b,11100011b,00001100b,00110000b,\
                                    00001111b,11110000b,00000000b,00000000b,\
                                    00000111b,11100000b,00000000b,00000000b,\
                                    00000011b,10000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b

.snake_dots                 db      1,7, 1,6, 1,5
.snake_direction            dd      UP
.snake_direction_next       dd      UP
.number_of_stones           dd      104
.name                       dd      stage_22_name

stage_23:
.field                      db      00000000b,00000000b,00000000b,00000000b,\
                                    00100000b,01000101b,00010000b,00100000b,\
                                    00011010b,00100101b,00100010b,11000000b,\
                                    00000100b,10101000b,10101001b,00000000b,\
                                    00000100b,10010010b,01001001b,00000000b,\
                                    00001011b,00110000b,01100110b,10000000b,\
                                    00000000b,11001010b,10011000b,00000000b,\
                                    00000001b,00000111b,00000100b,00000000b,\
                                    00001110b,01001010b,10010011b,10000000b,\
                                    00000010b,00110000b,01100010b,00000000b,\
                                    00000101b,00010010b,01000101b,00000000b,\
                                    00001001b,00001000b,10000100b,10000000b,\
                                    00000000b,00001000b,10000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b

.snake_dots                 db      15,0, 14,0, 13,0
.snake_direction            dd      LEFT
.snake_direction_next       dd      LEFT
.number_of_stones           dd      85
.name                       dd      stage_23_name

stage_24:
.field                      db      00000000b,00000000b,00000000b,00000000b,\
                                    00111111b,11111111b,11111111b,10000000b,\
                                    00100000b,00000000b,00000000b,10000000b,\
                                    00100011b,11111111b,11111000b,10000000b,\
                                    00100010b,00000000b,00001000b,10000000b,\
                                    00100010b,00111111b,10001000b,10000000b,\
                                    00100010b,00100000b,10001000b,10000000b,\
                                    00101010b,10101010b,10101010b,10000000b,\
                                    00001000b,10001110b,00100010b,00000000b,\
                                    00001000b,10000000b,00100010b,00000000b,\
                                    00001000b,11111111b,11100010b,00000000b,\
                                    00001000b,00000000b,00000010b,00000000b,\
                                    00001111b,11111111b,11111110b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b

.snake_dots                 db      1,0, 0,0, 0,1
.snake_direction            dd      DOWN
.snake_direction_next       dd      DOWN
.number_of_stones           dd      120
.name                       dd      stage_24_name

stage_25:
.field                      db      00000100b,11000000b,00000000b,00000000b,\
                                    00000011b,10000000b,00110010b,00000000b,\
                                    10011010b,10000000b,00011100b,00000000b,\
                                    01110000b,00000000b,00010101b,10010000b,\
                                    01010000b,00000111b,00000000b,11100000b,\
                                    00000100b,00000101b,00000000b,10100000b,\
                                    00000100b,00000100b,00000000b,00000000b,\
                                    00000011b,11111100b,00011001b,00000000b,\
                                    00000010b,10010100b,00001110b,00000000b,\
                                    00000010b,10010100b,00001010b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000011b,00100001b,10010011b,00100000b,\
                                    00000001b,11000000b,11100001b,11000000b,\
                                    00000001b,01000000b,10100001b,01000000b

.snake_dots                 db      11,2, 12,2, 13,2
.snake_direction            dd      RIGHT
.snake_direction_next       dd      RIGHT
.number_of_stones           dd      88
.name                       dd      stage_25_name

stage_26:
.field                      db      00000000b,00000000b,00000000b,00000000b,\
                                    00111100b,01001111b,01111010b,01000000b,\
                                    00100000b,01000001b,00001010b,01000000b,\
                                    00100100b,01001111b,01111011b,11000000b,\
                                    00000100b,01001000b,00001000b,01000000b,\
                                    00111100b,01001111b,01111000b,01000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00111101b,11101111b,01111011b,11000000b,\
                                    00100001b,00000001b,00000000b,00000000b,\
                                    00111101b,11100001b,01111011b,11000000b,\
                                    00000100b,00000001b,00000000b,01000000b,\
                                    00111101b,11100001b,01111011b,11000000b,\
                                    00000000b,00000000b,00000000b,00000000b

.snake_dots                 db      1,5, 0,5, 0,6
.snake_direction            dd      DOWN
.snake_direction_next       dd      DOWN
.number_of_stones           dd      115
.name                       dd      stage_26_name

stage_27:
.field                      db      00000000b,10000000b,00000000b,01000000b,\
                                    00000000b,10000000b,01000000b,11100000b,\
                                    00100011b,11100000b,01000000b,01000000b,\
                                    01110000b,10000001b,11110000b,00000000b,\
                                    00100000b,10000000b,01000000b,00000000b,\
                                    00000000b,00000000b,01000010b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000010b,00000000b,00000000b,00000000b,\
                                    00000111b,00000000b,00000000b,10000000b,\
                                    00000010b,00001000b,00000001b,11000000b,\
                                    00000000b,00000000b,10000000b,10000000b,\
                                    00000000b,01000001b,11000000b,00000000b,\
                                    01000000b,11100000b,10000000b,00000000b,\
                                    00000000b,01000000b,00000000b,00000000b

.snake_dots                 db      12,8, 12,7, 12,6
.snake_direction            dd      UP
.snake_direction_next       dd      UP
.number_of_stones           dd      51
.name                       dd      stage_27_name

stage_28:
.field                      db      00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000100b,00000000b,00000010b,00000000b,\
                                    00010100b,00000000b,00000010b,10000000b,\
                                    01010100b,00000000b,00000010b,10100000b,\
                                    01010101b,11111111b,11111010b,10100000b,\
                                    01010100b,00000000b,00000010b,10100000b,\
                                    00010100b,00000000b,00000010b,10000000b,\
                                    00000100b,00000000b,00000010b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b

.snake_dots                 db      13,8, 12,8, 11,8
.snake_direction            dd      LEFT
.snake_direction_next       dd      LEFT
.number_of_stones           dd      44
.name                       dd      stage_28_name

stage_29:
.field                      db      00000000b,01110000b,00000000b,00000000b,\
                                    00000100b,01000110b,00000001b,10000000b,\
                                    01001110b,00001100b,01100000b,11000000b,\
                                    01000000b,00000000b,01100000b,00000000b,\
                                    01100000b,01111000b,00000001b,10010000b,\
                                    00000000b,00000010b,10000101b,10110000b,\
                                    00110000b,00110010b,10001100b,00100000b,\
                                    00011011b,00110110b,10000100b,00000000b,\
                                    00000001b,00000000b,10010000b,10000000b,\
                                    00100001b,00000000b,00111000b,10000000b,\
                                    00111001b,00110011b,00000011b,10000000b,\
                                    01111111b,11111111b,00011011b,11010000b,\
                                    11111111b,11111111b,00011111b,11110000b,\
                                    11111111b,11111111b,00111111b,11110000b

.snake_dots                 db      0,0, 1,0, 2,0
.snake_direction            dd      RIGHT
.snake_direction_next       dd      RIGHT
.number_of_stones           dd      151
.name                       dd      stage_29_name

stage_30:
.field                      db      00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000001b,01011100b,00000000b,\
                                    00000000b,00000001b,11001000b,00000000b,\
                                    00000100b,00000001b,01001000b,00000000b,\
                                    00000100b,00000100b,00000000b,00000000b,\
                                    00000100b,00000100b,00000100b,00000000b,\
                                    00000100b,00000100b,00000100b,00000000b,\
                                    00000100b,00000100b,00000100b,00000000b,\
                                    01111111b,11000100b,11111111b,11100000b,\
                                    00000100b,00000100b,00000100b,00000000b,\
                                    00011111b,00111111b,10001110b,00000000b,\
                                    00000100b,00000100b,00000100b,00000000b,\
                                    00011111b,00011111b,00011111b,00000000b,\
                                    11111111b,11111111b,11111111b,11110000b

.snake_dots                 db      8,2, 9,2, 10,2
.snake_direction            dd      RIGHT
.snake_direction_next       dd      RIGHT
.number_of_stones           dd      109
.name                       dd      stage_30_name

stage_31:
.field                      db      00000101b,00010000b,00000100b,01000000b,\
                                    01000100b,01010101b,00010100b,01000000b,\
                                    01000101b,01010101b,01000101b,00010000b,\
                                    01010000b,00010100b,01000000b,01010000b,\
                                    00010101b,01000101b,01010100b,01000000b,\
                                    01000001b,00010000b,01010101b,01000000b,\
                                    01010101b,00010100b,00000101b,00010000b,\
                                    00000101b,01010000b,01000101b,01010000b,\
                                    01010000b,01000100b,00000000b,01010000b,\
                                    00010101b,00000101b,00010100b,00010000b,\
                                    01010001b,00010001b,01000001b,01000000b,\
                                    01000100b,00000101b,01010100b,01010000b,\
                                    00010001b,01010100b,00010001b,00010000b,\
                                    00000100b,01000001b,00010001b,00000000b

.snake_dots                 db      18,8, 17,8, 16,8
.snake_direction            dd      LEFT
.snake_direction_next       dd      LEFT
.number_of_stones           dd      112
.name                       dd      stage_31_name

stage_32:
.field                      db      11111111b,11111111b,11111111b,11110000b,\
                                    10010010b,01001001b,00100100b,10010000b,\
                                    10010000b,01000001b,00000100b,00010000b,\
                                    10010010b,01001001b,00100100b,10010000b,\
                                    10010010b,01001001b,00100100b,10010000b,\
                                    10010010b,01001001b,00100100b,10010000b,\
                                    10010010b,01001001b,00100100b,10010000b,\
                                    10010010b,01001001b,00100100b,10010000b,\
                                    10010010b,01001001b,00100100b,10010000b,\
                                    10010010b,01001001b,00100100b,10010000b,\
                                    10010010b,01001001b,00100100b,10010000b,\
                                    10000010b,00001000b,00100000b,10010000b,\
                                    10010010b,01001001b,00100100b,10010000b,\
                                    11111111b,11111111b,11111111b,11110000b

.snake_dots                 db      1,1, 1,2, 1,3
.snake_direction            dd      DOWN
.snake_direction_next       dd      DOWN
.number_of_stones           dd      168
.name                       dd      stage_32_name

stage_33:
.field                      db      00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    01111111b,11001111b,11111111b,11100000b,\
                                    01000100b,01001000b,01000000b,00100000b,\
                                    01000100b,01001000b,01000001b,10100000b,\
                                    01000100b,01001000b,01001101b,10100000b,\
                                    00000000b,00000000b,00000110b,00000000b,\
                                    01000100b,01001000b,01000010b,00100000b,\
                                    01000100b,01001000b,01001111b,00100000b,\
                                    01000100b,01001000b,01001111b,00100000b,\
                                    01000100b,01001000b,01000110b,00100000b,\
                                    01111111b,11001111b,11111111b,11100000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b

.snake_dots                 db      6,6, 7,6, 8,6
.snake_direction            dd      RIGHT
.snake_direction_next       dd      RIGHT
.number_of_stones           dd      109
.name                       dd      stage_33_name

stage_34:
.field                      db      01110000b,00000000b,00000011b,10000000b,\
                                    00010010b,00010000b,01111100b,00000000b,\
                                    00011110b,00010000b,00100100b,00000000b,\
                                    00000100b,00011001b,00100111b,00000000b,\
                                    00001111b,10001001b,00100000b,00110000b,\
                                    00000001b,00001011b,00101000b,00100000b,\
                                    00000001b,00011110b,01111000b,00100000b,\
                                    00111000b,00000010b,00001100b,10100000b,\
                                    00001110b,00100010b,00000000b,10100000b,\
                                    01100011b,11111110b,01000011b,11100000b,\
                                    00111110b,00100010b,01000000b,10000000b,\
                                    00000000b,01100011b,11000010b,10000000b,\
                                    00000000b,01000000b,01100111b,10000000b,\
                                    00000000b,00000000b,00000010b,00000000b

.snake_dots                 db      7,0, 8,0, 9,0
.snake_direction            dd      RIGHT
.snake_direction_next       dd      RIGHT
.number_of_stones           dd      113
.name                       dd      stage_34_name

stage_35:
.field                      db      00000100b,00000000b,00001010b,00000000b,\
                                    00010100b,01000000b,00101010b,00000000b,\
                                    00010100b,10000010b,00010010b,10000000b,\
                                    00010001b,00000000b,00010010b,10000000b,\
                                    00010001b,00000010b,00001010b,10000000b,\
                                    01010010b,00000010b,00001000b,10100000b,\
                                    01000100b,00000000b,00001000b,10100000b,\
                                    01000100b,00000010b,00000100b,10100000b,\
                                    01001000b,00000010b,00000100b,00100000b,\
                                    01001000b,00000000b,00000010b,00100000b,\
                                    00010000b,00000010b,00000010b,00100000b,\
                                    00110000b,00000010b,00000010b,00100000b,\
                                    00100000b,00000010b,00000001b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b

.snake_dots                 db      13,11, 13,10, 13,9
.snake_direction            dd      UP
.snake_direction_next       dd      UP
.number_of_stones           dd      66
.name                       dd      stage_35_name

stage_36:
.field                      db      10101110b,10001110b,00110100b,11100000b,\
                                    11101000b,10001110b,00101010b,10000000b,\
                                    10101110b,11101000b,00101010b,11100000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00000000b,10110010b,01000100b,00000000b,\
                                    00000001b,10100101b,01010100b,00000000b,\
                                    00000001b,10100101b,00101000b,00000000b,\
                                    00000000b,00000000b,00000000b,00000000b,\
                                    00010001b,11010101b,11010001b,11000000b,\
                                    00010001b,11010101b,11010001b,00000000b,\
                                    00010001b,00010101b,00010000b,10000000b,\
                                    00011101b,11001001b,11011100b,01000000b,\
                                    00000000b,00000000b,00000001b,11010000b

.snake_dots                 db      27,11, 27,10, 27,9
.snake_direction            dd      UP
.snake_direction_next       dd      UP
.number_of_stones           dd      112
.name                       dd      stage_36_name


stage_00_name               db      'Classic mode',0
stage_01_name               db      'Begin',0
stage_02_name               db      'Frame',0
stage_03_name               db      'Sight',0
stage_04_name               db      'Dashed',0
stage_05_name               db      'Beams',0
stage_06_name               db      'Pipe',0
stage_07_name               db      'Labyrinth',0
stage_08_name               db      'Sea battle',0
stage_09_name               db      'Recursion',0
stage_10_name               db      'Narrow corridors',0
stage_11_name               db      'CCC',0
stage_12_name               db      'Deadlocks',0
stage_13_name               db      'Boat',0
stage_14_name               db      'Pattern',0
stage_15_name               db      'Guernica',0
stage_16_name               db      'Goto',0
stage_17_name               db      'Smiling face',0
stage_18_name               db      'Waves',0
stage_19_name               db      'First snow',0
stage_20_name               db      'Music and silence',0
stage_21_name               db      'Experiment',0
stage_22_name               db      'Pacman',0
stage_23_name               db      'Intricate pattern',0
stage_24_name               db      'Square arcs',0
stage_25_name               db      'In the animal world',0
stage_26_name               db      'Digits',0
stage_27_name               db      'Pluses',0
stage_28_name               db      'Rod',0
stage_29_name               db      'Tetris',0
stage_30_name               db      'Towers of Hanoi',0
stage_31_name               db      'Ruins',0
stage_32_name               db      'Walls of Akendora',0
stage_33_name               db      'Geranium in the window',0
stage_34_name               db      'Algae',0
stage_35_name               db      'The road ahead',0
stage_36_name               db      'Help me draw levels!',0


background_color            dd      0x000000
decorations_color           dd      0x00000000
snake_color                 dd      0x000000
snake_head_color            dd      0x000000
lives_in_head_number_color  dd      0x000000
snake_picture_color         dd      0x000000
version_picture_color       dd      0x000000
pause_picture_color         dd      0x000000
game_over_picture_color     dd      0x000000
you_win_picture_color       dd      0x000000
eat_color                   dd      0x000000
navigation_strings_color    dd      0x80000000
game_over_strings_color     dd      0x80000000
score_string_color          dd      0x80000000
hiscore_string_color        dd      0x80000000
champion_string_color       dd      0x80000000
game_over_hiscore_color     dd      0x80000000
score_number_color          dd      0x40000000
hiscore_number_color        dd      0x00000000
champion_name_color         dd      0x80000000
button_color                dd      0x000000
button_text_color           dd      0x80000000
stone_color                 dd      0x000000
splash_background_color     dd      0x000000
splash_level_string_color   dd      0x000000
splash_level_number_color   dd      0x000000
level_string_color          dd      0x80000000
level_number_color          dd      0x00000000


align 4
@IMPORT:

library \
        libini      ,   'libini.obj'        ,\
        box_lib     ,   'box_lib.obj'

import  libini,\
    ini.get_str     ,   'ini_get_str'       ,\
    ini.get_int     ,   'ini_get_int'       ,\
    ini.set_str     ,   'ini_set_str'       ,\
    ini.set_int     ,   'ini_set_int'       ,\
    ini.get_color   ,   'ini_get_color'     ,\
    ini.get_shortcut,   'ini_get_shortcut'

import  box_lib,\
    edit_box.draw   ,   'edit_box'          ,\
    edit_box.key    ,   'edit_box_key'      ,\
    edit_box.mouse  ,   'edit_box_mouse'

bFirstDraw  db  0

aPreferences                db      'Preferences',0
aSpeed                      db      'Speed',0
aTheme                      db      'Theme',0
aSmart_reverse              db      'Smart_reverse',0
aShow_lives_style           db      'Show_lives_style',0
aDraw_level_name_in_window_title db 'Draw_level_name_in_window_title',0
aSeparating_symbol          db      'Separating_symbol',0

aShortcuts                  db      'Shortcuts',0
aMove_left                  db      'Move_left',0
aMove_down                  db      'Move_down',0
aMove_up                    db      'Move_up',0
aMove_right                 db      'Move_right',0
aReverse                    db      'Reverse',0
aIncrease                   db      'Increase',0
aDecrease                   db      'Decrease',0

aTheme_name                 db      32  dup (0)
aDecorations                db      'Decorations',0
aBackground_color           db      'Background_color',0
aDecorations_color          db      'Decorations_color',0
aSnake_color                db      'Snake_color',0
aSnake_head_color           db      'Snake_head_color',0
aLives_in_head_number_color db      'Lives_in_head_number_color',0
aSnake_picture_color        db      'Snake_picture_color',0
aVersion_picture_color      db      'Version_picture_color',0
aPause_picture_color        db      'Pause_picture_color',0
aGame_over_picture_color    db      'Game_over_picture_color',0
aYou_win_picture_color      db      'You_win_picture_color',0
aEat_color                  db      'Eat_color',0
aNavigation_strings_color   db      'Navigation_string_color',0
aGame_over_strings_color    db      'Game_over_string_color',0
aScore_string_color         db      'Score_string_color',0
aHiscore_string_color       db      'Hiscore_string_color',0
aChampion_string_color      db      'Champion_string_color',0
aGame_over_hiscore_color    db      'Game_over_hiscore_color',0
aScore_number_color         db      'Score_number_color',0
aHiscore_number_color       db      'Hiscore_number_color',0
aChampion_name_color        db      'Champion_name_color',0
aEdit_box_selection_color   db      'Edit_box_selection_color',0
aButton_color               db      'Button_color',0
aButton_text_color          db      'Button_text_color',0
aStone_color                db      'Stone_color',0
aSplash_background_color    db      'Splash_background_color',0
aSplash_level_string_color  db      'Splash_level_string_color',0
aSplash_level_number_color  db      'Splash_level_number_color',0
aLevel_string_color         db      'Level_string_color',0
aLevel_number_color         db      'Level_number_color',0

aReserved                   db      'Reserved',0
aSquare_side_length         db      'Square_side_length',0
aHiscore_classic            db      'Hiscore_classic',0
aChampion_name_classic      db      'Champion_name_classic',0
aHiscore_levels             db      'Hiscore_levels',0
aChampion_name_levels       db      'Champion_name_levels',0

edit1 edit_box 65,397,0x0,0x000000,0x000000,0x000000,0x000000,0x80000000,15,hed,mouse_dd,ed_focus,hed_end-hed-1,hed_end-hed-1

hed                         db      '',0
;;---Variables-------------------------------------------------------------------------------------------------------------
i_end:
hed_end:
rb  256
mouse_dd                    rd      1

window_style                rd      1

cur_level                   rd      1
cur_level_number            rd      1
hi_level                    rd      1

score                       rd      1
hi_score_classic            rd      1
hi_score_levels             rd      1

champion_name_classic       rb      CHAMPION_NAME_LENGTH
champion_name_levels        rb      CHAMPION_NAME_LENGTH

snake_dots                  rb      GRID_WIDTH*GRID_HEIGHT*2+3          ; +3 bytes for faster dword copying
snake_direction             rd      1
snake_direction_next        rd      1
snake_length_x2             rd      1

decorations                 rd      1
number_of_free_dots         rd      1

eat                         rw      1

g_s                         rd      1
g_e                         rd      1

window_width                rd      1
window_height               rd      1
wp_x                        rd      1
wp_y                        rd      1

gw_mul_gs                   rd      1
gh_mul_gs                   rd      1
gbxm1_plus_gw_mul_gs        rd      1
gbym1_plus_gh_mul_gs        rd      1
gs_shl16_gs                 rd      1
gbxm1_shl16_gbxm1           rd      1
gbym1_shl16_gbym1           rd      1

bottom_top_strings          rd      1
bottom_middle_strings       rd      1
bottom_bottom_strings       rd      1
top_strings                 rd      1

button_x_left               rd      1
button_x_right              rd      1
button_y_top                rd      1
button_y_middle             rd      1
button_y_bottom             rd      1
button_width_short          rd      1
button_width_long           rd      1
button_height               rd      1

cursor_data                 rb      32*32*4
cursor_handle               rd      1

cur_dir_path                rb      4096
@PARAMS                     rb      4096

field_map                   rb      GRID_WIDTH*GRID_HEIGHT*2

proc_info                   process_information

smart_reverse               rd      1
show_lives_style            rd      1
draw_level_name_in_window_title rd  1
separating_symbol           rd      1

shortcut_move_left          rb      1
shortcut_move_down          rb      1
shortcut_move_up            rb      1
shortcut_move_right         rb      1
shortcut_reverse            rb      1
shortcut_increase           rb      1
shortcut_decrease           rb      1

square_side_length          rd      1

gbxm1                       rd      1
gbym1                       rd      1
speed_up_counter            rw      1

rb 4096
stacktop:
d_end: