The Bugs Bunny Crazy Castle / Birthday Blowout (Kemco NES) thoughts

Started by tygerbug, August 12, 2022, 04:22:50 AM

Previous topic - Next topic

tygerbug

In (Kemco NES) The Bugs Bunny Crazy Castle, it would be interesting to have the CHR used for character sprites change on every level, to allow for five or six or more sets of (four) enemies. This could even be random.

I would fill these "duplicate" CHRs with lots more Looney Tunes characters, as seen in the Game Boy games and so on. Each has four enemies.

Ideally I could also switch the color palettes used when each CHR loads, so that the enemies have their correct colors. (92AC in the hex, something at 8450 also)

"The fact that four of the different seven enemies are recolored Sylvesters is left over from Roger Rabbit's weasels ... and not great. This could ideally be changed for more variety."

This is the only NES Crazy Castle unless you count Blowout, and it's primitive and less advanced than the Game Boy games became. But more variety could certainly be added.

A disassembly by cyneprepou4uk exists.
https://github.com/cyneprepou4uk/NES-Games-Disassembly/tree/main/Bugs%20Bunny%20Crazy%20Castle

This file seems to call out the CHR bank swaps, which occur for the title, ending, and levels. The code seems to be repeated, although I'm not sure about that. Possibly due to the length of the game.
https://github.com/cyneprepou4uk/NES-Games-Disassembly/blob/main/Bugs%20Bunny%20Crazy%20Castle/bank_FF.asm

"Apparently RAM 68 stores the stage number, up to 3C / 60. Five CHRS are needed for the intro, ending, and stage backgrounds. Starting at CHR 5, five or seven more CHRs could be used for enemy sprites (5-9 or 5-B), selected based on stage number."

In theory, a new subroutine could be added somewhere which would switch sprite CHR between maybe five or seven CHRs based on the value of this RAM.

The password to level 60 is YTKX. Game Genie code GXETZZEI causes invincibility.

Bugs Bunny's Crazy Castle NES was originally Roger Rabbit on FDS, and featured an animated ending with large sprites of Roger and Jessica. Nothing like this appears in the NES version, but this scene features in non-animated form in the Proveaux restoration hack of it. It could be "Looney Tunes-ized."

https://www.romhacking.net/hacks/1620/

Possibly the code from the FDS version could be pulled /disassembled to actually animate this ending as intended. The Proveaux restoration hack simply loads the background and one version of the Roger and Jessica sprites.

The Roger Rabbit and Bugs Bunny versions of the game have slightly different graphic layouts - for example the weasel hats are animated, while Sylvester's head is not. I think this can be compensated for, although I haven't tried myself. The above hack splits the difference with this somewhat. Enemies are also faster in Roger Rabbit.

Ideally for a hack, this animated Roger Rabbit ending could be added to the Crazy Castle version, but nothing else changed.

There is a level editor for Crazy Castle NES and several hacks which change the levels.


-------------------------------------

The enemies in Crazy Castle NES are Sylvester, Daffy, Wile E. Coyote, and Yosemite Sam.

Sequels and spinoffs on Game Boy featured Marc Anthony, the Tasmanian Devil, Tweety Bird, Merlin the Magic Mouse, Foghorn Leghorn, Beaky Buzzard, the "Little Ghost" (Ghost Wanted), and a "flame" in the same style. (The Road Runner appeared in non-Kemco games.) By the fourth installment, Elmer Fudd, Pepe Le Pew, Count Bloodcount and a Leprechaun appeared.

Henery Hawk was in Blowout (along with Sylvester Jr, Elmer Fudd, Tweety, Yosemite Sam, etc).

(By the fourth Game Boy installment there was also a larger Gossamer, Witch Hazel, a Cupid, and more bosslike versions of Marc Anthony, Beaky Buzzard, the Tasmanian Devil and other characters. Lola Bunny and Porky appeared in unrelated GBC games, as did Rocky and Mugsy, Barnyard Dawg, Penelope Polecat, Witch Hazel, Mot, Sylvester Jr, Marvin Martian and K-9 ... in forms that might be useable in Crazy Castle.)


------------


