So I thought that creating a shade of grey from each individual color would be hard until I looked up the
Wikipedia article on Greyscale. Turns out that using the formula "(11*R + 16*G + 5*B) / 32" (where R, G, and B are the red, green, and blue values of the original color, respectively) yields a pretty close representation of the original color but using only grey. This is also really nice because I've heard that doing division with ASM is fairly difficult but because the divisor (32) is a power of 2, the division can be done with a single instruction. Anyways, after toying around with the formula, I eventually implemented it into a routine which immediately converts all of the palettes into greyscale.
Here are my results.
I tried to keep it as close to the model as possible, with the model being the clips that play when you load up your save file. The colors generated with my formula are actually a little bit darker than the ones used in the "Previously on your quest..." countdown but only slightly and that's understandable seeing how Game Freak probably used a slightly different formula for obtaining those values. To see the difference, compare
my greyscale with
the official greyscale. Also in keeping with the official model, the routine changes all of the palettes in both the BG and OBJ palette memories
except for the last three palettes in the BG Palette Memory. These are used for things such as the textboxes and, as noticeable in the video, the START menu. After observing the effects of the official greyscale, I noticed that they didn't touch those three palettes so I, too, left them as they were. I figure it will help with the flashback seeing how having the option of colored text might be nice.
Now that the bulk of the code is out of the way, I think we should focus on its implementation. Obviously, when a flashback plays, the colors aren't going to instantly change to greyscale. I'm thinking that before the flashback, you use a "fadescreen 0x1" command to fade the screen completely to black. Then, after a pause, we use a "callasm" command to fade-in to the greyscale palettes (this would require some more code but nothing unmanageable, I think). We could try to use a "fadescreen 0x0" to fade back in but it would most likely (I haven't tested it) load the original, colored palettes. In order for it to fade-in to the grey palettes, we would have to hack the command and frankly I think it would just be easier to write a fade-in routine from scratch. I also think that a nice touch would be to, as the fade-in is occurring, move the two border strips into position. I could alter the code so that they start just off-screen and then, one pixel per frame or two, they could be shifted down/up respectively until, after 16-32 frames, they are in position.
Eh, I'm just throwing out ideas here. It's your hack so your opinion is what matters. I've just been thinking about how we could realistically implement the code while making it look nice as well.