version 0.1: collision detection
authorMischa Poslawsky <nemesis@shiar.org>
Sat, 17 Jul 1999 22:00:00 +0000 (00:00 +0200)
committerMischa Poslawsky <nemesis@shiar.org>
Wed, 18 Mar 2009 00:09:07 +0000 (01:09 +0100)
# no crash when level restarts for the third time
* exit-procedure updated, unnecessary stuff/keychecks removed
- alot of unused code removed
+ different types of enemies (just look different)
+ collision detection!! enemy ships disappear when you hit them

nemesis.z80

index 259db9b11754c13527b904fa60951722f6f6484d..79042be939f0f804ecceef5f77e9090cc0d2a771 100644 (file)
@@ -6,20 +6,14 @@
        jp  Start
        .dw $0000
        .dw Title
-Title: .db "Nemesis v0.01 by Shiar",0
-Start: call _runindicoff
-
-TEXT_MEM = $c0f9
-temp1 = $c120
-StringPlace = $c180
-jpf1 = $c200
-
+Title: .db "Nemesis v0.1.718 by Shiar",0
+Start:
+       jr init
 
 ;-------------------- init ----------------------------------------------------
 
 init:
-       set 0,(iy+3)
-       ld  (iy+13),0
+       call _runindicoff
 
 ;-------------------- main menu -----------------------------------------------
 
@@ -41,18 +35,16 @@ play_game:
 set_up_display:
        call _clrLCD
 
-       ld       hl,in_game_text
-       ld       b,3
-l11:   ld       a,(hl)
-       ld       (_curCol),a
-       inc      hl
-       ld       a,(hl)
-       ld       (_curRow),a
-       inc      hl
-       call     _puts
-       djnz     l11
-
-;------------------------ in-game texts ---------------------------------------
+       ld  hl,in_game_text
+       ld  b,3
+l11:   ld  a,(hl)
+       ld  (_curCol),a
+       inc hl
+       ld  a,(hl)
+       ld  (_curRow),a
+       inc hl
+       call _puts
+       djnz l11
 
 in_game_text:
        .db 16,0,"LIVES",0
@@ -62,165 +54,163 @@ in_game_text:
 str_question:
        .db "-----",0
 
+;------------------------------------------------------------------------------
 ;-------------------------- game loop -----------------------------------------
+;------------------------------------------------------------------------------
 
 game_main_loop:
-       ld  hl,timer
+       ld  hl,timer            ;update time
        inc (hl)
 
+Clear_screen:
        xor a
        ld  hl,GRAPH_MEM+(16*12)
        ld  b,a
-csl:   ld  (hl),a
+clearloop:
+       ld  (hl),a
        inc hl
        ld  (hl),a
        inc hl
        ld  (hl),a
        inc hl
-       djnz csl
+       djnz clearloop
+
+check_exitkey:
+       ld  a,%00111111         ;<exit> pressed?
+       out (1),a
+       nop
+       nop
+       in  a,(1)
+       bit 6,a
+       jr  z,quit              ;yes: quit game
+
+game_stuff:
+       call Level_event        ;insert enemies
+       call Handle_Ship        ;move you
+       call Handle_enemies     ;move enemies
+       call Enemies_hit        ;check for collision with enemies
+
+       call Display_Screen     ;display all
+;      halt \ halt \ halt      ;delay
+       jr   game_main_loop     ;loop
 
-       call Level_event
-       call Handle_Ship
-       call Handle_enemies
-       call Display_Screen
-       call Misc_Keys
-       jr  game_main_loop
+quit:  ret
 
 ;---------------------- display -----------------------------------------------
 
 Display_Screen:
-       ld  a,64                       ;Display Image
+       ld  a,64                ;Display Image
        ld  hl,GRAPH_MEM+(16*12)
        ld  de,$fc00
-dsl:   ld  bc,12
+displayloop:
+       ld  bc,12
        ldir
        inc de
        inc de
        inc de
        inc de
        dec a
-       jr  nz,dsl
+       jr  nz,displayloop
 
