50,7 → 50,7 |
BULLET_X equ 10 |
BULLET_Y equ 10 |
|
STARS_ equ 226 |
STARS_ equ 226 |
STARLEVELS equ 3 |
|
ENEMY_STARTING_X equ 25 |
67,36 → 67,36 |
include 'invaders_kolibri.inc' |
|
decodegif: |
giftoimg gif_bullet,bullet |
giftoimg gif_bullet2,bullet2 |
giftoimg gif_ship,ship |
giftoimg gif_enemy1,enemy1 |
giftoimg gif_enemy2,enemy2 |
giftoimg gif_enemy3,enemy3 |
giftoimg gif_enemy4,enemy4 |
giftoimg gif_enemy5,enemy5 |
giftoimg gif_alien,alien |
giftoimg gif_menu1,menu1 |
giftoimg gif_menu2,menu2 |
giftoimg gif_menu3,menu3 |
giftoimg gif_menu4,menu4 |
giftoimg gif_logo,logo |
giftoimg gif_pause,pause_ |
giftoimg gif_levelup,levelup |
giftoimg gif_gameover,gameover |
giftoimg gif_highscore,highscore |
giftoimg gif_smallfont,smallfont |
giftoimg gif_bigfont,bigfont |
giftoimg gif_numbers,numbers |
giftoimg gif_bullet,bullet |
giftoimg gif_bullet2,bullet2 |
giftoimg gif_ship,ship |
giftoimg gif_enemy1,enemy1 |
giftoimg gif_enemy2,enemy2 |
giftoimg gif_enemy3,enemy3 |
giftoimg gif_enemy4,enemy4 |
giftoimg gif_enemy5,enemy5 |
giftoimg gif_alien,alien |
giftoimg gif_menu1,menu1 |
giftoimg gif_menu2,menu2 |
giftoimg gif_menu3,menu3 |
giftoimg gif_menu4,menu4 |
giftoimg gif_logo,logo |
giftoimg gif_pause,pause_ |
giftoimg gif_levelup,levelup |
giftoimg gif_gameover,gameover |
giftoimg gif_highscore,highscore |
giftoimg gif_smallfont,smallfont |
giftoimg gif_bigfont,bigfont |
giftoimg gif_numbers,numbers |
|
call createstars |
call drawit |
call [drawroutine] |
call createstars |
call drawit |
call [drawroutine] |
|
mainloop: |
|
cmp byte[status],3 ; if game is paused,... |
je waitfordraw |
je waitfordraw |
|
call drawit |
call [drawroutine] |
106,51 → 106,51 |
|
call waitandgetkey ;;; |
test ah,ah |
jz mainloop |
jz mainloop |
|
cmp byte[status],1 ; |
jne nogame |
|
cmp ah, KEY_RIGHT |
jnz noright |
cmp dword[ship_x],SCREEN_X-SHIP_X-BOUNDARY |
jge mainloop |
add dword[ship_x],MOVEMENT |
cmp ah, KEY_RIGHT |
jnz noright |
cmp dword[ship_x],SCREEN_X-SHIP_X-BOUNDARY |
jge mainloop |
add dword[ship_x],MOVEMENT |
|
jmp mainloop |
jmp mainloop |
|
noright: |
cmp ah, KEY_LEFT |
jnz noleft |
cmp dword[ship_x],BOUNDARY |
jle mainloop |
sub dword[ship_x],MOVEMENT |
cmp ah, KEY_LEFT |
jnz noleft |
cmp dword[ship_x],BOUNDARY |
jle mainloop |
sub dword[ship_x],MOVEMENT |
|
jmp mainloop |
jmp mainloop |
|
noleft: |
cmp ah, KEY_UP |
jnz noup |
cmp ah, KEY_UP |
jnz noup |
|
cmp dword[bullet_y],1 |
jg mainloop |
cmp dword[bullet_y],1 |
jg mainloop |
|
mov eax,dword[ship_x] |
add eax,(SHIP_X-BULLET_X)/2 |
mov dword[bullet_x],eax |
mov dword[bullet_y],SHIP_Y_POS;-BULLET_Y |
mov eax,dword[ship_x] |
add eax,(SHIP_X-BULLET_X)/2 |
mov dword[bullet_x],eax |
mov dword[bullet_y],SHIP_Y_POS;-BULLET_Y |
|
jmp mainloop |
jmp mainloop |
|
noup: |
cmp ah,KEY_P |
jnz no_pause1 |
cmp ah,KEY_P |
jnz no_pause1 |
|
mov byte[status],3 |
aimgtoimg pause_,150,180,vscreen,TRANSPARENCY,0 |
call [drawroutine] |
mov byte[status],3 |
aimgtoimg pause_,150,180,vscreen,TRANSPARENCY,0 |
call [drawroutine] |
|
jmp mainloop |
jmp mainloop |
|
no_pause1: |
|
158,80 → 158,80 |
cmp byte[status],0 |
jne nomenu |
|
cmp ah, KEY_DOWN |
jnz no_down |
cmp ah, KEY_DOWN |
jnz no_down |
|
cmp byte[menu],3 |
jne no_menu1 |
cmp byte[menu],3 |
jne no_menu1 |
|
mov byte[menu],0 |
jmp nomenu |
mov byte[menu],0 |
jmp nomenu |
|
no_menu1: |
inc byte[menu] |
inc byte[menu] |
|
no_down: |
cmp ah, KEY_UP |
jnz no_up |
cmp ah, KEY_UP |
jnz no_up |
|
cmp byte[menu],0 |
jne no_menu0 |
cmp byte[menu],0 |
jne no_menu0 |
|
mov byte[menu],3 |
jmp nomenu |
mov byte[menu],3 |
jmp nomenu |
|
no_menu0: |
dec byte[menu] |
dec byte[menu] |
|
no_up: |
|
cmp ah, KEY_ESC |
je exit |
cmp ah, KEY_ESC |
je exit |
|
no_esc: |
cmp ah, KEY_ENTER |
jnz no_enter |
cmp ah, KEY_ENTER |
jnz no_enter |
|
exemenu: |
cmp byte[menu],0 ;start |
jne exemenu1 |
exemenu: |
cmp byte[menu],0 ;start |
jne exemenu1 |
|
new_game: |
mov dword[score],0 |
mov eax,[score] |
call convertscore |
new_game: |
mov dword[score],0 |
mov eax,[score] |
call convertscore |
|
mov esi, level1 |
mov word[levelnumb],'01' |
load_level: |
mov byte[enemy_speed],1 |
mov dword[enemy_x], ENEMY_STARTING_X |
mov dword[enemy_y], ENEMY_STARTING_Y |
mov esi, level1 |
mov word[levelnumb],'01' |
load_level: |
mov byte[enemy_speed],1 |
mov dword[enemy_x], ENEMY_STARTING_X |
mov dword[enemy_y], ENEMY_STARTING_Y |
|
mov edi, enemy_table |
mov ecx, 5 |
rep movsd |
mov edi, enemy_table |
mov ecx, 5 |
rep movsd |
|
mov byte[status],1 |
mov byte[status],1 |
|
jmp mainloop |
jmp mainloop |
|
exemenu1: |
cmp byte[menu],1 ;about |
jne exemenu2 |
mov byte[status],4 |
jmp mainloop |
exemenu1: |
cmp byte[menu],1 ;about |
jne exemenu2 |
mov byte[status],4 |
jmp mainloop |
|
exemenu2: |
cmp byte[menu],2 ;highscores |
jne exemenu3 |
mov byte[status],5 |
call load_highscores |
jmp mainloop |
exemenu2: |
cmp byte[menu],2 ;highscores |
jne exemenu3 |
mov byte[status],5 |
call load_highscores |
jmp mainloop |
|
exemenu3: |
cmp byte[menu],3 ;exit |
je exit |
exemenu3: |
cmp byte[menu],3 ;exit |
je exit |
|
no_enter: |
nomenu: |
250,7 → 250,7 |
cmp ah, KEY_ENTER |
jne nolevelup |
|
inc byte[level] |
inc byte[level] |
|
; cmp byte[level],5 |
; jne @f |
257,89 → 257,89 |
; mov byte[level],0 |
|
;@@: |
inc byte[levelnumb+1] |
cmp byte[levelnumb+1],'9' |
jle @f |
mov byte[levelnumb+1],'0' |
inc byte[levelnumb] |
inc byte[levelnumb+1] |
cmp byte[levelnumb+1],'9' |
jle @f |
mov byte[levelnumb+1],'0' |
inc byte[levelnumb] |
|
@@: |
mov eax,20 |
mov ah,byte[level] |
and ah,7 |
mul ah |
add eax,level1 |
mov esi,eax |
jmp load_level |
mov eax,20 |
mov ah,byte[level] |
and ah,7 |
mul ah |
add eax,level1 |
mov esi,eax |
jmp load_level |
|
nolevelup: |
cmp byte[status],7 |
jne nohighscore |
|
cmp ah, KEY_ENTER |
jne @f |
cmp ah, KEY_ENTER |
jne @f |
|
call load_highscores |
mov eax,dword[score] |
mov ebx,gif_hash_area+140 |
call load_highscores |
mov eax,dword[score] |
mov ebx,gif_hash_area+140 |
.findscore: |
cmp ebx,gif_hash_area+100 |
je .topscore |
sub ebx,4 |
cmp eax,dword[ebx] |
jg .findscore |
cmp ebx,gif_hash_area+100 |
je .topscore |
sub ebx,4 |
cmp eax,dword[ebx] |
jg .findscore |
|
.topscore: |
mov esi,name |
mov edi,gif_hash_area |
mov ecx,10 |
rep movsb |
mov esi,name |
mov edi,gif_hash_area |
mov ecx,10 |
rep movsb |
|
mov eax,dword[score] |
mov dword[gif_hash_area+100],eax |
mov eax,dword[score] |
mov dword[gif_hash_area+100],eax |
|
call save_highscores |
mov byte[status],5 |
call save_highscores |
mov byte[status],5 |
|
@@: |
cmp ah,14 |
jne @f |
cmp ah,14 |
jne @f |
|
cmp byte[namepos],0 |
je @f |
cmp byte[namepos],0 |
je @f |
|
dec byte[namepos] |
movzx ebx,byte[namepos] |
add ebx,name |
mov byte[ebx],0x11 ; this is a character we dont print |
dec byte[namepos] |
movzx ebx,byte[namepos] |
add ebx,name |
mov byte[ebx],0x11 ; this is a character we dont print |
|
@@: |
cmp byte[namepos],10 |
jge nohighscore |
cmp byte[namepos],10 |
jge nohighscore |
|
cmp al,'0' |
jl nohighscore |
cmp al,'9' |
jle @f |
cmp al,'0' |
jl nohighscore |
cmp al,'9' |
jle @f |
|
cmp al,'z' |
jg nohighscore |
cmp al,'a' |
jge @f |
cmp al,'z' |
jg nohighscore |
cmp al,'a' |
jge @f |
|
cmp al,'Z' |
jg nohighscore |
cmp al,'A' |
jl nohighscore |
cmp al,'Z' |
jg nohighscore |
cmp al,'A' |
jl nohighscore |
@@: |
|
movzx ebx,byte[namepos] |
add ebx,name |
mov byte[ebx],al |
movzx ebx,byte[namepos] |
add ebx,name |
mov byte[ebx],al |
|
inc byte[namepos] |
inc byte[namepos] |
|
jmp mainloop |
jmp mainloop |
|
nohighscore: |
cmp byte[status],2 ; gameover |
348,14 → 348,14 |
cmp ah, KEY_ENTER |
jne nogameover |
|
; test if score is high enough to put in highscore list... |
mov byte[status],7 |
; test if score is high enough to put in highscore list... |
mov byte[status],7 |
|
jmp mainloop |
jmp mainloop |
|
nogameover: |
cmp byte[status],0 |
je mainloop |
je mainloop |
|
cmp ah, KEY_ESC |
jnz mainloop |
376,18 → 376,18 |
cmp byte[status],1 |
jne @f |
|
call drawbullet |
call drawenemys ; Draw the enemy's to buffer |
aimgtoimg ship,dword[ship_x],SHIP_Y_POS,vscreen,TRANSPARENCY,0 ; Draw the ship to buffer |
call drawbullet |
call drawenemys ; Draw the enemy's to buffer |
aimgtoimg ship,dword[ship_x],SHIP_Y_POS,vscreen,TRANSPARENCY,0 ; Draw the ship to buffer |
|
mov esi,scoretext |
mov ebx,0 |
mov ecx,SCREEN_Y-24 |
call printtext |
mov esi,scoretext |
mov ebx,0 |
mov ecx,SCREEN_Y-24 |
call printtext |
|
mov esi,leveltext |
mov ebx,300 |
call printtext |
mov esi,leveltext |
mov ebx,300 |
call printtext |
|
ret |
|
395,210 → 395,210 |
cmp byte[status],2 ; game over, dude ! |
jne @f |
|
aimgtoimg ship,dword[ship_x],SHIP_Y_POS,vscreen,TRANSPARENCY,0 ; Draw the ship to buffer |
aimgtoimg ship,dword[ship_x],SHIP_Y_POS,vscreen,TRANSPARENCY,0 ; Draw the ship to buffer |
|
mov esi,scoretext |
mov ebx,0 |
mov ecx,SCREEN_Y-24 |
call printtext |
mov esi,scoretext |
mov ebx,0 |
mov ecx,SCREEN_Y-24 |
call printtext |
|
mov esi,leveltext |
mov ebx,300 |
call printtext |
aimgtoimg gameover,150,180,vscreen,TRANSPARENCY,0 |
mov esi,leveltext |
mov ebx,300 |
call printtext |
aimgtoimg gameover,150,180,vscreen,TRANSPARENCY,0 |
|
ret |
ret |
|
@@: |
cmp byte[status],4 ; about screen |
jne @f |
|
mov esi,msgAbout |
mov ebx,50 |
mov ecx,100 |
call printtext |
mov esi,msgAbout |
mov ebx,50 |
mov ecx,100 |
call printtext |
|
ret |
ret |
|
@@: |
cmp byte[status],6 ; level up! |
jne @f |
aimgtoimg ship,dword[ship_x],SHIP_Y_POS,vscreen,TRANSPARENCY,0 ; Draw the ship to buffer |
aimgtoimg ship,dword[ship_x],SHIP_Y_POS,vscreen,TRANSPARENCY,0 ; Draw the ship to buffer |
|
mov esi,scoretext |
mov ebx,0 |
mov ecx,SCREEN_Y-24 |
call printtext |
mov esi,scoretext |
mov ebx,0 |
mov ecx,SCREEN_Y-24 |
call printtext |
|
mov esi,leveltext |
mov ebx,300 |
call printtext |
aimgtoimg levelup,150,180,vscreen,TRANSPARENCY,0 |
mov esi,leveltext |
mov ebx,300 |
call printtext |
aimgtoimg levelup,150,180,vscreen,TRANSPARENCY,0 |
|
ret |
ret |
|
@@: |
cmp byte[status],0 ; menu! |
jne @f |
|
aimgtoimg logo,50,80,vscreen,TRANSPARENCY,0 |
aimgtoimg logo,50,80,vscreen,TRANSPARENCY,0 |
|
|
cmp byte[menu],0 |
jne .menu_0 |
aimgtoimg menu1,30,200,vscreen,TRANSPARENCY,1 |
jmp .menu_1 |
cmp byte[menu],0 |
jne .menu_0 |
aimgtoimg menu1,30,200,vscreen,TRANSPARENCY,1 |
jmp .menu_1 |
.menu_0: |
aimgtoimg menu1,30,200,vscreen,TRANSPARENCY,0 |
aimgtoimg menu1,30,200,vscreen,TRANSPARENCY,0 |
.menu_1: |
cmp byte[menu],1 |
jne .menu_2 |
aimgtoimg menu2,80,250,vscreen,TRANSPARENCY,1 |
jmp .menu_3 |
cmp byte[menu],1 |
jne .menu_2 |
aimgtoimg menu2,80,250,vscreen,TRANSPARENCY,1 |
jmp .menu_3 |
.menu_2: |
aimgtoimg menu2,80,250,vscreen,TRANSPARENCY,0 |
aimgtoimg menu2,80,250,vscreen,TRANSPARENCY,0 |
.menu_3: |
cmp byte[menu],2 |
jne .menu_4 |
aimgtoimg menu3,120,300,vscreen,TRANSPARENCY,1 |
jmp .menu_5 |
cmp byte[menu],2 |
jne .menu_4 |
aimgtoimg menu3,120,300,vscreen,TRANSPARENCY,1 |
jmp .menu_5 |
.menu_4: |
aimgtoimg menu3,120,300,vscreen,TRANSPARENCY,0 |
aimgtoimg menu3,120,300,vscreen,TRANSPARENCY,0 |
.menu_5: |
cmp byte[menu],3 |
jne .menu_6 |
aimgtoimg menu4,150,350,vscreen,TRANSPARENCY,1 |
jmp .menu_7 |
cmp byte[menu],3 |
jne .menu_6 |
aimgtoimg menu4,150,350,vscreen,TRANSPARENCY,1 |
jmp .menu_7 |
.menu_6: |
aimgtoimg menu4,150,350,vscreen,TRANSPARENCY,0 |
aimgtoimg menu4,150,350,vscreen,TRANSPARENCY,0 |
.menu_7: |
|
cmp word[intro],200 |
je .menu_75 |
inc word[intro] |
cmp word[intro],200 |
je .menu_75 |
inc word[intro] |
|
.menu_75: |
cmp word[intro],0 |
jl .menu_8 |
aimgtoimg enemy1,390,180,vscreen,TRANSPARENCY,0 |
cmp word[intro],0 |
jl .menu_8 |
aimgtoimg enemy1,390,180,vscreen,TRANSPARENCY,0 |
|
cmp word[intro],15 |
jl .menu_8 |
mov esi,points_50 |
mov ebx,470 |
mov ecx,180 |
call printtext |
cmp word[intro],15 |
jl .menu_8 |
mov esi,points_50 |
mov ebx,470 |
mov ecx,180 |
call printtext |
|
cmp word[intro],30 |
jl .menu_8 |
aimgtoimg enemy2,390,220,vscreen,TRANSPARENCY,0 |
cmp word[intro],30 |
jl .menu_8 |
aimgtoimg enemy2,390,220,vscreen,TRANSPARENCY,0 |
|
cmp word[intro],45 |
jl .menu_8 |
mov esi,points_100 |
mov ebx,450 |
mov ecx,220 |
call printtext |
cmp word[intro],45 |
jl .menu_8 |
mov esi,points_100 |
mov ebx,450 |
mov ecx,220 |
call printtext |
|
cmp word[intro],60 |
jl .menu_8 |
aimgtoimg enemy3,390,260,vscreen,TRANSPARENCY,0 |
cmp word[intro],60 |
jl .menu_8 |
aimgtoimg enemy3,390,260,vscreen,TRANSPARENCY,0 |
|
cmp word[intro],75 |
jl .menu_8 |
mov esi,points_150 |
mov ebx,450 |
mov ecx,260 |
call printtext |
cmp word[intro],75 |
jl .menu_8 |
mov esi,points_150 |
mov ebx,450 |
mov ecx,260 |
call printtext |
|
cmp word[intro],90 |
jl .menu_8 |
aimgtoimg enemy4,390,300,vscreen,TRANSPARENCY,0 |
cmp word[intro],90 |
jl .menu_8 |
aimgtoimg enemy4,390,300,vscreen,TRANSPARENCY,0 |
|
cmp word[intro],105 |
jl .menu_8 |
mov esi,points_200 |
mov ebx,450 |
mov ecx,300 |
call printtext |
cmp word[intro],105 |
jl .menu_8 |
mov esi,points_200 |
mov ebx,450 |
mov ecx,300 |
call printtext |
|
cmp word[intro],120 |
jl .menu_8 |
aimgtoimg enemy5,390,340,vscreen,TRANSPARENCY,0 |
cmp word[intro],120 |
jl .menu_8 |
aimgtoimg enemy5,390,340,vscreen,TRANSPARENCY,0 |
|
cmp word[intro],135 |
jl .menu_8 |
mov esi,points_250 |
mov ebx,450 |
mov ecx,340 |
call printtext |
cmp word[intro],135 |
jl .menu_8 |
mov esi,points_250 |
mov ebx,450 |
mov ecx,340 |
call printtext |
|
cmp word[intro],150 |
jl .menu_8 |
aimgtoimg alien,380,380,vscreen,TRANSPARENCY,0 |
cmp word[intro],150 |
jl .menu_8 |
aimgtoimg alien,380,380,vscreen,TRANSPARENCY,0 |
|
cmp word[intro],165 |
jl .menu_8 |
mov esi,points_1000 |
mov ebx,430 |
mov ecx,380 |
call printtext |
cmp word[intro],165 |
jl .menu_8 |
mov esi,points_1000 |
mov ebx,430 |
mov ecx,380 |
call printtext |
|
.menu_8: |
ret |
ret |
@@: |
cmp byte[status],5 ;highscorelist |
jne @f |
|
aimgtoimg highscore,60,40,vscreen,TRANSPARENCY,0 |
aimgtoimg highscore,60,40,vscreen,TRANSPARENCY,0 |
|
mov ebx,100 ; print names |
mov ecx,120 |
mov esi,gif_hash_area |
call printtext |
mov ebx,100 ; print names |
mov ecx,120 |
mov esi,gif_hash_area |
call printtext |
|
mov edi,gif_hash_area+100 ; print scores |
mov esi,scorenumb |
mov ebx,420 |
mov ecx,120 |
mov edi,gif_hash_area+100 ; print scores |
mov esi,scorenumb |
mov ebx,420 |
mov ecx,120 |
|
.highscoreloop: |
mov eax,[edi] |
push ecx |
call convertscore |
pop ecx |
push esi |
call printtext |
pop esi |
add ecx,26 |
add edi,4 |
cmp edi,gif_hash_area+140 |
jl .highscoreloop |
mov eax,[edi] |
push ecx |
call convertscore |
pop ecx |
push esi |
call printtext |
pop esi |
add ecx,26 |
add edi,4 |
cmp edi,gif_hash_area+140 |
jl .highscoreloop |
|
@@: |
cmp byte[status],7 ;highscore |
jne @f |
|
aimgtoimg highscore,60,40,vscreen,TRANSPARENCY,0 |
aimgtoimg highscore,60,40,vscreen,TRANSPARENCY,0 |
|
mov ebx,60 |
mov ecx,200 |
mov esi,entername |
call printtext |
mov ebx,60 |
mov ecx,200 |
mov esi,entername |
call printtext |
|
mov ebx,250 |
mov ecx,250 |
mov esi,name |
call printtext |
mov ebx,250 |
mov ecx,250 |
mov esi,name |
call printtext |
|
mov esi,scoretext |
mov ebx,0 |
mov ecx,SCREEN_Y-24 |
call printtext |
mov esi,scoretext |
mov ebx,0 |
mov ecx,SCREEN_Y-24 |
call printtext |
|
mov esi,leveltext |
mov ebx,300 |
call printtext |
mov esi,leveltext |
mov ebx,300 |
call printtext |
@@: |
|
ret |
606,194 → 606,194 |
|
drawenemys: |
; check if direction should change |
test byte[enemy_d],2 |
jz @f |
test byte[enemy_d],2 |
jz @f |
|
add dword[enemy_y],5 |
add dword[enemy_y],5 |
|
mov eax,[enemy_y] |
shr eax,5 |
add al, byte[level] |
mov byte[enemy_speed],al |
mov eax,[enemy_y] |
shr eax,5 |
add al, byte[level] |
mov byte[enemy_speed],al |
|
and byte[enemy_d],1 |
and byte[enemy_d],1 |
|
@@: |
; move the aliens to left or right |
movzx eax,byte[enemy_speed] |
test byte[enemy_d],1 |
jz other_dir |
movzx eax,byte[enemy_speed] |
test byte[enemy_d],1 |
jz other_dir |
|
sub dword[enemy_x],eax |
jmp no_other_dir |
sub dword[enemy_x],eax |
jmp no_other_dir |
|
other_dir: |
add dword[enemy_x],eax |
add dword[enemy_x],eax |
no_other_dir: |
|
; initialization |
mov byte[alldeadb],1 |
mov edi,enemy_table |
mov eax,dword[enemy_x] |
mov dword[current_enemy_x],eax |
mov eax,dword[enemy_y] |
mov dword[current_enemy_y],eax |
mov byte[alldeadb],1 |
mov edi,enemy_table |
mov eax,dword[enemy_x] |
mov dword[current_enemy_x],eax |
mov eax,dword[enemy_y] |
mov dword[current_enemy_y],eax |
|
loopit: |
cmp byte[edi],1 |
je drawenemy1 |
cmp byte[edi],1 |
je drawenemy1 |
|
cmp byte[edi],2 |
je drawenemy2 |
cmp byte[edi],2 |
je drawenemy2 |
|
cmp byte[edi],3 |
je drawenemy3 |
cmp byte[edi],3 |
je drawenemy3 |
|
cmp byte[edi],4 |
je drawenemy4 |
cmp byte[edi],4 |
je drawenemy4 |
|
cmp byte[edi],5 |
je drawenemy5 |
cmp byte[edi],5 |
je drawenemy5 |
|
jmp dead_alien |
jmp dead_alien |
|
drawenemy1: |
mov byte[alldeadb],0 |
pusha |
aimgtoimg enemy1,dword[current_enemy_x],dword[current_enemy_y],vscreen,TRANSPARENCY,0 |
popa |
mov byte[alldeadb],0 |
pusha |
aimgtoimg enemy1,dword[current_enemy_x],dword[current_enemy_y],vscreen,TRANSPARENCY,0 |
popa |
|
jmp checknext |
jmp checknext |
|
drawenemy2: |
mov byte[alldeadb],0 |
pusha |
aimgtoimg enemy2,dword[current_enemy_x],dword[current_enemy_y],vscreen,TRANSPARENCY,0 |
popa |
mov byte[alldeadb],0 |
pusha |
aimgtoimg enemy2,dword[current_enemy_x],dword[current_enemy_y],vscreen,TRANSPARENCY,0 |
popa |
|
jmp checknext |
jmp checknext |
|
drawenemy3: |
mov byte[alldeadb],0 |
pusha |
aimgtoimg enemy3,dword[current_enemy_x],dword[current_enemy_y],vscreen,TRANSPARENCY,0 |
popa |
mov byte[alldeadb],0 |
pusha |
aimgtoimg enemy3,dword[current_enemy_x],dword[current_enemy_y],vscreen,TRANSPARENCY,0 |
popa |
|
jmp checknext |
jmp checknext |
|
drawenemy4: |
mov byte[alldeadb],0 |
pusha |
aimgtoimg enemy4,dword[current_enemy_x],dword[current_enemy_y],vscreen,TRANSPARENCY,0 |
popa |
mov byte[alldeadb],0 |
pusha |
aimgtoimg enemy4,dword[current_enemy_x],dword[current_enemy_y],vscreen,TRANSPARENCY,0 |
popa |
|
jmp checknext |
jmp checknext |
|
drawenemy5: |
mov byte[alldeadb],0 |
pusha |
aimgtoimg enemy5,dword[current_enemy_x],dword[current_enemy_y],vscreen,TRANSPARENCY,0 |
popa |
mov byte[alldeadb],0 |
pusha |
aimgtoimg enemy5,dword[current_enemy_x],dword[current_enemy_y],vscreen,TRANSPARENCY,0 |
popa |
|
; jmp checknext |
|
checknext: |
cmp byte[enemy_d],2 |
jge dont_change_dir |
cmp byte[enemy_d],2 |
jge dont_change_dir |
|
movzx eax,byte[enemy_speed] |
movzx eax,byte[enemy_speed] |
|
cmp byte[enemy_d],0 |
jbe change_dir |
cmp byte[enemy_d],0 |
jbe change_dir |
|
cmp dword[current_enemy_x],eax |
jg dont_change_dir |
cmp dword[current_enemy_x],eax |
jg dont_change_dir |
|
mov byte[enemy_d],2 |
mov byte[enemy_d],2 |
|
jmp dont_change_dir |
jmp dont_change_dir |
|
change_dir: |
mov ebx, SCREEN_X-ENEMY_X |
sub ebx, eax |
cmp dword[current_enemy_x],ebx |
jl dont_change_dir |
change_dir: |
mov ebx, SCREEN_X-ENEMY_X |
sub ebx, eax |
cmp dword[current_enemy_x],ebx |
jl dont_change_dir |
|
mov byte[enemy_d],3 |
mov byte[enemy_d],3 |
|
dont_change_dir: |
cmp dword[current_enemy_y],SHIP_Y_POS-ENEMY_Y-BOUNDARY |
je gameover_ |
dont_change_dir: |
cmp dword[current_enemy_y],SHIP_Y_POS-ENEMY_Y-BOUNDARY |
je gameover_ |
|
dead_alien: |
cmp edi,enemy_table+20 |
jge alldead |
cmp edi,enemy_table+20 |
jge alldead |
|
inc edi |
add dword[current_enemy_x],ENEMY_X+BOUNDARY |
mov eax,dword[current_enemy_x] |
sub eax,dword[enemy_x] |
cmp eax,5*(ENEMY_X+BOUNDARY) |
jl no_newline |
inc edi |
add dword[current_enemy_x],ENEMY_X+BOUNDARY |
mov eax,dword[current_enemy_x] |
sub eax,dword[enemy_x] |
cmp eax,5*(ENEMY_X+BOUNDARY) |
jl no_newline |
|
sub dword[current_enemy_x],5*(ENEMY_X+BOUNDARY) |
add dword[current_enemy_y],ENEMY_Y+BOUNDARY |
sub dword[current_enemy_x],5*(ENEMY_X+BOUNDARY) |
add dword[current_enemy_y],ENEMY_Y+BOUNDARY |
no_newline: |
jmp loopit |
jmp loopit |
|
alldead: |
cmp byte[alldeadb],0 |
je enemy_end |
cmp byte[alldeadb],0 |
je enemy_end |
|
mov byte[status],6 |
jmp mainloop |
mov byte[status],6 |
jmp mainloop |
|
enemy_end: |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
cmp dword[alien_x],5 ; |
jge @f |
cmp dword[alien_x],5 ; |
jge @f |
|
call random_generator |
cmp eax,0xffffffff/50 ; one out of 500 chances that it appears during this frame |
jl alien_end |
call random_generator |
cmp eax,0xffffffff/50 ; one out of 500 chances that it appears during this frame |
jl alien_end |
|
mov dword [alien_x],SCREEN_X-ALIEN_X |
mov dword [alien_x],SCREEN_X-ALIEN_X |
|
@@: |
push eax |
push eax |
|
mov eax, SCREEN_X ; mov eax, SCREEN_X |
sub eax, dword [alien_x] |
mov eax, SCREEN_X ; mov eax, SCREEN_X |
sub eax, dword [alien_x] |
|
cmp eax, ALIEN_X |
jle @f |
mov eax, ALIEN_X |
cmp eax, ALIEN_X |
jle @f |
mov eax, ALIEN_X |
@@: |
|
getimg alien,0,0,10,ALIEN_Y,alienpiece |
aimgtoimg alien,dword [alien_x],ALIEN_Y_POS,vscreen,TRANSPARENCY,0 |
sub dword[alien_x],5 ; |
; |
pop eax ; |
; |
alien_end: ; |
; |
getimg alien,0,0,10,ALIEN_Y,alienpiece |
aimgtoimg alien,dword [alien_x],ALIEN_Y_POS,vscreen,TRANSPARENCY,0 |
sub dword[alien_x],5 ; |
; |
pop eax ; |
; |
alien_end: ; |
; |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
ret |
ret |
|
drawbullet: |
cmp dword[bullet_y],BULLETSPEED |
jl nobullet |
sub dword[bullet_y],BULLETSPEED |
cmp dword[bullet_y],BULLETSPEED |
jl nobullet |
sub dword[bullet_y],BULLETSPEED |
|
aimgtoimg bullet,dword[bullet_x],dword[bullet_y],vscreen,TRANSPARENCY,0 |
aimgtoimg bullet,dword[bullet_x],dword[bullet_y],vscreen,TRANSPARENCY,0 |
|
nobullet: |
ret |
ret |
|
checkbullet: |
cmp dword[bullet_y],BULLETSPEED ; does the bullet hit top of the screen? |
jle hidebullet ; yes, hide bullet |
cmp dword[bullet_y],BULLETSPEED ; does the bullet hit top of the screen? |
jle hidebullet ; yes, hide bullet |
|
; ; check if bullet is inside the enemy field (you can disble this if you want) |
; mov eax,dword[enemy_y] |
812,78 → 812,78 |
; cmp dword[bullet_x],eax |
; jg nohit |
; |
mov edi,enemy_table |
mov eax,dword[enemy_x] |
mov dword[current_enemy_x],eax |
mov eax,dword[enemy_y] |
mov dword[current_enemy_y],eax |
mov edi,enemy_table |
mov eax,dword[enemy_x] |
mov dword[current_enemy_x],eax |
mov eax,dword[enemy_y] |
mov dword[current_enemy_y],eax |
|
check: |
cmp byte[edi],0 ; is the enemy at this position alive? |
je nextcheck ; no, try next enemy |
; check if bullet hits current enemy |
cmp byte[edi],0 ; is the enemy at this position alive? |
je nextcheck ; no, try next enemy |
; check if bullet hits current enemy |
|
mov eax,dword[current_enemy_y] ; move the enemy y position into eax |
cmp dword[bullet_y],eax ; is the bullet's y position less than eax (enemy y pos) |
jl nextcheck ; yes, bullet can't be colliding, check next enemy |
mov eax,dword[current_enemy_y] ; move the enemy y position into eax |
cmp dword[bullet_y],eax ; is the bullet's y position less than eax (enemy y pos) |
jl nextcheck ; yes, bullet can't be colliding, check next enemy |
|
add eax,ENEMY_Y ; add the width of the enemy to the enemy's y position (wich is still stored in eax) |
cmp dword[bullet_y],eax ; is the bullet's y position greater than eax (the end of the enemy) |
jg nextcheck ; yes, bullet can't be colliding, check next enemy |
add eax,ENEMY_Y ; add the width of the enemy to the enemy's y position (wich is still stored in eax) |
cmp dword[bullet_y],eax ; is the bullet's y position greater than eax (the end of the enemy) |
jg nextcheck ; yes, bullet can't be colliding, check next enemy |
|
mov eax,dword[current_enemy_x] ; now do the same but for the x positions |
cmp dword[bullet_x],eax ; |
jl nextcheck ; |
; |
add eax,ENEMY_Y ; |
cmp dword[bullet_x],eax ; |
jg nextcheck ; |
mov eax,dword[current_enemy_x] ; now do the same but for the x positions |
cmp dword[bullet_x],eax ; |
jl nextcheck ; |
; |
add eax,ENEMY_Y ; |
cmp dword[bullet_x],eax ; |
jg nextcheck ; |
|
jmp hit |
jmp hit |
|
nextcheck: |
inc edi |
add dword[current_enemy_x],ENEMY_X+BOUNDARY |
mov eax,dword[current_enemy_x] |
sub eax,dword[enemy_x] |
cmp eax,5*(ENEMY_X+BOUNDARY) |
jl no_newline_ |
inc edi |
add dword[current_enemy_x],ENEMY_X+BOUNDARY |
mov eax,dword[current_enemy_x] |
sub eax,dword[enemy_x] |
cmp eax,5*(ENEMY_X+BOUNDARY) |
jl no_newline_ |
|
sub dword[current_enemy_x],5*(ENEMY_X+BOUNDARY) |
add dword[current_enemy_y],ENEMY_Y+BOUNDARY |
sub dword[current_enemy_x],5*(ENEMY_X+BOUNDARY) |
add dword[current_enemy_y],ENEMY_Y+BOUNDARY |
no_newline_: |
|
cmp edi,enemy_table+20 ; is this the last enemy? |
jg nohit ; yes, none of them was hit |
jmp check ; no, check if enemy is alive and draw it |
cmp edi,enemy_table+20 ; is this the last enemy? |
jg nohit ; yes, none of them was hit |
jmp check ; no, check if enemy is alive and draw it |
|
hit: |
movzx ebx,byte[edi] ; mov the enemy number onto ebx |
add dword[score],ebx ; add this number to the score dword |
movzx ebx,byte[edi] ; mov the enemy number onto ebx |
add dword[score],ebx ; add this number to the score dword |
|
mov eax,[score] |
call convertscore |
mov eax,[score] |
call convertscore |
|
mov byte[edi],0 ; hide the enemy |
mov byte[edi],0 ; hide the enemy |
hidebullet: |
mov dword[bullet_y],1 ; mov the bullet to top of screen (hide it) |
jmp noalienhit |
mov dword[bullet_y],1 ; mov the bullet to top of screen (hide it) |
jmp noalienhit |
|
nohit: |
mov eax,[alien_x] ; check if we hit the big alien in the ufo |
cmp [bullet_x],eax |
jl noalienhit |
add eax,ALIEN_X-BULLET_X |
cmp [bullet_x],eax |
jg noalienhit |
cmp [bullet_y],ALIEN_Y_POS+ALIEN_Y |
jg noalienhit |
mov eax,[alien_x] ; check if we hit the big alien in the ufo |
cmp [bullet_x],eax |
jl noalienhit |
add eax,ALIEN_X-BULLET_X |
cmp [bullet_x],eax |
jg noalienhit |
cmp [bullet_y],ALIEN_Y_POS+ALIEN_Y |
jg noalienhit |
|
add dword[score],100/5 |
mov eax,[score] |
call convertscore |
add dword[score],100/5 |
mov eax,[score] |
call convertscore |
|
mov [alien_x],0 |
mov [alien_x],0 |
|
noalienhit: |
|
890,35 → 890,35 |
ret |
|
convertscore: |
test al,1 |
jz .1 |
mov byte[scorenumb+5],'5' |
jmp .2 |
test al,1 |
jz .1 |
mov byte[scorenumb+5],'5' |
jmp .2 |
.1: |
mov byte[scorenumb+5],'0' |
mov byte[scorenumb+5],'0' |
.2: |
shr eax,1 |
mov ecx,10 |
xor edx,edx |
div ecx |
add dl,'0' |
mov byte[scorenumb+4],dl |
xor edx,edx |
div ecx |
add dl,'0' |
mov byte[scorenumb+3],dl |
xor edx,edx |
div ecx |
add dl,'0' |
mov byte[scorenumb+2],dl |
xor edx,edx |
div ecx |
add dl,'0' |
mov byte[scorenumb+1],dl |
xor edx,edx |
div ecx |
add dl,'0' |
mov byte[scorenumb+0],dl |
shr eax,1 |
mov ecx,10 |
xor edx,edx |
div ecx |
add dl,'0' |
mov byte[scorenumb+4],dl |
xor edx,edx |
div ecx |
add dl,'0' |
mov byte[scorenumb+3],dl |
xor edx,edx |
div ecx |
add dl,'0' |
mov byte[scorenumb+2],dl |
xor edx,edx |
div ecx |
add dl,'0' |
mov byte[scorenumb+1],dl |
xor edx,edx |
div ecx |
add dl,'0' |
mov byte[scorenumb+0],dl |
|
ret |
|
925,126 → 925,126 |
|
fillscreen: ; eax - screen color ( 0x00RRGGBB ) |
|
mov edi,vscreen+8 |
cld |
mov ecx,SCREEN_X*SCREEN_Y |
mov edi,vscreen+8 |
cld |
mov ecx,SCREEN_X*SCREEN_Y |
.lab1: |
mov [edi],eax |
add edi,3 |
loop .lab1 |
mov [edi],eax |
add edi,3 |
loop .lab1 |
|
ret |
ret |
|
|
printtext: |
push ebx |
push ebx |
|
loadbyte: |
movzx eax, byte[esi] |
test eax, eax |
jnz checkbyte |
movzx eax, byte[esi] |
test eax, eax |
jnz checkbyte |
|
pop ebx |
pop ebx |
|
ret |
ret |
|
checkbyte: |
cmp al,13 |
je nextline |
cmp al,' ' |
je space |
cmp al,13 |
je nextline |
cmp al,' ' |
je space |
|
cmp al,'0' |
jl nextchar |
cmp al,'9' |
jle usenumbers |
cmp al,'0' |
jl nextchar |
cmp al,'9' |
jle usenumbers |
|
cmp al,'z' |
jg nextchar |
cmp al,'a' |
jge usesmallfont |
cmp al,'z' |
jg nextchar |
cmp al,'a' |
jge usesmallfont |
|
cmp al,'Z' |
jg nextchar |
cmp al,'A' |
jge usebigfont |
cmp al,'Z' |
jg nextchar |
cmp al,'A' |
jge usebigfont |
|
jmp nextchar |
jmp nextchar |
|
|
usesmallfont: |
mov edx,eax |
sub edx,'a' |
mov eax,12 |
mul edx |
mov edx,eax |
mov edx,eax |
sub edx,'a' |
mov eax,12 |
mul edx |
mov edx,eax |
|
pusha |
getimg smallfont,0,edx,20,12,char |
popa |
pusha |
getimg smallfont,0,edx,20,12,char |
popa |
|
pusha |
add ecx,4 |
aimgtoimg char,ebx,ecx,vscreen,TRANSPARENCY,0 |
popa |
pusha |
add ecx,4 |
aimgtoimg char,ebx,ecx,vscreen,TRANSPARENCY,0 |
popa |
|
add ebx,20 |
add ebx,20 |
|
jmp nextchar |
jmp nextchar |
|
usebigfont: |
mov edx,eax |
sub edx,'A' |
mov eax,20 |
mul edx |
mov edx,eax |
mov edx,eax |
sub edx,'A' |
mov eax,20 |
mul edx |
mov edx,eax |
|
pusha |
getimg bigfont,0,edx,28,20,char |
popa |
pusha |
getimg bigfont,0,edx,28,20,char |
popa |
|
pusha |
aimgtoimg char,ebx,ecx,vscreen,TRANSPARENCY,0 |
popa |
pusha |
aimgtoimg char,ebx,ecx,vscreen,TRANSPARENCY,0 |
popa |
|
add ebx,28 |
add ebx,28 |
|
jmp nextchar |
jmp nextchar |
|
usenumbers: |
mov edx,eax |
sub edx,'0' |
mov eax,20 |
mul edx |
mov edx,eax |
mov edx,eax |
sub edx,'0' |
mov eax,20 |
mul edx |
mov edx,eax |
|
pusha |
getimg numbers,0,edx,16,20,char |
popa |
pusha |
getimg numbers,0,edx,16,20,char |
popa |
|
pusha |
aimgtoimg char,ebx,ecx,vscreen,TRANSPARENCY,0 |
popa |
pusha |
aimgtoimg char,ebx,ecx,vscreen,TRANSPARENCY,0 |
popa |
|
add ebx,20 |
add ebx,20 |
|
jmp nextchar |
jmp nextchar |
|
space: |
add ebx,20 |
add ebx,20 |
|
nextchar: |
inc esi |
inc esi |
|
jmp loadbyte |
jmp loadbyte |
|
nextline: |
pop ebx |
push ebx |
add ecx,26 |
inc esi |
pop ebx |
push ebx |
add ecx,26 |
inc esi |
|
jmp loadbyte |
jmp loadbyte |
|
gameover_: |
mov byte[status],2 |
1064,7 → 1064,7 |
movzx ecx, word[esi+3] ; y |
add bx , ax |
cmp bx , SCREEN_X |
jl .moveit |
jl .moveit |
|
xor ebx,ebx |
inc ebx |
1103,10 → 1103,10 |
mul edx |
|
cmp eax, SCREEN_X*SCREEN_Y*3 |
jg @f |
jg @f |
add eax, vscreen+8 |
and dword[eax],0xff000000 |
or dword[eax],ebp |
or dword[eax],ebp |
@@: |
|
add esi, 5 |
1218,43 → 1218,43 |
db 0,0,0,0,0 |
|
|
msg1 db 'Vesa mode not supported',13,'Press any key to exit.',13,0 |
msgAbout db 'Hidnplayrs invaders',13,'DexOS version',13,13,'released under GPL',13,'make this game better',13,'if you want to',0 |
msgdone db 'You have saved the planet!',0 |
entername db 'Enter your name highscorer!',0 |
highscorefile db 'invaders.dat',0 |
points_50 db '5 pt',0 |
points_100 db '10 pt',0 |
points_150 db '15 pt',0 |
points_200 db '20 pt',0 |
points_250 db '25 pt',0 |
points_1000 db '100 pt',0 |
ship_x dd SHIP_X_POS |
enemy_x dd 0 |
enemy_y dd 0 |
enemy_d db 0 |
msg1 db 'Vesa mode not supported',13,'Press any key to exit.',13,0 |
msgAbout db 'Hidnplayrs invaders',13,'KolibriOS version',13,13,'released under GPL',13,'make this game better',13,'if you want to',0 |
msgdone db 'You have saved the planet!',0 |
entername db 'Enter your name highscorer!',0 |
highscorefile db 'invaders.dat',0 |
points_50 db '5 pt',0 |
points_100 db '10 pt',0 |
points_150 db '15 pt',0 |
points_200 db '20 pt',0 |
points_250 db '25 pt',0 |
points_1000 db '100 pt',0 |
ship_x dd SHIP_X_POS |
enemy_x dd 0 |
enemy_y dd 0 |
enemy_d db 0 |
current_enemy_x dd 0 |
current_enemy_y dd 0 |
bullet_x dd 0 |
bullet_y dd 1 |
score dd 0 |
alldeadb db 0 |
status db 0 ; status: 0=menu 1=game 2=gameover 3=paused 4=about 5=highscorelist 6=levelup 7=highscore... |
menu db 0 ; menu: 0=start 1=about 2=highscores 3=exit... |
generator dd 0x45dd4d15 |
alien_x dd 0 |
drawroutine dd 0 |
returnaddr dd 0 |
intro dw 0 |
scoretext db 'score ' |
scorenumb db 0,0,0,0,0,0,0 |
leveltext db 'level ' |
levelnumb db 0,0,0 |
lives db 0 |
level db 1 |
enemy_speed db 1 |
namepos db 0 |
name db 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0d,0x00 |
bullet_x dd 0 |
bullet_y dd 1 |
score dd 0 |
alldeadb db 0 |
status db 0 ; status: 0=menu 1=game 2=gameover 3=paused 4=about 5=highscorelist 6=levelup 7=highscore... |
menu db 0 ; menu: 0=start 1=about 2=highscores 3=exit... |
generator dd 0x45dd4d15 |
alien_x dd 0 |
drawroutine dd 0 |
returnaddr dd 0 |
intro dw 0 |
scoretext db 'score ' |
scorenumb db 0,0,0,0,0,0,0 |
leveltext db 'level ' |
levelnumb db 0,0,0 |
lives db 0 |
level db 1 |
enemy_speed db 1 |
namepos db 0 |
name db 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0d,0x00 |
|
|
gif_bullet file 'bullet2.gif' |
1400,7 → 1400,7 |
rb ALIEN_X*ALIEN_Y*3+20 |
|
gif_hash_area: |
rd 4096+1 ;hash area size for unpacking GIF |
rd 4096+1 ;hash area size for unpacking GIF |
|
I_END: |
|