kolibrios-gitea/programs/games/megamaze/trunk/wriggle.inc

252 lines
4.1 KiB
PHP
Raw Permalink Blame History

; level format
; [fx|fy]..[field cells x2]..[worm_count]..[worm_len][start cell #][body dirs x2]
; internal format
; [stepptr]= worms #
; area: [worm_len][start_cell #][end_cell #]..[dirs]..
; [cur_step]: dragged worm pointer
; [finish]: 0 - if head dragged, 1- if tail
WG_levelp:
mcall 40,100111b
inc [drag_flag]
call get_xy_sf
sub esi,2
call LP_levelp.bit2
cmp edx,4
jne .ok
dec esi
.ok:
movzx ecx,byte[esi]
mov [stepptr],ecx
inc esi
xor eax,eax
mov edi,area
.lp1:
push ecx
movzx ecx,byte[esi]
inc esi
mov [edi],cl
inc edi
lodsb
dec ecx
movzx ebx,al
stosb
push edi
inc edi
mov edx,8/2
lodsb
.lp:
rol al,2
push ecx
mov cl,al
and ecx,11b
add ebx,[dirs+ecx*4]
mov [edi],cl
pop ecx
inc edi
dec edx
test edx,edx
jnz .nxt
mov edx,8/2
lodsb
.nxt:
loop .lp
cmp edx,4
jne .ok2
dec esi
.ok2:
pop ecx
mov [ecx],bl
pop ecx
loop .lp1
mov esi,[stepptr]
ret
WG_key:
cmp eax,0
jl WG_mouse
ret
WG_drawm:
mov [win_flag],1
mov ecx,[cell_count]
; mov [sq_size],3
.lp:
push ecx
movzx ebx,byte[field+ecx-1]
and byte[field+ecx-1],11000000b
shr ebx,6
test ebx,ebx
jz .no
dec ebx
lea eax,[ecx-1]
call get_xy
add [lx],5-2 shl 16
add [ly],5-2 shl 16
mov edx,[f_colors+ebx*4]
mcall 13,[lx],[ly]
.no:
pop ecx
loop .lp
add [sq_size],3
mov ecx,[stepptr]
xor eax,eax
mov esi,area
push ebp
mov edi,w_colors
mov dword[player],1
.lp2:
push ecx
movzx ecx,byte[esi]
inc esi
xor eax,eax
lodsb
mov ebp,esi
.lp1:
inc esi
push ecx eax
call get_xy
mcall 13,[lx],[ly],[edi]
pop eax
mov ecx,[player]
mov bl,[field+eax]
shr bl,6
add [field+eax],cl
cmp bl,cl
je .match
and [win_flag],0
.match:
pop ecx
push esi edi
movzx ebx,byte[esi]
mov esi,eax
mov [ebp],al
add eax,[dirs+ebx*4]
cmp ecx,1
je .skip
mov edi,eax
call getline
call bold_line
.skip:
pop edi esi
loop .lp1
pop ecx
add edi,4
inc dword[player]
loop .lp2
pop ebp
sub [sq_size],3
ret
WG_mouse:
cmp [win_flag],1
je .ex
mov [jump],still
mov edx,eax
call get_last_mclick
cmp edx,-2
jne .no1st
test eax,eax
jz .ex
.noempty:
; First Click at ebx cell
; dpd ebx
mov [cur_step],0
mov dword[finish],0
mov esi,area
mov ecx,[stepptr]
.fndlp:
movzx edx,byte[esi]
cmp bl,[esi+1]
je .fnd
cmp bl,[esi+2]
jne .nxt
inc dword[finish]
.fnd:
mov [cur_step],esi
mov [jump],drw;red
jmp .ex
.nxt:
lea esi,[esi+edx+2]
loop .fndlp
jmp .ex
.no1st:
test eax,eax
jz .ex
; While dragging
mov esi,[cur_step]
test esi,esi
jz .ex
lea edi,[esi+1]
add edi,[finish]
movzx eax,byte[edi]
cmp eax,ebx
je .ex
push ebx
cmp dword[finish],0
jne .noswap
xchg eax,ebx
.noswap:
call get_offset
cmp ebx,1
pop ebx
jne .ex
cmp eax,-1
je .ex
test byte[field+ebx],11b
jnz .ex
movzx ecx,byte[esi]
cmp dword[finish],0
jne .tail
mov [esi+1],bl
mov [esi+2],al
add esi,ecx
std
lea edi,[esi+1]
rep movsb
jmp .redex
.tail:
mov [esi+2],bl
movzx ebx,byte[esi+3]
movzx edx,byte[esi+1]
add edx,[dirs+ebx*4]
mov [esi+1],dl
add esi,3
lea edi,[esi-1]
rep movsb
mov [edi-1],al
; ud2
.redex:
cld
mov [jump],drw;red
mov esi,area
.ex:
ret
WG_level:
file 'wriggle.bin'
if lang eq ru_RU
WG_help mstr \
'<27><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>',\
'墮<><E5A2AE>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>⪨',\
'᢮<><E1A2AE><EFBFBD><><E6A2A5>, <20><><EFBFBD><E2A0A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.',\
'<27><><EFBFBD><EFBFBD><20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EBA2A0> <20> <20><><EFBFBD><EFBFBD><EFBFBD><E1A5AA><EFBFBD> <20><><EFBFBD><EFBFBD>',\
'<27><>㣠.','',\
'http://www.clickmazes.com'
else
WG_help mstr \
'Your aim is to drag the wriggley worms by head or',\
'tail until each worm covers the squares of its',\
'own color leaving only white squares exposed.',\
'Worms cannot cross or overlap.','',\
'http://www.clickmazes.com'
end if