Subversion Repositories Kolibri OS

Rev

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

  1. ;=============================================================================;
  2. ; Hidnplayr's invaders for Kolibrios                                          ;
  3. ;-----------------------------------------------------------------------------;
  4. ;                                                                             ;
  5. ; Copyright (C) hidnplayr 2007-2014. All rights reserved.                     ;
  6. ;                                                                             ;
  7. ; Invaders is distributed in the hope that it will be useful, but WITHOUT ANY ;
  8. ; WARRANTY. No author or distributor accepts responsibility to anyone for the ;
  9. ; consequences of using it or for whether it serves any particular purpose or ;
  10. ; works at all, unless he says so in writing. Refer to the GNU General Public ;
  11. ; License (the "GPL") for full details.                                       ;
  12. ; Everyone is granted permission to copy, modify and redistribute KolibriOS,  ;
  13. ; but only under the conditions described in the GPL. A copy of this license  ;
  14. ; is supposed to have been given to you along with KolibriOS so you can know  ;
  15. ; your rights and responsibilities. It should be in a file named COPYING.     ;
  16. ; Among other things, the copyright notice and this notice must be preserved  ;
  17. ; on all copies.                                                              ;
  18. ;                                                                             ;
  19. ; see copying.txt                                                             ;
  20. ;                                                                             ;
  21. ; contact me on hidnplayr@gmail.com                                           ;
  22. ;                                                                             ;
  23. ;-----------------------------------------------------------------------------;
  24.  
  25. format binary as ""
  26.  
  27. ; Screen size
  28. SCREEN_X        = 640
  29. SCREEN_Y        = 480
  30.  
  31. ; Ship size
  32. SHIP_X          = 32
  33. SHIP_Y          = 32
  34.  
  35. ; Ship begin position
  36. SHIP_X_POS      = (SCREEN_X-SHIP_X)/2
  37. SHIP_Y_POS      = SCREEN_Y-SHIP_Y-27
  38.  
  39. ; Enemy size
  40. ENEMY_X         = 32
  41. ENEMY_Y         = 32
  42.  
  43. ; Alien size and position
  44. ALIEN_X         = 48
  45. ALIEN_Y         = 38
  46. ALIEN_Y_POS     = 1
  47.  
  48. ;
  49. BOUNDARY        = 10
  50. MOVEMENT        = 7             ; pixels/frame
  51.  
  52. TRANSPARENCY    = 0x00ffffff    ; color used as transparant
  53.  
  54. ; Window start position
  55. WINDOW_X        = 100
  56. WINDOW_Y        = 100
  57.  
  58. ; Bullet size
  59. BULLET_X        = 10
  60. BULLET_Y        = 10
  61.  
  62. ; Number of stars
  63. STARS_          = 226
  64.  
  65. ; Number of star levels (depth)
  66. STARLEVELS      = 3
  67.  
  68. ENEMY_STARTING_X = 25
  69. ENEMY_STARTING_Y = 50
  70.  
  71. BULLETSPEED     = 12            ; pixels/frame
  72.  
  73.         use32
  74.         org     0x0
  75.         db      'MENUET01'      ; 8 byte id
  76.         dd      0x01            ; header version
  77.         dd      START           ; start of code
  78.         dd      IM_END          ; size of image
  79.         dd      I_END+1000      ; memory for app
  80.         dd      I_END+1000      ; esp
  81.         dd      0x0, 0x0        ; I_Param , I_Path
  82.  
  83. include '../../macros.inc'
  84. include '../../proc32.inc'
  85. include '../../dll.inc'
  86. include '../../develop/libraries/libs-dev/libimg/libimg.inc'
  87.  
  88. KEY_RIGHT       = 179
  89. KEY_LEFT        = 176
  90. KEY_UP          = 178
  91. KEY_P           = 'p'
  92. KEY_DOWN        = 177
  93. KEY_ENTER       = 13
  94. KEY_ESC         = 27
  95.  
  96. proc aimgtoimg img, x, y, canvas, acolor
  97.  
  98.         pusha
  99. ; Calculate offset on canvas in edi
  100.         mov     eax, [y]
  101.         mov     ecx, [canvas]
  102.         mul     dword[ecx]      ; canvas xsize
  103.         add     eax, [x]
  104.  
  105.         lea     edi, [eax*2 + eax + 8]
  106.         add     edi, [canvas]
  107.  
  108. ; get img size in ecx and edx
  109.         mov     esi, [img]
  110.         mov     ecx, dword[esi+0] ; img x size
  111.         mov     edx, dword[esi+4] ; img y size
  112.  
  113. ; caluclate number of bytes between 2 lines in ebx
  114.         mov     ebx, [canvas]
  115.         mov     ebx, [ebx]      ; canvas xsize
  116.         sub     ebx, [esi]      ; img xsize
  117.         lea     ebx, [ebx*2 + ebx]
  118.  
  119. ; get image start ptr in esi
  120.         add     esi, 8
  121.  
  122.   .loop2:
  123.         push    ecx edx
  124.         mov     edx, [acolor]
  125.   .loop:
  126.         mov     eax, [esi]
  127.         and     eax, 0x00ffffff
  128.         cmp     eax, edx
  129.         je      @f
  130.         mov     word[edi], ax
  131.         shr     eax, 16
  132.         mov     byte[edi+2], al
  133.   @@:
  134.         add     esi, 3
  135.         add     edi, 3
  136.         dec     ecx
  137.         jnz     .loop
  138.         pop     edx ecx
  139.  
  140.         add     edi, ebx
  141.         dec     edx
  142.         jnz     .loop2
  143.  
  144.         popa
  145.         ret
  146.  
  147. endp
  148.  
  149. proc aimgtoimg2 img, x, y, canvas, acolor
  150.  
  151.         pusha
  152. ; Calculate offset on canvas in edi
  153.         mov     eax, [y]
  154.         mov     ecx, [canvas]
  155.         mul     dword[ecx]      ; canvas xsize
  156.         add     eax, [x]
  157.  
  158.         lea     edi, [eax*2 + eax + 8]
  159.         add     edi, [canvas]
  160.  
  161. ; get img size in ecx and edx
  162.         mov     esi, [img]
  163.         mov     ecx, dword[esi+0] ; img x size
  164.         mov     edx, dword[esi+4] ; img y size
  165.  
  166. ; caluclate number of bytes between 2 lines in ebx
  167.         mov     ebx, [canvas]
  168.         mov     ebx, [ebx]      ; canvas xsize
  169.         sub     ebx, [esi]      ; img xsize
  170.         lea     ebx, [ebx*2 + ebx]
  171.  
  172. ; get image start ptr in esi
  173.         add     esi, 8
  174.  
  175.   .loop2:
  176.         push    ecx edx
  177.         mov     edx, [acolor]
  178.   .loop:
  179.         mov     eax, [esi]
  180.         and     eax, 0x00ffffff
  181.         cmp     eax, edx
  182.         je      @f
  183.         mov     byte[edi+2], al
  184.         shr     eax, 8
  185.         mov     word[edi], ax
  186.   @@:
  187.         add     esi, 3
  188.         add     edi, 3
  189.         dec     ecx
  190.         jnz     .loop
  191.         pop     edx ecx
  192.  
  193.         add     edi, ebx
  194.         dec     edx
  195.         jnz     .loop2
  196.  
  197.         popa
  198.         ret
  199.  
  200. endp
  201.  
  202. proc getimg imgsrc, x, y, xs, ys, imgdest
  203.  
  204.         pusha
  205.  
  206.         mov     esi, [imgsrc]
  207.         mov     eax, dword[esi+0]       ; xsize
  208.         mov     ebx, [y]
  209.         mul     ebx                     ; xsize*y
  210.         add     eax, [x]                ; xsize*y+x
  211.         lea     eax, [eax+2*eax]        ; (xsize*y+x)*3
  212.  
  213.         mov     edx, dword[esi+0]       ; xsize
  214.         sub     edx, [xs]               ; xsize-xs
  215.         lea     edx, [edx*2+edx]        ; (xsize-xs)*3
  216.  
  217.         lea     esi, [esi + eax + 8]    ; imgsrc + (xsize*y+x)*3 + 8
  218.  
  219.         mov     edi, [imgdest]
  220.         mov     ecx, [xs]
  221.         mov     dword[edi+0], ecx       ; xsize
  222.         mov     ebx, [ys]
  223.         mov     dword[edi+4], ebx       ; ysize
  224.         add     edi, 8                  ; imgdest + 8
  225.  
  226.         cld
  227.   .loop:
  228.         movsw
  229.         movsb
  230.         dec     ecx
  231.         jnz     .loop
  232.  
  233.         add     esi, edx
  234.         mov     ecx, [xs]
  235.         dec     ebx
  236.         jnz     .loop
  237.  
  238.         popa
  239.         ret
  240.  
  241. endp
  242.  
  243. macro decodeimg source, size, dest {
  244.  
  245.         invoke  img.decode, source, size, 0
  246.         or      eax, eax
  247.         jz      exit
  248.         push    [eax + Image.Width]
  249.         pop     dword[dest+0]
  250.         push    [eax + Image.Height]
  251.         pop     dword[dest+4]
  252.         push    eax
  253.         invoke  img.to_rgb2, eax, dest+8
  254.         pop     eax
  255.         invoke  img.destroy, eax
  256. }
  257.  
  258.  
  259. START:
  260.         mcall   68, 11
  261.  
  262.         stdcall dll.Load, @IMPORT
  263.         or      eax, eax
  264.         jz      @f
  265. exit:
  266.         mcall   -1
  267.   @@:
  268.  
  269.         call    draw_window
  270.  
  271.         decodeimg gif_bullet,gif_bullet.size,img_bullet
  272.         decodeimg gif_bullet2,gif_bullet2.size,img_bullet2
  273.         decodeimg gif_ship,gif_ship.size,img_ship
  274.         decodeimg gif_enemy1,gif_enemy1.size,img_enemy1
  275.         decodeimg gif_enemy2,gif_enemy2.size,img_enemy2
  276.         decodeimg gif_enemy3,gif_enemy3.size,img_enemy3
  277.         decodeimg gif_enemy4,gif_enemy4.size,img_enemy4
  278.         decodeimg gif_enemy5,gif_enemy5.size,img_enemy5
  279.         decodeimg gif_alien,gif_alien.size,img_alien
  280.         decodeimg gif_menu1,gif_menu1.size,img_menu1
  281.         decodeimg gif_menu2,gif_menu2.size,img_menu2
  282.         decodeimg gif_menu3,gif_menu3.size,img_menu3
  283.         decodeimg gif_menu4,gif_menu4.size,img_menu4
  284.         decodeimg gif_logo,gif_logo.size,img_logo
  285.         decodeimg gif_pause,gif_pause.size,img_pause
  286.         decodeimg gif_levelup,gif_levelup.size,img_levelup
  287.         decodeimg gif_gameover,gif_gameover.size,img_gameover
  288.         decodeimg gif_highscore,gif_highscore.size,img_highscore
  289.         decodeimg gif_smallfont,gif_smallfont.size,img_smallfont
  290.         decodeimg gif_bigfont,gif_bigfont.size,img_bigfont
  291.         decodeimg gif_numbers,gif_numbers.size,img_numbers
  292.  
  293.         call    init_starfield
  294.         call    render_frame
  295.         call    draw_to_screen
  296.  
  297. mainloop:
  298.  
  299.         call    render_frame
  300.         call    draw_to_screen
  301.         call    bullet_collision_detection
  302.  
  303.         cmp     [status], 3     ; if game is paused,...
  304.         jne     .wait
  305.  
  306.         mcall   10
  307.         jmp     .switch
  308.  
  309.   .wait:
  310.         mcall   5, 1            ; wait 1/100 s
  311.  
  312.         mcall   11              ; check for events
  313.   .switch:
  314.         test    eax, eax
  315.         jz      mainloop
  316.         dec     eax
  317.         jz      .redraw
  318.         dec     eax
  319.         jz      .key
  320.         dec     eax
  321.         jz      .button
  322.  
  323.   .redraw:
  324.         call    draw_window
  325.         jmp     .wait
  326.  
  327.   .button:
  328.         mcall   17              ; get button id
  329.  
  330.         cmp     ah, 1
  331.         jne     .wait
  332.         mcall   -1
  333.  
  334.   .key:
  335.         mcall   2               ; get key code
  336.         test    ah, ah
  337.         jz      mainloop
  338.  
  339.         cmp     [status], 1
  340.         je      key_game
  341.         cmp     [status], 0
  342.         je      key_menu
  343.         cmp     [status], 3
  344.         je      key_pause
  345.         cmp     [status], 6
  346.         je      key_levelup
  347.         cmp     [status], 7
  348.         je      key_highscore
  349.         cmp     [status], 2
  350.         je      key_gameover
  351.  
  352.         cmp     ah, KEY_ESC
  353.         jne     .no_escape
  354.  
  355.         mov     [status], 0
  356.         mov     [intro], 0
  357.   .no_escape:
  358.  
  359.         jmp     mainloop
  360.  
  361.  
  362. key_game:
  363.         cmp     ah, KEY_RIGHT
  364.         jnz     .no_right
  365.  
  366.         cmp     [ship_x], SCREEN_X-SHIP_X-BOUNDARY
  367.         jge     mainloop
  368.         add     [ship_x], MOVEMENT
  369.         jmp     mainloop
  370.   .no_right:
  371.  
  372.         cmp     ah, KEY_LEFT
  373.         jne     .no_left
  374.  
  375.         cmp     [ship_x], BOUNDARY
  376.         jle     mainloop
  377.         sub     [ship_x], MOVEMENT
  378.         jmp     mainloop
  379.   .no_left:
  380.  
  381.         cmp     ah, KEY_UP
  382.         jne     .no_up
  383.  
  384.         cmp     [bullet_y], 1
  385.         jg      mainloop
  386.  
  387.         mov     eax, [ship_x]
  388.         add     eax, (SHIP_X-BULLET_X)/2
  389.         mov     [bullet_x], eax
  390.         mov     [bullet_y], SHIP_Y_POS;-BULLET_Y
  391.         jmp     mainloop
  392.   .no_up:
  393.  
  394.         cmp     ah, KEY_P
  395.         jne     no_pause
  396.  
  397.         mov     [status], 3
  398.         stdcall aimgtoimg, img_pause, 150, 180, vscreen, TRANSPARENCY
  399.         call    draw_to_screen
  400.  
  401.         jmp     mainloop
  402.   no_pause:
  403.         cmp     ah, KEY_ESC
  404.         jne     .no_escape
  405.  
  406.         mov     [status], 0
  407.         mov     [intro], 0
  408.   .no_escape:
  409.         jmp     mainloop
  410.  
  411.  
  412. key_menu:
  413.         cmp     ah, KEY_DOWN
  414.         jne     .no_down
  415.  
  416.         cmp     [menu], 3
  417.         jne     @f
  418.         mov     [menu], 0
  419.         jmp     mainloop
  420.   @@:
  421.         inc     [menu]
  422.         jmp     mainloop
  423.   .no_down:
  424.  
  425.         cmp     ah, KEY_UP
  426.         jnz     .no_up
  427.  
  428.         cmp     [menu], 0
  429.         jne     @f
  430.         mov     [menu], 3
  431.         jmp     mainloop
  432.   @@:
  433.         dec     [menu]
  434.         jmp     mainloop
  435.   .no_up:
  436.  
  437.         cmp     ah, KEY_ESC
  438.         jne     @f
  439.         mcall   -1
  440.   @@:
  441.  
  442.         cmp     ah, KEY_ENTER
  443.         jnz     .no_enter
  444.  
  445.         cmp     [menu], 0       ;start
  446.         je      new_game
  447.  
  448.         cmp     [menu], 1       ;about
  449.         jne     @f
  450.         mov     [status], 4
  451.         jmp     mainloop
  452.   @@:
  453.  
  454.         cmp     [menu], 2       ;highscores
  455.         jne     @f
  456.         mov     [status], 5
  457.         call    load_highscores
  458.         jmp     mainloop
  459.   @@:
  460.  
  461.         cmp     byte[menu], 3   ;exit
  462.         jne     @f
  463.         mcall   -1
  464.   @@:
  465.   .no_enter:
  466.         jmp     mainloop
  467.  
  468.  
  469. key_pause:
  470.         cmp     ah, KEY_P
  471.         jnz     no_pause
  472.  
  473.         mov     [status], 1
  474.   .nopause:
  475.         jmp     mainloop
  476.  
  477.  
  478. key_levelup:
  479.  
  480.         cmp     ah, KEY_ENTER
  481.         jne     .no_enter
  482.  
  483.         inc     [level]
  484.  
  485.         inc     byte[levelnumb+1]
  486.         cmp     byte[levelnumb+1], '9'
  487.         jle     @f
  488.         mov     byte[levelnumb+1], '0'
  489.         inc     byte[levelnumb]
  490.  
  491.   @@:
  492.         mov     eax,20
  493.         mov     ah,byte[level]
  494.         and     ah,7
  495.         mul     ah
  496.         add     eax,level1
  497.         mov     esi,eax
  498.         jmp     load_level
  499.  
  500.   .no_enter:
  501.         cmp     ah, KEY_ESC
  502.         jne     .no_escape
  503.  
  504.         mov     [status], 0
  505.         mov     [intro], 0
  506.   .no_escape:
  507.         jmp     mainloop
  508.  
  509.  
  510. key_highscore:
  511.  
  512.         cmp     ah, KEY_ENTER
  513.         jne     @f
  514.  
  515.         call    load_highscores
  516.         mov     eax, [score]
  517.         mov     ebx, highscorebuffer+140
  518.   .findscore:
  519.         cmp     ebx, highscorebuffer+100
  520.         je      .topscore
  521.         sub     ebx, 4
  522.         cmp     eax, dword[ebx]
  523.         jg      .findscore
  524.  
  525.   .topscore:
  526.         mov     esi, name
  527.         mov     edi, highscorebuffer
  528.         mov     ecx, 10
  529.         rep     movsb
  530.  
  531.         mov     eax, [score]
  532.         mov     dword[highscorebuffer+100], eax
  533.  
  534.         call    save_highscores
  535.         mov     [status], 5
  536.  
  537.   @@:
  538.         cmp     ah, 14
  539.         jne     @f
  540.  
  541.         cmp     byte[namepos],0
  542.         je      @f
  543.  
  544.         dec     byte[namepos]
  545.         movzx   ebx,byte[namepos]
  546.         add     ebx,name
  547.         mov     byte[ebx], 0x11  ; this is a character we dont print
  548.  
  549.   @@:
  550.         cmp     byte[namepos],10
  551.         jge     mainloop
  552.  
  553.         cmp     al,'0'
  554.         jl      mainloop
  555.         cmp     al,'9'
  556.         jle     @f
  557.  
  558.         cmp     al,'z'
  559.         jg      mainloop
  560.         cmp     al,'a'
  561.         jge     @f
  562.  
  563.         cmp     al,'Z'
  564.         jg      mainloop
  565.         cmp     al,'A'
  566.         jl      mainloop
  567.   @@:
  568.  
  569.         movzx   ebx, byte[namepos]
  570.         add     ebx, name
  571.         mov     byte[ebx], al
  572.  
  573.         inc     byte[namepos]
  574.  
  575.         jmp     mainloop
  576.  
  577.  
  578. key_gameover:
  579.         cmp     ah, KEY_ENTER
  580.         jne     .no_enter
  581.  
  582.         ; TODO: test if score is high enough to put in highscore list...
  583.         mov     [status],7
  584.         jmp     mainloop
  585.  
  586.   .no_enter:
  587.         jmp     mainloop
  588.  
  589.  
  590. new_game:
  591.  
  592.         mov     [score], 0
  593.         mov     eax, [score]
  594.         call    convertscore
  595.  
  596.         mov     word[levelnumb], '01'
  597.         mov     esi, level1
  598.  
  599. load_level:
  600.         mov     [enemy_speed], 1
  601.         mov     [enemy_x], ENEMY_STARTING_X
  602.         mov     [enemy_y], ENEMY_STARTING_Y
  603.  
  604.         mov     edi, enemy_table
  605.         mov     ecx, 5
  606.         rep     movsd
  607.  
  608.         mov     [status],1
  609.  
  610.         jmp     mainloop
  611.  
  612.  
  613. draw_window:
  614.  
  615.         mcall   12, 1           ; Start of window draw
  616.  
  617.         mov     ebx, WINDOW_X shl 16 + 9 + SCREEN_X                     ; [x start] shl 16 + [x size]
  618.         mov     ecx, WINDOW_Y shl 16 + 25 + SCREEN_Y                    ; [y start] shl 16 + [y size]
  619.         mov     edx, 0x64000000                                         ; color of work area RRGGBB
  620.         mov     esi, 0x805080d0                                         ; color of grab bar  RRGGBB
  621.         mov     edi, 0x005080d0                                         ; color of frames    RRGGBB
  622.         mcall   0
  623.  
  624.         mcall   71, 1, title
  625.  
  626.         call    draw_to_screen
  627.  
  628.         mcall   12, 2           ; End of window draw
  629.  
  630.         ret
  631.  
  632.  
  633.  
  634. draw_to_screen:
  635.  
  636.         ; Draw buffer to the screen
  637.         mov     ebx, vscreen+8
  638.         mov     ecx, SCREEN_X shl 16 + SCREEN_Y
  639.         mov     edx, 0 shl 16 + 0
  640.         mcall   7
  641.  
  642.         ret
  643.  
  644.  
  645. load_highscores:
  646.  
  647.         ret
  648.  
  649.  
  650. save_highscores:
  651.  
  652.         ret
  653.  
  654.  
  655. render_frame:
  656.  
  657.         mov     eax, 0x00000000
  658.         call    fillscreen
  659.         call    render_starfield
  660.  
  661.         cmp     [status], 1
  662.         je      render_game
  663.         cmp     [status], 2
  664.         je      render_gameover
  665.         cmp     [status], 4
  666.         je      render_about
  667.         cmp     [status], 6
  668.         je      render_levelup
  669.         cmp     [status], 0
  670.         je      render_menu
  671.         cmp     [status], 5
  672.         je      render_highscorelist
  673.         cmp     [status], 7
  674.         je      render_highscore
  675.  
  676.         ret
  677.  
  678.  
  679. render_game:
  680.  
  681.         call    render_bullet
  682.         call    render_enemies                                                  ; Draw the enemies to buffer
  683.         stdcall aimgtoimg, img_ship, [ship_x], SHIP_Y_POS, vscreen, TRANSPARENCY; Draw the ship to buffer
  684.  
  685.         mov     esi, scoretext
  686.         mov     ebx, 0
  687.         mov     ecx, SCREEN_Y-24
  688.         call    printtext
  689.  
  690.         mov     esi, leveltext
  691.         mov     ebx, 300
  692.         call    printtext
  693.  
  694.         ret
  695.  
  696.  
  697. render_gameover:
  698.  
  699.         stdcall aimgtoimg, img_ship, [ship_x], SHIP_Y_POS, vscreen, TRANSPARENCY; Draw the ship to buffer
  700.  
  701.         mov     esi, scoretext
  702.         mov     ebx, 0
  703.         mov     ecx, SCREEN_Y-24
  704.         call    printtext
  705.  
  706.         mov     esi, leveltext
  707.         mov     ebx, 300
  708.         call    printtext
  709.         stdcall aimgtoimg, img_gameover, 150, 180, vscreen, TRANSPARENCY
  710.  
  711.         ret
  712.  
  713.  
  714. render_about:
  715.  
  716.         mov     esi, msgAbout
  717.         mov     ebx, 50
  718.         mov     ecx, 100
  719.         call    printtext
  720.  
  721.         ret
  722.  
  723.  
  724. render_levelup:
  725.  
  726.         stdcall aimgtoimg, img_ship, [ship_x], SHIP_Y_POS, vscreen, TRANSPARENCY; Draw the ship to buffer
  727.  
  728.         mov     esi, scoretext
  729.         mov     ebx, 0
  730.         mov     ecx, SCREEN_Y-24
  731.         call    printtext
  732.  
  733.         mov     esi, leveltext
  734.         mov     ebx, 300
  735.         call    printtext
  736.         stdcall aimgtoimg, img_levelup, 150, 180, vscreen, TRANSPARENCY
  737.  
  738.         ret
  739.  
  740.  
  741. render_menu:
  742.  
  743.         stdcall aimgtoimg, img_logo, 50, 80, vscreen, TRANSPARENCY
  744.  
  745.         cmp     [menu], 0
  746.         jne     .menu_0
  747.         stdcall aimgtoimg2, img_menu1, 30, 200, vscreen, TRANSPARENCY
  748.         jmp     .menu_1
  749.   .menu_0:
  750.         stdcall aimgtoimg, img_menu1, 30, 200, vscreen, TRANSPARENCY
  751.   .menu_1:
  752.         cmp     [menu], 1
  753.         jne     .menu_2
  754.         stdcall aimgtoimg2, img_menu2, 80, 250, vscreen, TRANSPARENCY
  755.         jmp     .menu_3
  756.   .menu_2:
  757.         stdcall aimgtoimg, img_menu2, 80, 250, vscreen, TRANSPARENCY
  758.   .menu_3:
  759.         cmp     [menu], 2
  760.         jne     .menu_4
  761.         stdcall aimgtoimg2, img_menu3, 120, 300, vscreen, TRANSPARENCY
  762.         jmp     .menu_5
  763.   .menu_4:
  764.         stdcall aimgtoimg, img_menu3, 120, 300, vscreen,TRANSPARENCY
  765.   .menu_5:
  766.         cmp     [menu], 3
  767.         jne     .menu_6
  768.         stdcall aimgtoimg2, img_menu4, 150, 350, vscreen, TRANSPARENCY
  769.         jmp     .menu_7
  770.   .menu_6:
  771.         stdcall aimgtoimg, img_menu4, 150, 350, vscreen, TRANSPARENCY
  772.   .menu_7:
  773.  
  774.         cmp     [intro], 200
  775.         je      .menu_75
  776.         inc     [intro]
  777.  
  778.   .menu_75:
  779.         cmp     [intro], 0
  780.         jl      .menu_8
  781.         stdcall aimgtoimg, img_enemy1, 390, 180, vscreen, TRANSPARENCY
  782.  
  783.         cmp     [intro], 15
  784.         jl      .menu_8
  785.         mov     esi, points_50
  786.         mov     ebx, 470
  787.         mov     ecx, 180
  788.         call    printtext
  789.  
  790.         cmp     [intro],30
  791.         jl      .menu_8
  792.         stdcall aimgtoimg, img_enemy2, 390, 220, vscreen, TRANSPARENCY
  793.  
  794.         cmp     [intro], 45
  795.         jl      .menu_8
  796.         mov     esi, points_100
  797.         mov     ebx, 450
  798.         mov     ecx, 220
  799.         call    printtext
  800.  
  801.         cmp     [intro], 60
  802.         jl      .menu_8
  803.         stdcall aimgtoimg, img_enemy3, 390, 260, vscreen, TRANSPARENCY
  804.  
  805.         cmp     [intro], 75
  806.         jl      .menu_8
  807.         mov     esi, points_150
  808.         mov     ebx, 450
  809.         mov     ecx, 260
  810.         call    printtext
  811.  
  812.         cmp     [intro],90
  813.         jl      .menu_8
  814.         stdcall aimgtoimg, img_enemy4, 390, 300, vscreen, TRANSPARENCY
  815.  
  816.         cmp     [intro], 105
  817.         jl      .menu_8
  818.         mov     esi, points_200
  819.         mov     ebx, 450
  820.         mov     ecx, 300
  821.         call    printtext
  822.  
  823.         cmp     [intro], 120
  824.         jl      .menu_8
  825.         stdcall aimgtoimg, img_enemy5, 390, 340, vscreen, TRANSPARENCY
  826.  
  827.         cmp     [intro],135
  828.         jl      .menu_8
  829.         mov     esi, points_250
  830.         mov     ebx, 450
  831.         mov     ecx, 340
  832.         call    printtext
  833.  
  834.         cmp     [intro],150
  835.         jl      .menu_8
  836.         stdcall aimgtoimg, img_alien, 380, 380, vscreen, TRANSPARENCY
  837.  
  838.         cmp     [intro],165
  839.         jl      .menu_8
  840.         mov     esi, points_1000
  841.         mov     ebx, 430
  842.         mov     ecx, 380
  843.         call    printtext
  844.  
  845.     .menu_8:
  846.         ret
  847.  
  848.  
  849. render_highscorelist:
  850.  
  851.         stdcall aimgtoimg, img_highscore, 60, 40, vscreen, TRANSPARENCY
  852.  
  853.         mov     ebx, 100                        ; print names
  854.         mov     ecx, 120
  855.         mov     esi, highscorebuffer
  856.         call    printtext
  857.  
  858.         mov     edi, highscorebuffer+100        ; print scores
  859.         mov     esi, scorenumb
  860.         mov     ebx, 420
  861.         mov     ecx, 120
  862.  
  863.   .loop:
  864.         mov     eax,[edi]
  865.         push    ecx
  866.         call    convertscore
  867.         pop     ecx
  868.         push    esi
  869.         call    printtext
  870.         pop     esi
  871.         add     ecx, 26
  872.         add     edi, 4
  873.         cmp     edi, highscorebuffer+140
  874.         jl      .loop
  875.  
  876.         ret
  877.  
  878.  
  879. render_highscore:
  880.  
  881.         stdcall aimgtoimg, img_highscore, 60, 40, vscreen, TRANSPARENCY
  882.  
  883.         mov     ebx, 60
  884.         mov     ecx, 200
  885.         mov     esi, entername
  886.         call    printtext
  887.  
  888.         mov     ebx, 250
  889.         mov     ecx, 250
  890.         mov     esi, name
  891.         call    printtext
  892.  
  893.         mov     esi, scoretext
  894.         mov     ebx, 0
  895.         mov     ecx, SCREEN_Y-24
  896.         call    printtext
  897.  
  898.         mov     esi, leveltext
  899.         mov     ebx, 300
  900.         call    printtext
  901.  
  902.         ret
  903.  
  904.  
  905. render_enemies:
  906. ; check if direction should change
  907.         test    [enemy_d], 2
  908.         jz      @f
  909.  
  910.         add     [enemy_y], 5
  911.  
  912.         mov     eax, [enemy_y]
  913.         shr     eax, 5
  914.         add     al, [level]
  915.         mov     [enemy_speed], al
  916.  
  917.         and     [enemy_d], 1
  918.  
  919.        @@:
  920. ; move the aliens to left or right
  921.         movzx   eax, [enemy_speed]
  922.         test    [enemy_d], 1
  923.         jz      .other_dir
  924.  
  925.         sub     [enemy_x], eax
  926.         jmp     .no_other_dir
  927.  
  928.   .other_dir:
  929.         add     [enemy_x], eax
  930.   .no_other_dir:
  931.  
  932. ; initialization
  933.         mov     [alldeadb],1
  934.         mov     edi, enemy_table
  935.         mov     eax, [enemy_x]
  936.         mov     [current_enemy_x], eax
  937.         mov     eax, [enemy_y]
  938.         mov     [current_enemy_y], eax
  939.  
  940.   .loopit:
  941.         movzx   eax, byte[edi]
  942.         test    al, al
  943.         jz      .next_alien
  944.         cmp     al, 5
  945.         ja      .next_alien
  946.         dec     eax
  947.         mov     eax, [enemy_img_list+eax*4]
  948.  
  949.   .drawenemy:
  950.         mov     [alldeadb], 0
  951.         stdcall aimgtoimg, eax, [current_enemy_x], [current_enemy_y], vscreen, TRANSPARENCY
  952. ;        jmp  checknext
  953.  
  954.   .checknext:
  955.         cmp     [enemy_d], 2
  956.         jge     .dont_change_dir
  957.  
  958.         movzx   eax, [enemy_speed]
  959.  
  960.         cmp     [enemy_d], 0
  961.         jbe     .change_dir
  962.  
  963.         cmp     dword[current_enemy_x],eax
  964.         jg      .dont_change_dir
  965.  
  966.         mov     [enemy_d], 2
  967.         jmp     .dont_change_dir
  968.  
  969.   .change_dir:
  970.         mov     ebx, SCREEN_X-ENEMY_X
  971.         sub     ebx, eax
  972.         cmp     dword[current_enemy_x],ebx
  973.         jl      .dont_change_dir
  974.  
  975.         mov     [enemy_d], 3
  976.  
  977.   .dont_change_dir:
  978.         cmp     [current_enemy_y], SHIP_Y_POS-ENEMY_Y-BOUNDARY
  979.         jle     .next_alien                                     ;;;;;;
  980.  
  981.         mov     [status], 2
  982.         ret
  983.  
  984.   .next_alien:
  985.         cmp     edi, enemy_table+20
  986.         jge     .alldead
  987.  
  988.         inc     edi
  989.         add     dword[current_enemy_x],ENEMY_X+BOUNDARY
  990.         mov     eax,dword[current_enemy_x]
  991.         sub     eax,dword[enemy_x]
  992.         cmp     eax,5*(ENEMY_X+BOUNDARY)
  993.         jl      .no_newline
  994.  
  995.         sub     [current_enemy_x], 5*(ENEMY_X+BOUNDARY)
  996.         add     [current_enemy_y], ENEMY_Y+BOUNDARY
  997.   .no_newline:
  998.         jmp     .loopit
  999.  
  1000.   .alldead:
  1001.         cmp     [alldeadb], 0
  1002.         je      .enemy_end
  1003.  
  1004.         mov     [status], 6
  1005.         ret
  1006.  
  1007.   .enemy_end:
  1008.         cmp     [alien_x], 5
  1009.         jge     @f
  1010.  
  1011.         call    random_generator
  1012.         cmp     eax,0xffffffff/50 ; one out of 500 chances that it appears during this frame
  1013.         jl      .alien_end
  1014.         mov     [alien_x], SCREEN_X-ALIEN_X
  1015.   @@:
  1016.         push    eax
  1017.  
  1018.         mov     eax, SCREEN_X                                                                                                                                                                                                                                 ;        mov  eax, SCREEN_X
  1019.         sub     eax, dword [alien_x]
  1020.  
  1021.         cmp     eax, ALIEN_X
  1022.         jle     @f
  1023.         mov     eax, ALIEN_X
  1024.   @@:
  1025.  
  1026. ;        stdcall getimg, img_alien, 0, 0, 10, ALIEN_Y, img_alienpiece
  1027.         stdcall aimgtoimg, img_alien, [alien_x], ALIEN_Y_POS, vscreen, TRANSPARENCY
  1028.         sub     [alien_x], 5
  1029.  
  1030.         pop     eax
  1031.  
  1032.   .alien_end:
  1033.         ret
  1034.  
  1035.  
  1036.  
  1037. render_bullet:
  1038.         cmp     [bullet_y], BULLETSPEED
  1039.         jl      .nobullet
  1040.         sub     [bullet_y], BULLETSPEED
  1041.  
  1042.         stdcall aimgtoimg, img_bullet, [bullet_x], [bullet_y], vscreen, TRANSPARENCY
  1043.  
  1044.   .nobullet:
  1045.         ret
  1046.  
  1047.  
  1048.  
  1049. bullet_collision_detection:
  1050.  
  1051.         cmp     [bullet_y], BULLETSPEED         ; does the bullet hit top of the screen?
  1052.         jle     .hidebullet                     ; yes, hide bullet
  1053.  
  1054.         mov     edi, enemy_table
  1055.         mov     eax, [enemy_x]
  1056.         mov     [current_enemy_x], eax
  1057.         mov     eax, [enemy_y]
  1058.         mov     [current_enemy_y], eax
  1059.  
  1060.   .check:
  1061.         cmp     byte[edi],0                     ; is the enemy at this position alive?
  1062.         je      .nextcheck                      ; no, try next enemy
  1063.         ; check if bullet hits current enemy
  1064.  
  1065.         mov     eax, [current_enemy_y]          ; move the enemy y position into eax
  1066.         cmp     [bullet_y], eax                 ; is the bullet's y position less than eax (enemy y pos)
  1067.         jl      .nextcheck                      ; yes, bullet can't be colliding, check next enemy
  1068.  
  1069.         add     eax, ENEMY_Y                    ; add the width of the enemy to the enemy's y position (wich is still stored in eax)
  1070.         cmp     [bullet_y], eax                 ; is the bullet's y position greater than eax (the end of the enemy)
  1071.         jg      .nextcheck                      ; yes, bullet can't be colliding, check next enemy
  1072.  
  1073.         mov     eax, [current_enemy_x]          ; now do the same but for the x positions
  1074.         cmp     [bullet_x], eax                 ;
  1075.         jl      .nextcheck                      ;
  1076.                                                 ;
  1077.         add     eax, ENEMY_Y                    ;
  1078.         cmp     [bullet_x], eax                 ;
  1079.         jg      .nextcheck                      ;
  1080.  
  1081.         jmp     .hit
  1082.  
  1083.   .nextcheck:
  1084.         inc     edi
  1085.         add     [current_enemy_x], ENEMY_X+BOUNDARY
  1086.         mov     eax, [current_enemy_x]
  1087.         sub     eax, [enemy_x]
  1088.         cmp     eax, 5*(ENEMY_X+BOUNDARY)
  1089.         jl      .no_newline
  1090.  
  1091.         sub     [current_enemy_x], 5*(ENEMY_X+BOUNDARY)
  1092.         add     [current_enemy_y], ENEMY_Y+BOUNDARY
  1093.   .no_newline:
  1094.  
  1095.         cmp     edi, enemy_table+20             ; is this the last enemy?
  1096.         jg      .nohit                          ; yes, none of them was hit
  1097.         jmp     .check                          ; no, check if enemy is alive and draw it
  1098.  
  1099.   .hit:
  1100.         movzx   ebx, byte[edi]                  ; mov the enemy number onto ebx
  1101.         add     [score], ebx                    ; add this number to the score dword
  1102.  
  1103.         mov     eax,[score]
  1104.         call    convertscore
  1105.  
  1106.         mov     byte[edi],0                     ; hide the enemy
  1107.   .hidebullet:
  1108.         mov     [bullet_y], 1                   ; mov the bullet to top of screen (hide it)
  1109.         jmp     .noalienhit
  1110.  
  1111.   .nohit:
  1112.         mov     eax, [alien_x]                  ; check if we hit the big alien in the ufo
  1113.         cmp     [bullet_x], eax
  1114.         jl      .noalienhit
  1115.         add     eax, ALIEN_X-BULLET_X
  1116.         cmp     [bullet_x], eax
  1117.         jg      .noalienhit
  1118.         cmp     [bullet_y], ALIEN_Y_POS+ALIEN_Y
  1119.         jg      .noalienhit
  1120.  
  1121.         add     [score], 100/5
  1122.         mov     eax, [score]
  1123.         call    convertscore
  1124.  
  1125.         mov     [alien_x], 0
  1126.  
  1127.   .noalienhit:
  1128.         ret
  1129.  
  1130.  
  1131.  
  1132. convertscore:
  1133.  
  1134.         test    al,1
  1135.         jz      .1
  1136.         mov     byte[scorenumb+5],'5'
  1137.         jmp     .2
  1138.   .1:
  1139.         mov     byte[scorenumb+5],'0'
  1140.   .2:
  1141.         shr     eax,1
  1142.         mov     ecx,10
  1143.         xor     edx,edx
  1144.         div     ecx
  1145.         add     dl,'0'
  1146.         mov     byte[scorenumb+4],dl
  1147.         xor     edx,edx
  1148.         div     ecx
  1149.         add     dl,'0'
  1150.         mov     byte[scorenumb+3],dl
  1151.         xor     edx,edx
  1152.         div     ecx
  1153.         add     dl,'0'
  1154.         mov     byte[scorenumb+2],dl
  1155.         xor     edx,edx
  1156.         div     ecx
  1157.         add     dl,'0'
  1158.         mov     byte[scorenumb+1],dl
  1159.         xor     edx,edx
  1160.         div     ecx
  1161.         add     dl,'0'
  1162.         mov     byte[scorenumb+0],dl
  1163.  
  1164.         ret
  1165.  
  1166.  
  1167. fillscreen: ; eax - screen color ( 0x00RRGGBB )
  1168.  
  1169.         mov     edi, vscreen+8
  1170.         cld
  1171.         mov     ecx, SCREEN_X*SCREEN_Y
  1172.     .lab1:
  1173.         mov     [edi], eax
  1174.         add     edi, 3
  1175.         loop    .lab1
  1176.  
  1177.         ret
  1178.  
  1179.  
  1180. printtext:
  1181.  
  1182.         push    ebx
  1183.  
  1184.   .loop:
  1185.         lodsb
  1186.         test    al, al
  1187.         jz      .done
  1188.         cmp     al, 13
  1189.         je      .nextline
  1190.         cmp     al,' '
  1191.         je      .space
  1192.  
  1193.         cmp     al,'0'
  1194.         jl      .loop
  1195.         cmp     al,'9'
  1196.         jle     .usenumbers
  1197.  
  1198.         cmp     al,'z'
  1199.         jg      .loop
  1200.         cmp     al,'a'
  1201.         jge     .usesmallfont
  1202.  
  1203.         cmp     al,'Z'
  1204.         jg      .loop
  1205.         cmp     al,'A'
  1206.         jge     .usebigfont
  1207.         jmp     .loop
  1208.  
  1209.   .usesmallfont:
  1210.         movzx   edx, al
  1211.         sub     edx, 'a'
  1212.         mov     eax, 12
  1213.         mul     edx
  1214.  
  1215.         stdcall getimg, img_smallfont, 0, eax, 20, 12, img_char
  1216.         push    ecx
  1217.         add     ecx, 4
  1218.         stdcall aimgtoimg, img_char, ebx, ecx, vscreen, TRANSPARENCY
  1219.         pop     ecx
  1220.         add     ebx, 20
  1221.         jmp     .loop
  1222.  
  1223.   .usebigfont:
  1224.         movzx   edx, al
  1225.         sub     edx, 'A'
  1226.         mov     eax, 20
  1227.         mul     edx
  1228.  
  1229.         stdcall getimg, img_bigfont, 0, eax, 28, 20, img_char
  1230.         stdcall aimgtoimg, img_char, ebx, ecx, vscreen, TRANSPARENCY
  1231.         add     ebx, 28
  1232.         jmp     .loop
  1233.  
  1234.   .usenumbers:
  1235.         movzx   edx, al
  1236.         sub     edx, '0'
  1237.         mov     eax, 20
  1238.         mul     edx
  1239.  
  1240.         stdcall getimg, img_numbers, 0, eax, 16, 20, img_char
  1241.         stdcall aimgtoimg, img_char, ebx, ecx, vscreen, TRANSPARENCY
  1242.         add     ebx, 20
  1243.         jmp     .loop
  1244.  
  1245.   .space:
  1246.         add     ebx, 20
  1247.         jmp     .loop
  1248.  
  1249.   .nextline:
  1250.         pop     ebx
  1251.         push    ebx
  1252.         add     ecx, 26
  1253.         jmp     .loop
  1254.  
  1255.   .done:
  1256.         pop     ebx
  1257.         ret
  1258.  
  1259.  
  1260. init_starfield:
  1261.  
  1262.         mov     ebx, STARS
  1263.   .loop:
  1264.         cmp     ebx, STARS+(STARS_*5)
  1265.         jge     .done
  1266.  
  1267.         call    random_generator
  1268.         and     al, STARLEVELS
  1269.         test    al,al
  1270.         jnz     @f
  1271.         inc     al
  1272.   @@:
  1273.         mov     byte[ebx],al
  1274.  
  1275.         call    random_generator
  1276.         and     eax, SCREEN_X-1
  1277.         inc     eax
  1278.         mov     word[ebx+1],ax
  1279.  
  1280.         call    random_generator
  1281.         and     eax, SCREEN_Y-1
  1282.         inc     eax
  1283.         mov     word[ebx+3],ax
  1284.  
  1285.         add     ebx, 5
  1286.         jmp     .loop
  1287.   .done:
  1288.         ret
  1289.  
  1290.  
  1291. render_starfield:
  1292.  
  1293.         mov     esi, STARS
  1294.   .loop:
  1295.         cmp     esi, STARS+(STARS_*5)
  1296.         jge     .done
  1297.  
  1298.         movzx   eax, byte[esi]    ; z (speed, brightness)
  1299.         movzx   ebx, word[esi+1]  ; x
  1300.         movzx   ecx, word[esi+3]  ; y
  1301.         add     bx, ax
  1302.         cmp     bx, SCREEN_X
  1303.         jl      .moveit
  1304.  
  1305.         xor     ebx, ebx
  1306.         inc     ebx
  1307.  
  1308.         call    random_generator
  1309.         mov     ecx, [generator]
  1310.         and     ecx, SCREEN_Y-1
  1311.         inc     ecx
  1312.         mov     word[esi+3], cx
  1313.  
  1314.         call    random_generator
  1315.         and     al, STARLEVELS
  1316.         test    al, al
  1317.         jnz     @f
  1318.         inc     al
  1319.    @@:
  1320.         mov     [esi], al
  1321.  
  1322.   .moveit:
  1323.         mov     word[esi+1], bx
  1324.  
  1325.         movzx   eax, byte[esi]
  1326.         inc     eax
  1327.         mov     edx, 0xff/(STARLEVELS+1)
  1328.         mul     edx
  1329.  
  1330.         mov     ah, al
  1331.         shl     eax, 8
  1332.         mov     al, ah
  1333.         mov     ebp, eax
  1334.  
  1335.         mov     eax, SCREEN_X
  1336.         mul     ecx
  1337.         add     eax, ebx
  1338.         mov     edx, 3
  1339.         mul     edx
  1340.  
  1341.         cmp     eax, SCREEN_X*SCREEN_Y*3
  1342.         jg      @f
  1343.         add     eax, vscreen+8
  1344.         and     dword[eax], 0xff000000
  1345.         or      dword[eax], ebp
  1346.   @@:
  1347.  
  1348.         add     esi, 5
  1349.         jmp     .loop
  1350.  
  1351.   .done:
  1352.         ret
  1353.  
  1354. random_generator:  ; (pseudo random, actually :)
  1355.  
  1356.         xor     eax, [generator]
  1357.         imul    eax, 214013
  1358.         xor     eax, 0xdeadbeef
  1359.         rol     eax, 9
  1360.         mov     [generator], eax
  1361.         ror     eax, 16
  1362.         and     eax, 0x7fff
  1363.  
  1364.         ret
  1365.  
  1366.  
  1367.  
  1368.  
  1369. level1:
  1370. db 4,4,4,4,4
  1371. db 3,3,3,3,3
  1372. db 2,2,2,2,2
  1373. db 1,1,1,1,1
  1374.  
  1375. level2:
  1376. db 4,1,3,1,4
  1377. db 4,3,2,3,4
  1378. db 0,4,1,4,0
  1379. db 0,0,2,0,0
  1380.  
  1381. level3:
  1382. db 1,5,5,5,1
  1383. db 1,2,2,2,1
  1384. db 3,1,2,1,3
  1385. db 4,3,1,3,4
  1386.  
  1387. level4:
  1388. db 4,5,2,5,4
  1389. db 5,3,3,3,5
  1390. db 4,5,4,5,4
  1391. db 1,5,5,5,1
  1392.  
  1393. level5:
  1394. db 5,4,3,4,5
  1395. db 5,4,4,4,5
  1396. db 4,5,4,5,4
  1397. db 3,5,1,5,3
  1398.  
  1399. level6:
  1400. db 1,2,5,4,5
  1401. db 5,4,5,2,1
  1402. db 1,2,5,4,5
  1403. db 1,1,5,1,1
  1404.  
  1405. level7:
  1406. db 1,2,3,2,1
  1407. db 1,3,3,3,1
  1408. db 3,4,3,4,3
  1409. db 5,5,5,5,5
  1410.  
  1411. level8:
  1412. db 1,2,3,4,5
  1413. db 3,5,3,5,4
  1414. db 4,2,3,2,3
  1415. db 5,4,3,2,1
  1416.  
  1417. enemy_table:
  1418. db 0,0,0,0,0
  1419. db 0,0,0,0,0
  1420. db 0,0,0,0,0
  1421. db 0,0,0,0,0
  1422.  
  1423. msgAbout        db 'Hidnplayrs invaders',13,'KolibriOS version',13,13,'released under GPL',13,'make this game better',13,'if you want to',0
  1424. title           db 'Invaders',0
  1425. msgdone         db 'You have saved the planet!',0
  1426. entername       db 'Enter your name highscorer!',0
  1427. highscorefile   db 'invaders.dat',0
  1428. points_50       db '5 pt',0
  1429. points_100      db '10 pt',0
  1430. points_150      db '15 pt',0
  1431. points_200      db '20 pt',0
  1432. points_250      db '25 pt',0
  1433. points_1000     db '100 pt',0
  1434. ship_x          dd SHIP_X_POS
  1435. enemy_x         dd 0
  1436. enemy_y         dd 0
  1437. enemy_d         db 0
  1438. current_enemy_x dd 0
  1439. current_enemy_y dd 0
  1440. bullet_x        dd 0
  1441. bullet_y        dd 1
  1442. score           dd 0
  1443. alldeadb        db 0
  1444. status          db 0        ; status: 0=menu  1=game  2=gameover   3=paused  4=about 5=highscorelist 6=levelup 7=highscore...
  1445. menu            db 0        ; menu:   0=start 1=about 2=highscores 3=exit...
  1446. generator       dd 0x45dd4d15
  1447. alien_x         dd 0
  1448. ;drawroutine     dd 0
  1449. returnaddr      dd 0
  1450. intro           dw 0
  1451. scoretext       db 'score '
  1452. scorenumb       db 0,0,0,0,0,0,0
  1453. leveltext       db 'level '
  1454. levelnumb       db 0,0,0
  1455. lives           db 0
  1456. level           db 1
  1457. enemy_speed     db 1
  1458. namepos         db 0
  1459. name            db 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0d,0x00
  1460.  
  1461. enemy_img_list:
  1462.         dd      img_enemy1
  1463.         dd      img_enemy2
  1464.         dd      img_enemy3
  1465.         dd      img_enemy4
  1466.         dd      img_enemy5
  1467.  
  1468.  
  1469. gif_bullet      file 'bullet2.gif'
  1470.   .size = $ - gif_bullet
  1471. gif_bullet2     file 'bullet2.gif'
  1472.   .size = $ - gif_bullet2
  1473. gif_ship        file 'ship.gif'
  1474.   .size = $ - gif_ship
  1475. gif_enemy1      file 'enemy1.gif'
  1476.   .size = $ - gif_enemy1
  1477. gif_enemy2      file 'enemy2.gif'
  1478.   .size = $ - gif_enemy2
  1479. gif_enemy3      file 'enemy3.gif'
  1480.   .size = $ - gif_enemy3
  1481. gif_enemy4      file 'enemy4.gif'
  1482.   .size = $ - gif_enemy4
  1483. gif_enemy5      file 'enemy5.gif'
  1484.   .size = $ - gif_enemy5
  1485. gif_alien       file 'alien.gif'
  1486.   .size = $ - gif_alien
  1487. gif_menu1       file 'menu1.gif'
  1488.   .size = $ - gif_menu1
  1489. gif_menu2       file 'menu2.gif'
  1490.   .size = $ - gif_menu2
  1491. gif_menu3       file 'menu3.gif'
  1492.   .size = $ - gif_menu3
  1493. gif_menu4       file 'menu4.gif'
  1494.   .size = $ - gif_menu3
  1495. gif_logo        file 'logo.gif'
  1496.   .size = $ - gif_logo
  1497. gif_pause       file 'pause.gif'
  1498.   .size = $ - gif_pause
  1499. gif_highscore   file 'highscores.gif'
  1500.   .size = $ - gif_highscore
  1501. gif_smallfont   file 'font_small.gif'
  1502.   .size = $ - gif_smallfont
  1503. gif_bigfont     file 'font_capital.gif'
  1504.   .size = $ - gif_bigfont
  1505. gif_numbers     file 'numbers.gif'
  1506.   .size = $ - gif_numbers
  1507. gif_levelup     file 'nextlevel.gif'
  1508.   .size = $ - gif_levelup
  1509. gif_gameover    file 'gameover.gif'
  1510.   .size = $ - gif_gameover
  1511.  
  1512. align 16
  1513. @IMPORT:
  1514.  
  1515. library                         \
  1516.         libimg , 'libimg.obj'
  1517.  
  1518. import  libimg                     , \
  1519.         libimg.init , 'lib_init'   , \
  1520.         img.decode  , 'img_decode' , \
  1521.         img.to_rgb2 , 'img_to_rgb2', \
  1522.         img.destroy , 'img_destroy'
  1523.  
  1524.  
  1525. vscreen:
  1526.                 dd SCREEN_X
  1527.                 dd SCREEN_Y
  1528.                 rb SCREEN_X*SCREEN_Y*3
  1529.  
  1530. IM_END:
  1531.  
  1532. STARS           rb STARS_*5
  1533.  
  1534. img_bullet      rb BULLET_X*BULLET_Y*3+8
  1535. img_bullet2     rb BULLET_X*BULLET_Y*3+8
  1536. img_ship        rb SHIP_X*SHIP_Y*3+8
  1537. img_enemy1      rb ENEMY_X*ENEMY_Y*3+8
  1538. img_enemy2      rb ENEMY_X*ENEMY_Y*3+8
  1539. img_enemy3      rb ENEMY_X*ENEMY_Y*3+8
  1540. img_enemy4      rb ENEMY_X*ENEMY_Y*3+8
  1541. img_enemy5      rb ENEMY_X*ENEMY_Y*3+8
  1542. img_alien       rb ALIEN_X*ALIEN_Y*3+8
  1543. img_menu1       rb 220*18*3+8
  1544. img_menu2       rb 135*18*3+8
  1545. img_menu3       rb 245*18*3+8
  1546. img_menu4       rb 110*18*3+8
  1547. img_logo        rb 40*540*3+8
  1548. img_pause       rb 40*320*3+8
  1549. img_levelup     rb 40*320*3+8
  1550. img_gameover    rb 40*320*3+8
  1551. img_highscore   rb 40*530*3+8
  1552. img_smallfont   rb 20*312*3+8
  1553. img_bigfont     rb 28*520*3+8
  1554. img_numbers     rb 16*200*3+8
  1555.  
  1556. img_char        rb 28*20*3+8
  1557. img_alienpiece  rb ALIEN_X*ALIEN_Y*3+8
  1558.  
  1559. highscorebuffer rb 1024
  1560.  
  1561. I_END: