forked from KolibriOS/kolibrios
228 lines
4.2 KiB
PHP
228 lines
4.2 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
|
|||
|
|
|||
|
OR_levelp:
|
|||
|
mov [Ces],40
|
|||
|
mcall 40,100111b
|
|||
|
inc [drag_flag]
|
|||
|
mov eax,OR_strip
|
|||
|
call need_image
|
|||
|
inc esi
|
|||
|
movzx ecx,byte[esi]
|
|||
|
inc esi
|
|||
|
push esi
|
|||
|
mov esi,OR_maze
|
|||
|
jecxz .sk
|
|||
|
.nxtmz:
|
|||
|
movzx eax,byte[esi]
|
|||
|
add esi,eax
|
|||
|
loop .nxtmz
|
|||
|
.sk:
|
|||
|
call get_xy_sf
|
|||
|
call unpack_level
|
|||
|
pop esi
|
|||
|
movzx ecx,byte[esi]
|
|||
|
inc esi
|
|||
|
mov [cur_step],ecx
|
|||
|
jecxz .sk2
|
|||
|
mov edi,area
|
|||
|
rep movsb
|
|||
|
.sk2:
|
|||
|
mov ecx,[cell_count]
|
|||
|
mov edi,area+16
|
|||
|
rep movsb
|
|||
|
mov [stepptr],2
|
|||
|
; call erase_field
|
|||
|
; ud2
|
|||
|
ret
|
|||
|
|
|||
|
OR_key:
|
|||
|
cmp eax,0
|
|||
|
jl OR_mouse
|
|||
|
ret
|
|||
|
|
|||
|
OR_drawf:
|
|||
|
mov ecx,[cell_count]
|
|||
|
push [sq_size]
|
|||
|
mov [sq_size],0
|
|||
|
.lp:
|
|||
|
push ecx
|
|||
|
movzx ebx,byte[area+16+ecx-1]
|
|||
|
cmp bl,0xf
|
|||
|
je .no
|
|||
|
lea eax,[ecx-1]
|
|||
|
call out_image
|
|||
|
.no:
|
|||
|
pop ecx
|
|||
|
loop .lp
|
|||
|
pop [sq_size]
|
|||
|
ret
|
|||
|
|
|||
|
OR_drawm:
|
|||
|
push [sq_size]
|
|||
|
mov [sq_size],0
|
|||
|
mov eax,[player]
|
|||
|
mov ebx,[stepptr]
|
|||
|
add ebx,8
|
|||
|
call out_image
|
|||
|
mov ecx,[cur_step]
|
|||
|
jecxz .skipb
|
|||
|
mov ebx,7
|
|||
|
mov esi,area
|
|||
|
xor eax,eax
|
|||
|
.nxtb:
|
|||
|
lodsb
|
|||
|
call out_image
|
|||
|
loop .nxtb
|
|||
|
.skipb:
|
|||
|
mov eax,[player]
|
|||
|
.again:
|
|||
|
mov ebx,[stepptr]
|
|||
|
call check_move
|
|||
|
jc .ex
|
|||
|
add eax,[dirs+ebx*4]
|
|||
|
cmp byte[area+16+eax],6
|
|||
|
je .ex
|
|||
|
mov ecx,[cur_step]
|
|||
|
jecxz .skbchk
|
|||
|
mov edi,area
|
|||
|
repne scasb
|
|||
|
je .again
|
|||
|
.skbchk:
|
|||
|
mov [sq_size],1
|
|||
|
push eax
|
|||
|
call get_xy
|
|||
|
mov ebx,[lx]
|
|||
|
sub bx,2
|
|||
|
mov ecx,[ly]
|
|||
|
mov cx,3
|
|||
|
mcall 13,,,0xFFC633
|
|||
|
xchg bx,cx
|
|||
|
mcall
|
|||
|
mov esi,[Ces]
|
|||
|
sub esi,3+2
|
|||
|
shl esi,16
|
|||
|
push ebx
|
|||
|
add ebx,esi
|
|||
|
mcall
|
|||
|
pop ebx
|
|||
|
add ecx,esi
|
|||
|
xchg bx,cx
|
|||
|
add bx,2
|
|||
|
mcall
|
|||
|
pop eax
|
|||
|
jmp .again
|
|||
|
.ex:
|
|||
|
pop [sq_size]
|
|||
|
ret
|
|||
|
|
|||
|
OR_mouse:
|
|||
|
cmp [win_flag],1
|
|||
|
je .ex
|
|||
|
mov [jump],still
|
|||
|
mov edx,eax
|
|||
|
call get_last_mclick
|
|||
|
cmp edx,-2
|
|||
|
jne .ex
|
|||
|
test eax,eax
|
|||
|
jnz .noempty
|
|||
|
.drw:
|
|||
|
mov [jump],drw
|
|||
|
ret
|
|||
|
.noempty:
|
|||
|
|
|||
|
; First Click at ebx cell
|
|||
|
mov eax,[player]
|
|||
|
cmp eax,ebx
|
|||
|
je OR_drawf
|
|||
|
mov ecx,[cur_step]
|
|||
|
jecxz .skbchk
|
|||
|
mov edi,area
|
|||
|
xchg eax,ebx
|
|||
|
repne scasb
|
|||
|
xchg eax,ebx
|
|||
|
je OR_drawf
|
|||
|
.skbchk:
|
|||
|
cmp byte[area+16+ebx],0xf
|
|||
|
je .ex
|
|||
|
cmp byte[area+16+ebx],6
|
|||
|
je .ex
|
|||
|
push eax
|
|||
|
mov edx,ebx
|
|||
|
call get_offset
|
|||
|
mov ebx,eax
|
|||
|
pop eax
|
|||
|
cmp ebx,[stepptr]
|
|||
|
jne .ex
|
|||
|
|
|||
|
call check_move
|
|||
|
jc .ex
|
|||
|
movzx ecx,byte[area+16+edx]
|
|||
|
cmp ecx,4
|
|||
|
jae .noarr
|
|||
|
mov ebx,ecx
|
|||
|
call check_move
|
|||
|
jc .ex
|
|||
|
mov edx,eax
|
|||
|
add eax,[dirs+ebx*4]
|
|||
|
mov [player],eax
|
|||
|
mov ecx,[cur_step]
|
|||
|
jecxz .skbchk2
|
|||
|
mov edi,area
|
|||
|
repne scasb
|
|||
|
jne .skbchk2
|
|||
|
mov [edi-1],dl
|
|||
|
.skbchk2:
|
|||
|
cmp eax,[finish]
|
|||
|
jne .drw
|
|||
|
mov [win_flag],1
|
|||
|
jmp .drw
|
|||
|
.noarr:
|
|||
|
mov edx,[stepptr]
|
|||
|
cmp ecx,4
|
|||
|
jne .nocw
|
|||
|
movzx edx,byte[dir_rotate+edx]
|
|||
|
jmp .ex2
|
|||
|
.nocw:
|
|||
|
cmp ecx,5
|
|||
|
jne .ex
|
|||
|
movzx edx,byte[dir_rotate+4+edx]
|
|||
|
.ex2:
|
|||
|
mov [stepptr],edx
|
|||
|
jmp .drw
|
|||
|
.ex:
|
|||
|
ret
|
|||
|
|
|||
|
OR_maze:
|
|||
|
file 'omaze.bin'
|
|||
|
|
|||
|
OR_level:
|
|||
|
file 'or2.bin'
|
|||
|
|
|||
|
if lang eq ru
|
|||
|
OR_help mstr \
|
|||
|
'<27><><EFBFBD>箪 <20><> <20>뤥<EFBFBD><EBA4A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>⪥ <20><>।<EFBFBD><E0A5A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>',\
|
|||
|
'<27><><EFBFBD>頥<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>५<EFBFBD><E0A5AB>. <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',\
|
|||
|
'<27><><EFBFBD> <20>९<EFBFBD><E0A5AF><EFBFBD>⢨<EFBFBD>, <20><><EFBFBD>뢠<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD>',\
|
|||
|
'<27><><EFBFBD><EFBFBD>室<EFBFBD> <20><>५<EFBFBD><E0A5AB> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ᨭ<><E1A8AD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>',\
|
|||
|
'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>⠬<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><EFBFBD><E0AEA2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',\
|
|||
|
'<27><>५<EFBFBD><E0A5AB> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>⪨ <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.','',\
|
|||
|
'http://www.clickmazes.com'
|
|||
|
else
|
|||
|
OR_help mstr \
|
|||
|
'Click on a highlighted square to move or rotate',\
|
|||
|
'the red pointer. The blue switcher acts as an',\
|
|||
|
'obstacle, hiding one square. The red pointer and',\
|
|||
|
'blue switcher will swap places if the red pointer',\
|
|||
|
'is pushed onto a square occupied by a blue',\
|
|||
|
'switcher. Your challenge is to negotiate the red',\
|
|||
|
'arrow from the bottom to the top square.','',\
|
|||
|
'http://www.clickmazes.com'
|
|||
|
end if
|