Subversion Repositories Kolibri OS

Rev

Rev 4386 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
950 leency 1
;=============================================================================;
2
; Hidnplayr's invaders, Compilable for DexOs and Kolibrios                    ;
3
;-----------------------------------------------------------------------------;
4
;                                                                             ;
5
; Copyright (C) hidnplayr 2007. 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
 
26
SCREEN_X equ 640
27
SCREEN_Y equ 480
28
 
29
SHIP_X equ 32
30
SHIP_Y equ 32
31
 
32
SHIP_X_POS equ (SCREEN_X-SHIP_X)/2
33
SHIP_Y_POS equ SCREEN_Y-SHIP_Y-27
34
 
35
ENEMY_X equ 32
36
ENEMY_Y equ 32
37
 
38
ALIEN_X equ 48
39
ALIEN_Y equ 38
40
ALIEN_Y_POS equ 1
41
 
42
BOUNDARY equ 10
43
MOVEMENT equ 7
44
 
45
TRANSPARENCY equ 0x00000000
46
 
47
WINDOW_X equ 100
48
WINDOW_Y equ 100
49
 
50
BULLET_X equ 10
51
BULLET_Y equ 10
52
 
53
STARS_	 equ 226
54
STARLEVELS equ 3
55
 
56
ENEMY_STARTING_X equ 25
57
ENEMY_STARTING_Y equ 50
58
 
59
BULLETSPEED equ 12
60
 
61
SCREEN_X_POS equ 5
62
SCREEN_Y_POS equ 25
63
 
64
gif_hash_offset = gif_hash_area
65
 
66
include 'ascgl.inc'
67
include 'invaders_kolibri.inc'
68
 
69
decodegif:
70
	giftoimg gif_bullet,bullet
71
	giftoimg gif_bullet2,bullet2
72
	giftoimg gif_ship,ship
73
	giftoimg gif_enemy1,enemy1
74
	giftoimg gif_enemy2,enemy2
75
	giftoimg gif_enemy3,enemy3
76
	giftoimg gif_enemy4,enemy4
77
	giftoimg gif_enemy5,enemy5
78
	giftoimg gif_alien,alien
79
	giftoimg gif_menu1,menu1
80
	giftoimg gif_menu2,menu2
81
	giftoimg gif_menu3,menu3
82
	giftoimg gif_menu4,menu4
83
	giftoimg gif_logo,logo
84
	giftoimg gif_pause,pause_
85
	giftoimg gif_levelup,levelup
86
	giftoimg gif_gameover,gameover
87
	giftoimg gif_highscore,highscore
88
	giftoimg gif_smallfont,smallfont
89
	giftoimg gif_bigfont,bigfont
90
	giftoimg gif_numbers,numbers
91
 
92
	call  createstars
93
	call  drawit
94
	call  [drawroutine]
95
 
96
mainloop:
97
 
98
    cmp  byte[status],3 ; if game is paused,...
99
    je	 waitfordraw
100
 
101
    call drawit
102
    call [drawroutine]
103
    call checkbullet
104
 
105
   waitfordraw:
106
 
107
    call waitandgetkey ;;;
108
    test ah,ah
109
    jz	 mainloop
110
 
111
    cmp  byte[status],1      ;
112
    jne  nogame
113
 
114
	 cmp  ah, KEY_RIGHT
115
	 jnz  noright
116
	 cmp  dword[ship_x],SCREEN_X-SHIP_X-BOUNDARY
117
	 jge  mainloop
118
	 add  dword[ship_x],MOVEMENT
119
 
120
	 jmp  mainloop
121
 
122
       noright:
123
	 cmp  ah, KEY_LEFT
124
	 jnz  noleft
125
	 cmp  dword[ship_x],BOUNDARY
126
	 jle  mainloop
127
	 sub  dword[ship_x],MOVEMENT
128
 
129
	 jmp  mainloop
130
 
131
       noleft:
132
	 cmp  ah, KEY_UP
133
	 jnz  noup
134
 
135
	 cmp  dword[bullet_y],1
136
	 jg   mainloop
137
 
138
	 mov  eax,dword[ship_x]
139
	 add  eax,(SHIP_X-BULLET_X)/2
140
	 mov  dword[bullet_x],eax
141
	 mov  dword[bullet_y],SHIP_Y_POS;-BULLET_Y
142
 
143
	 jmp  mainloop
144
 
145
       noup:
146
	 cmp  ah,KEY_P
147
	 jnz  no_pause1
148
 
149
	 mov  byte[status],3
150
	 aimgtoimg pause_,150,180,vscreen,TRANSPARENCY,0
151
	 call [drawroutine]
152
 
153
	 jmp  mainloop
154
 
155
       no_pause1:
156
 
157
nogame:
158
    cmp  byte[status],0
159
    jne  nomenu
160
 
161
	 cmp  ah, KEY_DOWN
162
	 jnz  no_down
163
 
164
	 cmp  byte[menu],3
165
	 jne  no_menu1
166
 
167
	 mov  byte[menu],0
168
	 jmp  nomenu
169
 
170
       no_menu1:
171
	 inc  byte[menu]
172
 
173
       no_down:
174
	 cmp  ah, KEY_UP
175
	 jnz  no_up
176
 
177
	 cmp  byte[menu],0
178
	 jne  no_menu0
179
 
180
	 mov  byte[menu],3
181
	 jmp  nomenu
182
 
183
       no_menu0:
184
	 dec  byte[menu]
