Subversion Repositories Kolibri OS

Rev

Rev 1522 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;;===Level_mode================================================================================================================
  2.  
  3. Level_begin:
  4.  
  5.     mov  [score],   0
  6.     mov  [action],  0
  7.     mov  [number_of_free_dots], GRID_WIDTH*GRID_HEIGHT-3
  8.  
  9.       invoke  ini.get_str, cur_dir_path, aScore, aChampion_name, champion_name, 15, champion_name
  10.       invoke  ini.get_int, cur_dir_path, aScore, aHiscore, 0
  11.      
  12.     test eax, eax
  13.      jz  @f
  14.     mov  dword  [hi_score],    eax
  15.   @@:
  16.  
  17.     mov  esi, start_map
  18.     mov  edi, field_map
  19.     mov  ecx, GRID_WIDTH*GRID_HEIGHT/4
  20.     rep  movsd
  21.  
  22. Level_body:
  23.     ;;===Level_body========================================================================================================
  24.  
  25. mcall     26, 9
  26.     mov  [time_before_waiting], eax
  27.     mov  eax, [time_wait_limit]
  28.     mov  [time_to_wait],    eax
  29.  
  30.   Redraw:
  31.       mcall     12,1
  32.       mcall     0,200*65536+WINDOW_WIDTH,326*65536+WINDOW_HEIGHT,[window_style], ,window_title
  33.    
  34.       call      Draw_decorations
  35.       call      Draw_snake
  36.       call      Draw_eat
  37.       call      Draw_level_strings
  38.  
  39.       mcall     12,2
  40.    
  41.   Waiting:
  42.       mcall     26, 9
  43.     push eax
  44.     sub  eax, [time_before_waiting]
  45.     pop  [time_before_waiting]
  46.     cmp  [time_to_wait],    eax
  47.      jg  @f
  48.     cmp  [action],  0
  49.      jne Game_step
  50.   @@:
  51.     sub  [time_to_wait],    eax
  52.       mcall     23, [time_to_wait]              ;
  53.  
  54.     test al,  al
  55.      jnz  @f
  56.     cmp  [action],  0
  57.      jne Game_step
  58.       mcall     26, 9
  59.     mov  [time_before_waiting], eax
  60.     mov  eax, [time_wait_limit]
  61.     mov  [time_to_wait],    eax
  62.      jmp Waiting
  63.   @@:
  64.  
  65.       Message:                                  ; ok, what an event?
  66.         dec  al                                 ; has the window been moved or resized?
  67.          jz  Redraw                             ;
  68.         dec  al                                 ; was a key pressed?
  69.          jz  Key                                ;
  70.         dec  al                                 ; was a button pressed?
  71.          jz  Button                             ;
  72.  
  73.  
  74.   Key:
  75.       mcall     2                               ; get keycode
  76.    
  77.     cmp  ah,  0x1B                              ; Escape
  78.      je  First_menu
  79.     cmp  ah,  0x20                              ; Space
  80.      je  Pause_mode
  81.     cmp  ah,  0xB0                              ; Left
  82.      je  .left
  83.     cmp  ah,  0xB1                              ; Down
  84.      je  .down
  85.     cmp  ah,  0xB2                              ; Up
  86.      je  .up
  87.     cmp  ah,  0xB3                              ; Right
  88.      je  .right
  89.    
  90.      jmp Waiting                                ; jump to wait for another event
  91.        
  92.        
  93.   .left:
  94.     cmp  [action],  0
  95.      jne @f
  96.     mov  [time_to_wait],    0
  97.   @@:
  98.     mov  [action],  1
  99.     mov  [snake_napravlenie_next],  0
  100.      jmp Waiting
  101.            
  102.   .down:
  103.     cmp  [action],  0
  104.      jne @f
  105.     mov  [time_to_wait],    0
  106.   @@:
  107.     mov  [action],  1
  108.     mov  [snake_napravlenie_next],  1
  109.      jmp Waiting
  110.            
  111.   .up:
  112.     cmp  [action],  0
  113.      jne @f
  114.     mov  [time_to_wait],    0
  115.   @@:
  116.     mov  [action],  1        
  117.     mov  [snake_napravlenie_next],  2
  118.      jmp Waiting
  119.            
  120.   .right:
  121.     cmp  [action],  0
  122.      jne @f
  123.     mov  [time_to_wait],    0
  124.   @@:
  125.     mov  [action],  1          
  126.     mov  [snake_napravlenie_next],  3
  127.      jmp Waiting
  128.            
  129.  
  130.   Button:                                       ; процедура обрабоки кнопок в программе
  131.       mcall     17                              ; функция 17: получить номер нажатой кнопки
  132.  
  133.     shr  eax, 8                                 ; сдвигаем регистр eax на 8 бит вправо, чтобы получить номер нажатой кнопки
  134.     cmp  eax, 1
  135.      je  Exit                                   ; если это не кнопка 1 (зарезервирована системой как кнопка закрытия программы), пропускаем 2 следующие строчки кода
  136.  
  137.      jmp Waiting
  138.        
  139.        
  140.   Game_step:
  141.  
  142.     cmp  [snake_napravlenie],   LEFT            ; are we moving to left?
  143.      jz  .left
  144.     cmp  [snake_napravlenie],   DOWN            ; ... down?
  145.      jz  .down
  146.     cmp  [snake_napravlenie],   UP              ; ... up?
  147.      jz  .up
  148.      jmp .right                                 ; then right
  149.      
  150.   .left:
  151.     cmp  [snake_napravlenie_next],  RIGHT       ; next step is to right?
  152.      jz  .with_rewerse
  153.      jmp .without_rewerse
  154.  
  155.   .down:
  156.     cmp  [snake_napravlenie_next],  UP          ; next step is to up?
  157.      jz  .with_rewerse
  158.      jmp .without_rewerse
  159.      
  160.   .up:
  161.     cmp  [snake_napravlenie_next],  DOWN        ; next step is to bottom?
  162.      jz  .with_rewerse
  163.      jmp .without_rewerse
  164.  
  165.   .right:
  166.     cmp  [snake_napravlenie_next],  LEFT        ; next step is to left?
  167.      jz  .with_rewerse
  168.      jmp .without_rewerse
  169.  
  170.  
  171.   .with_rewerse:
  172.       call      Set_reverse_napravlenie
  173.       call      Reverse
  174.        
  175.   .without_rewerse:
  176. ;    mov  [time_to_wait],   0
  177.     mov  edx, snake_dots-2
  178.     add  edx, [snake_length_x2]
  179.        
  180.     cmp  [snake_napravlenie_next],  LEFT
  181.      je  .to_left
  182.     cmp  [snake_napravlenie_next],  DOWN
  183.      je  .to_down
  184.     cmp  [snake_napravlenie_next],  UP
  185.      je  .to_up
  186.     cmp  [snake_napravlenie_next],  RIGHT
  187.      je  .to_right    
  188.        
  189.       .to_left:
  190.         mov  [snake_napravlenie],   LEFT
  191.         mov  ax,  [edx]
  192.         dec  al
  193.         cmp  al,  -1
  194.          jne @f
  195.         mov  al,  GRID_WIDTH-1
  196.       @@:
  197.          jmp Snake_move
  198.  
  199.       .to_down:
  200.         mov  [snake_napravlenie],   DOWN
  201.         mov  ax,  [edx]
  202.         inc  ah
  203.         cmp  ah,  GRID_HEIGHT
  204.          jne @f
  205.         mov  ah,  0
  206.       @@:
  207.          jmp Snake_move
  208.        
  209.       .to_up:
  210.         mov  [snake_napravlenie],   UP
  211.         mov  ax,  [edx]
  212.         dec  ah
  213.         cmp  ah,  -1
  214.          jne @f
  215.         mov  ah,  GRID_HEIGHT-1
  216.       @@:
  217.          jmp Snake_move
  218.        
  219.       .to_right:
  220.         mov  [snake_napravlenie],   RIGHT
  221.         mov  ax,  [edx]
  222.         inc  al
  223.         cmp  al,  GRID_WIDTH
  224.          jne @f
  225.         mov  al,  0
  226.       @@:
  227.          jmp Snake_move
  228.  
  229.     ;;---Level_body--------------------------------------------------------------------------------------------------------
  230.  
  231. ;;---Level_mode----------------------------------------------------------------------------------------------------------------
  232.  
  233.  
  234. ;;===Some_functions============================================================================================================
  235.  
  236. Draw_snake:
  237.     ;;===Draw_snake========================================================================================================
  238.    
  239.       call      Draw_head_prehead
  240.     mov  edx, [snake_color]
  241.     mov  esi, snake_dots-6
  242.     add  esi, [snake_length_x2]
  243.  
  244.   @@:
  245.     mov  bx,  [esi]
  246.     sub  esi, 2
  247.       call      Draw_square
  248.     cmp  esi, snake_dots-2
  249.      jne @b
  250.  
  251.     ret
  252.        
  253.     ;;---Draw_snake--------------------------------------------------------------------------------------------------------
  254.  
  255.  
  256. Draw_head_prehead:
  257.     ;;===Draw_head_prehead=================================================================================================
  258.  
  259.     mov  edx, [snake_head_color]
  260.     mov  esi, snake_dots-2
  261.     add  esi, [snake_length_x2]
  262.     mov  bx,  [esi]
  263.       call      Draw_square
  264.     sub  esi, 2
  265.     mov  bx,  [esi]
  266.     mov  edx, [snake_color]
  267.       call      Draw_square
  268.  
  269.     ret
  270.  
  271.     ;;---Draw_head_prehead-------------------------------------------------------------------------------------------------
  272.  
  273.  
  274. Draw_level_strings:
  275.     ;;===Draw_level_strings================================================================================================
  276.  
  277.     call    Draw_menu_esc
  278.     call    Draw_score_string
  279.     call    Draw_score_number                   ; Draw score (number)
  280.     call    Draw_hiscore_string
  281.     call    Draw_hiscore_number
  282.     call    Draw_champion_string
  283.     call    Draw_champion_name
  284.  
  285.       mcall     4,225*65536+BOTTOM_MIDDLE_STRINGS,[navigation_strings_color],string_pause_space ; Draw 'PAUSE - SPACE' string
  286.        
  287.     ret
  288.  
  289.     ;;---Draw_level_strings------------------------------------------------------------------------------------------------
  290.    
  291.    
  292. Reverse:
  293.     ;;===Reverse===========================================================================================================
  294.  
  295.     mov  ecx, [snake_length_x2]
  296.     shr  ecx, 2
  297.     mov  esi, snake_dots
  298.     mov  edi, snake_dots-2
  299.     add  edi, [snake_length_x2]
  300.  
  301.   @@:
  302.  
  303.     mov  ax,  [edi]
  304.     xchg ax,  [esi]
  305.     mov  [edi], ax
  306.  
  307.     dec  cx
  308.     add  esi, 2
  309.     sub  edi, 2
  310.  
  311.     test  cx, cx
  312.      jnz @b
  313.  
  314.     ret
  315.  
  316.     ;;---Reverse-----------------------------------------------------------------------------------------------------------
  317.        
  318.        
  319. Draw_eat:
  320.     ;;===Draw_eat==========================================================================================================
  321.        
  322.     mov  bx,  word[eat]
  323.     mov  edx, [eat_color]
  324.        
  325.     call    Draw_square
  326.        
  327.     ret
  328.        
  329.     ;;---Draw_eat----------------------------------------------------------------------------------------------------------
  330.  
  331.  
  332. Get_eat:
  333.     ;;===Get_eat===========================================================================================================
  334.     ;;  in  :
  335.     ;;
  336.     ;;  out :
  337.     ;;          ax  =   coord's of the eat square (al=x, ah=y)
  338.     ;;
  339.    
  340.       mcall     26,9
  341. ;    xor  eax, esp
  342.     shl  eax, 1
  343.     xor  edx, edx
  344.     div  word[number_of_free_dots]
  345.     mov  ebx, field_map
  346.  
  347.   .loop:
  348.     cmp  byte[ebx], 0
  349.      jne @f
  350.     test dx,  dx
  351.      jz  .place_found
  352.     dec  dx
  353.   @@:
  354.     inc  ebx
  355.      jmp .loop
  356.      
  357.   .place_found:
  358.     sub  ebx, field_map
  359.     mov  eax, ebx
  360.     mov  bl,  GRID_WIDTH
  361.     div  bl
  362.     xchg al,  ah
  363.    
  364.     mov  word[eat], ax
  365.  
  366.     ret
  367.  
  368.     ;;---Get_eat-----------------------------------------------------------------------------------------------------------
  369.  
  370.  
  371. Sdvig:
  372.     ;;===Sdvig=============================================================================================================
  373.  
  374.     mov  esi, snake_dots+2
  375.     mov  edi, snake_dots
  376.     mov  ecx, [snake_length_x2]
  377.     shr  ecx, 1
  378.    
  379.     cld
  380.     rep  movsw
  381.  
  382.     ret
  383.  
  384.     ;;---Sdvig-------------------------------------------------------------------------------------------------------------
  385.  
  386.  
  387. Set_reverse_napravlenie:
  388.     ;;===Set_reverse_napravlenie===========================================================================================
  389.  
  390.     mov  eax, snake_dots
  391.     mov  ebx, snake_dots+2
  392.  
  393.     mov  cl,  [eax]                             ; The last dot x_coord
  394.     mov  dl,  [ebx]                             ; The pre_last dot x_coord
  395.  
  396.     cmp  cl,  dl
  397.      je  .X_ravny
  398.    
  399.     cmp  cl,  0
  400.      jne .skip2
  401.    
  402.     cmp  dl,  23
  403.      jne .Normal_y_ravny
  404.     mov  [snake_napravlenie_next],  3
  405.     ret
  406.        
  407.   .skip2:
  408.     cmp  cl,  23
  409.      jne .Normal_y_ravny
  410.     cmp  dl,  0
  411.      jne .Normal_y_ravny
  412.     mov  [snake_napravlenie_next],  0
  413.     ret
  414.    
  415.   .Normal_y_ravny:
  416.  
  417.     cmp  cl,  dl
  418.      jg  .Napravlenie_to_right
  419.     mov  [snake_napravlenie_next],  0
  420.     ret
  421.  
  422.   .Napravlenie_to_right:
  423.     mov  [snake_napravlenie_next],  3
  424.     ret
  425.  
  426.   .X_ravny:
  427.     inc  eax
  428.     inc  ebx
  429.     mov  cl,  [eax]
  430.     mov  dl,  [ebx]
  431.    
  432.     cmp  cl,  0
  433.      jne .skip3
  434.    
  435.     cmp  dl,  10
  436.      jne .Normal_x_ravny
  437.     mov  [snake_napravlenie_next],  1
  438.     ret
  439.        
  440.   .skip3:
  441.     cmp  cl,  10
  442.      jne .Normal_x_ravny
  443.     cmp  dl,  0
  444.      jne .Normal_x_ravny
  445.     mov  [snake_napravlenie_next],  2
  446.     ret
  447.    
  448.   .Normal_x_ravny:
  449.  
  450.     cmp  cl,  dl                                ; !!!
  451.      jg  .Napravlenie_to_down                   ; 0 1 2 ...
  452.     mov  [snake_napravlenie_next],  2           ; 1
  453.     ret                                         ; 2
  454.                                                 ; .
  455.   .Napravlenie_to_down:                         ; .
  456.     mov  [snake_napravlenie_next],  1           ; .
  457.  
  458.     ret
  459.  
  460.     ;;---Set_reverse_napravlenie-------------------------------------------------------------------------------------------
  461.    
  462.    
  463. Snake_move:
  464.     ;;===Snake_move========================================================================================================
  465.     ;;  in  :
  466.     ;;           ax =   coord's of new head
  467.     ;;          edx =   snake_dots+[snake_length_x2]-2 (snake head)
  468.     ;;
  469.  
  470.     add  edx, 2
  471.     mov  [edx], ax
  472.     cmp  ax,  word[eat]
  473.      jne .eat_and_new_head_are_different
  474.  
  475.     add  [snake_length_x2], 2
  476.     add  [score],   SCORE_EAT
  477.     dec  word[number_of_free_dots]
  478.     cmp  word[number_of_free_dots], 0
  479.      je  Game_over
  480.     mov  ax,  word[eat]
  481.     mov  cl,  1
  482.       call      Draw_on_map
  483.       call      Draw_head_prehead
  484.       call      Get_eat
  485.       call      Draw_eat
  486.  
  487.      jmp Keys_done
  488.  
  489.  
  490.   .eat_and_new_head_are_different:
  491.  
  492.     mov  ecx, snake_dots-4
  493.     add  ecx, [snake_length_x2]
  494.  
  495.       call      Get_from_map
  496.     test bl,  bl
  497.      jnz Game_over
  498.  
  499.     mov  cl,  1
  500.       call      Draw_on_map
  501.      
  502.     mov  bx,  word[snake_dots]
  503.     mov  edx, [background_color]
  504.       call      Draw_square
  505.  
  506.     mov  ax,  word[snake_dots]
  507.     mov  cl,  0
  508.       call      Draw_on_map
  509.       call      Sdvig
  510.      
  511.       call      Draw_head_prehead
  512.  
  513.  
  514.   Keys_done:
  515.  
  516.     cmp  [score],   0
  517.      je  @f
  518.     dec  [score]
  519.       call      Draw_score_number
  520.   @@:
  521.       mcall     26, 9
  522.     mov  [time_before_waiting], eax
  523.     mov  eax, [time_wait_limit]
  524.     mov  [time_to_wait],    eax
  525.      jmp Waiting
  526.  
  527.     ;;---Snake_move--------------------------------------------------------------------------------------------------------
  528.  
  529. ;;---Some_functions------------------------------------------------------------------------------------------------------------