-       ld  hl,$1007                   ;Display Score
-       ld  (_curRow),hl
-       ld  hl,(score)
-;       jp  _D_HL_DECI
+;      ld  hl,$1007            ;Display Score
+;      ld  (_curRow),hl
+;      ld  hl,(score)
+;      jp  _D_HL_DECI
        ret
 
 ;------------------------- handle ship ----------------------------------------
 
 Handle_Ship:
-         ld       a,(your_status)
-         bit      4,a
-         jr       nz,you_not_normal
-         or       a
-         jr       z,ok
-         dec      a
-         ld       (your_status),a
-         ld       hl,(lives)
-         ld       a,l
-         or       h
-         jr       nz,ok
-         pop      af
-         ret
-ok:
-         ld       a,%01111110
-         out      (1),a
-         ld       hl,y
-         in       a,(1)
-         rra
-         ld       b,a
-
-         jr       c,no_down
-         ld       a,(hl)
-         inc      a
-         cp       73                   ;y < 73
-         jr       z,no_down
-         ld       (hl),a
-no_down: dec      hl
-         rr       b
-         jr       c,no_left
-         ld       a,(hl)
-         dec      a
-         jr       z,no_left            ;x > 0
-         ld       (hl),a
-no_left: rr       b   
-         jr       c,no_right
-         ld       a,(hl)
-         inc      a
-         cp       89                   ;x < 89
-         jr       z,no_right
-         ld       (hl),a
-no_right:ld       d,(hl)
-         inc      hl
-         rr       b
-         jr       c,no_up
-         ld       a,(hl)
-         dec      a
-         cp       15                   ;y > 15
-         jr       z,no_up
-         ld       (hl),a
-no_up:
-         ld       ix,spr_ship
-
-display_common:
-         ld       e,(hl)
-         jp       drw_spr
-
-you_not_normal:
-
-         ld       hl,(score)
-         ld       de,-6
-         add      hl,de    
-         ld       a,255
-         cp       h
-         jr       nz,_ok_
-         ld       hl,0
-_ok_:    ld       (score),hl
-         ld       a,(your_status)
-         dec      a
-         ld       (your_status),a
-         inc      a
-         and      14
-         xor      14
-         ld       hl,x-1
-
-explosion_stuff:
-         rra
-         add      a,a
-         add      a,a
-         add      a,a
-         ld       c,a
-         ld       b,0
-         ld       ix,spr_explosion
-         add      ix,bc
-         inc      hl
-         ld       d,(hl)
-         inc      hl
-         jr       display_common
+       ld  a,(your_status)
+;      bit 4,a
+;      jr  nz,you_not_normal
+       or  a
+       jr  z,ok
+;      dec a
+;      ld  (your_status),a
+;      ld  hl,(lives)
+;      ld  a,l
+;      or  h
+;      jr  nz,ok
+;      pop af
+;      ret
 
-;---------------------------- handle keys -------------------------------------
+ok:
+       ld  a,%01111110
+       out (1),a
+       ld  hl,y
+       in  a,(1)
+       rra
+       ld  b,a
 
-Misc_Keys:
-         ld       a,$BF
-         out      (1),a
-       nop
-       nop
-         in       a,(1)
-         rla
-         rla
-         jr       nc,e_exit
+       jr  c,no_down
+       ld  a,(hl)
+       inc a
+       cp  73                  ;y < 73
+       jr  z,no_down
+       ld  (hl),a
+no_down:
+       dec hl
+       rr  b
+       jr  c,no_left
+       ld  a,(hl)
+       dec a
+       jr  z,no_left           ;x > 0
+       ld  (hl),a
+no_left:
+       rr b   
+       jr  c,no_right
+       ld  a,(hl)
+       inc a
+       cp  89                  ;x < 89
+       jr  z,no_right
+       ld  (hl),a
+no_right:
+       ld d,(hl)
+       inc hl
+       rr  b
+       jr  c,no_up
+       ld  a,(hl)
+       dec a
+       cp  15                  ;y > 15
+       jr  z,no_up
+       ld  (hl),a
+no_up: ld  ix,spr_ship
 