185
 
186
       no_up:
187
 
188
	 cmp  ah, KEY_ESC
189
	 je   exit
190
 
191
       no_esc:
192
	 cmp  ah, KEY_ENTER
193
	 jnz  no_enter
194
 
195
	exemenu:
196
		cmp  byte[menu],0  ;start
197
		jne  exemenu1
198
 
199
	      new_game:
200
			mov  dword[score],0
201
			mov  eax,[score]
202
			call convertscore
203
 
204
			mov  esi, level1
205
			mov  word[levelnumb],'01'
206
	      load_level:
207
			mov  byte[enemy_speed],1
208
			mov  dword[enemy_x], ENEMY_STARTING_X
209
			mov  dword[enemy_y], ENEMY_STARTING_Y
210
 
211
			mov  edi, enemy_table
212
			mov  ecx, 5
213
			rep  movsd
214
 
215
			mov  byte[status],1
216
 
217
			jmp  mainloop
218
 
219
	exemenu1:
220
		cmp  byte[menu],1  ;about
221
		jne  exemenu2
222
		mov  byte[status],4
223
		jmp  mainloop
224
 
225
	exemenu2:
226
		cmp  byte[menu],2  ;highscores
227
		jne  exemenu3
228
		mov  byte[status],5
229
		call load_highscores
230
		jmp  mainloop
231
 
232
	exemenu3:
233
		cmp  byte[menu],3  ;exit
234
		je   exit
235
 
236
      no_enter:
237
nomenu:
238
    cmp  byte[status],3
239
    jne  nopause
240
 
241
    cmp  ah, KEY_P
242
    jnz  nopause
243
 
244
    mov  byte[status],1
245
 
246
nopause:
247
    cmp  byte[status],6
248
    jne  nolevelup
249
 
250
    cmp  ah, KEY_ENTER
251
    jne  nolevelup
252
 
253
	inc  byte[level]
254
 
255
;        cmp  byte[level],5
256
;        jne  @f
257
;        mov  byte[level],0
258
 
259
;@@:
260
	inc  byte[levelnumb+1]
261
	cmp  byte[levelnumb+1],'9'
262
	jle  @f
263
	mov  byte[levelnumb+1],'0'
264
	inc  byte[levelnumb]
265
 
266
       @@:
267
	mov  eax,20
268
	mov  ah,byte[level]
269
	and  ah,7
270
	mul  ah
271
	add  eax,level1
272
	mov  esi,eax
273
	jmp  load_level
274
 
275
nolevelup:
276
    cmp  byte[status],7
277
    jne  nohighscore
278
 
279
	cmp   ah, KEY_ENTER
280
	jne   @f
281
 
282
	call  load_highscores
283
	mov   eax,dword[score]
284
	mov   ebx,gif_hash_area+140
285
    .findscore:
286
	cmp   ebx,gif_hash_area+100
287
	je    .topscore
288
	sub   ebx,4
289
	cmp   eax,dword[ebx]
290
	jg    .findscore
291
 
292
    .topscore:
293
	mov   esi,name
294
	mov   edi,gif_hash_area
295
	mov   ecx,10
296
	rep   movsb
297
 
298
	mov   eax,dword[score]
299
	mov   dword[gif_hash_area+100],eax
300
 
301
	call  save_highscores
302
	mov   byte[status],5
303
 
304
@@:
305
	cmp   ah,14
306
	jne   @f
307
 
308
	cmp   byte[namepos],0
309
	je    @f
310
 
311
	dec   byte[namepos]
312
	movzx ebx,byte[namepos]
313
	add   ebx,name
314
	mov   byte[ebx],0x11  ; this is a character we dont print
315
 
316
@@:
317
	cmp   byte[namepos],10
318
	jge   nohighscore
319
 
320
	cmp   al,'0'
321
	jl    nohighscore
322
	cmp   al,'9'
323
	jle   @f
324
 
325
	cmp   al,'z'
326
	jg    nohighscore
327
	cmp   al,'a'
328
	jge   @f
329
 
330
	cmp   al,'Z'
331
	jg    nohighscore
332
	cmp   al,'A'
333
	jl    nohighscore
334
@@:
335
 
336
	movzx ebx,byte[namepos]
337
	add   ebx,name
338
	mov   byte[ebx],al
339
 
340
	inc   byte[namepos]
341
 
342
	jmp   mainloop
343
 
344
nohighscore:
345
    cmp  byte[status],2 ; gameover
346
    jne  nogameover
347
 
348
    cmp  ah, KEY_ENTER
349
    jne  nogameover
350
 
351
	; test if score is high enough to put in highscore list...
352
	mov   byte[status],7
353
 
354
	jmp   mainloop
355
 
356
nogameover:
357
    cmp  byte[status],0
358
    je	 mainloop
359
 
360
    cmp  ah, KEY_ESC
361
    jnz  mainloop
362
 
363
    mov  byte[status],0
364
    mov  word[intro],0
365
 
366
    jmp  mainloop
367
 
368
 ;----------------------------------------------------;
369
 ; Drawing routine: create image in buffer            ;
370
 ;----------------------------------------------------;
371
drawit:
372
    mov  eax,0x00000000
373
    call fillscreen
374
    call drawstars
375
 
376
    cmp  byte[status],1
377
    jne  @f
378
 
379
	call drawbullet
380
	call drawenemys 					      ; Draw the enemy's to buffer
381
	aimgtoimg ship,dword[ship_x],SHIP_Y_POS,vscreen,TRANSPARENCY,0	; Draw the ship to buffer
382
 
383
	mov  esi,scoretext
384
	mov  ebx,0
385
	mov  ecx,SCREEN_Y-24
386
	call printtext
387
 
388
	mov  esi,leveltext
389
	mov  ebx,300
390
	call printtext
391
 
392
    ret
393
 
394
@@:
395
    cmp  byte[status],2 ; game over, dude !
396
    jne  @f
397
 
398
	aimgtoimg ship,dword[ship_x],SHIP_Y_POS,vscreen,TRANSPARENCY,0	; Draw the ship to buffer
399
 
400
	mov  esi,scoretext
401
	mov  ebx,0
402
	mov  ecx,SCREEN_Y-24
403
	call printtext
404
 
405
	mov  esi,leveltext
406
	mov  ebx,300
407
	call printtext
408
	aimgtoimg gameover,150,180,vscreen,TRANSPARENCY,0
409
 
410
	ret
411
 
412
@@:
413
    cmp  byte[status],4 ; about screen
414
    jne  @f
415
 
416
	mov  esi,msgAbout
417
	mov  ebx,50
418
	mov  ecx,100
419
	call printtext
420
 
421
	ret
422
 
423
@@:
424
    cmp  byte[status],6 ; level up!
425
    jne  @f
426
	aimgtoimg ship,dword[ship_x],SHIP_Y_POS,vscreen,TRANSPARENCY,0	; Draw the ship to buffer
427
 
428
	mov  esi,scoretext
429
	mov  ebx,0
430
	mov  ecx,SCREEN_Y-24
431
	call printtext
432
 
433
	mov  esi,leveltext
434
	mov  ebx,300
435
	call printtext
436
	aimgtoimg levelup,150,180,vscreen,TRANSPARENCY,0
437
 
438
	ret
439
 
440
@@:
441
    cmp  byte[status],0 ; menu!
442
    jne  @f
443
 
444
	aimgtoimg logo,50,80,vscreen,TRANSPARENCY,0
445
 
446
 
447
	cmp  byte[menu],0
448
	jne  .menu_0
449
	aimgtoimg menu1,30,200,vscreen,TRANSPARENCY,1
450
	jmp  .menu_1
451
    .menu_0:
452
	aimgtoimg menu1,30,200,vscreen,TRANSPARENCY,0
453
    .menu_1:
454
	cmp  byte[menu],1
455
	jne  .menu_2
456
	aimgtoimg menu2,80,250,vscreen,TRANSPARENCY,1
457
	jmp  .menu_3
458
    .menu_2:
459
	aimgtoimg menu2,80,250,vscreen,TRANSPARENCY,0
460
    .menu_3:
461
	cmp  byte[menu],2
462
	jne  .menu_4
463
	aimgtoimg menu3,120,300,vscreen,TRANSPARENCY,1
464
	jmp  .menu_5
465
    .menu_4:
466
	aimgtoimg menu3,120,300,vscreen,TRANSPARENCY,0
467
    .menu_5:
468
	cmp  byte[menu],3
469
	jne  .menu_6
470
	aimgtoimg menu4,150,350,vscreen,TRANSPARENCY,1
471
	jmp  .menu_7
472
    .menu_6:
473
	aimgtoimg menu4,150,350,vscreen,TRANSPARENCY,0
474
    .menu_7:
475
 
476
	cmp  word[intro],200
477
	je   .menu_75
478
	inc  word[intro]
479
 
480
    .menu_75:
481
	cmp  word[intro],0
482
	jl   .menu_8
483
	aimgtoimg enemy1,390,180,vscreen,TRANSPARENCY,0
484
 
485
	cmp  word[intro],15
486
	jl   .menu_8
487
	mov  esi,points_50
488
	mov  ebx,470
489
	mov  ecx,180
490
	call printtext
491
 
492
	cmp  word[intro],30
493
	jl   .menu_8
494
	aimgtoimg enemy2,390,220,vscreen,TRANSPARENCY,0
495
 
496
	cmp  word[intro],45
497
	jl   .menu_8
498
	mov  esi,points_100
499
	mov  ebx,450
500
	mov  ecx,220
501
	call printtext
502
 
503
	cmp  word[intro],60
504
	jl   .menu_8
505
	aimgtoimg enemy3,390,260,vscreen,TRANSPARENCY,0
506
 
507
	cmp  word[intro],75
508
	jl   .menu_8
509
	mov  esi,points_150
510
	mov  ebx,450
511
	mov  ecx,260
512
	call printtext
513
 
514
	cmp  word[intro],90
515
	jl   .menu_8
516
	aimgtoimg enemy4,390,300,vscreen,TRANSPARENCY,0
517
 
518
	cmp  word[intro],105
519
	jl   .menu_8
520
	mov  esi,points_200
521
	mov  ebx,450
522
	mov  ecx,300
523
	call printtext
524
 
525
	cmp  word[intro],120
526
	jl   .menu_8
527
	aimgtoimg enemy5,390,340,vscreen,TRANSPARENCY,0
528
 
529
	cmp  word[intro],135
530
	jl   .menu_8
531
	mov  esi,points_250
532
	mov  ebx,450
533
	mov  ecx,340
534
	call printtext
535
 
536
	cmp  word[intro],150
537
	jl   .menu_8
538
	aimgtoimg alien,380,380,vscreen,TRANSPARENCY,0
