kolibrios/programs/games/megamaze/trunk/blackbox.inc

301 lines
6.8 KiB
PHP
Raw Normal View History

RAY_NUM equ 100000b
RAY_ABS equ 1000000b
RAY_REF equ 10000000b
BBSIZE equ 10
ATOM_COUNT equ BBSIZE/2
CELL_EMPTY_CENTER equ 10100000b
CELL_ABSORBED equ 10000000b
CELL_REFLECTED equ 01000000b
CELL_EMPTY_EDGE equ 11000000b
CELL_FULL_EDGE equ 00100000b
MASK_ATOM equ 00000001b
MASK_GUESS equ 00000010b
MASK_ALL equ 11100000b
MASK_DIR equ 00000011b
BB_levelp:
mcall 40,100111b
mov byte[fx],BBSIZE
mov byte[fy],BBSIZE
and [cur_step],0
and [pause_time],0
call get_xy_sf.count
call erase_field
mov edi,field+1
mov ecx,BBSIZE-2
mov eax,CELL_EMPTY_EDGE+1
rep stosb
mov eax,CELL_EMPTY_CENTER
mov ecx,BBSIZE-2
.lp:
push ecx
mov word[edi],(CELL_EMPTY_EDGE+3) shl 8+CELL_EMPTY_EDGE
add edi,2
mov ecx,BBSIZE-2
rep stosb
pop ecx
loop .lp
mov word[edi],(CELL_EMPTY_EDGE+3) shl 8+CELL_EMPTY_EDGE
add edi,2
mov eax,CELL_EMPTY_EDGE+2
mov ecx,BBSIZE-2
rep stosb
mov ecx,BBSIZE/2
mov ebx,BBSIZE*BBSIZE
.again:
call get_rnd
xor edx,edx
div ebx
cmp byte[field+edx],CELL_EMPTY_CENTER
jne .again
or byte[field+edx],MASK_ATOM
loop .again
mov [win_flag],5
ret
BB_key:
cmp eax,-1
je BB_mouse
cmp eax,9
jne .ex
xor edx,edx
xor edi,edi
mov esi,field
mov ecx,BBSIZE*BBSIZE
.lp:
lodsb
mov ebx,eax
and eax,MASK_ALL;+MASK_ATOM
cmp eax,CELL_EMPTY_CENTER
jne .nxt
cmp ebx,CELL_EMPTY_CENTER+MASK_ATOM+MASK_GUESS
jne .nomatch
add dx,0x101
jmp .nxt
.nomatch:
test ebx,MASK_GUESS
jz .nxt
inc dh
.nxt:
loop .lp
cmp dh,ATOM_COUNT
je .chk
mov [win_flag],9
jmp .ex
.chk:
mov [win_flag],10
mov ebx,(BBSIZE-2)*4
mov ecx,ATOM_COUNT
sub cl,dl
imul ecx,ATOM_COUNT
sub ebx,ecx
sub ebx,[pause_time]
mov [score],ebx
.ex:
ret
BB_drawm:
mov eax,47
mov esi,0x100000ff
cmp [win_flag],5
jne .no5
mcall ,0x10000,ATOM_COUNT,<XFOFS+MSGXO,42>
.no5:
cmp [win_flag],10
jne .no10
mcall ,0x20000,[score],<XFOFS+MSGXO+12*8,42>
.no10:
cmp [win_flag],9
jne .no9
mcall ,0x10000,ATOM_COUNT,<XFOFS+MSGXO+11*8,42>
.no9:
mov ecx,[cell_count]
.lp:
push ecx
lea eax,[ecx-1]
movzx ebx,byte[field+eax]
call get_xy
mov eax,ebx
and eax,MASK_ALL
cmp eax,CELL_EMPTY_CENTER
jne .nocenter
test ebx,MASK_ATOM
jz .noatom
cmp [win_flag],10
jne .noatom
mov edx,0xff0000
push ebx
mcall 13,[lx],[ly]
pop ebx
.noatom:
test ebx,MASK_GUESS
jz .nxtlp
add [lx],2 shl 16-4
add [ly],2 shl 16-4
mov edx,0xffff00
.bar:
mcall 13,[lx],[ly]
.nxtlp:
pop ecx
loop .lp
.ex2:
ret
.nocenter:
mov edx,0xff
cmp eax,CELL_ABSORBED
je .bar
mov edx,0x8000
cmp eax,CELL_REFLECTED
je .bar
cmp eax,CELL_FULL_EDGE
jne .nxtlp
and ebx,11111b
mov ecx,ebx
push word[ly+2]
pop word[lx]
mov eax,[Ces]
shr eax,1
add word[lx],ax
add word[lx+2],ax
sub [lx],8 shl 16+6
mcall 47,0x20000,,[lx],0x10000000
jmp .nxtlp
corners db 0,BBSIZE-1,BBSIZE*BBSIZE-1,BBSIZE*(BBSIZE-1)
BB_mouse:
cmp [win_flag],1
je .ex
mov [jump],still
mov edx,eax
call get_last_mclick
mov eax,ebx
mov edi,corners
mov ecx,4
repne scasb
je .ex
movzx ebx,byte[field+eax]
mov ecx,ebx
and ecx,MASK_ALL
cmp ecx,CELL_EMPTY_CENTER
jne .nocenter
xor byte[field+eax],MASK_GUESS
mov [win_flag],11
jmp .red
.nocenter:
cmp ecx,CELL_EMPTY_EDGE
jne .ex
mov [player],eax
and ebx,MASK_DIR
.step:
mov [finish],eax
add eax,[dirs+ebx*4] ; 1 step
mov [stepptr],eax
movzx edx,byte[field+eax] ; cell ahead - edx
and edx,MASK_ALL+MASK_ATOM
cmp edx,CELL_EMPTY_CENTER+MASK_ATOM
jne .noabsorb
mov eax,[player]
mov byte[field+eax],CELL_ABSORBED
inc [pause_time]
mov [win_flag],7
jmp .red
.noabsorb:
lea ecx,[ebx-2]
and ecx,MASK_DIR
add eax,[dirs+ecx*4]
movzx edx,byte[field+eax] ; cell aside - edx
xor ecx,11b
and edx,MASK_ALL+MASK_ATOM
cmp edx,CELL_EMPTY_CENTER+MASK_ATOM
jne .noreflect1
.reflect:
mov eax,[finish]
cmp eax,[player]
je .endref
mov ebx,ecx ;new direction
jmp .nextstep
.noreflect1:
mov eax,[stepptr]
add eax,[dirs+ecx*4]
movzx edx,byte[field+eax] ; cell aside - edx
xor ecx,11b
and edx,MASK_ALL+MASK_ATOM
cmp edx,CELL_EMPTY_CENTER+MASK_ATOM
je .reflect
.noreflect2:
mov eax,[stepptr]
movzx edx,byte[field+eax]
and edx,MASK_ALL
cmp edx,CELL_EMPTY_CENTER
je .nextstep
cmp eax,[player]
je .endref
mov ebx,[cur_step]
add ebx,CELL_FULL_EDGE
mov byte[field+eax],bl
mov eax,[player]
mov byte[field+eax],bl
inc [cur_step]
mov [win_flag],6
add [pause_time],2
jmp .red
.endref:
mov eax,[player]
mov byte[field+eax],CELL_REFLECTED
mov [win_flag],8
inc [pause_time]
jmp .red
.nextstep:
jmp .step
.red:
mov [jump],drw
.ex:
ret
BB_level:
db 0
if lang eq ru
BB_help mstr \
'<27><><EFBFBD><EFBFBD><> <20><><EFBFBD><EFBFBD> <20> ⮬, <20><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3A6A8>',\
'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD><E2AEAC> <20> <20><><EFBFBD> <20><EFBFBD>, <20><><EFBFBD><EFBFBD>',\
'<27><><EFBFBD><EFBFBD><><E1A2A5> <20> <20><><EFBFBD><E0AEA1> <20> <20><><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> <20><><EFBFBD><EFBFBD>',\
'<27><><EFBFBD><EFA2AB><EFBFBD><EFBFBD><EFBFBD>. <20><20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>, <20><20><><EFBFBD>',\
'㯠<><E3AFA0><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><>, <20><><EFBFBD> <20><EFBFBD><E2AAAB><EFBFBD><EFBFBD> <20><><EFBFBD> <20><> 90',\
'<27><EFBFBD>ᮢ, <20><20><> <20><EFBFBD><E0AEA9><EFBFBD> <20><><><E1ACA5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>',\
'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>). <20><><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0AEA8><EFBFBD><EFBFBD><EFBFBD> 2 <20><EFBFBD><E2AAAB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><E3A6A4>',\
'<27><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><EFBFBD><E5AEA4><EFBFBD> <20><>窥,- <20><><EFBFBD> <20><><EFBFBD><EFBFBD><E2A0A5><EFBFBD>',\
'<27><><EFBFBD><E0A0A6><EFBFBD><EFBFBD><EFBFBD>. <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0AEA2><EFBFBD><EFBFBD><EFBFBD><> <20><><E3A7AD><EFBFBD>',\
'<27><><EFBFBD><EFBFBD>, <20><EFBFBD><E2ACA5><EFBFBD><EFBFBD> 5 <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 梥⮬ <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',\
'TAB. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E2AEAC> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>묨',\
'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2A8AA><EFBFBD>.',\
' <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>饭 - ᨭ<><E1A8AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;',\
' <20><><EFBFBD> <20><><EFBFBD><E0A0A6> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.',\
' <20><><EFBFBD><E1ABA0> <20>⬥祭<E2ACA5> <20><><20><EFBFBD> <20> <20><><EFBFBD> <20><>祩.','',\
'http://puzzleprograms.narod.ru'
else
BB_help mstr \
'Your goal is to discover the whereabouts of five',\
'atoms in a black box by sending rays of light',\
'into the box and observing if and where the rays',\
'emerge. An atom will either absorb a ray if the',\
'ray hits it head on, or deflect a ray through 90',\
'if it comes close (passes through an adjacent row',\
'or column). Two deflections can occur at the same',\
'time forcing a ray to return and emerge at its',\
'entry point, this is referred to as reflection.','',\
'The challenge is to pin point the location of all',\
'atoms using the least number of rays. If you wish',\
'to commit your solution and to discover your',\
'score you must have exactly five guesses marked,',\
'then press TAB. The five hidden atoms will appear',\
'as red squares.','',\
'http://puzzleprograms.narod.ru'
end if