-         ld       a,$FD
-         out      (1),a
-       nop
-       nop
-       in       a,(1)
-       rra
-       bit      5,a
-       ret      nz
-e_exit:        pop      af
-       ret
+display_common:
+       ld  e,(hl)
+       jp  drw_spr
+
+;you_not_normal:
+;      ld       hl,(score)
+;      ld       de,-6
+;      add      hl,de    
+;      ld       a,255
+;      cp       h
+;      jr       nz,_ok_
+;      ld       hl,0
+;_ok_: ld       (score),hl
+;      ld       a,(your_status)
+;      dec      a
+;      ld       (your_status),a
+;      inc      a
+;      and      14
+;      xor      14
+;      ld       hl,x-1
+
+;explosion_stuff:
+;      rra
+;      add a,a
+;      add a,a
+;      add a,a
+;      ld  c,a
+;      ld  b,0
+;      ld  ix,spr_explosion
+;      add ix,bc
+;      inc hl
+;      ld  d,(hl)
+;      inc hl
+;      jr  display_common
 
 ;--------------------------- level events -------------------------------------
 
@@ -232,29 +222,41 @@ Level_event:
        ret nz
 
 do_event:
-       ld  hl,(curevent)
-       inc hl
-
-       ld  de,enemies
-       dec de
-       dec de
-search_noenemy:
+       ld  hl,(curevent)       ;+1
+       ld  de,enemies-4
+chk_noenemy:
+       inc de
+       inc de
        inc de
        inc de
        ld  a,(de)
-       cp  $ff
-       jr  nz,search_noenemy
+       or  a
+       jr  nz,chk_noenemy
+
+       ld  a,$01
+       ld  (de),a      ;occ
+       inc de
+
+       ld  a,(hl)
+       ld  (de),a      ;type
+       inc de
 
        ld  a,$5a
-       ld  (de),a
+       ld  (de),a      ;x
        inc de
+
+       inc hl                  ;+2
        ld  a,(hl)
-       ld  (de),a
+       ld  (de),a      ;y
 
-       inc hl
-       ld  (curevent),hl
+       inc hl                  ;+0
        ld  a,(hl)
+       cp  $ff
+       jp  z,Next_level
        ld  (nextevent),a
+
+       inc hl                  ;+1
+       ld  (curevent),hl
        ret
 
 ;--------------------------- handle enemies -----------------------------------
@@ -264,9 +266,17 @@ Handle_enemies:
 
 handle_enemy:
        push hl
-       ld  d,(hl)
+
+       ld  a,(hl)
+       cp  1
+       jr  nz,next_enemy
+
        inc hl
-       ld  e,(hl)
+       ld  c,(hl)              ;type
+       inc hl
+       ld  d,(hl)              ;x
+       inc hl
+       ld  e,(hl)              ;y
 
        ld  a,d
        or  a
@@ -279,10 +289,14 @@ handle_enemy:
        dec hl
        ld  (hl),d
        ld  ix,spr_enemy01
+       ld  b,$00
+       add ix,bc
        call drw_spr
        jr  next_enemy
 
 remove_enemy:
+       dec hl
+       dec hl
        dec hl
        ld  (hl),$0000
 
@@ -290,151 +304,148 @@ next_enemy:
        pop hl
        inc hl
        inc hl
+       inc hl
+       inc hl
        ld  a,(hl)
        cp  $ff
        jr  nz,handle_enemy
 
        ret
 
+;--------------------------- check collision ----------------------------------
+
+Enemies_hit:
+       ld  de,(x)              ;e = X, d = Y
+       ld  hl,enemies-4
+check_next:
+       inc hl
+       inc hl
+       inc hl
+       inc hl
+
+       ld  a,(hl)
+       cp  $ff
+       ret z                   ;-1 = no more enemies
+       push hl
+       cp  1
+       jr  nz,nocrash          ;1 = enemy
+
+       inc hl
+       inc hl
+       ld  a,(hl)              ;check x match
+       sub e
+       add a,6
+       jp  m,nocrash
+       cp  12
+       jr  nc,nocrash
+
+       inc hl
+       ld  a,(hl)              ;check y match
+       sub d
+       add a,6
+       jp  m,nocrash
+       cp  12
+       jr  nc,nocrash
+
+       dec hl
+       dec hl
+       ld  (hl),0
+       dec hl
+       ld  (hl),2              ;set to explode
+
+nocrash:
+       pop hl
+       jr  check_next
+
+;--------------------------- next level ---------------------------------------
+
+Next_level:
+       ld  hl,Leveldata+1
+       ld  (curevent),hl
+       ret
+
 ;--------------------------- putsprite ----------------------------------------
 
 offsets_table:
