252 lines
4.1 KiB
PHP
252 lines
4.1 KiB
PHP
; 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
|