The Bugs Bunny Birthday Blowout (Kemco NES) has unused cutscenes with Porky Pig, Marc Anthony and Pussyfoot, and the Road Runner. Two cutscene images are unused (Porky and a group shot), and the final (group shot) image, similarly has more characters in the prototype ending data.

There was clearly a decision to scrub characters who don't appear as enemies.

Speedy Gonzales also appears as an enemy in the prototype data.

It would be interesting to reinstate the two cutscenes, and include, perhaps, more Looney Tunes characters as common enemies (Marc Anthony? Speedy? Porky?)

Many of the Looney Tunes characters here appear as larger bosses. (Foghorn Leghorn is very large, and Sylvester, Pepe Le Pew and Taz larger than usual ...)
--

There was an unofficial FDS to Famicom conversion of "Roger Rabbit", using an unusual Mapper to make it work. This game had an animated ending not present in "The Bugs Bunny Crazy Castle," which hackers have yet to replicate. I am not sure if this Mapper could be corrected to something more normal -- either based on this or the FDS data.


https://www.nesdev.org/wiki/NES_2.0_Mapper_415


  One hack nobody's done yet would be to use the graphics/characters from the Mickey Mouse Game Boy games. I have no plans personally ...


Bavi_H

The Bugs Bunny Crazy Castle

In this post, I describe modifications that will change the sprite bank to a specific value for each stage.