-         .db      128,64,32,16,8,4,2,1
-drw_spr: ld       a,d
-         and      7
-         ld       hl,offsets_table
-         ld       c,a
-         ld       b,0
-         add      hl,bc
-         ld       a,(hl)
-         ld       (_smc1+1),a
-
-         ld       (_smc1+1),a
-         ld       hl,GRAPH_MEM
-         ld       a,e
-         add      a,a
-         add      a,e
-         add      a,a
-         rl       b
-         add      a,a
-         rl       b
-         srl      d
-         srl      d
-         srl      d
-         add      a,d
-         jr       nc,_n1
-         inc      b
-_n1:     ld       c,a
-         add      hl,bc                                    
+       .db 128,64,32,16,8,4,2,1
+drw_spr:
+       ld  a,d
+       and 7
+       ld  hl,offsets_table
+       ld  c,a
+       ld  b,0
+       add hl,bc
+       ld  a,(hl)
+       ld  (_smc1+1),a
+
+       ld  (_smc1+1),a
+       ld  hl,GRAPH_MEM
+       ld  a,e
+       add a,a
+       add a,e
+       add a,a
+       rl  b
+       add a,a
+       rl  b
+       srl d
+       srl d
+       srl d
+       add a,d
+       jr  nc,_n1
+       inc b
+_n1:   ld  c,a
+       add hl,bc
           
-         ld       d,(ix)       
-         ld       b,(ix+1)        
-_oloop:  push     bc                         ;Save # of rows
-         push     hl                         ;Save screen address
-         ld       b,d                        ;Load width
-         ld       c,(ix+2)                   ;Load one line of image
-         inc      ix
-_smc1    ld       a,1                        ;Load pixel mask
-_iloop:  sla      c                          ;Test leftmost pixel
-         jr       nc,_noplot                 ;See if a plot is needed
-         ld       e,a                        ;OR pixel with screen
-         or       (hl)
-         ld       (hl),a
-         ld       a,e
+       ld  d,(ix)
+       ld  b,(ix+1)
+_oloop:        push bc                 ;Save # of rows
+       push hl                 ;Save screen address
+       ld  b,d                 ;Load width
+       ld  c,(ix+2)            ;Load one line of image
+       inc ix
+_smc1: ld  a,1                 ;Load pixel mask
+_iloop:        sla c                   ;Test leftmost pixel
+       jr  nc,_noplot          ;See if a plot is needed
+       ld  e,a                 ;OR pixel with screen
+       or  (hl)
+       ld  (hl),a
+       ld  a,e
 _noplot: rrca
-         jr       nc,_notedge                ;Test if edge of byte reached
-         inc      hl                         ;Go to next byte
-_notedge:djnz     _iloop
-         pop      hl                         ;Restore address
-         ld       bc,12                      ;Go to next line
-         add      hl,bc
-         pop      bc                         ;Restore data
-         djnz     _oloop
-         ret
+       jr  nc,_notedge         ;Test if edge of byte reached
+       inc hl                  ;Go to next byte
+_notedge:djnz _iloop
+       pop hl                  ;Restore address
+       ld  bc,12               ;Go to next line
+       add hl,bc
+       pop bc                  ;Restore data
+       djnz _oloop
+       ret
 
