0,0 → 1,529 |
;;===Level_mode================================================================================================================ |
|
Level_begin: |
|
mov [score], 0 |
mov [action], 0 |
mov [number_of_free_dots], GRID_WIDTH*GRID_HEIGHT-3 |
|
invoke ini.get_str, cur_dir_path, aScore, aChampion_name, champion_name, 15, champion_name |
invoke ini.get_int, cur_dir_path, aScore, aHiscore, 0 |
|
test eax, eax |
jz @f |
mov dword [hi_score], eax |
@@: |
|
mov esi, start_map |
mov edi, field_map |
mov ecx, GRID_WIDTH*GRID_HEIGHT/4 |
rep movsd |
|
Level_body: |
;;===Level_body======================================================================================================== |
|
mcall 26, 9 |
mov [time_before_waiting], eax |
mov eax, [time_wait_limit] |
mov [time_to_wait], eax |
|
Redraw: |
mcall 12,1 |
mcall 0,200*65536+WINDOW_WIDTH,326*65536+WINDOW_HEIGHT,[window_style], ,window_title |
|
call Draw_decorations |
call Draw_snake |
call Draw_eat |
call Draw_level_strings |
|
mcall 12,2 |
|
Waiting: |
mcall 26, 9 |
push eax |
sub eax, [time_before_waiting] |
pop [time_before_waiting] |
cmp [time_to_wait], eax |
jg @f |
cmp [action], 0 |
jne Game_step |
@@: |
sub [time_to_wait], eax |
mcall 23, [time_to_wait] ; |
|
test al, al |
jnz @f |
cmp [action], 0 |
jne Game_step |
mcall 26, 9 |
mov [time_before_waiting], eax |
mov eax, [time_wait_limit] |
mov [time_to_wait], eax |
jmp Waiting |
@@: |
|
Message: ; ok, what an event? |
dec al ; has the window been moved or resized? |
jz Redraw ; |
dec al ; was a key pressed? |
jz Key ; |
dec al ; was a button pressed? |
jz Button ; |
|
|
Key: |
mcall 2 ; get keycode |
|
cmp ah, 0x1B ; Escape |
je First_menu |
cmp ah, 0x20 ; Space |
je Pause_mode |
cmp ah, 0xB0 ; Left |
je .left |
cmp ah, 0xB1 ; Down |
je .down |
cmp ah, 0xB2 ; Up |
je .up |
cmp ah, 0xB3 ; Right |
je .right |
|
jmp Waiting ; jump to wait for another event |
|
|
.left: |
cmp [action], 0 |
jne @f |
mov [time_to_wait], 0 |
@@: |
mov [action], 1 |
mov [snake_napravlenie_next], 0 |
jmp Waiting |
|
.down: |
cmp [action], 0 |
jne @f |
mov [time_to_wait], 0 |
@@: |
mov [action], 1 |
mov [snake_napravlenie_next], 1 |
jmp Waiting |
|
.up: |
cmp [action], 0 |
jne @f |
mov [time_to_wait], 0 |
@@: |
mov [action], 1 |
mov [snake_napravlenie_next], 2 |
jmp Waiting |
|
.right: |
cmp [action], 0 |
jne @f |
mov [time_to_wait], 0 |
@@: |
mov [action], 1 |
mov [snake_napravlenie_next], 3 |
jmp Waiting |
|
|
Button: ; ¯à®æ¥¤ãà ®¡à ¡®ª¨ ª®¯®ª ¢ ¯à®£à ¬¬¥ |
mcall 17 ; äãªæ¨ï 17: ¯®«ãç¨âì ®¬¥à ¦ ⮩ ª®¯ª¨ |
|
shr eax, 8 ; ᤢ¨£ ¥¬ ॣ¨áâà eax 8 ¡¨â ¢¯à ¢®, çâ®¡ë ¯®«ãç¨âì ®¬¥à ¦ ⮩ ª®¯ª¨ |
cmp eax, 1 |
je Exit ; ¥á«¨ íâ® ¥ ª®¯ª 1 (§ १¥à¢¨à®¢ á¨á⥬®© ª ª ª®¯ª § ªàëâ¨ï ¯à®£à ¬¬ë), ¯à®¯ã᪠¥¬ 2 á«¥¤ãî騥 áâà®çª¨ ª®¤ |
|
jmp Waiting |
|
|
Game_step: |
|
cmp [snake_napravlenie], LEFT ; are we moving to left? |
jz .left |
cmp [snake_napravlenie], DOWN ; ... down? |
jz .down |
cmp [snake_napravlenie], UP ; ... up? |
jz .up |
jmp .right ; then right |
|
.left: |
cmp [snake_napravlenie_next], RIGHT ; next step is to right? |
jz .with_rewerse |
jmp .without_rewerse |
|
.down: |
cmp [snake_napravlenie_next], UP ; next step is to up? |
jz .with_rewerse |
jmp .without_rewerse |
|
.up: |
cmp [snake_napravlenie_next], DOWN ; next step is to bottom? |
jz .with_rewerse |
jmp .without_rewerse |
|
.right: |
cmp [snake_napravlenie_next], LEFT ; next step is to left? |
jz .with_rewerse |
jmp .without_rewerse |
|
|
.with_rewerse: |
call Set_reverse_napravlenie |
call Reverse |
|
.without_rewerse: |
; mov [time_to_wait], 0 |
mov edx, snake_dots-2 |
add edx, [snake_length_x2] |
|
cmp [snake_napravlenie_next], LEFT |
je .to_left |
cmp [snake_napravlenie_next], DOWN |
je .to_down |
cmp [snake_napravlenie_next], UP |
je .to_up |
cmp [snake_napravlenie_next], RIGHT |
je .to_right |
|
.to_left: |
mov [snake_napravlenie], LEFT |
mov ax, [edx] |
dec al |
cmp al, -1 |
jne @f |
mov al, GRID_WIDTH-1 |
@@: |
jmp Snake_move |
|
.to_down: |
mov [snake_napravlenie], DOWN |
mov ax, [edx] |
inc ah |
cmp ah, GRID_HEIGHT |
jne @f |
mov ah, 0 |
@@: |
jmp Snake_move |
|
.to_up: |
mov [snake_napravlenie], UP |
mov ax, [edx] |
dec ah |
cmp ah, -1 |
jne @f |
mov ah, GRID_HEIGHT-1 |
@@: |
jmp Snake_move |
|
.to_right: |
mov [snake_napravlenie], RIGHT |
mov ax, [edx] |
inc al |
cmp al, GRID_WIDTH |
jne @f |
mov al, 0 |
@@: |
jmp Snake_move |
|
;;---Level_body-------------------------------------------------------------------------------------------------------- |
|
;;---Level_mode---------------------------------------------------------------------------------------------------------------- |
|
|
;;===Some_functions============================================================================================================ |
|
Draw_snake: |
;;===Draw_snake======================================================================================================== |
|
call Draw_head_prehead |
mov edx, [snake_color] |
mov esi, snake_dots-6 |
add esi, [snake_length_x2] |
|
@@: |
mov bx, [esi] |
sub esi, 2 |
call Draw_square |
cmp esi, snake_dots-2 |
jne @b |
|
ret |
|
;;---Draw_snake-------------------------------------------------------------------------------------------------------- |
|
|
Draw_head_prehead: |
;;===Draw_head_prehead================================================================================================= |
|
mov edx, [snake_head_color] |
mov esi, snake_dots-2 |
add esi, [snake_length_x2] |
mov bx, [esi] |
call Draw_square |
sub esi, 2 |
mov bx, [esi] |
mov edx, [snake_color] |
call Draw_square |
|
ret |
|
;;---Draw_head_prehead------------------------------------------------------------------------------------------------- |
|
|
Draw_level_strings: |
;;===Draw_level_strings================================================================================================ |
|
call Draw_menu_esc |
call Draw_score_string |
call Draw_score_number ; Draw score (number) |
call Draw_hiscore_string |
call Draw_hiscore_number |
call Draw_champion_string |
call Draw_champion_name |
|
mcall 4,225*65536+BOTTOM_MIDDLE_STRINGS,[navigation_strings_color],string_pause_space ; Draw 'PAUSE - SPACE' string |
|
ret |
|
;;---Draw_level_strings------------------------------------------------------------------------------------------------ |
|
|
Reverse: |
;;===Reverse=========================================================================================================== |
|
mov ecx, [snake_length_x2] |
shr ecx, 2 |
mov esi, snake_dots |
mov edi, snake_dots-2 |
add edi, [snake_length_x2] |
|
@@: |
|
mov ax, [edi] |
xchg ax, [esi] |
mov [edi], ax |
|
dec cx |
add esi, 2 |
sub edi, 2 |
|
test cx, cx |
jnz @b |
|
ret |
|
;;---Reverse----------------------------------------------------------------------------------------------------------- |
|
|
Draw_eat: |
;;===Draw_eat========================================================================================================== |
|
mov bx, word[eat] |
mov edx, [eat_color] |
|
call Draw_square |
|
ret |
|
;;---Draw_eat---------------------------------------------------------------------------------------------------------- |
|
|
Get_eat: |
;;===Get_eat=========================================================================================================== |
;; in : |
;; |
;; out : |
;; ax = coord's of the eat square (al=x, ah=y) |
;; |
|
mcall 26,9 |
; xor eax, esp |
shl eax, 1 |
xor edx, edx |
div word[number_of_free_dots] |
mov ebx, field_map |
|
.loop: |
cmp byte[ebx], 0 |
jne @f |
test dx, dx |
jz .place_found |
dec dx |
@@: |
inc ebx |
jmp .loop |
|
.place_found: |
sub ebx, field_map |
mov eax, ebx |
mov bl, GRID_WIDTH |
div bl |
xchg al, ah |
|
mov word[eat], ax |
|
ret |
|
;;---Get_eat----------------------------------------------------------------------------------------------------------- |
|
|
Sdvig: |
;;===Sdvig============================================================================================================= |
|
mov esi, snake_dots+2 |
mov edi, snake_dots |
mov ecx, [snake_length_x2] |
shr ecx, 1 |
|
cld |
rep movsw |
|
ret |
|
;;---Sdvig------------------------------------------------------------------------------------------------------------- |
|
|
Set_reverse_napravlenie: |
;;===Set_reverse_napravlenie=========================================================================================== |
|
mov eax, snake_dots |
mov ebx, snake_dots+2 |
|
mov cl, [eax] ; The last dot x_coord |
mov dl, [ebx] ; The pre_last dot x_coord |
|
cmp cl, dl |
je .X_ravny |
|
cmp cl, 0 |
jne .skip2 |
|
cmp dl, 23 |
jne .Normal_y_ravny |
mov [snake_napravlenie_next], 3 |
ret |
|
.skip2: |
cmp cl, 23 |
jne .Normal_y_ravny |
cmp dl, 0 |
jne .Normal_y_ravny |
mov [snake_napravlenie_next], 0 |
ret |
|
.Normal_y_ravny: |
|
cmp cl, dl |
jg .Napravlenie_to_right |
mov [snake_napravlenie_next], 0 |
ret |
|
.Napravlenie_to_right: |
mov [snake_napravlenie_next], 3 |
ret |
|
.X_ravny: |
inc eax |
inc ebx |
mov cl, [eax] |
mov dl, [ebx] |
|
cmp cl, 0 |
jne .skip3 |
|
cmp dl, 10 |
jne .Normal_x_ravny |
mov [snake_napravlenie_next], 1 |
ret |
|
.skip3: |
cmp cl, 10 |
jne .Normal_x_ravny |
cmp dl, 0 |
jne .Normal_x_ravny |
mov [snake_napravlenie_next], 2 |
ret |
|
.Normal_x_ravny: |
|
cmp cl, dl ; !!! |
jg .Napravlenie_to_down ; 0 1 2 ... |
mov [snake_napravlenie_next], 2 ; 1 |
ret ; 2 |
; . |
.Napravlenie_to_down: ; . |
mov [snake_napravlenie_next], 1 ; . |
|
ret |
|
;;---Set_reverse_napravlenie------------------------------------------------------------------------------------------- |
|
|
Snake_move: |
;;===Snake_move======================================================================================================== |
;; in : |
;; ax = coord's of new head |
;; edx = snake_dots+[snake_length_x2]-2 (snake head) |
;; |
|
add edx, 2 |
mov [edx], ax |
cmp ax, word[eat] |
jne .eat_and_new_head_are_different |
|
add [snake_length_x2], 2 |
add [score], SCORE_EAT |
dec word[number_of_free_dots] |
cmp word[number_of_free_dots], 0 |
je Game_over |
mov ax, word[eat] |
mov cl, 1 |
call Draw_on_map |
call Draw_head_prehead |
call Get_eat |
call Draw_eat |
|
jmp Keys_done |
|
|
.eat_and_new_head_are_different: |
|
mov ecx, snake_dots-4 |
add ecx, [snake_length_x2] |
|
call Get_from_map |
test bl, bl |
jnz Game_over |
|
mov cl, 1 |
call Draw_on_map |
|
mov bx, word[snake_dots] |
mov edx, [background_color] |
call Draw_square |
|
mov ax, word[snake_dots] |
mov cl, 0 |
call Draw_on_map |
call Sdvig |
|
call Draw_head_prehead |
|
|
Keys_done: |
|
cmp [score], 0 |
je @f |
dec [score] |
call Draw_score_number |
@@: |
mcall 26, 9 |
mov [time_before_waiting], eax |
mov eax, [time_wait_limit] |
mov [time_to_wait], eax |
jmp Waiting |
|
;;---Snake_move-------------------------------------------------------------------------------------------------------- |
|
;;---Some_functions------------------------------------------------------------------------------------------------------------ |