Subversion Repositories Kolibri OS

Rev

Rev 2822 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;*************************************************************
  2. ;*GAME TANKS CREATED BY ANDREY IGNATYEV AKA ANDREW_PROGRAMMER*
  3. ;*********************/8/2005*********************************
  4. ; version:      1.15
  5. ; last update:  19/08/2011
  6. ; changed by:   Marat Zakiyanov aka Mario79, aka Mario
  7. ; changes:      1) Checking for "rolled up" window
  8. ;               2) Code optimization
  9. ;               3) Clearing source
  10. ;---------------------------------------------------------------------
  11. ;Lipatov Kirill aka Leency /07/2011
  12. ;dunkaist /07/2011
  13. ;v1.1
  14. ;----------------------------------------------------------
  15. format binary as ""
  16.  
  17.         use32
  18.         org     0x0
  19.         db      'MENUET01'
  20.         dd      0x1
  21.         dd      START
  22.         dd      I_END
  23.         dd      0x4000+640*400*3+50*20*20*3+512+640+1+24*20*20*3+1
  24.         dd      0x4000
  25.         dd      0x0
  26.         dd      0x0
  27. ;----------------------------------------------------------
  28. include 'lang.inc'
  29. include '../../../macros.inc'
  30. ;----------------------------------------------------------    
  31. START:
  32.         mcall   40,111b
  33. ;----------------------------------------------------------
  34. ;---------load all sprites from arrays to memory-----------
  35. ;----------------------------------------------------------
  36.         and     [number_sprite],0
  37.         xor     eax,eax
  38. nextfile:
  39.         mov     ebx,[spisok+4*eax]
  40.         mov     ecx,50
  41.         mov     esi,ebx
  42.         add     esi,2
  43.         mov     edi,0x4000+(640*400*3)+(50*20*20*3)+10
  44.         rep     movsb   ;copy palitra to memory
  45.         mov     esi,ebx
  46.         add     esi,52
  47.         xor     ecx,ecx
  48.         mov     cl,byte [ebx]
  49.         mov     edi,0x4000+(640*400*3)+(50*20*20*3)+512
  50.         push    eax
  51.         call    unpakin
  52.         pop     eax
  53.         mov     ecx,20*20
  54.         mov     esi,0x4000+(640*400*3)+(50*20*20*3)+512
  55.         mov     edi,[number_sprite]
  56.         imul    edi,3*20*20
  57.         add     edi,0x4000+(640*400*3)
  58. unp:
  59.         xor     ebx,ebx
  60.         mov     bl,byte[esi]
  61.         lea     ebx,[ebx+ebx*2]
  62.         add     ebx,0x4000+(640*400*3)+(50*20*20*3)+10
  63.         mov     edx,[ebx]
  64.         mov     [edi],edx
  65.         add     esi,1
  66.         add     edi,3
  67.         dec     ecx
  68.         jnz     unp
  69.         inc     [number_sprite]
  70.         inc     eax
  71.         cmp     [number_sprite],26      ;total number of pictures equal 26
  72.         jne     nextfile
  73. ;----------------------------------------------------------
  74. ;------rotate sprites of tanks to pi/2---------------------
  75. ;----------------------------------------------------------
  76.         mov     [sp_pos],0x4000+(640*400*3)+18*20*20*3
  77.         and     [num_blocks],0
  78. next_block_rotate:
  79.         mov     [number_sprite],0
  80. next_sprite_rotate:
  81.         mov     [x],19
  82.         and     [y],0
  83. rotate_90:
  84.         mov     ebx,[number_sprite]
  85.         mov     esi,[y]
  86.         imul    esi,60
  87.         imul    ebx,1200
  88.         add     esi,ebx ;esi=number_sprite*1200+y*60
  89.         add     esi,dword [sp_pos]
  90.         mov     edi,0x4000+(640*400*3)+(50*20*20*3)
  91.         mov     ecx,15
  92.         rep     movsd
  93.         mov     edi,[number_sprite]
  94.         imul    edi,1200
  95.         add     edi,dword [sp_pos]
  96.         add     edi,8*20*20*3
  97.         mov     ebx,[x]
  98.         lea     ebx,[ebx+2*ebx]
  99.         add     edi,ebx
  100.         mov     esi,0x4000+(640*400*3)+(50*20*20*3)
  101.         mov     ecx,20*3
  102. vertical:
  103.         xor     eax,eax
  104.         mov     al,byte[esi+2]
  105.         mov     [edi+2],al
  106.         xor     eax,eax
  107.         mov     ax,word[esi]
  108.         mov     [edi],ax
  109.         add     edi,60
  110.         add     esi,3
  111.         sub     ecx,3
  112.         jnz     vertical
  113.         dec     [x]
  114.         inc     [y]
  115.         cmp     [x],-1
  116.         jne     rotate_90
  117.         inc     [number_sprite]
  118.         cmp     [number_sprite],9
  119.         jne     next_sprite_rotate
  120.         add     [sp_pos],8*20*20*3
  121.         inc     [num_blocks]
  122.         cmp     [num_blocks],3
  123.         jne     next_block_rotate
  124. ;---------------------------------------------------------
  125. restart_level:
  126.         call    drawwin
  127. ;Start game(demo scen)
  128.         mov     [y],18
  129. @1:
  130.         mov     [x],30
  131. @2:
  132.         mov     esi,[x]
  133.         mov     edi,[y]
  134.         imul    esi,20*3
  135.         imul    edi,20*(640*3)
  136.         add     edi,esi
  137.         add     edi,0x4000
  138.         mov     esi,0x4000+(640*400*3)+1200
  139.         mov     [counter],20
  140.         mov     eax,esi
  141.         mov     ebx,edi
  142. @3:
  143.         mov     esi,eax
  144.         mov     edi,ebx
  145.         mov     ecx,15
  146.         rep     movsd
  147.         add     eax,20*3
  148.         add     ebx,640*3
  149.         dec     [counter]
  150.         jnz     @3
  151.         dec     [x]
  152.         jnz     @2
  153.         dec     [y]
  154.         jnz     @1
  155. ;draw script ******TANKS*******
  156.         mov     eax,54
  157. @11:
  158.         mov     esi,5
  159.         mov     edi,80
  160.         xor     ebx,ebx
  161.         xor     edx,edx
  162.         mov     bl,byte[TANKS_script+2*eax]     ;dx
  163.         mov     dl,byte[TANKS_script+2*eax+1]   ;dy
  164.         imul    ebx,20
  165.         imul    edx,20
  166.         add     esi,ebx
  167.         add     edi,edx
  168.         lea     esi,[esi+2*esi]
  169.         lea     edi,[edi+2*edi]
  170.         imul    edi,640
  171.         add     edi,esi
  172.         add     edi,0x4000
  173.         mov     esi,0x4000+(640*400*3)
  174.         mov     ebx,esi
  175.         mov     edx,edi
  176.         mov     [counter],20
  177. @22:
  178.         mov     esi,ebx
  179.         mov     edi,edx
  180.         mov     ecx,15
  181.         rep     movsd
  182.         add     ebx,20*3
  183.         add     edx,640*3
  184.         dec     [counter]
  185.         jnz     @22
  186.         dec     eax
  187.         cmp     eax,-1
  188.         jne     @11
  189.         mcall   7,0x4000,<640,400>,<0,20>
  190.         call    menu
  191. ;----------------------------
  192. new_level:
  193.         call    paint_area      ;drawwin
  194.         mov     [SpriteInfo+72+8],dword 100     ;Xo
  195.         mov     [SpriteInfo+72+36],dword 100    ;Yo
  196.         mov     edx,[number_level]
  197.         call    load_level
  198. ;--------------------------
  199.         and     [strike_action],0
  200.         and     [bazas],0
  201.         and     [y],0
  202.         mov     eax,8
  203. next_y:
  204.         and     [x],0
  205. next_x:
  206.         mov     esi,[y]
  207.         shl     esi,5
  208.         add     esi,[x]
  209.         add     esi,0x4000+(640*400*3)+(50*20*20*3)+512
  210.         xor     ebx,ebx
  211.         mov     bl,byte[esi]
  212.         cmp     bl,7
  213.         jne     no_baza
  214.         mov     ecx,[x]
  215.         mov     edx,[y]
  216.         inc     ecx
  217.         inc     [bazas]
  218.         add     eax,4
  219.         imul    ecx,20
  220.         imul    edx,20
  221.         mov     [SpriteInfo+9*eax+0],dword 3
  222.         mov     [SpriteInfo+9*eax+4],dword 1
  223.         mov     [SpriteInfo+9*eax+8],dword ecx
  224.         mov     [SpriteInfo+9*eax+12],dword edx
  225.         mov     [SpriteInfo+9*eax+16],dword 5
  226.         mov     [SpriteInfo+9*eax+28],dword -5
  227.         mov     edx,eax
  228.         shr     edx,2
  229.         mov     [LifesTanks+edx],byte 3 ;three lifes
  230.         mov     [PulyTanks+edx],byte 1  ;can draw animation of "puly"
  231. no_baza:
  232.         inc     [x]
  233.         cmp     [x],32
  234.         jne     next_x
  235.         inc     [y]
  236.         cmp     [y],20
  237.         jne     next_y
  238.         mov     [LifesPlayer],3*4
  239.         and     [score],0
  240. ;----------------------------------------------------------
  241. ;--------------------main loop-----------------------------
  242. ;----------------------------------------------------------
  243. maincycle:
  244. ;save fon
  245.         mov     eax,23*4
  246. SaveFonForSprites:
  247.         mov     ebx,[SpriteInfo+9*eax+4]
  248.         test    ebx,ebx ;if ebx<>0 then can save
  249.         jz      NoSaveFon
  250.         mov     esi,[SpriteInfo+9*eax+8]        ;cordinat x
  251.         mov     edi,[SpriteInfo+9*eax+12]       ;cordinat y
  252.         mov     edx,eax
  253.         shr     edx,2
  254.         call    SaveFon
  255. NoSaveFon:
  256.         sub     eax,4
  257.         cmp     eax,-4
  258.         jne     SaveFonForSprites
  259. ;put sprites
  260.         mov     eax,23*4
  261. PutSprites:
  262.         mov     ebx,[SpriteInfo+9*eax+4]
  263.         test    ebx,ebx
  264.         jz      NoPutSprite
  265.         and     ebx,10000b
  266.         test    ebx,ebx ;move to transparent shablon?
  267.         jnz     NoPutSprite
  268.         mov     esi,[SpriteInfo+9*eax+8]        ;x
  269.         mov     edi,[SpriteInfo+9*eax+12]       ;y
  270.         mov     edx,[SpriteInfo+9*eax+0]        ;number sprite in sprites table
  271.         shl     edx,2
  272.         add     edx,[SpriteInfo+9*eax+24]       ;edx=4*NumSprites+phas
  273.         call    PutSprite
  274. NoPutSprite:
  275.         sub     eax,4
  276.         cmp     eax,-4
  277.         jne     PutSprites
  278. ;put image
  279.         call    clock
  280.         mov     ebx,[time]
  281.         sub     ebx,[time_frame_old]
  282.         cmp     ebx,5
  283.         jl      NoPutScreen
  284.         mov     ebx,[time]
  285.         mov     [time_frame_old],ebx
  286.         mcall   7,0x4000,<640,400>,<0,20>
  287. NoPutScreen:
  288. ;put fon
  289.         mov     eax,23*4
  290. PutFonForSprites:
  291.         mov     ebx,[SpriteInfo+9*eax+4]
  292.         test    ebx,ebx
  293.         jz      NoPutFon
  294.         mov     esi,[SpriteInfo+9*eax+8]
  295.         mov     edi,[SpriteInfo+9*eax+12]
  296.         mov     edx,eax
  297.         shr     edx,2
  298.         call    PutFon
  299. NoPutFon:
  300.         sub     eax,4
  301.         cmp     eax,-4
  302.         jne     PutFonForSprites
  303. ;change phas(if need)
  304.         mov     eax,23*4
  305. ChangePhasSprites:
  306.         push    eax
  307.         call    clock
  308.         pop     eax
  309.         mov     ebx,[SpriteInfo+9*eax+16]       ;time of animation
  310.         mov     ecx,[SpriteInfo+9*eax+20]       ;time of last frame
  311.         mov     edx,[time]
  312.         sub     edx,ecx
  313.         cmp     edx,ebx
  314.         jl      no_change_phas
  315.         mov     ebx,[time]
  316.         mov     [SpriteInfo+9*eax+20],ebx       ;save new time
  317. ;------------------------------
  318.         mov     esi,[SpriteInfo+9*eax+8]
  319.         mov     edi,[SpriteInfo+9*eax+12]
  320.         mov     ecx,[SpriteInfo+9*eax+28]
  321.         mov     edx,[SpriteInfo+9*eax+32]
  322.         add     esi,ecx ;x=x+dx
  323.         add     edi,edx ;y=y+dy
  324.         mov     [SpriteInfo+9*eax+8],dword esi
  325.         mov     [SpriteInfo+9*eax+12],dword edi
  326. ;-------------------------------
  327.         mov     edx,[SpriteInfo+9*eax+24]       ;phas
  328.         add     edx,1
  329.         cmp     edx,4
  330.         jne     no_limit_phas
  331.         xor     edx,edx
  332.         mov     [SpriteInfo+9*eax+24],dword edx
  333.         mov     [SpriteInfo+9*eax+4],dword edx
  334.         jmp     no_change_phas
  335. no_limit_phas:
  336.         mov     [SpriteInfo+9*eax+24],dword edx
  337. no_change_phas:
  338.         sub     eax,4
  339.         cmp     eax,-4
  340.         jne     ChangePhasSprites
  341. ;-------------------------------------------------
  342. ;----------------keys-----------------------------
  343. ;-------------------------------------------------
  344.         call    pause_cicle
  345.         mcall   23,3
  346.         cmp     eax,1
  347.         je      .redraw
  348.         cmp     eax,2
  349.         je      .key
  350.         cmp     eax,3
  351.         je      .button
  352.         jmp     action
  353. .button:
  354.         mcall   -1
  355. .redraw:
  356.         call    drawwin
  357.         jmp     action
  358. .key:
  359. keypressed:
  360.         cmp     eax,2
  361.         jne     action
  362.         and     [_dx],0
  363.         and     [_dy],0
  364.         mcall   2
  365. ;---------
  366.         cmp     ah,32
  367.         jne     key2
  368.         cmp     [strike_action],0
  369.         jne     action
  370.         mov     [SpriteInfo+36+4],dword 1       ;can draw sprite "puly"
  371.         mov     [strike_action],1               ;sprite is active
  372.         mov     eax,[SpriteInfo+72+8]
  373.         mov     ebx,[SpriteInfo+72+12]
  374.         mov     ecx,[SpriteInfo+72+28]
  375.         mov     edx,[SpriteInfo+72+32]
  376.         add     eax,ecx
  377.         add     ebx,edx
  378.         mov     [SpriteInfo+36+8],dword eax
  379.         mov     [SpriteInfo+36+12],dword ebx
  380.         jmp     action
  381. key2:
  382.         cmp     ah,176
  383.         jne     key3
  384.         mov     [SpriteInfo+8*9+0],dword 8
  385.         mov     [SpriteInfo+8*9+4],dword 1
  386.         mov     [SpriteInfo+8*9+28],dword -5
  387.         mov     [SpriteInfo+8*9+32],dword 0
  388.         mov     [_dx],0
  389.         mov     [_dy],10
  390.         cmp     [strike_action],0
  391.         jne     action
  392.         mov     [SpriteInfo+36+28],dword -5
  393.         mov     [SpriteInfo+36+32],dword 0
  394.         jmp     action
  395. key3:
  396.         cmp     ah,179
  397.         jne     key4
  398.         mov     [SpriteInfo+8*9+0],dword 4
  399.         mov     [SpriteInfo+8*9+4],dword 1
  400.         mov     [SpriteInfo+8*9+28],dword 5
  401.         mov     [SpriteInfo+8*9+32],dword 0
  402.         mov     [_dx],15
  403.         mov     [_dy],10
  404.         cmp     [strike_action],0
  405.         jne     action
  406.         mov     [SpriteInfo+36+28],dword 5
  407.         mov     [SpriteInfo+36+32],dword 0
  408.         jmp     action
  409. key4:
  410.         cmp     ah,178
  411.         jne     key5
  412.         mov     [SpriteInfo+8*9+0],dword 2
  413.         mov     [SpriteInfo+8*9+4],dword 1
  414.         mov     [SpriteInfo+8*9+28],dword 0
  415.         mov     [SpriteInfo+8*9+32],dword -5
  416.         mov     [_dx],10
  417.         mov     [_dy],1
  418.         cmp     [strike_action],0
  419.         jne     action
  420.         mov     [SpriteInfo+36+28],dword 0
  421.         mov     [SpriteInfo+36+32],dword -5
  422.         jmp     action
  423. key5:
  424.         cmp     ah,177
  425.         jne     key6
  426.         mov     [SpriteInfo+8*9+0],dword 6
  427.         mov     [SpriteInfo+8*9+4],dword 1
  428.         mov     [SpriteInfo+8*9+28],dword 0
  429.         mov     [SpriteInfo+8*9+32],dword 5
  430.         mov     [_dy],15
  431.         mov     [_dx],10
  432.         cmp     [strike_action],0
  433.         jne     action
  434.         mov     [SpriteInfo+36+28],dword 0
  435.         mov     [SpriteInfo+36+32],dword 5
  436.         jmp     action
  437. key6:
  438.         cmp     ah,27
  439.         jne     action
  440.         mcall   -1
  441. action:
  442.         mov     [SpriteInfo+72+4],dword 1
  443.         mov     [SpriteInfo+72+16],dword 5      ;usal speed of tank
  444.         mov     esi,[SpriteInfo+8*9+8]          ;cordinat x of sprite
  445.         mov     edi,[SpriteInfo+8*9+12]         ;cordinat y of sprite
  446.         mov     ecx,[SpriteInfo+72+28]
  447.         mov     edx,[SpriteInfo+72+32]
  448.         add     ecx,[_dx]
  449.         add     edx,[_dy]
  450.         add     esi,ecx ;x=x+_dx+dx
  451.         add     edi,edx ;y=y+_dy+dy
  452.         call    map_x_y
  453.         cmp     ecx,6
  454.         jne     no_woter
  455.         mov     [SpriteInfo+72+16],dword 7      ;in water tank slow move
  456. no_woter:
  457.         cmp     ecx,4
  458.         jne     no_palma
  459.         mov     [SpriteInfo+72+4],dword 10000b  ;if bit 4 than transparent sprite
  460. no_palma:
  461.         cmp     ecx,8
  462.         jne     no_derevo
  463.         mov     [SpriteInfo+72+4],dword 10000b
  464. no_derevo:
  465.         test    edx,edx
  466.         jnz     ani
  467.         mov     [SpriteInfo+8*9+28],dword 0
  468.         mov     [SpriteInfo+8*9+32],dword 0
  469. ;-------------------------------------------------
  470. ani:
  471.         mov     eax,[strike_action]
  472.         test    eax,eax
  473.         jz      no_anim_strike
  474.         mov     esi,[SpriteInfo+36+8]
  475.         mov     edi,[SpriteInfo+36+12]
  476.         mov     ecx,[SpriteInfo+36+28]
  477.         mov     edx,[SpriteInfo+36+32]
  478.         add     esi,ecx
  479.         add     edi,edx
  480.         call    map_x_y
  481.         cmp     cl,0
  482.         jne     no_stena
  483.         mov     [ebx],byte 2    ;trava
  484.         jmp     bum
  485. no_stena:
  486.         cmp     cl,1
  487.         jne     no_brony
  488.         jmp     bum
  489. no_brony:
  490.         cmp     cl,7
  491.         jne     anim_action_puly
  492.         sub     [bazas],1
  493.         mov     [ebx],byte 2    ;trava
  494. bum:
  495.         mov     esi,[SpriteInfo+36+8]
  496.         mov     edi,[SpriteInfo+36+12]
  497.         mov     [SpriteInfo+4],dword 1
  498.         mov     [SpriteInfo+8],dword esi
  499.         mov     [SpriteInfo+12],dword edi
  500.         mov     [SpriteInfo+36+4],dword 0
  501.         mov     [end_bum],1
  502.         jmp     no_anim_strike
  503. anim_action_puly:
  504.         mov     [SpriteInfo+36+4],dword 1
  505. no_anim_strike:
  506. ;-------------------------------------------------
  507. ;¯à®¢¥à塞 ¯®¯ «  «¨ ¯ã«ï ¢ ¯à®â¨¢­¨ª®¢
  508.         mov     esi,[SpriteInfo+4*9+8]
  509.         mov     edi,[SpriteInfo+4*9+12]
  510.         mov     [x],esi ;ª®®à¤¨­ â  x ¯ã«¨
  511.         mov     [y],edi ;ª®®à¤¨­ â  y ¯ã«¨
  512.         mov     eax,3*4
  513. bum_tank:
  514.         mov     ebx,eax
  515.         shr     ebx,2
  516.         xor     ecx,ecx
  517.         mov     cl,byte [LifesTanks+ebx]
  518.         cmp     ecx,0
  519.         jz      no_strike
  520.         mov     esi,[SpriteInfo+9*eax+8]        ;x
  521.         mov     edi,[SpriteInfo+9*eax+12]       ;y
  522.         sub     esi,[x]
  523.         sub     edi,[y]
  524.         cmp     esi,5
  525.         ja      no_strike
  526.         cmp     edi,5
  527.         ja      no_strike
  528.         add     [score],5
  529.         cmp     [score],20
  530.         jl      no_bonus
  531.         add     [LifesPlayer],4
  532.         and     [score],0
  533. no_bonus:
  534.         dec     ecx;,1
  535.         mov     [LifesTanks+ebx],cl     ;life=life-1
  536.         mov     esi,[x]
  537.         mov     edi,[y]
  538.         mov     [SpriteInfo+4],dword 1
  539.         mov     [SpriteInfo+8],dword esi
  540.         mov     [SpriteInfo+12],dword edi
  541.         mov     [SpriteInfo+36+4],dword 0
  542.         mov     [end_bum],1
  543. no_strike:
  544.         add     eax,4
  545.         cmp     eax,10*4
  546.         jne     bum_tank
  547. ;-------------------------------------------------
  548.         xor     eax,eax
  549.         mov     al,[end_bum]
  550.         test    eax,eax
  551.         jz      no_end_strike
  552.         mov     eax,[SpriteInfo+24]
  553.         cmp     eax,3
  554.         jne     no_end_strike
  555.         and     [strike_action],0
  556.         and     [end_bum],0
  557.         mov     edx,[number_level]
  558.         mov     ecx,15
  559.         call    load_level
  560. no_end_strike:
  561. ;----------------------------
  562. ;¯à®¢¥à塞,¯®¯ «¨ «¨ ¯à®â¨¢­¨ª¨ ¢ ¨£à®ª 
  563.         mov     eax,3*4
  564.         mov     esi,[SpriteInfo+72+8]
  565.         mov     edi,[SpriteInfo+72+12]
  566.         mov     [x],esi
  567.         mov     [y],edi
  568. strike_to_player:
  569.         mov     ebx,eax
  570.         add     ebx,28
  571.         mov     esi,[SpriteInfo+9*ebx+8]
  572.         mov     edi,[SpriteInfo+9*ebx+12]
  573.         sub     esi,[x]
  574.         sub     edi,[y]
  575.         cmp     esi,5
  576.         ja      no_strike_to_player
  577.         cmp     edi,5
  578.         ja      no_strike_to_player
  579.         mov     esi,[x]
  580.         mov     edi,[y]
  581.         mov     [SpriteInfo+9*ebx+4],dword 0
  582.         add     ebx,28
  583.         mov     [SpriteInfo+9*ebx+4],dword 1
  584.         mov     [SpriteInfo+9*ebx+8],dword esi
  585.         mov     [SpriteInfo+9*ebx+12],dword edi
  586.         sub     [LifesPlayer],1
  587.         cmp     [LifesPlayer],0
  588.         jne     no_game_over
  589.         call    end_game
  590.         jmp     restart_level
  591. no_game_over:
  592. no_strike_to_player:
  593.         add     eax,4
  594.         cmp     eax,10*4
  595.         jne     strike_to_player
  596. ;----------------------------
  597.         xor     eax,eax
  598.         mov     al,[bazas]
  599.         test    eax,eax
  600.         jnz     no_end_level
  601.         call    you_won
  602.         inc     [number_level]
  603.         cmp     [number_level],25
  604.         jne     no_end_game
  605.         mov     eax,-1
  606.         mcall
  607. no_end_game:
  608.         jmp     new_level
  609. no_end_level:
  610. ;-------------------------------------------------
  611. ;------------ logic of tanks----------------------
  612. ;-------------------------------------------------
  613.         mov     eax,12
  614. next_bad_tank:
  615.         mov     ebx,eax
  616.         shr     ebx,2
  617.         xor     ecx,ecx
  618.         mov     cl,byte[LifesTanks+ebx]
  619.         test    ecx,ecx
  620.         jz      no_action_bad_tank
  621.         mov     ebx,[SpriteInfo+9*eax+4]
  622.         test    ebx,ebx
  623.         jnz     no_action_bad_tank
  624. ;---------------------
  625.         mov     esi,[SpriteInfo+9*eax+8]
  626.         mov     edi,[SpriteInfo+9*eax+12]
  627.         mov     [x],esi
  628.         mov     [y],edi
  629.         mov     ecx,[SpriteInfo+9*eax+28]
  630.         mov     edx,[SpriteInfo+9*eax+32]
  631. ;ᬮâਬ çâ® ¢¯¥à¥¤¨ â ­ª -¯à®â¨¢­¨ª 
  632.         cmp     ecx,0
  633.         ja      more_null_x
  634.         lea     ecx,[ecx+2*ecx]
  635.         jmp     test_y
  636. more_null_x:
  637.         shl     ecx,2
  638.         add     ecx,15
  639. test_y:
  640.         cmp     edx,0
  641.         ja      more_null_y
  642.         lea     edx,[edx+2*edx]
  643.         jmp     add_numbers
  644. more_null_y:
  645.         shl     edx,2
  646.         add     edx,15
  647. add_numbers:
  648. ;--------------------
  649.         add     esi,ecx
  650.         add     edi,edx
  651.         call    map_x_y
  652.         cmp     ecx,4
  653.         jne     no_palma_p
  654.         mov     [SpriteInfo+9*eax+4],dword 10000b
  655. no_palma_p:
  656.         cmp     ecx,8
  657.         jne     no_derevo_p
  658.         mov     [SpriteInfo+9*eax+4],dword 10000b
  659.         no_derevo_p:
  660. ;¥á«¨   ­  ¯ã⨠⠭ª  ¯à¥¯ïâá⢨¥,â® ­ ¤® ¨§¬¥­¨âì
  661. ;­ ¯à ¢«¥­¨¥ ¤¢¨¦¥­¨ï
  662.         test    edx,edx
  663.         jnz     lab1
  664. ;¯à®¢¥à塞 - ­¥ ¯®¯ « «¨ â ­ª ¢ â㯨ª(3 ­ ¯à¢«¥­¨ï § ­ïâë)
  665.         and     [tupik],0
  666.         mov     esi,[x]
  667.         mov     edi,[y]
  668.         add     esi,(20+15)
  669.         add     edi,10
  670.         call    map_x_y
  671.         test    edx,edx
  672.         jnz     direct1
  673.         inc     [tupik]
  674. direct1:
  675.         mov     esi,[x]
  676.         mov     edi,[y]
  677.         add     esi,10
  678.         add     edi,(20+15)
  679.         call    map_x_y
  680.         test    edx,edx
  681.         jnz     direct2
  682.         inc     [tupik]
  683. direct2:
  684.         mov     esi,[x]
  685.         mov     edi,[y]
  686.         add     esi,-15
  687.         add     edi,10
  688.         call    map_x_y
  689.         test    edx,edx
  690.         jnz     direct3
  691.         inc     [tupik]
  692. direct3:
  693.         mov     esi,[x]
  694.         mov     edi,[y]
  695.         add     esi,10
  696.         add     edi,-15
  697.         call    map_x_y
  698.         test    edx,edx
  699.         jnz     direct4
  700.         inc     [tupik]
  701. direct4:
  702.         cmp     [tupik],3
  703.         je      no_move0
  704. ;------------------
  705. ;strategy1
  706.         mov     esi,[x]
  707.         mov     edi,[y]
  708.         add     esi,(20+15)
  709.         add     edi,10
  710.         call    map_x_y
  711.         test    edx,edx
  712.         jnz     no_strategy1
  713.         mov     esi,[x]
  714.         mov     edi,[y]
  715.         add     esi,10
  716.         add     edi,-15
  717.         call    map_x_y
  718.         jnz     no_strategy1
  719.         jmp     no_move3        ;going to left
  720. no_strategy1:
  721. ;------------------
  722.         mov     esi,[x]
  723.         mov     edi,[y]
  724.         add     esi,-15
  725.         add     edi,10
  726.         call    map_x_y
  727.         test    edx,edx
  728.         jnz     no_strategy2
  729.         mov     esi,[x]
  730.         mov     edi,[y]
  731.         add     esi,10
  732.         add     edi,-15
  733.         call    map_x_y
  734.         test    edx,edx
  735.         jnz     no_strategy2
  736.         jmp     no_move2
  737. no_strategy2:
  738. ;------------------
  739.         mov     esi,[x]
  740.         mov     edi,[y]
  741.         add     edi,(20+15)
  742.         add     esi,10
  743.         call    map_x_y
  744.         test    edx,edx
  745.         jnz     no_strategy3
  746.         mov     esi,[x]
  747.         mov     edi,[y]
  748.         add     esi,-15
  749.         add     edi,10
  750.         call    map_x_y
  751.         test    edx,edx
  752.         jnz     no_strategy3
  753.         jmp     no_move1
  754. no_strategy3:
  755. ;-------------------------------------------------
  756. no_move0:
  757.         mov     esi,[x] ;       x
  758.         mov     edi,[y] ;       y
  759.         add     edi,-15 ;       (y-20) up
  760.         add     esi,10
  761.         call    map_x_y
  762.         test    edx,edx
  763.         jz      no_move1
  764. ;¢¢¥àåã ᢮¡®¤­® - ¬®¦­® ¤¢¨£ âìáï up
  765.         mov     [SpriteInfo+9*eax+0],dword 3
  766.         mov     [SpriteInfo+9*eax+28],dword 0
  767.         mov     [SpriteInfo+9*eax+32],dword -5
  768.         jmp     lab1
  769. no_move1:
  770.         mov     esi,[x]
  771.         mov     edi,[y]
  772.         add     esi,(20+15)     ;x+20
  773.         add     edi,10
  774.         call    map_x_y
  775.         test    edx,edx
  776.         jz      no_move2
  777. ;right
  778.         mov     [SpriteInfo+9*eax+0],dword 5
  779.         mov     [SpriteInfo+9*eax+28],dword 5
  780.         mov     [SpriteInfo+9*eax+32],dword 0
  781.         jmp     lab1
  782. no_move2:
  783.         mov     esi,[x]
  784.         mov     edi,[y]
  785.         add     esi,10  ;x-20
  786.         add     edi,(20+15)
  787.         call    map_x_y
  788.         test    edx,edx
  789.         jz      no_move3
  790. ;down
  791.         mov     [SpriteInfo+9*eax+0],dword 7
  792.         mov     [SpriteInfo+9*eax+28],dword 0
  793.         mov     [SpriteInfo+9*eax+32],dword 5
  794.         jmp     lab1
  795. no_move3:
  796.         mov     esi,[x]
  797.         mov     edi,[y]
  798.         add     edi,10  ;y+20
  799.         add     esi,-15
  800.         call    map_x_y
  801.         test    edx,edx
  802.         jz      no_move4
  803. ;¢­¨§ã ᢮¡®¤­®-¬®¦­® ¤¢¨£ âìáï left
  804.         mov     [SpriteInfo+9*eax+0],dword 9
  805.         mov     [SpriteInfo+9*eax+28],dword -5
  806.         mov     [SpriteInfo+9*eax+32],dword 0
  807.         jmp     lab1
  808. no_move4:
  809.         mov     [SpriteInfo+9*eax+28],dword 0
  810.         mov     [SpriteInfo+9*eax+32],dword 0
  811. lab1:
  812.         mov     edx,dword[SpriteInfo+9*eax+4]
  813.         test    edx,edx
  814.         jnz     no_action_bad_tank
  815.         mov     [SpriteInfo+9*eax+4],dword 1
  816. no_action_bad_tank:
  817.         add     eax,4
  818.         cmp     eax,10*4
  819.         jne     next_bad_tank
  820. ;-------------------------------------------------
  821.         mov     eax,12
  822. next_puly:
  823.         mov     edx,eax
  824.         shr     edx,2
  825.         xor     ecx,ecx
  826.         mov     cl,byte[PulyTanks+edx]
  827.         test    ecx,ecx ;can change course of puly?
  828.         jz      no_change_course
  829.         xor     ecx,ecx
  830.         mov     cl,byte[LifesTanks+edx]
  831.         test    ecx,ecx ;is tank not destroed?
  832.         jz      no_draw_s
  833.         mov     ecx,[SpriteInfo+9*eax+24]       ;tank's phas of animation
  834.         test    ecx,ecx         ;phas=0?
  835.         jnz     no_change_course
  836.         mov     esi,[SpriteInfo+9*eax+8]
  837.         mov     edi,[SpriteInfo+9*eax+12]
  838.         mov     ecx,[SpriteInfo+9*eax+28]
  839.         mov     edx,[SpriteInfo+9*eax+32]
  840.         mov     ebx,eax
  841.         add     ebx,28
  842.         mov     [SpriteInfo+9*ebx+0],dword 1
  843.         mov     [SpriteInfo+9*ebx+4],dword 1
  844.         mov     [SpriteInfo+9*ebx+28],dword ecx
  845.         mov     [SpriteInfo+9*ebx+32],dword edx
  846.         mov     [SpriteInfo+9*ebx+16],dword 3
  847.         mov     [SpriteInfo+9*ebx+8],dword esi
  848.         mov     [SpriteInfo+9*ebx+12],dword edi
  849.         mov     ebx,eax
  850.         shr     ebx,2
  851.         mov     [PulyTanks+ebx],byte 0
  852.         jmp     no_draw_s
  853. ;-------------------
  854. no_change_course:
  855.         mov     ebx,eax
  856.         add     ebx,28
  857.         mov     ecx,[SpriteInfo+9*ebx+24]
  858.         test    ecx,ecx
  859.         jnz     no_draw_s
  860.         mov     esi,[SpriteInfo+9*ebx+8]
  861.         mov     edi,[SpriteInfo+9*ebx+12]
  862.         mov     ecx,[SpriteInfo+9*ebx+28]
  863.         mov     edx,[SpriteInfo+9*ebx+32]
  864.         call    map_x_y
  865.         cmp     ecx,1
  866.         je      bumm
  867.         cmp     ecx,0
  868.         je      strike_to_wall
  869.         jmp     no_bumm
  870. strike_to_wall:
  871.         mov     [ebx],byte 2
  872. bumm:
  873. ;-------------------
  874.         mov     ebx,eax
  875.         add     ebx,28
  876.         mov     [SpriteInfo+9*ebx+28],dword 0
  877.         mov     [SpriteInfo+9*ebx+32],dword 0
  878.         mov     esi,[SpriteInfo+9*ebx+8]
  879.         mov     edi,[SpriteInfo+9*ebx+12]
  880.         add     ebx,28
  881.         mov     [SpriteInfo+9*ebx+4],dword 1
  882.         mov     [SpriteInfo+9*ebx+8],dword esi
  883.         mov     [SpriteInfo+9*ebx+12],dword edi
  884.         mov     [SpriteInfo+9*ebx+16],dword 3
  885.         mov     [SpriteInfo+9*ebx+28],dword 0
  886.         mov     [SpriteInfo+9*ebx+32],dword 0
  887.         mov     ebx,eax
  888.         shr     ebx,2
  889.         mov     [PulyTanks+ebx],byte 1
  890.         mov     edx,[number_level]
  891.         mov     ecx,15
  892.         push    eax
  893.         call    load_level
  894.         pop     eax
  895.         jnp     no_draw_s
  896. ;-------------------
  897. no_bumm:
  898.         mov     ebx,eax
  899.         add     ebx,28
  900.         mov     [SpriteInfo+9*ebx+4],dword 1    ;can draw sprite of puly
  901. no_draw_s:
  902.         add     eax,4
  903.         cmp     eax,10*4
  904.         jne     next_puly
  905. ;-------------------------------------------------
  906. ;-------------end of tanks logic------------------
  907. ;-------------------------------------------------
  908.         xor     edx,edx
  909.         mcall   13,<190,192>,<5,7>
  910.         mcall   4,<190,5>,0x1ded00,Level,5      
  911.         mcall   ,<260,5>,0x3558ff,Lifes,
  912.         mcall   ,<330,5>,0xf93500,Score,
  913.         mov     ecx,[number_level]
  914.         mcall   47,3*65536,,<225,5>,0x1ded00
  915.         xor     ecx,ecx
  916.         mov     cl,[LifesPlayer]
  917.         shr     ecx,2
  918.         mcall   ,,,<295,5>,0x3558ff
  919.  
  920.         xor     ecx,ecx
  921.         mov     cl,byte[score]
  922.         mcall   ,,,<365,5>,0xf93500
  923.         jmp     maincycle
  924. ;----------------------------------------------------------
  925. ;-----------------end of main cycle------------------------
  926. ;----------------------------------------------------------
  927. pause_cicle:
  928.         pusha
  929. .start:
  930.         mcall   9,procinfo,-1
  931.         mov     eax,[procinfo+70] ;status of window
  932.         test    eax,100b
  933.         jne     @f
  934.         popa
  935.         ret
  936. @@:
  937.         mcall   10
  938.         dec     eax
  939.         jz      .redraw
  940.         dec     eax
  941.         jz      .key
  942.         dec     eax
  943.         jnz     .start  
  944. .button:
  945.         mcall   -1
  946. .key:
  947.         mcall   2
  948.         jmp     .start
  949. .redraw:
  950.         call    drawwin
  951.         jmp     .start
  952. ;---------------------------------------------------------
  953. ;draw sprite in video memory
  954. PutSprite:
  955.         push    eax
  956.         mov     ebx,esi
  957.         mov     eax,edi
  958.         lea     ebx,[ebx+2*ebx]
  959.         lea     eax,[eax+2*eax]
  960.         imul    eax,640
  961.         add     eax,0x4000
  962.         add     eax,ebx
  963.         mov     [counter],20
  964.         mov     esi,edx
  965.         imul    esi,1200
  966.         add     esi,0x4000+(640*400*3)+10*1200
  967.         mov     ebx,esi
  968.         mov     edi,eax
  969. draw:
  970.         mov     esi,ebx
  971.         mov     edi,eax
  972.         mov     ecx,20
  973. ;--------------------
  974. rep_movsb:
  975.         xor     edx,edx
  976.         mov     edx,[esi]
  977.         and     edx,0xffffff
  978.         test    edx,edx ;0 is transparent color
  979.         jz      transparent_color
  980.         mov     [edi],dx
  981.         shr     edx,16
  982.         mov     [edi+2],dl
  983. transparent_color:
  984.         add     esi,3
  985.         add     edi,3
  986.         sub     ecx,1
  987.         jnz     rep_movsb
  988. ;--------------------
  989.         add     eax,640*3
  990.         add     ebx,20*3
  991.         dec     [counter]
  992.         jnz     draw
  993.         pop     eax
  994.         ret
  995. ;----------------------------------------------------------
  996. SaveFon:
  997.         push    eax
  998.         lea     esi,[esi+2*esi]
  999.         lea     edi,[edi+2*edi]
  1000.         imul    edi,640
  1001.         add     esi,edi
  1002.         add     esi,0x4000
  1003.         mov     edi,edx
  1004.         imul    edi,1200
  1005.         add     edi,0x4000+(640*400*3)+(50*20*20*3)+512+641
  1006.         mov     [counter],20
  1007.         mov     eax,esi
  1008.         mov     ebx,edi
  1009. save_to:
  1010.         mov     esi,eax
  1011.         mov     edi,ebx
  1012.         mov     ecx,15
  1013.         rep     movsd
  1014.         add     eax,640*3
  1015.         add     ebx,20*3
  1016.         dec     [counter]
  1017.         jnz     save_to
  1018.         pop     eax
  1019.         ret
  1020. ;----------------------------------------------------------
  1021. PutFon:
  1022.         push    eax
  1023.         lea     esi,[esi+2*esi]
  1024.         lea     edi,[edi+2*edi]
  1025.         imul    edi,640
  1026.         add     edi,esi
  1027.         add     edi,0x4000
  1028.         mov     esi,edx
  1029.         imul    esi,1200
  1030.         add     esi,0x4000+(640*400*3)+(50*20*20*3)+512+641
  1031.         mov     [counter],20
  1032.         mov     eax,esi
  1033.         mov     ebx,edi
  1034. put_to:
  1035.         mov     esi,eax
  1036.         mov     edi,ebx
  1037.         mov     ecx,15
  1038.         rep     movsd
  1039.         add     eax,20*3
  1040.         add     ebx,640*3
  1041.         dec     [counter]
  1042.         jnz     put_to
  1043.         pop     eax
  1044.         ret
  1045. ;----------------------------------------------------------
  1046. ;get time in 1/100 sec
  1047. clock:
  1048.         mcall   26,9
  1049.         mov     [time],eax
  1050.         ret
  1051. ;----------------------------------------------------------
  1052. ;-----------------load level to memory---------------------
  1053. ;----------------------------------------------------------
  1054. load_level:
  1055.         cmp     ecx,15
  1056.         je      no_load_level
  1057.         mov     eax,edx
  1058.         mov     ebx,[levels+4*eax]
  1059.         mov     esi,ebx
  1060.         add     esi,2
  1061.         xor     ecx,ecx
  1062.         xor     eax,eax
  1063.         mov     cl,byte[ebx]
  1064.         mov     al,byte[ebx+1]
  1065.         add     ecx,eax
  1066.         mov     edi,0x4000+(640*400*3)+(50*20*20*3)+512
  1067.         call    unpakin
  1068. no_load_level:
  1069.         and     [y],0
  1070. c_y:
  1071.         and     [x],0
  1072. c_x:
  1073.         mov     eax,[x]
  1074.         mov     ebx,[y]
  1075.         shl     ebx,5
  1076.         add     eax,ebx
  1077.         add     eax,0x4000+(640*400*3)+(50*20*20*3)+512
  1078.         mov     ecx,eax
  1079.         xor     eax,eax
  1080.         mov     al,byte [ecx]
  1081.         imul    eax,1200
  1082.         add     eax,0x4000+(640*400*3)
  1083.         mov     ebx,[x]
  1084.         imul    ebx,20*3
  1085.         mov     ecx,[y]
  1086.         imul    ecx,20*3*640
  1087.         add     ebx,ecx
  1088.         add     ebx,0x4000
  1089.         mov     esi,eax
  1090.         mov     edi,ebx
  1091. ;----------------------------
  1092.         mov     edx,20
  1093. next_line:
  1094.         mov     esi,eax
  1095.         mov     edi,ebx
  1096.         mov     ecx,15
  1097.         rep     movsd
  1098.         add     eax,20*3
  1099.         add     ebx,(640*3)
  1100.         dec     edx
  1101.         jnz     next_line
  1102. ;----------------------------
  1103.         inc     [x]
  1104.         cmp     [x],32
  1105.         jne     c_x
  1106.         inc     [y]
  1107.         cmp     [y],20
  1108.         jne     c_y
  1109.         ret
  1110. ;----------------------------------------------------------
  1111. map_x_y:
  1112.         push    eax
  1113.         mov     ecx,20
  1114.         mov     eax,esi
  1115.         cdq
  1116.         idiv    ecx
  1117.         mov     esi,eax
  1118.         mov     eax,edi
  1119.         cdq
  1120.         idiv    ecx
  1121.         mov     edi,eax
  1122. ;------------------
  1123.         mov     ebx,edi
  1124.         shl     ebx,5
  1125.         add     ebx,esi
  1126.         add     ebx,0x4000+(640*400*3)+(50*20*20*3)+512
  1127.         xor     ecx,ecx
  1128.         mov     cl,byte[ebx]
  1129.         cmp     cl,0
  1130.         je      false_draw
  1131.         cmp     cl,1
  1132.         je      false_draw
  1133.         cmp     cl,3
  1134.         je      false_draw
  1135.         cmp     cl,7
  1136.         je      false_draw
  1137.         mov     edx,1
  1138.         jmp     lab2
  1139. false_draw:
  1140.         xor     edx,edx
  1141. lab2:
  1142.         pop     eax
  1143.         ret
  1144. ;----------------------------------------------------------
  1145. you_won:
  1146.         mcall   13,<0,640>,<20,400>,0xc6e9
  1147.         mcall   4,<255,190>,0xffffff,won1,29
  1148.         mcall   ,<255,200>,,won2,
  1149.         mcall   ,<255,210>,,won3,
  1150.         mcall   5,400
  1151.         ret
  1152. ;----------------------------------------------------------
  1153. end_game:
  1154.         xor     edx,edx
  1155.         mcall   13,<0,640>,<20,400>
  1156.         mcall   4,<280,200>,0xffffff,game_over,9
  1157.         mcall   5,350
  1158.         ret
  1159. ;----------------------------------------------------------
  1160. drawwin:
  1161.         mcall   12,1
  1162. ;à¨á㥬 ®ª­® § ¤ ¢ ï ¢á¥ ­¥®¡å®¤¨¬ë¥ 梥â 
  1163.         mcall   0,100*65536+649,50*65536+446,(0x74000000+0xffffff),,name
  1164.         mcall   9,procinfo,-1
  1165.         mov     eax,[procinfo+70] ;status of window
  1166.         test    eax,100b
  1167.         jne     @f
  1168.         call    paint_area
  1169. @@:
  1170.         mcall   12,2
  1171.         ret
  1172. ;----------------------------------------------------------
  1173. paint_area:
  1174.         xor     edx,edx
  1175.         mcall   13,0*65536+640,0*65536+20
  1176.         ret
  1177. ;----------------------------------------------------------    
  1178. menu:
  1179. cycle_menu:
  1180.         mcall   13,<238,141>,<229,20>,0xed16
  1181.         mcall   4,<255,235>,0xff0200,start_menu,11
  1182.         mcall   47,3*65536,[number_level],<345,235>,0xff0200
  1183.         mcall   4,<465,5>,0x888888,description,25
  1184. still:
  1185.         mcall   10
  1186.         dec     eax
  1187.         jz      .redraw
  1188.         dec     eax
  1189.         jz      .key
  1190. ;       jmp     .button
  1191. ;.button:
  1192.         mcall   -1
  1193. .redraw:
  1194.         pop     eax
  1195.         jmp     restart_level
  1196. .key:
  1197.         mcall   2
  1198.         cmp     ah,32
  1199.         je      start_game
  1200.         cmp     ah,13
  1201.         je      start_game
  1202.         cmp     ah,176
  1203.         jne     no_left
  1204.         dec     [number_level]
  1205.         and     [number_level],15
  1206.         jmp     cycle_menu
  1207. no_left:
  1208.         cmp     ah,179
  1209.         jne     no_right
  1210.         inc     [number_level]
  1211.         and     [number_level],15
  1212.         jmp     cycle_menu
  1213. no_right:
  1214.         cmp     ah,27
  1215.         jne     cycle_menu
  1216.         mov     eax,-1
  1217.         mcall
  1218.         start_game:
  1219.         ret
  1220. ;----------------------------------------------------------
  1221. ;--------------unpak pix engin-----------------------------
  1222. ;----------------------------------------------------------
  1223.         unpakin:
  1224. NextLitlColor:
  1225.         xor     edx,edx
  1226.         mov     dl,byte[esi]
  1227.         xor     eax,eax
  1228.         xor     ebx,ebx
  1229.         mov     al,dl
  1230.         mov     bl,al
  1231.         shr     al,4
  1232.         and     al,0xf
  1233.         mov     [LitlCounter],al
  1234.         and     bl,0xf
  1235.         mov     [LitlColor],bl
  1236.         xor     eax,eax
  1237. ;----------------------
  1238.         mov     al,[LitlColor]
  1239. beg:
  1240.         mov     [edi],al
  1241.         add     edi,1
  1242.         add     [LitlCounter],-1
  1243.         cmp     [LitlCounter],-1
  1244.         jne     beg
  1245.         inc     esi
  1246.         dec     ecx
  1247.         jnz     NextLitlColor
  1248.         ret
  1249. ;----------------------------------------------------------
  1250. include 'data.inc'
  1251. ;----------------------------------------------------------
  1252. procinfo:
  1253.         rb 1024
  1254. ;----------------------------------------------------------
  1255. I_END:
  1256.