539
 
540
	cmp  word[intro],165
541
	jl   .menu_8
542
	mov  esi,points_1000
543
	mov  ebx,430
544
	mov  ecx,380
545
	call printtext
546
 
547
    .menu_8:
548
	ret
549
@@:
550
    cmp  byte[status],5 ;highscorelist
551
    jne  @f
552
 
553
	aimgtoimg highscore,60,40,vscreen,TRANSPARENCY,0
554
 
555
	mov  ebx,100		    ; print names
556
	mov  ecx,120
557
	mov  esi,gif_hash_area
558
	call printtext
559
 
560
	mov  edi,gif_hash_area+100  ; print scores
561
	mov  esi,scorenumb
562
	mov  ebx,420
563
	mov  ecx,120
564
 
565
.highscoreloop:
566
	mov  eax,[edi]
567
	push ecx
568
	call convertscore
569
	pop  ecx
570
	push esi
571
	call printtext
572
	pop  esi
573
	add  ecx,26
574
	add  edi,4
575
	cmp  edi,gif_hash_area+140
576
	jl  .highscoreloop
577
 
578
@@:
579
    cmp  byte[status],7 ;highscore
580
    jne  @f
581
 
582
	aimgtoimg highscore,60,40,vscreen,TRANSPARENCY,0
583
 
584
	mov  ebx,60
585
	mov  ecx,200
586
	mov  esi,entername
587
	call printtext
588
 
589
	mov  ebx,250
590
	mov  ecx,250
591
	mov  esi,name
592
	call printtext
593
 
594
	mov  esi,scoretext
595
	mov  ebx,0
596
	mov  ecx,SCREEN_Y-24
597
	call printtext
598
 
599
	mov  esi,leveltext
600
	mov  ebx,300
601
	call printtext
602
@@:
603
 
604
    ret
605
 
606
 
607
drawenemys:
608
; check if direction should change
609
	test byte[enemy_d],2
610
	jz   @f
611
 
612
	add  dword[enemy_y],5
613
 
614
	mov  eax,[enemy_y]
615
	shr  eax,5
616
	add  al, byte[level]
617
	mov  byte[enemy_speed],al
618
 
619
	and  byte[enemy_d],1
620
 
621
       @@:
622
; move the aliens to left or right
623
	movzx eax,byte[enemy_speed]
624
	test byte[enemy_d],1
625
	jz   other_dir
626
 
627
	sub  dword[enemy_x],eax
628
	jmp  no_other_dir
629
 
630
     other_dir:
631
	add  dword[enemy_x],eax
632
     no_other_dir:
633
 
634
; initialization
635
	mov  byte[alldeadb],1
636
	mov  edi,enemy_table
637
	mov  eax,dword[enemy_x]
638
	mov  dword[current_enemy_x],eax
639
	mov  eax,dword[enemy_y]
640
	mov  dword[current_enemy_y],eax
641
 
642
     loopit:
643
	cmp  byte[edi],1
644
	je   drawenemy1
645
 
646
	cmp  byte[edi],2
647
	je   drawenemy2
648
 
649
	cmp  byte[edi],3
650
	je   drawenemy3
651
 
652
	cmp  byte[edi],4
653
	je   drawenemy4
654
 
655
	cmp  byte[edi],5
656
	je   drawenemy5
657
 
658
	jmp  dead_alien
659
 
660
     drawenemy1:
661
	mov  byte[alldeadb],0
662
	pusha
663
	aimgtoimg enemy1,dword[current_enemy_x],dword[current_enemy_y],vscreen,TRANSPARENCY,0
664
	popa
665
 
666
	jmp  checknext
667
 
668
     drawenemy2:
669
	mov  byte[alldeadb],0
670
	pusha
671
	aimgtoimg enemy2,dword[current_enemy_x],dword[current_enemy_y],vscreen,TRANSPARENCY,0
672
	popa
673
 
674
	jmp  checknext
675
 
676
     drawenemy3:
677
	mov  byte[alldeadb],0
678
	pusha
679
	aimgtoimg enemy3,dword[current_enemy_x],dword[current_enemy_y],vscreen,TRANSPARENCY,0
680
	popa
681
 
682
	jmp  checknext
683
 
684
     drawenemy4:
685
	mov  byte[alldeadb],0
686
	pusha
687
	aimgtoimg enemy4,dword[current_enemy_x],dword[current_enemy_y],vscreen,TRANSPARENCY,0
688
	popa
689
 
690
	jmp  checknext
691
 
692
     drawenemy5:
693
	mov  byte[alldeadb],0
694
	pusha
695
	aimgtoimg enemy5,dword[current_enemy_x],dword[current_enemy_y],vscreen,TRANSPARENCY,0
696
	popa
697
 
698
;        jmp  checknext
699
 
700
     checknext:
701
	cmp  byte[enemy_d],2
702
	jge  dont_change_dir
703
 
704
	   movzx eax,byte[enemy_speed]
705
 
706
	   cmp	byte[enemy_d],0
707
	   jbe	change_dir
708
 
709
	   cmp	dword[current_enemy_x],eax
710
	   jg	dont_change_dir
711
 
712
	   mov	byte[enemy_d],2
713
 
714
	   jmp	dont_change_dir
715
 
716
	change_dir:
717
	   mov	ebx, SCREEN_X-ENEMY_X
718
	   sub	ebx, eax
719
	   cmp	dword[current_enemy_x],ebx
720
	   jl	dont_change_dir
721
 
722
	   mov	byte[enemy_d],3
723
 
724
	dont_change_dir:
725
	   cmp	dword[current_enemy_y],SHIP_Y_POS-ENEMY_Y-BOUNDARY
726
	   je	gameover_
727
 
728
     dead_alien:
729
	cmp  edi,enemy_table+20
730
	jge  alldead
731
 
732
	inc  edi
733
	add  dword[current_enemy_x],ENEMY_X+BOUNDARY
734
	mov  eax,dword[current_enemy_x]
735
	sub  eax,dword[enemy_x]
736
	cmp  eax,5*(ENEMY_X+BOUNDARY)
737
	jl   no_newline
738
 
739
	sub  dword[current_enemy_x],5*(ENEMY_X+BOUNDARY)
740
	add  dword[current_enemy_y],ENEMY_Y+BOUNDARY
741
      no_newline:
742
	jmp  loopit
743
 
744
     alldead:
745
	cmp  byte[alldeadb],0
746
	je   enemy_end
747
 
748
	mov  byte[status],6
749
	jmp  mainloop
750
 
751
     enemy_end:
752
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
753
	cmp  dword[alien_x],5							  ;
754
	jge  @f
755
 
756
	call random_generator
757
	cmp  eax,0xffffffff/50 ; one out of 500 chances that it appears during this frame
758
	jl   alien_end
759
 
760
	mov  dword [alien_x],SCREEN_X-ALIEN_X
761
 
762
       @@:
763
	push  eax
764
 
765
	mov  eax, SCREEN_X																												   ;        mov  eax, SCREEN_X
766
	sub  eax, dword [alien_x]
767
 
768
	cmp  eax, ALIEN_X
769
	jle  @f
770
	mov  eax, ALIEN_X
771
       @@:
772
 
773
	getimg alien,0,0,10,ALIEN_Y,alienpiece
774
	aimgtoimg alien,dword [alien_x],ALIEN_Y_POS,vscreen,TRANSPARENCY,0
775
	sub  dword[alien_x],5							  ;
776
										  ;
777
	pop  eax								  ;
778
										  ;
779
      alien_end:								  ;
780
										  ;
781
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
782
	ret
783
 
784
drawbullet:
785
	cmp  dword[bullet_y],BULLETSPEED
786
	jl   nobullet
787
	sub  dword[bullet_y],BULLETSPEED
788
 
789
	aimgtoimg bullet,dword[bullet_x],dword[bullet_y],vscreen,TRANSPARENCY,0
790
 
791
      nobullet:
792
	ret
793
 
794
checkbullet:
795
	cmp  dword[bullet_y],BULLETSPEED			      ; does the bullet hit top of the screen?
796
	jle  hidebullet 					      ; yes, hide bullet
797
 
798
;        ; check if bullet is inside the enemy field (you can disble this if you want)
799
;        mov  eax,dword[enemy_y]
800
;        cmp  dword[bullet_y],eax
801
;        jl   nohit
802
;
803
;        add  eax,4*(ENEMY_Y+BOUNDARY)
804
;        cmp  dword[bullet_y],eax
805
;        jg   nohit
806
;
807
;        mov  eax,dword[enemy_x]
808
;        cmp  dword[bullet_x],eax
809
;        jl   nohit
810
;
811
;        add  eax,5*(ENEMY_Y+BOUNDARY)
812
;        cmp  dword[bullet_x],eax
813
;        jg   nohit
814
;
815
	mov  edi,enemy_table
816
	mov  eax,dword[enemy_x]
817
	mov  dword[current_enemy_x],eax
818
	mov  eax,dword[enemy_y]
819
	mov  dword[current_enemy_y],eax
820
 
821
       check:
822
	cmp  byte[edi],0		 ; is the enemy at this position alive?
823
	je   nextcheck			 ; no, try next enemy
824
	; check if bullet hits current enemy
825
 
826
	mov  eax,dword[current_enemy_y]  ; move the enemy y position into eax
827
	cmp  dword[bullet_y],eax	 ; is the bullet's y position less than eax (enemy y pos)
828
	jl   nextcheck			 ; yes, bullet can't be colliding, check next enemy
829
 
830
	add  eax,ENEMY_Y		 ; add the width of the enemy to the enemy's y position (wich is still stored in eax)
831
	cmp  dword[bullet_y],eax	 ; is the bullet's y position greater than eax (the end of the enemy)
832
	jg   nextcheck			 ; yes, bullet can't be colliding, check next enemy
833
 
834
	mov  eax,dword[current_enemy_x]  ; now do the same but for the x positions
835
	cmp  dword[bullet_x],eax	 ;
836
	jl   nextcheck			 ;
837
					 ;
838
	add  eax,ENEMY_Y		 ;
839
	cmp  dword[bullet_x],eax	 ;
840
	jg   nextcheck			 ;
841
 
842
	jmp  hit
843
 
844
      nextcheck:
845
	inc  edi
846
	add  dword[current_enemy_x],ENEMY_X+BOUNDARY
847
	mov  eax,dword[current_enemy_x]
848
	sub  eax,dword[enemy_x]
849
	cmp  eax,5*(ENEMY_X+BOUNDARY)
850
	jl   no_newline_
851
 
852
	sub  dword[current_enemy_x],5*(ENEMY_X+BOUNDARY)
853
	add  dword[current_enemy_y],ENEMY_Y+BOUNDARY
854
      no_newline_:
855
 
