11 Title: .db "Nemesis v0.3.719 by Shiar",0
15 just_fired = $c0f9 ;byte
18 ;-------------------- init ----------------------------------------------------
23 ;-------------------- main menu -----------------------------------------------
27 ;-------------------- exit ----------------------------------------------------
32 ;----------------------- game setup -------------------------------------------
35 ld hl,stored_data_start
36 ld bc,variables_end-stored_data_start-1
38 ;---------------------- display setup ----------------------------------------
62 ;------------------------------------------------------------------------------
63 ;-------------------------- game loop -----------------------------------------
64 ;------------------------------------------------------------------------------
67 ld hl,timer ;update time
72 ld hl,GRAPH_MEM+(16*12)
85 ld a,%00111111 ;<exit> pressed?
91 jr z,quit ;yes: quit game
94 call Level_event ;insert enemies
95 call Handle_Ship ;move you
96 call Fire_bullet ;check for fire
97 call Handle_bullets ;move bullets
98 call Handle_enemies ;move enemies
99 call Enemy_fires ;check for enemy fire
100 call Enemy_bullets ;move bullets
101 call Enemies_hit ;check for collision with enemies
103 call Display_Screen ;display all
104 halt \ halt \ halt ;delay
105 jr game_main_loop ;loop
109 ;---------------------- display -----------------------------------------------
112 ld a,64 ;Display Image
113 ld hl,GRAPH_MEM+(16*12)
125 ; ld hl,$1007 ;Display Score
131 ;------------------------- handle ship ----------------------------------------
136 jr z,ok ;0 = normal stat
187 no_up: ld ix,spr_ship
221 ;------------------------- fire bullet ----------------------------------------
228 ret nz ;return if not normal stat
232 jr z,fire ;fire pressed?
237 or a ;can't fire when 1
239 ld (hl),1 ;just fired
247 jr z,found_ybullet ;0 = no bullet here
249 djnz find_ybullet ;look next bullet
253 ld (hl),1 ;use bullet
264 ;------------------------ handle bullets --------------------------------------
268 ld (hl),0 ;dump this bullet!
297 ld (hl),a ;save new pos.
303 call drw_spr ;display bullet
308 hit_enemies: ;Hits with normal enemies
313 jr z,nohit ;no hit when enemy_occ <> 1
335 ld (hl),a ;remove bullet
343 srl a ;occ/4 = HP left
345 ld (hl),2 ;set to explode
347 ld (hl),a ;explosionFrame 0
355 inc a ;HP*4+1 = occ 1
365 djnz hit_enemies ;check next enemy
368 ;--------------------------- level events -------------------------------------
397 add hl,bc ;hl = enemy specs
399 ld a,(hl) ;load hitpoints
400 or 1 ;set type 1 (normal) enemy
424 ;--------------------------- enemy fires --------------------------------------
437 add hl,bc ;hl = enemy
440 ret z ;return if no enemy
443 ret z ;or exploding enemy
446 ld c,(hl) ;enemy x-pos
459 jr z,found_ebullet ;0 = not used
463 djnz find_ebullet ;look next bullet
467 ld (hl),1 ;use bullet
474 ;----------------------------- enemy bullets ----------------------------------
499 jp m,remove_ebullet ;off screen?
500 jr z,remove_ebullet ;"
506 ld ix,spr_bullet11 ;display enemy bullet
511 jr nz,next_bullet ;0 = you're normal
531 call damage_you ;HIT!!
536 ld (hl),0 ;bullet > unused
539 ;--------------------------- handle enemies -----------------------------------
551 jr z,next_enemy ;occ "no enemy" 0
553 jr z,exploding_enemy ;occ "exploding" 2
555 normal_enemy: ;occ "normal" 1
561 ld c,a ;type*8 = offset
588 ld (hl),$0000 ;bye bye enemy
602 call explosion_stuff ;display explosion
607 jr z,enemy_gone ;remove when at last frame
609 ld (hl),a ;next frame
612 ;--------------------------- check collision ----------------------------------
619 ld de,(x) ;e = X, d = Y
627 ret z ;-1 = no more enemies
630 jr nz,nocrash ;1 = enemy
634 ld a,(hl) ;check x match
642 ld a,(hl) ;check y match
651 ld (hl),0 ;explosionFrame 0
653 ld (hl),2 ;set to explode
660 ;--------------------------- next level ---------------------------------------
667 ;--------------------------- putsprite ----------------------------------------
670 .db 128,64,32,16,8,4,2,1
701 _oloop: push bc ;Save # of rows
702 push hl ;Save screen address
704 ld c,(ix+2) ;Load one line of image
706 _smc1: ld a,1 ;Load pixel mask
707 _iloop: sla c ;Test leftmost pixel
708 jr nc,_noplot ;See if a plot is needed
709 ld e,a ;OR pixel with screen
714 jr nc,_notedge ;Test if edge of byte reached
715 inc hl ;Go to next byte
717 pop hl ;Restore address
718 ld bc,12 ;Go to next line
730 ldhld: call UNPACK_HL
748 up_data: .db "PAD98",0
752 ;------------------------------- sprites --------------------------------------
758 .db %11111100 ; ██████
759 .db %11110010 ; ████ █
760 .db %11111100 ; ██████
765 .db 5,3 ;your bullets
766 .db %00110000 ; ░▒▓██
767 .db %11111000 ; ░▒▓█████
768 .db %00110000 ; ░▒▓██
770 .db 5,3 ;your bullets
771 .db %11110000 ; ░▒▓████
772 .db %11111000 ; ░▒▓█████
773 .db %11110000 ; ░▒▓████
776 .db 3,3 ;enemy bullets
778 .db %11100000 ; ███▓▒░
782 .db 6,6 ;enemy type one
790 .db 6,6 ;enemy type two
791 .db %01111100 ; █████
793 .db %10111000 ; █ ███
794 .db %10111000 ; █ ███
796 .db %01111100 ; █████
798 .db 6,6 ;enemy type three
800 .db %01111100 ; █████
801 .db %11111000 ; █████
802 .db %11111000 ; █████
803 .db %01111100 ; █████
806 .db 6,6 ;enemy type three
809 .db %11111000 ; █████
810 .db %11111000 ; █████
811 .db %01111100 ; █████
879 ;---------------------------- enemy types -------------------------------------
881 enemy01: .db %00000000,$ff,$ff ;$hits $fire frequency
882 enemy02: .db %00000100,$ff,$ff
883 enemy03: .db %00001000,$ff,$ff
885 ;---------------------------- level data --------------------------------------
888 .db $01,$01,$40 ;$time (ff=end) $type $y-pos
909 ;---------------------------- texts -------------------------------------------
912 .db "* * NEMESIS * *",0
914 ;---------------------------- save data ---------------------------------------
918 level .dw $0000 ;level number
919 background .db %00000001 ;level background
921 curevent .dw Leveldata+1 ;next event
922 nextevent .db (Leveldata) ;time to next event
926 your_occ .db $00 ;0=normal 1=exploding 2=gone
927 lives .dw $0003 ;unused
929 y .db $46 ;think about it..
930 hp .db $00 ;hitpoints left
931 your_status .db $00,$00 ;unused
933 ybullets .dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;10 x (state,x,y)
934 ebullets .dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;10 x (state,x,y)
936 enemies .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
937 .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
938 .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
939 .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
940 .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
941 ; 0011 2233 >> 0=occupation (and %00000011: 0=no enemy 1=normal 2=exploding)
942 ; 1=frame/ship 2=x 3=y
957 ;0.01.717 -- 17.VII.99 -- size 984
959 ; + movement of ship over whole screen
960 ; + enemies moving from right to left, appearing right at specified times
962 ; 0.1.718 -- 18.VII.99 -- size 907
964 ; * no crash when level restarts for the third time
965 ; * exit-procedure updated, unnecessary stuff/keychecks removed
966 ; * alot of unused code removed
967 ; + different types of enemies (just look different)
968 ; + collision detection!! enemy ships disappear when you hit them
970 ; 0.2.718 -- 18.VII.99 -- size 1153
972 ; + ability to fire bullets (F1). Enemies disappear on impact
973 ; * enemies explode instead of disappearing
975 ; 0.3.719 -- 19.VII.99 -- size 1401
977 ; * bullets appear correctly (not INSIDE your ship)
978 ; + some enemies can take multiple hits (differs per class)
979 ; + all enemies fire bullets at random
980 ; + if you're hit by bullet/enemy, you'll lose one hitpoint