Sprite compression (Generation I): Difference between revisions

From Glitch City Wiki
Jump to navigation Jump to search
Content added Content deleted
(Better sample image)
No edit summary
Line 24: Line 24:


<pre>
<pre>
00000000000000000100010206050506|000000000000000019041D02CA15946B|0000000000000000B7400EF131DEFD92|00000000000000004000C020F010F010
5100FF001D0000000100010206010502|1000FE00D805080019041D02CA15946B|0000A200ED100000B7400EF131DEF992|00000000550000004000802018040400
07000102060109000201010000000000|730D37086B145CA3CDF753EF2FD7B1CE|2FD0FD0211018C00C59EFB8E8E5FDF0E|04000400000448807C5040303040C020
07040506020301010201010000000000|F30DF708EB145CA3CDF753EF2FD7B1CE|2FD0FD0211018C00C59EFB8E8E5FDF0E|7090709070907090705050303040C020
00000000000000000000000000000000|66DD87FFEF5DAD7EBB7CDC3FB17F3DFE|570CEF00D500FF00E91741BE2CD7F30C|7000A04020C0C080C000E08040C0E0C0
00000000000000000000000000000000|66DD87FFEF5DAD7EBB7CDC3FB17F3DFE|570CEF00D500FF00E91741BE2CD7F30C|7000A04020C0C080C000E08040C0E0C0
00000000000000000000000000000000|F17F3DFADE7D3CFFEF7F26FF32FD3EFF|22DDAFF06FF105FB3BD542BF25DF37C8|60C000E0A060C020806000E060E000E0
00000000000000000000000000000000|F17F3DFADE7D3CFFEF7F26FF32FD3EFF|22DDAFF06FF105FB3BD542BF25DF37C8|60C000E0A060C020806000E060E000E0
Line 33: Line 33:


<pre>
<pre>
00000000000000000100010206050506070405060203010102010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019041D02CA15946BF30DF708EB145CA3CDF753EF2FD7B1CE66DD87FFEF5DAD7EBB7CDC3FB17F3DFEF17F3DFADE7D3CFFEF7F26FF32FD3EFF0000000000000000B7400EF131DEFD922FD0FD0211018C00C59EFB8E8E5FDF0E570CEF00D500FF00E91741BE2CD7F30C22DDAFF06FF105FB3BD542BF25DF37C800000000000000004000C020F010F0107090709070907090705050303040C0207000A04020C0C080C000E08040C0E0C060C000E0A060C020806000E060E000E0
00000000000000000100010206050506|000000000000000019041D02CA15946B|0000000000000000B7400EF131DEFD92|00000000000000004000C020F010F010
07040506020301010201010000000000|F30DF708EB145CA3CDF753EF2FD7B1CE|2FD0FD0211018C00C59EFB8E8E5FDF0E|7090709070907090705050303040C020
00000000000000000000000000000000|66DD87FFEF5DAD7EBB7CDC3FB17F3DFE|570CEF00D500FF00E91741BE2CD7F30C|7000A04020C0C080C000E08040C0E0C0
00000000000000000000000000000000|F17F3DFADE7D3CFFEF7F26FF32FD3EFF|22DDAFF06FF105FB3BD542BF25DF37C8|60C000E0A060C020806000E060E000E0
</pre>
</pre>


Line 42: Line 39:


<pre>
<pre>
44BE1D54ECF6653AA4642AA541999A8B51707B0C63743EF0EE324CEFB0A21C36143C8CA6048970A8522212E0DC84329B0C8EE2A0A260A230E0A71CA5C341418942C1B3187DD0C5BB082EC62B555EB0A22A5D54BAAAA3D3DF4AD54849CF45533BD55DDD44AE550C1734173D1AA082D21048CC5642470C1C1321408261C12B07444168464A2861FB97A09861434F4D9095026B5AC182110AF959557863DB2150654AAAE820B487B2A09BC11E80
00000000000000000100010206050506070405060203010102010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019041D02CA15946BF30DF708EB145CA3CDF753EF2FD7B1CE66DD87FFEF5DAD7EBB7CDC3FB17F3DFEF17F3DFADE7D3CFFEF7F26FF32FD3EFF0000000000000000B7400EF131DEFD922FD0FD0211018C00C59EFB8E8E5FDF0E570CEF00D500FF00E91741BE2CD7F30C22DDAFF06FF105FB3BD542BF25DF37C800000000000000004000C020F010F0107090709070907090705050303040C0207000A04020C0C080C000E08040C0E0C060C000E0A060C020806000E060E000E0
</pre>
</pre>



Revision as of 18:48, 9 April 2024

This article is incomplete. Please feel free to add any missing information about the subject. It is missing: needs proper analysis. The official method may also have been in the source code.