I am still researching how to change the sprite color palettes to specific values for each stage or sprite bank. (Status: I have found some spots that change the sprite color palettes, but after I changed them, I noticed Yosemite Sam's colors were still normal. I need to find and understand where Yosemite Sam's -- and maybe other characters'? -- colors get set.)

_____


Investigation Process

  • Spoiler
    I used the disassembly and debugging techniques to look for good points in the code to modify to change the sprite bank to a different value for each stage. I also found likely unused areas of memory in the disassembly (there are a few spots that are all hex FF).

    In one of the unused areas of memory, I put a table of byte values for each of the 64 stages, so each stage can have its own freely chosen sprite bank value.

    I initially found a spot in the code before the pre-stage title card fades in that sets the sprite bank number. This same spot is reached right before a stage fades out. I initially used this spot to jump to some patch code to set the sprite bank number depending on the stage number.

    However, if you use the d-pad on the pre-stage title card to change the stage number, the sprite bank needs to change again because the stage number was changed. So I found another spot in the code that displays the stage number. I put a jump to patch code there to change the sprite bank based on the stage number. Then I realized the original spot was redundantly setting the bank number again, so I ended up removing that part with NOP instructions.
    [close]

About Cyneprepou4uk's disassemblies

  • Spoiler
    Cyneprepou4uk's asm files have extra data at the beginning of most lines. Be aware this extra data isn't part of a normal asm file and the assembler won't be able to process the file with the extra data. When you use the assemble.bat included in the disassembly, it first creates temporary copies of the asm files with the extra data removed from the beginning of every line, then assembles from that.

    Format

    a b         c        d  e     f         g
    C - - - - - 0x008020 02:8010: 20 43 80  JSR sub_8043

    a. A "C" in this spot indicates this address was accessed as code in the original test.
    b. A "D" in this spot indicates this address was accessed as data in the original test.
    c. Offset in the NES file
    d. PRG ROM bank
    e. CPU address
    f. Hex byte values at the address
    g. Assembly code

    When you make modifications to Cyneprepou4uk's asm files, you add new lines with assembly code (g) only. If you modify existing lines, I recommend removing the extra data (a to f) since it no longer matches the updates you made.

    I am making modifications in a "patching" style. This means I am trying to keep as much of the code in the exact same spot as possible. If I need to add longer code, I find free space somewhere to put the longer code, then put a jump to the new code in the original spot.

    When I modify lines in the asm file, I count how many bytes I modified and make sure the addresses resume correctly in the unmodified lines after the modification.
    [close]

Modifications

The PRG+CHR CRC32 of the unmodified NES file is E50A9130. The following sections describe the changes I made. You can use the instructions to modify the disassembly or to hex edit the NES file.


1. List of sprite bank numbers for each stage (64 bytes modified)

  • Note: For testing purposes, I just repeated the values 0, 1, 2, and 3 in a cycle. This list will eventually contain the sprite bank numbers you want to use for each of the 64 stages.

  • Disassembly

    • Spoiler
      In the file bank_FF.asm, find the lines with these CPU addresses

      EB71:
      EB80:
      EB90:
      EBA0:
      EBB0:

      Remove those lines and replace them with the following

      sprite_bank_list:
      .byte $00, $01, $02, $03, $00, $01, $02, $03, $00, $01, $02, $03, $00, $01, $02, $03
      .byte $00, $01, $02, $03, $00, $01, $02, $03, $00, $01, $02, $03, $00, $01, $02, $03
      .byte $00, $01, $02, $03, $00, $01, $02, $03, $00, $01, $02, $03, $00, $01, $02, $03
      .byte $00, $01, $02, $03, $00, $01, $02, $03, $00, $01, $02, $03, $00, $01, $02, $03

      .byte      $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
      [close]
  • Hex Editor

    • Spoiler
      At NES file offset EB81:

      00 01 02 03 00 01 02 03 00 01 02 03 00 01 02 03
      00 01 02 03 00 01 02 03 00 01 02 03 00 01 02 03
      00 01 02 03 00 01 02 03 00 01 02 03 00 01 02 03
      00 01 02 03 00 01 02 03 00 01 02 03 00 01 02 03
      [close]

2. Patch code (14 bytes modified)

  • Disassembly

    • Spoiler
      Near the bottom of the file bank_FF.asm, find the lines with these CPU addresses

      FFBF:
      FFC0:

      Remove those lines and replace them with the following

      change_sprite_bank_and_display_stage_num:

      LDX ram_stage_id_1                   ;   X = current_stage
      LDA sprite_bank_list,X               ; \
      STA ram_chr_bank_1                   ; / ram_chr_bank_1 = Mem[sprite_bank_list + X]
      JSR sub_ED00                         ;   change CHR banks
      JSR sub_F230_replace_tiles_with_new  ;   original JSR to change displayed stage number
      RTS                                  ;   Return

      .byte $FF, $FF, $FF

      At the top of the file bank_FF.asm, find the section with the .export lines. In that section, add the following line

      .export change_sprite_bank_and_display_stage_num
      [close]
  • Hex Editor

    • Spoiler
      At NES file offset FFCF:

      A6 68 BD 71 EB 85 33 20 00 ED 20 30 F2 60
      [close]

3. NOP sprite bank number change before pre-stage title card fade in (4 bytes modified)

  • Disassembly

    • Spoiler
      In the file bank_FF.asm, find the lines with these CPU addresses

      C04B:
      C04D:

      Remove those lines and replace them with the following

      NOP
      NOP
      NOP
      NOP
      [close]
  • Hex Editor

    • Spoiler
      At NES file offset C05B:

      EA EA EA EA
      [close]

4. Jump to patch code at stage number display (3 bytes modified)

  • Disassembly

    • Spoiler
      In the file bank_02.asm, find the line with this CPU address

      02:9375:

      Remove that line and replace it with the following

      JSR change_sprite_bank_and_display_stage_num
      [close]
  • Hex Editor

    • Spoiler
      At NES file offset 9385:

      20 BF FF
      [close]

tygerbug

Here's an unfinished version, with changed enemies.

This allows for 28 enemies. Or 35 if you overwrite the Roger Rabbit ending which isn't used here.

EDIT: V2
https://drive.google.com/file/d/1NiYmXoQc_tFstScLnhmj9O9MCglcQfNV/view?usp=sharing

The first color palettes are set on the Star screen, and include fade-ins and fade-outs. 92AC in the hex, something at 8450 also.

I'd thought about using the Roger Rabbit hack because it at least attempts a non-animated version of the Roger Rabbit ending.

"At NES file offset EB81:"

The Proveaux Roger Rabbit hack is already doing something there so I've gone back to unhacked Crazy Castle for this (either that or I could change the pointer).

Banks used: 0, 6, 7, 8, 9, A, B

Weirdly, Sylvester's sprites when he's been hit and is on the ground seem to be coded to use the incorrect tiles, not matching what's in the CHR. I'll have to fix that. Yes, a mistake in the actual game. There's also some extra walking head animation for Yosemite Sam which seems unused.

Only Sylvester is coded to go through doors and up pipes, the others having less animation. This is a leftover from the weasels in Roger Rabbit, who made more sense being a common enemy. In the later Game Boy games you get more characters who can do this, having up/down animations (which are simply mirrored, using four less tiles than Sylvester here). This does mean that any character replacing Sylvester will be much more common in the levels.

I have been swapping some things around for that reason. (It's odd to have Merlin the Magic Mouse be super common, for instance. I ended up "improving" Wile E Coyote instead.)

I haven't checked the code yet, but it appears that when defeated on the ground, Daffy is only one tile tall, which really didn't fit for any of the new character designs. (This is not true in "Roger Rabbit" or "Mickey Mouse," which shuffle unused tiles around differently.) I had to do terrible things to some of the characters to make them work in that format. His kicking legs are two tiles, which helped a little. The unlucky characters are: Leprechaun, Porky Pig, Gogo Dodo, K-9, Ghost Kid (originally The Flame, who got cut), Sylvester Jr.

The other characters seem to have some missing tiles also when defeated/kicking on the ground, but I tried to make the damage minor. I'll look into it when looking at the game in more depth.

Character lineup:
*Sylvester, Merlin the Magic Mouse, Yosemite Sam, Daffy Duck
*Tasmanian Devil, Beaky Buzzard, Witch Hazel, Leprechaun
*Foghorn Leghorn, Count Bloodcount, Barnyard Dawg, Porky Pig
*Wile E. Coyote, Mugsy, Road Runner, Gogo Dodo
*Marc Anthony, Marvin the Martian, Instant Martian, K-9
*Pepe Le Pew, Elmer Fudd, Gossamer, Ghost Kid
*Tweety Bird, Speedy Gonzales, Henery Hawk, Sylvester Jr.

The first character in each line-up can go in/out doors and up pipes, and is more common. Wile E. Coyote and Merlin the Magic Mouse were swapped for this reason. (Merlin the Magic Mouse and Beaky Buzzard are like this on Game Boy, but not here. Elmer Fudd, Witch Hazel, Porky Pig and K-9 were considered for this treatment.)

These are equivalent to the Roger Rabbit characters:
*Smart@$$ Weasel, Judge Doom, Gorilla Bouncer, Penguin Waiter
and the Mickey Mouse characters:
*Zeke "Big Bad" Wolf, March Hare (or White Rabbit?), Pete, Vulture

Many characters are based on existing Game Boy/NES games but most are redrawn heavily at this point. (Plus added damage animations, if they're not, like Taz, Marc, and Foghorn.) In some cases the Game Boy graphics are used for items, and I considered using them generally, as it's a direct remake.

Last characters listed are one tile high when defeated, like Daffy Duck, which required doing dumb things to their sprites. (This is not true in "Roger Rabbit" or "Mickey Mouse," which shuffle unused tiles around differently.)

First priority was given to characters appearing in other Crazy Castle games, or which had similar suitable sprites.

Possibilities that weren't included:

The Flame (cut at last minute)
Sam Sheepdog
Baby Bear
Mad Scientist
Penelope Polecat
Tina Russo
Lola Bunny
Petunia Pig
Claude Cat
Cool Cat
Pete Puma
The Crusher
Granny
Tweety Hyde
Cecil Turtle
Hopper Kangaroo
Draft Board Man
Egghead Jr.
Egghead

Generally these had no existing sprites and would look similar, at this size, to characters already included.


EDIT: Huh. After I did all that work, I've noticed some hacks of the Game Boy Crazy Castle 2 which include similar enemy work. Let me check ...

Yeah, it doesn't really help me now, but they've implemented almost identical two-frame Pepe Le Pew and Elmer, edited from the same reference. And Beaky Buzzard. I need (and created) more than two frames though. Also an original (?) Marvin the Martian and Gossamer, which I'd also done but differently. Interesting though. Same thought process. This is making me rethink Marvin a little, and maybe Gossamer.

Looks like there's a fox character or something, in an unfinished BBCC 4 hack?

Googie

QuoteThe Bugs Bunny Birthday Blowout (Kemco NES) has unused cutscenes with Porky Pig, Marc Anthony and Pussyfoot, and the Road Runner. Two cutscene images are unused (Porky and a group shot), and the final (group shot) image, similarly has more characters in the prototype ending data.

There was clearly a decision to scrub characters who don't appear as enemies.

Speedy Gonzales also appears as an enemy in the prototype data.

It would be interesting to reinstate the two cutscenes, and include, perhaps, more Looney Tunes characters as common enemies (Marc Anthony? Speedy? Porky?)

Many of the Looney Tunes characters here appear as larger bosses. (Foghorn Leghorn is very large, and Sylvester, Pepe Le Pew and Taz larger than usual ...)
--

This caught my eye, I was playing the game the other day and I had alotta fun with it, who knows down the road someone can make a level of Birthday Blowout. :D

Bavi_H

The Bugs Bunny Crazy Castle

In this post:
1. Sprite Colors Status
2. Characters Used In Each Stage (Characters That Never Appear)



1. Sprite Colors Status

In the disassembly file bank_FF.asm, the table starting at CPU address C68A: (NES file offset 0x00C69A) ("tbl_C68A_palette_spr:") is where sprite palette colors are defined. The following $0F byte and table ("tbl_C69B:") are more sprite palettes that are loaded when a non-Sylvester character is in the stage.

Here are the values from those palette tables, along with notes about what sprites use each palette. (NES technical note: In each four-color sprite palette, the first color ends up as transparent.)

██0F ██17 ██10 ██30 Bugs Bunny (character 0), Gray Sylvester 1 (character 1), Gray Sylvester 2 (character 4), poof clouds and lines, "PAUSE"
██0F ██1A ██29 ██30 Green Sylvester (character 2), pipe bulges
██0F ██00 ██16 ██30 unused palette
██0F ██06 ██26 ██38 Pink Sylvester (character 3), carrots, no carrot sign, juice, boxing glove, bucket, crate, safe, 10-ton weight, "100", "500", "1000", "1UP"
██0F ██21 ██16 ██37 Yosemite Sam (character 5)
██0F ██00 ██37 ██30 Daffy Duck (character 6)
██0F ██17 ██26 ██30 Wile E. Coyote (character 7)

The game loads the first four palettes into the 4 sprite palettes. If there is a non-Sylvester character in the stage (character 5, 6, or 7), the unused palette is replaced with a palette for the non-Sylvester character. If there are multiple non-Sylvester characters in a stage, they all use the palette for the highest character.

Elsewhere in bank_FF.asm, the place where tbl_C68A_palette_spr is used (CPU address C642:) and the place where tbl_C69B is used (CPU address C7E5:) are potential spots to patch the code to load alternative colors.



2. Characters Used In Each Stage (Characters That Never Appear)

The way the characters are assigned to stages in the original game and the way the sprite banks are assigned to stages in the WIP v2 patch, it ends up that Marvin the Martian and Sylvester Jr. don't ever get used. Perhaps you may want to revise the bank assignments for some stages to ensure each character shows up at some point.

Here are the characters in the original game and in each bank of the WIP v2 patch.

characters 1-4character 5character 6character 7
original gameSylvesterYosemite SamDaffy DuckWile E. Coyote
WIP v2 bank 0SylvesterYosemite SamDaffy DuckMerlin the Magic Mouse
WIP v2 bank 6Tasmanian DevilWitch HazelLeprechaunBeaky Buzzard
WIP v2 bank 7Foghorn Leghorn   Barnyard DawgPorky PigCount Bloodcount
WIP v2 bank 8Wile E. CoyoteRoad RunnerGogo Dodo   Mugsy
WIP v2 bank 9Marc AnthonyInstant Martian   K-9Marvin the Martian
WIP v2 bank A   Pepe Le PewGossamerGhost KidElmer Fudd
WIP v2 bank BTweety BirdHenery HawkSylvester Jr.Speedy Gonzales

Here are the characters used in each stage, and the bank assigned to each stage in the WIP v2 patch. This list uses tabs to separate the columns. You can copy the text and paste it into a spreadsheet to work with it (sort, filter, lookup, pivot table or so on). To avoid pasting in "HTML format", you may need to Paste Special as Unformatted Text, or you may need to copy the text and paste into a text editor, then copy the text from there and paste into your spreadsheet. The underscore characters are a workaround to force cells to be text so sorting will work as expected. The "order" column is the order the stages appear in data tables (the special stages are at the end: S3, S2, S4, S1.) If you sort by the "stage" column, the special stages will come after the stage containing their "no carrot sign" entrance.

order stage c1 c2 c3 c4 c5 c6 c7 bank
1 01_ 1 1 0_
2 02_ 1 1 6_
3 03_ 1 1 7_
4 04_ 1 1 8_
5 05_ 1 1 1 9_
6 06_ 1 1 1 A_
7 07_ 1 1 1 B_
8 08_ 1 1 1 0_
9 09_ 1 1 1 1 6_
10 10_ 1 1 1 7_
11 11_ 1 1 1 8_
12 12_ 1 1 9_
13 13_ 1 1 1 1 A_
14 14_ 1 1 1 B_
15 15_ 1 1 1 0_
16 16_ 1 1 6_
17 17_ 1 1 1 1 7_
18 18_ 1 1 1 8_
19 19_ 1 1 1 1 9_
20 20_ 1 1 1 A_
21 21_ 1 1 B_
22 22_ 1 1 1 0_
23 23_ 1 1 1 6_
24 24_ 1 1 1 7_
25 25_ 1 1 1 8_
26 26_ 1 1 9_
27 27_ 1 1 1 A_
28 28_ 1 1 1 B_
29 29_ 1 1 0_
30 30_ 1 1 1 6_
31 31_ 1 1 1 7_
32 32_ 1 1 1 8_
33 33_ 1 1 1 1 9_
34 34_ 1 1 1 A_
35 35_ 1 1 1 B_
36 36_ 1 1 1 0_
37 37_ 1 1 6_
38 38_ 1 1 1 7_
39 39_ 1 1 1 8_
40 40_ 1 1 1 9_
41 41_ 1 1 1 1 A_
42 42_ 1 1 1 1 B_
43 43_ 1 1 0_
44 44_ 1 1 1 6_
45 45_ 1 1 1 7_
46 46_ 1 1 1 1 1 8_
47 47_ 1 1 1 9_
48 48_ 1 1 1 1 A_
49 49_ 1 1 B_
50 50_ 1 1 1 0_
51 51_ 1 1 1 1 6_
52 52_ 1 1 1 1 7_
53 53_ 1 1 1 1 1 8_
54 54_ 1 1 1 1 9_
55 55_ 1 1 1 1 A_
56 56_ 1 1 1 B_
57 57_ 1 1 1 1 0_
58 58_ 1 1 1 1 6_
59 59_ 1 1 1 1 7_
60 60_ 1 1 1 1 1 8_
61 45_S3 1 1 1 1 9_
62 41_S2 1 1 1 1 1 A_
63 60_S4 1 1 1 1 1 B_
64 30_S1 1 1 1 1 0_

Source: In the disassembly file bank_02.asm, the table starting at CPU address 02:B380: (NES file offset 0x00B390) ("tbl_0x00B390_stage_objects:") lists the starting position of characters and objects for each stage. The game uses an X position of 0 to indicate a character or object doesn't exist. If the X position is non-zero than it exists in the stage.


tygerbug

  Thanks for all that research, that clarifies things a lot.

  The multiple Sylvesters made a lot more sense as the Weasels in FDS Roger Rabbit, as they are standing in for multiple characters.

  I had noticed that the other enemies do shift palettes at times, and that explains it, since the palettes just aren't allocated. The "Sylvesters" and other common enemies are stuck with those palettes and the other enemies are underused (and don't have the same behavior, so can't simply be swapped out).

  It might be too complicated to actually allocate palettes based on the CHR banks used here, depending on how much space there is for code. It would be helpful though.

  I've been working on some new intro and ending artwork.
https://twitter.com/TygerbugGarrett/status/1575339537118609408

  I originally designed both with Honey Bunny appearances, but have switched to Lola Bunny. I might provide both as options, I don't know.

  Lola Bunny's head is referenced from Crazy Castle 4. (She also appeared in 3.)  The pose in both cases is referenced from the back of the Crazy Castle NES box.
http://www.vgmuseum.com/end/gbc/a/bugs4.htm
http://www.vgmuseum.com/end/gbc/a/bugs3.htm
http://www.vgmuseum.com/end/fds/a/roger.htm

  One hack nobody's done yet would be to use the graphics/characters from the Mickey Mouse Game Boy games. I have no plans personally ...

__________________________________________

EDIT: Title screen work at 8587/8597.

(sub_8587_draw_title_screen)

The title screen is mostly uncompressed tiles and can simply be pasted in, but that's the blank brick wall version. Each individual brick that falls, to reveal Bugs Bunny or Roger Rabbit, also has to be coded. The bricks start at 835D. They are 8 bytes (tiles) long, separated by "04 02." There are palette selections for what's under the bricks at 8325 (all 01 in Crazy Castle).

According to the Debugger, the ROM offsets are close to the code offsets -- 8951 in the headered ROM is 8941 in the code (ignoring the header).

At 894E, with my current title screen added, the code starts trying to draw the color attributes 11 tiles early at 2B B4 (20 59). It is trying to draw the attributes with some compression, and does not leave much room in the code to do so, stopping at 8965. The result is attributes drawn in the wrong places.

It appears that my code is 11 bytes longer than the original title screen, which did use a little bit of compression. I can perhaps cut this down by skipping a line or two at top or bottom, or using the simple compression this game uses, explained by Cynepro:

; FF FF 00 - end token
; FF FF xx - xx is a counter for FF tile
; FF ?? xx - print ?? tile xx times
; ??       - if bytes start from something other than FF, print those bytes (tiles) until next FF is found

The method is explained in the FF disassembly (sub_EDA2_decompressing_screen_data), where it's triggered by FF being used. This screen doesn't really lend itself to such compression, as there's only a few spots where tiles repeat - on the title banner and some of the attributes.

Repeating one tile for the entire top row and making some further repeats later on (including any time FF is used in the attributes) gets us down to the correct length.

84C4 is a simple table for drawing the word balloon sprites on the title screen, called at 849D. It doesn't include positions for this. 8475 has a drawing routine.

__________________________________________

sub_8956_draw_final_screen:
Inbetween the Title and Kemco, at 8966 (ROM), is the ending screen with Bugs and Honey Bunny. Again it's not quite uncompressed- the black areas are skipped with FF, although not much space is saved by it. This ends at 8D4C.

The result is that there's not quite enough room to draw the attributes correctly. Some of that "FF" type compression could free up space -- about 31 bytes are needed.

Using FF compression on a few strings frees up the necessary space here, and this ending is now implemented correctly.

For some reason, some color attributes in lower left are wrong compared to NESST output. It's not a big deal and I've manually replaced them with something which comes close (albeit in pink and blue rather than red and blue, since I had to guess at the appropriate bytes).
__________________________________________

At (8D4D) 8D50 - 8DF9 is some code for the KEMCO logo and copyrights. I would prefer to draw an entire screen here, perhaps in free space in 95B9-9E10.

I probably have to edit this:
sub_8010_kemco_logo_handler:
C - - - - - 0x008036 02:8026: 20 3D 8D  JSR sub_8D3D_draw_logo_screen
https://github.com/cyneprepou4uk/NES-Games-Disassembly/blob/main/Bugs%20Bunny%20Crazy%20Castle/bank_02.asm

__________________________________________

Again, the animated ending from Roger Rabbit is skipped here. (A static version is in the Proveaux hack.)

I have created appropriate large sprites for Bugs and Lola Bunny for this Roger Rabbit ending, based on Crazy Castle 3 and Rabbit Rampage, although I didn't put as much polish into the work yet as I would have if I felt it was going to be used. Bugs is larger and darker than maybe he should be (or Lola is smaller), and half of the CHR bank is a tile salad --although I've carefully rearranged four of the metasprites to be visible in CHR, out of eight- the ones most likely to be used at this time.

I've put the 16 background tiles from this Roger Rabbit ending into the Lola ending - they're present but unused in Crazy Castle - and also in the level GFX bank.

I would suggest the level CHR table be moved to B140. 30B1 replaces 71EB at FFD2 in the ROM.

This is because the Proveaux Roger Rabbit hack uses that space for its ending already. I am still trying to get this to actually run.

EDIT1: Got it to run, but it -- calls blank CHR graphics?
EDIT2: Hijacked one of the later subroutines, rewrote it elsewhere with code which calls the CHR graphics as needed. Working now.

EB80 (70EB) Call for Roger Rabbit ending in Proveaux Hack
05FFA9028D00E04A8D00E04A8D00E04A8D00E04A8D00E04CB095
95c0 (b095) Roger Rabbit ending in Proveaux Hack - edited
A5FF297F85FFA9008D0120207399206E9820089920389620239920959820DF9820019820D797A90085FC85FD8528A5FF29FC85FFA91C8D00A04A8D00A04A8D00A04A8D00A04A8D00A0A91D8D00C04A8D00C04A8D00C04A8D00C04A8D00C0A5FF098085FF8D0020A5FE8D0120A90320A2F7A20020239AA525C525F0FCA5F7C910D0F1A9212085F160AD0220A93F8D0620A9008D0620A200BD039A8D0720E8E020D0F560080C888C270000A0270100A8270200B02F1000A02F1100A82F1200B0372000A0372100A8372200B03F3100A83F3200B0474100A8474200B04F5100A84F5200B0576100A8576200B0576300B85F7000A05F7100A85F7200B05F7300B8678000A0678100A8678200B0678300B86F9000A06F9100A86F9200B06F9300B8A73B0318A73A0210270400A0270500A8270600B02F1400A02F1500A82F1600B0372400A0372500A8372600B03F3500A83F3600B0474400A0474500A8474600B04F5400A04F5500A84F5600B0576400A0576500A8576600B05F7400A05F7500A85F7600B0678400A0678500A8678600B0678700B86F9400A06F9500A86F9600B06F9700B8F8F8F8F827A000A027A100A827A200B02FB000A02FB100A82FB200B02FB300B837C000A037C100A837C200B037C300B83FD000A03FD100A83FD200B03FD300B847E100A847E200B04FF100A84FF200B057A500A857A600B057A700B85FB500A85FB600B05FB700B867C400A067C500A867C600B06FD400A06FD500A86FD600B0F8F8F8F8A200BD57969D0002E8E080D0F560A200BDD7969D0002E8E080D0F560A200BD57979D0002E8E080D0F560AEC107BD53968DC5078DC207A98F8DC307ADC0078DC407A000A200ADC3079D8002E8ADC2079D80021869018DC207E8A9019D8002E8ADC4079D80021869088DC407E88A38E901290FC90FD0CFADC0078DC407ADC3071869088DC307ADC5071869108DC5078DC207C8C008D0AF60AD0220A9208D0620A9008D0620A900A200A0008D07204901E8E020D0F6A2004901C8C01CD0ED60AD0220A9048D0020A9228D0620A9488D0620A9B08D0720A9C08D0720A9028D0720A9128D0720A9228D0620A9498D0620A9118D0720A97C8D0720A9038D0720A9138D0720A9008D002060AD0220A9048D0020A9208D0620A9168D0620A205A9D08D0720A9D68D0720CAE000D0F1A9008D002060AD0220A9238D0620A9408D0620A200BD83998D0720E8E080D0F560AD0220A9238D0620A9C08D0620A200A9008D0720E8E030D0F8A200A9508D0720E8E008D0F8A200A9058D0720E8E008D0F8A9238D0620A9E28D0620A9108D0720A9238D0620A9EA8D0620A9018D072060A9F8A2009D0002E8E8E8E8E000D0F560F3F4F3F4F3F4F3F4F3F4F3F4F3F4F3F4F3F4F3F4F3F4F3F4F3F4F3F4F3F4F3F4E7F9E7F9E7F9E7F9E7F9E7F9E7F9E7F9E7F9E7F9E7F9E7F9E7F9E7F9E7F9E7F9F9E7F9E7F9E7F9E7F9E7F9E7F9E7F9E7F9E7F9E7F9E7F9E7F9E7F9E7F9E7F9E7E7F9E7F9E7F9E7F9E7F9E7F9E7F9E7F9E7F9E7F9E7F9E7F9E7F9E7F9E7F9E7F90F0717270F0010300F2716300F0616300F0F25360F0F16300F0F16310F0F2730A9008526852785288529A9048533A90585342000ED98488A48209FEEA4F5A5F648209FEE68C5F6D0F3C4F5D0EFA201B5F5A855F735F595F594F7CA10F268AA68A860