Jump to content
IGNORED

Metroid 2600 - Released


Rabbit 2600

Recommended Posts

My current project is a hack of Berzerk, I'm trying too make a Metroid game, I really wanted too use Alien, Wizard of Wor or Dark Cavern, but editing the sprites where a bit odd so I resorted to Berzerk instead. This is what I've done so far: Changed the robots into metroids and the player into Samus. I still have to give Evil Otto a makeover. Here's a screenshot, what do you think about the spriting? Good enough?

10_zps5263d985.png

 

EDIT - The graphical hack is now complete - Look further down for the fixed edition

Edited by Rabbit 2600
  • Like 2
Link to comment
Share on other sites

  • 2 weeks later...

Be aware that there are 2 game-killing errors in the original game (attract mode timer and reserve life addition). Correcting either of them are easy using a disassembly.

 

To fix the first glitch, store the current LSR'ed stick value (in the accumulator) to the attract timer when the stick is moved.

 

Fixing the second needs an additional branch to abort reserve life addition if already at 127 lives. Just use BMI to skip storing if the new value is 128.

Link to comment
Share on other sites

Fix #1:

LF339:
      lda    #$00    ;2
      sta    $E7     ;3
      lda    #$7F    ;2
      sta    $E8     ;3
      lda    SWCHA   ;4
      lsr            ;2
      lsr            ;2
      lsr            ;2
      lsr            ;2
      eor    #$0F    ;2
;;       and    #$0F    ;2 superfluous
;;       bne    LF363   ;2
      bne    LF361   ;2 altered branch

      lda    #$00    ;2
      sta    $91     ;3
      sta    $FD     ;3
      sta    $92     ;3
      lda    $84     ;3
      bne    LF365   ;2
      inc    $87     ;5
      bne    LF365   ;2
      lda    $80     ;3
      jmp    LF21E   ;3
;using the 2 bytes saved above to fix...
LF361:
      sta    $87     ;3 store to attract mode

Edited by Nukey Shay
Link to comment
Share on other sites

Fix #2:

LFA21:
      adc.wy $00DD,Y ;4
      sta.wy $00DD,Y ;5
      lda    #$00    ;2
      dey            ;2
      bpl    LFA21   ;2
      cld            ;2

;BIT doesn't affect the accumulator,
;so move the LDA and AND up above it
      lda    $E7     ;3
      and    #$1F    ;2

      bit    $88     ;3
      bvs    LFA3B   ;2
      bpl    LFA4F   ;2
;;       lda    $E7     ;3
;;       and    #$1F    ;2
      cmp    #$19    ;2
      bne    LFA4F   ;2
LFA3B:
;;       lda    $E7     ;3 remove this
      and    #$0F    ;2
      cmp    #$09    ;2
      bne    LFA4F   ;2
      lda    $E7     ;3
      cmp    $DE     ;3
      beq    LFA4F   ;2
      lda    #$03    ;2
      sta    $81     ;3
      inc    $DA     ;5
;use the 4 bytes saved here...
      bpl    LFA4F   ;2 branch if still less than 128
      dec    $DA     ;5 bump lives back down

LFA4F:
LFA72: ;moved label to reuse rts
      rts            ;6

LFA50:
      lda    $E3     ;3
      asl            ;2
      eor    $E3     ;3
      asl            ;2
      asl            ;2
      rol    $E4     ;5
      rol    $E3     ;5
      lda    $E4     ;3
      and    #$7F    ;2
      sta    $E6     ;3
LFA61:
      clc            ;2
      adc    $E7     ;3
      sec            ;2
      cmp    $E8     ;3
      bcc    LFA72   ;2
      beq    LFA72   ;2
      lsr    $E6     ;5
      lda    $E6     ;3
;;       jmp    LFA61   ;3
      bpl    LFA61   ;3 change to unconditional
;;LFA72:
;;       rts            ;6

Link to comment
Share on other sites

BTW editing the sprites in Alien is no problem if you know how the sprite data is arranged. Every other bitpattern line comes from a seperate data table...so you need to alter two data tables for each sprite.

 

For example...

 

This:

       .byte %00010110 ;$16 ; |   X XX | $F454 Alien frame A 1
      .byte %01011101 ;$5D ; | X XXX X| $F455 Alien frame A 3
      .byte %00110000 ;$30 ; |  XX    | $F456 Alien frame A 5
      .byte %01110000 ;$70 ; | XXX    | $F457 Alien frame A 7
      .byte %01111101 ;$7D ; | XXXXX X| $F458 Alien frame A 9
      .byte %10001000 ;$88 ; |X   X   | $F459 Alien frame A 11
      .byte %10000100 ;$84 ; |X    X  | $F45A Alien frame A 13
      .byte %00000000 ;$00 ; |        | $F45B (end of bitmap)

 

...plus this:

       .byte %00011111 ;$1F ; |   XXXXX| $F558 Alien frame A 2
      .byte %01110100 ;$74 ; | XXX X  | $F559 Alien frame A 4
      .byte %00110000 ;$30 ; |  XX    | $F55A Alien frame A 6
      .byte %01110100 ;$74 ; | XXX X  | $F55B Alien frame A 8
      .byte %11011111 ;$DF ; |XX XXXXX| $F55C Alien frame A 10
      .byte %10001100 ;$8C ; |X   XX  | $F55D Alien frame A 12
      .byte %00000000 ;$00 ; |        | $F55E Alien frame A 14
      .byte %00000000 ;$00 ; |        | $F55F (unused)

...produces this:

       .byte %00010110 ;$16 ; |   X XX | $F454 Alien frame A 1
      .byte %00011111 ;$1F ; |   XXXXX| $F558 Alien frame A 2
      .byte %01011101 ;$5D ; | X XXX X| $F455 Alien frame A 3
      .byte %01110100 ;$74 ; | XXX X  | $F559 Alien frame A 4
      .byte %00110000 ;$30 ; |  XX    | $F456 Alien frame A 5
      .byte %00110000 ;$30 ; |  XX    | $F55A Alien frame A 6
      .byte %01110000 ;$70 ; | XXX    | $F457 Alien frame A 7
      .byte %01110100 ;$74 ; | XXX X  | $F55B Alien frame A 8
      .byte %01111101 ;$7D ; | XXXXX X| $F458 Alien frame A 9
      .byte %11011111 ;$DF ; |XX XXXXX| $F55C Alien frame A 10
      .byte %10001000 ;$88 ; |X   X   | $F459 Alien frame A 11
      .byte %10001100 ;$8C ; |X   XX  | $F55D Alien frame A 12
      .byte %10000100 ;$84 ; |X    X  | $F45A Alien frame A 13
      .byte %00000000 ;$00 ; |        | $F55E Alien frame A 14
      .byte %00000000 ;$00 ; |        | $F45B (end of bitmap)
      .byte %00000000 ;$00 ; |        | $F55F (unused)

Link to comment
Share on other sites

Sprite editing in Alien is much easier using a disassembly which has the bitmap data defined up top as labelled constants:

AlienA01 = %00010110
AlienA02 = %00011111
AlienA03 = %01011101
AlienA04 = %01110100

etc. so that in the data tables, they will be seperated for you by using those labels:

 

      .byte AlienA01 ; $F454
     .byte AlienA03 ; $F455
     .byte AlienA05 ; $F456
     .byte AlienA07 ; $F457

etc.

 

Zero values in the first table are used as delimiters (defines where a bitmap image ends)...but zero values in the second table are allowed. Keep this in mind if you need blank lines within a sprite image.

Link to comment
Share on other sites

  • 3 years later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...