Sprite compression is the means in Generation I for where pure graphics data is compressed into a Pokémon or Trainer sprite. The sprite is decompressed again using the sprite decompression routine and allocates use of SRAM bank 0/"unbanked" SRAM. While the source compressor code is not in the ROMs; there are a few rules for a compressed sprite:

  • The image to compress is usually a maximum of 56x56 pixels. Other Pokémon sprites can be 32x32, 40x40 or 48x48.
  • Each nybble of the starting offset to the compressed sprite is dimensions/8. Front sprites can be of various sizes; a 56x56 sprite is represented as 0x77, a 48x48 one as 0x66, a 40x40 one as 0x55, a 32x32 as 0x44.
  • Backsprites are internally 32x32 pixels (0x44). Usually, these backsprites also have a little white space at the bottom (hidden by the battle menu).
  • White space occupies smaller sprites to add up to 56x56.
  • Unofficially, a .2bpp file can be converted into a compressed Pokémon sprite using the tool pkmncompress, and a .PNG into a compatible .2bpp file using rgbds. "Sprite import tools for RBY" can be downloaded within Evie's Google Sites backup here (based on the previous work of the GB Dev and Skeetendo communities).
  • It is possible for the sprite to be flipped for a non-00 value in memory address 0xD0AA (Pokémon Red and Blue) or 0xD0A9 (Pokémon Yellow). The inverse sprites glitch corrupts these memory addresses, possibly leading to glitched sprites.

Unintended compressed sprites with dimensions of 0 are known for their memory overflows, such as Yellow MissingNo.'s sprite (treated as dimensions of 256, or (256/8)=32).

If copying individual rows from a VRAM viewer, it may be necessary to rearrange the bytes; i.e. in this sample image for a 56x56 (0x44) sprite:

00000000000000000100010206050506000000000000000019041D02CA15946B0000000000000000B7400EF131DEFD9200000000000000004000C020F010F010
07040506020301010201010000000000F30DF708EB145CA3CDF753EF2FD7B1CE2FD0FD0211018C00C59EFB8E8E5FDF0E7090709070907090705050303040C020
0000000000000000000000000000000066DD87FFEF5DAD7EBB7CDC3FB17F3DFE570CEF00D500FF00E91741BE2CD7F30C7000A04020C0C080C000E08040C0E0C0
00000000000000000000000000000000F17F3DFADE7D3CFFEF7F26FF32FD3EFF22DDAFF06FF105FB3BD542BF25DF37C860C000E0A060C020806000E060E000E0

Split:

00000000000000000100010206050506|000000000000000019041D02CA15946B|0000000000000000B7400EF131DEFD92|00000000000000004000C020F010F010
07040506020301010201010000000000|F30DF708EB145CA3CDF753EF2FD7B1CE|2FD0FD0211018C00C59EFB8E8E5FDF0E|7090709070907090705050303040C020
00000000000000000000000000000000|66DD87FFEF5DAD7EBB7CDC3FB17F3DFE|570CEF00D500FF00E91741BE2CD7F30C|7000A04020C0C080C000E08040C0E0C0
00000000000000000000000000000000|F17F3DFADE7D3CFFEF7F26FF32FD3EFF|22DDAFF06FF105FB3BD542BF25DF37C8|60C000E0A060C020806000E060E000E0

Rearrange (left-most columns top-bottom; next set of columns to the right, repeat, and unsplit):

00000000000000000100010206050506070405060203010102010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019041D02CA15946BF30DF708EB145CA3CDF753EF2FD7B1CE66DD87FFEF5DAD7EBB7CDC3FB17F3DFEF17F3DFADE7D3CFFEF7F26FF32FD3EFF0000000000000000B7400EF131DEFD922FD0FD0211018C00C59EFB8E8E5FDF0E570CEF00D500FF00E91741BE2CD7F30C22DDAFF06FF105FB3BD542BF25DF37C800000000000000004000C020F010F0107090709070907090705050303040C0207000A04020C0C080C000E08040C0E0C060C000E0A060C020806000E060E000E0

Processing through pkmncompress gives:

44BE1D54ECF6653AA4642AA541999A8B51707B0C63743EF0EE324CEFB0A21C36143C8CA6048970A8522212E0DC84329B0C8EE2A0A260A230E0A71CA5C341418942C1B3187DD0C5BB082EC62B555EB0A22A5D54BAAAA3D3DF4AD54849CF45533BD55DDD44AE550C1734173D1AA082D21048CC5642470C1C1321408261C12B07444168464A2861FB97A09861434F4D9095026B5AC182110AF959557863DB2150654AAAE820B487B2A09BC11E80

(Can be applied with arbitrary sprites or ROM hacking)

Sample image loaded using arbitrary sprites (9ゥ (E6) with default palette); exported drawing of Torchic from Game Boy Camera