Subversion Repositories Kolibri OS

Rev

Rev 2079 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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