-;drw_sprw:
-         ld       a,d
-         and      7                          
-         ld       hl,offsets_table          
-         ld       c,a                
-         ld       b,0                    
-         add      hl,bc                
-         ld       a,(hl)               
-
-         ld       (wsmc1+1),a
-         ld       (wsmc2+1),a
-         ld       hl,GRAPH_MEM
-
-         ld       a,e
-         add      a,a
-         add      a,e
-         add      a,a
-         rl       b
-         add      a,a
-         rl       b
-         srl      d
-         srl      d
-         srl      d
-         add      a,d
-         jr       nc,n1
-         inc      b
-n1:      ld       c,a
-         add      hl,bc                                    
-          
-         ld       d,(ix)       
-         ld       b,(ix+1)        
-woloop:  push     bc                         ;Save # of rows
-         push     hl                         ;Save screen address
-         ld       b,d                        ;Load width
-         ld       c,(ix+2)                   ;Load one line of image
-         inc      ix
-wsmc1    ld       a,1                        ;Load pixel mask
-wiloop:  sla      c                          ;Test leftmost pixel
-         jr       nc,wnoplot                 ;See if a plot is needed
-         ld       e,a                        ;OR pixel with screen
-         or       (hl)
-         ld       (hl),a
-         ld       a,e
-wnoplot: rrca
-         jr       nc,wnotedge                ;Test if edge of byte reached
-         inc      hl                         ;Go to next byte
-wnotedge
-wsmc2:   cp       1
-         jr       z,wover_1
-
-         djnz     wiloop
-         pop      hl                         ;Restore address
-         ld       bc,12                      ;Go to next line
-         add      hl,bc
-         pop      bc                         ;Restore data
-         djnz     woloop
-         ret
-wover_1: ld       c,(ix+2)
-         inc      ix
-         djnz     wiloop
-         dec      ix
-         pop      hl
-         ld       bc,12
-         add      hl,bc
-         pop      bc
-         djnz     woloop
-         ret
 
 
-HL_Decimal:
-       ld (_penCol),de                 ;set display position
-       ld de,StringPlace+4             ;end of location to store string
-       ld b,5                          ;digits
-ConvLoop:
-       call UNPACK_HL                  ;value to string
-       add a,'0'
-       ld (de),a                       ;store char
-       dec de
-       djnz ConvLoop                   ;loop
-       ld hl,StringPlace               ;display stored chars
-       call _vputs
-       ret
+_D_HL_DECI:
+         push     bc
+         ld       de,up_data+4
+         ld       b,5
+ldhld:   call     UNPACK_HL
+         add      a,'0'
+         ld       (de),a
+         dec      de
+         djnz     ldhld
+         ld       hl,up_data
+         ld       b,4
+lis:     ld       a,(hl)
+         cp       '0'
+         jr       nz,dis
+         ld       (hl),' '
+         inc      hl
+         djnz     lis
+dis:     ld       hl,up_data
+         call     _puts
+         pop      bc
+         ret
 
+up_data: .db      "PAD98",0
 
 
 
@@ -451,12 +462,10 @@ spr_ship:
        .db %11111000
 
 spr_bullet01:
-       .db 3,5
-       .db %01000000
-       .db %11100000
-       .db %11100000
-       .db %11100000
-       .db %11100000
+       .db 5,3
+       .db %11110000
+       .db %11111000
+       .db %11110000
 
 spr_bullet02:
        .db 3,3
@@ -472,98 +481,113 @@ spr_enemy01:
        .db %11110000
        .db %01110000
        .db %00111100
+spr_enemy02:
+       .db 6,6
+       .db %01111100
+       .db %11110000
+       .db %10111000
+       .db %10111000
+       .db %11110000
+       .db %01111100
 
 spr_explosion:                               