856
	cmp  edi,enemy_table+20 	; is this the last enemy?
857
	jg   nohit			; yes, none of them was hit
858
	jmp  check			; no, check if enemy is alive and draw it
859
 
860
      hit:
861
	movzx ebx,byte[edi]		; mov the enemy number onto ebx
862
	add  dword[score],ebx		; add this number to the score dword
863
 
864
	mov  eax,[score]
865
	call convertscore
866
 
867
	mov  byte[edi],0		; hide the enemy
868
     hidebullet:
869
	mov  dword[bullet_y],1		; mov the bullet to top of screen (hide it)
870
	jmp  noalienhit
871
 
872
     nohit:
873
	mov  eax,[alien_x]		; check if we hit the big alien in the ufo
874
	cmp  [bullet_x],eax
875
	jl   noalienhit
876
	add  eax,ALIEN_X-BULLET_X
877
	cmp  [bullet_x],eax
878
	jg   noalienhit
879
	cmp  [bullet_y],ALIEN_Y_POS+ALIEN_Y
880
	jg   noalienhit
881
 
882
	add  dword[score],100/5
883
	mov  eax,[score]
884
	call convertscore
885
 
886
	mov  [alien_x],0
887
 
888
     noalienhit:
889
 
890
ret
891
 
892
convertscore:
893
	test al,1
894
	jz   .1
895
	mov  byte[scorenumb+5],'5'
896
	jmp  .2
897
.1:
898
	mov  byte[scorenumb+5],'0'
899
.2:
900
	shr  eax,1
901
	mov  ecx,10
902
	xor  edx,edx
903
	div  ecx
904
	add  dl,'0'
905
	mov  byte[scorenumb+4],dl
906
	xor  edx,edx
907
	div  ecx
908
	add  dl,'0'
909
	mov  byte[scorenumb+3],dl
910
	xor  edx,edx
911
	div  ecx
912
	add  dl,'0'
913
	mov  byte[scorenumb+2],dl
914
	xor  edx,edx
915
	div  ecx
916
	add  dl,'0'
917
	mov  byte[scorenumb+1],dl
918
	xor  edx,edx
919
	div  ecx
920
	add  dl,'0'
921
	mov  byte[scorenumb+0],dl
922
 
923
ret
924
 
925
 
926
fillscreen: ; eax - screen color ( 0x00RRGGBB )
927
 
928
	mov  edi,vscreen+8
929
	cld
930
	mov  ecx,SCREEN_X*SCREEN_Y
931
    .lab1:
932
	mov  [edi],eax
933
	add  edi,3
934
	loop .lab1
935
 
936
	ret
937
 
938
 
939
printtext:
940
	push  ebx
941
 
942
     loadbyte:
943
	movzx eax, byte[esi]
944
	test  eax, eax
945
	jnz   checkbyte
946
 
947
	pop   ebx
948
 
949
	ret
950
 
951
    checkbyte:
952
	cmp  al,13
953
	je   nextline
954
	cmp  al,' '
955
	je   space
956
 
957
	cmp  al,'0'
958
	jl   nextchar
959
	cmp  al,'9'
960
	jle  usenumbers
961
 
962
	cmp  al,'z'
963
	jg   nextchar
964
	cmp  al,'a'
965
	jge  usesmallfont
966
 
967
	cmp  al,'Z'
968
	jg   nextchar
969
	cmp  al,'A'
970
	jge  usebigfont
971
 
972
	jmp  nextchar
973
 
974
 
975
    usesmallfont:
976
	mov  edx,eax
977
	sub  edx,'a'
978
	mov  eax,12
979
	mul  edx
980
	mov  edx,eax
981
 
982
	pusha
983
	getimg smallfont,0,edx,20,12,char
984
	popa
985
 
986
	pusha
987
	add  ecx,4
988
	aimgtoimg char,ebx,ecx,vscreen,TRANSPARENCY,0
989
	popa
990
 
991
	add  ebx,20
992
 
993
	jmp  nextchar
994
 
995
    usebigfont:
996
	mov  edx,eax
997
	sub  edx,'A'
998
	mov  eax,20
999
	mul  edx
1000
	mov  edx,eax
1001
 
1002
	pusha
1003
	getimg bigfont,0,edx,28,20,char
1004
	popa
1005
 
1006
	pusha
1007
	aimgtoimg char,ebx,ecx,vscreen,TRANSPARENCY,0
1008
	popa
1009
 
1010
	add  ebx,28
1011
 
1012
	jmp  nextchar
1013
 
1014
    usenumbers:
1015
	mov  edx,eax
1016
	sub  edx,'0'
1017
	mov  eax,20
1018
	mul  edx
1019
	mov  edx,eax
1020
 
1021
	pusha
1022
	getimg numbers,0,edx,16,20,char
1023
	popa
1024
 
1025
	pusha
1026
	aimgtoimg char,ebx,ecx,vscreen,TRANSPARENCY,0
1027
	popa
1028
 
1029
	add  ebx,20
1030
 
1031
	jmp  nextchar
1032
 
1033
    space:
1034
	add  ebx,20
1035
 
1036
    nextchar:
1037
	inc  esi
1038
 
1039
	jmp  loadbyte
1040
 
1041
    nextline:
1042
	pop  ebx
1043
	push ebx
1044
	add  ecx,26
1045
	inc  esi
1046
 
1047
	jmp  loadbyte
1048
 
1049
gameover_:
1050
    mov  byte[status],2
1051
 
1052
    ret
1053
 
1054
 
1055
drawstars:
1056
    mov   esi, STARS
1057
 
1058
.loop:
1059
    cmp   esi, STARS+(STARS_*5)
1060
    jge   .done
1061
 
1062
    movzx eax, byte[esi]    ; z (speed, brightness)
1063
    movzx ebx, word[esi+1]  ; x
1064
    movzx ecx, word[esi+3]  ; y
1065
    add   bx , ax
1066
    cmp   bx , SCREEN_X
1067
    jl	  .moveit
1068
 
1069
    xor   ebx,ebx
1070
    inc   ebx
1071
 
1072
    call  random_generator
1073
    mov   ecx, [generator]
1074
    and   ecx, SCREEN_Y-1
1075
    inc   ecx
1076
    mov   word[esi+3],cx
1077
 
1078
    call  random_generator
1079
    and   al, STARLEVELS
1080
    test  al,al
1081
    jnz   @f
1082
    inc   al
1083
   @@:
1084
    mov   [esi],al
1085
 
1086
.moveit:
1087
    mov   word [esi+1],bx
1088
 
1089
    movzx eax, byte[esi]
1090
    inc   eax
1091
    mov   edx, 0xff/(STARLEVELS+1)
1092
    mul   edx
1093
 
1094
    mov   ah,al
1095
    shl   eax,8
1096
    mov   al,ah
1097
    mov   ebp, eax
1098
 
1099
    mov   eax, SCREEN_X
1100
    mul   ecx
1101
    add   eax, ebx
1102
    mov   edx, 3
1103
    mul   edx
1104
 
1105
    cmp   eax, SCREEN_X*SCREEN_Y*3
1106
    jg	  @f
1107
    add   eax, vscreen+8
1108
    and   dword[eax],0xff000000
1109
    or	  dword[eax],ebp
1110
   @@:
1111
 
1112
    add   esi, 5
1113
    jmp   .loop
1114
.done:
1115
 
1116
    ret
1117
 
1118
 
1119
createstars:
1120
 
1121
    mov   ebx, STARS
1122
.loop:
1123
    cmp   ebx, STARS+(STARS_*5)
1124
    jge   .done
1125
 
1126
    call  random_generator
1127
    and   al, STARLEVELS
1128
    test  al,al
1129
    jnz   @f
1130
    inc   al
1131
   @@:
1132
    mov   byte[ebx],al
1133
 
1134
    call  random_generator
1135
    and   eax, SCREEN_X-1
1136
    inc   eax
1137
    mov   word[ebx+1],ax
1138
 
1139
    call  random_generator
1140
    and   eax, SCREEN_Y-1
1141
    inc   eax
1142
    mov   word[ebx+3],ax
1143
 
1144
    add   ebx, 5
1145
    jmp   .loop
1146
.done:
1147
 
1148
    ret
1149
 
1150
 
1151
random_generator:  ; (pseudo random, actually :)
1152
 
1153
    xor   eax,[generator]
1154
    imul  eax,214013
1155
    xor   eax,0xdeadbeef
1156
    rol   eax,9
1157
    mov   [generator],eax
1158
    ror   eax,16
1159
    and   eax,0x7fff
1160
 
1161
    ret
1162
 
1163
 
1164
 
1165
 
1166
level1:
1167
db 4,4,4,4,4
1168
db 3,3,3,3,3
1169
db 2,2,2,2,2
1170
db 1,1,1,1,1
1171
 
1172
level2:
1173
db 4,1,3,1,4
1174
db 4,3,2,3,4
1175
db 0,4,1,4,0
1176
db 0,0,2,0,0
1177
 
1178
level3:
1179
db 1,5,5,5,1
1180
db 1,2,2,2,1
1181
db 3,1,2,1,3
1182
db 4,3,1,3,4
1183
 
1184
level4:
1185
db 4,5,2,5,4
1186
db 5,3,3,3,5
1187
db 4,5,4,5,4
1188
db 1,5,5,5,1
1189
 
1190
level5:
1191
db 5,4,3,4,5
1192
db 5,4,4,4,5
1193
db 4,5,4,5,4
1194
db 3,5,1,5,3
1195
 
1196
level6:
1197
db 1,2,5,4,5
1198
db 5,4,5,2,1
1199
db 1,2,5,4,5
1200
db 1,1,5,1,1
1201
 
1202
level7:
1203
db 1,2,3,2,1
1204
db 1,3,3,3,1
1205
db 3,4,3,4,3
1206
db 5,5,5,5,5
1207
 
1208
level8:
1209
db 1,2,3,4,5
1210
db 3,5,3,5,4
1211
db 4,2,3,2,3
1212
db 5,4,3,2,1
1213
 
1214
enemy_table:
1215
db 0,0,0,0,0
1216
db 0,0,0,0,0
1217
db 0,0,0,0,0
1218
db 0,0,0,0,0
1219
 
1220
 
1221
msg1		db 'Vesa mode not supported',13,'Press any key to exit.',13,0
1222
msgAbout	db 'Hidnplayrs invaders',13,'DexOS version',13,13,'released under GPL',13,'make this game better',13,'if you want to',0
1223
msgdone 	db 'You have saved the planet!',0
1224
entername	db 'Enter your name highscorer!',0
1225
highscorefile	db 'invaders.dat',0
1226
points_50	db '5 pt',0
1227
points_100	db '10 pt',0
1228
points_150	db '15 pt',0
1229
points_200	db '20 pt',0
1230
points_250	db '25 pt',0
1231
points_1000	db '100 pt',0
1232
ship_x		dd SHIP_X_POS
1233
enemy_x 	dd 0
1234
enemy_y 	dd 0
1235
enemy_d 	db 0
1236
current_enemy_x dd 0
1237
current_enemy_y dd 0
1238
bullet_x	dd 0
1239
bullet_y	dd 1
1240
score		dd 0
1241
alldeadb	db 0
1242
status		db 0	    ; status: 0=menu  1=game  2=gameover   3=paused  4=about 5=highscorelist 6=levelup 7=highscore...
1243
menu		db 0	    ; menu:   0=start 1=about 2=highscores 3=exit...
1244
generator	dd 0x45dd4d15
1245
alien_x 	dd 0
1246
drawroutine	dd 0
1247
returnaddr	dd 0
1248
intro		dw 0
1249
scoretext	db 'score '
1250
scorenumb	db 0,0,0,0,0,0,0
1251
leveltext	db 'level '
1252
levelnumb	db 0,0,0
1253
lives		db 0
1254
level		db 1
1255
enemy_speed	db 1
1256
namepos 	db 0
1257
name		db 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0d,0x00
1258
 
1259
 
1260
gif_bullet    file 'bullet2.gif'
1261
rb 4
1262
 
1263
gif_bullet2   file 'bullet2.gif'
1264
rb 4
1265
 
1266
gif_ship      file 'ship.gif'
1267
rb 4
1268
 
1269
gif_enemy1    file 'enemy1.gif'
1270
rb 4
1271
 
1272
gif_enemy2    file 'enemy2.gif'
1273
rb 4
1274
 
1275
gif_enemy3    file 'enemy3.gif'
1276
rb 4
1277
 
1278
gif_enemy4    file 'enemy4.gif'
1279
rb 4
1280
 
1281
gif_enemy5    file 'enemy5.gif'
1282
rb 4
1283
 
1284
gif_alien     file 'alien.gif'
1285
rb 4
1286
 
1287
gif_menu1     file 'menu1.gif'
1288
rb 4
1289
 
1290
gif_menu2     file 'menu2.gif'
1291
rb 4
1292
 
1293
gif_menu3     file 'menu3.gif'
1294
rb 4
1295
 
1296
gif_menu4     file 'menu4.gif'
1297
rb 4
1298
 
1299
gif_logo      file 'logo.gif'
1300
rb 4
1301
 
1302
gif_pause     file 'pause.gif'
1303
rb 4
1304
 
1305
gif_highscore file 'highscores.gif'
1306
rb 4
1307
 
1308
gif_smallfont file 'font_small.gif'
1309
rb 4
1310
 
1311
gif_bigfont   file 'font_capital.gif'
1312
rb 4
1313
 
1314
gif_numbers   file 'numbers.gif'
1315
rb 4
1316
 
1317
gif_levelup   file 'nextlevel.gif'
1318
rb 4
1319
 
1320
gif_gameover  file 'gameover.gif'
1321
rb 4
1322
 
1323
vscreen:
1324
dd SCREEN_X
1325
dd SCREEN_Y
1326
rb SCREEN_X*SCREEN_Y*3+10
1327
 
1328
IM_END:
1329
 
1330
STARS:
1331
rb STARS_*5
1332
 
1333
bullet:
1334
rb BULLET_X*BULLET_Y*3+8+10
1335
 
1336
bullet2:
1337
rb BULLET_X*BULLET_Y*3+8+10
1338
 
1339
ship:
1340
rb SHIP_X*SHIP_Y*3+10
1341
 
1342
enemy1:
1343
rb ENEMY_X*ENEMY_Y*3+10
1344
 
1345
enemy2:
1346
rb ENEMY_X*ENEMY_Y*3+10
1347
 
1348
enemy3:
1349
rb ENEMY_X*ENEMY_Y*3+10
1350
 
1351
enemy4:
1352
rb ENEMY_X*ENEMY_Y*3+10
1353
 
1354
enemy5:
1355
rb ENEMY_X*ENEMY_Y*3+10
1356
 
1357
alien:
1358
rb ALIEN_X*ALIEN_Y*3+10
1359
 
1360
menu1:
1361
rb 220*18*3+10
1362
 
1363
menu2:
1364
rb 135*18*3+10
1365
 
1366
menu3:
1367
rb 245*18*3+10
1368
 
1369
menu4:
1370
rb 110*18*3+10
1371
 
1372
logo:
1373
rb 40*540*3+10
1374
 
1375
pause_:
1376
rb 40*320*3+10
1377
 
1378
levelup:
1379
rb 40*320*3+10
1380
 
1381
gameover:
1382
rb 40*320*3+10
1383
 
1384
highscore:
1385
rb 40*530*3+10
1386
 
1387
smallfont:
1388
rb 20*312*3+10
1389
 
1390
bigfont:
1391
rb 28*520*3+10
1392
 
1393
numbers:
1394
rb 16*200*3+10
1395
 
1396
char:
1397
rb 28*20*3+20 ; biggest char's are 28x20
1398
 
1399
alienpiece:
1400
rb ALIEN_X*ALIEN_Y*3+20
1401
 
1402
gif_hash_area:
1403
rd 4096+1			   ;hash area size for unpacking GIF
1404
 
1405
I_END:
1406
 
1407
;include 'dex.inc'
1408