12 Title: .db "Nemesis v0.4.720 by Shiar",0
16 just_fired = $c0f9 ;byte
19 ;-------------------- init ----------------------------------------------------
24 ;-------------------- main menu -----------------------------------------------
29 ;-------------------- exit ----------------------------------------------------
34 ;----------------------- game setup -------------------------------------------
38 ;---------------------- display setup ----------------------------------------
47 ;------------------------------------------------------------------------------
48 ;-------------------------- game loop -----------------------------------------
49 ;------------------------------------------------------------------------------
52 ld hl,timer ;update time
57 ld hl,GRAPH_MEM+(16*12)
69 ld a,%00111111 ;<exit> pressed?
75 jr z,quit ;yes: quit game
78 call Level_event ;insert enemies
79 call Handle_Ship ;move you
80 call Fire_bullet ;check for fire
81 call Handle_bullets ;move bullets
82 call Handle_enemies ;move enemies
83 call Enemy_fires ;check for enemy fire
84 call Enemy_bullets ;move bullets
85 call Enemies_hit ;check for collision with enemies
87 call Display_Screen ;display all
88 halt \ halt \ halt ;delay
89 jr game_main_loop ;loop
93 ;---------------------- display -----------------------------------------------
96 ld a,64 ;Display Image
97 ld hl,GRAPH_MEM+(16*12)
109 ld hl,$1006 ;Display Score
115 ;------------------------- handle ship ----------------------------------------
120 jr z,ok ;0 = normal stat
171 no_up: ld ix,spr_ship01
203 ;------------------------- fire bullet ----------------------------------------
210 ret nz ;return if not normal stat
214 jr z,fire ;fire pressed?
219 or a ;can't fire when 1
221 ld (hl),1 ;just fired
229 jr z,found_ybullet ;0 = no bullet here
231 djnz find_ybullet ;look next bullet
235 ld (hl),1 ;use bullet
246 ;------------------------ handle bullets --------------------------------------
250 ld (hl),0 ;dump this bullet!
279 ld (hl),a ;save new pos.
285 call drw_spr ;display bullet
290 hit_enemies: ;Hits with normal enemies
295 jr z,nohit ;no hit when enemy_occ <> 2/3
317 ld (hl),a ;remove bullet
326 srl a ;occ/4 = HP left
328 ld (hl),$01 ;set to explode
330 ld (hl),a ;explosionFrame 0
336 sub %00000100 ;decrease HP by one
346 djnz hit_enemies ;check next enemy
349 ;--------------------------- level events -------------------------------------
367 or a ;0 = no enemy present
375 add hl,bc ;hl = enemy specs
376 ld a,(hl) ;load hitpoints+occ of this enemy class
381 ld a,(hl) ;load movement+type of this enemy class
385 ld a,$5a ;appear at right edge of screen
396 cp $ff ;255 = end marker
398 ld (nextevent),a ;else time to next event
401 ld (curevent),hl ;update pointer
404 ;--------------------------- enemy fires --------------------------------------
417 add hl,bc ;hl = enemy
420 ret z ;return if no enemy
423 ret z ;or exploding enemy
426 ld c,(hl) ;enemy x-pos
439 jr z,found_ebullet ;0 = not used
443 djnz find_ebullet ;look next bullet
447 ld (hl),1 ;use bullet
454 ;----------------------------- enemy bullets ----------------------------------
479 jp m,remove_ebullet ;off screen?
480 jr z,remove_ebullet ;"
486 ld ix,spr_bullet11 ;display enemy bullet
491 jr nz,next_bullet ;0 = you're normal
511 call damage_you ;HIT!!
516 ld (hl),0 ;bullet > unused
519 ;--------------------------- handle enemies -----------------------------------
531 jr z,next_enemy ;occ "no enemy" 0
533 jr z,exploding_enemy ;occ "exploding" 1
536 jr z,normal_enemy ;occ "normal" 2
538 moving_enemy: ;occ "moving" 3
547 ld c,a ;type*8 = offset
552 jp m,remove_enemy ;off screen
559 ld (hl),a ;store new y
563 ld (hl),d ;store new x
572 ld (hl),$0000 ;bye bye enemy
586 call explosion_stuff ;display explosion
591 jr z,remove_enemy ;remove when at last frame
593 ld (hl),a ;next frame
596 ;--------------------------- check collision ----------------------------------
600 or a ;0 = you're normal
603 ld de,(x) ;e = X, d = Y
605 ld b,20 ;check all 20 enemies
610 jr z,check_next ;2/3 = ok
614 ld a,(hl) ;check x match
622 ld a,(hl) ;check y match
632 ld (hl),a ;explosionFrame 0
635 ld (hl),a ;set to explode
636 call damage_you ;auch!
647 ;--------------------------- next level ---------------------------------------
650 ld hl,Leveldata+1 ;reset level data
653 call _clrLCD ;clear screen
655 ld (_curRow),hl ;center
657 call _puts ;display "LEVEL "
660 inc a ;increase level nr.
670 call _putc ;display second digit
672 call _putc ;display first digit
677 call _getkey ;wait for keypress
681 ;--------------------------- putsprite ----------------------------------------
684 .db 128,64,32,16,8,4,2,1
715 _oloop: push bc ;Save # of rows
716 push hl ;Save screen address
718 ld c,(ix+2) ;Load one line of image
720 _smc1: ld a,1 ;Load pixel mask
721 _iloop: sla c ;Test leftmost pixel
722 jr nc,_noplot ;See if a plot is needed
723 ld e,a ;OR pixel with screen
728 jr nc,_notedge ;Test if edge of byte reached
729 inc hl ;Go to next byte
731 pop hl ;Restore address
732 ld bc,12 ;Go to next line
744 ldhld: call UNPACK_HL
762 up_data: .db "PAD98",0
766 ;------------------------------- sprites --------------------------------------
772 .db %01111100 ; █████
773 .db %01110010 ; ███ █
774 .db %01111100 ; █████
779 .db 7,7 ;ship alpha class
782 .db %11111100 ; ██████
783 .db %11110010 ; ████ █
784 .db %11111100 ; ██████
788 .db 7,7 ;ship beta class
791 .db %01111100 ; █████
792 .db %01110010 ; ███ █
793 .db %01111100 ; █████
798 .db 5,3 ;your bullets
799 .db %00110000 ; ░▒▓██
800 .db %11111000 ; ░▒▓█████
801 .db %00110000 ; ░▒▓██
803 .db 5,3 ;your bullets
804 .db %11110000 ; ░▒▓████
805 .db %11111000 ; ░▒▓█████
806 .db %11110000 ; ░▒▓████
809 .db 3,3 ;enemy bullets
811 .db %11100000 ; ███▓▒░
818 .db %00111110 ; █████
819 .db %01010110 ; █ █ ██
825 .db %01001110 ; █ ▒███
826 .db %10111110 ; █ █████
827 .db %01001111 ; █ ▒████
832 .db %10110011 ; █ ██ ██
833 .db %01001110 ; █ ███
834 .db %10110101 ; █ ██▒█▒█
835 .db %01000101 ; █ ▒█▒█
836 .db %00111110 ; █████
837 .db %11011010 ; ██ ██ █
840 .db %00101010 ; ▒ █▒█ █▒
841 .db %01000110 ; █ ▒██
842 .db %10110101 ; █ ██ █ █
843 .db %01100110 ; ██ ██▒
844 .db %00111100 ; ████▒
845 .db %01011001 ; ▒█ ██ ▒█
848 .db %01000001 ; █▒ ▒ ▒█
849 .db %00100101 ; ▒█ █▒█
850 .db %00010100 ; ▒ ▒█ █ ▒
852 .db %00010010 ; ▒█▒▒█
853 .db %10011010 ; █▒ ██ █▒
856 .db %01000100 ; █ █ ▒
857 .db %00100000 ; ▒█ ▒ ▒
858 .db %00000001 ; ▒ ▒ █
861 .db %01001000 ; ▒█ ▒█ ▒
865 .db %11000010 ; ██ ▒ █
882 .db %10101000 ; █ █ █
883 .db %11111000 ; █████
888 .db %00000000 ; ██ ██
892 ;---------------------------- texts -------------------------------------------
894 txt_title: .db "* * NEMESIS * *",0
895 txt_level: .db "LEVEL ",0
896 txt_score: .db "SCORE",0
898 ;---------------------------- save data ---------------------------------------
902 level .db $00 ;level number
903 timer .db $00 ;frame counter
904 curevent .dw Leveldata+1 ;next event
905 nextevent .db (Leveldata) ;time to next event
909 your_occ .db $00 ;0=normal 1=exploding 2=gone
910 lives .dw $0003 ;unused
912 y .db $46 ;think about it..
913 hp .db $00 ;hitpoints left
915 ybullets .dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;10 x (state,x,y)
916 ebullets .dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;10 x (state,x,y)
918 enemies .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
919 .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
920 .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
921 .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
922 .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
924 ; %111111 (HP left) 11 (00=no enemy 01=exploding 10=normal 11=moving)
925 ; %111 (move ptrn) 11111 (ship or explosion frame) %11111111 (x) %11111111 (y)
928 ;---------------------------- enemy data --------------------------------------
931 .db 6,6 ;enemy type one
939 .db 6,6 ;enemy type two
942 .db %11111100 ; ██████
943 .db %11111100 ; ██████
947 .db 6,6 ;enemy type three
948 .db %01111100 ; █████
950 .db %11111000 ; █████
951 .db %11111000 ; █████
953 .db %01111100 ; █████
955 .db 6,6 ;enemy type four
957 .db %01111100 ; █████
958 .db %11111000 ; █████
959 .db %11111000 ; █████
960 .db %01111100 ; █████
964 .db %00000010,%00000000 ;first two enemy bytes
966 .db %00000010,%00100001
968 .db %00000110,%00000010
970 .db %00010010,%00000010
972 ;---------------------------- level data --------------------------------------
975 .db $01,$01,$40 ;$time (ff=end) $type $y-pos
996 ;----------------------------- end --------------------------------------------
1004 ;----------------------------- NEMESIS'86 by Shiar ----------------------------
1006 ;----------------------------- version history --------------------------------
1008 ;0.01.717 -- 17.VII.99 -- size 984
1010 ; + movement of ship over whole screen
1011 ; + enemies moving from right to left, appearing right at specified times
1013 ; 0.1.718 -- 18.VII.99 -- size 907
1015 ; * no crash when level restarts for the third time
1016 ; * exit-procedure updated, unnecessary stuff/keychecks removed
1017 ; * alot of unused code removed
1018 ; + different types of enemies (just look different)
1019 ; + collision detection!! enemy ships disappear when you hit them
1021 ; 0.2.718 -- 18.VII.99 -- size 1153
1023 ; + ability to fire bullets (F1). Enemies disappear on impact
1024 ; * enemies explode instead of disappearing
1026 ; 0.3.719 -- 19.VII.99 -- size 1401
1028 ; * bullets appear correctly (not INSIDE your ship)
1029 ; + some enemies can take multiple hits (differs per class)
1030 ; + all enemies fire bullets at random
1031 ; + if you're hit by bullet/enemy, you'll lose one hitpoint
1033 ; 0.4.720 -- 20.VII.99 -- size 1481
1035 ; * collision detection fixed and optimized (much faster now!)
1036 ; + shell-icon added (YAS type)
1037 ; * code optimizations, some data "compression"
1038 ; * explosion looks better, and some vars removed/smaller
1039 ; * enemies are removed if at left side (instead of becoming invisible)
1040 ; + displays level number before each level begins