; ; äãªæ¨ ¤«ï ᮧ¤ ¨ï ᨣ «®¢ ; ;color_s0 - ᨣ « 0 ;color_s1 - ᨣ « 1 ;color_s2 - â®çª ¡¥§ ¯¥à¥á¥ç¥¨ï ;color_s3 - ¢à¥¬¥®¥ § 票¥ ¤«ï á®åà ¥¨ï size_sign equ 10 sign_x equ 0 sign_y equ 4 sign_a equ 8 sign_z equ 9 sign_data dd 0 ;㪠§ â¥«ì ¬ áᨢ á® áâàãªâãà ¬¨ ᨣ «®¢ sign_count dd 0 ;⥪ãé. ª®«. ᨣ «®¢ sign_max dd 0 ;¬ ªá. ª®«. ᨣ «®¢ align 4 proc sign_init uses eax ecx, m_count:dword mov ecx,[m_count] mov [sign_max],ecx imul ecx,size_sign stdcall mem.Alloc, ecx mov [sign_data],eax call sign_clear ret endp ;®ç¨á⪠¢á¥å ᨣ «®¢ align 4 proc sign_clear uses eax ecx edi xor eax,eax mov dword[time],eax mov dword[sign_count],eax mov ecx,[sign_max] imul ecx,size_sign mov edi,[sign_data] cld rep stosb ret endp ;®ç¨á⪠®¤®£® ᨣ « align 4 proc sign_clear_one uses ecx edi esi, p_sign:dword mov ecx,size_sign mov esi,[sign_count] dec esi imul esi,ecx add esi,[sign_data] mov edi,[p_sign] cld rep movsb dec dword[sign_count] ret endp ;®á¢®¡®¦¤¥¨¥ ¯ ¬ï⨠§ ï⮩ ¬ áᨢ ¬¨ ¤«ï ᨣ «®¢ align 4 proc sign_delete stdcall mem.Free, dword[sign_data] ret endp ;äãªæ¨ï ¤«ï ¯¥à¥¬¥é¥¨ï ᨣ «®¢ align 4 proc sign_move pushad mov ecx,[sign_count] cmp ecx,1 jl .end_f mov esi,ecx dec esi imul esi,size_sign add esi,[sign_data] ;cld .cycle_beg: mov eax,[esi+sign_x] mov ebx,[esi+sign_y] movzx edi,byte[esi+sign_a] movzx edx,byte[esi+sign_z] cmp edx,0 je @f or edi,0x100 @@: ;¯ëâ ¥¬áï ᮧ¤ âì à §¢¥â¢«¥¨¥ ᨣ « stdcall move_rotate_n90, 0,-1,edi inc edi stdcall sign_creat,eax,ebx,edi stdcall move_rotate_n90, -2,0,edi add edi,2 stdcall sign_creat,eax,ebx,edi mov eax,[esi+sign_x] mov ebx,[esi+sign_y] inc edi mov eax,[esi+sign_x] mov ebx,[esi+sign_y] shl edx,2 add edx,shem_colors stdcall draw_signal_rect, eax,ebx, dword[edx] ;à¨á㥬 ᨣ « ¯®«¥ .move_1: stdcall move_rotate_x_n90, 1,edi mov edi,eax stdcall pole_cell_find, pole, edi,ebx cmp eax,0 jne @f stdcall sign_clear_one,esi ;㤠«¥¨¥ ᨣ « , ¥á«¨ ® § 襫 ¢ â㯨ª jmp .cycle_next @@: imul eax,sizeof.Cell add eax,dword[cell] movzx edx,byte[esi+sign_z] cmp byte[eax+offs_cell_liv],2 jne @f ;¥á«¨ á⮨⠯¥à¥á¥ç¥¨¥ ¯à®¢®¤®¢ mov eax,edi movzx edi,byte[esi+sign_a] jmp .move_1 @@: cmp byte[eax+offs_cell_liv],dl jne @f stdcall sign_clear_one,esi ;㤠«¥¨¥ ᨣ « , ¥á«¨ ® ¯®¯ « ®¡« áâì § ªà è¥ãî ¤ ë¬ æ¢¥â®¬ jmp .cycle_next @@: mov byte[eax+offs_cell_liv],dl ;áâ ¢¨¬ ¯®«¥ § ª ᨣ « mov [esi+sign_x],edi mov [esi+sign_y],ebx .cycle_next: sub esi,size_sign ;loop .cycle_beg dec ecx jnz .cycle_beg ;stdcall [buf2d_draw], buf_0 .end_f: popad ret endp align 4 proc sign_creat uses eax ebx ecx edx edi esi, coord_x:dword, coord_y:dword, opt:dword mov edi,[sign_count] cmp edi,[sign_max] jge .end_f mov esi,[coord_x] mov ebx,[coord_y] .found: stdcall pole_cell_find, pole, esi,ebx cmp eax,0 je .end_f mov ecx,[opt] get_cell_offset edx,eax cmp byte[edx+offs_cell_liv],2 jne @f mov eax,esi stdcall move_rotate_x_n90,1,ecx mov esi,eax jmp .found @@: cmp ch,byte[edx+offs_cell_liv] ;¯à®¢¥à塞 ¯®«¥ § ª ᨣ « je .end_f ;¤®¤¥« âì ãáâ ®¢ªã ¬¥âª¨ ¢ ¯à®¢®¤, çâ®-¡ë ¨§¡¥¦ âì ¤ã¡«¨à®¢ ¨ï ᨣ «®¢ è¨à®ª¨å ¯à®¢®¤ å imul edi,size_sign add edi,[sign_data] mov [edi+sign_x],esi mov [edi+sign_y],ebx mov [edi+sign_a],cl mov [edi+sign_z],ch inc dword[sign_count] mov [edx+offs_cell_liv],ch ;áâ ¢¨¬ ¯®«¥ § ª ᨣ « ;stdcall draw_signal_rect, [coord_x],[coord_y], 0x800080 .end_f: ret endp ;description: ; ¯®¤äãªæ¨ï ¤«ï à¨á®¢ ¨ï ᨣ «®¢ á奬¥ align 4 proc draw_signal_rect uses eax ebx edi, x0:dword,y0:dword, color:dword movzx edi,byte[zoom] mov ebx,[y0] mov eax,[x0] add ebx,[Cor_y] imul ebx,edi add eax,[Cor_x] imul eax,edi stdcall [buf2d_filled_rect_by_size], buf_0, eax,ebx,edi,edi, dword[color] ret endp align 4 proc sign_from_elems locals s_inp dd ? n_leg dd ? endl pushad mov edi,pole ;*** ᮧ¤ ¨¥ ᨣ «®¢ ¨§ «®£¨ç¥áª¨å í«¥¬¥â®¢ *** stdcall dword[tl_node_poi_get_info],0,tree1 pop esi @@: cmp esi,0 je @f cmp word[esi],el_icon_elems ;¯®«ã票¥ ç¥à¥§ esi ⨯ ¨ª®ª¨ jne .end_add_p3 stdcall [tl_node_poi_get_data], esi, tree1 pop ecx ;*** ¯à®¢¥àª ᨣ «®¢ ¢å®¤ëå ®£ å mov dword[s_inp],0 mov dword[n_leg],0 ;word[n_leg] - ®¬¥à ¢å®¤®© ®£¨ mov edx,1 .add_p1: stdcall el_get_leg_coords, ecx,dword[n_leg] test eax,eax jnz .get1 test ebx,ebx jnz .get1 jmp .end_add_p1 ;¥á«¨ ª®®à¤¨ âë ¥ ¢§ï«¨áì (eax=0 && ebx=0), ¢ë室 ¨§ 横« .get1: stdcall pole_cell_find, pole, eax,ebx cmp eax,0 je .get2 imul eax,sizeof.Cell add eax,pole_data cmp byte[eax+offs_cell_liv],1 jne .get2 or dword[s_inp],edx .get2: inc dword[n_leg] shl edx,1 jmp .add_p1 .end_add_p1: ;*** ®¯à¥¤¥«ï¥¬ ¢ë室ãî ª®¬¡¨ æ¨î ¡¨â®¢ ®á®¢¥ § ¤ ®© â ¡«¨æë à ¡®âë í«¥¬¥â movzx eax,byte[ecx+sp_offs_el_type] imul eax,size_el_opt add eax,el_opt_beg+el_offs_table mov ebx,[eax] add ebx,dword[s_inp] mov ebx,[ebx] mov dword[s_inp],ebx ;*** ãáâ ®¢ª ᨣ «®¢ ¢ë室ëå ®£ å mov dword[n_leg],(1 shl 16) ;word[n_leg] - ®¬¥à ¢ë室®© ®£¨ .add_p2: stdcall el_get_leg_coords, ecx,dword[n_leg] test eax,eax jnz .get3 test ebx,ebx jnz .get3 jmp .end_add_p2 ;¥á«¨ ª®®à¤¨ âë ¥ ¢§ï«¨áì (eax=0 && ebx=0), ¢ë室 ¨§ 横« .get3: movzx edx,byte[ecx+8] ;dl - ¯à ¢«¥¨¥ ᨣ « bt dword[s_inp],0 jnc .set1 or edx,0x100 ;dh - § 票¥ ᨣ « 0 ¨«¨ 1 .set1: stdcall sign_creat,eax,ebx,edx inc dword[n_leg] shr dword[s_inp],1 jmp .add_p2 .end_add_p2: .end_add_p3: stdcall dword[tl_node_poi_get_next_info],esi,tree1 pop esi ;¯¥à¥å®¤¨¬ ª á«¥¤ã饬ã 㧫ã jmp @b @@: popad ret endp ;ᮧ¤ ¨¥ ᨣ «®¢ ®á®¢¥ ¯®¤¯¨á¥© align 4 proc sign_from_captions pushad ;mov edi,pole ;*** ᮧ¤ ¨¥ ᨣ «®¢ ¨§ ¯®¤¯¨á¥© *** stdcall dword[tl_node_poi_get_info],0,tree1 pop esi @@: cmp esi,0 je @f cmp word[esi],el_icon_captions ;¯®«ã票¥ ç¥à¥§ esi ⨯ ¨ª®ª¨ jne .end_add_p3 stdcall [tl_node_poi_get_data], esi, tree1 pop ecx cmp byte[ecx+8],'n' je .end_add_p3 ;¥á«¨ ¤¯¨áì ¨ä®à¬ 樮 ï, â® ¥ ᮧ¤ ¥¬ ᨣ « ;xor edx,edx movzx edx,byte[ecx+9] ;¯¥à¢® ç «ì®¥ ¯à¢«¥¨¥ ¢ë室®£® ᨣ « ;*** ®¯à¥¤¥«ï¥¬ ¢ë室®© ¡¨â, ;ª®â®àë© ¡ë« ãáâ ®¢«¥ ¢ but_set_0 ¨ but_set_1 cmp byte[ecx+8],'o' jne .end_add_p1 or edx,0x100 .end_add_p1: stdcall sign_creat,dword[ecx],dword[ecx+4],edx .end_add_p3: stdcall dword[tl_node_poi_get_next_info],esi,tree1 pop esi ;¯¥à¥å®¤¨¬ ª á«¥¤ã饬ã 㧫ã jmp @b @@: popad ret endp ; ¨§¬¥ï¥¬ ¯¥à¢® ç «ì®¥ ¯à¢«¥¨¥ ¢ë室®£® ᨣ « ; ¢ëáâ ¢«ïîâáï 2 ¯à ¢«¥¨ï: á«¥¢ ¯à ¢®, á¯à ¢ «¥¢® ; ®áâ «ìë¥ 2 ¢®§¬®¦ëå ¯à ¢«¥¨ï ¥ ãç¨âë¢ îâáï, ; â. ª. ¯®¢®à®âë ᨣ «®¢ ¢®§¬®¦ë ¨ ¡¥§ ¨å align 4 proc sign_set_captions_angles pushad mov edi,pole stdcall dword[tl_node_poi_get_info],0,tree1 pop esi .cycle0: cmp esi,0 je .cycle0_end cmp word[esi],el_icon_captions ;¯®«ã票¥ ç¥à¥§ esi ⨯ ¨ª®ª¨ jne .end_p0 stdcall [tl_node_poi_get_data], esi, tree1 pop ecx mov ebx,[ecx] ;ebx = coord x xor edx,edx dec ebx stdcall pole_cell_find, edi, ebx,dword[ecx+4] cmp eax,0 je @f mov edx,2 ;jmp .set_angle @@: ;.set_angle: mov byte[ecx+9],dl ;¯¥à¢® ç «ì®¥ ¯à¢«¥¨¥ ¢ë室®£® ᨣ « .end_p0: stdcall dword[tl_node_poi_get_next_info],esi,tree1 pop esi ;¯¥à¥å®¤¨¬ ª á«¥¤ã饬ã 㧫ã jmp .cycle0 .cycle0_end: popad ret endp