-         .db      8,6
-         .db      %00000000
-         .db      %00011100
-         .DB      %00111110
-         .DB      %01010110
-         .DB      %00111000
-         .DB      %00000000
-         .db      8,6
-         .db      %00110000
-         .db      %01001110
-         .DB      %10111110
-         .DB      %01001111
-         .DB      %00111000
-         .DB      %00011010
-         .db      8,6
-         .db      %11110011
-         .db      %01001110
-         .DB      %10110101
-         .DB      %01000101
-         .DB      %00111110
-         .DB      %11011010
-         .db      8,6
-         .db      %11110011
-         .db      %01001110
-         .DB      %10110101
-         .DB      %01000101
-         .DB      %00111110
-         .DB      %11011010
-         .db      8,6
-         .db      %01000001
-         .db      %00100110
-         .DB      %00010101
-         .DB      %01000100
-         .DB      %00010010
-         .DB      %10011010
-         .db      8,6
-         .db      %01000010
-         .db      %00100000
-         .DB      %00000001
-         .DB      %01000100
-         .DB      %00100010
-         .DB      %10001010
-         .db      8,6
-         .db      %00001000
-         .db      %11000010
-         .DB      %00000000
-         .db      %00100000
-         .db      %00000001
-         .db      %00110000
-         .db      8,6
-         .db      %00000100
-         .DB      %00000000
-         .DB      %01000000
-         .DB      %00000000
-         .db      %00000001
-         .db      %00100100
+       .db 8,6
+       .db %00000000
+       .db %00011100
+       .db %00111110
+       .db %01010110
+       .db %00111000
+       .db %00000000
+
+       .db 8,6
+       .db %00110000
+       .db %01001110
+       .db %10111110
+       .db %01001111
+       .db %00111000
+       .db %00011010
+
+       .db 8,6
+       .db %11110011
+       .db %01001110
+       .db %10110101
+       .db %01000101
+       .db %00111110
+       .db %11011010
+
+       .db 8,6
+       .db %11110010
+       .db %01001110
+       .db %10110101
+       .db %01000101
+       .db %00111110
+       .db %01011010
+
+       .db 8,6
+       .db %01000001
+       .db %00100110
+       .db %00010101
+       .db %01000100
+       .db %00010010
+       .db %10011010
+
+       .db 8,6
+       .db %01000100
+       .db %00100000
+       .db %00000001
+       .db %01000100
+       .db %00100010
+       .db %10001000
+
+       .db 8,6
+       .db %00001000
+       .db %11000010
+       .db %00000000
+       .db %00100000
+       .db %00000001
+       .db %00110000
+
+       .db 8,6
+       .db %00000100
+       .db %00000000
+       .db %01000000
+       .db %00000000
+       .db %00000001
+       .db %00100100
 
 ;---------------------------- level data -------------------------------------
 Leveldata:
-       .db $90,$40
-       .db $90,$30
-       .db $90,$20
-       .db $90,$10
-       .db $00,$00
+       .db $10,$00,$40         ;$time (ff=end)    $type    $y-pos
+       .db $10,$08,$30
+       .db $10,$08,$20
+       .db $40,$00,$10
+       .db $ff,$ff,$ff
 
 ;---------------------------- texts ------------------------------------------
 
 title_message:
-         .db      "G A L A X I A N",0
+         .db      "* * NEMESIS * *",0
 
 ;---------------------------- save data --------------------------------------
 
 stored_data_start:
 
-curevent       .dw Leveldata           ;next event
+curevent       .dw Leveldata+1         ;next event
 nextevent      .db (Leveldata)         ;time to next event
 score          .dw $0000
 lives          .dw $0003
-level          .dw $0003
-x              .db $46
+level          .dw $0000
+x              .db $16
 y              .db $46
-lasers         .db $03
+shield         .db $00
 ybullets       .dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 ebuls          .dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-enemies                .dw $3335,$2323,$4040,$ffff,$ffff
-               .dw $ffff,$ffff,$ffff,$ffff,$ffff
-               .dw 0,0,0,0,0
-               .dw 0,0,0,0,0
-               .dw 0,0,0,0,0,0,0,0,0,0
-               .dw 0,0,0,0,0,0,0,0,0,$ffff
+enemies                .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
+               .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
+               .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
+               .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$ffff,$ffff
+; 0011 2233 >> 0=occupation (0=no enemy 1=normal 2=exploding)
+;              1=frame/ship 2=x 3=y
 
 boss_status    .db 00
 boss_pwr          .db 00
@@ -589,11 +613,17 @@ stored_data_end:
 ;NEMESIS'86 by Shiar
 
 
-;0.01.717 -- 17.VII.99 -- size 984
+; 0.01.717 -- 17.VII.99 -- size 984
 ;
 ;      + movement of ship over whole screen
 ;      + enemies moving from right to left, appearing right at specified times
-
-
+;
+; 0.1.718  -- 18.VII.99 -- size 907
+;
+;      * no crash when level restarts for the third time
+;      * exit-procedure updated, unnecessary stuff/keychecks removed
+;      * alot of unused code removed
+;      + different types of enemies (just look different)
+;      + collision detection!! enemy ships disappear when you hit them