From: Mischa Poslawsky Date: Mon, 19 Jul 1999 22:00:00 +0000 (+0200) Subject: version 0.4: misc code improvements X-Git-Url: http://git.shiar.net/nemesis.git/commitdiff_plain/026d2d55516b9bf4d2826305f33a898043e46b81 version 0.4: misc code improvements # collision detection fixed and optimized (much faster now!) + shell-icon added (YAS type) * code optimizations, some data "compression" * explosion looks better, and some vars removed/smaller # enemies are removed when @ left side (instead of becoming invisible) + displays level number before each level begins --- diff --git a/nemesis.z80 b/nemesis.z80 index b735b9c..19d3b9e 100644 --- a/nemesis.z80 +++ b/nemesis.z80 @@ -6,9 +6,10 @@ nop jp Start - .dw $0000 + .dw $0001 .dw Title -Title: .db "Nemesis v0.3.719 by Shiar",0 + .dw spr_ship +Title: .db "Nemesis v0.4.720 by Shiar",0 Start: jr init @@ -22,6 +23,7 @@ init: ;-------------------- main menu ----------------------------------------------- + call Next_level jp play_game ;-------------------- exit ---------------------------------------------------- @@ -32,32 +34,15 @@ exit_game: ;----------------------- game setup ------------------------------------------- play_game: - ld hl,stored_data_start - ld bc,variables_end-stored_data_start-1 ;---------------------- display setup ---------------------------------------- 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 + ld (_curCol),16 + ld (_curRow),6 + ld hl,txt_score call _puts - djnz l11 - -in_game_text: - .db 16,0,"LIVES",0 - .db 16,3,"LEVEL",0 - .db 16,6,"SCORE",0 - -str_question: - .db "-----",0 ;------------------------------------------------------------------------------ ;-------------------------- game loop ----------------------------------------- @@ -71,7 +56,6 @@ Clear_screen: xor a ld hl,GRAPH_MEM+(16*12) ld b,a - ld a,(background) clearloop: ld (hl),a inc hl @@ -122,9 +106,9 @@ displayloop: dec a jr nz,displayloop -; ld hl,$1007 ;Display Score -; ld (_curRow),hl -; ld hl,(score) + ld hl,$1006 ;Display Score + ld (_curRow),hl + ld hl,(timer) ; jp _D_HL_DECI ret @@ -184,7 +168,7 @@ no_right: cp 15 ;y > 15 jr z,no_up ld (hl),a -no_up: ld ix,spr_ship +no_up: ld ix,spr_ship01 display_common: ld e,(hl) @@ -214,8 +198,6 @@ explosion_stuff: jr display_common damage_you: - or %10101010 - ld (background),a ret ;------------------------- fire bullet ---------------------------------------- @@ -309,8 +291,8 @@ hit_enemies: ;Hits with normal enemies push hl ld a,(hl) - and %00000001 - jr z,nohit ;no hit when enemy_occ <> 1 + and %00000010 + jr z,nohit ;no hit when enemy_occ <> 2/3 inc hl inc hl @@ -339,20 +321,19 @@ hit_enemies: ;Hits with normal enemies dec hl dec hl ld a,(hl) ;occ + ld b,a srl a srl a ;occ/4 = HP left jr nz,hpleft - ld (hl),2 ;set to explode + ld (hl),$01 ;set to explode inc hl ld (hl),a ;explosionFrame 0 pop hl ret hpleft: - dec a - add a,a - add a,a - inc a ;HP*4+1 = occ 1 + ld a,b + sub %00000100 ;decrease HP by one ld (hl),a ;save pop hl ret @@ -383,26 +364,25 @@ chk_noenemy: inc de inc de ld a,(de) - or a + or a ;0 = no enemy present jr nz,chk_noenemy - inc de - ld a,(hl) - ld (de),a ;type + ld a,(hl) ;type ld hl,enemy01 ld c,a ld b,0 add hl,bc - add hl,bc add hl,bc ;hl = enemy specs - dec de - ld a,(hl) ;load hitpoints - or 1 ;set type 1 (normal) enemy + ld a,(hl) ;load hitpoints+occ of this enemy class ld (de),a ;occ + inc hl inc de + ld a,(hl) ;load movement+type of this enemy class + ld (de),a ;type + inc de - ld a,$5a + ld a,$5a ;appear at right edge of screen ld (de),a ;x inc de @@ -411,14 +391,14 @@ chk_noenemy: ld a,(hl) ld (de),a ;y - inc hl ;+0 + inc hl ;@ next event ld a,(hl) - cp $ff + cp $ff ;255 = end marker jp z,Next_level - ld (nextevent),a + ld (nextevent),a ;else time to next event inc hl - ld (curevent),hl + ld (curevent),hl ;update pointer ret ;--------------------------- enemy fires -------------------------------------- @@ -448,8 +428,8 @@ Enemy_fires: dec c ;c = x-2 inc hl ld a,(hl) ;y-pos - add a,5 - ld e,a ;e = y+5 + inc a + ld e,a ;e = y+1 ld b,10 ld hl,ebullets @@ -540,7 +520,7 @@ remove_ebullet: Handle_enemies: ld hl,enemies - ld b,20 + ld b,20 ;loop 20x handle_enemy: push bc @@ -549,31 +529,38 @@ handle_enemy: ld a,(hl) and %00000011 jr z,next_enemy ;occ "no enemy" 0 - and %00000001 - jr z,exploding_enemy ;occ "exploding" 2 + dec a + jr z,exploding_enemy ;occ "exploding" 1 + ld b,0 + dec a + jr z,normal_enemy ;occ "normal" 2 -normal_enemy: ;occ "normal" 1 +moving_enemy: ;occ "moving" 3 + ld b,1 + +normal_enemy: inc hl ld a,(hl) ;type add a,a add a,a add a,a ld c,a ;type*8 = offset - inc hl - ld d,(hl) ;x - inc hl - ld e,(hl) ;y - ld a,d - or a - jr z,next_enemy - dec a + inc hl + ld a,(hl) ;x + dec a ;move left + jp m,remove_enemy ;off screen + jr z,remove_enemy ;" ld d,a - jr z,remove_enemy - ld (hl),e + inc hl + ld a,(hl) ;y + ;;;;;;;;;;;;;;;; ; + ld (hl),a ;store new y + ld e,a + dec hl - ld (hl),d + ld (hl),d ;store new x ld ix,spr_enemy01 ld b,$00 add ix,bc @@ -581,12 +568,9 @@ normal_enemy: ;occ "normal" 1 jr next_enemy remove_enemy: - dec hl - dec hl -enemy_gone: - dec hl + pop hl ld (hl),$0000 ;bye bye enemy - + push hl next_enemy: pop hl ld bc,$0004 @@ -604,7 +588,7 @@ exploding_enemy: ld a,(hl) cp 15 - jr z,enemy_gone ;remove when at last frame + jr z,remove_enemy ;remove when at last frame inc a ld (hl),a ;next frame jr next_enemy @@ -613,55 +597,85 @@ exploding_enemy: Enemies_hit: ld a,(your_occ) - or a + or a ;0 = you're normal ret nz ld de,(x) ;e = X, d = Y - ld hl,enemies-4 -check_next: - ld bc,$0004 - add hl,bc - - ld a,(hl) - cp $ff - ret z ;-1 = no more enemies + ld hl,enemies + ld b,20 ;check all 20 enemies +check_collision: push hl - cp 1 - jr nz,nocrash ;1 = enemy + ld a,(hl) + and %00000010 + jr z,check_next ;2/3 = ok inc hl inc hl ld a,(hl) ;check x match sub e add a,6 - jp m,nocrash + jp m,check_next cp 12 - jr nc,nocrash + jr nc,check_next inc hl ld a,(hl) ;check y match sub d add a,6 - jp m,nocrash + jp m,check_next cp 12 - jr nc,nocrash + jr nc,check_next dec hl dec hl - ld (hl),0 ;explosionFrame 0 + xor a + ld (hl),a ;explosionFrame 0 dec hl - ld (hl),2 ;set to explode - call damage_you + inc a + ld (hl),a ;set to explode + call damage_you ;auch! -nocrash: +check_next: pop hl - jr check_next + inc hl + inc hl + inc hl + inc hl + djnz check_collision + ret ;--------------------------- next level --------------------------------------- Next_level: - ld hl,Leveldata+1 + ld hl,Leveldata+1 ;reset level data ld (curevent),hl + + call _clrLCD ;clear screen + ld hl,$0703 + ld (_curRow),hl ;center + ld hl,txt_level + call _puts ;display "LEVEL " + + ld a,(level) + inc a ;increase level nr. + ld (level),a + ld l,a + ld h,$00 + + call UNPACK_HL + add a,'0' + ld b,a + call UNPACK_HL + add a,'0' + call _putc ;display second digit + ld a,b + call _putc ;display first digit + + ld b,$20 +wait: halt \ halt + djnz wait ;delay + call _getkey ;wait for keypress + ret ;--------------------------- putsprite ---------------------------------------- @@ -752,7 +766,17 @@ up_data: .db "PAD98",0 ;------------------------------- sprites -------------------------------------- spr_ship: - .db 7,7 ;your ship: + .db 7,1 ;ship icon + .db %11000000 ; ██ + .db %11110000 ; ████ + .db %01111100 ; █████ + .db %01110010 ; ███ █ + .db %01111100 ; █████ + .db %11110000 ; ████ + .db %11000000 ; ██ + +spr_ship01: + .db 7,7 ;ship alpha class .db %01110000 ; ███ .db %11100000 ; ███ .db %11111100 ; ██████ @@ -760,6 +784,15 @@ spr_ship: .db %11111100 ; ██████ .db %11100000 ; ███ .db %01110000 ; ███ +spr_ship02: + .db 7,7 ;ship beta class + .db %11000000 ; ██ + .db %11110000 ; ████ + .db %01111100 ; █████ + .db %01110010 ; ███ █ + .db %01111100 ; █████ + .db %11110000 ; ████ + .db %11000000 ; ██ spr_bullet01: .db 5,3 ;your bullets @@ -778,146 +811,96 @@ spr_bullet11: .db %11100000 ; ███▓▒░ .db %01000000 ; █▓▒░ -spr_enemy01: - .db 6,6 ;enemy type one - .db %00111100 ; ████ - .db %01110000 ; ███ - .db %11110000 ; ████ - .db %11110000 ; ████ - .db %01110000 ; ███ - .db %00111100 ; ████ -spr_enemy02: - .db 6,6 ;enemy type two - .db %01111100 ; █████ - .db %11110000 ; ████ - .db %10111000 ; █ ███ - .db %10111000 ; █ ███ - .db %11110000 ; ████ - .db %01111100 ; █████ -spr_enemy03: - .db 6,6 ;enemy type three - .db %00111000 ; ███ - .db %01111100 ; █████ - .db %11111000 ; █████ - .db %11111000 ; █████ - .db %01111100 ; █████ - .db %00111000 ; ███ -spr_enemy03: - .db 6,6 ;enemy type three - .db %00111000 ; ███ - .db %01111100 ; ██ - .db %11111000 ; █████ - .db %11111000 ; █████ - .db %01111100 ; █████ - .db %00111000 ; ███ - spr_explosion: .db 8,6 ;1 .db %00000000 - .db %00011100 - .db %00111110 - .db %01010110 - .db %00111000 + .db %00011100 ; ███ + .db %00111110 ; █████ + .db %01010110 ; █ █ ██ + .db %00111000 ; ███ .db %00000000 .db 8,6 ;2 - .db %00110000 - .db %01001110 - .db %10111110 - .db %01001111 - .db %00111000 - .db %00011010 + .db %00110000 ; ██ + .db %01001110 ; █ ▒███ + .db %10111110 ; █ █████ + .db %01001111 ; █ ▒████ + .db %00111000 ; ███ + .db %00011010 ; ██ █ .db 8,6 ;3 - .db %11110011 - .db %01001110 - .db %10110101 - .db %01000101 - .db %00111110 - .db %11011010 + .db %10110011 ; █ ██ ██ + .db %01001110 ; █ ███ + .db %10110101 ; █ ██▒█▒█ + .db %01000101 ; █ ▒█▒█ + .db %00111110 ; █████ + .db %11011010 ; ██ ██ █ .db 8,6 ;4 - .db %11110010 - .db %01001110 - .db %10110101 - .db %01000101 - .db %00111110 - .db %01011010 + .db %00101010 ; ▒ █▒█ █▒ + .db %01000110 ; █ ▒██ + .db %10110101 ; █ ██ █ █ + .db %01100110 ; ██ ██▒ + .db %00111100 ; ████▒ + .db %01011001 ; ▒█ ██ ▒█ .db 8,6 ;5 - .db %01000001 - .db %00100110 - .db %00010101 - .db %01000100 - .db %00010010 - .db %10011010 + .db %01000001 ; █▒ ▒ ▒█ + .db %00100101 ; ▒█ █▒█ + .db %00010100 ; ▒ ▒█ █ ▒ + .db %01000100 ; █▒ █ + .db %00010010 ; ▒█▒▒█ + .db %10011010 ; █▒ ██ █▒ .db 8,6 ;6 - .db %01000100 - .db %00100000 - .db %00000001 - .db %01000100 - .db %00100010 - .db %10001000 + .db %01000100 ; █ █ ▒ + .db %00100000 ; ▒█ ▒ ▒ + .db %00000001 ; ▒ ▒ █ + .db %01000100 ; █ █ + .db %00100010 ; █▒ █ + .db %01001000 ; ▒█ ▒█ ▒ .db 8,6 ;7 - .db %00001000 - .db %11000010 - .db %00000000 - .db %00100000 - .db %00000001 - .db %00110000 + .db %00001000 ; ▒ █▒ + .db %11000010 ; ██ ▒ █ + .db %00000000 ; ▒ + .db %00100000 ; ▒█ ▒ + .db %00000001 ; ▒ ▒█ + .db %00110000 ; ▒██▒ .db 8,6 ;8 - .db %00000100 - .db %00000000 - .db %01000000 - .db %00000000 - .db %00000001 - .db %00100100 - -;---------------------------- enemy types ------------------------------------- - -enemy01: .db %00000000,$ff,$ff ;$hits $fire frequency -enemy02: .db %00000100,$ff,$ff -enemy03: .db %00001000,$ff,$ff - -;---------------------------- level data -------------------------------------- - -Leveldata: - .db $01,$01,$40 ;$time (ff=end) $type $y-pos - .db $10,$00,$30 - .db $10,$02,$20 - .db $40,$01,$10 - .db $01,$00,$44 - .db $15,$01,$31 - .db $04,$02,$38 - .db $05,$00,$40 - .db $03,$00,$2f - .db $04,$00,$3a - .db $12,$00,$10 - .db $10,$00,$18 - .db $0e,$00,$20 - .db $0c,$00,$28 - .db $0a,$00,$30 - .db $08,$00,$38 - .db $06,$00,$40 - .db $04,$00,$48 - .db $2a,$00,$20 - .db $ff,$ff,$ff + .db %00000100 ; ▒█ + .db %00000000 ; ▒▒ ▒ + .db %01000000 ; █ + .db %00000000 ; ▒ + .db %00000010 ; █▒ + .db %00100100 ; █▒ █ + +spr_icon01: + .db 5,4 + .db %00100000 ; █ + .db %10101000 ; █ █ █ + .db %11111000 ; █████ + .db %01110000 ; ███ +spr_icon02: + .db 5,4 + .db %00000000 ; ███ + .db %00000000 ; ██ ██ + .db %00000000 ; █ █ + .db %00000000 ; ;---------------------------- texts ------------------------------------------- -title_message: - .db "* * NEMESIS * *",0 +txt_title: .db "* * NEMESIS * *",0 +txt_level: .db "LEVEL ",0 +txt_score: .db "SCORE",0 ;---------------------------- save data --------------------------------------- stored_data_start: -level .dw $0000 ;level number -background .db %00000001 ;level background -timer .dw $0000 +level .db $00 ;level number +timer .db $00 ;frame counter curevent .dw Leveldata+1 ;next event nextevent .db (Leveldata) ;time to next event @@ -928,7 +911,6 @@ lives .dw $0003 ;unused x .db $16 ;x-pos y .db $46 ;think about it.. hp .db $00 ;hitpoints left -your_status .db $00,$00 ;unused ybullets .dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;10 x (state,x,y) ebullets .dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;10 x (state,x,y) @@ -938,21 +920,90 @@ 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 -; 0011 2233 >> 0=occupation (and %00000011: 0=no enemy 1=normal 2=exploding) -; 1=frame/ship 2=x 3=y -variables_end: +; %111111 (HP left) 11 (00=no enemy 01=exploding 10=normal 11=moving) +; %111 (move ptrn) 11111 (ship or explosion frame) %11111111 (x) %11111111 (y) -stored_data_end: +;---------------------------- enemy data -------------------------------------- + +spr_enemy01: + .db 6,6 ;enemy type one + .db %00111100 ; ████ + .db %01110000 ; ███ + .db %11110000 ; ████ + .db %11110000 ; ████ + .db %01110000 ; ███ + .db %00111100 ; ████ +spr_enemy02: + .db 6,6 ;enemy type two + .db %00111000 ; ███ + .db %01100000 ; ██ + .db %11111100 ; ██████ + .db %11111100 ; ██████ + .db %01100000 ; ██ + .db %00111000 ; ███ +spr_enemy03: + .db 6,6 ;enemy type three + .db %01111100 ; █████ + .db %11110000 ; ████ + .db %11111000 ; █████ + .db %11111000 ; █████ + .db %11110000 ; ████ + .db %01111100 ; █████ +spr_enemy04: + .db 6,6 ;enemy type four + .db %00111000 ; ███ + .db %01111100 ; █████ + .db %11111000 ; █████ + .db %11111000 ; █████ + .db %01111100 ; █████ + .db %00111000 ; ███ + +enemy01: + .db %00000010,%00000000 ;first two enemy bytes +enemy02: + .db %00000010,%00100001 +enemy03: + .db %00000110,%00000010 +enemy04: + .db %00010010,%00000010 + +;---------------------------- level data -------------------------------------- + +Leveldata: + .db $01,$01,$40 ;$time (ff=end) $type $y-pos + .db $10,$00,$30 + .db $10,$02,$20 + .db $40,$01,$10 + .db $01,$00,$44 + .db $15,$01,$31 + .db $04,$02,$38 + .db $05,$00,$40 + .db $03,$00,$2f + .db $04,$00,$3a + .db $12,$02,$10 + .db $10,$03,$18 + .db $0e,$03,$20 + .db $0c,$03,$28 + .db $0a,$02,$30 + .db $08,$02,$38 + .db $06,$01,$40 + .db $04,$00,$48 + .db $2a,$00,$20 + .db $ff,$ff,$ff + +;----------------------------- end -------------------------------------------- .end +.end -;NEMESIS'86 by Shiar +;----------------------------- NEMESIS'86 by Shiar ---------------------------- +;----------------------------- version history -------------------------------- ;0.01.717 -- 17.VII.99 -- size 984 ; @@ -978,5 +1029,14 @@ stored_data_end: ; + some enemies can take multiple hits (differs per class) ; + all enemies fire bullets at random ; + if you're hit by bullet/enemy, you'll lose one hitpoint +; +; 0.4.720 -- 20.VII.99 -- size 1481 +; +; * collision detection fixed and optimized (much faster now!) +; + shell-icon added (YAS type) +; * code optimizations, some data "compression" +; * explosion looks better, and some vars removed/smaller +; * enemies are removed if at left side (instead of becoming invisible) +; + displays level number before each level begins