Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1806 | yogev_ezra | 1 | ; level format |
2 | ; [fx|fy]..[field cells x2]..[worm_count]..[worm_len][start cell #][body dirs x2] |
||
3 | |||
4 | ; internal format |
||
5 | ; [stepptr]= worms # |
||
6 | ; area: [worm_len][start_cell #][end_cell #]..[dirs].. |
||
7 | ; [cur_step]: dragged worm pointer |
||
8 | ; [finish]: 0 - if head dragged, 1- if tail |
||
9 | |||
10 | OR_levelp: |
||
11 | mov [Ces],40 |
||
12 | mcall 40,100111b |
||
13 | inc [drag_flag] |
||
14 | mov eax,OR_strip |
||
15 | call need_image |
||
16 | inc esi |
||
17 | movzx ecx,byte[esi] |
||
18 | inc esi |
||
19 | push esi |
||
20 | mov esi,OR_maze |
||
21 | jecxz .sk |
||
22 | .nxtmz: |
||
23 | movzx eax,byte[esi] |
||
24 | add esi,eax |
||
25 | loop .nxtmz |
||
26 | .sk: |
||
27 | call get_xy_sf |
||
28 | call unpack_level |
||
29 | pop esi |
||
30 | movzx ecx,byte[esi] |
||
31 | inc esi |
||
32 | mov [cur_step],ecx |
||
33 | jecxz .sk2 |
||
34 | mov edi,area |
||
35 | rep movsb |
||
36 | .sk2: |
||
37 | mov ecx,[cell_count] |
||
38 | mov edi,area+16 |
||
39 | rep movsb |
||
40 | mov [stepptr],2 |
||
41 | ; call erase_field |
||
42 | ; ud2 |
||
43 | ret |
||
44 | |||
45 | OR_key: |
||
46 | cmp eax,0 |
||
47 | jl OR_mouse |
||
48 | ret |
||
49 | |||
50 | OR_drawf: |
||
51 | mov ecx,[cell_count] |
||
52 | push [sq_size] |
||
53 | mov [sq_size],0 |
||
54 | .lp: |
||
55 | push ecx |
||
56 | movzx ebx,byte[area+16+ecx-1] |
||
57 | cmp bl,0xf |
||
58 | je .no |
||
59 | lea eax,[ecx-1] |
||
60 | call out_image |
||
61 | .no: |
||
62 | pop ecx |
||
63 | loop .lp |
||
64 | pop [sq_size] |
||
65 | ret |
||
66 | |||
67 | OR_drawm: |
||
68 | push [sq_size] |
||
69 | mov [sq_size],0 |
||
70 | mov eax,[player] |
||
71 | mov ebx,[stepptr] |
||
72 | add ebx,8 |
||
73 | call out_image |
||
74 | mov ecx,[cur_step] |
||
75 | jecxz .skipb |
||
76 | mov ebx,7 |
||
77 | mov esi,area |
||
78 | xor eax,eax |
||
79 | .nxtb: |
||
80 | lodsb |
||
81 | call out_image |
||
82 | loop .nxtb |
||
83 | .skipb: |
||
84 | mov eax,[player] |
||
85 | .again: |
||
86 | mov ebx,[stepptr] |
||
87 | call check_move |
||
88 | jc .ex |
||
89 | add eax,[dirs+ebx*4] |
||
90 | cmp byte[area+16+eax],6 |
||
91 | je .ex |
||
92 | mov ecx,[cur_step] |
||
93 | jecxz .skbchk |
||
94 | mov edi,area |
||
95 | repne scasb |
||
96 | je .again |
||
97 | .skbchk: |
||
98 | mov [sq_size],1 |
||
99 | push eax |
||
100 | call get_xy |
||
101 | mov ebx,[lx] |
||
102 | sub bx,2 |
||
103 | mov ecx,[ly] |
||
104 | mov cx,3 |
||
105 | mcall 13,,,0xFFC633 |
||
106 | xchg bx,cx |
||
107 | mcall |
||
108 | mov esi,[Ces] |
||
109 | sub esi,3+2 |
||
110 | shl esi,16 |
||
111 | push ebx |
||
112 | add ebx,esi |
||
113 | mcall |
||
114 | pop ebx |
||
115 | add ecx,esi |
||
116 | xchg bx,cx |
||
117 | add bx,2 |
||
118 | mcall |
||
119 | pop eax |
||
120 | jmp .again |
||
121 | .ex: |
||
122 | pop [sq_size] |
||
123 | ret |
||
124 | |||
125 | OR_mouse: |
||
126 | cmp [win_flag],1 |
||
127 | je .ex |
||
128 | mov [jump],still |
||
129 | mov edx,eax |
||
130 | call get_last_mclick |
||
131 | cmp edx,-2 |
||
132 | jne .ex |
||
133 | test eax,eax |
||
134 | jnz .noempty |
||
135 | .drw: |
||
136 | mov [jump],drw |
||
137 | ret |
||
138 | .noempty: |
||
139 | |||
140 | ; First Click at ebx cell |
||
141 | mov eax,[player] |
||
142 | cmp eax,ebx |
||
143 | je OR_drawf |
||
144 | mov ecx,[cur_step] |
||
145 | jecxz .skbchk |
||
146 | mov edi,area |
||
147 | xchg eax,ebx |
||
148 | repne scasb |
||
149 | xchg eax,ebx |
||
150 | je OR_drawf |
||
151 | .skbchk: |
||
152 | cmp byte[area+16+ebx],0xf |
||
153 | je .ex |
||
154 | cmp byte[area+16+ebx],6 |
||
155 | je .ex |
||
156 | push eax |
||
157 | mov edx,ebx |
||
158 | call get_offset |
||
159 | mov ebx,eax |
||
160 | pop eax |
||
161 | cmp ebx,[stepptr] |
||
162 | jne .ex |
||
163 | |||
164 | call check_move |
||
165 | jc .ex |
||
166 | movzx ecx,byte[area+16+edx] |
||
167 | cmp ecx,4 |
||
168 | jae .noarr |
||
169 | mov ebx,ecx |
||
170 | call check_move |
||
171 | jc .ex |
||
172 | mov edx,eax |
||
173 | add eax,[dirs+ebx*4] |
||
174 | mov [player],eax |
||
175 | mov ecx,[cur_step] |
||
176 | jecxz .skbchk2 |
||
177 | mov edi,area |
||
178 | repne scasb |
||
179 | jne .skbchk2 |
||
180 | mov [edi-1],dl |
||
181 | .skbchk2: |
||
182 | cmp eax,[finish] |
||
183 | jne .drw |
||
184 | mov [win_flag],1 |
||
185 | jmp .drw |
||
186 | .noarr: |
||
187 | mov edx,[stepptr] |
||
188 | cmp ecx,4 |
||
189 | jne .nocw |
||
190 | movzx edx,byte[dir_rotate+edx] |
||
191 | jmp .ex2 |
||
192 | .nocw: |
||
193 | cmp ecx,5 |
||
194 | jne .ex |
||
195 | movzx edx,byte[dir_rotate+4+edx] |
||
196 | .ex2: |
||
197 | mov [stepptr],edx |
||
198 | jmp .drw |
||
199 | .ex: |
||
200 | ret |
||
201 | |||
202 | OR_maze: |
||
203 | file 'omaze.bin' |
||
204 | |||
205 | OR_level: |
||
206 | file 'or2.bin' |
||
207 | |||
208 | if lang eq ru |
||
209 | OR_help mstr \ |
||
210 | 'Щелчок на выделенной клетке передвигает или',\ |
||
211 | 'вращает красную стрелку. Синий блок действует',\ |
||
212 | 'как препятствие, скрывая одну клетку. При',\ |
||
213 | 'переходе стрелки на клетку синего блока они',\ |
||
214 | 'поменяются местами. Задача - провести красную',\ |
||
215 | 'стрелку из нижней клетки в верхнюю.','',\ |
||
216 | 'http://www.clickmazes.com' |
||
217 | else |
||
218 | OR_help mstr \ |
||
219 | 'Click on a highlighted square to move or rotate',\ |
||
220 | 'the red pointer. The blue switcher acts as an',\ |
||
221 | 'obstacle, hiding one square. The red pointer and',\ |
||
222 | 'blue switcher will swap places if the red pointer',\ |
||
223 | 'is pushed onto a square occupied by a blue',\ |
||
224 | 'switcher. Your challenge is to negotiate the red',\ |
||
225 | 'arrow from the bottom to the top square.','',\ |
||
226 | 'http://www.clickmazes.com' |
||
227 | end if |