Subversion Repositories Kolibri OS

Compare Revisions

Ignore whitespace Rev 4385 → Rev 4386

/programs/games/invaders/invaders.asm
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: